diff --git a/docs-src/en/README.md b/docs-src/en/README.md
index 3e798e4..4ae4407 100644
--- a/docs-src/en/README.md
+++ b/docs-src/en/README.md
@@ -820,7 +820,7 @@ Installing CA in Android could be different based on the system, we list some co
* Settings -> Security & Location > Encryption & credentials -> Install from storage, and find your CA file to install
* Settings -> Security -> Install from SD card, and find you CA file to install
-As we konw, there are several file extensions of CA file which may not recognised by all kinds of Android OS. The .crt file is the most popular, and a few systems only support .cer file such as OPPO R15. In AnyProxy, you can choose what type of file you need before installing the root CA to your devices.
+As we known, there are several file extensions of CA file which may not be recognised by all kinds of Android. The .crt file is the most popular, and a few systems only support .cer file such as OPPO R15. In AnyProxy, you can choose the type of file you need before installing the root CA to your devices.
### config iOS/Android proxy server
diff --git a/docs-src/en/src_doc.md b/docs-src/en/src_doc.md
index 9f5f5e3..ab017f0 100644
--- a/docs-src/en/src_doc.md
+++ b/docs-src/en/src_doc.md
@@ -621,7 +621,7 @@ Installing CA in Android could be different based on the system, we list some co
* Settings -> Security & Location > Encryption & credentials -> Install from storage, and find your CA file to install
* Settings -> Security -> Install from SD card, and find you CA file to install
-As we konw, there are several file extensions of CA file which may not recognised by all kinds of Android OS. The .crt file is the most popular, and a few systems only support .cer file such as OPPO R15. In AnyProxy, you can choose what type of file you need before installing the root CA to your devices.
+As we known, there are several file extensions of CA file which may not be recognised by all kinds of Android. The .crt file is the most popular, and a few systems only support .cer file such as OPPO R15. In AnyProxy, you can choose the type of file you need before installing the root CA to your devices.
### config iOS/Android proxy server
diff --git a/lib/webInterface.js b/lib/webInterface.js
index 4285728..57212e0 100644
--- a/lib/webInterface.js
+++ b/lib/webInterface.js
@@ -12,7 +12,8 @@ const express = require('express'),
wsServer = require('./wsServer'),
juicer = require('juicer'),
ip = require('ip'),
- compress = require('compression');
+ compress = require('compression'),
+ pug = require('pug');
const DEFAULT_WEB_PORT = 8002; // port for web interface
@@ -202,6 +203,11 @@ class webInterface extends events.EventEmitter {
}
});
+ app.get('/downloadCrt', (req, res) => {
+ const pageFn = pug.compileFile(path.join(__dirname, '../resource/cert_download.pug'));
+ res.end(pageFn({ ua: req.get('user-agent') }));
+ });
+
app.get('/fetchCrtFile', (req, res) => {
res.setHeader('Access-Control-Allow-Origin', '*');
const _crtFilePath = certMgr.getRootCAFilePath();
@@ -219,9 +225,8 @@ class webInterface extends events.EventEmitter {
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?type=' + fileType;
+ const targetUrl = req.protocol + '://' + req.get('host') + '/downloadCrt';
const isRootCAFileExists = certMgr.isRootCAFileExists();
qr.addData(targetUrl);
diff --git a/resource/cert_download.pug b/resource/cert_download.pug
new file mode 100644
index 0000000..5c5762b
--- /dev/null
+++ b/resource/cert_download.pug
@@ -0,0 +1,91 @@
+doctype html
+html(lang="en")
+ head
+ title Download rootCA
+ meta(name='viewport', content='initial-scale=1, maximum-scale=0.5, minimum-scale=1, user-scalable=no')
+ style.
+ body {
+ color: #666;
+ line-height: 1.5;
+ font-size: 16px;
+ font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,SimSun,sans-serif;
+ }
+
+ body * {
+ box-sizing: border-box;
+ }
+
+ .logo {
+ font-size: 36px;
+ margin-bottom: 40px;
+ text-align: center;
+ }
+
+ .any {
+ font-weight: 500;
+ }
+
+ .proxy {
+ font-weight: 100;
+ }
+
+ .title {
+ font-weight: bold;
+ margin: 20px 0 6px;
+ }
+
+ .button {
+ text-align: center;
+ padding: 4px 15px 5px 15px;
+ font-size: 14px;
+ font-weight: 500;
+ border-radius: 4px;
+ height: 32px;
+ margin-bottom: 10px;
+ display: block;
+ text-decoration: none;
+ border-color: #108ee9;
+ color: rgba(0, 0, 0, .65);
+ background-color: #fff;
+ border-style: solid;
+ border-width: 1px;
+ border-style: solid;
+ border-color: #d9d9d9;
+ }
+
+ .primary {
+ color: #fff;
+ background-color: #108ee9;
+ border-color: #108ee9;
+ }
+
+ .more {
+ text-align: center;
+ font-size: 14px;
+ }
+
+ .content {
+ word-break: break-all;
+ font-size: 14px;
+ line-height: 1.2;
+ margin-bottom: 10px;
+ }
+ body
+ .logo
+ span.any Any
+ span.proxy Proxy
+ .title Download:
+ .content Select a CA file to download, the .crt file is commonly used.
+ a(href="/fetchCrtFile?type=crt").button.primary rootCA.crt
+ a(href="/fetchCrtFile?type=cer").button rootCA.cer
+ .more More
+ .buttons(style='display: none')
+ a(href="/fetchCrtFile?type=pem").button rootCA.pem
+ a(href="/fetchCrtFile?type=der").button rootCA.der
+ .title User-Agent:
+ .content #{ua}
+ script(type='text/javascript').
+ window.document.querySelector('.more').addEventListener('click', function (e) {
+ e.target.style.display = 'none';
+ window.document.querySelector('.buttons').style.display = 'block';
+ });
\ No newline at end of file
diff --git a/test/spec_lib/webInterface.js b/test/spec_lib/webInterface.js
index 3eac176..1975943 100644
--- a/test/spec_lib/webInterface.js
+++ b/test/spec_lib/webInterface.js
@@ -17,26 +17,12 @@ describe('WebInterface server', () => {
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(' {
this.setState({
loadingCAQr: false,
@@ -60,33 +57,12 @@ class DownloadRootCA extends React.Component {
this.props.dispatch(hideRootCA());
}
- onFileTypeChange (value) {
- this.setState({
- fileType: value
- }, () => {
- this.fetchData();
- });
- }
-
getQrCodeContent () {
const imgDomContent = { __html: this.state.CAQrCodeImageDom };
const content = (