Commit Graph
7927 Commits
Author SHA1 Message Date
Quentin Gliech efeaa62070 Add a usernameAvailable GraphQL query for anonymous lookups
Exposes a new query telling whether a given username is available for
registration, and if not, why: already taken, or rejected by the
registration policy. A username reserved on the homeserver side is
deliberately reported as taken, mirroring the ambiguity of the
registration form, which doesn't tell the two apart either.

Because this effectively is a username-existence oracle, the query is
rate-limited per requester, configurable through the new
`rate_limiting.username_availability` option.
2026-10-13 14:02:33 +02:00
Quentin Gliech 1c68fc986a 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, until the user edits them.

`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-13 14:02:33 +02:00
Quentin Gliech 6857910db4 Reserve the space of the password confirmation message
The message appears when the confirmation field loses focus, which shifted the
button below it under the click that moved the focus away.
2026-10-13 14:02:33 +02:00
Quentin Gliech c78d038f85 Move the "or" separator styles into a CSS module
The class becomes `or-separator`, as the global `.separator` also matched the
footer's separator. The module is imported by `templates.css` for the SSR
`field.separator()` macro.
2026-10-13 14:02:33 +02:00
Quentin Gliech bdecd466bb Normalize the username server-side when registering
`POST /register` trims and lowercases the username before either the password
or the upstream provider path looks at it, since Matrix localparts are
lowercase.
2026-10-13 14:02:32 +02:00
Quentin Gliech 740e9551d8 Explain the /register/password redirect and reword a registration test comment 2026-10-13 11:32:18 +02:00
Quentin Gliech 1e58210141 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-13 11:32:18 +02:00
Quentin Gliech 128d252dd6 Remove the old password registration template
`password.html` and the two "continue with" labels it needed have no caller
left.
2026-10-13 11:32:18 +02:00
Quentin Gliech ce347e0a7c 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-13 11:32:18 +02:00
Quentin Gliech 8ad4fbec17 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-13 11:32:17 +02:00
Quentin Gliech 6057e83790 Upgrade ulid to 3.0 (#6039) 2026-10-12 13:32:44 +02:00
Quentin Gliech 6b37eb7d74 Upgrade ulid to 3.0
ulid 3 moves to `rand` 0.10, so it no longer pulls the `rand` 0.9
generation. Only `opentelemetry_sdk` and `sentry` still need it.

ULID generation keeps going through `UlidExt`, whose bit layout matches
ulid's own `from_datetime_with_source`. The only API change affecting
MAS is the rename of `Ulid::new` to `Ulid::generate`, which the clippy
ban list now targets.
2026-10-09 16:50:36 +02:00
Quentin Gliech 2d3bf03d63 Upgrade to rand 0.10 and the next RustCrypto generation
`rand` 0.10 and the new RustCrypto generation both build on `rand_core`
0.10, so they have to move together:

 - `rand`, `rand_chacha` and `rand_core` 0.10
 - `digest` 0.11, `sha2` 0.11, `hmac` 0.13, `const-oid` 0.10
 - `elliptic-curve` 0.14, `ecdsa` 0.17, `p256`, `p384` and `k256` 0.14,
   `signature` 3
 - `der`, `spki` and `sec1` 0.8, `pkcs8` 0.11, `pem-rfc7468` 1.0
 - `rsa` 0.10.0-rc.19 and `pkcs1` 0.8.0-rc.5, which have no stable
   release yet. They are pinned exactly, because release candidates
   break their API between releases.
 - `argon2` 0.6 and `pbkdf2` 0.13

On the `rand` side, `RngCore` becomes `Rng` and the old `Rng` becomes
`RngExt`. `gen_*` becomes `random_*`, `thread_rng` becomes `rng`,
`distributions` becomes `distr`, and `from_rng` can no longer fail. On
the crypto side, `mas-jose` and `mas-keystore` move to `BoxedUint` for
RSA, to the `pkcs1` and `pkcs8` reference types, and to the `Generate`
trait for key generation, and `mas-jose` no longer depends on
`generic-array`. Password hashing goes through `hash_password_with_rng`.

Stored data is unaffected. The password hashing snapshots are unchanged,
so bcrypt, Argon2 and PBKDF2 produce the same hashes for the same input
and salt, and `pbkdf2` 0.13 keeps the same defaults (SHA-256, 600 000
rounds). The keystore snapshots change only because keys generated from
a seeded RNG differ. The snapshots of keys loaded from files are
unchanged.

`opa-wasm` 0.3.3 already uses this generation, so most of the duplicate
crates it pulled in go away. The `deny.toml` skip list now names what
still pulls the older versions: cookie, sqlx, headers, wasmtime and pest
for RustCrypto, and opentelemetry_sdk, sentry and ulid for `rand` 0.9.
2026-10-09 15:42:26 +02:00
Quentin Gliech 9f40244eab Bump chacha20poly1305 from 0.10 to 0.11
It moves from `generic-array` to `hybrid-array`, so `Encrypter` builds
its key and nonce with the `Key` and `Nonce` aliases, and `mas-keystore`
no longer depends on `generic-array`. Cookie (via `aes-gcm`) is still on
`aead` 0.5, so the older `aead` and `universal-hash` go on the cargo-deny
skip list.
2026-10-09 15:38:53 +02:00
Quentin Gliech f8b7c5b879 Bump bcrypt from 0.18 to 0.19
The hashes it produces are unchanged. It pulls `blowfish` 0.10, which is
on `cipher` 0.5 while the rest of the tree is on 0.4, so the older
`cipher` and `inout` go on the cargo-deny skip list.
2026-10-09 15:38:53 +02:00
Quentin Gliech 9659701f7a Bump rand from 0.8.5 to 0.8.6 to address RUSTSEC-2026-0097
0.8.6 is the patched release for the `rand::thread_rng` unsoundness with
custom loggers, so the advisory ignore is no longer needed.
2026-10-09 15:38:52 +02:00
Quentin Gliech 186c592d61 Allow the duplicate crates pulled in by opa-wasm 0.3 and the icu bump
The `cargo deny` bans check fails on main because two dependency bumps
introduced duplicate crate versions:

 - `opa-wasm` 0.3.3 (#6029) uses `rand` 0.10, `base64` 0.23 and the
   `digest` 0.11 generation of the RustCrypto crates, while the rest of
   the tree is still on `rand` 0.9, `base64` 0.22 and `digest` 0.10.
 - The icu bump (#6015) pulls `zerovec-derive` 0.11.6, which uses `syn` 3,
   while everything else is on `syn` 2.

Add the older versions to the skip list until the rest of the tree
catches up.
2026-10-09 15:26:05 +02: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