@lamalibre/create-lamaste 4.4.1 → 4.6.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/package.json +2 -2
- package/scripts/lamaste-priv +234 -18
- package/src/index.js +1 -0
- package/src/lib/backend-cookie.js +65 -0
- package/src/lib/ip-panel-vhost.js +208 -0
- package/src/lib/service-config.js +5 -3
- package/src/tasks/nginx.js +18 -135
- package/src/tasks/redeploy.js +39 -1
- package/vendor/docs/00-introduction/how-it-works.md +2 -2
- package/vendor/docs/00-introduction/quickstart.md +5 -5
- package/vendor/docs/00-introduction/what-is-lamaste.md +5 -5
- package/vendor/docs/01-concepts/authentication.md +1 -1
- package/vendor/docs/01-concepts/authorization.md +66 -48
- package/vendor/docs/01-concepts/certificates.md +3 -3
- package/vendor/docs/01-concepts/mtls.md +2 -2
- package/vendor/docs/01-concepts/security-model.md +70 -33
- package/vendor/docs/01-concepts/tickets.md +2 -2
- package/vendor/docs/01-concepts/tunneling.md +4 -4
- package/vendor/docs/02-guides/agent-setup.md +5 -5
- package/vendor/docs/02-guides/certificate-management.md +2 -2
- package/vendor/docs/02-guides/cloud-provisioning.md +3 -3
- package/vendor/docs/02-guides/desktop-app-setup.md +10 -10
- package/vendor/docs/02-guides/installation.md +3 -3
- package/vendor/docs/02-guides/managing-users.md +113 -25
- package/vendor/docs/02-guides/onboarding.md +2 -2
- package/vendor/docs/02-guides/standalone-plugin-with-tickets.md +2 -2
- package/vendor/docs/02-guides/static-sites.md +4 -0
- package/vendor/docs/03-architecture/installer-flow.md +2 -2
- package/vendor/docs/03-architecture/installer.md +4 -4
- package/vendor/docs/03-architecture/management-flow.md +3 -1
- package/vendor/docs/03-architecture/nginx-configuration.md +229 -24
- package/vendor/docs/03-architecture/overview.md +13 -17
- package/vendor/docs/03-architecture/panel-client.md +6 -6
- package/vendor/docs/03-architecture/panel-server.md +3 -2
- package/vendor/docs/03-architecture/state-management.md +4 -8
- package/vendor/docs/03-architecture/system-overview.md +1 -1
- package/vendor/docs/04-api-reference/agent-hosted-plugins.md +378 -34
- package/vendor/docs/04-api-reference/app-host.md +3 -3
- package/vendor/docs/04-api-reference/gatekeeper.md +78 -5
- package/vendor/docs/04-api-reference/lifecycle-hooks.md +14 -12
- package/vendor/docs/04-api-reference/onboarding.md +1 -1
- package/vendor/docs/04-api-reference/registry-and-oidc.md +3 -3
- package/vendor/docs/04-api-reference/sites.md +4 -0
- package/vendor/docs/04-api-reference/tunnels.md +87 -47
- package/vendor/docs/04-api-reference/users.md +241 -45
- package/vendor/docs/05-operations/backup-and-restore.md +35 -26
- package/vendor/docs/05-operations/monitoring.md +39 -0
- package/vendor/docs/05-operations/uninstalling.md +2 -1
- package/vendor/docs/05-operations/upgrades.md +24 -6
- package/vendor/docs/06-reference/config-files.md +100 -202
- package/vendor/docs/06-reference/glossary.md +3 -3
- package/vendor/docs/06-reference/installer-flags.md +13 -13
- package/vendor/docs/06-reference/ports-and-services.md +25 -26
- package/vendor/docs/06-reference/troubleshooting.md +8 -8
- package/vendor/docs/gatekeeper-design.md +10 -8
- package/vendor/docs/identity-directory-design.md +48 -14
- package/vendor/docs/package.json +1 -1
- package/vendor/docs/todo/lib-cli-desktop-refactor.md +27 -27
- package/vendor/gatekeeper/dist/cli/index.js +0 -0
- package/vendor/gatekeeper/dist/index.d.ts +4 -3
- package/vendor/gatekeeper/dist/index.d.ts.map +1 -1
- package/vendor/gatekeeper/dist/index.js +4 -2
- package/vendor/gatekeeper/dist/index.js.map +1 -1
- package/vendor/gatekeeper/dist/lib/authz.d.ts +9 -0
- package/vendor/gatekeeper/dist/lib/authz.d.ts.map +1 -1
- package/vendor/gatekeeper/dist/lib/authz.js +31 -0
- package/vendor/gatekeeper/dist/lib/authz.js.map +1 -1
- package/vendor/gatekeeper/dist/lib/constants.d.ts +5 -2
- package/vendor/gatekeeper/dist/lib/constants.d.ts.map +1 -1
- package/vendor/gatekeeper/dist/lib/constants.js +5 -2
- package/vendor/gatekeeper/dist/lib/constants.js.map +1 -1
- package/vendor/gatekeeper/dist/lib/grants.d.ts +6 -0
- package/vendor/gatekeeper/dist/lib/grants.d.ts.map +1 -1
- package/vendor/gatekeeper/dist/lib/grants.js +6 -1
- package/vendor/gatekeeper/dist/lib/grants.js.map +1 -1
- package/vendor/gatekeeper/dist/lib/groups.d.ts +5 -0
- package/vendor/gatekeeper/dist/lib/groups.d.ts.map +1 -1
- package/vendor/gatekeeper/dist/lib/groups.js +5 -1
- package/vendor/gatekeeper/dist/lib/groups.js.map +1 -1
- package/vendor/gatekeeper/dist/lib/principals.d.ts +29 -0
- package/vendor/gatekeeper/dist/lib/principals.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/principals.js +67 -0
- package/vendor/gatekeeper/dist/lib/principals.js.map +1 -0
- package/vendor/gatekeeper/dist/lib/tunnels.d.ts +10 -0
- package/vendor/gatekeeper/dist/lib/tunnels.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/tunnels.js +56 -0
- package/vendor/gatekeeper/dist/lib/tunnels.js.map +1 -0
- package/vendor/gatekeeper/dist/server/index.d.ts +2 -1
- package/vendor/gatekeeper/dist/server/index.d.ts.map +1 -1
- package/vendor/gatekeeper/dist/server/index.js +49 -56
- package/vendor/gatekeeper/dist/server/index.js.map +1 -1
- package/vendor/gatekeeper/dist/server/routes/authz.d.ts +15 -1
- package/vendor/gatekeeper/dist/server/routes/authz.d.ts.map +1 -1
- package/vendor/gatekeeper/dist/server/routes/authz.js +332 -104
- package/vendor/gatekeeper/dist/server/routes/authz.js.map +1 -1
- package/vendor/gatekeeper/dist/server/routes/diagnostic.d.ts.map +1 -1
- package/vendor/gatekeeper/dist/server/routes/diagnostic.js +61 -4
- package/vendor/gatekeeper/dist/server/routes/diagnostic.js.map +1 -1
- package/vendor/gatekeeper/dist/server/routes/principals.d.ts +3 -0
- package/vendor/gatekeeper/dist/server/routes/principals.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/principals.js +27 -0
- package/vendor/gatekeeper/dist/server/routes/principals.js.map +1 -0
- package/vendor/gatekeeper/package.json +2 -2
- package/vendor/server/bin/lamaste-server.js +15 -1
- package/vendor/server/package.json +2 -2
- package/vendor/server/src/commands/plugin-identity.js +335 -0
- package/vendor/server/src/commands/plugin-web-surface.js +269 -0
- package/vendor/server/src/commands/plugins.js +156 -11
- package/vendor/server/src/commands/registry-credential.js +2 -1
- package/vendor/server/src/commands/sites.js +15 -1
- package/vendor/server/src/commands/tunnels.js +102 -2
- package/vendor/server/src/commands/uninstall.js +3 -1
- package/vendor/server/src/commands/users.js +358 -0
- package/vendor/server/src/plugin-approval.js +186 -5
- package/vendor/server/src/plugin-identity.js +382 -0
- package/vendor/server/src/plugin-web-surface.js +307 -0
- package/vendor/server-ui/dist/assets/index-BZwQ_aQc.css +1 -0
- package/vendor/server-ui/dist/assets/index-BvEfCZYS.js +84 -0
- package/vendor/server-ui/dist/index.html +2 -2
- package/vendor/serverd/package.json +2 -2
- package/vendor/serverd/src/index.js +34 -5
- package/vendor/serverd/src/lib/audience.js +576 -0
- package/vendor/serverd/src/lib/authelia.js +78 -7
- package/vendor/serverd/src/lib/chisel-runtime.js +18 -6
- package/vendor/serverd/src/lib/chisel.js +10 -2
- package/vendor/serverd/src/lib/config.js +68 -43
- package/vendor/serverd/src/lib/directory.js +1113 -0
- package/vendor/serverd/src/lib/entitlements.js +517 -0
- package/vendor/serverd/src/lib/gatekeeper-client.js +226 -10
- package/vendor/serverd/src/lib/hook-pipelines.js +21 -3
- package/vendor/serverd/src/lib/identity-sync.js +905 -0
- package/vendor/serverd/src/lib/migrations/state/0013_identity_directory.sql +158 -0
- package/vendor/serverd/src/lib/migrations/state/0014_identity_ledger.sql +20 -0
- package/vendor/serverd/src/lib/migrations/state/0015_plugin_web_surface.sql +14 -0
- package/vendor/serverd/src/lib/mtls.js +6 -2
- package/vendor/serverd/src/lib/nginx.js +546 -48
- package/vendor/serverd/src/lib/plugin-hooks.js +127 -45
- package/vendor/serverd/src/lib/plugin-hosting.js +33 -5
- package/vendor/serverd/src/lib/plugin-lifecycle.js +227 -13
- package/vendor/serverd/src/lib/plugin-packages.js +74 -2
- package/vendor/serverd/src/lib/plugins.js +95 -7
- package/vendor/serverd/src/lib/registry-credential.js +9 -6
- package/vendor/serverd/src/lib/request-logging.js +19 -0
- package/vendor/serverd/src/lib/retained-data.js +50 -4
- package/vendor/serverd/src/lib/state.js +36 -0
- package/vendor/serverd/src/lib/tunnel-hooks.js +4 -1
- package/vendor/serverd/src/lib/user-access-session.js +21 -11
- package/vendor/serverd/src/lib/user-caller.js +67 -0
- package/vendor/serverd/src/lib/user-surface.js +754 -0
- package/vendor/serverd/src/lib/vhost-reconcile.js +137 -33
- package/vendor/serverd/src/lib/web-surface.js +766 -0
- package/vendor/serverd/src/middleware/user-access-session.js +9 -0
- package/vendor/serverd/src/routes/agent-forwarder.js +4 -2
- package/vendor/serverd/src/routes/invite.js +53 -12
- package/vendor/serverd/src/routes/management/gatekeeper-proxy.js +107 -16
- package/vendor/serverd/src/routes/management/identity-directory.js +79 -0
- package/vendor/serverd/src/routes/management/invitations.js +78 -68
- package/vendor/serverd/src/routes/management/plugin-identity.js +221 -0
- package/vendor/serverd/src/routes/management/plugin-web-surface.js +151 -0
- package/vendor/serverd/src/routes/management/plugins.js +2 -0
- package/vendor/serverd/src/routes/management/registry-credential.js +1 -1
- package/vendor/serverd/src/routes/management/sites.js +143 -65
- package/vendor/serverd/src/routes/management/tunnels.js +109 -22
- package/vendor/serverd/src/routes/management/users.js +290 -208
- package/vendor/serverd/src/routes/management.js +6 -0
- package/vendor/serverd/src/routes/onboarding/provision.js +14 -1
- package/vendor/serverd/src/routes/user-access.js +17 -4
- package/vendor/serverd/src/routes/user-surface.js +69 -0
- package/vendor/server-ui/dist/assets/index-25wo_8av.css +0 -1
- package/vendor/server-ui/dist/assets/index-roDHz3dM.js +0 -84
|
@@ -15,6 +15,20 @@ const DEFAULT_RETENTION_DAYS = 90;
|
|
|
15
15
|
// JSON-era rotation cadence loosely and is comfortably below any sensible
|
|
16
16
|
// retention setting.
|
|
17
17
|
const RETENTION_SWEEP_INTERVAL_MS = 60 * 60 * 1000;
|
|
18
|
+
/**
|
|
19
|
+
* `POST /api/access-log/purge { username, before? }`: the rows of one
|
|
20
|
+
* username, before a time when given. The username travels in the body —
|
|
21
|
+
* a URL is what request logs keep.
|
|
22
|
+
*/
|
|
23
|
+
const PurgeBodySchema = z
|
|
24
|
+
.object({
|
|
25
|
+
username: z.string().min(1).max(100),
|
|
26
|
+
before: z
|
|
27
|
+
.string()
|
|
28
|
+
.regex(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,3})?Z$/, 'before is an ISO 8601 UTC time')
|
|
29
|
+
.optional(),
|
|
30
|
+
})
|
|
31
|
+
.strict();
|
|
18
32
|
const UpdateSettingsSchema = z.object({
|
|
19
33
|
adminEmail: z.string().email().max(200).optional(),
|
|
20
34
|
adminName: z.string().max(200).optional(),
|
|
@@ -41,6 +55,11 @@ async function getStmts() {
|
|
|
41
55
|
countAll: db.prepare('SELECT COUNT(*) AS n FROM access_request_log'),
|
|
42
56
|
deleteAll: db.prepare('DELETE FROM access_request_log'),
|
|
43
57
|
deleteOlderThan: db.prepare('DELETE FROM access_request_log WHERE timestamp < ?'),
|
|
58
|
+
// Erasing a removed user (the panel): their rows only — those logged
|
|
59
|
+
// before they were removed, when the panel says when that was (a later
|
|
60
|
+
// user may have the same username).
|
|
61
|
+
deleteByUsername: db.prepare('DELETE FROM access_request_log WHERE username = ?'),
|
|
62
|
+
deleteByUsernameBefore: db.prepare('DELETE FROM access_request_log WHERE username = ? AND timestamp < ?'),
|
|
44
63
|
begin: db.prepare('BEGIN IMMEDIATE'),
|
|
45
64
|
commit: db.prepare('COMMIT'),
|
|
46
65
|
rollback: db.prepare('ROLLBACK'),
|
|
@@ -223,12 +242,50 @@ export async function diagnosticRoutes(fastify) {
|
|
|
223
242
|
return reply.code(500).send({ error: err.message });
|
|
224
243
|
}
|
|
225
244
|
});
|
|
226
|
-
// DELETE /api/access-log — clear access request log
|
|
227
|
-
|
|
245
|
+
// DELETE /api/access-log — clear the whole access request log (and the
|
|
246
|
+
// entries still queued for it). It takes no query: a purge of one user's
|
|
247
|
+
// rows is POST /api/access-log/purge, and a query an older caller sent to
|
|
248
|
+
// narrow the purge must never clear everything instead. Answers how many
|
|
249
|
+
// rows went (`removed`).
|
|
250
|
+
fastify.delete('/access-log', async (request, reply) => {
|
|
251
|
+
if (Object.keys(request.query ?? {}).length > 0) {
|
|
252
|
+
return reply.code(400).send({
|
|
253
|
+
error: "DELETE clears the whole log and takes no query — purge one user's rows with POST /api/access-log/purge",
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
try {
|
|
257
|
+
const s = await getStmts();
|
|
258
|
+
logQueue = [];
|
|
259
|
+
const result = s.deleteAll.run();
|
|
260
|
+
return { ok: true, removed: Number(result.changes) };
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
return reply.code(500).send({ error: err.message });
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
// POST /api/access-log/purge { username, before? } — one user's rows,
|
|
267
|
+
// logged before `before` when given (a later user may hold the username),
|
|
268
|
+
// and the matching entries still queued for the log, so none of them is
|
|
269
|
+
// written after the purge. Answers how many rows went (`removed`).
|
|
270
|
+
fastify.post('/access-log/purge', async (request, reply) => {
|
|
271
|
+
const parsed = PurgeBodySchema.safeParse(request.body ?? {});
|
|
272
|
+
if (!parsed.success) {
|
|
273
|
+
return reply.code(400).send({
|
|
274
|
+
error: 'Invalid body',
|
|
275
|
+
details: parsed.error.issues.map((i) => i.message),
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
const { username, before } = parsed.data;
|
|
228
279
|
try {
|
|
229
280
|
const s = await getStmts();
|
|
230
|
-
|
|
231
|
-
|
|
281
|
+
const matches = (e) => e.username === username && (before === undefined || e.timestamp < before);
|
|
282
|
+
const kept = logQueue.filter((e) => !matches(e));
|
|
283
|
+
const queued = logQueue.length - kept.length;
|
|
284
|
+
logQueue = kept;
|
|
285
|
+
const result = before === undefined
|
|
286
|
+
? s.deleteByUsername.run(username)
|
|
287
|
+
: s.deleteByUsernameBefore.run(username, before);
|
|
288
|
+
return { ok: true, removed: Number(result.changes) + queued };
|
|
232
289
|
}
|
|
233
290
|
catch (err) {
|
|
234
291
|
return reply.code(500).send({ error: err.message });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../../../src/server/routes/diagnostic.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../../../src/server/routes/diagnostic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"principals.d.ts","sourceRoot":"","sources":["../../../src/server/routes/principals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAO7E,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB7E"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { removeUserPrincipal } from '../../lib/principals.js';
|
|
3
|
+
/** A username as grants and group members hold it — in the body, never in a URL. */
|
|
4
|
+
const RemoveUserBodySchema = z.object({ username: z.string().min(1).max(100) }).strict();
|
|
5
|
+
export async function principalRoutes(fastify) {
|
|
6
|
+
// POST /api/principals/user/remove { username } — remove a user principal
|
|
7
|
+
// everywhere: every grant naming the username (any resource type) and its
|
|
8
|
+
// membership of every group, in one transaction. The panel calls it when
|
|
9
|
+
// a user is removed, and before it creates one whose username an earlier
|
|
10
|
+
// user held, so a reused username inherits nothing. The username travels
|
|
11
|
+
// in the body: a URL is what request logs keep.
|
|
12
|
+
fastify.post('/principals/user/remove', async (request, reply) => {
|
|
13
|
+
const parsed = RemoveUserBodySchema.safeParse(request.body);
|
|
14
|
+
if (!parsed.success) {
|
|
15
|
+
return reply.code(400).send({ error: 'The body is { username } (1-100 characters)' });
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const removed = await removeUserPrincipal(parsed.data.username);
|
|
19
|
+
return { ok: true, ...removed };
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
request.log.error({ err: err.message }, 'Removing a user principal failed');
|
|
23
|
+
return reply.code(500).send({ error: 'Removing the user principal failed' });
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=principals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"principals.js","sourceRoot":"","sources":["../../../src/server/routes/principals.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,oFAAoF;AACpF,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAEzF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAwB;IAC5D,0EAA0E;IAC1E,0EAA0E;IAC1E,yEAAyE;IACzE,yEAAyE;IACzE,yEAAyE;IACzE,gDAAgD;IAChD,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAE,EAAE;QAC7F,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,6CAA6C,EAAE,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,EAAE,EAAE,kCAAkC,CAAC,CAAC;YACvF,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lamalibre/lamaste-gatekeeper",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.6.0",
|
|
4
4
|
"description": "Authorization layer for Lamaste — groups, grants, and tunnel access control",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@fastify/rate-limit": "^10.3.0",
|
|
35
|
-
"@lamalibre/lamaste": "^4.
|
|
35
|
+
"@lamalibre/lamaste": "^4.6.0",
|
|
36
36
|
"fastify": "^5.3.3",
|
|
37
37
|
"undici": "^7.8.0",
|
|
38
38
|
"zod": "^3.24.4"
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* restart Restart panel server (and optionally gatekeeper)
|
|
16
16
|
* plugins Manage server-side plugins
|
|
17
17
|
* push-install Push install: the switch, the default policy, agents' windows
|
|
18
|
+
* users Users and the user directory: disable, delete, erase
|
|
18
19
|
* tunnels Manage tunnels
|
|
19
20
|
* sites Manage static sites
|
|
20
21
|
* certs Certificate status and renewal
|
|
@@ -63,7 +64,8 @@ ${b('COMMANDS')}
|
|
|
63
64
|
${c('plugins')} Manage plugins (list, install, enable, disable, uninstall, update, hosting, hooks, settings, …)
|
|
64
65
|
${c('push-install')} Push install: on/off, default policy, open/close an agent's window
|
|
65
66
|
${c('audit')} The panel's audit log (approvals, hostings, updates, hook events)
|
|
66
|
-
${c('
|
|
67
|
+
${c('users')} Users and the user directory (list, disable, enable, delete, erase, directory)
|
|
68
|
+
${c('tunnels')} Manage tunnels (list, create, delete, toggle, bind a plugin's user surface)
|
|
67
69
|
${c('sites')} Manage static sites (list, create, delete)
|
|
68
70
|
${c('certs')} Certificate status, renewal, and agent cert listing
|
|
69
71
|
${c('reset-admin')} Emergency admin reset (reverts to P12, clears 2FA)
|
|
@@ -109,6 +111,13 @@ ${b('EXAMPLES')}
|
|
|
109
111
|
${d("# Broker agent install tokens from the registry as the panel's own Authelia client")}
|
|
110
112
|
${c('lamaste-server registry-credential set --url https://feria.example.com --oidc')}
|
|
111
113
|
|
|
114
|
+
${d('# Offboard a user: they cannot sign in, plugins see them disabled')}
|
|
115
|
+
${c('lamaste-server users disable alice')}
|
|
116
|
+
|
|
117
|
+
${d("# Give a user an agent-hosted plugin's role, and serve its user surface on a tunnel")}
|
|
118
|
+
${c('lamaste-server plugins entitlements market-indicators --user alice --roles viewer')}
|
|
119
|
+
${c('lamaste-server tunnels bind-user-surface piyasa market-indicators')}
|
|
120
|
+
|
|
112
121
|
${d('# List tunnels')}
|
|
113
122
|
${c('lamaste-server tunnels list')}
|
|
114
123
|
|
|
@@ -170,6 +179,11 @@ async function main() {
|
|
|
170
179
|
await runAudit(args.slice(1), { json });
|
|
171
180
|
break;
|
|
172
181
|
}
|
|
182
|
+
case 'users': {
|
|
183
|
+
const { runUsers } = await import('../src/commands/users.js');
|
|
184
|
+
await runUsers(args.slice(1), { json });
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
173
187
|
case 'tunnels': {
|
|
174
188
|
const { runTunnels } = await import('../src/commands/tunnels.js');
|
|
175
189
|
await runTunnels(args.slice(1), { json });
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lamalibre/lamaste-server",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.6.0",
|
|
4
4
|
"description": "Server operations CLI for Lamaste",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"@clack/prompts": "^1.8.1",
|
|
21
|
-
"@lamalibre/lamaste": "^4.
|
|
21
|
+
"@lamalibre/lamaste": "^4.6.0",
|
|
22
22
|
"chalk": "^5.3.0",
|
|
23
23
|
"execa": "^9.0.0"
|
|
24
24
|
},
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* lamaste-server plugins identity|audience|entitlements|identity-sync — the
|
|
3
|
+
* people of an agent-hosted plugin that declares identity (its manifest's
|
|
4
|
+
* `identity` block: roles, and the attributes it receives about its users).
|
|
5
|
+
*
|
|
6
|
+
* identity <name> What its installed version declares, its approval,
|
|
7
|
+
* whether users reach its application (and why not),
|
|
8
|
+
* its audience in numbers, the feed to its agent half
|
|
9
|
+
* and the erasures it has not acknowledged
|
|
10
|
+
* audience <name> Its members — and the users who left (tombstones) —
|
|
11
|
+
* as its agent half is told
|
|
12
|
+
* entitlements <name> Who may use it, with which roles: Gatekeeper plugin
|
|
13
|
+
* grants with roles, to users or Lamaste groups
|
|
14
|
+
* entitlements <name> --user <u> | --group <g> --roles a,b
|
|
15
|
+
* Give exactly these roles (replacing what it held)
|
|
16
|
+
* entitlements <name> --revoke --user <u> | --group <g>
|
|
17
|
+
* Take every role away
|
|
18
|
+
* identity-sync <name> [--reconcile]
|
|
19
|
+
* Send its agent half what it has not applied now;
|
|
20
|
+
* --reconcile replays everything and counts what was
|
|
21
|
+
* out of step (as the daily reconcile does)
|
|
22
|
+
*
|
|
23
|
+
* Every subcommand goes through the running panel
|
|
24
|
+
* (`/api/plugins/:name/{identity,audience,entitlements,identity/sync}`,
|
|
25
|
+
* admin certificate). What the panel says is printed only as
|
|
26
|
+
* `terminalText`; `--json` emits it as it came.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import chalk from 'chalk';
|
|
30
|
+
import { panelRequest } from '../panel-api.js';
|
|
31
|
+
import { emit, emitComplete, emitError } from '../ndjson.js';
|
|
32
|
+
import { identityBlockLines } from '../plugin-approval.js';
|
|
33
|
+
import {
|
|
34
|
+
audienceRowText,
|
|
35
|
+
parseEntitlementsArgs,
|
|
36
|
+
parseIdentitySyncArgs,
|
|
37
|
+
readinessText,
|
|
38
|
+
syncRows,
|
|
39
|
+
warningLine,
|
|
40
|
+
} from '../plugin-identity.js';
|
|
41
|
+
import { terminalText } from '../plugin-settings.js';
|
|
42
|
+
|
|
43
|
+
/** `/api/plugins/<name>/<rest>`. */
|
|
44
|
+
function pluginPath(name, rest) {
|
|
45
|
+
return `/api/plugins/${encodeURIComponent(name)}/${rest}`;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Exit with a usage error or a refused request, as text or NDJSON (with
|
|
50
|
+
* the refusal's `code`).
|
|
51
|
+
*
|
|
52
|
+
* @param {string} message
|
|
53
|
+
* @param {boolean} json
|
|
54
|
+
* @param {{ code?: string }} [err]
|
|
55
|
+
* @returns {never}
|
|
56
|
+
*/
|
|
57
|
+
function fail(message, json, err = {}) {
|
|
58
|
+
if (json) emitError(message, false, typeof err.code === 'string' ? { code: err.code } : {});
|
|
59
|
+
else console.error(`\n ${chalk.red(terminalText(message))}\n`);
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Print a change's warnings: what the panel could not complete beside it. */
|
|
64
|
+
function printWarnings(warnings) {
|
|
65
|
+
for (const warning of warnings ?? []) {
|
|
66
|
+
console.log(` ${chalk.yellow('!')} ${warningLine(warning)}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** `label:` padded, then the value. */
|
|
71
|
+
function row(label, value) {
|
|
72
|
+
console.log(` ${chalk.dim(`${label}:`.padEnd(16))}${value}`);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* `plugins identity <name>`.
|
|
77
|
+
*
|
|
78
|
+
* @param {string | undefined} name
|
|
79
|
+
* @param {{ json: boolean }} options
|
|
80
|
+
*/
|
|
81
|
+
export async function identityCmd(name, { json }) {
|
|
82
|
+
if (!name) fail('Usage: lamaste-server plugins identity <name>', json);
|
|
83
|
+
let result;
|
|
84
|
+
try {
|
|
85
|
+
result = await panelRequest('GET', pluginPath(name, 'identity'));
|
|
86
|
+
} catch (err) {
|
|
87
|
+
fail(err.message, json, err);
|
|
88
|
+
}
|
|
89
|
+
if (json) {
|
|
90
|
+
emit(result);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const view = result.identity;
|
|
94
|
+
const now = Date.now();
|
|
95
|
+
const ready = readinessText(view.readiness);
|
|
96
|
+
console.log('');
|
|
97
|
+
if (!view.declared) {
|
|
98
|
+
console.log(` Plugin ${chalk.cyan(name)} declares no identity: no user reaches it.`);
|
|
99
|
+
console.log(chalk.dim(` (${ready.text})`));
|
|
100
|
+
console.log('');
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
console.log(chalk.bold(` People of ${terminalText(name)}`));
|
|
104
|
+
console.log(chalk.dim(' ' + '─'.repeat(40)));
|
|
105
|
+
row(
|
|
106
|
+
'identity',
|
|
107
|
+
view.approval.approved
|
|
108
|
+
? chalk.green('approved')
|
|
109
|
+
: chalk.yellow('waits for approval — lamaste-server plugins hooks ' + terminalText(name)),
|
|
110
|
+
);
|
|
111
|
+
row('users', ready.ready ? chalk.green(ready.text) : chalk.yellow(ready.text));
|
|
112
|
+
for (const line of identityBlockLines(view.declared)) {
|
|
113
|
+
const [label, ...value] = line.split(':');
|
|
114
|
+
row(label.trim(), value.join(':').trim());
|
|
115
|
+
}
|
|
116
|
+
const counts = view.audience;
|
|
117
|
+
if (counts) {
|
|
118
|
+
row(
|
|
119
|
+
'audience',
|
|
120
|
+
`${counts.active} active, ${counts.disabled} disabled` +
|
|
121
|
+
chalk.dim(` · left: ${counts.removed} removed, ${counts.erased} erased`),
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
if (view.sync) {
|
|
125
|
+
console.log('');
|
|
126
|
+
console.log(chalk.bold(' Feed to the agent half'));
|
|
127
|
+
for (const [label, value] of syncRows(view.sync, now)) {
|
|
128
|
+
row(label, label === 'last error' ? chalk.red(value) : value);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (view.pendingErasures.length > 0) {
|
|
132
|
+
console.log('');
|
|
133
|
+
console.log(chalk.bold(' Erasures its agent half has not acknowledged'));
|
|
134
|
+
for (const userId of view.pendingErasures) console.log(` ${terminalText(userId)}`);
|
|
135
|
+
}
|
|
136
|
+
console.log('');
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* `plugins audience <name>`.
|
|
141
|
+
*
|
|
142
|
+
* @param {string | undefined} name
|
|
143
|
+
* @param {{ json: boolean }} options
|
|
144
|
+
*/
|
|
145
|
+
export async function audienceCmd(name, { json }) {
|
|
146
|
+
if (!name) fail('Usage: lamaste-server plugins audience <name>', json);
|
|
147
|
+
let result;
|
|
148
|
+
try {
|
|
149
|
+
result = await panelRequest('GET', pluginPath(name, 'audience'));
|
|
150
|
+
} catch (err) {
|
|
151
|
+
fail(err.message, json, err);
|
|
152
|
+
}
|
|
153
|
+
if (json) {
|
|
154
|
+
emit(result);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const rows = result.audience.map(audienceRowText);
|
|
158
|
+
if (rows.length === 0) {
|
|
159
|
+
console.log(`\n ${chalk.cyan(name)} has no members yet.\n`);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const print = (list, title) => {
|
|
163
|
+
if (list.length === 0) return;
|
|
164
|
+
const who = Math.max('USER'.length, ...list.map((r) => r.who.length));
|
|
165
|
+
console.log('');
|
|
166
|
+
console.log(chalk.bold(` ${title}`));
|
|
167
|
+
console.log(chalk.dim(` ${'USER ID'.padEnd(36)} ${'USER'.padEnd(who)} STATUS ROLES`));
|
|
168
|
+
for (const r of list) {
|
|
169
|
+
const status =
|
|
170
|
+
r.status === 'active'
|
|
171
|
+
? chalk.green(r.status.padEnd(8))
|
|
172
|
+
: r.status === 'disabled'
|
|
173
|
+
? chalk.yellow(r.status.padEnd(8))
|
|
174
|
+
: chalk.dim(r.status);
|
|
175
|
+
console.log(
|
|
176
|
+
` ${r.userId.padEnd(36)} ${r.who.padEnd(who)} ${status} ${r.roles}${chalk.dim(` (seq ${r.seq})`)}`,
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
print(
|
|
181
|
+
rows.filter((r) => r.member),
|
|
182
|
+
`Audience of ${terminalText(name)} (head seq ${result.head})`,
|
|
183
|
+
);
|
|
184
|
+
print(
|
|
185
|
+
rows.filter((r) => !r.member),
|
|
186
|
+
'Left the audience (the plugin keeps their last known name until they are erased)',
|
|
187
|
+
);
|
|
188
|
+
console.log('');
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* `plugins entitlements <name> [--user <u> | --group <g> --roles a,b]
|
|
193
|
+
* [--revoke --user <u> | --group <g>]`.
|
|
194
|
+
*
|
|
195
|
+
* @param {string[]} args what follows the subcommand
|
|
196
|
+
* @param {{ json: boolean }} options
|
|
197
|
+
*/
|
|
198
|
+
export async function entitlementsCmd(args, { json }) {
|
|
199
|
+
const parsed = parseEntitlementsArgs(args);
|
|
200
|
+
if (!parsed.ok) fail(parsed.error, json);
|
|
201
|
+
const { name } = parsed;
|
|
202
|
+
const path = pluginPath(name, 'entitlements');
|
|
203
|
+
|
|
204
|
+
if (parsed.action === 'list') {
|
|
205
|
+
let result;
|
|
206
|
+
try {
|
|
207
|
+
result = await panelRequest('GET', path);
|
|
208
|
+
} catch (err) {
|
|
209
|
+
fail(err.message, json, err);
|
|
210
|
+
}
|
|
211
|
+
if (json) {
|
|
212
|
+
emit(result);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const { entitlements, roleless } = result;
|
|
216
|
+
console.log('');
|
|
217
|
+
if (entitlements.length === 0) {
|
|
218
|
+
console.log(` Nobody holds a role on ${chalk.cyan(name)} yet.`);
|
|
219
|
+
} else {
|
|
220
|
+
console.log(chalk.bold(` Entitlements on ${terminalText(name)}`));
|
|
221
|
+
const width = Math.max(
|
|
222
|
+
'PRINCIPAL'.length,
|
|
223
|
+
...entitlements.map((e) => `${e.principalType}:${e.principalId}`.length),
|
|
224
|
+
);
|
|
225
|
+
console.log(chalk.dim(` ${'PRINCIPAL'.padEnd(width)} ROLES`));
|
|
226
|
+
for (const e of entitlements) {
|
|
227
|
+
const principal = terminalText(`${e.principalType}:${e.principalId}`);
|
|
228
|
+
const unknown =
|
|
229
|
+
e.unknownRoles.length > 0
|
|
230
|
+
? chalk.dim(` (no longer declared: ${terminalText(e.unknownRoles.join(', '))})`)
|
|
231
|
+
: '';
|
|
232
|
+
const userId = e.userId ? chalk.dim(` ${terminalText(e.userId)}`) : '';
|
|
233
|
+
console.log(
|
|
234
|
+
` ${chalk.cyan(principal.padEnd(width))} ${terminalText(e.roles.join(', '))}${unknown}${userId}`,
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (roleless > 0) {
|
|
239
|
+
console.log(
|
|
240
|
+
chalk.dim(
|
|
241
|
+
`\n ${roleless} grant(s) on it carry no roles (desktop installs, migrated grants) — they never make anyone a member.`,
|
|
242
|
+
),
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
console.log(
|
|
246
|
+
chalk.dim(
|
|
247
|
+
`\n Give roles: lamaste-server plugins entitlements ${terminalText(name)} --user <u> | --group <g> --roles a,b` +
|
|
248
|
+
`\n Take away: lamaste-server plugins entitlements ${terminalText(name)} --revoke --user <u> | --group <g>`,
|
|
249
|
+
),
|
|
250
|
+
);
|
|
251
|
+
console.log('');
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const principal = { principalType: parsed.principalType, principalId: parsed.principalId };
|
|
256
|
+
const who = `${principal.principalType} ${principal.principalId}`;
|
|
257
|
+
if (parsed.action === 'set') {
|
|
258
|
+
let result;
|
|
259
|
+
try {
|
|
260
|
+
result = await panelRequest('PUT', path, { ...principal, roles: parsed.roles });
|
|
261
|
+
} catch (err) {
|
|
262
|
+
fail(err.message, json, err);
|
|
263
|
+
}
|
|
264
|
+
if (json) {
|
|
265
|
+
emitComplete({ name, ...result });
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
console.log(
|
|
269
|
+
result.changed
|
|
270
|
+
? `\n ${chalk.green('✓')} ${terminalText(who)} holds ${chalk.cyan(parsed.roles.join(', '))} on ${terminalText(name)}`
|
|
271
|
+
: `\n ${terminalText(who)} already holds exactly ${parsed.roles.join(', ')} on ${terminalText(name)}`,
|
|
272
|
+
);
|
|
273
|
+
printWarnings(result.warnings);
|
|
274
|
+
console.log('');
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
const query = new URLSearchParams(principal).toString();
|
|
279
|
+
let result;
|
|
280
|
+
try {
|
|
281
|
+
result = await panelRequest('DELETE', `${path}?${query}`);
|
|
282
|
+
} catch (err) {
|
|
283
|
+
fail(err.message, json, err);
|
|
284
|
+
}
|
|
285
|
+
if (json) {
|
|
286
|
+
emitComplete({ name, ...principal, ...result });
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
console.log(
|
|
290
|
+
`\n ${chalk.green('✓')} ${terminalText(who)} holds no role on ${terminalText(name)} any more` +
|
|
291
|
+
chalk.dim(` (${result.revoked} grant(s) revoked)`),
|
|
292
|
+
);
|
|
293
|
+
printWarnings(result.warnings);
|
|
294
|
+
console.log('');
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* `plugins identity-sync <name> [--reconcile]`: exits non-zero when the
|
|
299
|
+
* sync was skipped or failed.
|
|
300
|
+
*
|
|
301
|
+
* @param {string[]} args what follows the subcommand
|
|
302
|
+
* @param {{ json: boolean }} options
|
|
303
|
+
*/
|
|
304
|
+
export async function identitySyncCmd(args, { json }) {
|
|
305
|
+
const parsed = parseIdentitySyncArgs(args);
|
|
306
|
+
if (!parsed.ok) fail(parsed.error, json);
|
|
307
|
+
const { name, reconcile } = parsed;
|
|
308
|
+
let response;
|
|
309
|
+
try {
|
|
310
|
+
response = await panelRequest('POST', pluginPath(name, 'identity/sync'), { reconcile });
|
|
311
|
+
} catch (err) {
|
|
312
|
+
fail(err.message, json, err);
|
|
313
|
+
}
|
|
314
|
+
if (json) {
|
|
315
|
+
emitComplete({ name, ...response });
|
|
316
|
+
} else {
|
|
317
|
+
const { result } = response;
|
|
318
|
+
if (result.status === 'synced') {
|
|
319
|
+
console.log(
|
|
320
|
+
`\n ${chalk.green('✓')} ${terminalText(name)}: ${result.replay ? 'replayed' : 'synced'} up to seq ${result.cursor}` +
|
|
321
|
+
(reconcile ? ` — ${result.mismatches ?? 0} out of step` : ''),
|
|
322
|
+
);
|
|
323
|
+
} else if (result.status === 'up-to-date') {
|
|
324
|
+
console.log(
|
|
325
|
+
`\n ${chalk.green('✓')} ${terminalText(name)}: its agent half is up to date (seq ${result.cursor})`,
|
|
326
|
+
);
|
|
327
|
+
} else {
|
|
328
|
+
console.error(
|
|
329
|
+
`\n ${chalk.red(`${result.status}:`)} ${terminalText(result.error ?? result.reason ?? '')}`,
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
console.log('');
|
|
333
|
+
}
|
|
334
|
+
if (!response.ok) process.exit(1);
|
|
335
|
+
}
|