efront 4.32.4 → 4.33.0
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/#/345/233/275/351/231/205/345/214/226.yml +3 -3
- package/coms/basic/ASN1.js +26 -0
- package/coms/basic/ASN_1.js +131 -0
- package/coms/basic/SliceRange.js +86 -0
- package/coms/basic/decodeASN1.js +240 -0
- package/coms/basic/encodeASN1.js +45 -0
- package/coms/basic/sortname.js +2 -0
- package/coms/basic/strings.js +16 -2
- package/coms/basic_/&defineProperty.js +1 -0
- package/coms/compile/Javascript.js +200 -0
- package/coms/compile/scanner2.js +3 -0
- package/coms/frame/route.js +2 -2
- package/coms/pivot/acme2.js +1 -26
- package/coms/third-party/lzma.js +1 -4
- package/coms/zimoli/menu.less +6 -5
- package/coms/zimoli/menuList.less +1 -0
- package/coms/zimoli/popup.js +1 -1
- package/data/packexe-setup.sfx +0 -0
- package/debug.log +3 -0
- package/package.json +1 -1
- package/public/efront.js +1 -1
- package/public//346/226/207/344/273/266/347/263/273/347/273/237//344/270/273/351/241/265.jsp +2 -2
|
@@ -2282,7 +2282,7 @@
|
|
|
2282
2282
|
en: "You may open the port opened to view the demo: $1"
|
|
2283
2283
|
|
|
2284
2284
|
- zh-CN: 请在空目录或efront目录执行创建操作!
|
|
2285
|
-
en: Please perform the creation operation in an empty or
|
|
2285
|
+
en: Please perform the creation operation in an empty or efront directory!
|
|
2286
2286
|
|
|
2287
2287
|
- zh-CN: 当前文件夹不为空!
|
|
2288
2288
|
en: The current folder is not empty!
|
|
@@ -2399,7 +2399,7 @@
|
|
|
2399
2399
|
en: Connect to an efront server and obtain the Dash
|
|
2400
2400
|
|
|
2401
2401
|
- zh-CN: 用一个连接号登录本机的efront服务器,接收并打印消息
|
|
2402
|
-
en: Log in to the
|
|
2402
|
+
en: Log in to the efront server of the local machine with a Dash to receive and print messages
|
|
2403
2403
|
|
|
2404
2404
|
- zh-CN: 向一个连接号发送消息
|
|
2405
2405
|
en: Send a message to a Dash
|
|
@@ -2408,7 +2408,7 @@
|
|
|
2408
2408
|
en: Check for External variable in a file or folder
|
|
2409
2409
|
|
|
2410
2410
|
- zh-CN: 执行按efront方式加载的代码
|
|
2411
|
-
en: Executing code loaded in
|
|
2411
|
+
en: Executing code loaded in efront mode
|
|
2412
2412
|
|
|
2413
2413
|
- zh-CN: 查找含有指定的外部变量的文件
|
|
2414
2414
|
en: Find the file containing the specified External variable
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
var ASN1 = function (tag) { // tag=tagClass|type|composed_flag
|
|
2
|
+
var length = 0;
|
|
3
|
+
var bytesarr = [];
|
|
4
|
+
for (var cx = 1, dx = arguments.length; cx < dx; cx++) {
|
|
5
|
+
var bytes = arguments[cx];
|
|
6
|
+
if (bytes.constructor !== Array) {
|
|
7
|
+
bytes = Array.apply(null, bytes);
|
|
8
|
+
}
|
|
9
|
+
bytesarr.push(bytes);
|
|
10
|
+
length += bytes.length;
|
|
11
|
+
}
|
|
12
|
+
var asn1 = [tag];
|
|
13
|
+
if (length > 127) {
|
|
14
|
+
var nums = [];
|
|
15
|
+
while (length > 0) {
|
|
16
|
+
nums.unshift(length & 0xff);
|
|
17
|
+
length = length >>> 8;
|
|
18
|
+
}
|
|
19
|
+
asn1.push(0x80 | nums.length, ...nums);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
asn1.push(length);
|
|
23
|
+
}
|
|
24
|
+
asn1 = asn1.concat(...bytesarr);
|
|
25
|
+
return asn1;
|
|
26
|
+
};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
exports = ASN1;
|
|
2
|
+
export const
|
|
3
|
+
UNIVERSAL = 0x00,
|
|
4
|
+
APPLICATION = 0x40,
|
|
5
|
+
CONTEXT_SPECIFIC = 0x80,
|
|
6
|
+
PRIVATE = 0xC0;
|
|
7
|
+
export const
|
|
8
|
+
NONE = 0,
|
|
9
|
+
BOOLEAN = 1,
|
|
10
|
+
INTEGER = 2,
|
|
11
|
+
BITSTRING = 3,
|
|
12
|
+
OCTETSTRING = 4,
|
|
13
|
+
NULL = 5,
|
|
14
|
+
OID = 6,
|
|
15
|
+
ODESC = 7,
|
|
16
|
+
EXTERNAL = 8,
|
|
17
|
+
REAL = 9,
|
|
18
|
+
ENUMERATED = 10,
|
|
19
|
+
EMBEDDED = 11,
|
|
20
|
+
UTF8 = 12,
|
|
21
|
+
ROID = 13,
|
|
22
|
+
SEQUENCE = 16,
|
|
23
|
+
SET = 17,
|
|
24
|
+
PRINTABLESTRING = 19,
|
|
25
|
+
IA5STRING = 22,
|
|
26
|
+
UTCTIME = 23,
|
|
27
|
+
GENERALIZEDTIME = 24,
|
|
28
|
+
BMPSTRING = 30;
|
|
29
|
+
export const CONSTRUCTED = 0x20;
|
|
30
|
+
export var Null = ASN1(NULL);
|
|
31
|
+
export var integer = function (value) {
|
|
32
|
+
if (value.length) return ASN1(INTEGER, value);
|
|
33
|
+
if (value == 0) return ASN1(INTEGER, [0]);
|
|
34
|
+
let bytes = [];
|
|
35
|
+
let isNegative = value < 0;
|
|
36
|
+
if (typeof value === 'bigint') {
|
|
37
|
+
if (isNegative) value = -value + 1n;
|
|
38
|
+
while (value > 0) {
|
|
39
|
+
bytes.push(Number(value & BigInt(0xff)));
|
|
40
|
+
value >>= BigInt(8);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
if (isNegative) value = -value + 1;
|
|
45
|
+
while (value > 0) {
|
|
46
|
+
bytes.push(value & 0xff);
|
|
47
|
+
value >>= 8;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if ((bytes[0] & 0x80) !== 0 && !isNegative) bytes.push(0x00); // 正数 MSB 0
|
|
51
|
+
if ((bytes[0] & 0x7f) === 0 && isNegative) bytes.push(0xff); // 负数 MSB 1
|
|
52
|
+
bytes.reverse();
|
|
53
|
+
return ASN1(INTEGER, bytes);
|
|
54
|
+
};
|
|
55
|
+
export var boolean, bool = boolean = function (v) {
|
|
56
|
+
return ASN1(BOOLEAN, [v ? 0xff : 0]);
|
|
57
|
+
};
|
|
58
|
+
export var True = bool(true);
|
|
59
|
+
export var False = bool(false);
|
|
60
|
+
export var bitString = function (bytes) {
|
|
61
|
+
return ASN1(BITSTRING, bytes);
|
|
62
|
+
};
|
|
63
|
+
export var octetString = ASN1.octet = function (bytes) {
|
|
64
|
+
return ASN1(OCTETSTRING, bytes);
|
|
65
|
+
};
|
|
66
|
+
export var oid = function () {
|
|
67
|
+
var [oid] = arguments;
|
|
68
|
+
if (typeof oid === 'string') oid = oid.split('.').map(a => +a);
|
|
69
|
+
if (typeof oid === 'number') oid = Array.prototype.slice.call(arguments, 0, arguments.length);
|
|
70
|
+
var first = 40 * oid[0] + oid[1];
|
|
71
|
+
oid = [first].concat(oid.slice(2));
|
|
72
|
+
var bytes = [OID];
|
|
73
|
+
for (var arc of oid) {
|
|
74
|
+
if (arc === 0) {
|
|
75
|
+
bytes.push([0]);
|
|
76
|
+
continue;
|
|
77
|
+
};
|
|
78
|
+
var bts = [];
|
|
79
|
+
while (arc > 0) {
|
|
80
|
+
bts.push(arc % 128);
|
|
81
|
+
arc = Math.floor(arc / 128);
|
|
82
|
+
}
|
|
83
|
+
bts.reverse();
|
|
84
|
+
for (let i = 0; i < bts.length - 1; i++) {
|
|
85
|
+
bts[i] |= 128;
|
|
86
|
+
}
|
|
87
|
+
bytes.push(bts);
|
|
88
|
+
}
|
|
89
|
+
return ASN1.apply(null, bytes);
|
|
90
|
+
};
|
|
91
|
+
export var utf8 = function (string) {
|
|
92
|
+
if (typeof string === 'string') string = encodeUTF8(string);
|
|
93
|
+
return ASN1(UTF8, string);
|
|
94
|
+
};
|
|
95
|
+
export var printable = function (string) {
|
|
96
|
+
if (typeof string === 'string') string = encodeUTF8(string);
|
|
97
|
+
return ASN1(PRINTABLESTRING, string);
|
|
98
|
+
};
|
|
99
|
+
var getTime = function (value) {
|
|
100
|
+
if (typeof value === "number" || /^\d+[\/\\\-]/i.test(value)) value = new Date(value);
|
|
101
|
+
if (value instanceof Date) {
|
|
102
|
+
var n = n => n < 10 ? '0' + n : n;
|
|
103
|
+
value = [
|
|
104
|
+
value.getUTCFullYear(),
|
|
105
|
+
value.getUTCMonth() + 1,
|
|
106
|
+
value.getUTCDate(),
|
|
107
|
+
value.getUTCHours(),
|
|
108
|
+
value.getUTCMinutes(),
|
|
109
|
+
value.getUTCSeconds()
|
|
110
|
+
].map(n).join("") + "Z";
|
|
111
|
+
}
|
|
112
|
+
return value;
|
|
113
|
+
}
|
|
114
|
+
export var generaltime, time = generaltime = function (value) {
|
|
115
|
+
value = getTime(value);
|
|
116
|
+
return ASN1(GENERALIZEDTIME, encodeUTF8(value));
|
|
117
|
+
};
|
|
118
|
+
export var utctime = function (value) {
|
|
119
|
+
// yyMMddhhmmssZ
|
|
120
|
+
value = getTime(value).slice(-13);
|
|
121
|
+
return ASN1(UTCTIME, encodeUTF8(value));
|
|
122
|
+
}
|
|
123
|
+
export var set = function (...bytes) {
|
|
124
|
+
return ASN1(SET | CONSTRUCTED, ...bytes);
|
|
125
|
+
}
|
|
126
|
+
export var sequence = function (...bytes) {
|
|
127
|
+
return ASN1(SEQUENCE | CONSTRUCTED, ...bytes);
|
|
128
|
+
}
|
|
129
|
+
export var specific = function (...bytes) {
|
|
130
|
+
return ASN1(CONTEXT_SPECIFIC | CONSTRUCTED, ...bytes);
|
|
131
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
function checkRange(from, to) {
|
|
2
|
+
if (!isFinit(from) || !isFinit(to)) throw Error('边界异常!');
|
|
3
|
+
if (from > to) throw new Error(`左边界${from}大于右边界${to}!`);
|
|
4
|
+
}
|
|
5
|
+
function copyCaped(copyto, caped) {
|
|
6
|
+
copyto.length = caped.length;
|
|
7
|
+
for (var cx = 0, dx = copyto.length; cx < dx; cx++) {
|
|
8
|
+
copyto[cx] = caped[cx];
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
// 包含from不包含to,步进单位是1
|
|
12
|
+
function SliceRange(from, to) {
|
|
13
|
+
checkRange(from, to);
|
|
14
|
+
if (!this || this.constructor !== SliceRange) return new SliceRange(from, to);
|
|
15
|
+
if (from < to) {
|
|
16
|
+
this[0] = [from, to];
|
|
17
|
+
this.length = 1;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
this.length = 0;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
SliceRange.prototype.delete = function (from, to) {
|
|
25
|
+
checkRange(from, to);
|
|
26
|
+
var caped = [];
|
|
27
|
+
for (var cx = 0, dx = this.length; cx < dx; cx++) {
|
|
28
|
+
var [m, n] = this[cx];
|
|
29
|
+
delete this[cx];
|
|
30
|
+
if (m >= from && n <= to) continue;
|
|
31
|
+
if (n < from || m > to) {
|
|
32
|
+
caped.push([m, n]);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (m < from) {
|
|
36
|
+
caped.push([m, from]);
|
|
37
|
+
}
|
|
38
|
+
if (n > to) {
|
|
39
|
+
caped.push([to, n]);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
copyCaped(this, caped);
|
|
43
|
+
};
|
|
44
|
+
SliceRange.prototype.split = function (maxSize) {
|
|
45
|
+
var caped = [];
|
|
46
|
+
for (var cx = 0, dx = this.length; cx < dx; cx++) {
|
|
47
|
+
var [m, n] = this[cx];
|
|
48
|
+
while (n - m > maxSize) {
|
|
49
|
+
caped.push([m, m += maxSize]);
|
|
50
|
+
}
|
|
51
|
+
if (n > m) caped.push([m, n]);
|
|
52
|
+
}
|
|
53
|
+
copyCaped(this, caped);
|
|
54
|
+
};
|
|
55
|
+
SliceRange.prototype.add = function (from, to) {
|
|
56
|
+
checkRange(from, to);
|
|
57
|
+
if (from === to) return;
|
|
58
|
+
var caped = [];
|
|
59
|
+
var pushed = false;
|
|
60
|
+
for (var cx = 0, dx = this.length; cx < dx; cx++) {
|
|
61
|
+
var [m, n] = this[cx];
|
|
62
|
+
delete this[cx];
|
|
63
|
+
if (n < from) {
|
|
64
|
+
caped.push([m, n]);
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (m > to) {
|
|
68
|
+
if (!pushed) {
|
|
69
|
+
caped.push([from, to]);
|
|
70
|
+
pushed = true;
|
|
71
|
+
}
|
|
72
|
+
caped.push([m, n]);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (m >= from) {
|
|
76
|
+
m = from;
|
|
77
|
+
}
|
|
78
|
+
if (n <= to) {
|
|
79
|
+
n = to;
|
|
80
|
+
}
|
|
81
|
+
from = m, to = n;
|
|
82
|
+
}
|
|
83
|
+
if (!pushed) caped.push([from, to]);
|
|
84
|
+
copyCaped(this, caped);
|
|
85
|
+
}
|
|
86
|
+
SliceRange.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
var BigInt = this.BigInt;
|
|
2
|
+
function int(b) {
|
|
3
|
+
var Num = BigInt ? BigInt : Number;
|
|
4
|
+
var a = b;
|
|
5
|
+
var s = Num(0);
|
|
6
|
+
var isNeg = a[0] & 0x80;
|
|
7
|
+
if (isNeg) {
|
|
8
|
+
if (a[0] === 0xff) a = a.slice(1);
|
|
9
|
+
}
|
|
10
|
+
for (var cx = 0, dx = a.length; cx < dx; cx++) {
|
|
11
|
+
s = s * Num(256) + Num(a[cx]);
|
|
12
|
+
}
|
|
13
|
+
if (s > 0x1fffffffffffff && !BigInt) {
|
|
14
|
+
return b;
|
|
15
|
+
// throw new Error('数值精度超出限制!');
|
|
16
|
+
}
|
|
17
|
+
if (s < 0x1fffffffffffff && BigInt) s = Number(s);
|
|
18
|
+
if (isNeg) s = -s;
|
|
19
|
+
return s;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function oid(a) {
|
|
23
|
+
var d = [];
|
|
24
|
+
for (var cx = 0, dx = a.length; cx < dx;) {
|
|
25
|
+
var n = 0;
|
|
26
|
+
do {
|
|
27
|
+
var b = a[cx++];
|
|
28
|
+
n = n * 128 + (b & 0x7f);
|
|
29
|
+
} while (b & 0x80);
|
|
30
|
+
d.push(n);
|
|
31
|
+
}
|
|
32
|
+
var n = d[0];
|
|
33
|
+
d.splice(0, 1, n / 40 | 0, n % 40);
|
|
34
|
+
return d.join('.');
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
var typeNames = [
|
|
38
|
+
'NONE',
|
|
39
|
+
'BOOLEAN',
|
|
40
|
+
'INTEGER',
|
|
41
|
+
'BITSTRING',
|
|
42
|
+
'OCTETSTRING',
|
|
43
|
+
'NULL',
|
|
44
|
+
'OID',
|
|
45
|
+
'ODESC',
|
|
46
|
+
'EXTERNAL',
|
|
47
|
+
'REAL',
|
|
48
|
+
'ENUMERATED',
|
|
49
|
+
'EMBEDDED',
|
|
50
|
+
'UTF8',
|
|
51
|
+
'ROID',
|
|
52
|
+
'14',
|
|
53
|
+
'15',
|
|
54
|
+
'SEQUENCE',
|
|
55
|
+
'SET',
|
|
56
|
+
'NUMERICSTRING',
|
|
57
|
+
'PRINTABLESTRING',
|
|
58
|
+
'TELETEXSTRING',
|
|
59
|
+
'VIDEOTEXSTRING',
|
|
60
|
+
'IASSTRING',
|
|
61
|
+
'UTCTIME',
|
|
62
|
+
'GENERALIZEDTIME',
|
|
63
|
+
'GRAPHICSTRING',
|
|
64
|
+
'VISIBLESTRING',
|
|
65
|
+
'GENERALSTRING',
|
|
66
|
+
'UNIVERSALSTRING',
|
|
67
|
+
'CHARACTERSTRING',
|
|
68
|
+
'BMPSTRING',
|
|
69
|
+
'31',
|
|
70
|
+
];
|
|
71
|
+
var classNames = [
|
|
72
|
+
'UNIVERSAL',
|
|
73
|
+
"APPLICATION",
|
|
74
|
+
"CONTEXT_SPECIFIC",
|
|
75
|
+
"PRIVATE"
|
|
76
|
+
];
|
|
77
|
+
var typeMap = {
|
|
78
|
+
"octet": "octetString",
|
|
79
|
+
"bit": "bitString",
|
|
80
|
+
"generalizedtime": "time",
|
|
81
|
+
"boolean": 'bool',
|
|
82
|
+
};
|
|
83
|
+
var { SEQUENCE, SET, CONTEXT_SPECIFIC } = ASN_1;
|
|
84
|
+
var stringify = function (obj, deep = 1) {
|
|
85
|
+
var deep1 = deep + 1;
|
|
86
|
+
var space1 = Array(deep1).join(" ");
|
|
87
|
+
var space = Array(deep).join(" ");
|
|
88
|
+
if (obj instanceof Array) {
|
|
89
|
+
var a = [];
|
|
90
|
+
for (var o of obj) {
|
|
91
|
+
var d = stringify(o, deep1);
|
|
92
|
+
a.push(d);
|
|
93
|
+
}
|
|
94
|
+
return a.join(",\r\n" + space1);
|
|
95
|
+
}
|
|
96
|
+
if (!obj) return;
|
|
97
|
+
var a = obj.tagName.toLowerCase().split('|').map(a => a.trim());
|
|
98
|
+
var iscollect = obj.type === SEQUENCE || obj.type === SET || !obj.type && obj.class === CONTEXT_SPECIFIC;
|
|
99
|
+
var n = a.filter(a => a != "constructed").map(a => a.split("_").pop()).join("_");
|
|
100
|
+
if (iscollect && !obj.constructed) n += "_noconstruct";
|
|
101
|
+
if (!iscollect && obj.constructed) n += "_constructed";
|
|
102
|
+
if (n === 'null') return `Null`;
|
|
103
|
+
if (obj.children) {
|
|
104
|
+
if (obj.children.length) return `${n}(// ${deep}, ${obj.length}\r\n${space1}${stringify(obj.children, deep)}\r\n${space})`;
|
|
105
|
+
return `${n}()`;
|
|
106
|
+
}
|
|
107
|
+
var value = obj.value !== obj.data ? obj.value : `[${Array.prototype.slice.call(obj.data, 0, obj.data.length).join(', ')}]`;
|
|
108
|
+
var comment = '';
|
|
109
|
+
if (typeof value === 'bigint') value = value > 0x1fffffffffffff || value < -0x1fffffffffffff ? String(value) + "n" : value;
|
|
110
|
+
else if (obj.value !== obj.data) {
|
|
111
|
+
if (value in valueComment) comment = valueComment[value];
|
|
112
|
+
value = JSON.stringify(value);
|
|
113
|
+
}
|
|
114
|
+
if (!/_/.test(n)) n = n.replace(/string$/i, ''), n = typeMap[n] || n;
|
|
115
|
+
if (n in ASN_1) var res = `${n}(${value})`;
|
|
116
|
+
else res = `ASN1(${obj.tagName}, ${value})`;
|
|
117
|
+
if (comment) res = `/* ${comment} */\r\n${space}` + res;
|
|
118
|
+
return res;
|
|
119
|
+
}
|
|
120
|
+
var valueComment = {};
|
|
121
|
+
class Asn1Object {
|
|
122
|
+
toString(comment) {
|
|
123
|
+
var _comment = valueComment;
|
|
124
|
+
if (typeof comment === "object" && comment !== null) valueComment = comment;
|
|
125
|
+
var res = stringify(this, this.deep || 1);
|
|
126
|
+
valueComment = _comment;
|
|
127
|
+
return res;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function decodeASN1(buff, deep = 0) {
|
|
131
|
+
var parsed = [];
|
|
132
|
+
deep++;
|
|
133
|
+
for (var index = 0, cx = 0, dx = buff.length; cx < dx; index++) {
|
|
134
|
+
var bx = cx;
|
|
135
|
+
var tag = buff[cx++];
|
|
136
|
+
if (!tag) break;
|
|
137
|
+
var length = buff[cx++];
|
|
138
|
+
if (length >= 0x80) {
|
|
139
|
+
var length = 0x7f & length;
|
|
140
|
+
var num = 0;
|
|
141
|
+
while (length > 0) {
|
|
142
|
+
length--;
|
|
143
|
+
var b = buff[cx++];
|
|
144
|
+
num = (num << 8) + b;
|
|
145
|
+
}
|
|
146
|
+
length = num;
|
|
147
|
+
}
|
|
148
|
+
var data, value = data = buff.slice(cx, cx += length);
|
|
149
|
+
var bf = buff.slice(bx, cx);
|
|
150
|
+
var constructed = !!(0x20 & tag);
|
|
151
|
+
var Class = tag & 0xc0;
|
|
152
|
+
var className = classNames[Class >>> 6];
|
|
153
|
+
var type = tag & 0x1f;
|
|
154
|
+
var typeName = typeNames[type];
|
|
155
|
+
var hasChildren = false;
|
|
156
|
+
var showValue = false;
|
|
157
|
+
switch (type) {
|
|
158
|
+
case 0:// 保留给编码规则使用
|
|
159
|
+
hasChildren = constructed;
|
|
160
|
+
if (hasChildren) value = decodeASN1(value, deep);
|
|
161
|
+
break;
|
|
162
|
+
case 1:// 布尔类型
|
|
163
|
+
showValue = !constructed;
|
|
164
|
+
if (showValue) value = !!value[0];
|
|
165
|
+
break;
|
|
166
|
+
case 2:// 整型
|
|
167
|
+
showValue = !constructed;
|
|
168
|
+
if (showValue) value = int(value);
|
|
169
|
+
break;
|
|
170
|
+
case 5:// NULL
|
|
171
|
+
showValue = !constructed;
|
|
172
|
+
if (showValue) value = null;
|
|
173
|
+
break;
|
|
174
|
+
case 6:// oid
|
|
175
|
+
showValue = !constructed;
|
|
176
|
+
if (showValue) value = oid(value);
|
|
177
|
+
break;
|
|
178
|
+
case 12:// UTF8 字符串类型
|
|
179
|
+
showValue = !constructed;
|
|
180
|
+
if (showValue) value = decodeUTF8(value);
|
|
181
|
+
break;
|
|
182
|
+
case 16:// 序列和类型序列
|
|
183
|
+
value = decodeASN1(value, deep);
|
|
184
|
+
hasChildren = true;
|
|
185
|
+
break;
|
|
186
|
+
case 17:// 集合和类型的集合
|
|
187
|
+
value = decodeASN1(value, deep);
|
|
188
|
+
hasChildren = true;
|
|
189
|
+
break;
|
|
190
|
+
case 19: // 可打印字符串
|
|
191
|
+
showValue = !constructed;
|
|
192
|
+
if (showValue) value = decodeUTF8(value);
|
|
193
|
+
break;
|
|
194
|
+
case 23: // utc 时间 1950 - 2049
|
|
195
|
+
showValue = !constructed;
|
|
196
|
+
if (showValue) value = new Date(decodeUTF8(value).replace(/^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(Z|\+\d{4})$/, function (_, yy, MM, dd, hh, mm, ss, zone) {
|
|
197
|
+
yy = +yy;
|
|
198
|
+
if (yy < 50) yy += 100;
|
|
199
|
+
yy += 1900;
|
|
200
|
+
return `${yy}-${MM}-${dd}T${hh}:${mm}:${ss}${zone}`;
|
|
201
|
+
}));
|
|
202
|
+
break;
|
|
203
|
+
case 24: // utc 时间 4位年份
|
|
204
|
+
showValue = !constructed;
|
|
205
|
+
if (showValue) value = new Date(decodeUTF8(value).replace(
|
|
206
|
+
/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2}(?:\.\d+)?)(Z|\+\d{4})$/,
|
|
207
|
+
"$1-$2-$3T$4:$5:$6$7"
|
|
208
|
+
));
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
var obj = new Asn1Object(...{
|
|
213
|
+
tag,
|
|
214
|
+
tagName: [
|
|
215
|
+
Class ? className : '',
|
|
216
|
+
type ? typeName : '',
|
|
217
|
+
constructed ? 'CONSTRUCTED' : ''
|
|
218
|
+
].filter(a => !!a).join(" | "),
|
|
219
|
+
type, typeName,
|
|
220
|
+
length,
|
|
221
|
+
constructed,
|
|
222
|
+
deep,
|
|
223
|
+
buff: bf,
|
|
224
|
+
index,
|
|
225
|
+
class: Class, className,
|
|
226
|
+
data, value
|
|
227
|
+
});
|
|
228
|
+
if (hasChildren) obj.children = value;
|
|
229
|
+
for (var k in obj) {
|
|
230
|
+
if (!/^(tag|index|deep|value|children|length)/.test(k) || k === "deep" && !hasChildren || k === "value" && !showValue) {
|
|
231
|
+
Object.defineProperty(obj, k, { value: obj[k], enumerable: false });
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
parsed.push(obj);
|
|
235
|
+
}
|
|
236
|
+
return parsed;
|
|
237
|
+
}
|
|
238
|
+
function main(data) {
|
|
239
|
+
return decodeASN1(data)[0];
|
|
240
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BOOLEAN,
|
|
3
|
+
bool,
|
|
4
|
+
INTEGER,
|
|
5
|
+
integer,
|
|
6
|
+
UTCTIME,
|
|
7
|
+
utctime,
|
|
8
|
+
UTF8,
|
|
9
|
+
utf8,
|
|
10
|
+
PRINTABLESTRING,
|
|
11
|
+
printable,
|
|
12
|
+
NULL,
|
|
13
|
+
Null,
|
|
14
|
+
OID,
|
|
15
|
+
oid,
|
|
16
|
+
GENERALIZEDTIME,
|
|
17
|
+
time
|
|
18
|
+
} from "./ASN_1";
|
|
19
|
+
// 将由decodeASN1生成的结构重新编码成二进制数据
|
|
20
|
+
function encodeASN1(object) {
|
|
21
|
+
var { type, data, class: class1, constructed, value } = object;
|
|
22
|
+
var tag = object.tag || type | class1 | constructed;
|
|
23
|
+
if (object.children) {
|
|
24
|
+
if (constructed === undefined) constructed = true;
|
|
25
|
+
data = object.children.map(encodeASN1);
|
|
26
|
+
return ASN1(tag, ...data);
|
|
27
|
+
}
|
|
28
|
+
else if (value !== undefined) {
|
|
29
|
+
switch (type) {
|
|
30
|
+
case BOOLEAN: data = bool(value); break;
|
|
31
|
+
case INTEGER: data = integer(value); break;
|
|
32
|
+
case OID: data = oid(value); break;
|
|
33
|
+
case UTCTIME: data = utctime(value); break;
|
|
34
|
+
case GENERALIZEDTIME: data = time(value); break;
|
|
35
|
+
case UTF8: data = utf8(value); break;
|
|
36
|
+
case NULL: data = Null; break;
|
|
37
|
+
case PRINTABLESTRING: data = printable(value); break;
|
|
38
|
+
default: data = ASN1(tag, data);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
data = ASN1(tag, data);
|
|
43
|
+
}
|
|
44
|
+
return data;
|
|
45
|
+
}
|
package/coms/basic/sortname.js
CHANGED
|
@@ -84,6 +84,8 @@ var parse干支 = function (a) {
|
|
|
84
84
|
return (12 + g - z) % 12 / 2 * 10 + g + 1;
|
|
85
85
|
};
|
|
86
86
|
var compare = function (a, b) {
|
|
87
|
+
if (a.name) a = a.name;
|
|
88
|
+
if (b.name) b = b.name;
|
|
87
89
|
for (var cx1 = a.length - 1, cx2 = b.length - 1; cx1 >= 0 && cx2 >= 0; cx1--, cx2--) {
|
|
88
90
|
while (/[\s\u00a0]/.test(a[cx1])) cx1--;
|
|
89
91
|
while (/[\s\u00a0]/.test(b[cx2])) cx2--;
|
package/coms/basic/strings.js
CHANGED
|
@@ -45,8 +45,22 @@ function uncode(s) {
|
|
|
45
45
|
return s.replace(/\\u(?:\{[0-9a-f]+\}|[0-9a-f]{4})/ig, esc);
|
|
46
46
|
}
|
|
47
47
|
function kicode(s) {
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
var t = [];
|
|
49
|
+
return s.replace(/\\(?:u\{[0-9a-f]+\}|u[0-9a-f]{4}|x[0-9a-f]{2}|([0-7]{1,3}|[\s\S]))/ig, (a, b, i) => {
|
|
50
|
+
if (!b) {
|
|
51
|
+
if (/^\\x/.test(a)) {
|
|
52
|
+
b = parseInt(a.slice(2, 4), 16);
|
|
53
|
+
t.push(b);
|
|
54
|
+
i += a.length;
|
|
55
|
+
if (!/^\\x[0-9a-f]{2}$/i.test(s.slice(i, i + 4))) {
|
|
56
|
+
b = decodeUTF8(t);
|
|
57
|
+
t = [];
|
|
58
|
+
return b;
|
|
59
|
+
}
|
|
60
|
+
return "";
|
|
61
|
+
}
|
|
62
|
+
return esc(a);
|
|
63
|
+
}
|
|
50
64
|
if (unescapeMap.hasOwnProperty(a)) return unescapeMap[a];
|
|
51
65
|
if (/^[0-7]+$/.test(b)) return String.fromCharCode(parseInt(b, 8));
|
|
52
66
|
return b;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty;
|