fix(identity): stop pointing members and operators at the portal being retired - #413
Merged
Conversation
…g retired Wizarr's wizard steps live in its SQLite database, not in this repo, so CI checks none of them and the 6f sweep would have deleted Authelia with the member-facing join path still aimed at it. The known problem was step 41's "Nieuwe mail aanvragen" button, which sent a member who missed their welcome mail to Authelia's reset form. It now points at authentik's public recovery flow, verified reachable unauthenticated and serving its identification stage. Two dead English steps and the bundle description named the old portal too and were corrected rather than left for the 6f sweep to rediscover. The database is now clean: no row anywhere names the old portal. The sweep turned up a second fault in step 41 that had nothing to do with 6f and was hurting members already. It told them to look in their inbox for a mail with the subject "Corsarium: Reset your password". authentik has not sent that subject since the branded Dutch mail landed; it sends "Stel het wachtwoord van je Corsarium-account in". Every member who joined in between was told to hunt for a subject line that did not exist while the real mail sat unread. lldap-sync-members.py had the same stale path baked into its "never got their login mail" alert. That one is worse than it looks, because the alert fires precisely when somebody already has an account they cannot sign in to, and after 6f it would have handed the operator a 404 at that moment. The URL now resolves through recovery_page_url(), which follows wherever the mail actually comes from, so 6f needs no code change on the day. Only Plex is attached to any invite, so nothing else has quietly gone SSO the way Kavita did.
PBernaerts
added a commit
that referenced
this pull request
Aug 21, 2026
#412 landed the 6f evidence records for items 2, 3 and 7 while this branch was open, and #413 landed the 6f-pre sweep, so both sides had touched the same two regions. Status table: each side owned one row, so both were kept. 6e is DONE per this branch, 6f-pre is DONE per #413. Evidence section: kept main's "Three things the 2026-08-21 run turned up" and dropped this branch's progress table, which had gone stale. It still listed items 1 and 5 as owed and both were proven by #411, and items 2, 3 and 7 are now recorded properly by #412, so the table would have contradicted the section directly above it. Kept the two traps this branch found, because neither is anywhere else: item 5 splitting into a cheap delivery half and an expensive trigger half, and item 3 being easy to fake with a LAN client that never touches Caddy at all.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Rebrand task 6f-pre, the blocker that has to land before 6f deletes Authelia.
Why this exists
Wizarr's wizard steps and invite copy live in its SQLite database, not in this
repo, so CI checks none of it and the 6f sweep would have missed it entirely.
Deleting Authelia with these in place breaks the join path for every new member.
What the sweep found
The database was swept column by column (skipping credential-bearing columns)
and is now clean: zero rows anywhere name the old portal.
The button now points at authentik's public recovery flow, verified
reachable unauthenticated from outside Cloudflare and serving
ak-stage-identificationunder its Dutch title. This is not a hostname swap:Authelia's
/reset-password/step1has no counterpart, the flow is the form.The second fault was not part of this task and was already hurting members.
Step 41 told them to look for a mail with the subject "Corsarium: Reset your
password". authentik has not sent that since the branded Dutch mail landed at
6m; it sends "Stel het wachtwoord van je Corsarium-account in". Every member
who joined in between was sent hunting for a subject line that did not exist
while the real mail sat unread in front of them. Nothing measured this, which is
worth noting given the whole point of the 6f evidence gate.
Code, not database
scripts/lldap-sync-members.pyhad the same stale path baked into its "Newmember never got their login mail" alert. That one is the nastiest of the set:
it fires exactly when somebody already has an account they cannot sign in to,
and after 6f it would have handed the operator a 404 at that precise moment.
The URL now resolves through
recovery_page_url(), which follows wherever themail actually comes from: authentik's recovery flow once the portal variable is
set, Authelia's form while it is not, "the portal" if neither is. So 6f needs
no code change on the day.
Also checked, clean
wizarr-nl-overrides.sh,wizarr-base-template.shandnl/overrides.jsoncontain no reference to the old portal.
and been left asking members for a password, the way Kavita did on 08-21.
Verification
tear), written in one transaction, then read back from inside the container
rather than trusted from the timestamp. Wizarr healthy throughout, ownership
re-asserted to uid 99.
ctime moves. restic keys on ctime so backups still catch it, but mtime is not
a valid check that an edit landed.
recovery_page_url(), confirmed to fail whenthe fix is reverted. Suite 74 to 77.
tests/run.shgreen, zero failing suites.Merge notes
is green on all nine checks; this PR would only have collided with it. docs(identity): record the 6e forward-auth cutover as done #409 is
unowned and should just be merged.
touches the 6f-pre section and the 6f-pre Status row.
Deploy: none required for the database half, which is already live on the
server. The script change ships with the next converge.