Skip to content

Commit 45ebdc9

Browse files
committed
Squashed 'vendor/whistle/' changes from 5ff01575d..19133a06e
19133a06e Update headerReplace.md 12db14ff0 docs: update icp link 43f46945a refactor: refine serialNumber 67ff33789 fix: SEC_ERROR_REUSED_ISSUER_AND_SERIAL 76dcc215a refactor: refine code 2bbb98e1e refactor: add req.originalHttpsUrl 457d5a6e9 refactor: refine code edd7107a3 req.url => req.originalUrl 7e6d2734a refactor: refine code 0959b12d6 feat: add weakRule props 52e011d14 Release v2.8.10 95c03a0cb refactor: refine code 25f9be412 feat: add flag isEstablished 522ccbada refactor: refine code d280f5905 refactor: handle sniCallback return false b734ecd41 docs: update icp c5e665c2e refactor: refine newConf.projectPluginPath ae3c9dfe6 perf: nly trigger visible tab 7350e89ab refactor: add session.isStream c386d9895 refactor: add state events 5015590a0 Release v2.8.9 f03b55b05 refactor: add session ready event 22f0c7de3 refactor: add onSessionReadyEvent 051082860 refactor: refine code 68e150b50 style: handle plugins changed 81e2425e4 refactor: refine code e3ab9bcf7 refactor: refine code 8c0ce331e refactor: refine code d2c4afdae style: refine code fb547871a refactor: refine code 5c462d558 style: refine code 8f8896a37 style: push active session 67f0e7713 style: init inspector.html 60bfe6248 style: refine ui a70df3c16 style: refine code 2ca423685 style: handle push sessions aee314b08 style: update plugin tabs in time a6c55fa50 style: refine ui 64ac4f60a style: refine ui 33bb54b24 style: handle click plugin tabs 3f56da3b5 feat: add api 95933c2b1 style: handle select custom tab 6d3e77a3e refactor: customTabs -> inspectorTabs fa5ebd504 feat: export decodeBase64 ad90fa57c feat: custom tab d7dbad2c0 style: refine ui cfaada33e style: add initCustomTabWhistleBridge b9da1b861 style: refine code edc6888f2 style: refine context menu 4a104826f refactor: refine code a4bf84f50 style: refine ui e3184ecb7 feat: resovle custom tabs from whistleConfig d080efeb7 style: init getReqTabs & getResTabs 5f2d8a1f7 style: init plugins tabs cb00e5cb5 feat: enable://bigData 7dcadbb3a refactor: refine code d1a8db5e9 feat: allow to disable://abort 7c4674c80 refactor: refine code 6dd37df45 refactor: refine code 9a568adac refactor: refine code 104e5bdcb feat: add shadowValues bf087f17f refactor: refine shadowRules a78d3e36b refactor: refine code 88e031a75 refactor: refine code b2ed310b4 fix: mtime remains unchanged after the plugin is installed 86e3c4ebe feat: add tpl & filter vars: remoteAddress & remotePort e36b08231 feat: add headers x-whistle-remote-address & x-whistle-remote-port to ui requests 75a4f7846 refactor: refine code 020be58f4 refactor: refine code 0ce7e28da Release v2.8.8 c46ee229d style: add api.selectIndex cc75c4e18 feat: add originalReq.remoteAddress & originalReq.remotePort 26e9a01c0 feat: add getRemotePort & getRemoteAddr c36f51a69 refactor: refine ui 058788666 style: refine ui ebb52a430 Release v2.8.8 7c5831c47 Release v2.8.8 1e17a3745 refactor: refine code 083f9b3be Release v2.8.8 283e9b467 refactor: refine code 8d74314f1 refactor: add default port for internal request 5a48f8cf3 refactor: refine the request host of weinre & log 8718d3972 refactor: refine dns timeout de0a3df8a docs: update 6b4c8c62b refactor: refine code b0282fe40 refactor: from=httpsPort f4b24ba09 Release v2.8.7 ca86236b9 style: refine ui 6bf069ddd Release v2.8.7 13c8fb992 refactor: refine code fcd1d91f1 refactor: add default cert d3ae2e030 feat: allow https server to load cert from plugin 3ca42255e refactor: extract loadCert function f2b2d5310 refactor: refine code a2aa80c2e refactor: refine code f4851a7e1 refactor: add req.isHttpsServer b0304f8a7 refactor: refine code b32c54292 feat: add xxxFilter://from=httpServer & xxxFilter://from=httpsServer b1ad2f87a refactor: refine code d8a0181b2 chore: refine cli tips 3fd4b2a26 style: output cert dir 901e01576 Release v2.8.6 f9a6489dc refactor: refine upload root ca 87e5f1192 refactor: reset certs cache 8c7ae4eaa refactor: utimes 2b3e3ce65 style: refine code 105de81e7 style: refine filter 8257f8f53 refactor: refine code 0c538341b refactor: refine code 4637feb48 Release v2.8.5 8f07572e7 style: set MAX_CERT_SIZE = 128k 4110caf89 refactor: limit filename length 0d763f978 refactor: refine code 87f5103b7 refactor: addContext -> setSecureContext fd0f47c62 refactor: refine code ff163a409 reefactor: update agent 43fe448b1 style: refine ui a81d067d4 refactor: refine code 2f97eb803 style: refine ui b3a379076 Release v2.8.5 91980cc11 feat: handle upload certs 10e6c866d style: read upload certs from disk files e9443a4f8 refactor: refine code 8391dc7ae feat: keep uploaded certificate within 64K 15e168129 feat: add upload certs button b7ae91471 style: remove cert 4a9c28c29 style: remove cert b0052c29b style: show read only certs 417608515 refactor: refine removeCert & updloadCerts 4b3d3fe4b feat: add removeCert & uploadCerts 19b720dce refactor: refine code ac3b65517 refactor: use req.useSNI to determine whether the request uses SNI in auth hook 97aafd4d2 Release v2.8.5 5de0a4cae refactor: non-sni requests can also customize the certificate through the plugin 0b0f0bec5 feat: xxxFilter://from=sni 0b56ba598 refactor: refine code dbde132e9 refactor: prevent access to user-uploaded certificates 11f6e2f81 refactor: refine code e77c00bf6 feat: allow update custom in non-sni request 0501950ac refactor: use sni first 3e929e0d2 Release v2.8.5 001db3462 feat: ignore://-* 25af27052 refactor: refine code d6d3dbdb9 feat: refine pac proxy e506d8188 refactor: refine code 017e765dc feat: lineProps://proxyHostOnly f59ccdd5e fix: proxy request ca1680109 Release v2.8.4 4aafd34ee fix: the problem that the callback may be triggered multiple times ef3a8b06a fix: resolve frames from saz file 0c2a64b6b Release v2.8.3 a2a5775ca refactor: refine proxy connection cache d667f46af feat: enable://authCapture 0b4453fde feat: enable://authCapture 15d929de5 feat: enable://authCapture 1d4d6e85b refactor: tunnelAuth -> tunnelAuthHeader f59af28d7 refactor: refine auth hooks ca45eaf52 refactor: refine code 1db26c5ec feat: disable://tunnelAuth 1c525532f feat: filter rules by xxxFilter://from=tunnel xxxFilter://from=composer fcb55c842 feat: add req.fromTunnel 883214478 style: 64 -> 128 5ce10218c refactor: add request tag 8e553a2ae refactor: import remote sessions by url query.sessionsUrl 8ebe26f34 feat: tunnel.writeHead 38865ed29 feat: add master mode 2b5be7793 refactor: ensure export order 1f5dc0df9 feat: x-forwarded-xxx headers is not used by default 070aedd18 Release v2.8.3 4da2afca6 refactor: resWriteForce -> forceReqWrite 4c1ac0f3c refactor: reqWriteForce -> forceReqWrite, resWriteForce -> forceReqWrite 4c70eae7a refactor: remove enable://xxxWriteDefault 4cd38b698 refactor: refine code c40b337d2 feat: enable://reqWriteForce|resWriteForce|reqWriteDefault|resWriteDefault 8597ab74e feat: enable://forceReqWrite|forceResWrite 8a2d6beab refactor: refine code abee96b3b chore: ignore hidden files 464235f3b refactor: refine code 5657941fb refactor: refine code 6282b1bba Release v2.8.3 59a6582d9 refactor: refine code 2a86352d4 feat: add setReqRules b7a486ff4 feat: header rules first if the request from plugin 16dd6b803 feat: allow plugin request to modify respone by whistle rules 946eb04ce refactor: refine code 94ebe08de refactor: update starting 61536cd6d Release v2.8.3 f51ac7238 docs: add icp b2f087504 config: fix disableForwardedProto typo git-subtree-dir: vendor/whistle git-subtree-split: 19133a06e09ce56fe71af160b3b036a7f7038243
1 parent 53edd07 commit 45ebdc9

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+2042
-690
lines changed

.npmignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ node_modules
5454
.gitignore
5555
.npmignore
5656
.travis.yml
57-
.eslintrc.js
57+
.eslintrc
58+
.editorconfig
5859
.eslintignore
5960
.babelrc
6061
test

CHANGELOG.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,43 @@
1+
# v2.8.10
2+
1. fix: 插件的 sniCallback 返回 `false` 请求没有重新走 TUNNEL 代理问题
3+
2. refactor: 如果插件接收到的请求是 https,则 `req.url` 将为完整的路径
4+
5+
# v2.8.9
6+
1. feat: 支持自定义 `inspectors tab`,详见:https://github.com/whistle-plugins/examples/tree/master/whistle.view-md5
7+
2. feat: 支持通过 `disable://abort` 禁用 `enable://abort`
8+
3. feat: Whistle 默认显示的抓包数据不超过 1.5m,可以通过 `enable://bigData` 扩大到 `2.5m`
9+
10+
# v2.8.8
11+
1. feat: 支持通过 `enable://useLocalHost``enable://useSafePort` 修改 log 和 weinre 请求 URL 的域名或端口
12+
2. style: 界面提供 `api.selectIndex` 选中指定下标的抓包数据
13+
3. feat: 支持插件获取 `originalReq.remoteAddress``originalReq.remotePort`
14+
15+
# v2.8.7
16+
1. feat: `--httpsPort` 启动的 HTTPS Server 支持从插件获取证书
17+
2. feat: 支持通过 `excludeFilter://from=httpServer``includeFilter://from=httpsServer``excludeFilter://from=httpServer``includeFilter://from=httpsServer` 过滤请求
18+
19+
# v2.8.6
20+
1. refactor: 禁止通过页面上传根证书 `root.key & root.crt`
21+
2. refactor: Whistle 自动生成的证书过期时自动续期(有效期一年)
22+
23+
# v2.8.5
24+
1. feat: 支持通过 `ignore://-*` 过滤 `ignore://*`
25+
2. feat: 支持 `proxy``pac` 配置 `lineProps://proxyHostOnly`,当用户配置了 `host` 代理才会生效
26+
3. feat: 非 SNI 请求也支持通过插件自定义证书,且支持直接上传和删除用户自定义证书
27+
28+
# v2.8.4
29+
1. fix: 可能无法导入 saz 文件问题
30+
31+
# v2.8.3
32+
1. fix: https://github.com/avwo/whistle/pull/657
33+
2. feat: 插件 `server` 钩子支持通过 `req.setReqRules & req.setResRules` 设置动态规则
34+
3. feat: 支持通过 `enable://forceReqWrite``enable://forceResWrite` 强制 `reqWrite``reqWriteRaw``resWrite``resWriteRaw`
35+
4. feat: `reqWrite:///path/to/``reqWrite:///path/to` 加以区别,前者会自动把根路径补成 `index.html`
36+
5. feat: 插件的 auth hook 默认情况下如果开启了捕获 https,则对这部分请求只会对解析后的 https 请求生效,如果需要对隧道代理生效可以设置 `enable://authCapture`
37+
6. feat: 默认不启用 `x-forwarded-host``x-forwarded-proto` 直接放过,可以通过以下方式启用:
38+
- 启动参数 `-M x-forwarded-host|x-forwarded-proto`
39+
- 请求进入 Whistle 之前设置请求头 `x-whistle-forwarded-props: host,proto,for,clientIp,ip`
40+
141
# v2.8.2
242
1. feat: `resMerge://json1 resMerge://json2` 默认采用 `extend({}, json1, json2)`,新版支持通过 `resMerge://json1 resMerge://json2 resMerge://true` 开启 `extend(true, {}, json1, json2)`
343
2. refactor: 插件规则里面的 req 和 res rules 分开执行

