t880216t-server 1.5.20 → 1.5.21
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/lib/plugins/whistle.nohost/lib/accountMgr.js +4 -53
- package/lib/plugins/whistle.nohost/lib/uiServer/cgi/selectEnv.js +1 -11
- package/lib/plugins/whistle.nohost/lib/uiServer/openAPI.js +2 -34
- package/package.json +1 -1
- package/public/{admin.75d42731d4aa7f7a558d3abf2a375fcb.js → admin.00b88a83b089feb23b4cf1534688d853.js} +2 -2
- package/public/admin.html +1 -1
- /package/public/{admin.75d42731d4aa7f7a558d3abf2a375fcb.js.LICENSE.txt → admin.00b88a83b089feb23b4cf1534688d853.js.LICENSE.txt} +0 -0
|
@@ -5,10 +5,6 @@ const util = require('./util');
|
|
|
5
5
|
const { getServerIp } = require('../../../util/address');
|
|
6
6
|
const parseDomain = require('../../../util/parseDomain');
|
|
7
7
|
|
|
8
|
-
const generateShortId = () => {
|
|
9
|
-
return Date.now().toString(36) + Math.random().toString(36).substring(2, 8);
|
|
10
|
-
};
|
|
11
|
-
|
|
12
8
|
const { parseJSON, shasum } = util;
|
|
13
9
|
const MAX_ACCOUNT_COUNT = 120;
|
|
14
10
|
const MAX_PASSWORD_LENGTH = 24;
|
|
@@ -482,18 +478,10 @@ class AccountMgr {
|
|
|
482
478
|
return false;
|
|
483
479
|
}
|
|
484
480
|
const list = [];
|
|
485
|
-
|
|
486
|
-
(account.envList || []).forEach((env) => {
|
|
487
|
-
existingEnvMap[env.name] = env;
|
|
488
|
-
});
|
|
489
|
-
envList.forEach(({ name, id, data }) => {
|
|
481
|
+
envList.forEach(({ name, data }) => {
|
|
490
482
|
if (name) {
|
|
491
|
-
const existingEnv = existingEnvMap[name];
|
|
492
|
-
// 优先级:传入的id > 已存在的id > 自动生成
|
|
493
|
-
const envId = id || (existingEnv && existingEnv.id) || generateShortId();
|
|
494
483
|
list.push({
|
|
495
484
|
name,
|
|
496
|
-
id: envId,
|
|
497
485
|
rules: data,
|
|
498
486
|
});
|
|
499
487
|
}
|
|
@@ -504,21 +492,6 @@ class AccountMgr {
|
|
|
504
492
|
return true;
|
|
505
493
|
}
|
|
506
494
|
|
|
507
|
-
renameEnv(accountName, oldName, newName) {
|
|
508
|
-
const account = this.getAccount(accountName);
|
|
509
|
-
if (!account || !account.envList) {
|
|
510
|
-
return false;
|
|
511
|
-
}
|
|
512
|
-
const env = account.envList.find((e) => e.name === oldName);
|
|
513
|
-
if (!env) {
|
|
514
|
-
return false;
|
|
515
|
-
}
|
|
516
|
-
env.name = newName;
|
|
517
|
-
this.saveAccount(account);
|
|
518
|
-
this.parseRules();
|
|
519
|
-
return true;
|
|
520
|
-
}
|
|
521
|
-
|
|
522
495
|
checkName(name) {
|
|
523
496
|
return typeof name === 'string' && NAME_RE.test(name);
|
|
524
497
|
}
|
|
@@ -615,29 +588,8 @@ class AccountMgr {
|
|
|
615
588
|
return this.checkName(name) ? accountMap[name] : null;
|
|
616
589
|
}
|
|
617
590
|
|
|
618
|
-
getRulesByEnvId(accountName, envId) {
|
|
619
|
-
const account = this.getAccount(accountName);
|
|
620
|
-
if (!account || !account.envList) {
|
|
621
|
-
return { rules: '', headers: undefined };
|
|
622
|
-
}
|
|
623
|
-
const env = account.envList.find((e) => e.id === envId);
|
|
624
|
-
if (!env) {
|
|
625
|
-
return { rules: '', headers: undefined };
|
|
626
|
-
}
|
|
627
|
-
return this.parsedMap[`${accountName}/${env.name}`] || { rules: '', headers: undefined };
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
getEnvNameById(accountName, envId) {
|
|
631
|
-
const account = this.getAccount(accountName);
|
|
632
|
-
if (!account || !account.envList) {
|
|
633
|
-
return '';
|
|
634
|
-
}
|
|
635
|
-
const env = account.envList.find((e) => e.id === envId);
|
|
636
|
-
return env ? env.name : '';
|
|
637
|
-
}
|
|
638
|
-
|
|
639
591
|
getRules(name, envName) {
|
|
640
|
-
return this.parsedMap[`${name}/${envName}`] ||
|
|
592
|
+
return this.parsedMap[`${name}/${envName}`] || '';
|
|
641
593
|
}
|
|
642
594
|
|
|
643
595
|
getAllAccounts() {
|
|
@@ -665,7 +617,7 @@ class AccountMgr {
|
|
|
665
617
|
return;
|
|
666
618
|
}
|
|
667
619
|
const envList = [];
|
|
668
|
-
account.envList.forEach(({ name,
|
|
620
|
+
account.envList.forEach(({ name, rules }) => {
|
|
669
621
|
if (!name || name[0] === '\r') {
|
|
670
622
|
return;
|
|
671
623
|
}
|
|
@@ -676,8 +628,7 @@ class AccountMgr {
|
|
|
676
628
|
}
|
|
677
629
|
envList.push({
|
|
678
630
|
name,
|
|
679
|
-
id:
|
|
680
|
-
envId: id || encodeURIComponent(name),
|
|
631
|
+
id: encodeURIComponent(name),
|
|
681
632
|
rules,
|
|
682
633
|
});
|
|
683
634
|
});
|
|
@@ -2,17 +2,7 @@ const { COOKIE_NAME, ENV_MAX_AGE, decodeURIComponentSafe, getClientId } = requir
|
|
|
2
2
|
|
|
3
3
|
module.exports = (ctx) => {
|
|
4
4
|
const { name, envId, redirect } = ctx.request.query;
|
|
5
|
-
|
|
6
|
-
// 如果 envId 看起来像短ID(不包含编码的环境名特征),则通过 envId 查找 envName
|
|
7
|
-
if (envId && !envId.includes('%')) {
|
|
8
|
-
envName = ctx.accountMgr.getEnvNameById(name, envId);
|
|
9
|
-
// 如果没找到,回退到直接解码(兼容旧逻辑)
|
|
10
|
-
if (!envName) {
|
|
11
|
-
envName = decodeURIComponentSafe(envId);
|
|
12
|
-
}
|
|
13
|
-
} else {
|
|
14
|
-
envName = decodeURIComponentSafe(envId);
|
|
15
|
-
}
|
|
5
|
+
const envName = decodeURIComponentSafe(envId);
|
|
16
6
|
const env = ctx.envMgr.setEnv(getClientId(ctx), name, envName);
|
|
17
7
|
let value = '';
|
|
18
8
|
if (env) {
|
|
@@ -17,19 +17,8 @@ const CGI_MAP = {
|
|
|
17
17
|
};
|
|
18
18
|
|
|
19
19
|
const getRules = (options) => {
|
|
20
|
-
const { account, name, env, envName
|
|
21
|
-
let rules = '';
|
|
22
|
-
let headers;
|
|
23
|
-
// 如果传入了 envId,优先使用 envId 查询
|
|
24
|
-
if (envId && (account || name)) {
|
|
25
|
-
const result = accountMgr.getRulesByEnvId(account || name, envId);
|
|
26
|
-
rules = result.rules || '';
|
|
27
|
-
headers = result.headers;
|
|
28
|
-
} else {
|
|
29
|
-
const result = accountMgr.getRules(account || name, env || envName);
|
|
30
|
-
rules = result.rules || '';
|
|
31
|
-
headers = result.headers;
|
|
32
|
-
}
|
|
20
|
+
const { account, name, env, envName } = options;
|
|
21
|
+
let { rules = '', headers } = accountMgr.getRules(account || name, env || envName);
|
|
33
22
|
if (headers) {
|
|
34
23
|
headers = JSON.stringify(headers);
|
|
35
24
|
if (headers.length > 2) {
|
|
@@ -51,27 +40,6 @@ module.exports = async (ctx, next) => {
|
|
|
51
40
|
ctx.body = getRules(query);
|
|
52
41
|
return;
|
|
53
42
|
}
|
|
54
|
-
|
|
55
|
-
// Handle rename-env specially to preserve env id
|
|
56
|
-
if (cgiName === 'rename-env') {
|
|
57
|
-
const name = ctx.get('x-nohost-account-name');
|
|
58
|
-
const account = ctx.accountMgr.getAccount(name);
|
|
59
|
-
if (!account) {
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
const curAuthKey = authKey && ctx.get('x-nohost-auth-key');
|
|
63
|
-
if (!curAuthKey || (authKey !== curAuthKey && curAuthKey !== ctx.accountMgr.defaultAuthKey)) {
|
|
64
|
-
ctx.status = 403;
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
const { query } = ctx.request;
|
|
68
|
-
const oldName = query.name;
|
|
69
|
-
const newName = query.newValue || query.newName;
|
|
70
|
-
if (oldName && newName) {
|
|
71
|
-
ctx.accountMgr.renameEnv(name, oldName, newName);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
43
|
cgiName = CGI_MAP[cgiName];
|
|
76
44
|
const name = ctx.get('x-nohost-account-name');
|
|
77
45
|
const account = cgiName && ctx.accountMgr.getAccount(name);
|