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 = (
-
Scan to download rootCA.{this.state.fileType} to your Phone
-
You can change the CA's file extension: - -
+ Scan to download rootCA to your Phone
); @@ -95,6 +71,7 @@ class DownloadRootCA extends React.Component { } getGenerateRootCADiv () { + const doToggleRemoteIntercept = () => { postJSON('/api/generateRootCA') .then((result) => { @@ -150,8 +127,8 @@ class DownloadRootCA extends React.Component {
- - + + Or click the button to download.
@@ -169,6 +146,7 @@ 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 550227d..8c9d1de 100644 --- a/web/src/component/download-root-ca.less +++ b/web/src/component/download-root-ca.less @@ -55,9 +55,4 @@ margin-top: 18px; display: block; } -} - -.fileSelect { - width: 60px; - margin-left: 8px; } \ No newline at end of file