assets/inspector.html

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
<script>
2+
;(function() {
3+
var config = window.whistleInspectorConfig;
4+
var activeList = [];
5+
var stateList = [1];
6+
var getActiveSession;
7+
var getSelectedSessionList;
8+
var listenersList = [];
9+
10+
function initState(flag) {
11+
stateList[1] = flag;
12+
stateList[2] = flag;
13+
stateList[3] = flag;
14+
}
15+
16+
function updateState(item) {
17+
if (!item || item.lost || item.endTime) {
18+
return initState(1);
19+
}
20+
initState();
21+
if (item.responseTime) {
22+
stateList[2] = 1;
23+
}
24+
if (item.requestTime) {
25+
stateList[1] = 1;
26+
}
27+
}
28+
29+
function emitListeners(item, state) {
30+
if (stateList[state] && item !== activeList[state]) {
31+
activeList[state] = item;
32+
var listeners = listenersList[state];
33+
listeners.forEach(function(l) {
34+
l(item);
35+
});
36+
}
37+
}
38+
39+
function emitAll(item) {
40+
updateState(item);
41+
emitListeners(item, 0);
42+
emitListeners(item, 1);
43+
emitListeners(item, 2);
44+
emitListeners(item, 3);
45+
}
46+
47+
window.__pushWhistle5b6af7b9884e1165SessionActive__ = emitAll;
48+
49+
function getAddEventHandler(state) {
50+
state = state || 0;
51+
listenersList[state] = [];
52+
return function(l) {
53+
if (typeof l !== 'function') {
54+
return;
55+
}
56+
var item = getActiveSession();
57+
emitAll(item);
58+
activeList[state] = item;
59+
if (stateList[state]) {
60+
l(item);
61+
}
62+
var listeners = listenersList[state];
63+
listeners.indexOf(l) === -1 && listeners.push(l);
64+
};
65+
}
66+
67+
function getRemoveEventListener(state) {
68+
state = state || 0;
69+
return function(l) {
70+
var listeners = listenersList[state];
71+
var index = listeners.indexOf(l);
72+
index !== -1 && listeners.splice(index, 1);
73+
};
74+
}
75+
76+
function getRemoveEventListeners(state) {
77+
state = state || 0;
78+
return function(l) {
79+
listenersList[state] = [];
80+
};
81+
}
82+
83+
var toast = {};
84+
var whistleBridge = {
85+
config: config,
86+
toast: toast,
87+
addSessionActiveListener: getAddEventHandler(),
88+
removeSessionActiveListener: getRemoveEventListener(),
89+
removeSessionActiveListeners: getRemoveEventListeners(),
90+
addSessionRequestListener: getAddEventHandler(1),
91+
removeSessionRequestListener: getRemoveEventListener(1),
92+
removeSessionRequestListeners: getRemoveEventListeners(1),
93+
addSessionResponseListener: getAddEventHandler(2),
94+
removeSessionResponseListener: getRemoveEventListener(2),
95+
removeSessionResponseListeners: getRemoveEventListeners(2),
96+
addSessionCompleteListener: getAddEventHandler(3),
97+
removeSessionCompleteListener: getRemoveEventListener(3),
98+
removeSessionCompleteListeners: getRemoveEventListeners(3)
99+
};
100+
101+
try {
102+
window.parent.onWhistleInspectorCustomTabReady(function(options) {
103+
Object.keys(options.msgBox).forEach(function(name) {
104+
toast[name] = options.msgBox[name];
105+
});
106+
getActiveSession = options.getActiveSession;
107+
getSelectedSessionList = options.getSelectedSessionList;
108+
whistleBridge.decodeBase64 = options.decodeBase64;
109+
whistleBridge.importSessions = options.importSessions;
110+
whistleBridge.request = options.request;
111+
whistleBridge.createRequest = options.createRequest;
112+
whistleBridge.showModal = options.showModal;
113+
whistleBridge.getSelectedSessionList = getSelectedSessionList;
114+
whistleBridge.getActiveSession = whistleBridge.getSession = whistleBridge.getSelectedSession = getActiveSession;
115+
whistleBridge.importRules = options.importRules;
116+
whistleBridge.importValues = options.importValues;
117+
whistleBridge.getServerInfo = options.getServerInfo;
118+
whistleBridge.alert = options.alert;
119+
whistleBridge.confirm = options.confirm;
120+
});
121+
} catch (e) {}
122+
window.whistleBridge = whistleBridge;
123+
})();
124+
</script>

