Pumpkin-MC/Pumpkin · error · AuthError

You are banned from Authentication servers

Error message

You are banned from Authentication servers

What it means

PacketDecodeError::NotCompressed is raised when a packet arrives without compression framing (uncompressed payload) even though its size exceeds the negotiated compression threshold. After compression is enabled, packets larger than the threshold must be zlib-compressed; an uncompressed packet of that size violates the protocol. This protects against misframed or protocol-violating traffic.

Solutions

  1. Verify the Set Compression packet was sent and acknowledged before applying threshold checks.
  2. Check that the client's protocol implementation honors the compression threshold.
  3. If compression is optional for your use case, ensure the threshold/config matches both endpoints.
  4. Close the connection for protocol violations from misbehaving peers.

Example fix

// before
if !is_compressed(payload) { return Ok(payload.to_vec()); } // silently accepts uncompressed
// after
if !is_compressed(payload) && payload.len() > compression_threshold {
    return Err(PacketDecodeError::NotCompressed);
}
Defensive patterns

Strategy: validation

Validate before calling

fn compression_ok(uncompressed: bool, len: usize, threshold: usize) -> bool {
    !(uncompressed && len > threshold)
}

Type guard

fn requires_compression(len: usize, threshold: usize) -> bool {
    len > threshold
}

Try / catch

match decode_packet(stream).await {
    Err(PacketDecodeError::NotCompressed) => {
        warn!("uncompressed packet above threshold; protocol violation");
        drop(stream);
    }
    Ok(p) => handle(p),
    Err(e) => warn!("decode error: {e}"),
}

Prevention

When it happens

Trigger: Decoding a packet whose length exceeds the configured compression threshold but whose payload is not zlib-compressed; a client that ignored or mishandled the Set Compression packet.

Common situations: Compression enabled mid-connection with a client that never switched; a proxy stripping compression; custom client implementations that toggle compression incorrectly.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


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

Appendix: source

Thrown at crates/pumpkin/src/net/authentication.rs:399

        }
    }

    if not_found_count > 0 {
        Ok(None)
    } else if let Some(status) = last_unknown_status {
        Err(AuthError::UnknownStatusCode(status))
    } else {
        Err(AuthError::FailedResponse)
    }
}

#[derive(Error, Debug)]
pub enum AuthError {
    #[error("Authentication servers are down")]
    FailedResponse,
    #[error("Failed to verify username")]
    UnverifiedUsername,
    #[error("You are banned from Authentication servers")]
    Banned,
    #[error("Texture Error {0}")]
    TextureError(TextureError),
    #[error("You have disallowed actions from Authentication servers")]
    DisallowedAction,
    #[error("Failed to parse JSON into Game Profile")]
    FailedParse,
    #[error("Unknown Status Code {0}")]
    UnknownStatusCode(StatusCode),
}

#[derive(Error, Debug)]
pub enum TextureError {
    #[error("Invalid URL")]
    InvalidURL,
    #[error("Invalid URL scheme for player texture: {0}")]
    DisallowedUrlScheme(String),
    #[error("Invalid URL domain for player texture: {0}")]

View on GitHub (pinned to 8d4639e25a)