From dbfc4335561f68ace8d0fe7856d7f8f9ea22b2ee Mon Sep 17 00:00:00 2001 From: "pullfrog[bot]" <226033991+pullfrog[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2026 22:55:16 +0000 Subject: [PATCH] fix: accept string Steam IDs in SDA imports --- src/accountmanager/legacy.rs | 26 +++++++++++++++++-- src/accountmanager/migrate.rs | 5 ++++ .../maFiles/compat/string-steam-id.maFile | 20 ++++++++++++++ 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 src/fixtures/maFiles/compat/string-steam-id.maFile diff --git a/src/accountmanager/legacy.rs b/src/accountmanager/legacy.rs index 9b07bfef..67e3a60a 100644 --- a/src/accountmanager/legacy.rs +++ b/src/accountmanager/legacy.rs @@ -8,7 +8,7 @@ use std::{ use log::debug; use secrecy::{CloneableSecret, DebugSecret, ExposeSecret}; -use serde::Deserialize; +use serde::{Deserialize, Deserializer}; use steamguard::{token::TwoFactorSecret, SecretString, SteamGuardAccount}; use zeroize::{Zeroize, ZeroizeOnDrop}; @@ -154,10 +154,32 @@ pub struct Session { pub web_cookie: Option, #[serde(default, rename = "OAuthToken")] pub token: Option, - #[serde(rename = "SteamID")] + #[serde( + default, + rename = "SteamID", + deserialize_with = "deserialize_optional_u64" + )] pub steam_id: Option, } +fn deserialize_optional_u64<'de, D: Deserializer<'de>>( + deserializer: D, +) -> Result, D::Error> { + #[derive(Deserialize)] + #[serde(untagged)] + enum StringOrU64 { + String(String), + U64(u64), + } + + Option::::deserialize(deserializer)? + .map(|value| match value { + StringOrU64::String(value) => value.parse().map_err(serde::de::Error::custom), + StringOrU64::U64(value) => Ok(value), + }) + .transpose() +} + impl CloneableSecret for Session {} impl DebugSecret for Session {} diff --git a/src/accountmanager/migrate.rs b/src/accountmanager/migrate.rs index e07e9c9c..60a88da1 100644 --- a/src/accountmanager/migrate.rs +++ b/src/accountmanager/migrate.rs @@ -417,6 +417,11 @@ mod tests { account_name: "example", steam_id: 1234, }, + Test { + mafile: "src/fixtures/maFiles/compat/string-steam-id.maFile", + account_name: "example", + steam_id: 76561000000000000, + }, Test { mafile: "src/fixtures/maFiles/compat/steamv2/sample.maFile", account_name: "afarihm", diff --git a/src/fixtures/maFiles/compat/string-steam-id.maFile b/src/fixtures/maFiles/compat/string-steam-id.maFile new file mode 100644 index 00000000..a408ce43 --- /dev/null +++ b/src/fixtures/maFiles/compat/string-steam-id.maFile @@ -0,0 +1,20 @@ +{ + "shared_secret": "zvIayp3JPvtvX/QGHqsqKBk/44s=", + "serial_number": "14767137786155771371", + "revocation_code": "R12345", + "uri": "otpauth://totp/Steam:example?secret=ASDF&issuer=Steam", + "account_name": "example", + "token_gid": "5f28d367c8d78a0", + "identity_secret": "kjsdlwowiqe=", + "secret_1": "sklduhfgsdlkjhf=", + "device_id": "android:99d2ad0e-4bad-4247-b111-26393aae0be3", + "server_time": 1790072054, + "fully_enrolled": true, + "Session": { + "SteamID": "76561000000000000", + "SessionID": "4dd7d775277043d772537f67", + "SteamLoginSecure": "76561000000000000%7C%7Csynthetic-token", + "AccessToken": "synthetic-access-token", + "RefreshToken": "synthetic-refresh-token" + } +}