assets/menu.html

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,8 @@
5353
window.addEventListener('load', delayOnLoad);
5454
} catch (e) {}
5555
var toast = {};
56-
var modal = {};
57-
window.whistleBridge = {
56+
var whistleBridge = {
5857
config: config,
59-
modal: modal,
6058
toast: toast,
6159
addNetworkListener: function(l) {
6260
if (typeof l === 'function' && networkListeners.indexOf(l) === -1) {
@@ -107,15 +105,20 @@
107105
Object.keys(options.msgBox).forEach(function(name) {
108106
toast[name] = options.msgBox[name];
109107
});
110-
window.whistleBridge.importSessions = options.importSessions;
111-
window.whistleBridge.request = options.request;
112-
window.whistleBridge.createRequest = options.createRequest;
113-
window.whistleBridge.showModal = options.showModal;
114-
window.whistleBridge.createModal = options.createModal;
115-
window.whistleBridge.importRules = options.importRules;
116-
window.whistleBridge.importValues = options.importValues;
108+
whistleBridge.decodeBase64 = options.decodeBase64;
109+
whistleBridge.importSessions = options.importSessions;
110+
whistleBridge.request = options.request;
111+
whistleBridge.createRequest = options.createRequest;
112+
whistleBridge.showModal = options.showModal;
113+
whistleBridge.createModal = options.createModal;
114+
whistleBridge.importRules = options.importRules;
115+
whistleBridge.importValues = options.importValues;
116+
whistleBridge.getServerInfo = options.getServerInfo;
117+
whistleBridge.alert = options.alert;
118+
whistleBridge.confirm = options.confirm;
117119
};
118120
window.parent.onPluginContextMenuReady(window);
119121
} catch (e) {}
122+
window.whistleBridge = whistleBridge;
120123
})();
121124
</script>

