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