Skip to content

Drop the account-listing blocks that opaque usernames made pointless - #33

Merged
JeroenDeDauw merged 1 commit into
masterfrom
remove-account-listing-blocks
Sep 3, 2026
Merged

Drop the account-listing blocks that opaque usernames made pointless#33
JeroenDeDauw merged 1 commit into
masterfrom
remove-account-listing-blocks

Conversation

@JeroenDeDauw

@JeroenDeDauw JeroenDeDauw commented Sep 2, 2026

Copy link
Copy Markdown
Member

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
    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. 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

AI-authored — Claude Code, Opus 5 (max) implementation, review fixes and rebase, Fable 5 (max) design, review adjudication and edits; removal scoped by @JeroenDeDauw, several steering corrections along the way; diff not yet human-reviewed; suite, phpcs and phpstan run locally on the rebased commit, the restored surfaces clicked through in a browser pre-rebase, CI green.

@codecov-commenter

codecov-commenter commented Sep 2, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 87.31%. Comparing base (5a68767) to head (0ed20e8).
⚠️ Report is 1 commits behind head on master.

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.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@JeroenDeDauw

Copy link
Copy Markdown
Member Author

Unsure we should drop all of this; will explore more

@JeroenDeDauw
JeroenDeDauw force-pushed the remove-account-listing-blocks branch from 09b7a63 to d43f68b Compare September 3, 2026 20:32
@JeroenDeDauw
JeroenDeDauw marked this pull request as ready for review September 3, 2026 20:33
@JeroenDeDauw
JeroenDeDauw deleted the remove-account-listing-blocks branch September 3, 2026 20:33
@JeroenDeDauw
JeroenDeDauw restored the remove-account-listing-blocks branch September 3, 2026 20:34
@JeroenDeDauw JeroenDeDauw reopened this Sep 3, 2026
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
JeroenDeDauw force-pushed the remove-account-listing-blocks branch from d43f68b to 0ed20e8 Compare September 3, 2026 20:36
@JeroenDeDauw
JeroenDeDauw merged commit fc5aa79 into master Sep 3, 2026
6 checks passed
@JeroenDeDauw
JeroenDeDauw deleted the remove-account-listing-blocks branch September 3, 2026 20:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants