admindb 1.2.0 → 2.0.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/README.md +250 -352
- package/dist/app.d.ts +25 -4
- package/dist/app.js +79 -15
- package/dist/app.js.map +1 -1
- package/dist/auth/config.d.ts +19 -0
- package/dist/auth/config.js +147 -0
- package/dist/auth/config.js.map +1 -0
- package/dist/auth/crypto.d.ts +27 -0
- package/dist/auth/crypto.js +133 -0
- package/dist/auth/crypto.js.map +1 -0
- package/dist/auth/index.d.ts +5 -0
- package/dist/auth/index.js +22 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware.d.ts +14 -0
- package/dist/auth/middleware.js +100 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/routes.d.ts +7 -0
- package/dist/auth/routes.js +78 -0
- package/dist/auth/routes.js.map +1 -0
- package/dist/auth/types.d.ts +35 -0
- package/dist/auth/types.js +11 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/cli/args.d.ts +45 -0
- package/dist/cli/args.js +328 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/config.d.ts +56 -0
- package/dist/cli/config.js +133 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.js +21 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/runner.d.ts +1 -0
- package/dist/cli/runner.js +222 -0
- package/dist/cli/runner.js.map +1 -0
- package/dist/cli.js +2 -127
- package/dist/cli.js.map +1 -1
- package/dist/data/datasets.d.ts +17 -0
- package/dist/data/datasets.js +133 -0
- package/dist/data/datasets.js.map +1 -0
- package/dist/data/detector.d.ts +30 -0
- package/dist/data/detector.js +472 -0
- package/dist/data/detector.js.map +1 -0
- package/dist/data/engine.d.ts +10 -0
- package/dist/data/engine.js +211 -0
- package/dist/data/engine.js.map +1 -0
- package/dist/data/index.d.ts +5 -0
- package/dist/data/index.js +22 -0
- package/dist/data/index.js.map +1 -0
- package/dist/data/strategies.d.ts +30 -0
- package/dist/data/strategies.js +343 -0
- package/dist/data/strategies.js.map +1 -0
- package/dist/data/types.d.ts +73 -0
- package/dist/data/types.js +8 -0
- package/dist/data/types.js.map +1 -0
- package/dist/db/database.d.ts +14 -142
- package/dist/db/database.js +209 -435
- package/dist/db/database.js.map +1 -1
- package/dist/db/export.d.ts +2 -2
- package/dist/db/export.js +7 -2
- package/dist/db/export.js.map +1 -1
- package/dist/db/filters.d.ts +22 -0
- package/dist/db/filters.js +158 -0
- package/dist/db/filters.js.map +1 -0
- package/dist/db/index.d.ts +8 -0
- package/dist/db/index.js +25 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/introspection.d.ts +6 -0
- package/dist/db/introspection.js +172 -0
- package/dist/db/introspection.js.map +1 -0
- package/dist/db/manager.d.ts +32 -19
- package/dist/db/manager.js +203 -44
- package/dist/db/manager.js.map +1 -1
- package/dist/db/migrations.d.ts +5 -0
- package/dist/db/migrations.js +110 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/db/postgres.d.ts +85 -0
- package/dist/db/postgres.js +745 -0
- package/dist/db/postgres.js.map +1 -0
- package/dist/db/types.d.ts +206 -0
- package/dist/db/types.js +7 -0
- package/dist/db/types.js.map +1 -0
- package/dist/index.d.ts +9 -2
- package/dist/index.js +46 -4
- package/dist/index.js.map +1 -1
- package/dist/public/css/app.css +1 -1
- package/dist/public/css/input.css +83 -13
- package/dist/public/js/app.js +142 -0
- package/dist/public/js/browse.js +591 -104
- package/dist/public/js/databases.js +105 -13
- package/dist/public/js/designer.js +40 -2
- package/dist/public/js/forms.js +610 -28
- package/dist/public/js/icons.js +51 -0
- package/dist/public/js/inspector.js +638 -0
- package/dist/public/js/query.js +93 -3
- package/dist/public/js/schema.js +170 -52
- package/dist/public/js/seed.js +1090 -0
- package/dist/routes/api/helpers.d.ts +42 -0
- package/dist/routes/api/helpers.js +133 -0
- package/dist/routes/api/helpers.js.map +1 -0
- package/dist/routes/api/import-export.d.ts +3 -0
- package/dist/routes/api/import-export.js +85 -0
- package/dist/routes/api/import-export.js.map +1 -0
- package/dist/routes/api/index.d.ts +4 -0
- package/dist/routes/api/index.js +37 -0
- package/dist/routes/api/index.js.map +1 -0
- package/dist/routes/api/query.d.ts +3 -0
- package/dist/routes/api/query.js +76 -0
- package/dist/routes/api/query.js.map +1 -0
- package/dist/routes/api/rows.d.ts +3 -0
- package/dist/routes/api/rows.js +373 -0
- package/dist/routes/api/rows.js.map +1 -0
- package/dist/routes/api/seed.d.ts +3 -0
- package/dist/routes/api/seed.js +82 -0
- package/dist/routes/api/seed.js.map +1 -0
- package/dist/routes/api/tables.d.ts +3 -0
- package/dist/routes/api/tables.js +160 -0
- package/dist/routes/api/tables.js.map +1 -0
- package/dist/routes/databases.d.ts +8 -11
- package/dist/routes/databases.js +100 -66
- package/dist/routes/databases.js.map +1 -1
- package/dist/routes/index.d.ts +3 -0
- package/dist/routes/index.js +20 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/pages.d.ts +3 -3
- package/dist/routes/pages.js +163 -54
- package/dist/routes/pages.js.map +1 -1
- package/dist/serverless.d.ts +40 -0
- package/dist/serverless.js +210 -0
- package/dist/serverless.js.map +1 -0
- package/dist/sql/generator.d.ts +4 -3
- package/dist/sql/generator.js +103 -6
- package/dist/sql/generator.js.map +1 -1
- package/dist/sql/index.d.ts +2 -0
- package/dist/sql/index.js +19 -0
- package/dist/sql/index.js.map +1 -0
- package/dist/types/api.d.ts +412 -0
- package/dist/types/api.js +9 -0
- package/dist/types/api.js.map +1 -0
- package/dist/utils/colors.d.ts +40 -0
- package/dist/utils/colors.js +64 -0
- package/dist/utils/colors.js.map +1 -0
- package/dist/{util.d.ts → utils/common.d.ts} +10 -6
- package/dist/{util.js → utils/common.js} +80 -13
- package/dist/utils/common.js.map +1 -0
- package/dist/utils/csv.js.map +1 -0
- package/dist/utils/datatype.d.ts +49 -0
- package/dist/utils/datatype.js +222 -0
- package/dist/utils/datatype.js.map +1 -0
- package/dist/utils/icons.d.ts +11 -0
- package/dist/utils/icons.js +72 -0
- package/dist/utils/icons.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +21 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/{logger.d.ts → utils/logger.d.ts} +1 -1
- package/dist/utils/logger.js +40 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/views/layouts/main.hbs +33 -11
- package/dist/views/pages/databases.hbs +182 -74
- package/dist/views/pages/designer.hbs +9 -6
- package/dist/views/pages/error.hbs +3 -3
- package/dist/views/pages/form.hbs +5 -3
- package/dist/views/pages/home.hbs +22 -13
- package/dist/views/pages/login.hbs +111 -0
- package/dist/views/pages/query.hbs +10 -8
- package/dist/views/pages/schema.hbs +41 -13
- package/dist/views/pages/seed.hbs +232 -0
- package/dist/views/pages/table.hbs +155 -70
- package/dist/views/partials/icon.hbs +2 -0
- package/dist/views/partials/navbar.hbs +70 -31
- package/dist/views/partials/sidebar.hbs +108 -99
- package/package.json +12 -5
- package/dist/args.d.ts +0 -28
- package/dist/args.js +0 -187
- package/dist/args.js.map +0 -1
- package/dist/config.d.ts +0 -17
- package/dist/config.js +0 -23
- package/dist/config.js.map +0 -1
- package/dist/csv.js.map +0 -1
- package/dist/logger.js +0 -25
- package/dist/logger.js.map +0 -1
- package/dist/routes/api.d.ts +0 -9
- package/dist/routes/api.js +0 -786
- package/dist/routes/api.js.map +0 -1
- package/dist/test/classifier.test.d.ts +0 -1
- package/dist/test/classifier.test.js +0 -44
- package/dist/test/classifier.test.js.map +0 -1
- package/dist/test/csv.test.d.ts +0 -1
- package/dist/test/csv.test.js +0 -64
- package/dist/test/csv.test.js.map +0 -1
- package/dist/test/database.test.d.ts +0 -1
- package/dist/test/database.test.js +0 -402
- package/dist/test/database.test.js.map +0 -1
- package/dist/test/generator.test.d.ts +0 -1
- package/dist/test/generator.test.js +0 -132
- package/dist/test/generator.test.js.map +0 -1
- package/dist/test/manager.test.d.ts +0 -1
- package/dist/test/manager.test.js +0 -146
- package/dist/test/manager.test.js.map +0 -1
- package/dist/util.js.map +0 -1
- /package/dist/{csv.d.ts → utils/csv.d.ts} +0 -0
- /package/dist/{csv.js → utils/csv.js} +0 -0
package/dist/app.d.ts
CHANGED
|
@@ -1,20 +1,41 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
|
-
import {
|
|
2
|
+
import type { IDatabase, PostgresOptions } from './db/types';
|
|
3
3
|
import { DbManager } from './db/manager';
|
|
4
|
-
import { type Logger, type LogLevel } from './logger';
|
|
4
|
+
import { type Logger, type LogLevel } from './utils/logger';
|
|
5
|
+
import { type AuthConfig } from './auth';
|
|
5
6
|
export interface AppOptions {
|
|
6
|
-
/** Path to the SQLite file (single-db mode). Defaults to `admindb.db`. */
|
|
7
|
+
/** Path to the SQLite file (single-db mode) or connection string. Defaults to `admindb.db`. */
|
|
7
8
|
dbPath?: string;
|
|
9
|
+
/** PostgreSQL or database connection string (e.g. `postgresql://user:pass@host:5432/db`). */
|
|
10
|
+
connection?: string;
|
|
11
|
+
/** Explicit PostgreSQL connection options. */
|
|
12
|
+
pgOptions?: PostgresOptions;
|
|
8
13
|
/** URL prefix used by templates/static assets (e.g. `/admin`). Defaults to `''`. */
|
|
9
14
|
basePath?: string;
|
|
10
15
|
logger?: Logger;
|
|
11
16
|
logLevel?: LogLevel;
|
|
12
17
|
/** Provide an existing database instance (single-db embedding). */
|
|
13
|
-
db?:
|
|
18
|
+
db?: IDatabase;
|
|
14
19
|
/** Enable multi-database mode with a manager over a directory of `.db` files. */
|
|
15
20
|
manager?: DbManager;
|
|
16
21
|
/** Open the database read-only — all write routes are rejected with 403. */
|
|
17
22
|
readonly?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Serverless mode flag.
|
|
25
|
+
* When enabled (or auto-detected in Vercel/AWS Lambda/Netlify/etc.),
|
|
26
|
+
* all write operations, mutations, schema alterations, and seeder generators
|
|
27
|
+
* are disabled, enforcing strict read-only safety for ephemeral environments.
|
|
28
|
+
*
|
|
29
|
+
* Defaults to `undefined` (auto-detected via environment).
|
|
30
|
+
*/
|
|
31
|
+
serverless?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Authentication configuration.
|
|
34
|
+
* - `true` (default): authentication enabled with default or env credentials.
|
|
35
|
+
* - `false`: completely disables authentication (no protection / developer's own auth).
|
|
36
|
+
* - `{ username, password, secret, ... }`: custom credentials and options.
|
|
37
|
+
*/
|
|
38
|
+
auth?: boolean | AuthConfig;
|
|
18
39
|
/**
|
|
19
40
|
* Manager mode: show the filesystem file-browser on the databases landing
|
|
20
41
|
* page. Defaults to `true`. Set to `false` to disable browsing (e.g. when the
|
package/dist/app.js
CHANGED
|
@@ -8,12 +8,16 @@ const express_1 = __importDefault(require("express"));
|
|
|
8
8
|
const node_path_1 = __importDefault(require("node:path"));
|
|
9
9
|
const express_handlebars_1 = require("express-handlebars");
|
|
10
10
|
const database_1 = require("./db/database");
|
|
11
|
-
const
|
|
11
|
+
const postgres_1 = require("./db/postgres");
|
|
12
|
+
const logger_1 = require("./utils/logger");
|
|
12
13
|
const pages_1 = require("./routes/pages");
|
|
13
|
-
const
|
|
14
|
+
const index_1 = require("./routes/api/index");
|
|
14
15
|
const databases_1 = require("./routes/databases");
|
|
15
|
-
const args_1 = require("./args");
|
|
16
|
-
const
|
|
16
|
+
const args_1 = require("./cli/args");
|
|
17
|
+
const common_1 = require("./utils/common");
|
|
18
|
+
const icons_1 = require("./utils/icons");
|
|
19
|
+
const serverless_1 = require("./serverless");
|
|
20
|
+
const auth_1 = require("./auth");
|
|
17
21
|
/** Installed package version, exposed to every template as `{{version}}`. */
|
|
18
22
|
const APP_VERSION = (0, args_1.getPackageVersion)();
|
|
19
23
|
/**
|
|
@@ -32,7 +36,7 @@ const APP_VERSION = (0, args_1.getPackageVersion)();
|
|
|
32
36
|
function createRouter(options = {}) {
|
|
33
37
|
return options.manager ? createManagerApp(options) : createSingleDbApp(options);
|
|
34
38
|
}
|
|
35
|
-
function setupViewEngine(app,
|
|
39
|
+
function setupViewEngine(app, _logger) {
|
|
36
40
|
app.engine('hbs', (0, express_handlebars_1.engine)({
|
|
37
41
|
extname: '.hbs',
|
|
38
42
|
defaultLayout: 'main',
|
|
@@ -46,12 +50,16 @@ function setupViewEngine(app, logger) {
|
|
|
46
50
|
const s = v == null ? '' : String(v);
|
|
47
51
|
return s.length > n ? `${s.slice(0, n)}…` : s;
|
|
48
52
|
},
|
|
49
|
-
json: (v) => JSON.stringify(v).replace(/</g, '\\u003c'),
|
|
53
|
+
json: (v) => (JSON.stringify(v ?? null) ?? 'null').replace(/</g, '\\u003c'),
|
|
50
54
|
add: (a, b) => Number(a) + Number(b),
|
|
51
55
|
sub: (a, b) => Number(a) - Number(b),
|
|
52
56
|
gt: (a, b) => Number(a) > Number(b),
|
|
53
57
|
lt: (a, b) => Number(a) < Number(b),
|
|
54
58
|
join: (arr, sep) => (Array.isArray(arr) ? arr.join(String(sep ?? ',')) : String(arr ?? '')),
|
|
59
|
+
icon: (name, options) => {
|
|
60
|
+
const customClass = (options && options.hash && options.hash.class) || undefined;
|
|
61
|
+
return (0, icons_1.renderIcon)(String(name ?? ''), customClass);
|
|
62
|
+
},
|
|
55
63
|
},
|
|
56
64
|
}));
|
|
57
65
|
app.set('view engine', 'hbs');
|
|
@@ -69,23 +77,51 @@ function addErrorHandlers(app, logger) {
|
|
|
69
77
|
app.use((err, req, res, _next) => {
|
|
70
78
|
logger.error('Unhandled error', err);
|
|
71
79
|
if (req.path.startsWith('/api/')) {
|
|
72
|
-
return res.status(500).json({ success: false, error: (0,
|
|
80
|
+
return res.status(500).json({ success: false, error: (0, common_1.errorMessage)(err) });
|
|
73
81
|
}
|
|
74
|
-
res.status(500).render('pages/error', { title: 'Error', status: 500, error: (0,
|
|
82
|
+
res.status(500).render('pages/error', { title: 'Error', status: 500, error: (0, common_1.errorMessage)(err) });
|
|
75
83
|
});
|
|
76
84
|
}
|
|
77
85
|
/** Single-database app (also used as the per-database app in multi-db mode). */
|
|
78
86
|
function createSingleDbApp(options) {
|
|
87
|
+
const isServerless = options.serverless !== undefined ? options.serverless : (0, serverless_1.isServerlessEnvironment)();
|
|
88
|
+
const rawTarget = options.connection || options.dbPath || '';
|
|
89
|
+
const isPg = Boolean(options.pgOptions) ||
|
|
90
|
+
(typeof rawTarget === 'string' && (rawTarget.startsWith('postgres://') || rawTarget.startsWith('postgresql://'))) ||
|
|
91
|
+
options.db?.dialect === 'postgres';
|
|
92
|
+
// In serverless environments, SQLite local files are ephemeral/read-only,
|
|
93
|
+
// whereas PostgreSQL connects to a remote networked database and is fully editable.
|
|
94
|
+
const readonly = options.readonly !== undefined
|
|
95
|
+
? Boolean(options.readonly)
|
|
96
|
+
: (isServerless && !isPg);
|
|
79
97
|
const basePath = (options.basePath ?? '').replace(/\/+$/, '');
|
|
80
98
|
const logger = options.logger ?? (0, logger_1.createLogger)(options.logLevel ?? 'info', 'admindb');
|
|
81
|
-
|
|
99
|
+
let db;
|
|
100
|
+
if (options.db) {
|
|
101
|
+
db = options.db;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
if (isPg) {
|
|
105
|
+
const conn = options.pgOptions || rawTarget;
|
|
106
|
+
db = new postgres_1.PostgresDatabase(conn, logger, { readonly });
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
db = new database_1.SqliteDatabase(options.dbPath ?? 'admindb.db', logger, { readonly });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
82
112
|
const databasesUrl = options.databasesUrl;
|
|
113
|
+
const authConfig = (0, auth_1.resolveAuthConfig)(options.auth);
|
|
83
114
|
const router = (0, express_1.default)();
|
|
84
115
|
router.disable('x-powered-by');
|
|
85
116
|
// Static assets (relative to the mount point, so a prefix "just works").
|
|
86
117
|
router.use(express_1.default.static(node_path_1.default.join(__dirname, 'public')));
|
|
87
118
|
setupViewEngine(router, logger);
|
|
88
119
|
router.use(express_1.default.json({ limit: '10mb' }));
|
|
120
|
+
router.use(express_1.default.urlencoded({ extended: false }));
|
|
121
|
+
// Register authentication endpoints (/login, /logout)
|
|
122
|
+
(0, auth_1.registerAuthRoutes)(router, authConfig, basePath, logger);
|
|
123
|
+
// Authentication gatekeeper middleware
|
|
124
|
+
router.use((0, auth_1.createAuthMiddleware)(authConfig, basePath, logger));
|
|
89
125
|
// Page locals (skipped for API + static paths).
|
|
90
126
|
router.use(async (req, res, next) => {
|
|
91
127
|
try {
|
|
@@ -93,11 +129,18 @@ function createSingleDbApp(options) {
|
|
|
93
129
|
res.locals.currentPath = req.path;
|
|
94
130
|
res.locals.currentTable = null;
|
|
95
131
|
res.locals.dbPath = db.path;
|
|
96
|
-
res.locals.dbId = options.dbId ??
|
|
132
|
+
res.locals.dbId = options.dbId ?? (db.dialect === 'postgres' ? 'PostgreSQL' : (node_path_1.default.basename(db.path) || 'SQLite'));
|
|
133
|
+
res.locals.dialect = db.dialect;
|
|
134
|
+
res.locals.isPostgres = db.dialect === 'postgres';
|
|
135
|
+
res.locals.isSqlite = db.dialect === 'sqlite';
|
|
136
|
+
res.locals.dialectName = db.dialect === 'postgres' ? 'PostgreSQL' : 'SQLite';
|
|
97
137
|
res.locals.databasesUrl = databasesUrl ?? null;
|
|
98
138
|
res.locals.databasesMode = false;
|
|
99
139
|
res.locals.readonly = db.isReadOnly;
|
|
140
|
+
res.locals.serverless = isServerless;
|
|
100
141
|
res.locals.version = APP_VERSION;
|
|
142
|
+
res.locals.authEnabled = authConfig.enabled;
|
|
143
|
+
res.locals.isDefaultPassword = authConfig.isDefaultPassword;
|
|
101
144
|
if (!req.path.startsWith('/api/')) {
|
|
102
145
|
const all = await db.listTables();
|
|
103
146
|
const names = (all.data ?? []).map((t) => t.name);
|
|
@@ -111,21 +154,28 @@ function createSingleDbApp(options) {
|
|
|
111
154
|
}
|
|
112
155
|
});
|
|
113
156
|
(0, pages_1.registerPages)(router, { db, logger });
|
|
114
|
-
(0,
|
|
157
|
+
(0, index_1.registerApi)(router, { db, logger });
|
|
115
158
|
addErrorHandlers(router, logger);
|
|
116
159
|
return router;
|
|
117
160
|
}
|
|
118
161
|
/** Multi-database app: databases landing page + a per-database sub-app per file. */
|
|
119
162
|
function createManagerApp(options) {
|
|
163
|
+
const isServerless = options.serverless !== undefined ? options.serverless : (0, serverless_1.isServerlessEnvironment)();
|
|
164
|
+
const readonly = isServerless || Boolean(options.readonly);
|
|
120
165
|
const manager = options.manager;
|
|
121
166
|
const basePath = (options.basePath ?? '').replace(/\/+$/, '');
|
|
122
167
|
const logger = options.logger ?? (0, logger_1.createLogger)(options.logLevel ?? 'info', 'admindb');
|
|
123
|
-
const
|
|
168
|
+
const authConfig = (0, auth_1.resolveAuthConfig)(options.auth);
|
|
124
169
|
const app = (0, express_1.default)();
|
|
125
170
|
app.disable('x-powered-by');
|
|
126
171
|
app.use(express_1.default.static(node_path_1.default.join(__dirname, 'public')));
|
|
127
172
|
setupViewEngine(app, logger);
|
|
128
173
|
app.use(express_1.default.json({ limit: '10mb' }));
|
|
174
|
+
app.use(express_1.default.urlencoded({ extended: false }));
|
|
175
|
+
// Register authentication endpoints (/login, /logout)
|
|
176
|
+
(0, auth_1.registerAuthRoutes)(app, authConfig, basePath, logger);
|
|
177
|
+
// Authentication gatekeeper middleware
|
|
178
|
+
app.use((0, auth_1.createAuthMiddleware)(authConfig, basePath, logger));
|
|
129
179
|
// Locals for the databases landing page.
|
|
130
180
|
app.use(async (req, res, next) => {
|
|
131
181
|
try {
|
|
@@ -137,7 +187,10 @@ function createManagerApp(options) {
|
|
|
137
187
|
res.locals.databasesUrl = null;
|
|
138
188
|
res.locals.databasesMode = true;
|
|
139
189
|
res.locals.readonly = readonly;
|
|
190
|
+
res.locals.serverless = isServerless;
|
|
140
191
|
res.locals.version = APP_VERSION;
|
|
192
|
+
res.locals.authEnabled = authConfig.enabled;
|
|
193
|
+
res.locals.isDefaultPassword = authConfig.isDefaultPassword;
|
|
141
194
|
if (!req.path.startsWith('/api/')) {
|
|
142
195
|
res.locals.tables = [];
|
|
143
196
|
res.locals.internalTables = [];
|
|
@@ -155,7 +208,7 @@ function createManagerApp(options) {
|
|
|
155
208
|
logger,
|
|
156
209
|
basePath,
|
|
157
210
|
readonly,
|
|
158
|
-
allowBrowse: options.allowBrowse,
|
|
211
|
+
allowBrowse: isServerless ? false : options.allowBrowse,
|
|
159
212
|
browseRoot: options.browseRoot,
|
|
160
213
|
invalidate: (id) => subApps.delete(id),
|
|
161
214
|
});
|
|
@@ -171,17 +224,28 @@ function createManagerApp(options) {
|
|
|
171
224
|
error: `Database "${dbId}" does not exist.`,
|
|
172
225
|
});
|
|
173
226
|
}
|
|
227
|
+
const rawRo = req.query.readonly;
|
|
228
|
+
if (rawRo !== undefined) {
|
|
229
|
+
const explicitRo = rawRo === '1' || rawRo === 'true';
|
|
230
|
+
if (!readonly || explicitRo) {
|
|
231
|
+
manager.setReadonly(dbId, explicitRo);
|
|
232
|
+
subApps.delete(dbId);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
174
235
|
let sub = subApps.get(dbId);
|
|
175
236
|
if (!sub) {
|
|
176
237
|
const subBase = `${basePath ? basePath : ''}/${encodeURIComponent(dbId)}`;
|
|
238
|
+
const effectiveRo = readonly || manager.isDbReadOnly(dbId);
|
|
177
239
|
sub = createSingleDbApp({
|
|
178
|
-
db: manager.open(dbId),
|
|
240
|
+
db: manager.open(dbId, effectiveRo),
|
|
179
241
|
basePath: subBase,
|
|
180
242
|
logger,
|
|
181
243
|
logLevel: options.logLevel,
|
|
182
244
|
dbId,
|
|
183
245
|
databasesUrl: `${basePath ? basePath : ''}/`,
|
|
184
|
-
readonly,
|
|
246
|
+
readonly: effectiveRo,
|
|
247
|
+
serverless: isServerless,
|
|
248
|
+
auth: authConfig,
|
|
185
249
|
});
|
|
186
250
|
subApps.set(dbId, sub);
|
|
187
251
|
}
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":";;;;;AA2FA,oCAEC;AA7FD,sDAA8B;AAC9B,0DAA6B;AAC7B,2DAA4C;AAC5C,4CAA+C;AAC/C,4CAAiD;AAGjD,2CAA0E;AAC1E,0CAA+C;AAC/C,8CAAiD;AACjD,kDAA6D;AAC7D,qCAA+C;AAC/C,2CAA8C;AAC9C,yCAA2C;AAC3C,6CAAuD;AAEvD,iCAKgB;AAEhB,6EAA6E;AAC7E,MAAM,WAAW,GAAG,IAAA,wBAAiB,GAAE,CAAC;AAsDxC;;;;;;;;;;;;GAYG;AACH,SAAgB,YAAY,CAAC,UAAsB,EAAE;IACnD,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,eAAe,CAAC,GAAoB,EAAE,OAAe;IAC5D,GAAG,CAAC,MAAM,CACR,KAAK,EACL,IAAA,2BAAM,EAAC;QACL,OAAO,EAAE,MAAM;QACf,aAAa,EAAE,MAAM;QACrB,UAAU,EAAE,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC;QACpD,WAAW,EAAE,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC;QACtD,OAAO,EAAE;YACP,EAAE,EAAE,CAAC,CAAU,EAAE,CAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC;YACvC,UAAU,EAAE,CAAC,CAAU,EAAE,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACnF,MAAM,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;YACrD,QAAQ,EAAE,CAAC,CAAU,EAAE,CAAS,EAAE,EAAE;gBAClC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACrC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAChD,CAAC;YACD,IAAI,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;YACpF,GAAG,EAAE,CAAC,CAAU,EAAE,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;YACtD,GAAG,EAAE,CAAC,CAAU,EAAE,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;YACtD,EAAE,EAAE,CAAC,CAAU,EAAE,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;YACrD,EAAE,EAAE,CAAC,CAAU,EAAE,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;YACrD,IAAI,EAAE,CAAC,GAAY,EAAE,GAAW,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;YAC5G,IAAI,EAAE,CAAC,IAAa,EAAE,OAAa,EAAE,EAAE;gBACrC,MAAM,WAAW,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC;gBACjF,OAAO,IAAA,kBAAU,EAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;YACrD,CAAC;SACF;KACF,CAAC,CACH,CAAC;IACF,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAC9B,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AAElD,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAoB,EAAE,MAAc;IAC5D,eAAe;IACf,GAAG,CAAC,GAAG,CAAC,CAAC,GAAoB,EAAE,GAAqB,EAAE,EAAE;QACtD,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,wCAAwC,EAAE,CAAC,CAAC;IAC9H,CAAC,CAAC,CAAC;IAEH,yBAAyB;IACzB,GAAG,CAAC,GAAG,CAAC,CAAC,GAAU,EAAE,GAAoB,EAAE,GAAqB,EAAE,KAA2B,EAAE,EAAE;QAC/F,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;QACrC,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAA,qBAAY,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAA,qBAAY,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnG,CAAC,CAAC,CAAC;AACL,CAAC;AAED,gFAAgF;AAChF,SAAS,iBAAiB,CAAC,OAAmB;IAC5C,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAA,oCAAuB,GAAE,CAAC;IACvG,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;IAC7D,MAAM,IAAI,GACR,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;QAC1B,CAAC,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC;QACjH,OAAO,CAAC,EAAE,EAAE,OAAO,KAAK,UAAU,CAAC;IAErC,0EAA0E;IAC1E,oFAAoF;IACpF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,SAAS;QAC7C,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC3B,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5B,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAA,qBAAY,EAAC,OAAO,CAAC,QAAQ,IAAI,MAAM,EAAE,SAAS,CAAC,CAAC;IAErF,IAAI,EAAa,CAAC;IAClB,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;QACf,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,IAAI,SAAS,CAAC;YAC5C,EAAE,GAAG,IAAI,2BAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,EAAE,GAAG,IAAI,yBAAc,CAAC,OAAO,CAAC,MAAM,IAAI,YAAY,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAA,wBAAiB,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnD,MAAM,MAAM,GAAG,IAAA,iBAAO,GAAE,CAAC;IACzB,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAE/B,yEAAyE;IACzE,MAAM,CAAC,GAAG,CAAC,iBAAO,CAAC,MAAM,CAAC,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE3D,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,CAAC,iBAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAEpD,sDAAsD;IACtD,IAAA,yBAAkB,EAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEzD,uCAAuC;IACvC,MAAM,CAAC,GAAG,CAAC,IAAA,2BAAoB,EAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAE/D,gDAAgD;IAChD,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAClC,IAAI,CAAC;YACH,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC/B,GAAG,CAAC,MAAM,CAAC,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC;YAClC,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC;YAC/B,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC;YAC5B,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,mBAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;YACpH,GAAG,CAAC,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;YAChC,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC,OAAO,KAAK,UAAU,CAAC;YAClD,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC,OAAO,KAAK,QAAQ,CAAC;YAC9C,GAAG,CAAC,MAAM,CAAC,WAAW,GAAG,EAAE,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC7E,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,YAAY,IAAI,IAAI,CAAC;YAC/C,GAAG,CAAC,MAAM,CAAC,aAAa,GAAG,KAAK,CAAC;YACjC,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC;YACpC,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC;YACrC,GAAG,CAAC,MAAM,CAAC,OAAO,GAAG,WAAW,CAAC;YACjC,GAAG,CAAC,MAAM,CAAC,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC;YAC5C,GAAG,CAAC,MAAM,CAAC,iBAAiB,GAAG,UAAU,CAAC,iBAAiB,CAAC;YAC5D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,UAAU,EAAE,CAAC;gBAClC,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAClD,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC5D,GAAG,CAAC,MAAM,CAAC,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YACrE,CAAC;YAED,IAAI,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAGH,IAAA,qBAAa,EAAC,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACtC,IAAA,mBAAW,EAAC,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAEpC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,oFAAoF;AACpF,SAAS,gBAAgB,CAAC,OAAmB;IAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAA,oCAAuB,GAAE,CAAC;IACvG,MAAM,QAAQ,GAAG,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAQ,CAAC;IACjC,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAA,qBAAY,EAAC,OAAO,CAAC,QAAQ,IAAI,MAAM,EAAE,SAAS,CAAC,CAAC;IACrF,MAAM,UAAU,GAAG,IAAA,wBAAiB,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnD,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;IACtB,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAE5B,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,MAAM,CAAC,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxD,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAEjD,sDAAsD;IACtD,IAAA,yBAAkB,EAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEtD,uCAAuC;IACvC,GAAG,CAAC,GAAG,CAAC,IAAA,2BAAoB,EAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAE5D,yCAAyC;IACzC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC/B,GAAG,CAAC,MAAM,CAAC,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC;YAClC,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC;YAC/B,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;YACtC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;YACvB,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC;YAC/B,GAAG,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;YAChC,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC/B,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC;YACrC,GAAG,CAAC,MAAM,CAAC,OAAO,GAAG,WAAW,CAAC;YACjC,GAAG,CAAC,MAAM,CAAC,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC;YAC5C,GAAG,CAAC,MAAM,CAAC,iBAAiB,GAAG,UAAU,CAAC,iBAAiB,CAAC;YAC5D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;gBACvB,GAAG,CAAC,MAAM,CAAC,cAAc,GAAG,EAAE,CAAC;YACjC,CAAC;YACD,IAAI,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,iEAAiE;IACjE,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IACnD,IAAA,mCAAuB,EAAC,GAAG,EAAE;QAC3B,OAAO;QACP,MAAM;QACN,QAAQ;QACR,QAAQ;QACR,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW;QACvD,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;KACvC,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAoB,EAAE,GAAqB,EAAE,IAA0B,EAAE,EAAE;QAC5F,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,IAAI,mBAAmB,EAAE,CAAC,CAAC;YAC/F,CAAC;YACD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE;gBAC3C,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,aAAa,IAAI,mBAAmB;aAC5C,CAAC,CAAC;QACL,CAAC;QAED,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QACjC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,UAAU,GAAG,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,MAAM,CAAC;YACrD,IAAI,CAAC,QAAQ,IAAI,UAAU,EAAE,CAAC;gBAC5B,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBACtC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,OAAO,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1E,MAAM,WAAW,GAAG,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAC3D,GAAG,GAAG,iBAAiB,CAAC;gBACtB,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;gBACnC,QAAQ,EAAE,OAAO;gBACjB,MAAM;gBACN,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,IAAI;gBACJ,YAAY,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG;gBAC5C,QAAQ,EAAE,WAAW;gBACrB,UAAU,EAAE,YAAY;gBACxB,IAAI,EAAE,UAAU;aACjB,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAGH,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type AuthConfig, type ResolvedAuthConfig } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Clears the in-memory fallback secret cache (primarily for testing).
|
|
4
|
+
*/
|
|
5
|
+
export declare function resetPersistentSecretCache(): void;
|
|
6
|
+
/**
|
|
7
|
+
* Returns a persistent secret key for signing session cookies.
|
|
8
|
+
*
|
|
9
|
+
* Priority order:
|
|
10
|
+
* 1. `ADMINDB_SECRET` or `SESSION_SECRET` environment variables.
|
|
11
|
+
* 2. `ADMINDB_SECRET_FILE` path if specified in environment.
|
|
12
|
+
* 3. User home directory `.admindb-secret` (or temp directory if home is not writable).
|
|
13
|
+
* 4. In-memory random fallback if filesystem is completely read-only.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getOrCreatePersistentSecret(env?: NodeJS.ProcessEnv): string;
|
|
16
|
+
/**
|
|
17
|
+
* Resolves the authentication options against environment variables.
|
|
18
|
+
*/
|
|
19
|
+
export declare function resolveAuthConfig(optionsAuth?: boolean | AuthConfig, env?: NodeJS.ProcessEnv): ResolvedAuthConfig;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.resetPersistentSecretCache = resetPersistentSecretCache;
|
|
7
|
+
exports.getOrCreatePersistentSecret = getOrCreatePersistentSecret;
|
|
8
|
+
exports.resolveAuthConfig = resolveAuthConfig;
|
|
9
|
+
const node_crypto_1 = require("node:crypto");
|
|
10
|
+
const node_fs_1 = require("node:fs");
|
|
11
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
12
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
13
|
+
const types_1 = require("./types");
|
|
14
|
+
// In-memory cache of resolved secret to avoid repeated disk reads per process
|
|
15
|
+
let cachedFallbackSecret = null;
|
|
16
|
+
/**
|
|
17
|
+
* Clears the in-memory fallback secret cache (primarily for testing).
|
|
18
|
+
*/
|
|
19
|
+
function resetPersistentSecretCache() {
|
|
20
|
+
cachedFallbackSecret = null;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Returns a persistent secret key for signing session cookies.
|
|
24
|
+
*
|
|
25
|
+
* Priority order:
|
|
26
|
+
* 1. `ADMINDB_SECRET` or `SESSION_SECRET` environment variables.
|
|
27
|
+
* 2. `ADMINDB_SECRET_FILE` path if specified in environment.
|
|
28
|
+
* 3. User home directory `.admindb-secret` (or temp directory if home is not writable).
|
|
29
|
+
* 4. In-memory random fallback if filesystem is completely read-only.
|
|
30
|
+
*/
|
|
31
|
+
function getOrCreatePersistentSecret(env = process.env) {
|
|
32
|
+
const envSecret = env.ADMINDB_SECRET ?? env.SESSION_SECRET;
|
|
33
|
+
if (envSecret && String(envSecret).trim()) {
|
|
34
|
+
return String(envSecret).trim();
|
|
35
|
+
}
|
|
36
|
+
// If a custom secret file is specified, don't use default home cache
|
|
37
|
+
const customSecretFile = env.ADMINDB_SECRET_FILE ? String(env.ADMINDB_SECRET_FILE).trim() : undefined;
|
|
38
|
+
if (!customSecretFile && cachedFallbackSecret) {
|
|
39
|
+
return cachedFallbackSecret;
|
|
40
|
+
}
|
|
41
|
+
const candidatePaths = [];
|
|
42
|
+
if (customSecretFile) {
|
|
43
|
+
candidatePaths.push(node_path_1.default.resolve(customSecretFile));
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
try {
|
|
47
|
+
const home = node_os_1.default.homedir();
|
|
48
|
+
if (home) {
|
|
49
|
+
candidatePaths.push(node_path_1.default.join(home, '.admindb-secret'));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
/* ignore */
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const tmp = node_os_1.default.tmpdir();
|
|
57
|
+
if (tmp) {
|
|
58
|
+
candidatePaths.push(node_path_1.default.join(tmp, '.admindb-secret'));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
/* ignore */
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// 1. Try reading existing secret from candidate paths
|
|
66
|
+
for (const filePath of candidatePaths) {
|
|
67
|
+
try {
|
|
68
|
+
if ((0, node_fs_1.existsSync)(filePath)) {
|
|
69
|
+
const content = (0, node_fs_1.readFileSync)(filePath, 'utf8').trim();
|
|
70
|
+
if (content.length >= 16) {
|
|
71
|
+
if (!customSecretFile) {
|
|
72
|
+
cachedFallbackSecret = content;
|
|
73
|
+
}
|
|
74
|
+
return content;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Continue to next candidate or write attempt
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// 2. Generate new secret and attempt writing to the first writable candidate path
|
|
83
|
+
const newSecret = (0, node_crypto_1.randomBytes)(32).toString('hex');
|
|
84
|
+
for (const filePath of candidatePaths) {
|
|
85
|
+
try {
|
|
86
|
+
const dir = node_path_1.default.dirname(filePath);
|
|
87
|
+
if (!(0, node_fs_1.existsSync)(dir)) {
|
|
88
|
+
(0, node_fs_1.mkdirSync)(dir, { recursive: true });
|
|
89
|
+
}
|
|
90
|
+
(0, node_fs_1.writeFileSync)(filePath, newSecret, { encoding: 'utf8', mode: 0o600 });
|
|
91
|
+
if (!customSecretFile) {
|
|
92
|
+
cachedFallbackSecret = newSecret;
|
|
93
|
+
}
|
|
94
|
+
return newSecret;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Continue to next candidate if write fails
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// 3. Last-resort fallback to in-memory secret if disk is not writable
|
|
101
|
+
if (!customSecretFile) {
|
|
102
|
+
cachedFallbackSecret = newSecret;
|
|
103
|
+
}
|
|
104
|
+
return newSecret;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Resolves the authentication options against environment variables.
|
|
108
|
+
*/
|
|
109
|
+
function resolveAuthConfig(optionsAuth, env = process.env) {
|
|
110
|
+
// Check if explicitly disabled via options or environment variable
|
|
111
|
+
const envDisabled = ['0', 'false', 'no', 'off'].includes(String(env.ADMINDB_AUTH ?? '').trim().toLowerCase()) ||
|
|
112
|
+
['1', 'true', 'yes'].includes(String(env.ADMINDB_NO_AUTH ?? env.ADMINDB_DISABLE_AUTH ?? '').trim().toLowerCase());
|
|
113
|
+
let enabled = true;
|
|
114
|
+
let username = (env.ADMINDB_USERNAME ?? env.ADMINDB_USER) ? String(env.ADMINDB_USERNAME ?? env.ADMINDB_USER).trim() : types_1.DEFAULT_USERNAME;
|
|
115
|
+
let password = (env.ADMINDB_PASSWORD ?? env.ADMINDB_PASS) ? String(env.ADMINDB_PASSWORD ?? env.ADMINDB_PASS).trim() : types_1.DEFAULT_PASSWORD_HASH;
|
|
116
|
+
let secret = (env.ADMINDB_SECRET ?? env.SESSION_SECRET)
|
|
117
|
+
? String(env.ADMINDB_SECRET ?? env.SESSION_SECRET).trim()
|
|
118
|
+
: getOrCreatePersistentSecret(env);
|
|
119
|
+
let sessionDurationMs = types_1.DEFAULT_SESSION_DURATION_MS;
|
|
120
|
+
if (optionsAuth === false || envDisabled) {
|
|
121
|
+
enabled = false;
|
|
122
|
+
}
|
|
123
|
+
else if (typeof optionsAuth === 'object' && optionsAuth !== null) {
|
|
124
|
+
if (optionsAuth.enabled === false)
|
|
125
|
+
enabled = false;
|
|
126
|
+
if (optionsAuth.username !== undefined)
|
|
127
|
+
username = String(optionsAuth.username).trim();
|
|
128
|
+
if (optionsAuth.password !== undefined)
|
|
129
|
+
password = String(optionsAuth.password).trim();
|
|
130
|
+
if (optionsAuth.secret !== undefined && String(optionsAuth.secret).trim()) {
|
|
131
|
+
secret = String(optionsAuth.secret).trim();
|
|
132
|
+
}
|
|
133
|
+
if (optionsAuth.sessionDurationMs !== undefined)
|
|
134
|
+
sessionDurationMs = optionsAuth.sessionDurationMs;
|
|
135
|
+
}
|
|
136
|
+
const isDefaultPassword = username === types_1.DEFAULT_USERNAME &&
|
|
137
|
+
(password === types_1.DEFAULT_PASSWORD_HASH || password === 'admin');
|
|
138
|
+
return {
|
|
139
|
+
enabled,
|
|
140
|
+
username,
|
|
141
|
+
password,
|
|
142
|
+
secret,
|
|
143
|
+
sessionDurationMs,
|
|
144
|
+
isDefaultPassword,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/auth/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates a secure scrypt password hash with a random or provided salt.
|
|
3
|
+
* Format: `scrypt:<saltHex>:<derivedKeyHex>`
|
|
4
|
+
*/
|
|
5
|
+
export declare function hashPassword(password: string, salt?: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Constant-time comparison between two strings to prevent timing attacks.
|
|
8
|
+
*/
|
|
9
|
+
export declare function constantTimeCompare(a: string, b: string): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Verifies a candidate plaintext password against a stored password or scrypt hash.
|
|
12
|
+
*/
|
|
13
|
+
export declare function verifyPassword(candidatePassword: string, storedPasswordOrHash: string): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Parses raw Cookie header string into key-value map.
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseCookies(cookieHeader?: string): Record<string, string>;
|
|
18
|
+
/**
|
|
19
|
+
* Creates a tamper-proof signed session token using HMAC-SHA256.
|
|
20
|
+
* Format: `<base64url(username)>.<expiresAtTimestamp>.<hmacSignature>`
|
|
21
|
+
*/
|
|
22
|
+
export declare function createSessionToken(username: string, secret: string, durationMs?: number): string;
|
|
23
|
+
/**
|
|
24
|
+
* Verifies a signed session token in constant time.
|
|
25
|
+
* Returns the authenticated username if valid and non-expired, or null otherwise.
|
|
26
|
+
*/
|
|
27
|
+
export declare function verifySessionToken(token: string, secret: string, expectedUser?: string): string | null;
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hashPassword = hashPassword;
|
|
4
|
+
exports.constantTimeCompare = constantTimeCompare;
|
|
5
|
+
exports.verifyPassword = verifyPassword;
|
|
6
|
+
exports.parseCookies = parseCookies;
|
|
7
|
+
exports.createSessionToken = createSessionToken;
|
|
8
|
+
exports.verifySessionToken = verifySessionToken;
|
|
9
|
+
const node_crypto_1 = require("node:crypto");
|
|
10
|
+
const types_1 = require("./types");
|
|
11
|
+
/**
|
|
12
|
+
* Generates a secure scrypt password hash with a random or provided salt.
|
|
13
|
+
* Format: `scrypt:<saltHex>:<derivedKeyHex>`
|
|
14
|
+
*/
|
|
15
|
+
function hashPassword(password, salt) {
|
|
16
|
+
const saltHex = salt || (0, node_crypto_1.randomBytes)(16).toString('hex');
|
|
17
|
+
const derivedKey = (0, node_crypto_1.scryptSync)(password, saltHex, 64).toString('hex');
|
|
18
|
+
return `scrypt:${saltHex}:${derivedKey}`;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Constant-time comparison between two strings to prevent timing attacks.
|
|
22
|
+
*/
|
|
23
|
+
function constantTimeCompare(a, b) {
|
|
24
|
+
try {
|
|
25
|
+
const bufA = Buffer.from(String(a), 'utf8');
|
|
26
|
+
const bufB = Buffer.from(String(b), 'utf8');
|
|
27
|
+
if (bufA.length !== bufB.length) {
|
|
28
|
+
// Dummy comparison to prevent timing leak on length mismatch
|
|
29
|
+
(0, node_crypto_1.timingSafeEqual)(bufA, bufA);
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
return (0, node_crypto_1.timingSafeEqual)(bufA, bufB);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Verifies a candidate plaintext password against a stored password or scrypt hash.
|
|
40
|
+
*/
|
|
41
|
+
function verifyPassword(candidatePassword, storedPasswordOrHash) {
|
|
42
|
+
if (typeof candidatePassword !== 'string' || typeof storedPasswordOrHash !== 'string') {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
// Handle scrypt formatted hash: `scrypt:<salt>:<hash>`
|
|
46
|
+
if (storedPasswordOrHash.startsWith('scrypt:')) {
|
|
47
|
+
const parts = storedPasswordOrHash.split(':');
|
|
48
|
+
if (parts.length === 3 && parts[1] && parts[2]) {
|
|
49
|
+
const salt = parts[1];
|
|
50
|
+
const expectedKeyHex = parts[2];
|
|
51
|
+
try {
|
|
52
|
+
const derivedKey = (0, node_crypto_1.scryptSync)(candidatePassword, salt, 64).toString('hex');
|
|
53
|
+
return constantTimeCompare(derivedKey, expectedKeyHex);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Fallback for plaintext passwords (legacy or plain string configs)
|
|
61
|
+
return constantTimeCompare(candidatePassword, storedPasswordOrHash);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Parses raw Cookie header string into key-value map.
|
|
65
|
+
*/
|
|
66
|
+
function parseCookies(cookieHeader) {
|
|
67
|
+
const cookies = {};
|
|
68
|
+
if (!cookieHeader)
|
|
69
|
+
return cookies;
|
|
70
|
+
for (const pair of cookieHeader.split(';')) {
|
|
71
|
+
const idx = pair.indexOf('=');
|
|
72
|
+
if (idx === -1)
|
|
73
|
+
continue;
|
|
74
|
+
const key = pair.slice(0, idx).trim();
|
|
75
|
+
let val = pair.slice(idx + 1).trim();
|
|
76
|
+
if (val.startsWith('"') && val.endsWith('"') && val.length >= 2) {
|
|
77
|
+
val = val.slice(1, -1);
|
|
78
|
+
}
|
|
79
|
+
if (key) {
|
|
80
|
+
try {
|
|
81
|
+
cookies[key] = decodeURIComponent(val);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
cookies[key] = val;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return cookies;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Creates a tamper-proof signed session token using HMAC-SHA256.
|
|
92
|
+
* Format: `<base64url(username)>.<expiresAtTimestamp>.<hmacSignature>`
|
|
93
|
+
*/
|
|
94
|
+
function createSessionToken(username, secret, durationMs = types_1.DEFAULT_SESSION_DURATION_MS) {
|
|
95
|
+
const expiresAt = Date.now() + durationMs;
|
|
96
|
+
const userPayload = Buffer.from(username, 'utf8').toString('base64url');
|
|
97
|
+
const data = `${userPayload}.${expiresAt}`;
|
|
98
|
+
const signature = (0, node_crypto_1.createHmac)('sha256', secret).update(data).digest('base64url');
|
|
99
|
+
return `${data}.${signature}`;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Verifies a signed session token in constant time.
|
|
103
|
+
* Returns the authenticated username if valid and non-expired, or null otherwise.
|
|
104
|
+
*/
|
|
105
|
+
function verifySessionToken(token, secret, expectedUser) {
|
|
106
|
+
if (!token || typeof token !== 'string')
|
|
107
|
+
return null;
|
|
108
|
+
const parts = token.split('.');
|
|
109
|
+
if (parts.length !== 3)
|
|
110
|
+
return null;
|
|
111
|
+
const [userPayload, expiresStr, providedSignature] = parts;
|
|
112
|
+
const data = `${userPayload}.${expiresStr}`;
|
|
113
|
+
const expectedSignature = (0, node_crypto_1.createHmac)('sha256', secret).update(data).digest('base64url');
|
|
114
|
+
if (!constantTimeCompare(providedSignature, expectedSignature)) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
const expiresAt = Number.parseInt(expiresStr, 10);
|
|
118
|
+
if (!Number.isFinite(expiresAt) || Date.now() > expiresAt) {
|
|
119
|
+
return null; // Expired
|
|
120
|
+
}
|
|
121
|
+
let username;
|
|
122
|
+
try {
|
|
123
|
+
username = Buffer.from(userPayload, 'base64url').toString('utf8');
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
if (expectedUser && !constantTimeCompare(username, expectedUser)) {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
return username;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/auth/crypto.ts"],"names":[],"mappings":"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"}
|