@chenpu17/tcpmapping 2.1.0 → 2.1.1

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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/setup-password.js +44 -10
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chenpu17/tcpmapping",
3
- "version": "2.1.0",
3
+ "version": "2.1.1",
4
4
  "description": "TCP端口转发服务器,支持多端口映射、WebUI管理界面和实时连接监控",
5
5
  "main": "server.js",
6
6
  "bin": {
package/setup-password.js CHANGED
@@ -55,36 +55,70 @@ function validatePassword(password) {
55
55
  // 获取用户输入(隐藏密码)
56
56
  function getPassword(prompt) {
57
57
  return new Promise((resolve) => {
58
- // 对于密码输入,我们使用标准输入但隐藏输出
58
+ const rl2 = readline.createInterface({
59
+ input: process.stdin,
60
+ output: process.stdout
61
+ });
62
+
63
+ // Windows 兼容:使用简单的输入方式
64
+ // 在某些终端上密码可能可见,但这是最兼容的方式
65
+ if (process.platform === 'win32') {
66
+ // Windows: 尝试隐藏输入
67
+ const spawn = require('child_process').spawnSync;
68
+ process.stdout.write(prompt);
69
+
70
+ try {
71
+ // 使用 PowerShell 读取密码
72
+ const result = spawn('powershell', [
73
+ '-Command',
74
+ '$pwd = Read-Host -AsSecureString; [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($pwd))'
75
+ ], { stdio: ['inherit', 'pipe', 'inherit'] });
76
+
77
+ if (result.status === 0 && result.stdout) {
78
+ resolve(result.stdout.toString().trim());
79
+ return;
80
+ }
81
+ } catch (e) {
82
+ // PowerShell 不可用,回退到普通输入
83
+ }
84
+
85
+ // 回退方案:普通输入(密码可见)
86
+ console.log('(密码将可见)');
87
+ rl2.question('', (answer) => {
88
+ rl2.close();
89
+ resolve(answer);
90
+ });
91
+ return;
92
+ }
93
+
94
+ // Unix/Mac: 使用 raw mode 隐藏密码
59
95
  process.stdout.write(prompt);
60
96
  process.stdin.setRawMode(true);
61
97
  process.stdin.setEncoding('utf8');
62
-
98
+
63
99
  let password = '';
64
-
100
+
65
101
  const onData = (char) => {
66
102
  if (char === '\n' || char === '\r' || char === '\u0004') {
67
- // 结束输入
68
103
  process.stdin.setRawMode(false);
69
104
  process.stdin.removeListener('data', onData);
105
+ process.stdin.pause();
70
106
  process.stdout.write('\n');
71
107
  resolve(password);
72
108
  } else if (char === '\u0003') {
73
- // Ctrl+C
74
109
  process.exit();
75
- } else if (char === '\u007f') {
76
- // 退格键
110
+ } else if (char === '\u007f' || char === '\b') {
77
111
  if (password.length > 0) {
78
112
  password = password.slice(0, -1);
79
113
  process.stdout.write('\b \b');
80
114
  }
81
- } else {
82
- // 普通字符
115
+ } else if (char.charCodeAt(0) >= 32) {
83
116
  password += char;
84
117
  process.stdout.write('*');
85
118
  }
86
119
  };
87
-
120
+
121
+ process.stdin.resume();
88
122
  process.stdin.on('data', onData);
89
123
  });
90
124
  }