Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/main/java/com/hackclub/hccore/commands/NickCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.hackclub.hccore.HCCorePlugin;
import com.hackclub.hccore.PlayerData;
import com.hackclub.hccore.playermessages.MustBePlayerMessage;
import com.hackclub.hccore.playermessages.nickname.NicknameAlreadyUsedMessage;
import com.hackclub.hccore.playermessages.nickname.NicknameLengthMessage;
import com.hackclub.hccore.playermessages.nickname.NicknameResetMessage;
import com.hackclub.hccore.playermessages.nickname.NicknameSetMessage;
Expand Down Expand Up @@ -42,6 +43,13 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd,
return true;
}

if (plugin.getDataManager().findData(data -> data.getNickname().equals(newNickname)) != null) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: NullPointerException when getNickname().equals() is called on a null nickname in NickCommand's findData predicate.
Severity: CRITICAL | Confidence: 1.00

🔍 Detailed Analysis

A NullPointerException occurs when NickCommand attempts to find an existing nickname using plugin.getDataManager().findData(). The predicate data -> data.getNickname().equals(newNickname) will invoke .equals() on a null object if any online player has not yet set their nickname (as nickname defaults to null). This unhandled exception crashes the server. A similar vulnerability exists in SlackBot.java line 319 where pData.getSlackId().equals(id) can also cause a NullPointerException if slackId is null.

💡 Suggested Fix

Before calling .equals() on data.getNickname(), ensure data.getNickname() is not null. A safe check would be newNickname.equals(data.getNickname()) or data.getNickname() != null && data.getNickname().equals(newNickname).

🤖 Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent.
Verify if this is a real issue. If it is, propose a fix; if not, explain why it's not
valid.

Location: src/main/java/com/hackclub/hccore/commands/NickCommand.java#L46

Potential issue: A NullPointerException occurs when `NickCommand` attempts to find an
existing nickname using `plugin.getDataManager().findData()`. The predicate `data ->
data.getNickname().equals(newNickname)` will invoke `.equals()` on a `null` object if
any online player has not yet set their nickname (as `nickname` defaults to `null`).
This unhandled exception crashes the server. A similar vulnerability exists in
`SlackBot.java` line 319 where `pData.getSlackId().equals(id)` can also cause a
NullPointerException if `slackId` is `null`.

Did we get this right? 👍 / 👎 to inform future reviews.

Reference_id: 2711684

sender.sendMessage(NicknameAlreadyUsedMessage.get(newNickname,
plugin.getDataManager().getData(player).getNameColor()));
return true;
}


if (newNickname.length() > PlayerData.MAX_NICKNAME_LENGTH) {
sender.sendMessage(NicknameLengthMessage.get(
PlayerData.MAX_NICKNAME_LENGTH));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.hackclub.hccore.playermessages.nickname;

import static net.kyori.adventure.text.Component.text;
import static net.kyori.adventure.text.minimessage.MiniMessage.miniMessage;

import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.TextColor;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;

public class NicknameAlreadyUsedMessage {
final static String minimsgSource = """
<red>The nickname <nickname> is already in use.</red>""";

public static Component get(String nickname, TextColor color) {
return miniMessage().deserialize(minimsgSource, TagResolver.resolver(
Placeholder.component("nickname", text(nickname).color(color))));
}
}
Loading