Commit Graph

617 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
2e48aaf0a4 feat: export and import Pocket ID's own data against a standalone runtime
With a standalone Francis runtime the actor data lives in the runtime's
store, which Pocket ID cannot reach: the Francis protocol has no backup
or restore operation, and a restore refuses to run while any host is
connected, so a CLI that joined the cluster would block its own restore.

Rather than refusing outright, both commands now cover everything Pocket
ID does own and say plainly what they leave out, pointing at the
runtime's own backup and restore commands for the rest. The export writes
no francis.bin entry, which the import side already tolerates, and the
import refuses an archive that carries one, since restoring only its
Pocket ID half would leave the runtime holding another deployment's actor
state. The import also skips the exclusive-access lease, which lives in
the actor tables of a database this deployment does not use, and warns
that the replicas have to be stopped by hand.
2026-08-31 05:26:59 +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
7c79a9e14b feat: add explicit public keys for federated client credentials (#1702)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
2026-08-28 21:12:15 +00:00
Elias Schneider
f235104aed chore(deps): update Go to v1.27.0 2026-08-28 23:02:49 +02:00
dependabot[bot]
429793f33c chore(deps): Bump the "all-dependencies" group with 3 updates across multiple ecosystems (#1725)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Elias Schneider <login@eliasschneider.com>
2026-08-28 21:49:39 +02:00
Elias Schneider
3657012f93 fix: make sorting of strings case insensitive 2026-08-28 21:49:20 +02:00
Kyle Mendell
d75523fed0 feat: list allowed groups when hovering over allowed group count (#1671) 2026-08-25 18:30:16 +02: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
dependabot[bot]
d258d952b1 chore(deps): Bump the "all-dependencies" group with 2 updates across multiple ecosystems (#1711)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-22 22:15:28 +02: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
Elias Schneider
a487c78550 feat: reduce one time access code length for better UX 2026-08-18 21:31:22 +02:00
Elias Schneider
915a6bcf08 feat: allow admins to auto grant APIs to CIMD clients (#1692) 2026-08-18 20:02:14 +02:00
Alessandro (Ale) Segala
be4c395528 refactor: move remaining database cleanup jobs to actors (#1698) 2026-08-17 08:38:35 +02:00
github-actions[bot]
0e8ae3b1c7 chore: update AAGUIDs (#1696)
Co-authored-by: stonith404 <58886915+stonith404@users.noreply.github.com>
2026-08-17 08:35:16 +02:00
Elias Schneider
9421d43f8e fix: ignore trailing slash in resources 2026-08-17 08:34:28 +02:00
Elias Schneider
07580d9f9f chore(deps): use fix version for github.com/italypaleale/go-kit 2026-08-16 23:24:37 +02:00
dependabot[bot]
c7cab3af84 chore(deps): Bump the "all-dependencies" group with 4 updates across multiple ecosystems (#1693)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Elias Schneider <login@eliasschneider.com>
2026-08-15 01:17:57 +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
1bb21c5d73 refactor: move iss param handling to Fosite 2026-08-12 23:25:35 +02:00
Jean-François Roy
46b8d54e15 feat: serve RFC 8414 authorization server metadata (#1685)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Elias Schneider <login@eliasschneider.com>
2026-08-12 23:13:05 +02:00
Anthony Clerici
86cf73b86c docs: add error responses to openapi spec (#1684) 2026-08-11 19:26:48 +02:00
Alessandro (Ale) Segala
155a1fcba0 feat: support multiple client secrets per OIDC client (#1679) 2026-08-11 00:54:52 +00:00
Elias Schneider
3ca9a55c71 feat: hide apps without launch url on My Apps page 2026-08-10 22:53:35 +02:00
Alessandro (Ale) Segala
84a58cd757 fix: ignore unsupported grant types in client ID metadata documents (#1682) 2026-08-10 09:45:34 -07:00
github-actions[bot]
e21202e59b chore: update AAGUIDs (#1678)
Co-authored-by: stonith404 <58886915+stonith404@users.noreply.github.com>
2026-08-09 23:41:54 -05:00
Alessandro (Ale) Segala
875e7f0848 chore: update Francis to beta 22 (#1676) 2026-08-09 15:45:09 +02:00
Elias Schneider
0c9a03e519 feat: add animated logo as default logo 2026-08-08 20:50:37 +02:00
Elias Schneider
9e637d5aec fix: improve validation of app config variables 2026-08-08 16:37:14 +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
Alessandro (Ale) Segala
f8db1d8a86 chore: update francis to beta 21 (#1669) 2026-08-07 15:40:14 +00:00
dependabot[bot]
42626c50e4 chore(deps): Bump the "all-dependencies" group with 3 updates across multiple ecosystems (#1668) 2026-08-07 17:22:59 +02:00
Elias Schneider
d6a47243db feat: add settings for limiting what passkeys can be used (#1662)
Co-authored-by: Alessandro (Ale) Segala <43508+ItalyPaleAle@users.noreply.github.com>
2026-08-07 11:17:38 +02:00
Copilot
448d271c94 refactor: fix formatting (#1666)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: stonith404 <58886915+stonith404@users.noreply.github.com>
2026-08-07 08:26:45 +02:00
Elias Schneider
535e831b20 fix: brotli compression ignored (#1661) 2026-08-07 07:16:02 +02: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
1c9233c236 fix: make OIDC client token lifetimes optional (#1650) 2026-08-05 20:11:40 +00:00
Elias Schneider
95809dd29c tests: remove invalid unit test 2026-08-05 22:01:43 +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
140b5d3cb4 fix: don't skip rate limits for loopback addresses 2026-08-05 21:49:05 +02: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
2c7d1b63e1 fix: don't rely on content length header for optional json binding 2026-08-04 21:10:17 +02:00
Elias Schneider
5d43c4aaeb feat: add ability to customize session duration of clients (#1641) 2026-08-03 23:23:29 +02:00
Elias Schneider
1238bf0f37 fix: explicitly require JSON for request bodies 2026-08-03 22:58:08 +02:00
Elias Schneider
69d55ada6c fix: explicitly set SameSite to Lax for cookies 2026-08-03 22:58:01 +02:00
Elias Schneider
db64b150be fix: disable api key auth for webauthn register endpoints 2026-08-03 20:20:40 +02:00