@enkaku/server 0.3.0 → 0.3.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.
- package/lib/access-control.d.ts +1 -1
- package/lib/access-control.d.ts.map +1 -1
- package/lib/access-control.js +21 -5
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/package.json +4 -4
package/lib/access-control.d.ts
CHANGED
|
@@ -8,6 +8,6 @@ export type CommandAccessPayload = {
|
|
|
8
8
|
cmd?: string;
|
|
9
9
|
exp?: number;
|
|
10
10
|
};
|
|
11
|
-
export declare function checkCommandAccess(record: CommandAccessRecord, token: SignedToken<CommandAccessPayload>, atTime?: number): Promise<void>;
|
|
11
|
+
export declare function checkCommandAccess(serverID: string, record: CommandAccessRecord, token: SignedToken<CommandAccessPayload>, atTime?: number): Promise<void>;
|
|
12
12
|
export declare function checkClientToken<Definition extends AnyDefinitions>(serverID: string, record: CommandAccessRecord, token: SignedToken<AnyClientPayloadOf<Definition>>, atTime?: number): Promise<void>;
|
|
13
13
|
//# sourceMappingURL=access-control.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access-control.d.ts","sourceRoot":"","sources":["../src/access-control.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAE1E,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;AAEzE,MAAM,MAAM,oBAAoB,GAAG;IACjC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,WAAW,CAAC,oBAAoB,CAAC,EACxC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"access-control.d.ts","sourceRoot":"","sources":["../src/access-control.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAE1E,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;AAEzE,MAAM,MAAM,oBAAoB,GAAG;IACjC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,WAAW,CAAC,oBAAoB,CAAC,EACxC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED,wBAAsB,gBAAgB,CAAC,UAAU,SAAS,cAAc,EACtE,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,WAAW,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,EAClD,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
|
package/lib/access-control.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { assertNonExpired, checkCapability, hasPartsMatch } from '@enkaku/capability';
|
|
2
|
-
export async function checkCommandAccess(record, token, atTime) {
|
|
2
|
+
export async function checkCommandAccess(serverID, record, token, atTime) {
|
|
3
3
|
const payload = token.payload;
|
|
4
4
|
if (payload.cmd == null) {
|
|
5
5
|
throw new Error('No command to check');
|
|
6
6
|
}
|
|
7
|
-
const subject = payload.sub ?? payload.iss;
|
|
8
7
|
for (const [command, access] of Object.entries(record)){
|
|
9
8
|
if (hasPartsMatch(payload.cmd, command)) {
|
|
10
9
|
if (access === true) {
|
|
@@ -14,13 +13,18 @@ export async function checkCommandAccess(record, token, atTime) {
|
|
|
14
13
|
if (access === false) {
|
|
15
14
|
continue;
|
|
16
15
|
}
|
|
17
|
-
if (
|
|
16
|
+
if (access.includes(payload.iss)) {
|
|
17
|
+
// Issuer is allowed directly
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (payload.sub == null || !access.includes(payload.sub)) {
|
|
18
21
|
continue;
|
|
19
22
|
}
|
|
20
23
|
try {
|
|
24
|
+
// Check delegation from subject
|
|
21
25
|
await checkCapability({
|
|
22
26
|
act: payload.cmd,
|
|
23
|
-
res:
|
|
27
|
+
res: serverID
|
|
24
28
|
}, payload, atTime);
|
|
25
29
|
return;
|
|
26
30
|
} catch {}
|
|
@@ -30,6 +34,10 @@ export async function checkCommandAccess(record, token, atTime) {
|
|
|
30
34
|
}
|
|
31
35
|
export async function checkClientToken(serverID, record, token, atTime) {
|
|
32
36
|
const payload = token.payload;
|
|
37
|
+
const command = payload.cmd;
|
|
38
|
+
if (command == null) {
|
|
39
|
+
throw new Error('No command to check');
|
|
40
|
+
}
|
|
33
41
|
if (payload.iss === serverID) {
|
|
34
42
|
// If issuer uses the server's signer, only check audience and expiration if provided
|
|
35
43
|
if (payload.aud != null && payload.aud !== serverID) {
|
|
@@ -40,8 +48,16 @@ export async function checkClientToken(serverID, record, token, atTime) {
|
|
|
40
48
|
}
|
|
41
49
|
return;
|
|
42
50
|
}
|
|
51
|
+
if (payload.sub === serverID) {
|
|
52
|
+
// If subject is the server, check capability directly
|
|
53
|
+
await checkCapability({
|
|
54
|
+
act: command,
|
|
55
|
+
res: serverID
|
|
56
|
+
}, payload, atTime);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
43
59
|
if (payload.aud !== serverID) {
|
|
44
60
|
throw new Error('Invalid audience');
|
|
45
61
|
}
|
|
46
|
-
await checkCommandAccess(record, token, atTime);
|
|
62
|
+
await checkCommandAccess(serverID, record, token, atTime);
|
|
47
63
|
}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export type { CommandAccessRecord } from './access-control.js';
|
|
1
2
|
export type { RejectionType } from './rejections.js';
|
|
2
3
|
export { type ServeParams, type Server, serve } from './server.js';
|
|
3
4
|
export type { ChannelHandler, ChannelHandlerContext, CommandHandlers, EventHandler, EventHandlerContext, HandlerReturn, RequestHandler, RequestHandlerContext, StreamHandler, StreamHandlerContext, } from './types.js';
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAClE,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,oBAAoB,GACrB,MAAM,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAC9D,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAClE,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,oBAAoB,GACrB,MAAM,YAAY,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enkaku/server",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"type": "module",
|
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
"sideEffects": false,
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"@enkaku/capability": "^0.3.0",
|
|
18
|
-
"@enkaku/
|
|
18
|
+
"@enkaku/jwt": "^0.3.0",
|
|
19
19
|
"@enkaku/stream": "^0.3.0",
|
|
20
|
-
"@enkaku/
|
|
20
|
+
"@enkaku/util": "^0.3.0"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
|
-
"@enkaku/protocol": "^0.3.
|
|
23
|
+
"@enkaku/protocol": "^0.3.1",
|
|
24
24
|
"@enkaku/transport": "^0.3.0"
|
|
25
25
|
},
|
|
26
26
|
"scripts": {
|