feat: Update policy server implementation to be closer to stable MSC4284 #1487

Open
nex wants to merge 13 commits from nex/feat/policy-servers-2-electric-boogaloo into main
Owner

This pull request updates the MSC4284 policy server implementation to better match the now stabilised MSC.

Related Synapse pull request: https://github.com/element-hq/synapse/pull/19503

  • Update m.room.policy schema
  • Update event type to support both stable and unstable types
  • Drop legacy check endpoint
  • Verify policy server signatures when checking
  • Fall back to fetching a fresh signature if one is not attached to an event

Will also add:

  • Support for advertising /.well-known/matrix/policy_server
  • Support for the stable and unstable endpoints, hopefully with some built-in checks (for example to enforce DAG "correctness") and/or the option to pass through to another service

Pull request checklist:

  • This pull request targets the main branch, and the branch is named something other than
    main.
  • I have written an appropriate pull request title and my description is clear.
  • I understand I am responsible for the contents of this pull request.
  • I have followed the contributing guidelines:
This pull request updates the [MSC4284](https://github.com/matrix-org/matrix-spec-proposals/pull/4284) policy server implementation to better match the now stabilised MSC. Related Synapse pull request: https://github.com/element-hq/synapse/pull/19503 - [x] Update `m.room.policy` schema - [x] Update event type to support both stable and unstable types - [x] Drop legacy check endpoint - [x] Verify policy server signatures when checking - [x] Fall back to fetching a fresh signature if one is not attached to an event ~~Will also add:~~ - ~~Support for advertising `/.well-known/matrix/policy_server`~~ - ~~Support for the stable and unstable endpoints, hopefully with some built-in checks (for example to enforce DAG "correctness") and/or the option to pass through to another service~~ **Pull request checklist:** <!-- You need to complete these before your PR can be considered. If you aren't sure about some, feel free to ask for clarification in #dev:continuwuity.org. --> - [x] This pull request targets the `main` branch, and the branch is named something other than `main`. - [x] I have written an appropriate pull request title and my description is clear. - [x] I understand I am responsible for the contents of this pull request. - I have followed the [contributing guidelines][c1]: - [x] My contribution follows the [code style][c2], if applicable. - [x] I ran [pre-commit checks][c1pc] before opening/drafting this pull request. - [x] I have [tested my contribution][c1t] (or proof-read it for documentation-only changes) myself, if applicable. This includes ensuring code compiles. - [x] My commit messages follow the [commit message format][c1cm] and are descriptive. - [x] I have written a [news fragment][n1] for this PR, if applicable<!--(can be done after hitting open!)-->. <!-- Notes on these requirements: - While not required, we encourage you to sign your commits with GPG or SSH to attest the authenticity of your changes. - While we allow LLM-assisted contributions, we do not appreciate contributions that are low quality, which is typical of machine-generated contributions that have not had a lot of love and care from a human. Please do not open a PR if all you have done is asked ChatGPT to tidy up the codebase with a +-100,000 diff. - In the case of code style violations, reviewers may leave review comments/change requests indicating what the ideal change would look like. For example, a reviewer may suggest you lower a log level, or use `match` instead of `if/else` etc. - In the case of code style violations, pre-commit check failures, minor things like typos/spelling errors, and in some cases commit format violations, reviewers may modify your branch directly, typically by making changes and adding a commit. Particularly in the latter case, a reviewer may rebase your commits to squash "spammy" ones (like "fix", "fix", "actually fix"), and reword commit messages that don't satisfy the format. - Pull requests MUST pass the `Checks` CI workflows to be capable of being merged. This can only be bypassed in exceptional circumstances. If your CI flakes, let us know in matrix:r/dev:continuwuity.org. - Pull requests have to be based on the latest `main` commit before being merged. If the main branch changes while you're making your changes, you should make sure you rebase on main before opening a PR. Your branch will be rebased on main before it is merged if it has fallen behind. - We typically only do fast-forward merges, so your entire commit log will be included. Once in main, it's difficult to get out cleanly, so put on your best dress, smile for the cameras! --> [c1]: https://forgejo.ellis.link/continuwuation/continuwuity/src/branch/main/CONTRIBUTING.md [c2]: https://forgejo.ellis.link/continuwuation/continuwuity/src/branch/main/docs/development/code_style.mdx [c1pc]: https://forgejo.ellis.link/continuwuation/continuwuity/src/branch/main/CONTRIBUTING.md#pre-commit-checks [c1t]: https://forgejo.ellis.link/continuwuation/continuwuity/src/branch/main/CONTRIBUTING.md#running-tests-locally [c1cm]: https://forgejo.ellis.link/continuwuation/continuwuity/src/branch/main/CONTRIBUTING.md#commit-messages [n1]: https://towncrier.readthedocs.io/en/stable/tutorial.html#creating-news-fragments
nex self-assigned this 2026-03-04 05:39:46 +00:00
feat: Update policy server implementation to be closer to stable MSC4284
Some checks failed
Update flake hashes / update-flake-hashes (pull_request) Waiting to run
Documentation / Build and Deploy Documentation (pull_request) Has been cancelled
Checks / Prek / Pre-commit & Formatting (pull_request) Has been cancelled
Checks / Prek / Clippy and Cargo Tests (pull_request) Has been cancelled
6f103939df
Untested
chore: Add news fragment
Some checks failed
Documentation / Build and Deploy Documentation (pull_request) Successful in 4m5s
Update flake hashes / update-flake-hashes (pull_request) Successful in 45s
Checks / Prek / Pre-commit & Formatting (pull_request) Successful in 7m25s
Checks / Prek / Clippy and Cargo Tests (pull_request) Failing after 1h0m0s
6c96945b0a
nex changed title from feat: Update policy server implementation to be closer to stable MSC4284 to WIP: feat: Update policy server implementation to be closer to stable MSC4284 2026-03-04 05:43:47 +00:00
nex added the due date 2026-06-01 2026-03-04 05:47:21 +00:00
nex force-pushed nex/feat/policy-servers-2-electric-boogaloo from 6c96945b0a
Some checks failed
Documentation / Build and Deploy Documentation (pull_request) Successful in 4m5s
Update flake hashes / update-flake-hashes (pull_request) Successful in 45s
Checks / Prek / Pre-commit & Formatting (pull_request) Successful in 7m25s
Checks / Prek / Clippy and Cargo Tests (pull_request) Failing after 1h0m0s
to 02ab2daa57
Some checks failed
Documentation / Build and Deploy Documentation (pull_request) Successful in 1m17s
Checks / Prek / Pre-commit & Formatting (pull_request) Successful in 3m1s
Checks / Prek / Clippy and Cargo Tests (pull_request) Failing after 9m24s
2026-03-21 17:15:26 +00:00
Compare
feat: Support stable policy servers
All checks were successful
Documentation / Build and Deploy Documentation (pull_request) Successful in 1m17s
Checks / Prek / Pre-commit & Formatting (pull_request) Successful in 3m8s
Update flake hashes / update-flake-hashes (pull_request) Successful in 56s
Checks / Prek / Clippy and Cargo Tests (pull_request) Successful in 26m12s
9ebafaaabc
Author
Owner

Gonna drop the well-known and inline support from this PR to reduce the scope and get it merged sooner. Will probably add later.

Gonna drop the well-known and inline support from this PR to reduce the scope and get it merged sooner. Will probably add later.
nex force-pushed nex/feat/policy-servers-2-electric-boogaloo from 9ebafaaabc
All checks were successful
Documentation / Build and Deploy Documentation (pull_request) Successful in 1m17s
Checks / Prek / Pre-commit & Formatting (pull_request) Successful in 3m8s
Update flake hashes / update-flake-hashes (pull_request) Successful in 56s
Checks / Prek / Clippy and Cargo Tests (pull_request) Successful in 26m12s
to 77e769d3e1
Some checks failed
Check Changelog / Check for changelog (pull_request_target) Successful in 10s
Documentation / Build and Deploy Documentation (pull_request) Successful in 1m18s
Checks / Prek / Pre-commit & Formatting (pull_request) Failing after 3m2s
Update flake hashes / update-flake-hashes (pull_request) Successful in 57s
Checks / Prek / Clippy and Cargo Tests (pull_request) Has been cancelled
2026-04-02 15:11:19 +00:00
Compare
chore: Remove config options related to policy servers
Some checks failed
Check Changelog / Check for changelog (pull_request_target) Successful in 14s
Documentation / Build and Deploy Documentation (pull_request) Successful in 1m17s
Checks / Prek / Pre-commit & Formatting (pull_request) Successful in 2m54s
Update flake hashes / update-flake-hashes (pull_request) Successful in 57s
Checks / Prek / Clippy and Cargo Tests (pull_request) Has been cancelled
6d0f8fc4e2
Since they are signature based now they can't really be ignored
style: Use ok() instead of map_or()
Some checks failed
Check Changelog / Check for changelog (pull_request_target) Successful in 14s
Documentation / Build and Deploy Documentation (pull_request) Successful in 1m19s
Checks / Prek / Pre-commit & Formatting (pull_request) Successful in 2m56s
Update flake hashes / update-flake-hashes (pull_request) Successful in 56s
Checks / Prek / Clippy and Cargo Tests (pull_request) Has been cancelled
fc21b0bab2
Author
Owner

Now we get to see if I did signature verification correctly! :D

Now we get to see if I did signature verification correctly! :D
style: How is the formatter indecisive
Some checks failed
Check Changelog / Check for changelog (pull_request_target) Successful in 21s
Documentation / Build and Deploy Documentation (pull_request) Successful in 1m20s
Checks / Prek / Pre-commit & Formatting (pull_request) Successful in 2m58s
Update flake hashes / update-flake-hashes (pull_request) Successful in 56s
Checks / Prek / Clippy and Cargo Tests (pull_request) Failing after 35m4s
af3fbc5562
style: Adjust log levels
Some checks failed
Check Changelog / Check for changelog (pull_request_target) Successful in 9s
Documentation / Build and Deploy Documentation (pull_request) Successful in 1m19s
Checks / Prek / Pre-commit & Formatting (pull_request) Successful in 3m3s
Update flake hashes / update-flake-hashes (pull_request) Successful in 57s
Checks / Prek / Clippy and Cargo Tests (pull_request) Failing after 37m10s
4623119282
nex changed title from WIP: feat: Update policy server implementation to be closer to stable MSC4284 to feat: Update policy server implementation to be closer to stable MSC4284 2026-04-02 16:19:36 +00:00
nex requested review from Owners 2026-04-02 16:19:42 +00:00
style: Make verify_policy_signature less verbose
Some checks failed
Check Changelog / Check for changelog (pull_request_target) Successful in 10s
Documentation / Build and Deploy Documentation (pull_request) Successful in 1m22s
Checks / Prek / Pre-commit & Formatting (pull_request) Successful in 3m1s
Update flake hashes / update-flake-hashes (pull_request) Successful in 56s
Checks / Prek / Clippy and Cargo Tests (pull_request) Failing after 25m4s
b4128b5813
Author
Owner

I have no idea why the incoming event PS signatures won't validate

2026-04-02T17:00:25.245820Z DEBUG process_inbound_transaction{id="1775063909736" origin="starstruck.systems"}:policy_server_allows_event{room_id="!1jgDwjy7xL5JvjnaDkeZVfzW-RNHa5PausrxYBckJ90" room_version=V12 incoming=true}: conduwuit_service::rooms::event_handler::policy_server: Policy server signature verification failed error=Verification error: Could not verify signature: signature error: Verification equation was not satisfied
2026-04-02T17:00:25.245840Z DEBUG process_inbound_transaction{id="1775063909736" origin="starstruck.systems"}:policy_server_allows_event{room_id="!1jgDwjy7xL5JvjnaDkeZVfzW-RNHa5PausrxYBckJ90" room_version=V12 incoming=true}: conduwuit_service::rooms::event_handler::policy_server: Event is incoming but does not have a valid policy server signature; asking policy server to sign it now via=corellia.timedout.uk

This is using practically the same routine as regular events are verified with

I have no idea why the incoming event PS signatures won't validate ``` 2026-04-02T17:00:25.245820Z DEBUG process_inbound_transaction{id="1775063909736" origin="starstruck.systems"}:policy_server_allows_event{room_id="!1jgDwjy7xL5JvjnaDkeZVfzW-RNHa5PausrxYBckJ90" room_version=V12 incoming=true}: conduwuit_service::rooms::event_handler::policy_server: Policy server signature verification failed error=Verification error: Could not verify signature: signature error: Verification equation was not satisfied 2026-04-02T17:00:25.245840Z DEBUG process_inbound_transaction{id="1775063909736" origin="starstruck.systems"}:policy_server_allows_event{room_id="!1jgDwjy7xL5JvjnaDkeZVfzW-RNHa5PausrxYBckJ90" room_version=V12 incoming=true}: conduwuit_service::rooms::event_handler::policy_server: Event is incoming but does not have a valid policy server signature; asking policy server to sign it now via=corellia.timedout.uk ``` This is using practically the same routine as regular events are verified with
Author
Owner
2026-04-02T17:09:27.395036Z TRACE process_inbound_transaction{id="1775063910144" origin="starstruck.systems"}:policy_server_allows_event{room_id="!1jgDwjy7xL5JvjnaDkeZVfzW-RNHa5PausrxYBckJ90" room_version=V12 incoming=true}: conduwuit_service::rooms::event_handler::policy_server: Verifying policy server signature signature=rV7GL02dqbVvC6reX5jQmomJoHEASzWB6rvzh6Myu5rjaV6zClwbHH4r00+2ybpXkO0H7iqAd3dsT9U1f28ZBA
2026-04-02T17:09:27.395148Z DEBUG process_inbound_transaction{id="1775063910144" origin="starstruck.systems"}:policy_server_allows_event{room_id="!1jgDwjy7xL5JvjnaDkeZVfzW-RNHa5PausrxYBckJ90" room_version=V12 incoming=true}: conduwuit_service::rooms::event_handler::policy_server: Policy server signature verification failed error=Verification error: Could not verify signature: signature error: Verification equation was not satisfied

whatever, problem for later

``` 2026-04-02T17:09:27.395036Z TRACE process_inbound_transaction{id="1775063910144" origin="starstruck.systems"}:policy_server_allows_event{room_id="!1jgDwjy7xL5JvjnaDkeZVfzW-RNHa5PausrxYBckJ90" room_version=V12 incoming=true}: conduwuit_service::rooms::event_handler::policy_server: Verifying policy server signature signature=rV7GL02dqbVvC6reX5jQmomJoHEASzWB6rvzh6Myu5rjaV6zClwbHH4r00+2ybpXkO0H7iqAd3dsT9U1f28ZBA 2026-04-02T17:09:27.395148Z DEBUG process_inbound_transaction{id="1775063910144" origin="starstruck.systems"}:policy_server_allows_event{room_id="!1jgDwjy7xL5JvjnaDkeZVfzW-RNHa5PausrxYBckJ90" room_version=V12 incoming=true}: conduwuit_service::rooms::event_handler::policy_server: Policy server signature verification failed error=Verification error: Could not verify signature: signature error: Verification equation was not satisfied ``` whatever, problem for later
Some checks failed
Check Changelog / Check for changelog (pull_request_target) Successful in 10s
Documentation / Build and Deploy Documentation (pull_request) Successful in 1m22s
Checks / Prek / Pre-commit & Formatting (pull_request) Successful in 3m1s
Required
Details
Update flake hashes / update-flake-hashes (pull_request) Successful in 56s
Checks / Prek / Clippy and Cargo Tests (pull_request) Failing after 25m4s
Required
Details
This pull request has changes conflicting with the target branch.
  • Cargo.lock
  • Cargo.toml
  • src/service/Cargo.toml
View command line instructions

Manual merge helper

Use this merge commit message when completing the merge manually.

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin nex/feat/policy-servers-2-electric-boogaloo:nex/feat/policy-servers-2-electric-boogaloo
git switch nex/feat/policy-servers-2-electric-boogaloo
Sign in to join this conversation.
No reviewers
continuwuation/Owners
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

2026-06-01

Depends on
Reference
continuwuation/continuwuity!1487
No description provided.