| 
									
										
										
										
											2018-02-03 06:50:12 -08:00
										 |  |  | const assert = require('assert') | 
					
						
							|  |  |  | const http = require('http') | 
					
						
							|  |  |  | const fs = require('fs') | 
					
						
							|  |  |  | const path = require('path') | 
					
						
							|  |  |  | const url = require('url') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  | const { remote } = require('electron') | 
					
						
							|  |  |  | const { BrowserWindow } = remote | 
					
						
							| 
									
										
										
										
											2018-02-03 06:50:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 02:10:51 +10:00
										 |  |  | const { closeWindow } = require('./window-helpers') | 
					
						
							| 
									
										
										
										
											2018-02-03 06:50:12 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | describe('security warnings', () => { | 
					
						
							|  |  |  |   let server | 
					
						
							|  |  |  |   let w = null | 
					
						
							|  |  |  |   let useCsp = true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-01 14:28:55 +09:00
										 |  |  |   before((done) => { | 
					
						
							| 
									
										
										
										
											2018-02-03 06:50:12 -08:00
										 |  |  |     // Create HTTP Server
 | 
					
						
							|  |  |  |     server = http.createServer((request, response) => { | 
					
						
							|  |  |  |       const uri = url.parse(request.url).pathname | 
					
						
							|  |  |  |       let filename = path.join(__dirname, './fixtures/pages', uri) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       fs.stat(filename, (error, stats) => { | 
					
						
							|  |  |  |         if (error) { | 
					
						
							|  |  |  |           response.writeHead(404, { 'Content-Type': 'text/plain' }) | 
					
						
							|  |  |  |           response.end() | 
					
						
							|  |  |  |           return | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (stats.isDirectory()) { | 
					
						
							|  |  |  |           filename += '/index.html' | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fs.readFile(filename, 'binary', (err, file) => { | 
					
						
							|  |  |  |           if (err) { | 
					
						
							|  |  |  |             response.writeHead(404, { 'Content-Type': 'text/plain' }) | 
					
						
							|  |  |  |             response.end() | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           const cspHeaders = { 'Content-Security-Policy': `script-src 'self' 'unsafe-inline'` } | 
					
						
							|  |  |  |           response.writeHead(200, useCsp ? cspHeaders : undefined) | 
					
						
							|  |  |  |           response.write(file, 'binary') | 
					
						
							|  |  |  |           response.end() | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |       }) | 
					
						
							| 
									
										
										
										
											2018-05-01 14:28:55 +09:00
										 |  |  |     }).listen(8881, () => done()) | 
					
						
							| 
									
										
										
										
											2018-02-03 06:50:12 -08:00
										 |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   after(() => { | 
					
						
							|  |  |  |     // Close server
 | 
					
						
							|  |  |  |     server.close() | 
					
						
							|  |  |  |     server = null | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   afterEach(() => { | 
					
						
							|  |  |  |     useCsp = true | 
					
						
							| 
									
										
										
										
											2018-05-01 09:49:45 +09:00
										 |  |  |     return closeWindow(w).then(() => { w = null }) | 
					
						
							| 
									
										
										
										
											2018-02-03 06:50:12 -08:00
										 |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should warn about Node.js integration with remote content', (done) => { | 
					
						
							|  |  |  |     w = new BrowserWindow({ show: false }) | 
					
						
							| 
									
										
										
										
											2018-05-01 14:28:55 +09:00
										 |  |  |     w.webContents.once('console-message', (e, level, message) => { | 
					
						
							|  |  |  |       assert(message.includes('Node.js Integration with Remote Content'), message) | 
					
						
							| 
									
										
										
										
											2018-02-03 06:50:12 -08:00
										 |  |  |       done() | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     w.loadURL(`http://127.0.0.1:8881/base-page-security.html`) | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-13 19:50:07 +02:00
										 |  |  |   const generateSpecs = (description, webPreferences) => { | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |     describe(description, () => { | 
					
						
							|  |  |  |       it('should warn about disabled webSecurity', (done) => { | 
					
						
							|  |  |  |         w = new BrowserWindow({ | 
					
						
							|  |  |  |           show: false, | 
					
						
							|  |  |  |           webPreferences: { | 
					
						
							|  |  |  |             webSecurity: false, | 
					
						
							|  |  |  |             nodeIntegration: false, | 
					
						
							| 
									
										
										
										
											2018-10-13 19:50:07 +02:00
										 |  |  |             ...webPreferences | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |           } | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         w.webContents.once('console-message', (e, level, message) => { | 
					
						
							|  |  |  |           assert(message.includes('Disabled webSecurity'), message) | 
					
						
							|  |  |  |           done() | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2018-02-03 06:50:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |         w.loadURL(`http://127.0.0.1:8881/base-page-security.html`) | 
					
						
							|  |  |  |       }) | 
					
						
							| 
									
										
										
										
											2018-02-03 06:50:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |       it('should warn about insecure Content-Security-Policy', (done) => { | 
					
						
							|  |  |  |         w = new BrowserWindow({ | 
					
						
							|  |  |  |           show: false, | 
					
						
							|  |  |  |           webPreferences: { | 
					
						
							|  |  |  |             nodeIntegration: false, | 
					
						
							| 
									
										
										
										
											2018-10-13 19:50:07 +02:00
										 |  |  |             ...webPreferences | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |           } | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2018-10-03 21:36:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |         w.webContents.once('console-message', (e, level, message) => { | 
					
						
							|  |  |  |           assert(message.includes('Insecure Content-Security-Policy'), message) | 
					
						
							|  |  |  |           done() | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2018-10-03 21:36:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |         useCsp = false | 
					
						
							|  |  |  |         w.loadURL(`http://127.0.0.1:8881/base-page-security.html`) | 
					
						
							|  |  |  |       }) | 
					
						
							| 
									
										
										
										
											2018-02-03 06:50:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |       it('should warn about allowRunningInsecureContent', (done) => { | 
					
						
							|  |  |  |         w = new BrowserWindow({ | 
					
						
							|  |  |  |           show: false, | 
					
						
							|  |  |  |           webPreferences: { | 
					
						
							|  |  |  |             allowRunningInsecureContent: true, | 
					
						
							|  |  |  |             nodeIntegration: false, | 
					
						
							| 
									
										
										
										
											2018-10-13 19:50:07 +02:00
										 |  |  |             ...webPreferences | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |           } | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         w.webContents.once('console-message', (e, level, message) => { | 
					
						
							|  |  |  |           assert(message.includes('allowRunningInsecureContent'), message) | 
					
						
							|  |  |  |           done() | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2018-02-03 06:50:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |         w.loadURL(`http://127.0.0.1:8881/base-page-security.html`) | 
					
						
							|  |  |  |       }) | 
					
						
							| 
									
										
										
										
											2018-10-03 21:36:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |       it('should warn about experimentalFeatures', (done) => { | 
					
						
							|  |  |  |         w = new BrowserWindow({ | 
					
						
							|  |  |  |           show: false, | 
					
						
							|  |  |  |           webPreferences: { | 
					
						
							|  |  |  |             experimentalFeatures: true, | 
					
						
							|  |  |  |             nodeIntegration: false, | 
					
						
							| 
									
										
										
										
											2018-10-13 19:50:07 +02:00
										 |  |  |             ...webPreferences | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |           } | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         w.webContents.once('console-message', (e, level, message) => { | 
					
						
							|  |  |  |           assert(message.includes('experimentalFeatures'), message) | 
					
						
							|  |  |  |           done() | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2018-10-03 21:36:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |         w.loadURL(`http://127.0.0.1:8881/base-page-security.html`) | 
					
						
							|  |  |  |       }) | 
					
						
							| 
									
										
										
										
											2018-02-03 06:50:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |       it('should warn about enableBlinkFeatures', (done) => { | 
					
						
							|  |  |  |         w = new BrowserWindow({ | 
					
						
							|  |  |  |           show: false, | 
					
						
							|  |  |  |           webPreferences: { | 
					
						
							|  |  |  |             enableBlinkFeatures: ['my-cool-feature'], | 
					
						
							|  |  |  |             nodeIntegration: false, | 
					
						
							| 
									
										
										
										
											2018-10-13 19:50:07 +02:00
										 |  |  |             ...webPreferences | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |           } | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         w.webContents.once('console-message', (e, level, message) => { | 
					
						
							|  |  |  |           assert(message.includes('enableBlinkFeatures'), message) | 
					
						
							|  |  |  |           done() | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2018-02-03 06:50:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |         w.loadURL(`http://127.0.0.1:8881/base-page-security.html`) | 
					
						
							|  |  |  |       }) | 
					
						
							| 
									
										
										
										
											2018-10-03 21:36:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |       it('should warn about allowpopups', (done) => { | 
					
						
							|  |  |  |         w = new BrowserWindow({ | 
					
						
							|  |  |  |           show: false, | 
					
						
							|  |  |  |           webPreferences: { | 
					
						
							|  |  |  |             nodeIntegration: false, | 
					
						
							| 
									
										
										
										
											2018-10-13 19:50:07 +02:00
										 |  |  |             ...webPreferences | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |           } | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         w.webContents.once('console-message', (e, level, message) => { | 
					
						
							|  |  |  |           assert(message.includes('allowpopups'), message) | 
					
						
							|  |  |  |           done() | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2018-10-03 21:36:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |         w.loadURL(`http://127.0.0.1:8881/webview-allowpopups.html`) | 
					
						
							|  |  |  |       }) | 
					
						
							| 
									
										
										
										
											2018-02-03 06:50:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |       it('should warn about insecure resources', (done) => { | 
					
						
							|  |  |  |         w = new BrowserWindow({ | 
					
						
							|  |  |  |           show: false, | 
					
						
							|  |  |  |           webPreferences: { | 
					
						
							|  |  |  |             nodeIntegration: false, | 
					
						
							| 
									
										
										
										
											2018-10-13 19:50:07 +02:00
										 |  |  |             ...webPreferences | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |           } | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         w.webContents.once('console-message', (e, level, message) => { | 
					
						
							|  |  |  |           assert(message.includes('Insecure Resources'), message) | 
					
						
							|  |  |  |           done() | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2018-10-03 21:36:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |         w.loadURL(`http://127.0.0.1:8881/insecure-resources.html`) | 
					
						
							|  |  |  |         w.webContents.openDevTools() | 
					
						
							|  |  |  |       }) | 
					
						
							| 
									
										
										
										
											2018-10-03 21:36:12 +02:00
										 |  |  |     }) | 
					
						
							| 
									
										
										
										
											2018-10-05 00:24:14 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-10-03 21:36:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-13 19:50:07 +02:00
										 |  |  |   generateSpecs('without sandbox', {}) | 
					
						
							|  |  |  |   generateSpecs('with sandbox', { sandbox: true }) | 
					
						
							|  |  |  |   generateSpecs('with remote module disabled', { enableRemoteModule: false }) | 
					
						
							| 
									
										
										
										
											2018-02-03 06:50:12 -08:00
										 |  |  | }) |