Drop the account-listing blocks that opaque usernames made pointless - #33
Merged
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #33 +/- ##
============================================
+ Coverage 86.64% 87.31% +0.66%
+ Complexity 650 621 -29
============================================
Files 73 71 -2
Lines 2269 2199 -70
============================================
- Hits 1966 1920 -46
+ Misses 303 279 -24 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
JeroenDeDauw
force-pushed
the
remove-account-listing-blocks
branch
from
September 2, 2026 22:41
90a0759 to
7be5ddf
Compare
Member
Author
|
Unsure we should drop all of this; will explore more |
JeroenDeDauw
force-pushed
the
remove-account-listing-blocks
branch
from
September 3, 2026 20:32
09b7a63 to
d43f68b
Compare
JeroenDeDauw
marked this pull request as ready for review
September 3, 2026 20:33
A member's account name identifies nobody, and their address lives in `user_email` and the roster.
Three defences were built to keep a member's username, then their email address, out of sight. What
they still hide is that members exist, how many there are, and when one joined or was deactivated,
which we do not treat as confidential. They are dropped.
Two of them were also defects. `Special:Redirect` was closed whole and `Special:FilePath` redirects
through it, so every member following a file path landed on a permission error. And
`{{Special:ListUsers}}` rendered empty for everyone, staff included, since what a transclusion
renders is not kept to the reader who asked for it. Both work again.
The rename log stays closed. An entry there names what an account was called before, which for a
member can be their email address, and the entry is permanent, so no later change to how members are
named takes those names back out of it.
Removed:
* `UserListSpecialPageHandler`, `$wgMemberAccessBlockedSpecialPages` and the `SpecialPageBeforeExecute`
wiring, which restores to members `Special:ListUsers`, `Special:ActiveUsers`, `Special:BlockList`,
`Special:Redirect`, `Special:UserRights` read-only, `Special:FilePath`, and the `{{Special:ListUsers}}`
transclusion
* `UserListApiHandler`, `$wgMemberAccessBlockedApiModules` and the `ApiCheckCanExecute` wiring, which
restores the `allusers`, `users` and `blocks` query modules
* the `newusers` and `block` log restrictions, leaving both logs as the wiki has them
* `memberaccess-api-module-denied` and `memberaccess-special-page-denied`, whose last use went with
the handlers, and `getStringListConfig`, whose last caller did
* the two settings from the README's configuration table, and the pages, modules and logs from what
loading the extension changes (the README's broader rewrite arrived through
#34)
Kept: the password veto and the password-reset filtering, the decoy codes and uniform responses, the
rate limits, the allowlist over single sign-on with its username minting and processors,
`$wgBlockDisablesLogin`, and the session invalidation on removal.
Tests: the two handlers' suites are gone. `RegistrationHandlerTest` pins the rename log as the only
log the extension closes, across every route state. `MemberLogVisibilityTest` becomes
`RenameLogVisibilityTest`, covering the one log that is still restricted and losing the code-login
machinery it needed to make a member. `MemberReadAccessTest` pins the restored surfaces; restoring
the two handlers locally turns every one of its cases red, which is what it is there for.
Verified on a wiki with member access on, as a reader-group account: `Special:ListUsers` lists
accounts under their opaque names, `Special:FilePath/<file>` redirects through to the file,
`action=query&list=allusers` answers, `Special:Log/renameuser` is refused, and an administrator sees
all of it, the rename log included.
Worth weighing: block reasons are member-visible now, on `Special:BlockList`, the block log and
recent changes. The extension's own are fixed messages that name nobody; one an administrator typed
by hand may. And an account created before the extension minted names keeps its address-shaped name
on every restored surface until its member is removed and added again through the admin panel — the
one wiki holding such accounts needs that done before this deploys.
Largely reverts #23 and
#25, whose reason for existing went with
#29.
Considered, omitted:
* keeping the special pages blocked and the API modules open, or the reverse; both defended the same
thing and neither defends anything now
* keeping `Special:Redirect` closed for its user lookups: `Special:Redirect/user/<id>` answers with a
name that identifies nobody, and closing it is what broke `Special:FilePath`
* leaving the two settings in place with empty defaults, so a wiki could go on blocking pages or
modules of its own choosing: deciding who may open which page is the wiki's own access control,
not this extension's
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
JeroenDeDauw
force-pushed
the
remove-account-listing-blocks
branch
from
September 3, 2026 20:36
d43f68b to
0ed20e8
Compare
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.
A member's account name identifies nobody, and their address lives in
user_emailand the roster.Three defences were built to keep a member's username, then their email address, out of sight. What
they still hide is that members exist, how many there are, and when one joined or was deactivated,
which we do not treat as confidential. They are dropped.
Two of them were also defects.
Special:Redirectwas closed whole andSpecial:FilePathredirectsthrough it, so every member following a file path landed on a permission error. And
{{Special:ListUsers}}rendered empty for everyone, staff included, since what a transclusionrenders is not kept to the reader who asked for it. Both work again.
The rename log stays closed. An entry there names what an account was called before, which for a
member can be their email address, and the entry is permanent, so no later change to how members are
named takes those names back out of it.
Removed:
UserListSpecialPageHandler,$wgMemberAccessBlockedSpecialPagesand theSpecialPageBeforeExecutewiring, which restores to members
Special:ListUsers,Special:ActiveUsers,Special:BlockList,Special:Redirect,Special:UserRightsread-only,Special:FilePath, and the{{Special:ListUsers}}transclusion
UserListApiHandler,$wgMemberAccessBlockedApiModulesand theApiCheckCanExecutewiring, whichrestores the
allusers,usersandblocksquery modulesnewusersandblocklog restrictions, leaving both logs as the wiki has themmemberaccess-api-module-deniedandmemberaccess-special-page-denied, whose last use went withthe handlers, and
getStringListConfig, whose last caller didloading the extension changes (the README's broader rewrite arrived through
Bring the README in line with the other extension READMEs #34)
Kept: the password veto and the password-reset filtering, the decoy codes and uniform responses, the
rate limits, the allowlist over single sign-on with its username minting and processors,
$wgBlockDisablesLogin, and the session invalidation on removal.Tests: the two handlers' suites are gone.
RegistrationHandlerTestpins the rename log as the onlylog the extension closes, across every route state.
MemberLogVisibilityTestbecomesRenameLogVisibilityTest, covering the one log that is still restricted and losing the code-loginmachinery it needed to make a member.
MemberReadAccessTestpins the restored surfaces; restoringthe two handlers locally turns every one of its cases red, which is what it is there for.
Verified on a wiki with member access on, as a reader-group account:
Special:ListUserslistsaccounts under their opaque names,
Special:FilePath/<file>redirects through to the file,action=query&list=allusersanswers,Special:Log/renameuseris refused, and an administrator seesall of it, the rename log included.
Worth weighing: block reasons are member-visible now, on
Special:BlockList, the block log andrecent changes. The extension's own are fixed messages that name nobody; one an administrator typed
by hand may. And an account created before the extension minted names keeps its address-shaped name
on every restored surface until its member is removed and added again through the admin panel — the
one wiki holding such accounts needs that done before this deploys.
Largely reverts #23 and
#25, whose reason for existing went with
#29.
Considered, omitted:
thing and neither defends anything now
Special:Redirectclosed for its user lookups:Special:Redirect/user/<id>answers with aname that identifies nobody, and closing it is what broke
Special:FilePathmodules of its own choosing: deciding who may open which page is the wiki's own access control,
not this extension's