@lamalibre/create-lamaste 4.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/LICENSE.md +118 -0
- package/README.md +114 -0
- package/bin/create-lamaste.js +15 -0
- package/package.json +54 -0
- package/scripts/bundle-vendor.js +110 -0
- package/scripts/lamaste-cert-info +62 -0
- package/scripts/lamaste-certbot +96 -0
- package/scripts/lamaste-priv +693 -0
- package/src/index.js +646 -0
- package/src/lib/accounts.js +86 -0
- package/src/lib/binaries.js +137 -0
- package/src/lib/cert-help-page.js +160 -0
- package/src/lib/env.js +132 -0
- package/src/lib/http-redirect.js +38 -0
- package/src/lib/ownership.js +231 -0
- package/src/lib/relay-services.js +103 -0
- package/src/lib/secrets.js +19 -0
- package/src/lib/service-config.js +311 -0
- package/src/lib/summary.js +131 -0
- package/src/lib/wrappers.js +63 -0
- package/src/tasks/gatekeeper.js +233 -0
- package/src/tasks/harden.js +293 -0
- package/src/tasks/mtls.js +193 -0
- package/src/tasks/nginx.js +265 -0
- package/src/tasks/node.js +110 -0
- package/src/tasks/panel.js +408 -0
- package/src/tasks/redeploy.js +438 -0
- package/vendor/docs/00-introduction/how-it-works.md +447 -0
- package/vendor/docs/00-introduction/quickstart.md +472 -0
- package/vendor/docs/00-introduction/what-is-lamaste.md +112 -0
- package/vendor/docs/01-concepts/authentication.md +464 -0
- package/vendor/docs/01-concepts/authorization.md +242 -0
- package/vendor/docs/01-concepts/certificates.md +452 -0
- package/vendor/docs/01-concepts/dns-and-domains.md +343 -0
- package/vendor/docs/01-concepts/mtls.md +490 -0
- package/vendor/docs/01-concepts/nginx-reverse-proxy.md +540 -0
- package/vendor/docs/01-concepts/security-model.md +600 -0
- package/vendor/docs/01-concepts/tickets.md +414 -0
- package/vendor/docs/01-concepts/tunneling.md +367 -0
- package/vendor/docs/02-guides/agent-setup.md +194 -0
- package/vendor/docs/02-guides/certificate-management.md +341 -0
- package/vendor/docs/02-guides/cloud-provisioning.md +406 -0
- package/vendor/docs/02-guides/desktop-app-setup.md +226 -0
- package/vendor/docs/02-guides/disaster-recovery.md +464 -0
- package/vendor/docs/02-guides/first-tunnel.md +230 -0
- package/vendor/docs/02-guides/installation.md +393 -0
- package/vendor/docs/02-guides/managing-users.md +255 -0
- package/vendor/docs/02-guides/onboarding.md +244 -0
- package/vendor/docs/02-guides/standalone-plugin-with-tickets.md +375 -0
- package/vendor/docs/02-guides/static-sites.md +364 -0
- package/vendor/docs/03-architecture/e2e-three-vm-sequences.md +457 -0
- package/vendor/docs/03-architecture/installer-flow.md +151 -0
- package/vendor/docs/03-architecture/installer.md +445 -0
- package/vendor/docs/03-architecture/management-flow.md +288 -0
- package/vendor/docs/03-architecture/nginx-configuration.md +830 -0
- package/vendor/docs/03-architecture/onboarding-flow.md +164 -0
- package/vendor/docs/03-architecture/overview.md +541 -0
- package/vendor/docs/03-architecture/panel-client.md +416 -0
- package/vendor/docs/03-architecture/panel-server.md +695 -0
- package/vendor/docs/03-architecture/state-management.md +529 -0
- package/vendor/docs/03-architecture/system-overview.md +167 -0
- package/vendor/docs/04-api-reference/certificates.md +1141 -0
- package/vendor/docs/04-api-reference/gatekeeper.md +592 -0
- package/vendor/docs/04-api-reference/onboarding.md +473 -0
- package/vendor/docs/04-api-reference/overview.md +404 -0
- package/vendor/docs/04-api-reference/services.md +267 -0
- package/vendor/docs/04-api-reference/settings.md +343 -0
- package/vendor/docs/04-api-reference/sites.md +716 -0
- package/vendor/docs/04-api-reference/system.md +268 -0
- package/vendor/docs/04-api-reference/tickets.md +618 -0
- package/vendor/docs/04-api-reference/tunnels.md +417 -0
- package/vendor/docs/04-api-reference/users.md +333 -0
- package/vendor/docs/05-operations/backup-and-restore.md +342 -0
- package/vendor/docs/05-operations/monitoring.md +285 -0
- package/vendor/docs/05-operations/uninstalling.md +344 -0
- package/vendor/docs/05-operations/upgrades.md +270 -0
- package/vendor/docs/06-reference/config-files.md +1080 -0
- package/vendor/docs/06-reference/glossary.md +528 -0
- package/vendor/docs/06-reference/installer-flags.md +260 -0
- package/vendor/docs/06-reference/ports-and-services.md +244 -0
- package/vendor/docs/06-reference/troubleshooting.md +665 -0
- package/vendor/docs/_index.json +233 -0
- package/vendor/docs/gatekeeper-design.md +953 -0
- package/vendor/docs/package.json +15 -0
- package/vendor/docs/todo/lib-cli-desktop-refactor.md +641 -0
- package/vendor/gatekeeper/dist/boot.d.ts +1 -0
- package/vendor/gatekeeper/dist/boot.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/boot.js +17 -0
- package/vendor/gatekeeper/dist/boot.js.map +1 -0
- package/vendor/gatekeeper/dist/cli/commands/access.d.ts +2 -0
- package/vendor/gatekeeper/dist/cli/commands/access.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/cli/commands/access.js +33 -0
- package/vendor/gatekeeper/dist/cli/commands/access.js.map +1 -0
- package/vendor/gatekeeper/dist/cli/commands/grants.d.ts +2 -0
- package/vendor/gatekeeper/dist/cli/commands/grants.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/cli/commands/grants.js +110 -0
- package/vendor/gatekeeper/dist/cli/commands/grants.js.map +1 -0
- package/vendor/gatekeeper/dist/cli/commands/groups.d.ts +2 -0
- package/vendor/gatekeeper/dist/cli/commands/groups.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/cli/commands/groups.js +98 -0
- package/vendor/gatekeeper/dist/cli/commands/groups.js.map +1 -0
- package/vendor/gatekeeper/dist/cli/index.d.ts +3 -0
- package/vendor/gatekeeper/dist/cli/index.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/cli/index.js +45 -0
- package/vendor/gatekeeper/dist/cli/index.js.map +1 -0
- package/vendor/gatekeeper/dist/index.d.ts +9 -0
- package/vendor/gatekeeper/dist/index.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/index.js +13 -0
- package/vendor/gatekeeper/dist/index.js.map +1 -0
- package/vendor/gatekeeper/dist/lib/authz.d.ts +16 -0
- package/vendor/gatekeeper/dist/lib/authz.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/authz.js +42 -0
- package/vendor/gatekeeper/dist/lib/authz.js.map +1 -0
- package/vendor/gatekeeper/dist/lib/cache-bust.d.ts +15 -0
- package/vendor/gatekeeper/dist/lib/cache-bust.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/cache-bust.js +19 -0
- package/vendor/gatekeeper/dist/lib/cache-bust.js.map +1 -0
- package/vendor/gatekeeper/dist/lib/constants.d.ts +82 -0
- package/vendor/gatekeeper/dist/lib/constants.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/constants.js +79 -0
- package/vendor/gatekeeper/dist/lib/constants.js.map +1 -0
- package/vendor/gatekeeper/dist/lib/grants.d.ts +32 -0
- package/vendor/gatekeeper/dist/lib/grants.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/grants.js +314 -0
- package/vendor/gatekeeper/dist/lib/grants.js.map +1 -0
- package/vendor/gatekeeper/dist/lib/groups.d.ts +10 -0
- package/vendor/gatekeeper/dist/lib/groups.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/groups.js +247 -0
- package/vendor/gatekeeper/dist/lib/groups.js.map +1 -0
- package/vendor/gatekeeper/dist/lib/migration.d.ts +17 -0
- package/vendor/gatekeeper/dist/lib/migration.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/migration.js +79 -0
- package/vendor/gatekeeper/dist/lib/migration.js.map +1 -0
- package/vendor/gatekeeper/dist/lib/migrations/gatekeeper/0001_groups.sql +7 -0
- package/vendor/gatekeeper/dist/lib/migrations/gatekeeper/0002_access_grants.sql +14 -0
- package/vendor/gatekeeper/dist/lib/migrations/gatekeeper/0003_access_request_log.sql +9 -0
- package/vendor/gatekeeper/dist/lib/migrations/migrations/gatekeeper/0001_groups.sql +7 -0
- package/vendor/gatekeeper/dist/lib/migrations/migrations/gatekeeper/0002_access_grants.sql +14 -0
- package/vendor/gatekeeper/dist/lib/migrations/migrations/gatekeeper/0003_access_request_log.sql +9 -0
- package/vendor/gatekeeper/dist/lib/state-db.d.ts +16 -0
- package/vendor/gatekeeper/dist/lib/state-db.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/state-db.js +154 -0
- package/vendor/gatekeeper/dist/lib/state-db.js.map +1 -0
- package/vendor/gatekeeper/dist/lib/templates.d.ts +21 -0
- package/vendor/gatekeeper/dist/lib/templates.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/templates.js +151 -0
- package/vendor/gatekeeper/dist/lib/templates.js.map +1 -0
- package/vendor/gatekeeper/dist/lib/types.d.ts +178 -0
- package/vendor/gatekeeper/dist/lib/types.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/types.js +2 -0
- package/vendor/gatekeeper/dist/lib/types.js.map +1 -0
- package/vendor/gatekeeper/dist/server/index.d.ts +15 -0
- package/vendor/gatekeeper/dist/server/index.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/server/index.js +251 -0
- package/vendor/gatekeeper/dist/server/index.js.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/access-request.d.ts +7 -0
- package/vendor/gatekeeper/dist/server/routes/access-request.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/access-request.js +17 -0
- package/vendor/gatekeeper/dist/server/routes/access-request.js.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/authz.d.ts +3 -0
- package/vendor/gatekeeper/dist/server/routes/authz.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/authz.js +279 -0
- package/vendor/gatekeeper/dist/server/routes/authz.js.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/diagnostic.d.ts +13 -0
- package/vendor/gatekeeper/dist/server/routes/diagnostic.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/diagnostic.js +249 -0
- package/vendor/gatekeeper/dist/server/routes/diagnostic.js.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/grants.d.ts +3 -0
- package/vendor/gatekeeper/dist/server/routes/grants.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/grants.js +112 -0
- package/vendor/gatekeeper/dist/server/routes/grants.js.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/groups.d.ts +3 -0
- package/vendor/gatekeeper/dist/server/routes/groups.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/groups.js +139 -0
- package/vendor/gatekeeper/dist/server/routes/groups.js.map +1 -0
- package/vendor/gatekeeper/package.json +49 -0
- package/vendor/server/bin/lamaste-server.js +204 -0
- package/vendor/server/package.json +31 -0
- package/vendor/server/src/commands/certs.js +224 -0
- package/vendor/server/src/commands/chisel.js +132 -0
- package/vendor/server/src/commands/logs.js +49 -0
- package/vendor/server/src/commands/plugins.js +321 -0
- package/vendor/server/src/commands/reset-admin.js +478 -0
- package/vendor/server/src/commands/restart.js +94 -0
- package/vendor/server/src/commands/sites.js +257 -0
- package/vendor/server/src/commands/status.js +158 -0
- package/vendor/server/src/commands/tunnels.js +365 -0
- package/vendor/server/src/commands/uninstall.js +326 -0
- package/vendor/server/src/config.js +38 -0
- package/vendor/server/src/exec.js +26 -0
- package/vendor/server/src/logger.js +39 -0
- package/vendor/server/src/ndjson.js +56 -0
- package/vendor/server/src/panel-api.js +85 -0
- package/vendor/server/src/state.js +45 -0
- package/vendor/server-ui/dist/assets/index-B0nWuUyL.js +257 -0
- package/vendor/server-ui/dist/assets/index-BqWWFlTU.css +1 -0
- package/vendor/server-ui/dist/index.html +13 -0
- package/vendor/serverd/package.json +44 -0
- package/vendor/serverd/src/boot.js +13 -0
- package/vendor/serverd/src/index.js +191 -0
- package/vendor/serverd/src/lib/app-error.js +14 -0
- package/vendor/serverd/src/lib/authelia.js +85 -0
- package/vendor/serverd/src/lib/certbot.js +74 -0
- package/vendor/serverd/src/lib/chisel-args.js +6 -0
- package/vendor/serverd/src/lib/chisel-reconcile.js +232 -0
- package/vendor/serverd/src/lib/chisel-runtime.js +46 -0
- package/vendor/serverd/src/lib/chisel-users.js +109 -0
- package/vendor/serverd/src/lib/chisel.js +81 -0
- package/vendor/serverd/src/lib/config.js +190 -0
- package/vendor/serverd/src/lib/constants.js +8 -0
- package/vendor/serverd/src/lib/csr-signing.js +331 -0
- package/vendor/serverd/src/lib/enrollment.js +302 -0
- package/vendor/serverd/src/lib/files.js +19 -0
- package/vendor/serverd/src/lib/gatekeeper-client.js +135 -0
- package/vendor/serverd/src/lib/invite-page.js +281 -0
- package/vendor/serverd/src/lib/ip-utils.js +79 -0
- package/vendor/serverd/src/lib/migrations/state/0001_enrollment_tokens.sql +17 -0
- package/vendor/serverd/src/lib/migrations/state/0002_tickets.sql +70 -0
- package/vendor/serverd/src/lib/migrations/state/0003_plugins.sql +15 -0
- package/vendor/serverd/src/lib/migrations/state/0004_agents.sql +19 -0
- package/vendor/serverd/src/lib/mtls.js +795 -0
- package/vendor/serverd/src/lib/nginx.js +1090 -0
- package/vendor/serverd/src/lib/pki-paths.js +41 -0
- package/vendor/serverd/src/lib/pki-sign.js +103 -0
- package/vendor/serverd/src/lib/plugins.js +538 -0
- package/vendor/serverd/src/lib/push-install.js +390 -0
- package/vendor/serverd/src/lib/revocation.js +112 -0
- package/vendor/serverd/src/lib/services.js +131 -0
- package/vendor/serverd/src/lib/session.js +151 -0
- package/vendor/serverd/src/lib/state-db.js +130 -0
- package/vendor/serverd/src/lib/state.js +140 -0
- package/vendor/serverd/src/lib/storage.js +63 -0
- package/vendor/serverd/src/lib/system-stats.js +58 -0
- package/vendor/serverd/src/lib/tickets.js +1556 -0
- package/vendor/serverd/src/lib/totp.js +76 -0
- package/vendor/serverd/src/lib/tunnel-deps.js +41 -0
- package/vendor/serverd/src/lib/user-access-session.js +142 -0
- package/vendor/serverd/src/lib/user-access.js +52 -0
- package/vendor/serverd/src/middleware/errors.js +63 -0
- package/vendor/serverd/src/middleware/mtls.js +120 -0
- package/vendor/serverd/src/middleware/onboarding-guard.js +30 -0
- package/vendor/serverd/src/middleware/role-guard.js +58 -0
- package/vendor/serverd/src/middleware/twofa-session.js +65 -0
- package/vendor/serverd/src/middleware/user-access-session.js +52 -0
- package/vendor/serverd/src/routes/enrollment.js +120 -0
- package/vendor/serverd/src/routes/health.js +22 -0
- package/vendor/serverd/src/routes/invite.js +163 -0
- package/vendor/serverd/src/routes/management/agents.js +182 -0
- package/vendor/serverd/src/routes/management/certs.js +911 -0
- package/vendor/serverd/src/routes/management/gatekeeper-proxy.js +160 -0
- package/vendor/serverd/src/routes/management/identity.js +107 -0
- package/vendor/serverd/src/routes/management/invitations.js +166 -0
- package/vendor/serverd/src/routes/management/logs.js +218 -0
- package/vendor/serverd/src/routes/management/plugins.js +560 -0
- package/vendor/serverd/src/routes/management/services.js +63 -0
- package/vendor/serverd/src/routes/management/settings.js +325 -0
- package/vendor/serverd/src/routes/management/sites.js +522 -0
- package/vendor/serverd/src/routes/management/storage.js +192 -0
- package/vendor/serverd/src/routes/management/system.js +201 -0
- package/vendor/serverd/src/routes/management/tickets.js +457 -0
- package/vendor/serverd/src/routes/management/tunnels.js +709 -0
- package/vendor/serverd/src/routes/management/users.js +377 -0
- package/vendor/serverd/src/routes/management.js +36 -0
- package/vendor/serverd/src/routes/onboarding/dns.js +101 -0
- package/vendor/serverd/src/routes/onboarding/domain.js +42 -0
- package/vendor/serverd/src/routes/onboarding/index.js +18 -0
- package/vendor/serverd/src/routes/onboarding/provision.js +327 -0
- package/vendor/serverd/src/routes/onboarding/status.js +12 -0
- package/vendor/serverd/src/routes/plugin-router.js +79 -0
- package/vendor/serverd/src/routes/user-access.js +389 -0
|
@@ -0,0 +1,592 @@
|
|
|
1
|
+
# Gatekeeper API
|
|
2
|
+
|
|
3
|
+
> Endpoints for managing Gatekeeper authorization: groups, grants, access checks, diagnostics, and settings. All proxied endpoints go through the lamalibre-lamaste-serverd at `/api/gatekeeper/*`.
|
|
4
|
+
|
|
5
|
+
## Authentication
|
|
6
|
+
|
|
7
|
+
All Gatekeeper endpoints proxied through the panel require admin mTLS authentication. The internal `authz/check` endpoint on `127.0.0.1:9294` is called by nginx only and is not exposed externally.
|
|
8
|
+
|
|
9
|
+
If the Gatekeeper service is unavailable, proxied endpoints return `503 Service Unavailable`.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Groups
|
|
14
|
+
|
|
15
|
+
### Create Group
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
POST /api/gatekeeper/groups
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Auth:** Admin only
|
|
22
|
+
|
|
23
|
+
Create a new Gatekeeper group.
|
|
24
|
+
|
|
25
|
+
**Request body:**
|
|
26
|
+
|
|
27
|
+
| Field | Type | Required | Description |
|
|
28
|
+
| ------------- | ------ | -------- | --------------------------------------------------------- |
|
|
29
|
+
| `name` | string | Yes | Group name (2-63 chars, lowercase alphanumeric + hyphens) |
|
|
30
|
+
| `description` | string | No | Human-readable description |
|
|
31
|
+
| `createdBy` | string | No | Creator identifier |
|
|
32
|
+
|
|
33
|
+
**Response (201):**
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"ok": true,
|
|
38
|
+
"group": {
|
|
39
|
+
"name": "engineering",
|
|
40
|
+
"description": "Engineering team",
|
|
41
|
+
"createdBy": "admin",
|
|
42
|
+
"members": [],
|
|
43
|
+
"createdAt": "2026-04-04T12:00:00.000Z"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Errors:** 400 (invalid name format), 409 (group already exists), 503 (Gatekeeper unavailable)
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
### List Groups
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
GET /api/gatekeeper/groups
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Auth:** Admin only
|
|
59
|
+
|
|
60
|
+
Returns all groups.
|
|
61
|
+
|
|
62
|
+
**Response (200):**
|
|
63
|
+
|
|
64
|
+
```json
|
|
65
|
+
{
|
|
66
|
+
"groups": [
|
|
67
|
+
{
|
|
68
|
+
"name": "engineering",
|
|
69
|
+
"description": "Engineering team",
|
|
70
|
+
"createdBy": "admin",
|
|
71
|
+
"members": ["alice", "bob"],
|
|
72
|
+
"createdAt": "2026-04-04T12:00:00.000Z"
|
|
73
|
+
}
|
|
74
|
+
]
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
### Get Group
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
GET /api/gatekeeper/groups/:name
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**Auth:** Admin only
|
|
87
|
+
|
|
88
|
+
Returns a single group with its members.
|
|
89
|
+
|
|
90
|
+
**Response (200):**
|
|
91
|
+
|
|
92
|
+
```json
|
|
93
|
+
{
|
|
94
|
+
"group": {
|
|
95
|
+
"name": "engineering",
|
|
96
|
+
"description": "Engineering team",
|
|
97
|
+
"createdBy": "admin",
|
|
98
|
+
"members": ["alice", "bob"],
|
|
99
|
+
"createdAt": "2026-04-04T12:00:00.000Z"
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**Errors:** 404 (group not found)
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
### Update Group
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
PATCH /api/gatekeeper/groups/:name
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**Auth:** Admin only
|
|
115
|
+
|
|
116
|
+
Update a group's name or description.
|
|
117
|
+
|
|
118
|
+
**Request body:**
|
|
119
|
+
|
|
120
|
+
| Field | Type | Required | Description |
|
|
121
|
+
| ------------- | ------ | -------- | ------------------------------------------------------------- |
|
|
122
|
+
| `name` | string | No | New group name (2-63 chars, lowercase alphanumeric + hyphens) |
|
|
123
|
+
| `description` | string | No | New description |
|
|
124
|
+
|
|
125
|
+
**Response (200):**
|
|
126
|
+
|
|
127
|
+
```json
|
|
128
|
+
{
|
|
129
|
+
"ok": true,
|
|
130
|
+
"group": {
|
|
131
|
+
"name": "eng",
|
|
132
|
+
"description": "Updated description",
|
|
133
|
+
"createdBy": "admin",
|
|
134
|
+
"members": ["alice", "bob"],
|
|
135
|
+
"createdAt": "2026-04-04T12:00:00.000Z"
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**Errors:** 400 (invalid name format), 404 (group not found), 409 (new name conflicts with existing group)
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
### Delete Group
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
DELETE /api/gatekeeper/groups/:name
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
**Auth:** Admin only
|
|
151
|
+
|
|
152
|
+
Delete a group. Any grants referencing this group as a principal are automatically revoked.
|
|
153
|
+
|
|
154
|
+
**Response (200):**
|
|
155
|
+
|
|
156
|
+
```json
|
|
157
|
+
{
|
|
158
|
+
"ok": true,
|
|
159
|
+
"deletedGrants": 3
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**Errors:** 404 (group not found)
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
### Add Members
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
POST /api/gatekeeper/groups/:name/members
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**Auth:** Admin only
|
|
174
|
+
|
|
175
|
+
Add one or more members to a group.
|
|
176
|
+
|
|
177
|
+
**Request body:**
|
|
178
|
+
|
|
179
|
+
| Field | Type | Required | Description |
|
|
180
|
+
| ----------- | -------- | -------- | ----------------------------------- |
|
|
181
|
+
| `usernames` | string[] | Yes | Usernames to add (1-50 per request) |
|
|
182
|
+
|
|
183
|
+
**Response (201):**
|
|
184
|
+
|
|
185
|
+
```json
|
|
186
|
+
{
|
|
187
|
+
"ok": true,
|
|
188
|
+
"group": {
|
|
189
|
+
"name": "engineering",
|
|
190
|
+
"description": "Engineering team",
|
|
191
|
+
"createdBy": "admin",
|
|
192
|
+
"members": ["alice", "bob", "carol"],
|
|
193
|
+
"createdAt": "2026-04-04T12:00:00.000Z"
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**Errors:** 400 (invalid or empty usernames array), 404 (group not found)
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
### Remove Member
|
|
203
|
+
|
|
204
|
+
```
|
|
205
|
+
DELETE /api/gatekeeper/groups/:name/members/:username
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
**Auth:** Admin only
|
|
209
|
+
|
|
210
|
+
Remove a single member from a group.
|
|
211
|
+
|
|
212
|
+
**Response (200):**
|
|
213
|
+
|
|
214
|
+
```json
|
|
215
|
+
{
|
|
216
|
+
"ok": true,
|
|
217
|
+
"group": {
|
|
218
|
+
"name": "engineering",
|
|
219
|
+
"description": "Engineering team",
|
|
220
|
+
"createdBy": "admin",
|
|
221
|
+
"members": ["alice", "bob"],
|
|
222
|
+
"createdAt": "2026-04-04T12:00:00.000Z"
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
**Errors:** 404 (group not found, or username not a member)
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Grants
|
|
232
|
+
|
|
233
|
+
### Create Grant
|
|
234
|
+
|
|
235
|
+
```
|
|
236
|
+
POST /api/gatekeeper/grants
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
**Auth:** Admin only
|
|
240
|
+
|
|
241
|
+
Create a new authorization grant linking a principal (user or group) to a resource.
|
|
242
|
+
|
|
243
|
+
**Request body:**
|
|
244
|
+
|
|
245
|
+
| Field | Type | Required | Description |
|
|
246
|
+
| --------------- | ------ | -------- | ----------------------------------------- |
|
|
247
|
+
| `principalType` | string | Yes | `"user"` or `"group"` |
|
|
248
|
+
| `principalId` | string | Yes | Username or group name |
|
|
249
|
+
| `resourceType` | string | Yes | Type of resource being granted access to |
|
|
250
|
+
| `resourceId` | string | Yes | Identifier of the specific resource |
|
|
251
|
+
| `context` | object | No | Additional context metadata for the grant |
|
|
252
|
+
|
|
253
|
+
**Response (201):**
|
|
254
|
+
|
|
255
|
+
```json
|
|
256
|
+
{
|
|
257
|
+
"ok": true,
|
|
258
|
+
"grant": {
|
|
259
|
+
"grantId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
|
260
|
+
"principalType": "group",
|
|
261
|
+
"principalId": "engineering",
|
|
262
|
+
"resourceType": "site",
|
|
263
|
+
"resourceId": "docs.example.com",
|
|
264
|
+
"context": null,
|
|
265
|
+
"used": false,
|
|
266
|
+
"createdAt": "2026-04-04T12:00:00.000Z"
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
**Errors:** 400 (invalid body), 409 (duplicate grant), 503 (Gatekeeper unavailable)
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
### List Grants
|
|
276
|
+
|
|
277
|
+
```
|
|
278
|
+
GET /api/gatekeeper/grants
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**Auth:** Admin only
|
|
282
|
+
|
|
283
|
+
Returns all grants, optionally filtered by query parameters.
|
|
284
|
+
|
|
285
|
+
**Query parameters:**
|
|
286
|
+
|
|
287
|
+
| Parameter | Type | Description |
|
|
288
|
+
| --------------- | ------- | -------------------------------- |
|
|
289
|
+
| `principalType` | string | Filter by `"user"` or `"group"` |
|
|
290
|
+
| `principalId` | string | Filter by username or group name |
|
|
291
|
+
| `resourceType` | string | Filter by resource type |
|
|
292
|
+
| `resourceId` | string | Filter by resource identifier |
|
|
293
|
+
| `used` | boolean | Filter by usage status |
|
|
294
|
+
|
|
295
|
+
**Response (200):**
|
|
296
|
+
|
|
297
|
+
```json
|
|
298
|
+
{
|
|
299
|
+
"grants": [
|
|
300
|
+
{
|
|
301
|
+
"grantId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
|
302
|
+
"principalType": "group",
|
|
303
|
+
"principalId": "engineering",
|
|
304
|
+
"resourceType": "site",
|
|
305
|
+
"resourceId": "docs.example.com",
|
|
306
|
+
"context": null,
|
|
307
|
+
"used": false,
|
|
308
|
+
"createdAt": "2026-04-04T12:00:00.000Z"
|
|
309
|
+
}
|
|
310
|
+
]
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
### Get Grant
|
|
317
|
+
|
|
318
|
+
```
|
|
319
|
+
GET /api/gatekeeper/grants/:grantId
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
**Auth:** Admin only
|
|
323
|
+
|
|
324
|
+
Returns a single grant by ID.
|
|
325
|
+
|
|
326
|
+
**Response (200):**
|
|
327
|
+
|
|
328
|
+
```json
|
|
329
|
+
{
|
|
330
|
+
"grant": {
|
|
331
|
+
"grantId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
|
332
|
+
"principalType": "user",
|
|
333
|
+
"principalId": "alice",
|
|
334
|
+
"resourceType": "site",
|
|
335
|
+
"resourceId": "docs.example.com",
|
|
336
|
+
"context": null,
|
|
337
|
+
"used": true,
|
|
338
|
+
"createdAt": "2026-04-04T12:00:00.000Z"
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
**Errors:** 404 (grant not found)
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
### Revoke Grant
|
|
348
|
+
|
|
349
|
+
```
|
|
350
|
+
DELETE /api/gatekeeper/grants/:grantId
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
**Auth:** Admin only
|
|
354
|
+
|
|
355
|
+
Revoke an existing grant.
|
|
356
|
+
|
|
357
|
+
**Response (200):**
|
|
358
|
+
|
|
359
|
+
```json
|
|
360
|
+
{
|
|
361
|
+
"ok": true,
|
|
362
|
+
"grant": {
|
|
363
|
+
"grantId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
|
364
|
+
"principalType": "user",
|
|
365
|
+
"principalId": "alice",
|
|
366
|
+
"resourceType": "site",
|
|
367
|
+
"resourceId": "docs.example.com",
|
|
368
|
+
"context": null,
|
|
369
|
+
"used": false,
|
|
370
|
+
"createdAt": "2026-04-04T12:00:00.000Z"
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
**Errors:** 404 (grant not found), 409 (grant already revoked or in conflicting state)
|
|
376
|
+
|
|
377
|
+
---
|
|
378
|
+
|
|
379
|
+
## Diagnostics and Settings
|
|
380
|
+
|
|
381
|
+
### Check Access
|
|
382
|
+
|
|
383
|
+
```
|
|
384
|
+
GET /api/gatekeeper/access/check
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
**Auth:** Admin only
|
|
388
|
+
|
|
389
|
+
Test whether a user has access to a specific resource. Useful for debugging authorization decisions without making real requests.
|
|
390
|
+
|
|
391
|
+
**Query parameters:**
|
|
392
|
+
|
|
393
|
+
| Parameter | Type | Required | Description |
|
|
394
|
+
| -------------- | ------ | -------- | -------------------------- |
|
|
395
|
+
| `username` | string | Yes | Username to check |
|
|
396
|
+
| `resourceType` | string | Yes | Type of resource |
|
|
397
|
+
| `resourceId` | string | Yes | Identifier of the resource |
|
|
398
|
+
|
|
399
|
+
**Response (200) -- access granted:**
|
|
400
|
+
|
|
401
|
+
```json
|
|
402
|
+
{
|
|
403
|
+
"allowed": true
|
|
404
|
+
}
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
**Response (200) -- access denied:**
|
|
408
|
+
|
|
409
|
+
```json
|
|
410
|
+
{
|
|
411
|
+
"allowed": false,
|
|
412
|
+
"resource": "site:docs.example.com",
|
|
413
|
+
"templates": []
|
|
414
|
+
}
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
The `templates` array contains any access request templates available for the denied resource.
|
|
418
|
+
|
|
419
|
+
**Errors:** 400 (missing required query parameters)
|
|
420
|
+
|
|
421
|
+
---
|
|
422
|
+
|
|
423
|
+
### Bust Cache
|
|
424
|
+
|
|
425
|
+
```
|
|
426
|
+
POST /api/gatekeeper/cache/bust
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
**Auth:** Admin only
|
|
430
|
+
|
|
431
|
+
Invalidate all cached authorization decisions. Use this after making changes to grants or groups that need to take effect immediately.
|
|
432
|
+
|
|
433
|
+
**Response (200):**
|
|
434
|
+
|
|
435
|
+
```json
|
|
436
|
+
{
|
|
437
|
+
"ok": true
|
|
438
|
+
}
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
---
|
|
442
|
+
|
|
443
|
+
### Get Settings
|
|
444
|
+
|
|
445
|
+
```
|
|
446
|
+
GET /api/gatekeeper/settings
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
**Auth:** Admin only
|
|
450
|
+
|
|
451
|
+
Returns the current Gatekeeper settings.
|
|
452
|
+
|
|
453
|
+
**Response (200):**
|
|
454
|
+
|
|
455
|
+
```json
|
|
456
|
+
{
|
|
457
|
+
"settings": {
|
|
458
|
+
"adminEmail": "admin@example.com",
|
|
459
|
+
"adminName": "Admin",
|
|
460
|
+
"slackChannel": null,
|
|
461
|
+
"teamsChannel": null,
|
|
462
|
+
"sessionCacheTtlMs": 300000,
|
|
463
|
+
"accessLoggingEnabled": true,
|
|
464
|
+
"accessLogRetentionDays": 30
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
---
|
|
470
|
+
|
|
471
|
+
### Update Settings
|
|
472
|
+
|
|
473
|
+
```
|
|
474
|
+
PATCH /api/gatekeeper/settings
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
**Auth:** Admin only
|
|
478
|
+
|
|
479
|
+
Update Gatekeeper settings. Only provided fields are changed; omitted fields remain unchanged.
|
|
480
|
+
|
|
481
|
+
**Request body:**
|
|
482
|
+
|
|
483
|
+
| Field | Type | Required | Description |
|
|
484
|
+
| ------------------------ | ------- | -------- | ------------------------------------------- |
|
|
485
|
+
| `adminEmail` | string | No | Admin contact email |
|
|
486
|
+
| `adminName` | string | No | Admin display name |
|
|
487
|
+
| `slackChannel` | string | No | Slack channel for notifications |
|
|
488
|
+
| `teamsChannel` | string | No | Microsoft Teams channel for notifications |
|
|
489
|
+
| `sessionCacheTtlMs` | number | No | Session cache TTL in milliseconds |
|
|
490
|
+
| `accessLoggingEnabled` | boolean | No | Enable or disable access logging |
|
|
491
|
+
| `accessLogRetentionDays` | number | No | Number of days to retain access log entries |
|
|
492
|
+
|
|
493
|
+
**Response (200):**
|
|
494
|
+
|
|
495
|
+
```json
|
|
496
|
+
{
|
|
497
|
+
"ok": true,
|
|
498
|
+
"settings": {
|
|
499
|
+
"adminEmail": "admin@example.com",
|
|
500
|
+
"adminName": "Admin",
|
|
501
|
+
"slackChannel": "#lamaste-alerts",
|
|
502
|
+
"teamsChannel": null,
|
|
503
|
+
"sessionCacheTtlMs": 300000,
|
|
504
|
+
"accessLoggingEnabled": true,
|
|
505
|
+
"accessLogRetentionDays": 30
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
**Errors:** 400 (invalid settings values)
|
|
511
|
+
|
|
512
|
+
---
|
|
513
|
+
|
|
514
|
+
### Get Access Log
|
|
515
|
+
|
|
516
|
+
```
|
|
517
|
+
GET /api/gatekeeper/access-log
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
**Auth:** Admin only
|
|
521
|
+
|
|
522
|
+
Returns access log entries for auditing authorization decisions.
|
|
523
|
+
|
|
524
|
+
**Query parameters:**
|
|
525
|
+
|
|
526
|
+
| Parameter | Type | Required | Description |
|
|
527
|
+
| --------- | ------ | -------- | ------------------------------------------------ |
|
|
528
|
+
| `limit` | number | No | Max entries to return (default varies, max 1000) |
|
|
529
|
+
| `offset` | number | No | Number of entries to skip |
|
|
530
|
+
|
|
531
|
+
**Response (200):**
|
|
532
|
+
|
|
533
|
+
```json
|
|
534
|
+
{
|
|
535
|
+
"entries": [
|
|
536
|
+
{
|
|
537
|
+
"timestamp": "2026-04-04T12:05:00.000Z",
|
|
538
|
+
"username": "alice",
|
|
539
|
+
"resourceType": "site",
|
|
540
|
+
"resourceId": "docs.example.com",
|
|
541
|
+
"allowed": true
|
|
542
|
+
}
|
|
543
|
+
],
|
|
544
|
+
"total": 142
|
|
545
|
+
}
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
---
|
|
549
|
+
|
|
550
|
+
### Clear Access Log
|
|
551
|
+
|
|
552
|
+
```
|
|
553
|
+
DELETE /api/gatekeeper/access-log
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
**Auth:** Admin only
|
|
557
|
+
|
|
558
|
+
Delete all access log entries.
|
|
559
|
+
|
|
560
|
+
**Response (200):**
|
|
561
|
+
|
|
562
|
+
```json
|
|
563
|
+
{
|
|
564
|
+
"ok": true
|
|
565
|
+
}
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
---
|
|
569
|
+
|
|
570
|
+
## Internal Endpoints
|
|
571
|
+
|
|
572
|
+
These endpoints are not proxied through the lamalibre-lamaste-serverd and are not accessible externally.
|
|
573
|
+
|
|
574
|
+
### Authorization Check (nginx auth_request)
|
|
575
|
+
|
|
576
|
+
```
|
|
577
|
+
GET /authz/check
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
**Host:** `127.0.0.1:9294`
|
|
581
|
+
|
|
582
|
+
This is the nginx `auth_request` target. nginx calls this endpoint on every request to a Gatekeeper-protected resource. It validates the user's Authelia session cookie and checks the corresponding grant.
|
|
583
|
+
|
|
584
|
+
**Response codes:**
|
|
585
|
+
|
|
586
|
+
| Status | Meaning | Description |
|
|
587
|
+
| ------ | ------- | --------------------------------------------------------------------------------- |
|
|
588
|
+
| 200 | Pass | User is authenticated and authorized; request proceeds |
|
|
589
|
+
| 401 | No auth | No valid Authelia session; nginx redirects to login |
|
|
590
|
+
| 403 | Denied | User is authenticated but lacks a grant; returns an HTML body with denial details |
|
|
591
|
+
|
|
592
|
+
This endpoint is bound to `127.0.0.1` only. External traffic never reaches it directly -- nginx forwards the subrequest internally.
|