@gaballahtech/seba 0.3.0 → 0.5.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/ARCHITECTURE.md +4 -2
- package/CHANGELOG.md +130 -0
- package/MIGRATION.md +60 -0
- package/README.md +174 -8
- package/SECURITY.md +1 -1
- package/assets/seba-icon-favicon.png +0 -0
- package/assets/seba-icon-solid.png +0 -0
- package/assets/seba-logo-inverse.png +0 -0
- package/assets/seba-logo-monochrome.png +0 -0
- package/assets/seba-logo-primary.png +0 -0
- package/dist/assets/icons.d.ts +32 -0
- package/dist/assets/icons.d.ts.map +1 -0
- package/dist/assets/icons.js +30 -0
- package/dist/assets/icons.js.map +1 -0
- package/dist/assets/png-data.d.ts +8 -0
- package/dist/assets/png-data.d.ts.map +1 -0
- package/dist/assets/png-data.js +13 -0
- package/dist/assets/png-data.js.map +1 -0
- package/dist/browser/platform.d.ts +6 -0
- package/dist/browser/platform.d.ts.map +1 -1
- package/dist/browser/platform.js +17 -0
- package/dist/browser/platform.js.map +1 -1
- package/dist/browser/storage.d.ts +3 -2
- package/dist/browser/storage.d.ts.map +1 -1
- package/dist/browser/storage.js +26 -14
- package/dist/browser/storage.js.map +1 -1
- package/dist/cli.d.ts +61 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +223 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/client.d.ts +18 -8
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +130 -6
- package/dist/core/client.js.map +1 -1
- package/dist/core/errors.d.ts +10 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +7 -2
- package/dist/core/errors.js.map +1 -1
- package/dist/core/events.d.ts +27 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +45 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/http.d.ts.map +1 -1
- package/dist/core/http.js +6 -1
- package/dist/core/http.js.map +1 -1
- package/dist/core/oidc.d.ts +17 -0
- package/dist/core/oidc.d.ts.map +1 -1
- package/dist/core/oidc.js +61 -27
- package/dist/core/oidc.js.map +1 -1
- package/dist/core/session.d.ts +10 -3
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +131 -20
- package/dist/core/session.js.map +1 -1
- package/dist/element.d.ts +43 -0
- package/dist/element.d.ts.map +1 -0
- package/dist/element.js +416 -0
- package/dist/element.js.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/pod.d.ts +50 -0
- package/dist/pod.d.ts.map +1 -0
- package/dist/pod.js +264 -0
- package/dist/pod.js.map +1 -0
- package/dist/react/index.d.ts +52 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +87 -0
- package/dist/react/index.js.map +1 -0
- package/dist/seba.d.ts +40 -1
- package/dist/seba.d.ts.map +1 -1
- package/dist/seba.js +90 -2
- package/dist/seba.js.map +1 -1
- package/dist/types.d.ts +110 -6
- package/dist/types.d.ts.map +1 -1
- package/package.json +27 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/browser/platform.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,oCAAoC,EAAE,MAAM,cAAc,CAAC;AAE5F,8DAA8D;AAC9D,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;AAE7G,uFAAuF;AACvF,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAElC;;;;GAIG;AACH,MAAM,UAAU,qBAAqB;IACnC,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;QACrE,MAAM,IAAI,eAAe,CACvB,+HAA+H,CAChI,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,SAAS;QACf,cAAc,EAAE,WAAW;QAC3B,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC;QACrD,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC/C,WAAW,EAAE,oCAAoC,EAAE;QACnD,cAAc,EAAE,GAAG,EAAE,CAAC,cAAc,EAAE;QACtC,aAAa,CAAC,IAAiB;YAC7B,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,OAAO,oBAAoB,EAAE,CAAC;YAChC,CAAC;YACD,OAAO,sBAAsB,EAAE,CAAC;QAClC,CAAC;QACD,KAAK,CAAC,qBAAqB,CAAC,OAAgC;YAC1D,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YACpC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAEjD,OAAO,IAAI,OAAO,CAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;gBAC3C,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACxE,sDAAsD;oBACtD,OAAO;gBACT,CAAC;gBACD,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;oBACrB,MAAM,CACJ,IAAI,eAAe,CACjB,yDAAyD;wBACvD,iGAAiG,CACpG,CACF,CAAC;gBACJ,CAAC,EAAE,mBAAmB,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC;QACD,aAAa;YACX,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC1C,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;gBACnC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC;YACD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,YAAY,CACzB,EAAE,EACF,QAAQ,CAAC,KAAK,EACd,GAAG,GAAG,CAAC,QAAQ,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,CAC/D,CAAC;QACJ,CAAC;KACiB,CAAC;AACvB,CAAC"}
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/browser/platform.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,11 +22,12 @@ export declare const PENDING_AUTH_TTL_MS: number;
|
|
|
22
22
|
*
|
|
23
23
|
* Only {@link PersistedSession} is written; access tokens never reach this code.
|
|
24
24
|
*/
|
|
25
|
-
export declare function createIndexedDbStorage(): SessionStorageAdapter;
|
|
25
|
+
export declare function createIndexedDbStorage(account?: string): SessionStorageAdapter;
|
|
26
26
|
/**
|
|
27
27
|
* Create the `sessionStorage`-backed authorization transaction store.
|
|
28
28
|
*
|
|
29
29
|
* Expired transactions are discarded on read instead of being resumed.
|
|
30
|
+
* A per-account namespace keeps parallel multi-account logins isolated.
|
|
30
31
|
*/
|
|
31
|
-
export declare function createSessionStoragePendingAuthStore(): PendingAuthorizationStore;
|
|
32
|
+
export declare function createSessionStoragePendingAuthStore(account?: string): PendingAuthorizationStore;
|
|
32
33
|
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/browser/storage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAEV,yBAAyB,EAEzB,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAErB,+BAA+B;AAC/B,eAAO,MAAM,OAAO,SAAS,CAAC;AAE9B,uDAAuD;AACvD,eAAO,MAAM,UAAU,YAAY,CAAC;AAEpC,wCAAwC;AACxC,eAAO,MAAM,WAAW,YAAY,CAAC;AAErC,sEAAsE;AACtE,eAAO,MAAM,gBAAgB,+BAA+B,CAAC;AAE7D,gEAAgE;AAChE,eAAO,MAAM,mBAAmB,QAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/browser/storage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAEV,yBAAyB,EAEzB,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAErB,+BAA+B;AAC/B,eAAO,MAAM,OAAO,SAAS,CAAC;AAE9B,uDAAuD;AACvD,eAAO,MAAM,UAAU,YAAY,CAAC;AAEpC,wCAAwC;AACxC,eAAO,MAAM,WAAW,YAAY,CAAC;AAErC,sEAAsE;AACtE,eAAO,MAAM,gBAAgB,+BAA+B,CAAC;AAE7D,gEAAgE;AAChE,eAAO,MAAM,mBAAmB,QAAiB,CAAC;AAmClD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,qBAAqB,CAgB9E;AAED;;;;;GAKG;AACH,wBAAgB,oCAAoC,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,yBAAyB,CAoChG"}
|
package/dist/browser/storage.js
CHANGED
|
@@ -18,18 +18,28 @@ export const SESSION_KEY = "current";
|
|
|
18
18
|
export const PENDING_AUTH_KEY = "seba.pending-authorization";
|
|
19
19
|
/** Maximum age of an authorization transaction (10 minutes). */
|
|
20
20
|
export const PENDING_AUTH_TTL_MS = 10 * 60 * 1000;
|
|
21
|
-
|
|
22
|
-
function
|
|
21
|
+
const databases = new Map();
|
|
22
|
+
function accountKey(account) {
|
|
23
|
+
const name = account === undefined ? DB_NAME : `${DB_NAME}:${account}`;
|
|
24
|
+
return name;
|
|
25
|
+
}
|
|
26
|
+
function open(account) {
|
|
23
27
|
if (typeof indexedDB === "undefined") {
|
|
24
28
|
throw new SebaConfigError("IndexedDB is not available in this environment. Use storage: \"memory\" or run in a browser.");
|
|
25
29
|
}
|
|
26
|
-
|
|
30
|
+
const key = accountKey(account);
|
|
31
|
+
const existing = databases.get(key);
|
|
32
|
+
if (existing !== undefined) {
|
|
33
|
+
return existing;
|
|
34
|
+
}
|
|
35
|
+
const database = openDB(key, 1, {
|
|
27
36
|
upgrade(db) {
|
|
28
37
|
if (!db.objectStoreNames.contains(STORE_NAME)) {
|
|
29
38
|
db.createObjectStore(STORE_NAME);
|
|
30
39
|
}
|
|
31
40
|
},
|
|
32
41
|
});
|
|
42
|
+
databases.set(key, database);
|
|
33
43
|
return database;
|
|
34
44
|
}
|
|
35
45
|
/**
|
|
@@ -37,19 +47,19 @@ function open() {
|
|
|
37
47
|
*
|
|
38
48
|
* Only {@link PersistedSession} is written; access tokens never reach this code.
|
|
39
49
|
*/
|
|
40
|
-
export function createIndexedDbStorage() {
|
|
50
|
+
export function createIndexedDbStorage(account) {
|
|
41
51
|
return {
|
|
42
52
|
async save(session) {
|
|
43
|
-
const db = await open();
|
|
53
|
+
const db = await open(account);
|
|
44
54
|
await db.put(STORE_NAME, structuredClone(session), SESSION_KEY);
|
|
45
55
|
},
|
|
46
56
|
async load() {
|
|
47
|
-
const db = await open();
|
|
57
|
+
const db = await open(account);
|
|
48
58
|
const value = await db.get(STORE_NAME, SESSION_KEY);
|
|
49
59
|
return value ?? null;
|
|
50
60
|
},
|
|
51
61
|
async clear() {
|
|
52
|
-
const db = await open();
|
|
62
|
+
const db = await open(account);
|
|
53
63
|
await db.delete(STORE_NAME, SESSION_KEY);
|
|
54
64
|
},
|
|
55
65
|
};
|
|
@@ -58,16 +68,18 @@ export function createIndexedDbStorage() {
|
|
|
58
68
|
* Create the `sessionStorage`-backed authorization transaction store.
|
|
59
69
|
*
|
|
60
70
|
* Expired transactions are discarded on read instead of being resumed.
|
|
71
|
+
* A per-account namespace keeps parallel multi-account logins isolated.
|
|
61
72
|
*/
|
|
62
|
-
export function createSessionStoragePendingAuthStore() {
|
|
73
|
+
export function createSessionStoragePendingAuthStore(account) {
|
|
74
|
+
const key = account === undefined ? PENDING_AUTH_KEY : `${PENDING_AUTH_KEY}:${account}`;
|
|
63
75
|
return {
|
|
64
76
|
async save(pending) {
|
|
65
77
|
const storage = sessionStorageOrThrow();
|
|
66
|
-
storage.setItem(
|
|
78
|
+
storage.setItem(key, JSON.stringify(pending));
|
|
67
79
|
},
|
|
68
80
|
async load() {
|
|
69
81
|
const storage = sessionStorageOrThrow();
|
|
70
|
-
const raw = storage.getItem(
|
|
82
|
+
const raw = storage.getItem(key);
|
|
71
83
|
if (raw === null) {
|
|
72
84
|
return null;
|
|
73
85
|
}
|
|
@@ -76,21 +88,21 @@ export function createSessionStoragePendingAuthStore() {
|
|
|
76
88
|
parsed = JSON.parse(raw);
|
|
77
89
|
}
|
|
78
90
|
catch {
|
|
79
|
-
storage.removeItem(
|
|
91
|
+
storage.removeItem(key);
|
|
80
92
|
return null;
|
|
81
93
|
}
|
|
82
94
|
if (!isPendingAuthorization(parsed)) {
|
|
83
|
-
storage.removeItem(
|
|
95
|
+
storage.removeItem(key);
|
|
84
96
|
return null;
|
|
85
97
|
}
|
|
86
98
|
if (Date.now() - parsed.createdAt > PENDING_AUTH_TTL_MS) {
|
|
87
|
-
storage.removeItem(
|
|
99
|
+
storage.removeItem(key);
|
|
88
100
|
throw new SebaAuthError("The pending login expired after 10 minutes. Start the login again from the application.");
|
|
89
101
|
}
|
|
90
102
|
return parsed;
|
|
91
103
|
},
|
|
92
104
|
async clear() {
|
|
93
|
-
sessionStorageOrThrow().removeItem(
|
|
105
|
+
sessionStorageOrThrow().removeItem(key);
|
|
94
106
|
},
|
|
95
107
|
};
|
|
96
108
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/browser/storage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAoC,MAAM,KAAK,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAQnE,+BAA+B;AAC/B,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC;AAE9B,uDAAuD;AACvD,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC;AAEpC,wCAAwC;AACxC,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC;AAErC,sEAAsE;AACtE,MAAM,CAAC,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;AAE7D,gEAAgE;AAChE,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAMlD,IAAI,
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/browser/storage.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* `seba` command line.
|
|
4
|
+
*
|
|
5
|
+
* Today it has one job: print (or write) a Solid-OIDC Client ID Document that the
|
|
6
|
+
* provider can dereference, so setting up an application does not require copying
|
|
7
|
+
* JSON-LD from the specification by hand.
|
|
8
|
+
*/
|
|
9
|
+
/** A generated Client ID Document (OIDC client registration metadata). */
|
|
10
|
+
export interface ClientIdDocument {
|
|
11
|
+
"@context": [string];
|
|
12
|
+
client_id: string;
|
|
13
|
+
client_name?: string;
|
|
14
|
+
redirect_uris: string[];
|
|
15
|
+
client_uri?: string;
|
|
16
|
+
logo_uri?: string;
|
|
17
|
+
scope: string;
|
|
18
|
+
grant_types: string[];
|
|
19
|
+
response_types: string[];
|
|
20
|
+
}
|
|
21
|
+
/** Input accepted by {@link buildClientIdDocument}. */
|
|
22
|
+
export interface ClientIdInput {
|
|
23
|
+
/** Public URL the document will be served from; also the OAuth `client_id`. */
|
|
24
|
+
clientId: string;
|
|
25
|
+
/** One or more exact callback URLs. */
|
|
26
|
+
redirectUris: string[];
|
|
27
|
+
/** Human readable application name shown on the consent screen. */
|
|
28
|
+
clientName?: string;
|
|
29
|
+
/** Homepage of the application. */
|
|
30
|
+
clientUri?: string;
|
|
31
|
+
/** Absolute URL of the application logo. */
|
|
32
|
+
logoUri?: string;
|
|
33
|
+
/** Requested scopes. Defaults to `openid webid offline_access`. */
|
|
34
|
+
scope?: string;
|
|
35
|
+
}
|
|
36
|
+
/** Raised for unusable command line input. */
|
|
37
|
+
export declare class ClientIdInputError extends Error {
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Build the JSON-LD Client ID Document for an application.
|
|
41
|
+
*
|
|
42
|
+
* @throws {@link ClientIdInputError} for unusable URLs or an empty redirect list.
|
|
43
|
+
*/
|
|
44
|
+
export declare function buildClientIdDocument(input: ClientIdInput): ClientIdDocument;
|
|
45
|
+
/** Parsed command line. */
|
|
46
|
+
export type CliCommand = {
|
|
47
|
+
kind: "help";
|
|
48
|
+
} | {
|
|
49
|
+
kind: "client-id";
|
|
50
|
+
input: ClientIdInput;
|
|
51
|
+
out: string | null;
|
|
52
|
+
};
|
|
53
|
+
/** Parse process arguments (without `node` and the script path). */
|
|
54
|
+
export declare function parseCliArgs(argv: readonly string[]): CliCommand;
|
|
55
|
+
/** Run the CLI and return the process exit code. */
|
|
56
|
+
export declare function runCli(argv: readonly string[], io: {
|
|
57
|
+
stdout: (text: string) => void;
|
|
58
|
+
stderr: (text: string) => void;
|
|
59
|
+
writeFile?: (path: string, contents: string) => Promise<void>;
|
|
60
|
+
}): Promise<number>;
|
|
61
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAOH,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,uDAAuD;AACvD,MAAM,WAAW,aAAa;IAC5B,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,8CAA8C;AAC9C,qBAAa,kBAAmB,SAAQ,KAAK;CAAG;AA2ChD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,GAAG,gBAAgB,CAwB5E;AAED,2BAA2B;AAC3B,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAEpE,oEAAoE;AACpE,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CAqEhE;AAED,oDAAoD;AACpD,wBAAsB,MAAM,CAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,EAAE;IACF,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D,GACA,OAAO,CAAC,MAAM,CAAC,CA2CjB"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* `seba` command line.
|
|
4
|
+
*
|
|
5
|
+
* Today it has one job: print (or write) a Solid-OIDC Client ID Document that the
|
|
6
|
+
* provider can dereference, so setting up an application does not require copying
|
|
7
|
+
* JSON-LD from the specification by hand.
|
|
8
|
+
*/
|
|
9
|
+
import { realpathSync } from "node:fs";
|
|
10
|
+
import { fileURLToPath } from "node:url";
|
|
11
|
+
const CONTEXT = "https://www.w3.org/ns/solid/oidc-context.jsonld";
|
|
12
|
+
/** Raised for unusable command line input. */
|
|
13
|
+
export class ClientIdInputError extends Error {
|
|
14
|
+
}
|
|
15
|
+
const USAGE = `SEBA — Solid-OIDC client helper
|
|
16
|
+
|
|
17
|
+
Usage:
|
|
18
|
+
seba client-id --client-id <url> --redirect-uri <url> [options]
|
|
19
|
+
|
|
20
|
+
Options:
|
|
21
|
+
--client-id <url> Public URL the document is served from (required).
|
|
22
|
+
--redirect-uri <url> Exact callback URL; repeat for more than one (required).
|
|
23
|
+
--client-name <name> Name shown on the provider consent screen.
|
|
24
|
+
--client-uri <url> Application homepage.
|
|
25
|
+
--logo-uri <url> Absolute URL of the application logo.
|
|
26
|
+
--scope <scopes> Defaults to "openid webid offline_access".
|
|
27
|
+
--out <file> Write the document to a file instead of stdout.
|
|
28
|
+
-h, --help Show this help.
|
|
29
|
+
|
|
30
|
+
The document must be served as application/ld+json at --client-id, and every
|
|
31
|
+
--redirect-uri must appear in it verbatim.
|
|
32
|
+
`;
|
|
33
|
+
function isLoopbackHost(hostname) {
|
|
34
|
+
return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "[::1]";
|
|
35
|
+
}
|
|
36
|
+
function requireAbsoluteUrl(value, label, allowFragment = true) {
|
|
37
|
+
let url;
|
|
38
|
+
try {
|
|
39
|
+
url = new URL(value);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
throw new ClientIdInputError(`${label} must be an absolute URL (got "${value}").`);
|
|
43
|
+
}
|
|
44
|
+
if (url.protocol !== "https:" && !(url.protocol === "http:" && isLoopbackHost(url.hostname))) {
|
|
45
|
+
throw new ClientIdInputError(`${label} must use https (plain http is allowed only for localhost/loopback development).`);
|
|
46
|
+
}
|
|
47
|
+
if (!allowFragment && url.hash !== "") {
|
|
48
|
+
throw new ClientIdInputError(`${label} must not contain a fragment ("#...").`);
|
|
49
|
+
}
|
|
50
|
+
return url;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Build the JSON-LD Client ID Document for an application.
|
|
54
|
+
*
|
|
55
|
+
* @throws {@link ClientIdInputError} for unusable URLs or an empty redirect list.
|
|
56
|
+
*/
|
|
57
|
+
export function buildClientIdDocument(input) {
|
|
58
|
+
const clientId = requireAbsoluteUrl(input.clientId, "--client-id").href;
|
|
59
|
+
const redirectUris = input.redirectUris.map((uri) => requireAbsoluteUrl(uri, "--redirect-uri", false).href);
|
|
60
|
+
if (redirectUris.length === 0) {
|
|
61
|
+
throw new ClientIdInputError("At least one --redirect-uri is required.");
|
|
62
|
+
}
|
|
63
|
+
const document = {
|
|
64
|
+
"@context": [CONTEXT],
|
|
65
|
+
client_id: clientId,
|
|
66
|
+
...(input.clientName === undefined ? {} : { client_name: input.clientName }),
|
|
67
|
+
redirect_uris: redirectUris,
|
|
68
|
+
...(input.clientUri === undefined
|
|
69
|
+
? {}
|
|
70
|
+
: { client_uri: requireAbsoluteUrl(input.clientUri, "--client-uri").href }),
|
|
71
|
+
...(input.logoUri === undefined
|
|
72
|
+
? {}
|
|
73
|
+
: { logo_uri: requireAbsoluteUrl(input.logoUri, "--logo-uri").href }),
|
|
74
|
+
scope: input.scope ?? "openid webid offline_access",
|
|
75
|
+
grant_types: ["authorization_code", "refresh_token"],
|
|
76
|
+
response_types: ["code"],
|
|
77
|
+
};
|
|
78
|
+
return document;
|
|
79
|
+
}
|
|
80
|
+
/** Parse process arguments (without `node` and the script path). */
|
|
81
|
+
export function parseCliArgs(argv) {
|
|
82
|
+
const [command, ...rest] = argv;
|
|
83
|
+
if (command === undefined || command === "-h" || command === "--help" || command === "help") {
|
|
84
|
+
return { kind: "help" };
|
|
85
|
+
}
|
|
86
|
+
if (command !== "client-id") {
|
|
87
|
+
throw new ClientIdInputError(`Unknown command "${command}". Try: seba client-id --help`);
|
|
88
|
+
}
|
|
89
|
+
let clientId;
|
|
90
|
+
let clientName;
|
|
91
|
+
let clientUri;
|
|
92
|
+
let logoUri;
|
|
93
|
+
let scope;
|
|
94
|
+
let out = null;
|
|
95
|
+
const redirectUris = [];
|
|
96
|
+
for (let index = 0; index < rest.length; index += 1) {
|
|
97
|
+
const flag = rest[index];
|
|
98
|
+
if (flag === "-h" || flag === "--help") {
|
|
99
|
+
return { kind: "help" };
|
|
100
|
+
}
|
|
101
|
+
const value = rest[index + 1];
|
|
102
|
+
if (value === undefined || value.startsWith("--")) {
|
|
103
|
+
throw new ClientIdInputError(`Missing value for "${String(flag)}".`);
|
|
104
|
+
}
|
|
105
|
+
index += 1;
|
|
106
|
+
switch (flag) {
|
|
107
|
+
case "--client-id":
|
|
108
|
+
clientId = value;
|
|
109
|
+
break;
|
|
110
|
+
case "--redirect-uri":
|
|
111
|
+
redirectUris.push(value);
|
|
112
|
+
break;
|
|
113
|
+
case "--client-name":
|
|
114
|
+
clientName = value;
|
|
115
|
+
break;
|
|
116
|
+
case "--client-uri":
|
|
117
|
+
clientUri = value;
|
|
118
|
+
break;
|
|
119
|
+
case "--logo-uri":
|
|
120
|
+
logoUri = value;
|
|
121
|
+
break;
|
|
122
|
+
case "--scope":
|
|
123
|
+
scope = value;
|
|
124
|
+
break;
|
|
125
|
+
case "--out":
|
|
126
|
+
out = value;
|
|
127
|
+
break;
|
|
128
|
+
default:
|
|
129
|
+
throw new ClientIdInputError(`Unknown option "${String(flag)}". Try: seba client-id --help`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (clientId === undefined) {
|
|
133
|
+
throw new ClientIdInputError("--client-id is required.");
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
kind: "client-id",
|
|
137
|
+
input: {
|
|
138
|
+
clientId,
|
|
139
|
+
redirectUris,
|
|
140
|
+
...(clientName === undefined ? {} : { clientName }),
|
|
141
|
+
...(clientUri === undefined ? {} : { clientUri }),
|
|
142
|
+
...(logoUri === undefined ? {} : { logoUri }),
|
|
143
|
+
...(scope === undefined ? {} : { scope }),
|
|
144
|
+
},
|
|
145
|
+
out,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/** Run the CLI and return the process exit code. */
|
|
149
|
+
export async function runCli(argv, io) {
|
|
150
|
+
let command;
|
|
151
|
+
try {
|
|
152
|
+
command = parseCliArgs(argv);
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
io.stderr(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
156
|
+
return 1;
|
|
157
|
+
}
|
|
158
|
+
if (command.kind === "help") {
|
|
159
|
+
io.stdout(USAGE);
|
|
160
|
+
return 0;
|
|
161
|
+
}
|
|
162
|
+
let document;
|
|
163
|
+
try {
|
|
164
|
+
document = buildClientIdDocument(command.input);
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
io.stderr(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
168
|
+
return 1;
|
|
169
|
+
}
|
|
170
|
+
const json = `${JSON.stringify(document, null, 2)}\n`;
|
|
171
|
+
if (command.out !== null) {
|
|
172
|
+
if (io.writeFile === undefined) {
|
|
173
|
+
io.stderr("Writing files is not available in this environment.\n");
|
|
174
|
+
return 1;
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
await io.writeFile(command.out, json);
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
io.stderr(`Could not write ${command.out}: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
181
|
+
return 1;
|
|
182
|
+
}
|
|
183
|
+
io.stderr(`Wrote ${command.out}.\n` +
|
|
184
|
+
`Serve it as application/ld+json at ${document.client_id}, and keep ${document.redirect_uris.join(", ")} published verbatim.\n`);
|
|
185
|
+
return 0;
|
|
186
|
+
}
|
|
187
|
+
io.stdout(json);
|
|
188
|
+
io.stderr(`Serve this document as application/ld+json at ${document.client_id}.\n`);
|
|
189
|
+
return 0;
|
|
190
|
+
}
|
|
191
|
+
async function main() {
|
|
192
|
+
const { mkdir, writeFile } = await import("node:fs/promises");
|
|
193
|
+
const { dirname } = await import("node:path");
|
|
194
|
+
const code = await runCli(process.argv.slice(2), {
|
|
195
|
+
stdout: (text) => process.stdout.write(text),
|
|
196
|
+
stderr: (text) => process.stderr.write(text),
|
|
197
|
+
writeFile: async (path, contents) => {
|
|
198
|
+
const directory = dirname(path);
|
|
199
|
+
if (directory !== "." && directory !== "") {
|
|
200
|
+
await mkdir(directory, { recursive: true });
|
|
201
|
+
}
|
|
202
|
+
await writeFile(path, contents, "utf8");
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
process.exitCode = code;
|
|
206
|
+
}
|
|
207
|
+
/** Whether this module is the process entry point (not merely imported). */
|
|
208
|
+
function isEntryPoint() {
|
|
209
|
+
const entry = process.argv[1];
|
|
210
|
+
if (entry === undefined) {
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
return realpathSync(entry) === realpathSync(fileURLToPath(import.meta.url));
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (isEntryPoint()) {
|
|
221
|
+
void main();
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/core/client.d.ts
CHANGED
|
@@ -5,7 +5,13 @@
|
|
|
5
5
|
* class owns the protocol flow and the security decisions that must be identical in
|
|
6
6
|
* every runtime.
|
|
7
7
|
*/
|
|
8
|
-
import type { LoginOptions, Platform, SebaConfig, Session } from "../types.js";
|
|
8
|
+
import type { LoginOptions, Platform, SebaConfig, Session, SessionChangeListener, SessionInfo } from "../types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Decide whether a URL carries an authorization response.
|
|
11
|
+
*
|
|
12
|
+
* Exported through the facade as {@link Seba.isCallbackResponse}.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isAuthorizationResponse(url: URL): boolean;
|
|
9
15
|
/**
|
|
10
16
|
* The protocol engine behind {@link Seba}.
|
|
11
17
|
*
|
|
@@ -14,18 +20,22 @@ import type { LoginOptions, Platform, SebaConfig, Session } from "../types.js";
|
|
|
14
20
|
*/
|
|
15
21
|
export declare class SebaClient {
|
|
16
22
|
#private;
|
|
17
|
-
constructor(config: SebaConfig, platform: Platform
|
|
23
|
+
constructor(config: SebaConfig, platform: Platform, options?: {
|
|
24
|
+
onSessionChange?: SessionChangeListener;
|
|
25
|
+
});
|
|
18
26
|
/** Current session, if any (token-free). */
|
|
19
27
|
get session(): Session | null;
|
|
28
|
+
login(options?: LoginOptions): Promise<Session>;
|
|
20
29
|
/**
|
|
21
|
-
*
|
|
30
|
+
* Complete a login from the current URL without any fallback to starting a new one.
|
|
31
|
+
* Intended for the explicit application pattern "call login() on the click that
|
|
32
|
+
* starts the flow, call completeLogin() on the callback route".
|
|
22
33
|
*
|
|
23
|
-
*
|
|
24
|
-
* validated and the code is exchanged. Otherwise a new authorization request is
|
|
25
|
-
* started: the returned promise resolves after the redirect in Node.js and never
|
|
26
|
-
* settles in the browser (the page navigates away).
|
|
34
|
+
* @throws SebaAuthError when the current URL carries no authorization response.
|
|
27
35
|
*/
|
|
28
|
-
|
|
36
|
+
completeLoginFromCurrentUrl(): Promise<Session>;
|
|
37
|
+
/** Token-free session details (WebID, provider, access-token expiry), or `null`. */
|
|
38
|
+
sessionInfo(): SessionInfo | null;
|
|
29
39
|
/**
|
|
30
40
|
* Restore a previous session from storage.
|
|
31
41
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAuBH,OAAO,KAAK,EAAwB,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAe,MAAM,aAAa,CAAC;AAStJ;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAIzD;AA8BD;;;;;GAKG;AACH,qBAAa,UAAU;;gBAMT,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAE;QAAE,eAAe,CAAC,EAAE,qBAAqB,CAAA;KAAO;IAsB7G,4CAA4C;IAC5C,IAAI,OAAO,IAAI,OAAO,GAAG,IAAI,CAE5B;IAkDK,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAYzD;;;;;;OAMG;IACG,2BAA2B,IAAI,OAAO,CAAC,OAAO,CAAC;IAoBrD,oFAAoF;IACpF,WAAW,IAAI,WAAW,GAAG,IAAI;IAYjC;;;;;OAKG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAI/C;;;;;;;;OAQG;IACG,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IA6E5E,kFAAkF;IAC5E,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAgL9B"}
|