Skip to content

fix(security): gate rank admin subcommands and guard ban/kick null members - #151

Merged
zVapor-Dev merged 1 commit into
mainfrom
cursor/critical-correctness-bugs-ab7c
Sep 16, 2026
Merged

zVapor-Dev merged 1 commit into
mainfrom
cursor/critical-correctness-bugs-ab7c

Conversation

@cursor

@cursor cursor Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor

Summary

Critical bug inspection found two high-severity issues missed during the #130 security hardening pass.

Bug 1 — Unauthorized /rank reset and /rank set (Critical)

Impact: Any guild member could reset or arbitrarily set another user's XP/level.

Root cause: PR #130 added Discord permission gates to moderation commands but /rank reset and /rank set were never gated. The global validator only checks userPermissions when defined on the command module.

Fix: Require ManageGuild via existing denyUnlessManageGuild helper before database writes in reset/set subcommands. /rank info remains available to all members.

Trigger: /rank reset user:@target or /rank set user:@target level:999 as a regular member.

Bug 2 — /ban and /kick crash on null member (High)

Impact: Moderation commands throw TypeError: Cannot read properties of null when the target user is not a current guild member, breaking moderation workflows.

Root cause: interaction.options.getMember("user") returns null for users who left or were never cached, but code accessed member.bannable / member.kickable without a guard (unlike /timeout).

Fix:

  • ban: Fall back to guild.members.ban(user) when member is null (supports banning users not currently in the server).
  • kick: Return a clear error when member is null (kick requires guild membership).

Trigger: Moderator runs /ban or /kick on a user ID who is not currently in the guild.

Validation

  • npm test — 51/51 passing
  • Added regression tests: tests/rank-admin-gate.test.js, tests/moderation-null-member.test.js
Open in Web View Automation 

…mbers

- Require ManageGuild for /rank reset and /rank set (missed in #130 hardening)
- Ban users not currently in guild via guild.members.ban instead of crashing
- Reject /kick when target is not a guild member before accessing kickable
- Add regression tests for both fixes

Co-authored-by: Daan Vrieling <contact@zvapor.xyz>
@zVapor-Dev
zVapor-Dev marked this pull request as ready for review September 16, 2026 22:51
@zVapor-Dev
zVapor-Dev merged commit 9a34a3b into main Sep 16, 2026
2 checks passed
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