@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.
Files changed (170) hide show
  1. package/package.json +2 -2
  2. package/scripts/lamaste-priv +234 -18
  3. package/src/index.js +1 -0
  4. package/src/lib/backend-cookie.js +65 -0
  5. package/src/lib/ip-panel-vhost.js +208 -0
  6. package/src/lib/service-config.js +5 -3
  7. package/src/tasks/nginx.js +18 -135
  8. package/src/tasks/redeploy.js +39 -1
  9. package/vendor/docs/00-introduction/how-it-works.md +2 -2
  10. package/vendor/docs/00-introduction/quickstart.md +5 -5
  11. package/vendor/docs/00-introduction/what-is-lamaste.md +5 -5
  12. package/vendor/docs/01-concepts/authentication.md +1 -1
  13. package/vendor/docs/01-concepts/authorization.md +66 -48
  14. package/vendor/docs/01-concepts/certificates.md +3 -3
  15. package/vendor/docs/01-concepts/mtls.md +2 -2
  16. package/vendor/docs/01-concepts/security-model.md +70 -33
  17. package/vendor/docs/01-concepts/tickets.md +2 -2
  18. package/vendor/docs/01-concepts/tunneling.md +4 -4
  19. package/vendor/docs/02-guides/agent-setup.md +5 -5
  20. package/vendor/docs/02-guides/certificate-management.md +2 -2
  21. package/vendor/docs/02-guides/cloud-provisioning.md +3 -3
  22. package/vendor/docs/02-guides/desktop-app-setup.md +10 -10
  23. package/vendor/docs/02-guides/installation.md +3 -3
  24. package/vendor/docs/02-guides/managing-users.md +113 -25
  25. package/vendor/docs/02-guides/onboarding.md +2 -2
  26. package/vendor/docs/02-guides/standalone-plugin-with-tickets.md +2 -2
  27. package/vendor/docs/02-guides/static-sites.md +4 -0
  28. package/vendor/docs/03-architecture/installer-flow.md +2 -2
  29. package/vendor/docs/03-architecture/installer.md +4 -4
  30. package/vendor/docs/03-architecture/management-flow.md +3 -1
  31. package/vendor/docs/03-architecture/nginx-configuration.md +229 -24
  32. package/vendor/docs/03-architecture/overview.md +13 -17
  33. package/vendor/docs/03-architecture/panel-client.md +6 -6
  34. package/vendor/docs/03-architecture/panel-server.md +3 -2
  35. package/vendor/docs/03-architecture/state-management.md +4 -8
  36. package/vendor/docs/03-architecture/system-overview.md +1 -1
  37. package/vendor/docs/04-api-reference/agent-hosted-plugins.md +378 -34
  38. package/vendor/docs/04-api-reference/app-host.md +3 -3
  39. package/vendor/docs/04-api-reference/gatekeeper.md +78 -5
  40. package/vendor/docs/04-api-reference/lifecycle-hooks.md +14 -12
  41. package/vendor/docs/04-api-reference/onboarding.md +1 -1
  42. package/vendor/docs/04-api-reference/registry-and-oidc.md +3 -3
  43. package/vendor/docs/04-api-reference/sites.md +4 -0
  44. package/vendor/docs/04-api-reference/tunnels.md +87 -47
  45. package/vendor/docs/04-api-reference/users.md +241 -45
  46. package/vendor/docs/05-operations/backup-and-restore.md +35 -26
  47. package/vendor/docs/05-operations/monitoring.md +39 -0
  48. package/vendor/docs/05-operations/uninstalling.md +2 -1
  49. package/vendor/docs/05-operations/upgrades.md +24 -6
  50. package/vendor/docs/06-reference/config-files.md +100 -202
  51. package/vendor/docs/06-reference/glossary.md +3 -3
  52. package/vendor/docs/06-reference/installer-flags.md +13 -13
  53. package/vendor/docs/06-reference/ports-and-services.md +25 -26
  54. package/vendor/docs/06-reference/troubleshooting.md +8 -8
  55. package/vendor/docs/gatekeeper-design.md +10 -8
  56. package/vendor/docs/identity-directory-design.md +48 -14
  57. package/vendor/docs/package.json +1 -1
  58. package/vendor/docs/todo/lib-cli-desktop-refactor.md +27 -27
  59. package/vendor/gatekeeper/dist/cli/index.js +0 -0
  60. package/vendor/gatekeeper/dist/index.d.ts +4 -3
  61. package/vendor/gatekeeper/dist/index.d.ts.map +1 -1
  62. package/vendor/gatekeeper/dist/index.js +4 -2
  63. package/vendor/gatekeeper/dist/index.js.map +1 -1
  64. package/vendor/gatekeeper/dist/lib/authz.d.ts +9 -0
  65. package/vendor/gatekeeper/dist/lib/authz.d.ts.map +1 -1
  66. package/vendor/gatekeeper/dist/lib/authz.js +31 -0
  67. package/vendor/gatekeeper/dist/lib/authz.js.map +1 -1
  68. package/vendor/gatekeeper/dist/lib/constants.d.ts +5 -2
  69. package/vendor/gatekeeper/dist/lib/constants.d.ts.map +1 -1
  70. package/vendor/gatekeeper/dist/lib/constants.js +5 -2
  71. package/vendor/gatekeeper/dist/lib/constants.js.map +1 -1
  72. package/vendor/gatekeeper/dist/lib/grants.d.ts +6 -0
  73. package/vendor/gatekeeper/dist/lib/grants.d.ts.map +1 -1
  74. package/vendor/gatekeeper/dist/lib/grants.js +6 -1
  75. package/vendor/gatekeeper/dist/lib/grants.js.map +1 -1
  76. package/vendor/gatekeeper/dist/lib/groups.d.ts +5 -0
  77. package/vendor/gatekeeper/dist/lib/groups.d.ts.map +1 -1
  78. package/vendor/gatekeeper/dist/lib/groups.js +5 -1
  79. package/vendor/gatekeeper/dist/lib/groups.js.map +1 -1
  80. package/vendor/gatekeeper/dist/lib/principals.d.ts +29 -0
  81. package/vendor/gatekeeper/dist/lib/principals.d.ts.map +1 -0
  82. package/vendor/gatekeeper/dist/lib/principals.js +67 -0
  83. package/vendor/gatekeeper/dist/lib/principals.js.map +1 -0
  84. package/vendor/gatekeeper/dist/lib/tunnels.d.ts +10 -0
  85. package/vendor/gatekeeper/dist/lib/tunnels.d.ts.map +1 -0
  86. package/vendor/gatekeeper/dist/lib/tunnels.js +56 -0
  87. package/vendor/gatekeeper/dist/lib/tunnels.js.map +1 -0
  88. package/vendor/gatekeeper/dist/server/index.d.ts +2 -1
  89. package/vendor/gatekeeper/dist/server/index.d.ts.map +1 -1
  90. package/vendor/gatekeeper/dist/server/index.js +49 -56
  91. package/vendor/gatekeeper/dist/server/index.js.map +1 -1
  92. package/vendor/gatekeeper/dist/server/routes/authz.d.ts +15 -1
  93. package/vendor/gatekeeper/dist/server/routes/authz.d.ts.map +1 -1
  94. package/vendor/gatekeeper/dist/server/routes/authz.js +332 -104
  95. package/vendor/gatekeeper/dist/server/routes/authz.js.map +1 -1
  96. package/vendor/gatekeeper/dist/server/routes/diagnostic.d.ts.map +1 -1
  97. package/vendor/gatekeeper/dist/server/routes/diagnostic.js +61 -4
  98. package/vendor/gatekeeper/dist/server/routes/diagnostic.js.map +1 -1
  99. package/vendor/gatekeeper/dist/server/routes/principals.d.ts +3 -0
  100. package/vendor/gatekeeper/dist/server/routes/principals.d.ts.map +1 -0
  101. package/vendor/gatekeeper/dist/server/routes/principals.js +27 -0
  102. package/vendor/gatekeeper/dist/server/routes/principals.js.map +1 -0
  103. package/vendor/gatekeeper/package.json +2 -2
  104. package/vendor/server/bin/lamaste-server.js +15 -1
  105. package/vendor/server/package.json +2 -2
  106. package/vendor/server/src/commands/plugin-identity.js +335 -0
  107. package/vendor/server/src/commands/plugin-web-surface.js +269 -0
  108. package/vendor/server/src/commands/plugins.js +156 -11
  109. package/vendor/server/src/commands/registry-credential.js +2 -1
  110. package/vendor/server/src/commands/sites.js +15 -1
  111. package/vendor/server/src/commands/tunnels.js +102 -2
  112. package/vendor/server/src/commands/uninstall.js +3 -1
  113. package/vendor/server/src/commands/users.js +358 -0
  114. package/vendor/server/src/plugin-approval.js +186 -5
  115. package/vendor/server/src/plugin-identity.js +382 -0
  116. package/vendor/server/src/plugin-web-surface.js +307 -0
  117. package/vendor/server-ui/dist/assets/index-BZwQ_aQc.css +1 -0
  118. package/vendor/server-ui/dist/assets/index-BvEfCZYS.js +84 -0
  119. package/vendor/server-ui/dist/index.html +2 -2
  120. package/vendor/serverd/package.json +2 -2
  121. package/vendor/serverd/src/index.js +34 -5
  122. package/vendor/serverd/src/lib/audience.js +576 -0
  123. package/vendor/serverd/src/lib/authelia.js +78 -7
  124. package/vendor/serverd/src/lib/chisel-runtime.js +18 -6
  125. package/vendor/serverd/src/lib/chisel.js +10 -2
  126. package/vendor/serverd/src/lib/config.js +68 -43
  127. package/vendor/serverd/src/lib/directory.js +1113 -0
  128. package/vendor/serverd/src/lib/entitlements.js +517 -0
  129. package/vendor/serverd/src/lib/gatekeeper-client.js +226 -10
  130. package/vendor/serverd/src/lib/hook-pipelines.js +21 -3
  131. package/vendor/serverd/src/lib/identity-sync.js +905 -0
  132. package/vendor/serverd/src/lib/migrations/state/0013_identity_directory.sql +158 -0
  133. package/vendor/serverd/src/lib/migrations/state/0014_identity_ledger.sql +20 -0
  134. package/vendor/serverd/src/lib/migrations/state/0015_plugin_web_surface.sql +14 -0
  135. package/vendor/serverd/src/lib/mtls.js +6 -2
  136. package/vendor/serverd/src/lib/nginx.js +546 -48
  137. package/vendor/serverd/src/lib/plugin-hooks.js +127 -45
  138. package/vendor/serverd/src/lib/plugin-hosting.js +33 -5
  139. package/vendor/serverd/src/lib/plugin-lifecycle.js +227 -13
  140. package/vendor/serverd/src/lib/plugin-packages.js +74 -2
  141. package/vendor/serverd/src/lib/plugins.js +95 -7
  142. package/vendor/serverd/src/lib/registry-credential.js +9 -6
  143. package/vendor/serverd/src/lib/request-logging.js +19 -0
  144. package/vendor/serverd/src/lib/retained-data.js +50 -4
  145. package/vendor/serverd/src/lib/state.js +36 -0
  146. package/vendor/serverd/src/lib/tunnel-hooks.js +4 -1
  147. package/vendor/serverd/src/lib/user-access-session.js +21 -11
  148. package/vendor/serverd/src/lib/user-caller.js +67 -0
  149. package/vendor/serverd/src/lib/user-surface.js +754 -0
  150. package/vendor/serverd/src/lib/vhost-reconcile.js +137 -33
  151. package/vendor/serverd/src/lib/web-surface.js +766 -0
  152. package/vendor/serverd/src/middleware/user-access-session.js +9 -0
  153. package/vendor/serverd/src/routes/agent-forwarder.js +4 -2
  154. package/vendor/serverd/src/routes/invite.js +53 -12
  155. package/vendor/serverd/src/routes/management/gatekeeper-proxy.js +107 -16
  156. package/vendor/serverd/src/routes/management/identity-directory.js +79 -0
  157. package/vendor/serverd/src/routes/management/invitations.js +78 -68
  158. package/vendor/serverd/src/routes/management/plugin-identity.js +221 -0
  159. package/vendor/serverd/src/routes/management/plugin-web-surface.js +151 -0
  160. package/vendor/serverd/src/routes/management/plugins.js +2 -0
  161. package/vendor/serverd/src/routes/management/registry-credential.js +1 -1
  162. package/vendor/serverd/src/routes/management/sites.js +143 -65
  163. package/vendor/serverd/src/routes/management/tunnels.js +109 -22
  164. package/vendor/serverd/src/routes/management/users.js +290 -208
  165. package/vendor/serverd/src/routes/management.js +6 -0
  166. package/vendor/serverd/src/routes/onboarding/provision.js +14 -1
  167. package/vendor/serverd/src/routes/user-access.js +17 -4
  168. package/vendor/serverd/src/routes/user-surface.js +69 -0
  169. package/vendor/server-ui/dist/assets/index-25wo_8av.css +0 -1
  170. package/vendor/server-ui/dist/assets/index-roDHz3dM.js +0 -84
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>Lamaste</title>
7
- <script type="module" crossorigin src="/assets/index-roDHz3dM.js"></script>
8
- <link rel="stylesheet" crossorigin href="/assets/index-25wo_8av.css">
7
+ <script type="module" crossorigin src="/assets/index-BvEfCZYS.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-BZwQ_aQc.css">
9
9
  </head>
