Pumpkin-MC/Pumpkin · error · ChatError

sent a chat that couldn't be validated

Error message

sent a chat that couldn't be validated

What it means

ChatError variant that fires during chat validation when the server cannot validate an incoming signed chat message against the player's chat session — bad signature, mismatched session state, or altered message body. It is a sentinel from the signed-chat validation guard; the input at fault is the signed chat payload whose signature check failed.

Solutions

  1. Kick the player whose chat failed validation
  2. Refuse to broadcast unvalidated messages
  3. Log the validation failure for moderation review
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at crates/pumpkin/src/net/java/play/mod.rs:134 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of Pumpkin-MC/Pumpkin@8d4639e25a (2026-09-09). Data as JSON: /api/errors/49dedeacaabc077f. Report an issue: GitHub.

Appendix: source

Thrown at crates/pumpkin/src/net/java/play/mod.rs:134

        match self {
            Self::BlockOutOfReach | Self::BlockOutOfWorld | Self::InvalidGamemode => None,
            Self::InvalidBlockFace => Some("Invalid block face".into()),
            Self::InvalidHand => Some("Invalid hand".into()),
        }
    }
}

#[derive(Debug, Error)]
pub enum ChatError {
    #[error("sent an oversized message")]
    OversizedMessage,
    #[error("sent a message with illegal characters")]
    IllegalCharacters,
    #[error("sent a chat with invalid/no signature")]
    UnsignedChat,
    #[error("has too many unacknowledged chats queued")]
    TooManyPendingChats,
    #[error("sent a chat that couldn't be validated")]
    ChatValidationFailed,
    #[error("sent a chat with an out of order timestamp")]
    OutOfOrderChat,
    #[error("has an expired public key")]
    ExpiredPublicKey,
    #[error("attempted to initialize a session with an invalid public key")]
    InvalidPublicKey,
}

impl PumpkinError for ChatError {
    fn is_kick(&self) -> bool {
        true
    }

    fn severity(&self) -> Level {
        Level::WARN
    }

View on GitHub (pinned to 8d4639e25a)