@owlmeans/server-auth 0.1.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/LICENSE +21 -0
- package/README.md +490 -0
- package/build/.gitkeep +0 -0
- package/build/actions/index.d.ts +2 -0
- package/build/actions/index.d.ts.map +1 -0
- package/build/actions/index.js +2 -0
- package/build/actions/index.js.map +1 -0
- package/build/actions/service.d.ts +4 -0
- package/build/actions/service.d.ts.map +1 -0
- package/build/actions/service.js +7 -0
- package/build/actions/service.js.map +1 -0
- package/build/consts.d.ts +5 -0
- package/build/consts.d.ts.map +1 -0
- package/build/consts.js +5 -0
- package/build/consts.js.map +1 -0
- package/build/index.d.ts +6 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +5 -0
- package/build/index.js.map +1 -0
- package/build/manager/actions/index.d.ts +2 -0
- package/build/manager/actions/index.d.ts.map +1 -0
- package/build/manager/actions/index.js +2 -0
- package/build/manager/actions/index.js.map +1 -0
- package/build/manager/actions/manager.d.ts +6 -0
- package/build/manager/actions/manager.d.ts.map +1 -0
- package/build/manager/actions/manager.js +10 -0
- package/build/manager/actions/manager.js.map +1 -0
- package/build/manager/consts.d.ts +3 -0
- package/build/manager/consts.d.ts.map +1 -0
- package/build/manager/consts.js +3 -0
- package/build/manager/consts.js.map +1 -0
- package/build/manager/context.d.ts +3 -0
- package/build/manager/context.d.ts.map +1 -0
- package/build/manager/context.js +26 -0
- package/build/manager/context.js.map +1 -0
- package/build/manager/exports.d.ts +16 -0
- package/build/manager/exports.d.ts.map +1 -0
- package/build/manager/exports.js +13 -0
- package/build/manager/exports.js.map +1 -0
- package/build/manager/index.d.ts +11 -0
- package/build/manager/index.d.ts.map +1 -0
- package/build/manager/index.js +10 -0
- package/build/manager/index.js.map +1 -0
- package/build/manager/main.d.ts +3 -0
- package/build/manager/main.d.ts.map +1 -0
- package/build/manager/main.js +7 -0
- package/build/manager/main.js.map +1 -0
- package/build/manager/model.d.ts +3 -0
- package/build/manager/model.d.ts.map +1 -0
- package/build/manager/model.js +68 -0
- package/build/manager/model.js.map +1 -0
- package/build/manager/modules.d.ts +2 -0
- package/build/manager/modules.d.ts.map +1 -0
- package/build/manager/modules.js +21 -0
- package/build/manager/modules.js.map +1 -0
- package/build/manager/plugins/basic-ed25519.d.ts +4 -0
- package/build/manager/plugins/basic-ed25519.d.ts.map +1 -0
- package/build/manager/plugins/basic-ed25519.js +42 -0
- package/build/manager/plugins/basic-ed25519.js.map +1 -0
- package/build/manager/plugins/basic-rely.d.ts +4 -0
- package/build/manager/plugins/basic-rely.d.ts.map +1 -0
- package/build/manager/plugins/basic-rely.js +152 -0
- package/build/manager/plugins/basic-rely.js.map +1 -0
- package/build/manager/plugins/export.d.ts +6 -0
- package/build/manager/plugins/export.d.ts.map +1 -0
- package/build/manager/plugins/export.js +5 -0
- package/build/manager/plugins/export.js.map +1 -0
- package/build/manager/plugins/index.d.ts +4 -0
- package/build/manager/plugins/index.d.ts.map +1 -0
- package/build/manager/plugins/index.js +9 -0
- package/build/manager/plugins/index.js.map +1 -0
- package/build/manager/plugins/re-captcha.d.ts +4 -0
- package/build/manager/plugins/re-captcha.d.ts.map +1 -0
- package/build/manager/plugins/re-captcha.js +49 -0
- package/build/manager/plugins/re-captcha.js.map +1 -0
- package/build/manager/plugins/types.d.ts +25 -0
- package/build/manager/plugins/types.d.ts.map +1 -0
- package/build/manager/plugins/types.js +2 -0
- package/build/manager/plugins/types.js.map +1 -0
- package/build/manager/plugins/utils.d.ts +8 -0
- package/build/manager/plugins/utils.d.ts.map +1 -0
- package/build/manager/plugins/utils.js +18 -0
- package/build/manager/plugins/utils.js.map +1 -0
- package/build/manager/rely/flow.d.ts +5 -0
- package/build/manager/rely/flow.d.ts.map +1 -0
- package/build/manager/rely/flow.js +127 -0
- package/build/manager/rely/flow.js.map +1 -0
- package/build/manager/rely/index.d.ts +2 -0
- package/build/manager/rely/index.d.ts.map +1 -0
- package/build/manager/rely/index.js +2 -0
- package/build/manager/rely/index.js.map +1 -0
- package/build/manager/rely.d.ts +3 -0
- package/build/manager/rely.d.ts.map +1 -0
- package/build/manager/rely.js +63 -0
- package/build/manager/rely.js.map +1 -0
- package/build/manager/types.d.ts +33 -0
- package/build/manager/types.d.ts.map +1 -0
- package/build/manager/types.js +2 -0
- package/build/manager/types.js.map +1 -0
- package/build/manager/utils/index.d.ts +2 -0
- package/build/manager/utils/index.d.ts.map +1 -0
- package/build/manager/utils/index.js +2 -0
- package/build/manager/utils/index.js.map +1 -0
- package/build/manager/utils/trusted.d.ts +5 -0
- package/build/manager/utils/trusted.d.ts.map +1 -0
- package/build/manager/utils/trusted.js +11 -0
- package/build/manager/utils/trusted.js.map +1 -0
- package/build/model/index.d.ts +2 -0
- package/build/model/index.d.ts.map +1 -0
- package/build/model/index.js +2 -0
- package/build/model/index.js.map +1 -0
- package/build/model/rely/consumer.d.ts +3 -0
- package/build/model/rely/consumer.d.ts.map +1 -0
- package/build/model/rely/consumer.js +9 -0
- package/build/model/rely/consumer.js.map +1 -0
- package/build/model/rely/index.d.ts +5 -0
- package/build/model/rely/index.d.ts.map +1 -0
- package/build/model/rely/index.js +4 -0
- package/build/model/rely/index.js.map +1 -0
- package/build/model/rely/peer.d.ts +5 -0
- package/build/model/rely/peer.d.ts.map +1 -0
- package/build/model/rely/peer.js +36 -0
- package/build/model/rely/peer.js.map +1 -0
- package/build/model/rely/provider.d.ts +3 -0
- package/build/model/rely/provider.d.ts.map +1 -0
- package/build/model/rely/provider.js +6 -0
- package/build/model/rely/provider.js.map +1 -0
- package/build/model/rely/types.d.ts +8 -0
- package/build/model/rely/types.d.ts.map +1 -0
- package/build/model/rely/types.js +2 -0
- package/build/model/rely/types.js.map +1 -0
- package/build/modules.d.ts +3 -0
- package/build/modules.d.ts.map +1 -0
- package/build/modules.js +11 -0
- package/build/modules.js.map +1 -0
- package/build/service.d.ts +7 -0
- package/build/service.d.ts.map +1 -0
- package/build/service.js +90 -0
- package/build/service.js.map +1 -0
- package/build/types.d.ts +13 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +2 -0
- package/build/types.js.map +1 -0
- package/package.json +76 -0
- package/src/actions/index.ts +2 -0
- package/src/actions/service.ts +16 -0
- package/src/consts.ts +8 -0
- package/src/index.ts +6 -0
- package/src/manager/README.md +507 -0
- package/src/manager/actions/index.ts +2 -0
- package/src/manager/actions/manager.ts +23 -0
- package/src/manager/consts.ts +4 -0
- package/src/manager/context.ts +33 -0
- package/src/manager/exports.ts +17 -0
- package/src/manager/index.ts +11 -0
- package/src/manager/main.ts +9 -0
- package/src/manager/model.ts +93 -0
- package/src/manager/modules.ts +29 -0
- package/src/manager/plugins/basic-ed25519.ts +56 -0
- package/src/manager/plugins/basic-rely.ts +167 -0
- package/src/manager/plugins/export.ts +6 -0
- package/src/manager/plugins/index.ts +13 -0
- package/src/manager/plugins/re-captcha.ts +62 -0
- package/src/manager/plugins/types.ts +27 -0
- package/src/manager/plugins/utils.ts +21 -0
- package/src/manager/rely/flow.ts +135 -0
- package/src/manager/rely/index.ts +2 -0
- package/src/manager/rely.ts +90 -0
- package/src/manager/types.ts +42 -0
- package/src/manager/utils/index.ts +2 -0
- package/src/manager/utils/trusted.ts +16 -0
- package/src/model/index.ts +2 -0
- package/src/model/rely/consumer.ts +11 -0
- package/src/model/rely/index.ts +5 -0
- package/src/model/rely/peer.ts +43 -0
- package/src/model/rely/provider.ts +9 -0
- package/src/model/rely/types.ts +8 -0
- package/src/modules.ts +17 -0
- package/src/service.ts +126 -0
- package/src/types.ts +15 -0
- package/tsconfig.json +15 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { AllowanceResponse } from '@owlmeans/auth';
|
|
2
|
+
import type { AuthModel } from '../types.js';
|
|
3
|
+
import type { AbstractRequest } from '@owlmeans/module';
|
|
4
|
+
import type { RedisResource } from '@owlmeans/redis-resource';
|
|
5
|
+
import type { ResourceRecord } from '@owlmeans/resource';
|
|
6
|
+
export interface AuthPlugin extends Omit<AuthModel, "rely"> {
|
|
7
|
+
type: string;
|
|
8
|
+
}
|
|
9
|
+
export interface RecpatchaResponse {
|
|
10
|
+
success: boolean;
|
|
11
|
+
challenge_ts: number;
|
|
12
|
+
hostname: string;
|
|
13
|
+
'error-codes'?: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface RecaptchaRequest extends AbstractRequest<{
|
|
16
|
+
secret: string;
|
|
17
|
+
response: string;
|
|
18
|
+
remoteip?: string;
|
|
19
|
+
}> {
|
|
20
|
+
}
|
|
21
|
+
export interface RelyRecord extends ResourceRecord, AllowanceResponse {
|
|
22
|
+
}
|
|
23
|
+
export interface AuthRedisResource extends RedisResource<RelyRecord> {
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/manager/plugins/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAExD,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC;IACzD,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,gBAAiB,SAAQ,eAAe,CAAC;IACxD,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAC;CAAI;AAEN,MAAM,WAAW,UAAW,SAAQ,cAAc,EAAE,iBAAiB;CACpE;AAED,MAAM,WAAW,iBAAkB,SAAQ,aAAa,CAAC,UAAU,CAAC;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/manager/plugins/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AuthPlugin } from './types.js';
|
|
2
|
+
import type { AppContext, AppConfig } from '../types.js';
|
|
3
|
+
export declare const assertType: (type: string, plugin: AuthPlugin) => void;
|
|
4
|
+
/**
|
|
5
|
+
* @throws {AuthUnknown}
|
|
6
|
+
*/
|
|
7
|
+
export declare const getPlugin: (type: string, context: AppContext<AppConfig>) => AuthPlugin;
|
|
8
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/manager/plugins/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAExD,eAAO,MAAM,UAAU,SAAU,MAAM,UAAU,UAAU,SAI1D,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,SAAU,MAAM,WAAW,UAAU,CAAC,SAAS,CAAC,KAAG,UAMxE,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { AuthUnknown, TypeMissmatchError } from '@owlmeans/auth';
|
|
2
|
+
import { plugins } from './index.js';
|
|
3
|
+
export const assertType = (type, plugin) => {
|
|
4
|
+
if (type !== plugin.type) {
|
|
5
|
+
throw new TypeMissmatchError(plugin.type);
|
|
6
|
+
}
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* @throws {AuthUnknown}
|
|
10
|
+
*/
|
|
11
|
+
export const getPlugin = (type, context) => {
|
|
12
|
+
const plugin = plugins[type];
|
|
13
|
+
if (plugin == null) {
|
|
14
|
+
throw new AuthUnknown(type);
|
|
15
|
+
}
|
|
16
|
+
return plugins[type](context);
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/manager/plugins/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAEhE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAGpC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,MAAkB,EAAE,EAAE;IAC7D,IAAI,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QACzB,MAAM,IAAI,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC3C,CAAC;AACH,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,OAA8B,EAAc,EAAE;IACpF,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,CAAA;IAC7B,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAA;AAC/B,CAAC,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Auth } from '@owlmeans/auth';
|
|
2
|
+
import type { AuthenticateMethod, Connection } from '@owlmeans/socket';
|
|
3
|
+
import type { AppContext } from '../types.js';
|
|
4
|
+
export declare const createRelyFlow: (context: AppContext, conn: Connection, auth?: Auth | null) => AuthenticateMethod;
|
|
5
|
+
//# sourceMappingURL=flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../../src/manager/rely/flow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,IAAI,EAA8B,MAAM,gBAAgB,CAAA;AAExF,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAyB,MAAM,kBAAkB,CAAA;AAE7F,OAAO,KAAK,EAAE,UAAU,EAAiD,MAAM,aAAa,CAAA;AAkB5F,eAAO,MAAM,cAAc,YAAa,UAAU,QAAQ,UAAU,SAAS,IAAI,GAAG,IAAI,KAAG,kBAgH1F,CAAA"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { AUTH_SCOPE, AuthenticationStage, AuthenticationType, AuthPluginError, AuthRole, RELY_3RD } from '@owlmeans/auth';
|
|
2
|
+
import { isEventMessage, isMessage } from '@owlmeans/socket';
|
|
3
|
+
import { makeAuthModel } from '../model.js';
|
|
4
|
+
import { EnvelopeKind, makeEnvelopeModel } from '@owlmeans/basic-envelope';
|
|
5
|
+
import { trusted } from '../utils/trusted.js';
|
|
6
|
+
import { RELY_TUNNEL } from '../consts.js';
|
|
7
|
+
import { RELY_ACTION_TIMEOUT } from '@owlmeans/auth-common';
|
|
8
|
+
// 1. There is a difference between privileged (provider)
|
|
9
|
+
// and non-privileged (consumer) request
|
|
10
|
+
// 2. Source allows to distinguish between provider and consumer
|
|
11
|
+
// but probably it needs to be universalized some way
|
|
12
|
+
// cause potentially wallet can also be consumer
|
|
13
|
+
// (right now consumer will request authentication type)
|
|
14
|
+
// 3. General idea is that: when you are connected, the auth
|
|
15
|
+
// process can be started from scratch following same stages
|
|
16
|
+
// and using the same plugins but via socket
|
|
17
|
+
export const createRelyFlow = (context, conn, auth) => {
|
|
18
|
+
const auhtenticate = conn.authenticate;
|
|
19
|
+
const model = makeAuthModel(context);
|
|
20
|
+
let internalAuth = auth ?? null;
|
|
21
|
+
const linker = async (rely, source, notify) => {
|
|
22
|
+
const tunnel = context.resource(RELY_TUNNEL);
|
|
23
|
+
const closeReceiver = await tunnel.subscribe(async (message) => {
|
|
24
|
+
if (isMessage(message, true)) {
|
|
25
|
+
await conn.send(message);
|
|
26
|
+
}
|
|
27
|
+
else if (isEventMessage(message, true)) {
|
|
28
|
+
if (message.event === 'close') {
|
|
29
|
+
await conn.close();
|
|
30
|
+
closeSender();
|
|
31
|
+
await closeReceiver();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}, source.nonce);
|
|
35
|
+
// We allow to just forward call messages back and forth
|
|
36
|
+
conn._receiveCall = async (msg) => { console.info(source.nonce, 'Forward call', msg.method, msg.id); };
|
|
37
|
+
conn._receiveResult = async (msg) => { console.info(source.nonce, 'Forward result', msg.id); };
|
|
38
|
+
conn._receiveError = async (msg) => { console.info(source.nonce, 'Forward error', msg.id); };
|
|
39
|
+
conn.defaultCallTimeout = RELY_ACTION_TIMEOUT * 1000;
|
|
40
|
+
const closeSender = conn.listen(async (message) => {
|
|
41
|
+
if (isMessage(message, true)) {
|
|
42
|
+
const forward = { ...message };
|
|
43
|
+
if (forward.rawData != null) {
|
|
44
|
+
delete forward.rawData;
|
|
45
|
+
}
|
|
46
|
+
await tunnel.publish(forward, rely.nonce);
|
|
47
|
+
}
|
|
48
|
+
else if (isEventMessage(message, true)) {
|
|
49
|
+
if (message.event === 'close') {
|
|
50
|
+
const forward = { ...message };
|
|
51
|
+
if (forward.rawData != null) {
|
|
52
|
+
delete forward.rawData;
|
|
53
|
+
}
|
|
54
|
+
await tunnel.publish(forward, rely.nonce);
|
|
55
|
+
closeSender();
|
|
56
|
+
await closeReceiver();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
if (notify === true) {
|
|
61
|
+
internalAuth = {
|
|
62
|
+
token: makeEnvelopeModel(RELY_3RD).send(rely).tokenize(),
|
|
63
|
+
isUser: true,
|
|
64
|
+
createdAt: new Date(),
|
|
65
|
+
type: AuthenticationType.RelyHandshake,
|
|
66
|
+
role: AuthRole.User,
|
|
67
|
+
userId: source.nonce,
|
|
68
|
+
scopes: [AUTH_SCOPE]
|
|
69
|
+
};
|
|
70
|
+
await conn.auth(AuthenticationStage.Authenticated, internalAuth);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
conn.authenticate = async (stage, payload) => {
|
|
74
|
+
const [, keyPair] = await trusted(context);
|
|
75
|
+
switch (stage) {
|
|
76
|
+
// This part of flow is entered by both consumer and provider (wallet)
|
|
77
|
+
case AuthenticationStage.Init:
|
|
78
|
+
const _payload = payload;
|
|
79
|
+
if (auth != null) {
|
|
80
|
+
_payload.auth = auth;
|
|
81
|
+
}
|
|
82
|
+
else if (_payload.auth != null) {
|
|
83
|
+
delete _payload.auth;
|
|
84
|
+
}
|
|
85
|
+
_payload.provideRely = linker;
|
|
86
|
+
_payload.conn = conn;
|
|
87
|
+
try {
|
|
88
|
+
return [stage, await model.init(_payload)];
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
console.error(e);
|
|
92
|
+
await conn.close();
|
|
93
|
+
}
|
|
94
|
+
break;
|
|
95
|
+
// This part of flow is entered by that actor who enters peer's key (token or pin)
|
|
96
|
+
case AuthenticationStage.Authenticate:
|
|
97
|
+
try {
|
|
98
|
+
const cred = payload;
|
|
99
|
+
const authenticated = await model.authenticate(cred);
|
|
100
|
+
const envelope = makeEnvelopeModel(authenticated.token, EnvelopeKind.Token);
|
|
101
|
+
if (!await envelope.verify(keyPair)) {
|
|
102
|
+
throw new AuthPluginError('internal-rely');
|
|
103
|
+
}
|
|
104
|
+
if (envelope.type() !== AuthenticationType.RelyHandshake) {
|
|
105
|
+
throw new AuthPluginError('internal-rely');
|
|
106
|
+
}
|
|
107
|
+
internalAuth = envelope.message();
|
|
108
|
+
const token = makeEnvelopeModel(internalAuth.token, EnvelopeKind.Token).message();
|
|
109
|
+
await linker(token.rely, token.source);
|
|
110
|
+
return [AuthenticationStage.Authenticated, internalAuth];
|
|
111
|
+
}
|
|
112
|
+
catch (e) {
|
|
113
|
+
console.error(e);
|
|
114
|
+
await conn.close();
|
|
115
|
+
}
|
|
116
|
+
break;
|
|
117
|
+
// Support intermediate stage for visual confirmation
|
|
118
|
+
case AuthenticationStage.Authenticated:
|
|
119
|
+
return [stage, internalAuth];
|
|
120
|
+
default:
|
|
121
|
+
return auhtenticate(stage, payload);
|
|
122
|
+
}
|
|
123
|
+
return [stage, null];
|
|
124
|
+
};
|
|
125
|
+
return conn.authenticate;
|
|
126
|
+
};
|
|
127
|
+
//# sourceMappingURL=flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../../../src/manager/rely/flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/manager/rely/index.ts"],"names":[],"mappings":"AACA,cAAc,WAAW,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/manager/rely/index.ts"],"names":[],"mappings":"AACA,cAAc,WAAW,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rely.d.ts","sourceRoot":"","sources":["../../src/manager/rely.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,WAAW,EAAE,MAAM,YAAY,CAAA;AAczD,eAAO,MAAM,iBAAiB,WAAW,MAAM,KAAkB,WAyEhE,CAAA"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { assertContext, createService } from '@owlmeans/context';
|
|
2
|
+
import { DEFAULT_RELY } from './consts.js';
|
|
3
|
+
import { AUTH_QUERY, AuthenFailed, AuthenticationType } from '@owlmeans/auth';
|
|
4
|
+
import { EnvelopeKind, makeEnvelopeModel } from '@owlmeans/basic-envelope';
|
|
5
|
+
import { AUTH_CACHE, AUTHEN_TIMEFRAME } from '../consts.js';
|
|
6
|
+
import { trusted } from './utils/trusted.js';
|
|
7
|
+
export const createRelyService = (alias = DEFAULT_RELY) => {
|
|
8
|
+
const _keyPair = async (context) => {
|
|
9
|
+
const [, keyPair] = await trusted(context);
|
|
10
|
+
return keyPair;
|
|
11
|
+
};
|
|
12
|
+
const service = createService(alias, {
|
|
13
|
+
match: async (req) => {
|
|
14
|
+
const authorization = req.query[AUTH_QUERY] != null
|
|
15
|
+
? `${req.query[AUTH_QUERY]}` : null;
|
|
16
|
+
if (authorization == null) {
|
|
17
|
+
// This is optional Guard. So it can not match only on provided authorization
|
|
18
|
+
// that is not valid. In other cases it's passed and need to be handled
|
|
19
|
+
// to provide or null authentication object.
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
const token = makeEnvelopeModel(authorization, EnvelopeKind.Token);
|
|
23
|
+
const auth = token.message();
|
|
24
|
+
return auth.type === AuthenticationType.OneTimeToken;
|
|
25
|
+
},
|
|
26
|
+
handle: async (req, res) => {
|
|
27
|
+
const context = assertContext(service.ctx);
|
|
28
|
+
const authorization = req.query[AUTH_QUERY];
|
|
29
|
+
// We authorize in cases when there is no authorization or it's valid one
|
|
30
|
+
if (authorization == null) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
// @TODO it's likely something is wrong with AbstractRequest types - so it should be fixed there
|
|
34
|
+
if (typeof authorization !== 'string') {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
const envelope = makeEnvelopeModel(authorization, EnvelopeKind.Token);
|
|
38
|
+
if (!await envelope.verify(await _keyPair(context))) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
const msg = envelope.message();
|
|
42
|
+
if (msg.source !== AuthenticationType.WalletDid) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
const cache = (context) => context.resource(AUTH_CACHE);
|
|
47
|
+
await cache(context).create({ id: msg.challenge }, { ttl: (envelope.envelope.ttl ?? AUTHEN_TIMEFRAME) / 1000 });
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
const error = new AuthenFailed('challenge');
|
|
51
|
+
if (e instanceof Error) {
|
|
52
|
+
error.oiriginalStack = `${e} : ${e.stack}`;
|
|
53
|
+
}
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
// @TODO Actually there is some mess. We know that it aint Auth but AuthCredentials
|
|
57
|
+
res.resolve(msg);
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
}, service => async () => { service.initialized = true; });
|
|
61
|
+
return service;
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=rely.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rely.js","sourceRoot":"","sources":["../../src/manager/rely.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { AllowanceRequest, AllowanceResponse, Auth, AuthCredentials, AuthToken, RelyToken } from '@owlmeans/auth';
|
|
2
|
+
import type { KlusterConfig } from '@owlmeans/kluster';
|
|
3
|
+
import type { GuardService } from '@owlmeans/module';
|
|
4
|
+
import type { ApiServerAppend } from '@owlmeans/server-api';
|
|
5
|
+
import type { ServerContext, ServerConfig } from '@owlmeans/server-context';
|
|
6
|
+
import type { ServiceRoute } from '@owlmeans/server-route';
|
|
7
|
+
import type { Connection } from '@owlmeans/socket';
|
|
8
|
+
import type { StaticResourceAppend } from '@owlmeans/static-resource';
|
|
9
|
+
export interface AppConfig extends ServerConfig, KlusterConfig {
|
|
10
|
+
services: Record<string, ServiceRoute>;
|
|
11
|
+
}
|
|
12
|
+
export interface AuthModel {
|
|
13
|
+
init: (request: AllowanceRequest) => Promise<AllowanceResponse>;
|
|
14
|
+
authenticate: (credential: AuthCredentials) => Promise<AuthToken>;
|
|
15
|
+
rely: (conn: Connection, source?: Auth | null) => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export interface AppContext<C extends AppConfig = AppConfig> extends ServerContext<C>, ApiServerAppend, StaticResourceAppend {
|
|
18
|
+
}
|
|
19
|
+
export interface RelyService extends GuardService {
|
|
20
|
+
}
|
|
21
|
+
export interface RelyAllowanceRequest extends AllowanceRequest {
|
|
22
|
+
auth?: Auth;
|
|
23
|
+
provideRely?: RelyLinker;
|
|
24
|
+
conn?: Connection;
|
|
25
|
+
}
|
|
26
|
+
export interface RelyLinker {
|
|
27
|
+
(rely: RelyToken, source: RelyToken, notify?: boolean): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
export interface RelyCarrier {
|
|
30
|
+
source: RelyToken;
|
|
31
|
+
rely: RelyToken;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/manager/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AACtH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAErE,MAAM,WAAW,SAAU,SAAQ,YAAY,EAAE,aAAa;IAC5D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;CACvC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAE/D,YAAY,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,OAAO,CAAC,SAAS,CAAC,CAAA;IAEjE,IAAI,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAChE;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC,EACjF,eAAe,EACf,oBAAoB;CAAI;AAE5B,MAAM,WAAW,WAAY,SAAQ,YAAY;CAChD;AAED,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC5D,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,WAAW,CAAC,EAAE,UAAU,CAAA;IACxB,IAAI,CAAC,EAAE,UAAU,CAAA;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACtE;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,SAAS,CAAA;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/manager/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/manager/utils/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/manager/utils/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { KeyPairModel } from '@owlmeans/basic-keys';
|
|
2
|
+
import type { AppContext } from '../types.js';
|
|
3
|
+
import type { TrustedRecord } from '@owlmeans/auth-common';
|
|
4
|
+
export declare const trusted: (context: AppContext, userName?: string) => Promise<[TrustedRecord, KeyPairModel]>;
|
|
5
|
+
//# sourceMappingURL=trusted.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trusted.d.ts","sourceRoot":"","sources":["../../../src/manager/utils/trusted.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,aAAa,CAAA;AAGxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAG1D,eAAO,MAAM,OAAO,YAAmB,UAAU,aAAY,MAAM,KAAkB,OAAO,CAAC,CAAC,aAAa,EAAE,YAAY,CAAC,CAQzH,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TRUSTED } from '@owlmeans/config';
|
|
2
|
+
import { AUTH_SRV_KEY } from '../../consts.js';
|
|
3
|
+
import { trust } from '@owlmeans/auth-common/utils';
|
|
4
|
+
export const trusted = async (context, userName = AUTH_SRV_KEY) => {
|
|
5
|
+
const trusted = await trust(context, TRUSTED, userName);
|
|
6
|
+
if (trusted.user.secret == null) {
|
|
7
|
+
throw new SyntaxError(`Auth srvice trusted users should have secret keys to be used ${userName}`);
|
|
8
|
+
}
|
|
9
|
+
return [trusted.user, trusted.key];
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=trusted.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trusted.js","sourceRoot":"","sources":["../../../src/manager/utils/trusted.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAA;AAEnD,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,OAAmB,EAAE,WAAmB,YAAY,EAA0C,EAAE;IAC5H,MAAM,OAAO,GAAG,MAAM,KAAK,CAAwB,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;IAE9E,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,WAAW,CAAC,gEAAgE,QAAQ,EAAE,CAAC,CAAA;IACnG,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;AACpC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/model/index.ts"],"names":[],"mappings":"AACA,cAAc,iBAAiB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/model/index.ts"],"names":[],"mappings":"AACA,cAAc,iBAAiB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consumer.d.ts","sourceRoot":"","sources":["../../../src/model/rely/consumer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,eAAO,MAAM,gBAAgB,UAAW,WAAW,yFAOlD,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consumer.js","sourceRoot":"","sources":["../../../src/model/rely/consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAGzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAkB,EAAE,EAAE;IACrD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,CAAA;IAC3B,OAAO,GAAG,CAAC,GAAG,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAEf,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/model/rely/index.ts"],"names":[],"mappings":"AACA,mBAAmB,YAAY,CAAA;AAC/B,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/model/rely/index.ts"],"names":[],"mappings":"AAEA,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { RelyToken } from '@owlmeans/auth';
|
|
2
|
+
import type { EnvelopeModel } from '@owlmeans/basic-envelope';
|
|
3
|
+
import type { RelyOptions } from './types.js';
|
|
4
|
+
export declare const makeRelyModel: (opts?: RelyOptions) => EnvelopeModel<RelyToken>;
|
|
5
|
+
//# sourceMappingURL=peer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer.d.ts","sourceRoot":"","sources":["../../../src/model/rely/peer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAI7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAG7C,eAAO,MAAM,aAAa,UAAW,WAAW,KAAG,aAAa,CAAC,SAAS,CAyBzE,CAAA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { RELY_3RD } from '@owlmeans/auth';
|
|
2
|
+
import { makeEnvelopeModel } from '@owlmeans/basic-envelope';
|
|
3
|
+
import { createRandomPrefix, createIdOfLength, IdStyle } from '@owlmeans/basic-ids';
|
|
4
|
+
import { base58 } from '@scure/base';
|
|
5
|
+
import { RELY_CALL_TIMEOUT } from '@owlmeans/auth-common';
|
|
6
|
+
export const makeRelyModel = (opts) => {
|
|
7
|
+
const envelope = makeEnvelopeModel(RELY_3RD);
|
|
8
|
+
const pinLength = opts?.pinLength ?? 6;
|
|
9
|
+
const checkLength = opts?.checkLenght ?? 2;
|
|
10
|
+
const tokenLength = opts?.tokenLength ?? 16;
|
|
11
|
+
const nonceLength = opts?.nonceLength ?? 24;
|
|
12
|
+
const pinQty = Math.ceil(pinLength / 2);
|
|
13
|
+
const checkQty = Math.ceil(checkLength / 2);
|
|
14
|
+
const tokenQty = tokenLength;
|
|
15
|
+
const source = createRandomPrefix(pinQty + checkQty + tokenQty);
|
|
16
|
+
const bytes = base58.decode(source);
|
|
17
|
+
const pinBytes = bytes.slice(0, pinQty);
|
|
18
|
+
const checkBytes = bytes.slice(pinQty, pinQty + checkQty);
|
|
19
|
+
const tokenBytes = bytes.slice(pinQty + checkQty);
|
|
20
|
+
const pin = toNumber(pinBytes).substring(0, pinLength);
|
|
21
|
+
envelope.send({
|
|
22
|
+
pin,
|
|
23
|
+
check: toNumber(checkBytes).substring(0, checkLength),
|
|
24
|
+
token: base58.encode(tokenBytes).substring(0, tokenLength),
|
|
25
|
+
nonce: createIdOfLength(nonceLength, IdStyle.Base64)
|
|
26
|
+
}, opts?.liveTime ?? RELY_CALL_TIMEOUT * 1000);
|
|
27
|
+
return envelope;
|
|
28
|
+
};
|
|
29
|
+
const toNumber = (bytes) => {
|
|
30
|
+
let pinInt = 0n;
|
|
31
|
+
for (let i = bytes.length - 1; i >= 0; i--) {
|
|
32
|
+
pinInt = (pinInt << 8n) | BigInt(bytes[i]);
|
|
33
|
+
}
|
|
34
|
+
return pinInt.toString();
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=peer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer.js","sourceRoot":"","sources":["../../../src/model/rely/peer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AACnF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAEzD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAkB,EAA4B,EAAE;IAC5E,MAAM,QAAQ,GAAG,iBAAiB,CAAY,QAAQ,CAAC,CAAA;IAEvD,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,CAAC,CAAA;IACtC,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,IAAI,CAAC,CAAA;IAC1C,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,IAAI,EAAE,CAAA;IAC3C,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,IAAI,EAAE,CAAA;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAA;IAC3C,MAAM,QAAQ,GAAG,WAAW,CAAA;IAC5B,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAA;IAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IACvC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAA;IACzD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAA;IAEjD,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;IACtD,QAAQ,CAAC,IAAI,CAAC;QACZ,GAAG;QACH,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC;QACrD,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC;QAC1D,KAAK,EAAE,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC;KACrD,EAAE,IAAI,EAAE,QAAQ,IAAI,iBAAiB,GAAG,IAAI,CAAC,CAAA;IAE9C,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,KAAiB,EAAU,EAAE;IAC7C,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAA;AAC1B,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/model/rely/provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,eAAO,MAAM,gBAAgB,UAAW,WAAW,yFAIlD,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/model/rely/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAGzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAkB,EAAE,EAAE;IACrD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IAEjC,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/model/rely/types.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/model/rely/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modules.d.ts","sourceRoot":"","sources":["../src/modules.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAO3D,eAAO,MAAM,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,EAK1C,CAAA"}
|
package/build/modules.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { elevate } from '@owlmeans/server-module';
|
|
2
|
+
import { modules as list } from '@owlmeans/auth-common';
|
|
3
|
+
import { DISPATCHER, DISPATCHER_AUTHEN } from '@owlmeans/auth';
|
|
4
|
+
import { authenticate } from './actions/service.js';
|
|
5
|
+
import { stab, elevate as celevate } from '@owlmeans/client-module';
|
|
6
|
+
elevate(list, DISPATCHER_AUTHEN, authenticate);
|
|
7
|
+
celevate(list, DISPATCHER, stab);
|
|
8
|
+
export const modules = [
|
|
9
|
+
...list.filter((module) => [DISPATCHER, DISPATCHER_AUTHEN].includes(module.getAlias()))
|
|
10
|
+
];
|
|
11
|
+
//# sourceMappingURL=modules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modules.js","sourceRoot":"","sources":["../src/modules.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AACjD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAE9D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAEnE,OAAO,CAAC,IAAI,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAA;AAC9C,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;AAEhC,MAAM,CAAC,MAAM,OAAO,GAA4B;IAC9C,GAAG,IAAI,CAAC,MAAM,CACZ,CAAC,MAAM,EAAmC,EAAE,CAC1C,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAC9D;CACF,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ServerContext, ServerConfig } from '@owlmeans/server-context';
|
|
2
|
+
import type { AuthServiceAppend, AuthService } from './types.js';
|
|
3
|
+
type Config = ServerConfig;
|
|
4
|
+
export declare const makeAuthService: (alias?: string) => AuthService;
|
|
5
|
+
export declare const appendAuthService: <C extends Config, T extends ServerContext<C>>(ctx: T, alias?: string) => T & AuthServiceAppend;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAG3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAa,MAAM,YAAY,CAAA;AAU3E,KAAK,MAAM,GAAG,YAAY,CAAA;AAG1B,eAAO,MAAM,eAAe,WAAW,MAAM,KAAmB,WA4F/D,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,aAAa,CAAC,CAAC,CAAC,OACvE,CAAC,UAAS,MAAM,KACpB,CAAC,GAAG,iBAaN,CAAA"}
|