Replaces all registration and authentication methods with federated GPG key-based auth.
New flow
Each user must have a personal GPG key — that key already contains their name and email. The key is provided to any M8SH node the user visits. The node extracts the email and name, and creates the user following one of two scenarios:
If the user's email is from an external domain (not the M8SH node's domain), the generated username will be username.example.com for email username@example.com, and the user will be created as restricted. External users must verify their identity via one of two methods. First - M8SH attempts to fetch the key from https://example.com/username.gpg: if the key matches, verification is complete; if a different key is returned, verification fails (impersonation attempt); if the endpoint doesn't exist, fall back to the second method. Second - send an email verification message, used as a fallback when GPG validation is unavailable.
If the user's email matches the domain M8SH is hosted on, the local part of the email is used as the username as-is, the user is created as non-restricted by default (configurable), and no identity verification is required.
What was done
Removed all non-GPG registration and authentication endpoints
Removed UI and settings for password, OAuth2, OpenID, passkey, and SSPI auth methods
Replaced login and registration forms with GPG nonce-signing flow
Added reusable frontend nonce widget (gpg-nonce.ts) with TTL and replay protection
Added GPG registration endpoint - extracts identity from key UID, determines username and activation status based on domain
Added GPG login endpoint - extracts key ID from signature, looks up user, signs in
Domestic users (same domain as instance) are auto-activated with full access
External users with federated key verification are auto-activated but restricted
External users without federation fall back to email activation and remain restricted
Added translations for all new strings across 9 languages
## GPG-only authentication
Replaces all registration and authentication methods with federated GPG key-based auth.
### New flow
Each user must have a personal GPG key — that key already contains their name and email. The key is provided to any M8SH node the user visits. The node extracts the email and name, and creates the user following one of two scenarios:
- If the user's email is from an external domain (not the M8SH node's domain), the generated username will be username.example.com for email username@example.com, and the user will be created as restricted. External users must verify their identity via one of two methods. First - M8SH attempts to fetch the key from https://example.com/username.gpg: if the key matches, verification is complete; if a different key is returned, verification fails (impersonation attempt); if the endpoint doesn't exist, fall back to the second method. Second - send an email verification message, used as a fallback when GPG validation is unavailable.
- If the user's email matches the domain M8SH is hosted on, the local part of the email is used as the username as-is, the user is created as non-restricted by default (configurable), and no identity verification is required.
### What was done
1. Removed all non-GPG registration and authentication endpoints
2. Removed UI and settings for password, OAuth2, OpenID, passkey, and SSPI auth methods
3. Replaced login and registration forms with GPG nonce-signing flow
4. Added reusable frontend nonce widget (`gpg-nonce.ts`) with TTL and replay protection
5. Added GPG registration endpoint - extracts identity from key UID, determines username and activation status based on domain
6. Added GPG login endpoint - extracts key ID from signature, looks up user, signs in
7. Domestic users (same domain as instance) are auto-activated with full access
8. External users with federated key verification are auto-activated but restricted
9. External users without federation fall back to email activation and remain restricted
10. Added translations for all new strings across 9 languages
11. Corrected installation page template (removed deprecated auth/first account creation)
---
Related PR's/commits:
- [fixes1](https://m8sh.su/x/m8sh/pulls/6)
- [fixes2](https://m8sh.su/x/m8sh/commit/f66a267eca269ae3c1a8cb442d0431161a2d02ea)
- [fixes3](https://m8sh.su/x/m8sh/commit/4e378daa22386db52aacdbe0a5cc6e253410de3f)
- [fixes4](https://m8sh.su/x/m8sh/commit/6c3181f8933b0411fd9f6be9cf1b4d7d77a4b349)
- [fixes5](https://m8sh.su/x/m8sh/commit/116af0f554e5ac3ab960c0db563e10f94b16a983)
- [support for GPG clearsign](https://m8sh.su/x/m8sh/pulls/7)
- [UI improvement - copiable nonce on signup/signin](https://m8sh.su/x/m8sh/commit/b160d26ec9b4bbcb652dc0a776715ff2963f5350)
- [fixes6](https://m8sh.su/x/m8sh/commit/2f99f7c9d3d420e33313d69bc6e997724f43ebe2)
- [fixes7](https://m8sh.su/x/m8sh/commit/134c9203180db7ee4f3d7b6cebdbd4285ec0beee)
- [nonces are generated only per-domain](https://m8sh.su/x/m8sh/pulls/10)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
GPG-only authentication
Replaces all registration and authentication methods with federated GPG key-based auth.
New flow
Each user must have a personal GPG key — that key already contains their name and email. The key is provided to any M8SH node the user visits. The node extracts the email and name, and creates the user following one of two scenarios:
What was done
gpg-nonce.ts) with TTL and replay protectionRelated PR's/commits:
WIP: Gpg-based authorizationto WIP: Federated GPG-based auth