Commit Graph

152 Commits

Author SHA1 Message Date
Alessandro (Ale) Segala
22cf4eab93 tests: run the E2E suite against a standalone Francis runtime
Adds a matrix entry that starts a SQLite-backed Francis runtime next to
Pocket ID and points FRANCIS_HOST at it, so the same Playwright suite runs
with the actor state, alarms, and placement owned by the runtime instead of
embedded in Pocket ID.

The suite needs no changes to work in that topology: the E2E reset seeds
every actor through actors.Service() and deliberately leaves the actor
store alone, so it behaves the same whichever side owns it.

The CLI spec is the exception, since export and import are the two commands
whose behaviour genuinely differs. It now picks the right Compose file,
expects an export to carry no francis.bin, feeds the import an archive
without one, and gains a case asserting that an archive that does carry one
is refused.

The runtime is reached over the Compose network on its UDP port, so nothing
is published to the host, and the cluster CA is left unpinned, which
exercises the same trust-on-first-use path an operator gets without
FRANCIS_CA. Pinning is covered by a unit test instead.
2026-08-31 05:27:04 +00:00
Alessandro (Ale) Segala
7ee7caae8f feat: support JWT bootstrap and CLI access to a standalone Francis runtime
Pocket ID can now authenticate to a standalone runtime with a JWT as well
as a pre-shared key: FRANCIS_HOST_JWT carries the token inline, while
FRANCIS_HOST_JWT_FILE keeps a path that Francis re-reads on every
connection, so a rotated token (a Kubernetes projected service account
token, say) is picked up without a restart. Exactly one bootstrap method
must be configured, which the config validates up front.

The one-time-access-token command works against a standalone runtime
again. It has no actor host of its own, so it joins the cluster as a
client-only host for just long enough to write the token: that hosts no
actor, so the runtime never places one on it, and it disconnects before
the command returns.
2026-08-31 05:26:59 +00:00
Alessandro (Ale) Segala
600ca3f31f feat: add FRANCIS_HOST to connect to a standalone Francis runtime
FRANCIS_HOST decides where the Francis actor runtime lives. When it is
empty or set to "embedded" (the default) nothing changes: Pocket ID starts
the runtime inside its own process, backed by its own database. Any other
value is the address, or a comma-separated list of addresses, of a
standalone Francis runtime; Pocket ID then connects to it as a remote actor
host and starts no embedded runtime.

Connecting to a standalone runtime also needs FRANCIS_HOST_PSK, the host
bootstrap pre-shared key the runtime is configured with, and optionally
FRANCIS_CA, the PEM-encoded cluster CA to pin before the first connection.
Without a pinned CA Francis trusts the certificate it is served on first
use, and warns about it.

