From 67151c071b364ceede20d14e48f8a05331d62d05 Mon Sep 17 00:00:00 2001 From: guox191 Date: Mon, 25 Mar 2019 22:47:49 +0800 Subject: [PATCH] support select CA file extension --- lib/webInterface.js | 26 +++++---------- test/spec_lib/webInterface.js | 44 +++++++++++++++++++++++++ web/src/component/download-root-ca.jsx | 42 +++++++++++++++++------ web/src/component/download-root-ca.less | 5 +++ 4 files changed, 89 insertions(+), 28 deletions(-) create mode 100644 test/spec_lib/webInterface.js diff --git a/lib/webInterface.js b/lib/webInterface.js index 9620663..4285728 100644 --- a/lib/webInterface.js +++ b/lib/webInterface.js @@ -1,7 +1,5 @@ 'use strict'; -const DEFAULT_WEB_PORT = 8002; // port for web interface - const express = require('express'), url = require('url'), bodyParser = require('body-parser'), @@ -16,9 +14,13 @@ const express = require('express'), ip = require('ip'), compress = require('compression'); +const DEFAULT_WEB_PORT = 8002; // port for web interface + const packageJson = require('../package.json'); const MAX_CONTENT_SIZE = 1024 * 2000; // 2000kb + +const certFileTypes = ['crt', 'cer', 'pem', 'der']; /** * * @@ -204,8 +206,9 @@ class webInterface extends events.EventEmitter { res.setHeader('Access-Control-Allow-Origin', '*'); const _crtFilePath = certMgr.getRootCAFilePath(); if (_crtFilePath) { + const fileType = certFileTypes.indexOf(req.query.type) !== -1 ? req.query.type : 'crt'; res.setHeader('Content-Type', 'application/x-x509-ca-cert'); - res.setHeader('Content-Disposition', 'attachment; filename="rootCA.crt"'); + res.setHeader('Content-Disposition', `attachment; filename="rootCA.${fileType}"`); res.end(fs.readFileSync(_crtFilePath, { encoding: null })); } else { res.setHeader('Content-Type', 'text/html'); @@ -213,25 +216,12 @@ class webInterface extends events.EventEmitter { } }); - //make qr code - app.get('/qr', (req, res) => { - res.setHeader('Access-Control-Allow-Origin', '*'); - res.setHeader('Content-Type', 'text/html'); - - const qr = qrCode.qrcode(4, 'M'); - const targetUrl = req.protocol + '://' + req.get('host'); - qr.addData(targetUrl); - qr.make(); - const qrImageTag = qr.createImgTag(4); - const resDom = ' __img
click or scan qr code to start client
'.replace(/__url/, targetUrl).replace(/__img/, qrImageTag); - res.end(resDom); - }); - app.get('/api/getQrCode', (req, res) => { res.setHeader('Access-Control-Allow-Origin', '*'); + const fileType = certFileTypes.indexOf(req.query.type) !== -1 ? req.query.type : 'crt'; const qr = qrCode.qrcode(4, 'M'); - const targetUrl = req.protocol + '://' + req.get('host') + '/fetchCrtFile'; + const targetUrl = req.protocol + '://' + req.get('host') + '/fetchCrtFile?type=' + fileType; const isRootCAFileExists = certMgr.isRootCAFileExists(); qr.addData(targetUrl); diff --git a/test/spec_lib/webInterface.js b/test/spec_lib/webInterface.js new file mode 100644 index 0000000..3eac176 --- /dev/null +++ b/test/spec_lib/webInterface.js @@ -0,0 +1,44 @@ +const WebInterface = require('../../lib/webInterface.js'); +const Recorder = require('../../lib/recorder'); +const { directGet } = require('../util/HttpUtil.js'); + +describe('WebInterface server', () => { + let webServer = null; + let webHost = 'http://127.0.0.1:8002'; + + beforeAll(() => { + const recorder = new Recorder(); + webServer = new WebInterface({ + webPort: 8002, + }, recorder); + }); + + afterAll(() => { + webServer.close(); + }); + + it('should support change CA extensions in /getQrCode', done => { + const certFileTypes = ['crt', 'cer', 'pem', 'der']; + const tasks = certFileTypes.map((type) => { + return directGet(`${webHost}/api/getQrCode`, { type }) + .then(res => { + const body = JSON.parse(res.body); + expect(body.qrImgDom).toMatch(' - + + Or click the button to download. @@ -146,7 +169,6 @@ class DownloadRootCA extends React.Component { return ( {this.props.globalStatus.isRootCAFileExists ? this.getDownloadDiv() : this.getGenerateRootCADiv()} - ); } diff --git a/web/src/component/download-root-ca.less b/web/src/component/download-root-ca.less index 8c9d1de..550227d 100644 --- a/web/src/component/download-root-ca.less +++ b/web/src/component/download-root-ca.less @@ -55,4 +55,9 @@ margin-top: 18px; display: block; } +} + +.fileSelect { + width: 60px; + margin-left: 8px; } \ No newline at end of file