fix(user): allow unblocking users promoted to admin (#39192)

Fixes #39189.

`IsUserBlockedBy` intentionally treats admin users as not blocked, but
`CanUnblockUser` was also using it to determine whether a blocking
relationship exists. If a previously blocked user is later promoted to
admin, the existing `user_blocking` record remains but can no longer be
removed.

This change separates those two concerns by adding `HasBlocking` for
checking the persisted blocking relationship. `CanUnblockUser` uses that
relationship check while `IsUserBlockedBy` keeps its existing admin-user
behavior.

A regression test verifies that an admin is still not considered blocked
while an existing blocking relationship can still be unblocked.
This commit is contained in:
Even
2026-09-23 16:54:12 +00:00
committed by GitHub
parent 191287d8be
commit 06e334121f
3 changed files with 15 additions and 6 deletions
+1 -1
View File
@@ -50,7 +50,7 @@ func CanUnblockUser(ctx context.Context, doer, blocker, blockee *user_model.User
return false
}
if !user_model.IsUserBlockedBy(ctx, blockee, blocker.ID) {
if !user_model.HasBlocking(ctx, blockee.ID, blocker.ID) {
return false
}
+4
View File
@@ -62,4 +62,8 @@ func TestCanUnblockUser(t *testing.T) {
assert.True(t, CanUnblockUser(t.Context(), user1, user2, user29))
assert.True(t, CanUnblockUser(t.Context(), user2, user2, user29))
assert.True(t, CanUnblockUser(t.Context(), user1, org17, user28))
// Existing block can still be removed after the blockee becomes an admin.
user29.IsAdmin = true
assert.False(t, user_model.IsUserBlockedBy(t.Context(), user29, user2.ID))
assert.True(t, CanUnblockUser(t.Context(), user2, user2, user29))
}