whistle 2.9.20 → 2.9.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -28,6 +28,7 @@ Whistle 是基于 Node 实现的跨平台抓包调试工具,其主要特点:
28
28
  * 项目可以自带代理规则配置并一键设置到本地 Whistle 代理,也可以通过定制插件简化操作
29
29
 
30
30
  # 一键安装
31
+ > 如果电脑上安装 [Homebrew](https://brew.sh/) 也可以通过 `brew install whistle && w2 start --init` 一键安装,无需手动安装 Node
31
32
  1. 安装 Node(建议安装**最新的 LTS 版本**,如已安装忽略此步骤):https://nodejs.org/
32
33
  2. 一键安装,在命令行执行以下命令:
33
34
  ``` sh
@@ -65,5 +66,17 @@ Whistle 是基于 Node 实现的跨平台抓包调试工具,其主要特点:
65
66
 
66
67
  ### 详细用法参见:[Whistle 帮助文档](https://wproxy.org/whistle/quickstart.html)
67
68
 
69
+ # 通过 SwitchyOmega 设置代理
70
+ 全局代理如果会影响到某些客户端的请求(客户端设置了 ssl pinning),也可以使用 Chrome 插件设置代理(只对 Chrome 生效):
71
+ > 可以通过 `w2 proxy off` 关闭全局代理
72
+
73
+ 1. 设置 Whistle 代理
74
+
75
+ <img src="https://user-images.githubusercontent.com/11450939/36636618-132bb09e-1a05-11e8-8514-813fd34a5454.png" width="800" />
76
+ 2. 选择 Whistle 代理
77
+
78
+ <img width="180" alt="image" src="https://user-images.githubusercontent.com/11450939/173984519-143615b2-2a99-4486-a22a-fec71fe00423.png">
79
+
80
+
68
81
  # License
69
82
  [MIT](./LICENSE)
@@ -1,6 +1,6 @@
1
1
  var net = require('net');
2
- var proxy = require('./index');
3
- var util = require('../util');
2
+ var proxy = require('set-global-proxy');
3
+ var util = require('./util');
4
4
 
5
5
  var OFF_RE = /^(?:o|0|-{0,2}off)$/i;
6
6
  var BYPASS_RE = /^(?:-{0,2}bypass|-x|-b)$/i;
@@ -39,6 +39,7 @@ module.exports = function(argv) {
39
39
  }
40
40
  var options = {};
41
41
  var skip;
42
+ var sudo = true;
42
43
  argv.forEach(function(arg) {
43
44
  if (skip) {
44
45
  options.bypass = arg;
@@ -66,11 +67,14 @@ module.exports = function(argv) {
66
67
  if (host && (net.isIP(host) || HOST_RE.test(host))) {
67
68
  options.host = host || options.host;
68
69
  }
70
+ } else if (arg === '--no-sudo') {
71
+ sudo = false;
69
72
  }
70
73
  });
71
74
  if (!options.port) {
72
75
  options.port = util.getDefaultPort();
73
76
  }
74
77
  options.host = options.host || '127.0.0.1';
78
+ options.sudo = sudo;
75
79
  enableProxy(options);
76
80
  };
package/bin/use.js CHANGED
@@ -145,10 +145,12 @@ module.exports = function(filepath, storage, force) {
145
145
  error('The rules cannot be empty and the size cannot exceed 256k.');
146
146
  return;
147
147
  }
148
+ var groupName = getString(result.groupName) || getString(result.group);
148
149
  var setRules = function() {
149
150
  var body = [
150
151
  'name=' + encodeURIComponent(name),
151
- 'rules=' + encodeURIComponent(rules)
152
+ 'rules=' + encodeURIComponent(rules),
153
+ 'groupName=' + encodeURIComponent(groupName.trim())
152
154
  ].join('&');
153
155
  request(body, function() {
154
156
  info('Setting whistle (' + (options.host || '127.0.0.1') + ':' + port + ') rules successful.');
package/bin/whistle.js CHANGED
@@ -7,7 +7,7 @@ var useRules = require('./use');
7
7
  var showStatus = require('./status');
8
8
  var util = require('./util');
9
9
  var plugin = require('./plugin');
10
- var setProxy = require('./proxy/cli');
10
+ var setProxy = require('./proxy');
11
11
  var installCA = require('./ca/cli');
12
12
 
13
13
  var error = util.error;
@@ -1,12 +1,20 @@
1
1
  var rules = require('../../../../lib/rules/util').rules;
2
2
  var recycleBin = require('../../../../lib/rules/util').rules.recycleBin;
3
+ var isGroup = require('../../../../lib/util/common').isGroup;
3
4
 
4
5
  module.exports = function(req, res) {
5
6
  var body = req.body;
6
7
  var list;
7
- rules.add(body.name, body.value, body.clientId);
8
- if (body.addToTop) {
9
- rules.moveToTop(body.name, body.clientId);
8
+ var exists = rules.exists(body.name);
9
+ if (rules.add(body.name, body.value, body.clientId) != null && !isGroup(body.name)) {
10
+ if (body.groupName) {
11
+ rules.moveToGroup(body.name, body.groupName, body.addToTop);
12
+ } else if (body.addToTop) {
13
+ rules.moveToTop(body.name, body.clientId);
14
+ } else if (!exists) {
15
+ var group = rules.getFirstGroup();
16
+ group && rules.moveTo(body.name, group.name, body.clientId);
17
+ }
10
18
  }
11
19
  if (req.body.recycleFilename) {
12
20
  recycleBin.remove(req.body.recycleFilename);
@@ -2,6 +2,6 @@ var rules = require('../../../../lib/rules/util').rules;
2
2
 
3
3
  module.exports = function(req, res) {
4
4
  var body = req.body;
5
- var result = rules.moveTo(body.from, body.to, body.clientId);
5
+ var result = rules.moveTo(body.from, body.to, body.clientId, body.group === 'true', body.toTop === 'true');
6
6
  res.json({ec: result ? 0 : 2, em: 'success'});
7
7
  };
@@ -1,20 +1,37 @@
1
1
  var rules = require('../../../../lib/rules/util').rules;
2
2
 
3
+ var DEFAULT_GROUP = '\rothers';
4
+
3
5
  module.exports = function(req, res) {
4
6
  var body = req.body;
5
- var name = body.name;
7
+ var name = typeof body.name === 'string' ? body.name.trim() : null;
8
+ if (!name) {
9
+ return res.json({ ec: 0 });
10
+ }
6
11
  var rulesText = body.rules || body.value;
7
12
  if (!rulesText || !name || typeof rulesText !== 'string') {
8
13
  if (body.enable == 1) {
9
14
  rules.select(name);
10
15
  }
11
- if (body.top == 1) {
16
+ return res.json({ ec: 0, rules: !!rules.get(name) });
17
+ }
18
+ if (rules.add(name, rulesText) != null) {
19
+ var groupName = typeof body.groupName === 'string' ? body.groupName.trim() : '';
20
+ rules.select(name);
21
+ if (groupName) {
22
+ groupName = '\r' + groupName;
23
+ var group = rules.getFirstGroup();
24
+ if (rules.add(groupName) != null) {
25
+ if (!group && groupName !== DEFAULT_GROUP) {
26
+ rules.add(DEFAULT_GROUP);
27
+ rules.moveToTop(DEFAULT_GROUP);
28
+ }
29
+ rules.moveToGroup(name, groupName, true);
30
+ rules.moveGroupToTop(groupName);
31
+ }
32
+ } else {
12
33
  rules.moveToTop(name);
13
34
  }
14
- return res.json({ ec: 0, rules: !!rules.get(name) });
15
35
  }
16
- rules.add(name, rulesText);
17
- rules.select(name);
18
- rules.moveToTop(name);
19
36
  res.json({ ec: 0 });
20
37
  };
@@ -1,10 +1,19 @@
1
1
  var values = require('../../../../lib/rules/util').values;
2
2
  var recycleBin = require('../../../../lib/rules/util').values.recycleBin;
3
+ var isGroup = require('../../../../lib/util/common').isGroup;
3
4
 
4
5
  module.exports = function(req, res) {
5
6
  var body = req.body;
6
7
  var list;
7
- values.add(body.name, body.value, body.clientId);
8
+ var exists = values.exists(body.name);
9
+ if (values.add(body.name, body.value, body.clientId) != null && !isGroup(body.name)) {
10
+ if (body.groupName) {
11
+ values.moveToGroup(body.name, body.groupName);
12
+ } else if (!exists) {
13
+ var group = values.getFirstGroup();
14
+ group && values.moveTo(body.name, group.name, body.clientId);
15
+ }
16
+ }
8
17
  if (req.body.recycleFilename) {
9
18
  recycleBin.remove(req.body.recycleFilename);
10
19
  list = recycleBin.list();
@@ -2,6 +2,6 @@ var values = require('../../../../lib/rules/util').values;
2
2
 
3
3
  module.exports = function(req, res) {
4
4
  var body = req.body;
5
- var result = values.moveTo(body.from, body.to, body.clientId);
5
+ var result = values.moveTo(body.from, body.to, body.clientId, body.group === 'true');
6
6
  res.json({ec: result ? 0 : 2, em: 'success'});
7
7
  };
@@ -8,6 +8,6 @@
8
8
  </head>
9
9
  <body style="overscroll-behavior-x: none;">
10
10
  <div id="container" class="main"></div>
11
- <script src="js/index.js?v=2.9.19"></script>
11
+ <script src="js/index.js?v=2.9.22"></script>
12
12
  </body>
13
13
  </html>