The actor host is now held as the topology-agnostic francis host.Host
interface, since the concrete type depends on the configuration. The
commands that reach the actor data through Pocket ID's own database
(export, import, and one-time-access-token) fail with an explicit error
when a standalone runtime owns that data instead, rather than silently
operating on the wrong store.
2026-08-31 05:26:59 +00:00
Alessandro (Ale) Segala
29a6fd6c29 feat: show admin UI warning for SQLite on networked filesystem (#1713)
Co-authored-by: Elias Schneider <login@eliasschneider.com>
2026-08-24 15:03:31 -07:00
Alessandro (Ale) Segala
8c095afd78 refactor: migrate SCIM sync to actor + add tests (#1680)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
2026-08-18 21:54:06 +02:00
Alessandro (Ale) Segala
be4c395528 refactor: move remaining database cleanup jobs to actors (#1698) 2026-08-17 08:38:35 +02:00
Alessandro (Ale) Segala
2dc062ac0f refactor: move API key cleanup job to actor (#1687) 2026-08-15 00:39:02 +02:00
Elias Schneider
0c9a03e519 feat: add animated logo as default logo 2026-08-08 20:50:37 +02:00
Alessandro (Ale) Segala
563c0f93a6 refactor: migrate LDAP sync to an actor (#1651)
Co-authored-by: Kyle Mendell <kmendell@ofkm.us>
2026-08-07 09:18:30 -07:00
Elias Schneider
06ccadfcd0 fix: separate TLS inputs and preserve certificate reloads (#1653)
Co-authored-by: Alessandro (Ale) Segala <43508+ItalyPaleAle@users.noreply.github.com>
2026-08-07 00:32:08 +00:00
Alessandro (Ale) Segala
1f9cc5e58e fix: in non-HA mode, increase AlarmLeaseDuration (#1660) 2026-08-06 20:16:48 +02:00
Alessandro (Ale) Segala
22e3909c6c refactor: move GeoLite to its own package (#1647) 2026-08-05 22:12:19 +02:00
Alessandro (Ale) Segala
08407ae564 feat: include Francis data in Pocket ID backups (#1645)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Elias Schneider <login@eliasschneider.com>
2026-08-05 19:57:38 +00:00
Elias Schneider
488c50ef95 fix: respect log level in HTTP request logs 2026-08-04 23:12:22 +02:00
Alessandro (Ale) Segala
a526206669 feat: add observability to actors (#1646) 2026-08-04 12:31:11 -07:00
Elias Schneider
db64b150be fix: disable api key auth for webauthn register endpoints 2026-08-03 20:20:40 +02:00
Elias Schneider
7a4d0dd275 refactor: standardize API error handling (#1635) 2026-08-02 23:36:06 +02:00
Jean-François Roy
1934efa84c feat: implement OAuth Client ID Metadata Document (#1525) (#1526)
Co-authored-by: Elias Schneider <login@eliasschneider.com>
2026-08-02 15:05:39 +00:00
Salvatore Catroppa
8815e5968b fix: one-time-access-token CLI fails with "RuntimePSKs is required" (#1637) 2026-07-31 00:09:10 +02:00
Elias Schneider
9e72bc1c70 feat: display country and city on qr code login approval screen 2026-07-30 00:22:31 +02:00
Elias Schneider
0c27f733b9 feat: drop user initiated one time access token login method 2026-07-29 23:49:08 +02:00
Alessandro (Ale) Segala
2ef7c93fee feat: migrate app locks to Francis (#1624)
Co-authored-by: Elias Schneider <login@eliasschneider.com>
Co-authored-by: Kyle Mendell <kmendell@ofkm.us>
2026-07-29 22:15:40 +02:00
Elias Schneider
e1fd1d320f feat: add qr code alternative sign in method (#1594)
Co-authored-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com>
2026-07-28 01:30:13 +02:00
Elias Schneider
43aaccd5bf refactor: modularize email module and use actor for email verification (#1625) 2026-07-27 20:00:59 +02:00
Elias Schneider
6bd4679bab tests: correctly close filesystems 2026-07-26 23:30:36 +02:00
Alessandro (Ale) Segala
a1b4e1d2b2 feat: migrate one-time and signup tokens to an actor (#1611)
Co-authored-by: Elias Schneider <login@eliasschneider.com>
2026-07-26 15:32:43 +02:00
Elias Schneider
8563934fd5 refactor: use NewTextHandler instead of NewHandler for tint 2026-07-24 17:27:54 +02:00
Alessandro (Ale) Segala
2cfbcb4b67 refactor: use actors for db configuration (#1604)
Co-authored-by: Claude <noreply@anthropic.com>
2026-07-20 08:48:05 +02:00
Alessandro (Ale) Segala
921095f0a2 fix: relax Francis DB usage while HA is still WIP (#1602)
Co-authored-by: Claude <noreply@anthropic.com>
2026-07-18 21:32:27 +02:00
Elias Schneider
807bd9e037 feat: add support for proxy protocol 2026-07-17 10:37:47 +02:00
Elias Schneider
187cd8ddcd feat: add support for CIDR and IP address lists in TRUST_PROXY 2026-07-13 09:32:05 +02:00
Elias Schneider
d9ead47d19 fix: allow insecure callback URLs by default until next major release 2026-07-13 09:21:53 +02:00
Alessandro (Ale) Segala
cfda5f693b refactor: manage instance ID in the KV table (#1579) 2026-07-11 16:16:05 +02:00
Elias Schneider
09d196f7c5 feat: add OAuth APIs with scoped permissions (#1542)
Co-authored-by: Alessandro (Ale) Segala <43508+ItalyPaleAle@users.noreply.github.com>
2026-07-06 12:25:02 -07:00
Alessandro (Ale) Segala
eefd51cc4d fix: various bugs in observability / OTel (#1564) 2026-07-05 14:14:39 -07:00
Alessandro (Ale) Segala
9607495ab4 refactor: integrate Francis actor framework for background jobs, cron scheduling, and rate limiting (#1556)
Co-authored-by: Elias Schneider <login@eliasschneider.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-07-03 08:36:45 +02:00
Elias Schneider
ecad31cae2 refactor: migrate signup functionality to single usersignup module 2026-06-30 20:53:31 +02:00
Elias Schneider
58fcf7cbe6 refactor: migrate Webauthn functionality to single webauthn module 2026-06-29 14:05:07 +02:00
Elias Schneider
9fce987106 refactor: migrate API key functionality to single apikey module 2026-06-29 12:11:18 +02:00
Elias Schneider
8158452b37 refactor: use fosite for OAuth 2.0 logic (#1520) 2026-06-22 18:42:02 +02:00
Elias Schneider
7027296632 fix: restore cross-platform binary builds 2026-05-31 20:04:30 +02:00
Elias Schneider
b3d40a476b feat: improve design trough the whole application 2026-05-29 11:37:34 +02:00
V
dd77bb0f32 feat: add support for systemd socket activation (#1479) 2026-05-29 09:18:29 +02:00
Elias Schneider
e56dc124ce refactor: remove deprecated http2 package 2026-05-18 23:04:08 +02:00
John
64d4ac7919 feat: add support for response_mode=form_post (#1360)
Co-authored-by: Alessandro (Ale) Segala <43508+ItalyPaleAle@users.noreply.github.com>
Co-authored-by: Kyle Mendell <kmendell@ofkm.us>
Co-authored-by: Elias Schneider <login@eliasschneider.com>
2026-04-26 14:11:35 +02:00
Alessandro (Ale) Segala
2f0338211d chore: update golangci-lint (#1440) 2026-04-21 11:53:06 -05:00
Elias Schneider
ff26c4273a refactor: pass context to shutdownServer 2026-04-19 20:14:20 +02:00
Elias Schneider
a0cb574313 refactor: reduce complexity of ValidateEnvConfig and initRouter 2026-04-19 18:36:34 +02:00
Ingmar Stein
8f48d10d55 feat: add TLS support for HTTP/2 server (#1429)
Co-authored-by: Alessandro (Ale) Segala <43508+ItalyPaleAle@users.noreply.github.com>
2026-04-19 14:04:22 +02:00
jose_d
33cceeafa8 feat: add ability to revoke passkeys of users as admin (#1386)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: jose-d <7630424+jose-d@users.noreply.github.com>
Co-authored-by: Alessandro (Ale) Segala <43508+ItalyPaleAle@users.noreply.github.com>
Co-authored-by: Elias Schneider <login@eliasschneider.com>
2026-04-12 16:29:42 +00:00