security-warnings-spec.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. const assert = require('assert')
  2. const http = require('http')
  3. const fs = require('fs')
  4. const path = require('path')
  5. const url = require('url')
  6. const { remote } = require('electron')
  7. const { BrowserWindow } = remote
  8. const { closeWindow } = require('./window-helpers')
  9. describe('security warnings', () => {
  10. let server
  11. let w = null
  12. let useCsp = true
  13. before((done) => {
  14. // Create HTTP Server
  15. server = http.createServer((request, response) => {
  16. const uri = url.parse(request.url).pathname
  17. let filename = path.join(__dirname, './fixtures/pages', uri)
  18. fs.stat(filename, (error, stats) => {
  19. if (error) {
  20. response.writeHead(404, { 'Content-Type': 'text/plain' })
  21. response.end()
  22. return
  23. }
  24. if (stats.isDirectory()) {
  25. filename += '/index.html'
  26. }
  27. fs.readFile(filename, 'binary', (err, file) => {
  28. if (err) {
  29. response.writeHead(404, { 'Content-Type': 'text/plain' })
  30. response.end()
  31. return
  32. }
  33. const cspHeaders = { 'Content-Security-Policy': `script-src 'self' 'unsafe-inline'` }
  34. response.writeHead(200, useCsp ? cspHeaders : undefined)
  35. response.write(file, 'binary')
  36. response.end()
  37. })
  38. })
  39. }).listen(8881, () => done())
  40. })
  41. after(() => {
  42. // Close server
  43. server.close()
  44. server = null
  45. })
  46. afterEach(() => {
  47. useCsp = true
  48. return closeWindow(w).then(() => { w = null })
  49. })
  50. it('should warn about Node.js integration with remote content', (done) => {
  51. w = new BrowserWindow({ show: false })
  52. w.webContents.once('console-message', (e, level, message) => {
  53. assert(message.includes('Node.js Integration with Remote Content'), message)
  54. done()
  55. })
  56. w.loadURL(`http://127.0.0.1:8881/base-page-security.html`)
  57. })
  58. const generateSpecs = (description, webPreferences) => {
  59. describe(description, () => {
  60. it('should warn about disabled webSecurity', (done) => {
  61. w = new BrowserWindow({
  62. show: false,
  63. webPreferences: {
  64. webSecurity: false,
  65. nodeIntegration: false,
  66. ...webPreferences
  67. }
  68. })
  69. w.webContents.once('console-message', (e, level, message) => {
  70. assert(message.includes('Disabled webSecurity'), message)
  71. done()
  72. })
  73. w.loadURL(`http://127.0.0.1:8881/base-page-security.html`)
  74. })
  75. it('should warn about insecure Content-Security-Policy', (done) => {
  76. w = new BrowserWindow({
  77. show: false,
  78. webPreferences: {
  79. nodeIntegration: false,
  80. ...webPreferences
  81. }
  82. })
  83. w.webContents.once('console-message', (e, level, message) => {
  84. assert(message.includes('Insecure Content-Security-Policy'), message)
  85. done()
  86. })
  87. useCsp = false
  88. w.loadURL(`http://127.0.0.1:8881/base-page-security.html`)
  89. })
  90. it('should warn about allowRunningInsecureContent', (done) => {
  91. w = new BrowserWindow({
  92. show: false,
  93. webPreferences: {
  94. allowRunningInsecureContent: true,
  95. nodeIntegration: false,
  96. ...webPreferences
  97. }
  98. })
  99. w.webContents.once('console-message', (e, level, message) => {
  100. assert(message.includes('allowRunningInsecureContent'), message)
  101. done()
  102. })
  103. w.loadURL(`http://127.0.0.1:8881/base-page-security.html`)
  104. })
  105. it('should warn about experimentalFeatures', (done) => {
  106. w = new BrowserWindow({
  107. show: false,
  108. webPreferences: {
  109. experimentalFeatures: true,
  110. nodeIntegration: false,
  111. ...webPreferences
  112. }
  113. })
  114. w.webContents.once('console-message', (e, level, message) => {
  115. assert(message.includes('experimentalFeatures'), message)
  116. done()
  117. })
  118. w.loadURL(`http://127.0.0.1:8881/base-page-security.html`)
  119. })
  120. it('should warn about enableBlinkFeatures', (done) => {
  121. w = new BrowserWindow({
  122. show: false,
  123. webPreferences: {
  124. enableBlinkFeatures: ['my-cool-feature'],
  125. nodeIntegration: false,
  126. ...webPreferences
  127. }
  128. })
  129. w.webContents.once('console-message', (e, level, message) => {
  130. assert(message.includes('enableBlinkFeatures'), message)
  131. done()
  132. })
  133. w.loadURL(`http://127.0.0.1:8881/base-page-security.html`)
  134. })
  135. it('should warn about allowpopups', (done) => {
  136. w = new BrowserWindow({
  137. show: false,
  138. webPreferences: {
  139. nodeIntegration: false,
  140. ...webPreferences
  141. }
  142. })
  143. w.webContents.once('console-message', (e, level, message) => {
  144. assert(message.includes('allowpopups'), message)
  145. done()
  146. })
  147. w.loadURL(`http://127.0.0.1:8881/webview-allowpopups.html`)
  148. })
  149. it('should warn about insecure resources', (done) => {
  150. w = new BrowserWindow({
  151. show: false,
  152. webPreferences: {
  153. nodeIntegration: false,
  154. ...webPreferences
  155. }
  156. })
  157. w.webContents.once('console-message', (e, level, message) => {
  158. assert(message.includes('Insecure Resources'), message)
  159. done()
  160. })
  161. w.loadURL(`http://127.0.0.1:8881/insecure-resources.html`)
  162. w.webContents.openDevTools()
  163. })
  164. })
  165. }
  166. generateSpecs('without sandbox', {})
  167. generateSpecs('with sandbox', { sandbox: true })
  168. generateSpecs('with remote module disabled', { enableRemoteModule: false })
  169. })