Commit Graph
7923 Commits
Author SHA1 Message Date
Devon HudsonandClaude Opus 5.5 e6d64744bb Enforce a registration token's pins when attaching it and when finishing
`POST /register` checks that a registration matches the username and
email address its token pins, but the token step could attach any valid
token to a registration afterwards. Registering as anyone, then
attaching a pinned token, registered a username the token doesn't pin.
Swapping a passwordless token for one that isn't left a registration
with no password at all.

The token step now refuses a token that doesn't fit the registration:
one that pins another username or another email address than the
registration's, or one that isn't passwordless for a registration
without a password or an upstream link. Finishing a registration checks
the same against the verified email address, and refuses a passwordless
registration without one. Only a tampered registration gets that far,
so these fail like the other last-minute checks there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CZdGaj9bJcn5QeeUw8YXoF
2026-10-09 19:57:11 +00:00
Quentin Gliech d93009a319 Add --username, --email and --passwordless to manage issue-user-registration-token
The three token properties were only reachable through the admin API.
2026-10-09 19:57:11 +00:00
Quentin Gliech 0161ef0f13 Pre-fill the registration form from an invite link
`/register?token=…` now resolves the invite code server-side and hands what it
was issued for to the form island through a `data-invite` attribute: a pinned
email address is shown as the line announcing where the verification code goes
rather than as an input, a pinned username isn't shown at all, and a
`passwordless` code replaces the password fields with a notice and relabels the
submit button. A code the server refused only reports that, as an error above
the form.

Because a passwordless code is a way to register on its own, the shortcuts
which send the page to the upstream provider or to `/login` when password
registration is disabled are skipped when the link carries one.

The code itself travels back on submission through a hidden field, so a form
which comes back with errors keeps its shape, and so does the redirect the page
sends the user to when the CSRF token has expired.
2026-10-09 19:57:11 +00:00
Quentin Gliech 854153322f Enforce invite code constraints server-side when registering
The registration form can now carry an invite code, in a hidden `token` field,
and the code is resolved before anything else, so that:

 - an unknown, revoked, expired or exhausted code is rejected with an error on
   the field, and re-rendering the form keeps the code
 - a code which pins a username or an email address only lets that identity
   register, an empty field meaning the user accepted what the code pins
 - a `passwordless` code skips the password entirely and requires an email
   address to verify, even when the server otherwise doesn't, and is a way to
   register on its own when password registration is disabled

The code is also consumed whenever one was used, not only when the server
requires one.
2026-10-09 19:57:11 +00:00
Quentin Gliech fadbbff749 Add a passwordless flag to registration tokens
A registration token can now be marked `passwordless`, which will let the
user register without picking a password: their identity is established by
the email verification code instead.

This only adds the column and plumbs it through the storage layer and the
admin API; the registration flow itself is unchanged for now.
2026-10-09 19:57:11 +00:00
Quentin Gliech d221993173 Expose the invite URL and the pinned username and email in the admin API
Registration tokens now report the `/register?token=…` deep link alongside the
`username` and `email` they were issued for, and the create endpoint accepts
both. All the token endpoints now take the `UrlBuilder` so they can build that
link, and `Register` carries the token in its query string.
2026-10-09 19:57:11 +00:00
Quentin Gliech c7b7394c12 Add username and email columns to registration tokens
A registration token can now optionally carry the username and/or the email
address the account it is used for has to be registered with. This only adds
the columns and plumbs them through the storage layer and the CLI; nothing
enforces them yet.
2026-10-09 19:57:11 +00:00
Quentin Gliech 46ea733ce4 Render the registration form with React
The server-rendered registration form is replaced by a React island mounted
on `/register`, which renders the CAPTCHA in-page, gives live password
complexity feedback, and lays out the upstream provider buttons and the
sign-in link the way `/login` does. The island owns the whole form, so every
variant of the page is rendered from the mount data alone, and the user fills
it in one step. Server-side validation errors are threaded back into it
through the mount node, so a rejected submission re-renders with the errors
attached to the fields they belong to.

`RegisterContext` resolves the provider names and the sign-in link server-side
so that the island only has to render them. The sign-in link is derived from
the post-auth action in the query string instead of the `PostAuthContext`
loaded from the database, which drops a round trip from both the GET and the
invalid-form re-render.

Registering now requires JavaScript, including on the variant with upstream
providers only and on the one without a CAPTCHA: the <noscript> block shows a
notice instead of a duplicate form, which could not work anyway when a CAPTCHA
is configured. While the script loads, the page shows a skeleton of the form
to avoid layout shifts, and a hidden error notice is revealed if it fails to
boot. The server-rendered CAPTCHA component and its entrypoint are removed
with their only consumer.
2026-10-09 18:22:16 +00:00
Quentin Gliech d3cce35fc4 Explain the /register/password redirect and reword a registration test comment 2026-10-09 18:22:13 +00:00
Quentin Gliech d6d02a8855 Import the CAPTCHA component only from base.html on the registration page
The page imported it on its own as well, which is what broke the CAPTCHA rendering fixed by #5992 on the old password registration page. Also test that the page renders with a CAPTCHA configured.
2026-10-09 18:22:13 +00:00
Quentin Gliech e7093f9b2b Remove the old password registration template
`password.html` and the two "continue with" labels it needed have no caller
left.
2026-10-09 18:22:13 +00:00
Quentin Gliech f6a7dc5f01 Register with a password from POST /register
The registration page had two steps: `/register` picked between a password
and an upstream provider, then `/register/password` collected the username,
email and password. Both now live on `/register`, whose `POST` handler runs
the provider branch first and otherwise hands the form to the registration
body, which stays in `password.rs` as a helper.

The page renders the username, email, password and terms-of-service fields,
the captcha and the provider buttons in a single form. The provider buttons
submit that same form, so they are marked `formnovalidate` to skip the
validation of the fields they do not use, and come after the primary submit
button so that Enter still registers.

`/register/password` is gone; a `GET` on it redirects to `/register` with the
query string it was given, so bookmarks and links keep working. Its
`?username=` prefill has no producer left and is dropped.

`GET /register` now renders the page whenever password registration is
enabled, instead of redirecting to `/register/password` when there is no
upstream provider. Without password registration, a single provider still
gets redirected to directly, and no provider at all now redirects to
`/login`, where `/register/password` used to send that case.

An unknown or disabled provider gives a 404 through an inline `GenericError`
rather than the route-wide `RouteError`, and an expired CSRF token on the
password path now sends the user back to `/register` instead of failing the
request.
2026-10-09 18:22:13 +00:00
Quentin Gliech fa05ff942f Absorb the registration form state and the captcha into RegisterContext
The registration page is about to render the password registration form
itself, so its context needs the form state and the captcha configuration
`PasswordRegisterContext` carries today.
2026-10-09 18:22:13 +00:00
Olivier 'reivilibre 2277a37c59 Remove the "Application Services login" warning page (#5962) 2026-10-09 11:18:08 +01:00
Eric Eastwood 1968992f16 Automatic merge back to main (#6031) 2026-10-06 11:44:51 -05:00
github-actions[bot] 912bcf2192 1.27.0-rc.0 v1.27.0-rc.0 2026-10-06 15:50:28 +00:00
Eric Eastwood 5a78ee96cd Translations updates for main (#6030) 2026-10-06 10:49:04 -05:00
github-actions[bot] 15e27bed51 Translations updates 2026-10-06 15:13:57 +00:00
Andrew Morgan eb834276cb Bump opa-wasm from 0.2.0 to 0.3.3, wasmtime from 43.0.2 to 49.0.2 (#6029) 2026-10-06 16:02:50 +01:00
Andrew Morgan f2006bb30c Bump wasmtime from 43.0.2 to 49.0.2
This silences
https://github.com/bytecodealliance/wasmtime/security/advisories/GHSA-32h6-97mm-8q3c,
even though MAS was not affected (as the `component-model-async` feature
was not enabled).

The command used to update was:

```
cargo update -p wasmtime --precise 49.0.2
```
2026-10-06 14:55:22 +01:00
Andrew Morgan e783c76030 Bump opa-wasm from 0.2.0 to 0.3.3 2026-10-06 14:41:22 +01:00
Olivier 'reivilibre 357cd68ad5 Allow password reset while signed in (#5985)
Users can have an ambient login whilst not knowing their password.

This is also an easily-hit path when upgrading an SSO account to have a password.
2026-10-06 11:04:19 +01:00
Olivier 'reivilibre 6cb3a49016 Properly limit number of jobs that can be fetched (#6006) 2026-10-05 16:39:03 +01:00
Olivier 'reivilibre 99ee247654 build(deps-dev): bump storybook from 10.5.3 to 10.6.0 in the storybook group across 1 directory (#6017) 2026-10-05 16:37:31 +01:00
dependabot[bot] c8fb006cfa build(deps-dev): bump storybook
Bumps the storybook group with 1 update in the / directory: [storybook](https://github.com/storybookjs/storybook/tree/HEAD/code/core).


Updates `storybook` from 10.5.3 to 10.6.0
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v10.6.0/code/core)

---
updated-dependencies:
- dependency-name: storybook
  dependency-version: 10.6.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: storybook
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-05 11:44:30 +00:00
Olivier 'reivilibre 6ad02e32c3 build(deps-dev): bump the vite group across 1 directory with 2 updates (#6019) 2026-10-05 12:38:57 +01:00
dependabot[bot] d5a61a46e1 build(deps-dev): bump the vite group across 1 directory with 2 updates
Bumps the vite group with 2 updates in the / directory: [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `@vitejs/plugin-react` from 6.0.4 to 6.1.1
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.1.1/packages/plugin-react)

Updates `vite` from 8.1.5 to 8.3.0
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/create-vite@8.3.0/packages/vite)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 6.1.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: vite
- dependency-name: vite
  dependency-version: 8.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: vite
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-05 11:14:48 +00:00
Olivier 'reivilibre 57f1314889 build(deps): bump the fontsource group across 1 directory with 2 updates (#6018) 2026-10-05 12:10:33 +01:00
Olivier 'reivilibre 83e8d41dab build(deps): bump the i18next group across 1 directory with 3 updates (#6020) 2026-10-05 12:10:03 +01:00
dependabot[bot] ab359fd4cf build(deps): bump the fontsource group across 1 directory with 2 updates
Bumps the fontsource group with 2 updates in the / directory: [@fontsource/inconsolata](https://github.com/fontsource/font-files/tree/HEAD/fonts/google/inconsolata) and [@fontsource/inter](https://github.com/fontsource/font-files/tree/HEAD/fonts/google/inter).


Updates `@fontsource/inconsolata` from 5.2.8 to 5.3.0
- [Changelog](https://github.com/fontsource/font-files/blob/main/CHANGELOG.md)
- [Commits](https://github.com/fontsource/font-files/commits/HEAD/fonts/google/inconsolata)

Updates `@fontsource/inter` from 5.2.8 to 5.3.0
- [Changelog](https://github.com/fontsource/font-files/blob/main/CHANGELOG.md)
- [Commits](https://github.com/fontsource/font-files/commits/HEAD/fonts/google/inter)

---
updated-dependencies:
- dependency-name: "@fontsource/inconsolata"
  dependency-version: 5.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: fontsource
- dependency-name: "@fontsource/inter"
  dependency-version: 5.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: fontsource
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-05 10:18:47 +00:00
dependabot[bot] 30c3077f78 build(deps): bump the i18next group across 1 directory with 3 updates
Bumps the i18next group with 3 updates in the / directory: [i18next](https://github.com/i18next/i18next), [react-i18next](https://github.com/i18next/react-i18next) and [i18next-cli](https://github.com/i18next/i18next-cli).


Updates `i18next` from 26.3.6 to 26.4.2
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v26.3.6...v26.4.2)

Updates `react-i18next` from 17.0.10 to 17.0.14
- [Changelog](https://github.com/i18next/react-i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/react-i18next/compare/v17.0.10...v17.0.14)

Updates `i18next-cli` from 1.66.2 to 1.74.1
- [Changelog](https://github.com/i18next/i18next-cli/blob/main/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next-cli/compare/v1.66.2...v1.74.1)

---
updated-dependencies:
- dependency-name: i18next
  dependency-version: 26.4.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: i18next
- dependency-name: i18next-cli
  dependency-version: 1.74.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: i18next
- dependency-name: react-i18next
  dependency-version: 17.0.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: i18next
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-05 10:18:27 +00:00
Olivier 'reivilibre ee29e7e8b1 build(deps): bump icu_locale_core from 2.2.0 to 2.3.0 in the icu group (#6015) 2026-10-05 11:16:55 +01:00
Olivier 'reivilibre ebb172b2ce build(deps): bump opentelemetry-resource-detectors from 0.11.0 to 0.12.0 in the opentelemetry group (#6012) 2026-10-05 11:16:17 +01:00
Olivier 'reivilibre c02a892e4f build(deps): bump mozilla-actions/sccache-action from 0.0.10 to 0.0.11 (#6011) 2026-10-05 11:16:05 +01:00
Olivier 'reivilibre 8e00712647 build(deps): bump tailscale/github-action from 4.1.2 to 4.2.0 (#6010) 2026-10-05 11:15:51 +01:00
Olivier 'reivilibre 3c38f410e7 build(deps): bump docker/bake-action from 7.2.0 to 7.4.0 (#6008) 2026-10-05 11:15:34 +01:00
Olivier 'reivilibre d100abd997 build(deps): bump codecov/codecov-action from 7.0.0 to 7.1.1 (#6007) 2026-10-05 11:15:19 +01:00
Olivier 'reivilibre 2dc4fff90f build(deps): bump docker/build-push-action from 7.3.0 to 7.4.0 (#6009) 2026-10-05 11:15:07 +01:00
Olivier 'reivilibre 38beccd9a3 build(deps): bump regex from 1.12.4 to 1.13.1 (#6016) 2026-10-05 11:14:09 +01:00
Olivier 'reivilibre 470a56de4b build(deps): bump the react group with 2 updates (#6021) 2026-10-05 11:13:29 +01:00
dependabot[bot] 4b3e5a7191 build(deps): bump the react group with 2 updates
Bumps the react group with 2 updates: [react](https://github.com/react/react/tree/HEAD/packages/react) and [react-dom](https://github.com/react/react/tree/HEAD/packages/react-dom).


Updates `react` from 19.2.7 to 19.3.0
- [Release notes](https://github.com/react/react/releases)
- [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/react/react/commits/v19.3.0/packages/react)

Updates `react-dom` from 19.2.7 to 19.3.0
- [Release notes](https://github.com/react/react/releases)
- [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/react/react/commits/v19.3.0/packages/react-dom)

---
updated-dependencies:
- dependency-name: react
  dependency-version: 19.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: react
- dependency-name: react-dom
  dependency-version: 19.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: react
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-01 14:13:21 +00:00
dependabot[bot] 1234b79c6f build(deps): bump regex from 1.12.4 to 1.13.1
Bumps [regex](https://github.com/rust-lang/regex) from 1.12.4 to 1.13.1.
- [Release notes](https://github.com/rust-lang/regex/releases)
- [Changelog](https://github.com/rust-lang/regex/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/regex/compare/1.12.4...1.13.1)

---
updated-dependencies:
- dependency-name: regex
  dependency-version: 1.13.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-01 13:57:21 +00:00
dependabot[bot] 3322631445 build(deps): bump icu_locale_core from 2.2.0 to 2.3.0 in the icu group
Bumps the icu group with 1 update: [icu_locale_core](https://github.com/unicode-org/icu4x).


Updates `icu_locale_core` from 2.2.0 to 2.3.0
- [Release notes](https://github.com/unicode-org/icu4x/releases)
- [Changelog](https://github.com/unicode-org/icu4x/blob/main/CHANGELOG.md)
- [Commits](https://github.com/unicode-org/icu4x/compare/icu@2.2.0...icu@2.3.0)

---
updated-dependencies:
- dependency-name: icu_locale_core
  dependency-version: 2.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: icu
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-01 13:57:09 +00:00
dependabot[bot] 17a9e1c464 build(deps): bump opentelemetry-resource-detectors
Bumps the opentelemetry group with 1 update: [opentelemetry-resource-detectors](https://github.com/open-telemetry/opentelemetry-rust-contrib).


Updates `opentelemetry-resource-detectors` from 0.11.0 to 0.12.0
- [Release notes](https://github.com/open-telemetry/opentelemetry-rust-contrib/releases)
- [Commits](https://github.com/open-telemetry/opentelemetry-rust-contrib/compare/opentelemetry-resource-detectors-0.11.0...opentelemetry-resource-detectors-0.12.0)

---
updated-dependencies:
- dependency-name: opentelemetry-resource-detectors
  dependency-version: 0.12.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: opentelemetry
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-01 13:55:13 +00:00
dependabot[bot] d786bcc253 build(deps): bump mozilla-actions/sccache-action from 0.0.10 to 0.0.11
Bumps [mozilla-actions/sccache-action](https://github.com/mozilla-actions/sccache-action) from 0.0.10 to 0.0.11.
- [Release notes](https://github.com/mozilla-actions/sccache-action/releases)
- [Commits](https://github.com/mozilla-actions/sccache-action/compare/9e7fa8a12102821edf02ca5dbea1acd0f89a2696...fc920bf0ec8de6ee65d409111f7ec508035751ba)

---
updated-dependencies:
- dependency-name: mozilla-actions/sccache-action
  dependency-version: 0.0.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-01 13:55:07 +00:00
dependabot[bot] 88e625bb06 build(deps): bump tailscale/github-action from 4.1.2 to 4.2.0
Bumps [tailscale/github-action](https://github.com/tailscale/github-action) from 4.1.2 to 4.2.0.
- [Release notes](https://github.com/tailscale/github-action/releases)
- [Commits](https://github.com/tailscale/github-action/compare/306e68a486fd2350f2bfc3b19fcd143891a4a2d8...d1b6cd204f8dceda5b3eaad7f1f767be390056cd)

---
updated-dependencies:
- dependency-name: tailscale/github-action
  dependency-version: 4.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-01 13:54:56 +00:00
dependabot[bot] 442724fecb build(deps): bump docker/build-push-action from 7.3.0 to 7.4.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 7.3.0 to 7.4.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/53b7df96c91f9c12dcc8a07bcb9ccacbed38856a...c3c9e263c25d99ce0380d002d59b67737d91b0dc)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-version: 7.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-01 13:54:52 +00:00
dependabot[bot] 7d9dc40a47 build(deps): bump docker/bake-action from 7.2.0 to 7.4.0
Bumps [docker/bake-action](https://github.com/docker/bake-action) from 7.2.0 to 7.4.0.
- [Release notes](https://github.com/docker/bake-action/releases)
- [Commits](https://github.com/docker/bake-action/compare/6614cfa25eff9a0b2b2697efb0b6159e7680d584...018cb6412ab401ebaa809aa5f85966b74628600f)

---
updated-dependencies:
- dependency-name: docker/bake-action
  dependency-version: 7.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-01 13:54:43 +00:00
dependabot[bot] da2582e5c1 build(deps): bump codecov/codecov-action from 7.0.0 to 7.1.1
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 7.0.0 to 7.1.1.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/fb8b3582c8e4def4969c97caa2f19720cb33a72f...303a32d7a59b442fa8d48b6a1cc6825c09c847a5)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-version: 7.1.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-01 13:54:28 +00:00
JoFrost f75c35b07d fix(tasks): properly limit jobs that can be fetched 2026-09-30 18:38:12 +02:00