security-warnings-spec.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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({
  52. show: false,
  53. webPreferences: {
  54. nodeIntegration: true
  55. }
  56. })
  57. w.webContents.once('console-message', (e, level, message) => {
  58. assert(message.includes('Node.js Integration with Remote Content'), message)
  59. done()
  60. })
  61. w.loadURL(`http://127.0.0.1:8881/base-page-security.html`)
  62. })
  63. const generateSpecs = (description, webPreferences) => {
  64. describe(description, () => {
  65. it('should warn about disabled webSecurity', (done) => {
  66. w = new BrowserWindow({
  67. show: false,
  68. webPreferences: {
  69. webSecurity: false,
  70. ...webPreferences
  71. }
  72. })
  73. w.webContents.once('console-message', (e, level, message) => {
  74. assert(message.includes('Disabled webSecurity'), message)
  75. done()
  76. })
  77. w.loadURL(`http://127.0.0.1:8881/base-page-security.html`)
  78. })
  79. it('should warn about insecure Content-Security-Policy', (done) => {
  80. w = new BrowserWindow({
  81. show: false,
  82. webPreferences
  83. })
  84. w.webContents.once('console-message', (e, level, message) => {
  85. assert(message.includes('Insecure Content-Security-Policy'), message)
  86. done()
  87. })
  88. useCsp = false
  89. w.loadURL(`http://127.0.0.1:8881/base-page-security.html`)
  90. })
  91. it('should warn about allowRunningInsecureContent', (done) => {
  92. w = new BrowserWindow({
  93. show: false,
  94. webPreferences: {
  95. allowRunningInsecureContent: true,
  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. ...webPreferences
  111. }
  112. })
  113. w.webContents.once('console-message', (e, level, message) => {
  114. assert(message.includes('experimentalFeatures'), message)
  115. done()
  116. })
  117. w.loadURL(`http://127.0.0.1:8881/base-page-security.html`)
  118. })
  119. it('should warn about enableBlinkFeatures', (done) => {
  120. w = new BrowserWindow({
  121. show: false,
  122. webPreferences: {
  123. enableBlinkFeatures: ['my-cool-feature'],
  124. ...webPreferences
  125. }
  126. })
  127. w.webContents.once('console-message', (e, level, message) => {
  128. assert(message.includes('enableBlinkFeatures'), message)
  129. done()
  130. })
  131. w.loadURL(`http://127.0.0.1:8881/base-page-security.html`)
  132. })
  133. it('should warn about allowpopups', (done) => {
  134. w = new BrowserWindow({
  135. show: false,
  136. webPreferences
  137. })
  138. w.webContents.once('console-message', (e, level, message) => {
  139. assert(message.includes('allowpopups'), message)
  140. done()
  141. })
  142. w.loadURL(`http://127.0.0.1:8881/webview-allowpopups.html`)
  143. })
  144. it('should warn about insecure resources', (done) => {
  145. w = new BrowserWindow({
  146. show: false,
  147. webPreferences
  148. })
  149. w.webContents.once('console-message', (e, level, message) => {
  150. assert(message.includes('Insecure Resources'), message)
  151. done()
  152. })
  153. w.loadURL(`http://127.0.0.1:8881/insecure-resources.html`)
  154. w.webContents.openDevTools()
  155. })
  156. })
  157. }
  158. generateSpecs('without sandbox', {})
  159. generateSpecs('with sandbox', { sandbox: true })
  160. generateSpecs('with remote module disabled', { enableRemoteModule: false })
  161. })