10
10
  <body style="background-color: #09090b">
11
11
  <div id="root"></div>
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lamalibre/lamaste-serverd",
3
- "version": "4.4.1",
3
+ "version": "4.6.0",
4
4
  "description": "Lamaste server daemon — REST API and plugin host",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "publishConfig": {
@@ -29,7 +29,7 @@
29
29
  "@fastify/rate-limit": "^10.3.0",
30
30
  "@fastify/static": "^9.1.1",
31
31
  "@fastify/websocket": "^11.0.0",
32
- "@lamalibre/lamaste": "^4.4.1",
32
+ "@lamalibre/lamaste": "^4.6.0",
33
33
  "bcryptjs": "^3.0.3",
34
34
  "execa": "^9.6.1",
35
35
  "fastify": "^5.8.4",
@@ -8,7 +8,9 @@ import fastifyStatic from '@fastify/static';
8
8
  import websocket from '@fastify/websocket';
9
9
  import path from 'node:path';
10
10
  import { fileURLToPath } from 'node:url';
11
+ import { logRequestMetadata } from '@lamalibre/lamaste';
11
12
  import { loadConfig } from './lib/config.js';
13
+ import { panelRequestLogOptions } from './lib/request-logging.js';
12
14
  import mtlsMiddleware from './middleware/mtls.js';
13
15
  import twofaSession from './middleware/twofa-session.js';
14
16
  import roleGuard from './middleware/role-guard.js';
@@ -18,6 +20,7 @@ import onboardingRoutes from './routes/onboarding/index.js';
18
20
  import managementRoutes from './routes/management.js';
19
21
  import pluginRouter from './routes/plugin-router.js';
20
22
  import agentForwarderRoutes from './routes/agent-forwarder.js';
23
+ import userSurfaceContext from './routes/user-surface.js';
21
24
  import inviteRoutes from './routes/invite.js';
22
25
  import enrollmentRoutes from './routes/enrollment.js';
23
26
  import {
@@ -38,9 +41,11 @@ import {
38
41
  stopHostedPluginHealthMonitor,
39
42
  } from './lib/plugin-hosting.js';
40
43
  import { refreshHostedPluginSettings } from './lib/plugin-settings.js';
44
+ import { startIdentityServices, stopIdentityServices } from './lib/identity-sync.js';
41
45
  import { syncOidcClients } from './lib/plugin-oidc.js';
42
46
  import { ensureRelaySigningKey } from './lib/relay-signing.js';
43
47
  import { reconcileSiteVhosts, reconcileTunnelVhosts } from './lib/vhost-reconcile.js';
48
+ import { reconcileWebSurfaces } from './lib/web-surface.js';
44
49
  import {
45
50
  loadTicketScopeCapabilities,
46
51
  checkInstanceLiveness,
@@ -73,12 +78,19 @@ async function start() {
73
78
 
74
79
  const server = Fastify({
75
80
  logger: true,
81
+ // Fastify's own request lines carry every URL with its query and the
82
+ // client address; one metadata line per request replaces them (below).
83
+ disableRequestLogging: true,
76
84
  // Behind the local nginx: trust exactly that one loopback hop, so
77
85
  // request.ip is the client address nginx appended to X-Forwarded-For —
78
86
  // not a value the client sent, and nothing from a non-local peer.
79
87
  trustProxy: trustLocalNginxHop,
80
88
  });
81
89
 
90
+ // One metadata line per request, never a URL or a person's address
91
+ // (lib/request-logging.js).
92
+ logRequestMetadata(server, panelRequestLogOptions);
93
+
82
94
  // Wire ticket module to the Fastify root logger so any load-time warnings
83
95
  // (e.g. legacy tickets.json shape dropped on upgrade) reach journalctl.
84
96
  setTicketModuleLogger(server.log);
@@ -177,10 +189,16 @@ async function start() {
177
189
  app.register(userAccessAdminRoutes, { prefix: '/api' });
178
190
  app.register(pluginRouter, { prefix: '/api' });
179
191
  // Last: agent-hosted plugins with an agent half, forwarded over their
180
- // internal tunnels. Only what no other /api route answers reaches it.
192
+ // internal tunnels. Only what no other /api route answers reaches it —
193
+ // and never /api/<route>/app[/*], the user surface's static routes below.
181
194
  app.register(agentForwarderRoutes, { prefix: '/api' });
182
195
  });
183
196
 
197
+ // --- Plugins' user surfaces: /api/<route>/app[/*] from the host bound to
198
+ // the plugin. No mTLS, 2FA or role: only a relay assertion Gatekeeper
199
+ // signed for the panel admits a request (routes/user-surface.js) ---
200
+ server.register(userSurfaceContext);
201
+
184
202
  // --- User-access session-protected routes (Bearer token, no mTLS) ---
185
203
  server.register(async function userAccessContext(app) {
186
204
  app.register(userAccessSessionMiddleware);
@@ -200,7 +218,7 @@ async function start() {
200
218
 
201
219
  // The auth portal and static site vhosts an older version wrote name the
202
220
  // client's Host header, not their own hostname, to Authelia. Before listen:
203
- // site changes take no lock, and none can arrive until the panel listens.
221
+ // no site change can arrive until the panel listens.
204
222
  if (config.onboarding.status === 'COMPLETED' && config.domain) {
205
223
  await reconcileSiteVhosts(server.log, config.domain).catch((err) => {
206
224
  server.log.error({ err: err.message }, 'Startup site vhost reconcile failed');
@@ -222,9 +240,13 @@ async function start() {
222
240
  // relay, and Gatekeeper vhosts name the client's Host header to Gatekeeper.
223
241
  // After listen: a rewritten agent-panel vhost asks this server at once.
224
242
  if (config.onboarding.status === 'COMPLETED') {
225
- reconcileTunnelVhosts(server.log).catch((err) => {
226
- server.log.error({ err: err.message }, 'Startup tunnel vhost reconcile failed');
227
- });
243
+ reconcileTunnelVhosts(server.log)
244
+ .catch((err) => {
245
+ server.log.error({ err: err.message }, 'Startup tunnel vhost reconcile failed');
246
+ })
247
+ // Plugins' web surfaces: each approved tree served (a redeploy may
248
+ // have reset the web root), each site's vhost in line.
249
+ .then(() => reconcileWebSurfaces(server.log));
228
250
  }
229
251
 
230
252
  // --- Health of hosted agent-hosted plugins (every 10s; idle without hostings) ---
@@ -238,6 +260,12 @@ async function start() {
238
260
  server.log.warn({ err: err.message }, 'Startup refresh of plugin settings failed');
239
261
  });
240
262
 
263
+ // --- Users and identity: the directory reconciled with users.yml (read
264
+ // only), the plugin audiences recomputed and sent to the agent halves that
265
+ // are behind — now, then every minute (Gatekeeper CLI edits, users.yml
266
+ // changed outside Lamaste, retries), with a daily full reconcile per plugin ---
267
+ startIdentityServices(server.log);
268
+
241
269
  // --- Periodic ticket instance liveness check (every 60s) ---
242
270
  const livenessInterval = setInterval(() => {
243
271
  checkInstanceLiveness(server.log).catch((err) => {
@@ -250,6 +278,7 @@ async function start() {
250
278
  const shutdown = async (signal) => {
251
279
  server.log.info({ signal }, 'Received signal, shutting down gracefully');
252
280
  clearInterval(livenessInterval);
281
+ stopIdentityServices();
253
282
  stopHostedPluginHealthMonitor();
254
283
  clearRateLimitInterval();
255
284
  await server.close();