diff --git a/spec/api-app-spec.js b/spec/api-app-spec.js index d1ceef1434c4..e3e1e1d80d09 100644 --- a/spec/api-app-spec.js +++ b/spec/api-app-spec.js @@ -4,7 +4,7 @@ const https = require('https') const net = require('net') const fs = require('fs') const path = require('path') -const {remote} = require('electron') +const {ipcRenderer, remote} = require('electron') const {closeWindow} = require('./window-helpers') const {app, BrowserWindow, ipcMain} = remote @@ -41,6 +41,41 @@ describe('electron module', function () { }) describe('app module', function () { + let server, secureUrl + const certPath = path.join(__dirname, 'fixtures', 'certificates') + + before(function () { + const options = { + key: fs.readFileSync(path.join(certPath, 'server.key')), + cert: fs.readFileSync(path.join(certPath, 'server.pem')), + ca: [ + fs.readFileSync(path.join(certPath, 'rootCA.pem')), + fs.readFileSync(path.join(certPath, 'intermediateCA.pem')) + ], + requestCert: true, + rejectUnauthorized: false + } + + server = https.createServer(options, function (req, res) { + if (req.client.authorized) { + res.writeHead(200) + res.end('authorized') + } else { + res.writeHead(401) + res.end('denied') + } + }) + + server.listen(0, '127.0.0.1', function () { + const port = server.address().port + secureUrl = `https://127.0.0.1:${port}` + }) + }) + + after(function () { + server.close() + }) + describe('app.getVersion()', function () { it('returns the version field of package.json', function () { assert.equal(app.getVersion(), '0.1.0') @@ -165,24 +200,6 @@ describe('app module', function () { if (process.platform !== 'linux') return var w = null - var certPath = path.join(__dirname, 'fixtures', 'certificates') - var options = { - key: fs.readFileSync(path.join(certPath, 'server.key')), - cert: fs.readFileSync(path.join(certPath, 'server.pem')), - ca: [ - fs.readFileSync(path.join(certPath, 'rootCA.pem')), - fs.readFileSync(path.join(certPath, 'intermediateCA.pem')) - ], - requestCert: true, - rejectUnauthorized: false - } - - var server = https.createServer(options, function (req, res) { - if (req.client.authorized) { - res.writeHead(200) - res.end('authorized') - } - }) afterEach(function () { return closeWindow(w).then(function () { w = null }) @@ -199,25 +216,14 @@ describe('app module', function () { }) w.webContents.on('did-finish-load', function () { - server.close() + assert.equal(w.webContents.getTitle(), 'authorized') done() }) - app.on('select-client-certificate', function (event, webContents, url, list, callback) { - assert.equal(list.length, 1) - assert.equal(list[0].issuerName, 'Intermediate CA') - assert.equal(list[0].subjectName, 'Client Cert') - assert.equal(list[0].issuer.commonName, 'Intermediate CA') - assert.equal(list[0].subject.commonName, 'Client Cert') - callback(list[0]) - }) - app.importCertificate(options, function (result) { assert(!result) - server.listen(0, '127.0.0.1', function () { - var port = server.address().port - w.loadURL(`https://127.0.0.1:${port}`) - }) + ipcRenderer.sendSync('set-client-certificate-option', false) + w.loadURL(secureUrl) }) }) }) @@ -359,4 +365,32 @@ describe('app module', function () { assert.equal(app.getPath('music'), __dirname) }) }) + + describe('select-client-certificate event', function () { + let w = null + + beforeEach(function () { + w = new BrowserWindow({ + show: false, + webPreferences: { + partition: 'empty-certificate' + } + }) + }) + + afterEach(function () { + return closeWindow(w).then(function () { w = null }) + }) + + it('can respond with empty certificate list', function (done) { + w.webContents.on('did-finish-load', function () { + assert.equal(w.webContents.getTitle(), 'denied') + server.close() + done() + }) + + ipcRenderer.sendSync('set-client-certificate-option', true) + w.webContents.loadURL(secureUrl) + }) + }) }) diff --git a/spec/static/main.js b/spec/static/main.js index ffc13e39a8ee..c49ce07e8767 100644 --- a/spec/static/main.js +++ b/spec/static/main.js @@ -11,6 +11,7 @@ const protocol = electron.protocol const v8 = require('v8') const Coverage = require('electabul').Coverage +const assert = require('assert') const fs = require('fs') const path = require('path') const url = require('url') @@ -184,3 +185,20 @@ app.on('ready', function () { } }) }) + +ipcMain.on('set-client-certificate-option', function (event, skip) { + app.once('select-client-certificate', function (event, webContents, url, list, callback) { + event.preventDefault() + if (skip) { + callback() + } else { + assert.equal(list.length, 1) + assert.equal(list[0].issuerName, 'Intermediate CA') + assert.equal(list[0].subjectName, 'Client Cert') + assert.equal(list[0].issuer.commonName, 'Intermediate CA') + assert.equal(list[0].subject.commonName, 'Client Cert') + callback(list[0]) + } + }) + event.returnValue = 'done' +})