diff --git a/solitaire_data/src/sync_client.rs b/solitaire_data/src/sync_client.rs index 408ec98..71a74fd 100644 --- a/solitaire_data/src/sync_client.rs +++ b/solitaire_data/src/sync_client.rs @@ -309,6 +309,9 @@ impl SyncProvider for SolitaireServerClient { async fn opt_in_leaderboard(&self, display_name: &str) -> Result<(), SyncError> { let token = self.access_token()?; let url = format!("{}/api/leaderboard/opt-in", self.base_url); + // Enforce the server's 32-char column limit at the client boundary so + // the server never receives an over-length name regardless of caller. + let display_name: String = display_name.chars().take(32).collect(); let resp = self .client diff --git a/solitaire_engine/src/leaderboard_plugin.rs b/solitaire_engine/src/leaderboard_plugin.rs index afb70d9..370fd98 100644 --- a/solitaire_engine/src/leaderboard_plugin.rs +++ b/solitaire_engine/src/leaderboard_plugin.rs @@ -746,7 +746,7 @@ fn handle_display_name_confirm( return; } if let Some(mut settings) = settings { - let trimmed = buf.0.trim().to_string(); + let trimmed: String = buf.0.trim().chars().take(32).collect(); settings.0.leaderboard_display_name = if trimmed.is_empty() { None } else {