@indecisivedev/openplan 0.2.0-alpha.2
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 +120 -0
- package/dist/access-policy.d.ts +35 -0
- package/dist/access-policy.js +107 -0
- package/dist/access-policy.js.map +1 -0
- package/dist/access-store.d.ts +33 -0
- package/dist/access-store.js +212 -0
- package/dist/access-store.js.map +1 -0
- package/dist/admin.d.ts +1 -0
- package/dist/admin.js +13 -0
- package/dist/admin.js.map +1 -0
- package/dist/api.d.ts +2 -0
- package/dist/api.js +867 -0
- package/dist/api.js.map +1 -0
- package/dist/bootstrap-admin.d.ts +1 -0
- package/dist/bootstrap-admin.js +35 -0
- package/dist/bootstrap-admin.js.map +1 -0
- package/dist/browser-security.d.ts +5 -0
- package/dist/browser-security.js +53 -0
- package/dist/browser-security.js.map +1 -0
- package/dist/celld-quickstart.d.ts +51 -0
- package/dist/celld-quickstart.js +1175 -0
- package/dist/celld-quickstart.js.map +1 -0
- package/dist/cli-api-client.d.ts +78 -0
- package/dist/cli-api-client.js +272 -0
- package/dist/cli-api-client.js.map +1 -0
- package/dist/cli-credentials.d.ts +47 -0
- package/dist/cli-credentials.js +447 -0
- package/dist/cli-credentials.js.map +1 -0
- package/dist/cli-endpoint.d.ts +19 -0
- package/dist/cli-endpoint.js +56 -0
- package/dist/cli-endpoint.js.map +1 -0
- package/dist/cli-program.d.ts +11 -0
- package/dist/cli-program.js +934 -0
- package/dist/cli-program.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -0
- package/dist/client-ip.d.ts +4 -0
- package/dist/client-ip.js +49 -0
- package/dist/client-ip.js.map +1 -0
- package/dist/config.d.ts +35 -0
- package/dist/config.js +113 -0
- package/dist/config.js.map +1 -0
- package/dist/crypto.d.ts +3 -0
- package/dist/crypto.js +11 -0
- package/dist/crypto.js.map +1 -0
- package/dist/database.d.ts +15 -0
- package/dist/database.js +155 -0
- package/dist/database.js.map +1 -0
- package/dist/db.d.ts +31 -0
- package/dist/db.js +388 -0
- package/dist/db.js.map +1 -0
- package/dist/drafts.d.ts +43 -0
- package/dist/drafts.js +90 -0
- package/dist/drafts.js.map +1 -0
- package/dist/feature-settings.d.ts +7 -0
- package/dist/feature-settings.js +32 -0
- package/dist/feature-settings.js.map +1 -0
- package/dist/generated/annotation-client.d.ts +1 -0
- package/dist/generated/annotation-client.js +2 -0
- package/dist/generated/annotation-client.js.map +1 -0
- package/dist/html-policy.d.ts +15 -0
- package/dist/html-policy.js +172 -0
- package/dist/html-policy.js.map +1 -0
- package/dist/ids.d.ts +2 -0
- package/dist/ids.js +10 -0
- package/dist/ids.js.map +1 -0
- package/dist/local-auth.d.ts +36 -0
- package/dist/local-auth.js +215 -0
- package/dist/local-auth.js.map +1 -0
- package/dist/maintenance.d.ts +1 -0
- package/dist/maintenance.js +18 -0
- package/dist/maintenance.js.map +1 -0
- package/dist/oidc.d.ts +39 -0
- package/dist/oidc.js +194 -0
- package/dist/oidc.js.map +1 -0
- package/dist/public-url.d.ts +17 -0
- package/dist/public-url.js +96 -0
- package/dist/public-url.js.map +1 -0
- package/dist/rate-limit.d.ts +25 -0
- package/dist/rate-limit.js +55 -0
- package/dist/rate-limit.js.map +1 -0
- package/dist/reconcile.d.ts +5 -0
- package/dist/reconcile.js +18 -0
- package/dist/reconcile.js.map +1 -0
- package/dist/render-annotations.d.ts +10 -0
- package/dist/render-annotations.js +73 -0
- package/dist/render-annotations.js.map +1 -0
- package/dist/render-web.d.ts +74 -0
- package/dist/render-web.js +439 -0
- package/dist/render-web.js.map +1 -0
- package/dist/render.d.ts +4 -0
- package/dist/render.js +85 -0
- package/dist/render.js.map +1 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.js +26 -0
- package/dist/server.js.map +1 -0
- package/dist/shoo.d.ts +26 -0
- package/dist/shoo.js +92 -0
- package/dist/shoo.js.map +1 -0
- package/dist/sqlite-migrations.d.ts +6 -0
- package/dist/sqlite-migrations.js +214 -0
- package/dist/sqlite-migrations.js.map +1 -0
- package/dist/storage.d.ts +14 -0
- package/dist/storage.js +86 -0
- package/dist/storage.js.map +1 -0
- package/dist/types.d.ts +24 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/upload-state.d.ts +19 -0
- package/dist/upload-state.js +118 -0
- package/dist/upload-state.js.map +1 -0
- package/dist/web-auth.d.ts +33 -0
- package/dist/web-auth.js +122 -0
- package/dist/web-auth.js.map +1 -0
- package/dist/web.d.ts +2 -0
- package/dist/web.js +550 -0
- package/dist/web.js.map +1 -0
- package/package.json +70 -0
package/dist/web-auth.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
2
|
+
import { config } from "./config.js";
|
|
3
|
+
export const SESSION_COOKIE = "openplan_session";
|
|
4
|
+
export const AUTH_STATE_COOKIE = "openplan_auth_state";
|
|
5
|
+
const SESSION_TTL_SECONDS = 30 * 24 * 60 * 60;
|
|
6
|
+
const AUTH_STATE_TTL_SECONDS = 10 * 60;
|
|
7
|
+
export function signToken(payload, secret, ttlSeconds) {
|
|
8
|
+
const body = Buffer.from(JSON.stringify({ ...payload, exp: nowSeconds() + ttlSeconds })).toString("base64url");
|
|
9
|
+
return `${body}.${hmac(body, secret)}`;
|
|
10
|
+
}
|
|
11
|
+
export function verifyToken(token, secret) {
|
|
12
|
+
if (typeof token !== "string" || !token.includes("."))
|
|
13
|
+
return null;
|
|
14
|
+
const separator = token.indexOf(".");
|
|
15
|
+
const body = token.slice(0, separator);
|
|
16
|
+
const signature = token.slice(separator + 1);
|
|
17
|
+
const expected = hmac(body, secret);
|
|
18
|
+
const a = Buffer.from(signature || "");
|
|
19
|
+
const b = Buffer.from(expected);
|
|
20
|
+
if (a.length !== b.length || !timingSafeEqual(a, b))
|
|
21
|
+
return null;
|
|
22
|
+
try {
|
|
23
|
+
const payload = JSON.parse(Buffer.from(body, "base64url").toString("utf8"));
|
|
24
|
+
if (!payload || typeof payload !== "object")
|
|
25
|
+
return null;
|
|
26
|
+
const candidate = payload;
|
|
27
|
+
if (typeof candidate.exp !== "number" || !Number.isFinite(candidate.exp) || candidate.exp < nowSeconds())
|
|
28
|
+
return null;
|
|
29
|
+
return candidate;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function createSessionCookie({ accountId, accountName, email, pictureUrl, authProvider, oidcBinding, sessionVersion }) {
|
|
36
|
+
const token = signToken({
|
|
37
|
+
accountId,
|
|
38
|
+
accountName,
|
|
39
|
+
email: email ?? null,
|
|
40
|
+
pictureUrl: pictureUrl ?? null,
|
|
41
|
+
authProvider: authProvider || "shoo",
|
|
42
|
+
...(oidcBinding === undefined ? {} : { oidcBinding }),
|
|
43
|
+
...(sessionVersion === undefined ? {} : { sessionVersion })
|
|
44
|
+
}, requireSecret(), SESSION_TTL_SECONDS);
|
|
45
|
+
return serializeCookie(SESSION_COOKIE, token, { maxAge: SESSION_TTL_SECONDS });
|
|
46
|
+
}
|
|
47
|
+
export function clearSessionCookie() {
|
|
48
|
+
return serializeCookie(SESSION_COOKIE, "", { maxAge: 0 });
|
|
49
|
+
}
|
|
50
|
+
export function createAuthStateCookie(payload) {
|
|
51
|
+
const token = signToken(payload, requireSecret(), AUTH_STATE_TTL_SECONDS);
|
|
52
|
+
return serializeCookie(AUTH_STATE_COOKIE, token, { maxAge: AUTH_STATE_TTL_SECONDS });
|
|
53
|
+
}
|
|
54
|
+
export function clearAuthStateCookie() {
|
|
55
|
+
return serializeCookie(AUTH_STATE_COOKIE, "", { maxAge: 0 });
|
|
56
|
+
}
|
|
57
|
+
export function readSession(req) {
|
|
58
|
+
if (!config.sessionSecret)
|
|
59
|
+
return null;
|
|
60
|
+
const token = readCookie(req, SESSION_COOKIE);
|
|
61
|
+
if (!token)
|
|
62
|
+
return null;
|
|
63
|
+
const payload = verifyToken(token, config.sessionSecret);
|
|
64
|
+
return typeof payload?.accountId === "string" ? payload : null;
|
|
65
|
+
}
|
|
66
|
+
export function readAuthState(req) {
|
|
67
|
+
if (!config.sessionSecret)
|
|
68
|
+
return null;
|
|
69
|
+
const token = readCookie(req, AUTH_STATE_COOKIE);
|
|
70
|
+
const payload = token ? verifyToken(token, config.sessionSecret) : null;
|
|
71
|
+
if (!payload ||
|
|
72
|
+
typeof payload.state !== "string" ||
|
|
73
|
+
typeof payload.verifier !== "string" ||
|
|
74
|
+
typeof payload.next !== "string") {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
return payload;
|
|
78
|
+
}
|
|
79
|
+
export function readCookie(req, name) {
|
|
80
|
+
const header = req.get("cookie") || "";
|
|
81
|
+
for (const part of header.split(";")) {
|
|
82
|
+
const eq = part.indexOf("=");
|
|
83
|
+
if (eq === -1)
|
|
84
|
+
continue;
|
|
85
|
+
if (part.slice(0, eq).trim() === name) {
|
|
86
|
+
// A malformed value (bad percent-escape) must read as "no cookie", not
|
|
87
|
+
// throw — otherwise one bad cookie 500s every web page until cleared.
|
|
88
|
+
try {
|
|
89
|
+
return decodeURIComponent(part.slice(eq + 1).trim());
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
function serializeCookie(name, value, { maxAge }) {
|
|
99
|
+
const attributes = [
|
|
100
|
+
`${name}=${encodeURIComponent(value)}`,
|
|
101
|
+
"Path=/",
|
|
102
|
+
"HttpOnly",
|
|
103
|
+
"SameSite=Lax",
|
|
104
|
+
`Max-Age=${maxAge}`
|
|
105
|
+
];
|
|
106
|
+
if (process.env.NODE_ENV !== "development")
|
|
107
|
+
attributes.push("Secure");
|
|
108
|
+
return attributes.join("; ");
|
|
109
|
+
}
|
|
110
|
+
function hmac(value, secret) {
|
|
111
|
+
return createHmac("sha256", secret).update(value).digest("base64url");
|
|
112
|
+
}
|
|
113
|
+
function requireSecret() {
|
|
114
|
+
if (!config.sessionSecret) {
|
|
115
|
+
throw new Error("OPENPLAN_SESSION_SECRET is not configured.");
|
|
116
|
+
}
|
|
117
|
+
return config.sessionSecret;
|
|
118
|
+
}
|
|
119
|
+
function nowSeconds() {
|
|
120
|
+
return Math.floor(Date.now() / 1000);
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=web-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-auth.js","sourceRoot":"","sources":["../src/web-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,MAAM,CAAC,MAAM,cAAc,GAAG,kBAAkB,CAAC;AACjD,MAAM,CAAC,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;AACvD,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAC9C,MAAM,sBAAsB,GAAG,EAAE,GAAG,EAAE,CAAC;AAevC,MAAM,UAAU,SAAS,CACvB,OAAgC,EAChC,MAAc,EACd,UAAkB;IAElB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CACtB,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAAC,CAC/D,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACxB,OAAO,GAAG,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc,EAAE,MAAc;IACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACnE,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjE,IAAI,CAAC;QACH,MAAM,OAAO,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACzD,MAAM,SAAS,GAAG,OAAkC,CAAC;QACrD,IAAI,OAAO,SAAS,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,GAAG,GAAG,UAAU,EAAE;YAAE,OAAO,IAAI,CAAC;QACtH,OAAO,SAA0B,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAClC,SAAS,EACT,WAAW,EACX,KAAK,EACL,UAAU,EACV,YAAY,EACZ,WAAW,EACX,cAAc,EASf;IACC,MAAM,KAAK,GAAG,SAAS,CACrB;QACE,SAAS;QACT,WAAW;QACX,KAAK,EAAE,KAAK,IAAI,IAAI;QACpB,UAAU,EAAE,UAAU,IAAI,IAAI;QAC9B,YAAY,EAAE,YAAY,IAAI,MAAM;QACpC,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QACrD,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC;KAC5D,EACD,aAAa,EAAE,EACf,mBAAmB,CACpB,CAAC;IACF,OAAO,eAAe,CAAC,cAAc,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,eAAe,CAAC,cAAc,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAsC;IAC1E,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,sBAAsB,CAAC,CAAC;IAC1E,OAAO,eAAe,CAAC,iBAAiB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,eAAe,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,IAAI,CAAC,MAAM,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IACzD,OAAO,OAAO,OAAO,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAE,OAA0B,CAAC,CAAC,CAAC,IAAI,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,IAAI,CAAC,MAAM,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxE,IACE,CAAC,OAAO;QACR,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ;QACjC,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;QACpC,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAChC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,OAA2B,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAY,EAAE,IAAY;IACnD,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,SAAS;QACxB,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YACtC,uEAAuE;YACvE,sEAAsE;YACtE,IAAI,CAAC;gBACH,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACvD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE,MAAM,EAAsB;IAClF,MAAM,UAAU,GAAG;QACjB,GAAG,IAAI,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;QACtC,QAAQ;QACR,UAAU;QACV,cAAc;QACd,WAAW,MAAM,EAAE;KACpB,CAAC;IACF,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa;QAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtE,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,IAAI,CAAC,KAAa,EAAE,MAAc;IACzC,OAAO,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,aAAa;IACpB,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,MAAM,CAAC,aAAa,CAAC;AAC9B,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;AACvC,CAAC"}
|
package/dist/web.d.ts
ADDED