bin/plugin.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,13 @@ function install(cmd, name, argv) {
9595
removeDir(installPath);
9696
} catch (e) {}
9797
}
98+
try {
99+
var pkgPath = path.join(realPath, 'node_modules', name, 'package.json');
100+
if (fs.statSync(pkgPath).mtime.getFullYear() < 2010) {
101+
var now = new Date();
102+
fs.utimesSync(pkgPath, now, now);
103+
}
104+
} catch (e) {}
98105
}
99106
});
100107
}

bin/util.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ function showUsage(isRunning, options, restart) {
7676
var list = options.host ? [options.host] : getIpList();
7777
info('[i] 1. use your device to visit the following URL list, gets the ' + colors.bold('IP') + ' of the URL you can access:');
7878
info(list.map(function(ip) {
79-
return ' http://' + colors.bold(ip) + (port ? ':' + port : '') + '/';
79+
return ' http://' + colors.bold(ip) + (port && port != 80 ? ':' + port : '') + '/';
8080
}).join('\n'));
8181

8282
warn(' Note: If all the above URLs are unable to access, check the firewall settings');

biz/webui/cgi-bin/certs/all.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
var ca = require('../../../../lib/https/ca');
2+
3+
module.exports = function(req, res) {
4+
res.json({
5+
certs: ca.getCustomCertsFiles(),
6+
dir: ca.CUSTOM_CERTS_DIR
7+
});
8+
};

biz/webui/cgi-bin/certs/remove.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
var ca = require('../../../../lib/https/ca');
2+
3+
4+
module.exports = function(req, res) {
5+
ca.removeCert(req.body.filename);
6+
var isparsed = req.query.dataType === 'parsed';
7+
res.json(isparsed ? ca.getCustomCertsInfo() : ca.getCustomCertsFiles());
8+
};

biz/webui/cgi-bin/certs/upload.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
var ca = require('../../../../lib/https/ca');
2+
3+
4+
module.exports = function(req, res) {
5+
ca.uploadCerts(req.body);
6+
var isparsed = req.query.dataType === 'parsed';
7+
res.json(isparsed ? ca.getCustomCertsInfo() : ca.getCustomCertsFiles());
8+
};

biz/webui/cgi-bin/composer.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ module.exports = function(req, res) {
217217
var clientId = req.headers[config.CLIENT_ID_HEADER];
218218
var headers = parseHeaders(req.body.headers, rawHeaderNames, clientId);
219219
delete headers[config.WEBUI_HEAD];
220-
headers[config.WHISTLE_REQ_FROM_HEADER] = 'W2COMPOSER';
220+
headers[config.REQ_FROM_HEADER] = 'W2COMPOSER';
221221
headers.host = options.host;
222222
options.clientId = clientId;
223223
var clientIp = util.getClientIp(req);

0 commit comments

Comments
 (0)