From 4710d9c1eb965fd7db97f9f9c68f3b003d2efc65 Mon Sep 17 00:00:00 2001 From: JustArchi Date: Sat, 12 Mar 2016 05:58:51 +0100 Subject: [PATCH] Add support for WinAuth, #144 --- ArchiSteamFarm/Bot.cs | 98 ++++++++++++++++++++++++++--------- ArchiSteamFarm/BotDatabase.cs | 2 +- ArchiSteamFarm/Program.cs | 5 ++ 3 files changed, 80 insertions(+), 25 deletions(-) diff --git a/ArchiSteamFarm/Bot.cs b/ArchiSteamFarm/Bot.cs index 585360df6..616506d12 100755 --- a/ArchiSteamFarm/Bot.cs +++ b/ArchiSteamFarm/Bot.cs @@ -172,15 +172,9 @@ namespace ArchiSteamFarm { SentryFile = botPath + ".bin"; // Support and convert SDA files - if (BotDatabase.SteamGuardAccount == null && File.Exists(botPath + ".maFile")) { - Logging.LogGenericInfo("Converting SDA .maFile into ASF format...", botName); - try { - BotDatabase.SteamGuardAccount = JsonConvert.DeserializeObject(File.ReadAllText(botPath + ".maFile")); - File.Delete(botPath + ".maFile"); - Logging.LogGenericInfo("Success!", botName); - } catch (Exception e) { - Logging.LogGenericException(e, botName); - } + string maFilePath = botPath + ".maFile"; + if (BotDatabase.SteamGuardAccount == null && File.Exists(maFilePath)) { + ImportAuthenticator(maFilePath); } // Initialize @@ -432,6 +426,62 @@ namespace ArchiSteamFarm { Program.OnBotShutdown(); } + private void ImportAuthenticator(string maFilePath) { + if (BotDatabase.SteamGuardAccount != null || !File.Exists(maFilePath)) { + return; + } + + Logging.LogGenericInfo("Converting SDA .maFile into ASF format...", BotName); + try { + BotDatabase.SteamGuardAccount = JsonConvert.DeserializeObject(File.ReadAllText(maFilePath)); + File.Delete(maFilePath); + Logging.LogGenericInfo("Success!", BotName); + } catch (Exception e) { + Logging.LogGenericException(e, BotName); + return; + } + + // If this is SDA file, then we should already have everything ready + if (BotDatabase.SteamGuardAccount.Session != null) { + Logging.LogGenericInfo("Successfully finished importing mobile authenticator!", BotName); + return; + } + + // But here we're dealing with WinAuth authenticator + Logging.LogGenericInfo("ASF requires a few more steps to complete authenticator import...", BotName); + + InitializeLoginAndPassword(); + + UserLogin userLogin = new UserLogin(BotConfig.SteamLogin, BotConfig.SteamPassword); + LoginResult loginResult; + while ((loginResult = userLogin.DoLogin()) != LoginResult.LoginOkay) { + switch (loginResult) { + case LoginResult.Need2FA: + userLogin.TwoFactorCode = Program.GetUserInput(BotName, Program.EUserInputType.TwoFactorAuthentication); + break; + default: + Logging.LogGenericError("Unhandled situation: " + loginResult, BotName); + return; + } + } + + if (userLogin.Session == null) { + BotDatabase.SteamGuardAccount = null; + Logging.LogGenericError("Session is invalid, linking can't be completed!", BotName); + return; + } + + BotDatabase.SteamGuardAccount.FullyEnrolled = true; + BotDatabase.SteamGuardAccount.Session = userLogin.Session; + + if (string.IsNullOrEmpty(BotDatabase.SteamGuardAccount.DeviceID)) { + BotDatabase.SteamGuardAccount.DeviceID = Program.GetUserInput(BotName, Program.EUserInputType.DeviceID); + } + + BotDatabase.Save(); + Logging.LogGenericInfo("Successfully finished importing mobile authenticator!", BotName); + } + private string ResponseStatus() { if (CardsFarmer.CurrentGamesFarming.Count > 0) { return "Bot " + BotName + " is currently farming appIDs: " + string.Join(", ", CardsFarmer.CurrentGamesFarming) + " and has a total of " + CardsFarmer.GamesToFarm.Count + " games left to farm."; @@ -923,6 +973,9 @@ namespace ArchiSteamFarm { } Logging.LogGenericInfo("Linking new ASF MobileAuthenticator...", BotName); + + InitializeLoginAndPassword(); + UserLogin userLogin = new UserLogin(BotConfig.SteamLogin, BotConfig.SteamPassword); LoginResult loginResult; while ((loginResult = userLogin.DoLogin()) != LoginResult.LoginOkay) { @@ -985,6 +1038,16 @@ namespace ArchiSteamFarm { SteamFriends.JoinChat(BotConfig.SteamMasterClanID); } + private void InitializeLoginAndPassword() { + if (string.IsNullOrEmpty(BotConfig.SteamLogin)) { + BotConfig.SteamLogin = Program.GetUserInput(BotName, Program.EUserInputType.Login); + } + + if (string.IsNullOrEmpty(BotConfig.SteamPassword) && string.IsNullOrEmpty(BotDatabase.LoginKey)) { + BotConfig.SteamPassword = Program.GetUserInput(BotName, Program.EUserInputType.Password); + } + } + private void OnConnected(SteamClient.ConnectedCallback callback) { if (callback == null) { return; @@ -1013,13 +1076,7 @@ namespace ArchiSteamFarm { } } - if (string.IsNullOrEmpty(BotConfig.SteamLogin)) { - BotConfig.SteamLogin = Program.GetUserInput(BotName, Program.EUserInputType.Login); - } - - if (string.IsNullOrEmpty(BotConfig.SteamPassword) && string.IsNullOrEmpty(BotDatabase.LoginKey)) { - BotConfig.SteamPassword = Program.GetUserInput(BotName, Program.EUserInputType.Password); - } + InitializeLoginAndPassword(); SteamUser.LogOn(new SteamUser.LogOnDetails { Username = BotConfig.SteamLogin, @@ -1245,14 +1302,7 @@ namespace ArchiSteamFarm { // Support and convert SDA files string maFilePath = Path.Combine(Program.ConfigDirectory, callback.ClientSteamID.ConvertToUInt64() + ".maFile"); if (BotDatabase.SteamGuardAccount == null && File.Exists(maFilePath)) { - Logging.LogGenericInfo("Converting SDA .maFile into ASF format...", BotName); - try { - BotDatabase.SteamGuardAccount = JsonConvert.DeserializeObject(File.ReadAllText(maFilePath)); - File.Delete(maFilePath); - Logging.LogGenericInfo("Success!", BotName); - } catch (Exception e) { - Logging.LogGenericException(e, BotName); - } + ImportAuthenticator(maFilePath); } if (BotConfig.UseAsfAsMobileAuthenticator && TwoFactorAuth == null && BotDatabase.SteamGuardAccount == null) { diff --git a/ArchiSteamFarm/BotDatabase.cs b/ArchiSteamFarm/BotDatabase.cs index 00b1e72d9..3a4dbfdf6 100644 --- a/ArchiSteamFarm/BotDatabase.cs +++ b/ArchiSteamFarm/BotDatabase.cs @@ -91,7 +91,7 @@ namespace ArchiSteamFarm { // This constructor is used only by deserializer private BotDatabase() { } - private void Save() { + internal void Save() { lock (FilePath) { try { File.WriteAllText(FilePath, JsonConvert.SerializeObject(this)); diff --git a/ArchiSteamFarm/Program.cs b/ArchiSteamFarm/Program.cs index 06c89f382..f1dc07ec7 100644 --- a/ArchiSteamFarm/Program.cs +++ b/ArchiSteamFarm/Program.cs @@ -35,6 +35,8 @@ using System.Threading.Tasks; namespace ArchiSteamFarm { internal static class Program { internal enum EUserInputType : byte { + Unknown, + DeviceID, Login, Password, PhoneNumber, @@ -281,6 +283,9 @@ namespace ArchiSteamFarm { lock (ConsoleLock) { ConsoleIsBusy = true; switch (userInputType) { + case EUserInputType.DeviceID: + Console.Write("<" + botLogin + "> Please enter your Device ID (including \"android:\"): "); + break; case EUserInputType.Login: Console.Write("<" + botLogin + "> Please enter your login: "); break;