mirror of
https://github.com/achiez/NebulaAuth-Steam-Desktop-Authenticator-by-Achies.git
synced 2026-07-25 06:14:31 +00:00
a9fdb58cac
Several methods were added and modified in `Storage.cs`, `MainVM_Groups.cs`, `MainVM_Proxy.cs`, and `ProxyManagerVM.cs` to validate if the data can be saved before performing various operations. The `SnackbarController.cs` was modified to increase the minimum snackbar time and adjust the duration calculation. In `MafileSerializer_SessionData.cs`, the check for whether the refresh token is expired or not was moved to a different location within the code. New localization entries were added in `localization.loc.json`. The changes are as follows: 1. Added a new HTML file `changelog\1.4.8.html` to the project `NebulaAuth.sln`. 2. Added a new converter `ProxyDataTextConverter` to `App.xaml`. 3. Imported `AchiesUtilities.Web.Proxy` in `ProxyTextConverter.cs`. 4. Modified the return string in `ProxyTextConverter` to include the port number. 5. Added a new class `ProxyDataTextConverter` in `ProxyTextConverter.cs`. 6. Increased the minimum snackbar time from 1000 to 1200 in `SnackbarController.cs`. 7. Modified the duration calculation in `GetSnackbarTime` method in `SnackbarController.cs`. 8. Added tooltips to ComboBoxes in `MainWindow.xaml`. 9. Added a new method `ValidateCanSave` in `Storage.cs` to validate if the data can be saved. 10. Added a new method `GetProxyString` in `ProxyStorage.cs` to get the proxy string. 11. Modified the `CompareProxy` method in `ProxyStorage.cs` to compare the address and port of the proxy data. 12. Removed a logger info line in `Shell.cs`. 13. Added a new property `DuplicateFound` in `Storage.cs`. 14. Modified the `CreatePathForMafile` method in `Storage.cs` to create a file name based on the account name or steam id. 15. Modified the `AddGroup` method in `MainVM_Groups.cs` to validate if the data can be saved before adding a group. 16. Modified the `AddToGroup` method in `MainVM_Groups.cs` to validate if the data can be saved before adding to a group. 17. Modified the `RemoveGroup` method in `MainVM_Groups.cs` to validate if the data can be saved before removing a group. 18. Modified the `PerformQuery` method in `MainVM_Groups.cs` to set `SelectedMafile` to the first item in `MaFiles`. 19. Modified the `RemoveProxy` method in `MainVM_Proxy.cs` to validate if the data can be saved before removing a proxy. 20. Modified the `SelectedProxyChanged` method in `MainVM_Proxy.cs` to validate if the data can be saved before changing the selected proxy. 21. Added a new method `ValidateCanSaveAndWarn` in `MainVM_Proxy.cs` to validate if the data can be saved and send a snackbar message if it can't. 22. Modified the `TimerCheckSeconds` property in `MainVM_Timer.cs` to send a snackbar message when the timer is changed. 23. Added a new method `RemoveProxy` in `LoginAgainOnImportVM.cs` to remove the selected proxy. 24. Modified the `AddProxy` method in `ProxyManagerVM.cs` to use the `DefaultScheme` to parse the proxy data. 25. Modified the `AddProxy` method in `ProxyManagerVM.cs` to use the `DefaultScheme` to parse the proxy data and get the proxy string. 26. Modified the `CopyProxy` method in `ProxyManagerVM.cs` to get the proxy string. 27. Added new localization entries in `localization.loc.json`. 28. The `update.xml` file was updated to reflect the new version of the software (1.4.8.0) and the corresponding download URL and changelog URL were updated accordingly. 29. In `AdmissionHelper.cs`, a new constant `SESSION_ID_COOKIE_NAME` was added to replace hardcoded "sessionid" strings. The same was done for `LANGUAGE_COOKIE_NAME` replacing "Steam_Language". This change was reflected in multiple methods within the `AdmissionHelper` class. 30. A new method `CloneCookie` was added to `AdmissionHelper.cs` to create a copy of a given cookie. This method was then used to replace repetitive code in the `TransferCommunityCookies` method. 31. In `MafileSerializer_SessionData.cs`, the check for whether the refresh token is expired or not was moved to a different location within the code. This change does not affect the functionality but may improve readability or maintainability of the code.
199 lines
6.5 KiB
C#
199 lines
6.5 KiB
C#
using CommunityToolkit.Mvvm.ComponentModel;
|
|
using CommunityToolkit.Mvvm.Input;
|
|
using MaterialDesignThemes.Wpf;
|
|
using NebulaAuth.Core;
|
|
using NebulaAuth.Model;
|
|
using NebulaAuth.Model.Entities;
|
|
using NebulaAuth.Utility;
|
|
using SteamLib.Exceptions;
|
|
using SteamLib.SteamMobile;
|
|
using System;
|
|
using System.Collections.ObjectModel;
|
|
using System.Collections.Specialized;
|
|
using System.Linq;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using NebulaAuth.View.Dialogs;
|
|
|
|
namespace NebulaAuth.ViewModel;
|
|
|
|
public partial class MainVM : ObservableObject
|
|
{
|
|
[ObservableProperty]
|
|
private ObservableCollection<Mafile> _maFiles = Storage.MaFiles;
|
|
public SnackbarMessageQueue MessageQueue => SnackbarController.MessageQueue;
|
|
|
|
public Mafile? SelectedMafile
|
|
{
|
|
get => _selectedMafile;
|
|
set => SetMafile(value);
|
|
}
|
|
private Mafile? _selectedMafile;
|
|
|
|
|
|
public MainVM()
|
|
{
|
|
CreateCodeTimer();
|
|
_confirmTimer = new Timer(ConfirmByTimer, null, TimeSpan.FromSeconds(_timerCheckSeconds), TimeSpan.FromSeconds(_timerCheckSeconds));
|
|
Proxies = new ObservableCollection<MaProxy>(ProxyStorage.Proxies.Select(kvp =>
|
|
new MaProxy(kvp.Key, kvp.Value)));
|
|
Storage.MaFiles.CollectionChanged += MaFilesOnCollectionChanged;
|
|
QueryGroups();
|
|
SessionHandler.LoginStarted += SessionHandlerOnLoginStarted;
|
|
SessionHandler.LoginCompleted += SessionHandlerOnLoginCompleted;
|
|
UpdateManager.CheckForUpdates();
|
|
if (Storage.DuplicateFound > 0)
|
|
{
|
|
SnackbarController.SendSnackbar(
|
|
GetLocalizationOrDefault("DuplicateMafilesFound") + " " + Storage.DuplicateFound,
|
|
TimeSpan.FromSeconds(4));
|
|
}
|
|
}
|
|
|
|
|
|
private void SetMafile(Mafile? mafile)
|
|
{
|
|
if (mafile != SelectedMafile)
|
|
{
|
|
_selectedMafile = mafile;
|
|
OnPropertyChanged(nameof(SelectedMafile));
|
|
MaClient.SetAccount(mafile);
|
|
OnPropertyChanged(nameof(ConfirmationsVisible));
|
|
if (Settings.DisableTimersOnChange) OffTimer(dispatcher: false);
|
|
SetCurrentProxy();
|
|
OnPropertyChanged(nameof(IsDefaultProxy));
|
|
if (mafile != null) Code = SteamGuardCodeGenerator.GenerateCode(mafile.SharedSecret);
|
|
}
|
|
}
|
|
|
|
|
|
[RelayCommand]
|
|
public async Task LoginAgain()
|
|
{
|
|
if (SelectedMafile == null)
|
|
{
|
|
return;
|
|
}
|
|
var loginAgainVm = await DialogsController.ShowLoginAgainDialog(SelectedMafile.AccountName);
|
|
if (loginAgainVm == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var password = loginAgainVm.Password;
|
|
var waitDialog = new WaitLoginDialog();
|
|
var wait = DialogHost.Show(waitDialog);
|
|
try
|
|
{
|
|
await MaClient.LoginAgain(SelectedMafile, password, loginAgainVm.SavePassword, waitDialog);
|
|
SnackbarController.SendSnackbar(GetLocalizationOrDefault("SuccessfulLogin"));
|
|
}
|
|
catch (LoginException ex)
|
|
{
|
|
SnackbarController.SendSnackbar(ErrorTranslatorHelper.TranslateLoginError(ex.Error), TimeSpan.FromSeconds(1.5));
|
|
}
|
|
catch (Exception ex)
|
|
when (ExceptionHandler.Handle(ex))
|
|
{
|
|
Shell.Logger.Error(ex);
|
|
}
|
|
finally
|
|
{
|
|
DialogsController.CloseDialog();
|
|
await wait;
|
|
}
|
|
}
|
|
private void MaFilesOnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)
|
|
{
|
|
SearchText = string.Empty;
|
|
}
|
|
|
|
|
|
[RelayCommand]
|
|
private async Task RefreshSession()
|
|
{
|
|
if (SelectedMafile == null) return;
|
|
try
|
|
{
|
|
await MaClient.RefreshSession(SelectedMafile);
|
|
SnackbarController.SendSnackbar(GetLocalizationOrDefault("SessionRefreshed"));
|
|
}
|
|
catch (Exception ex) when (ExceptionHandler.Handle(ex))
|
|
{
|
|
Shell.Logger.Error(ex);
|
|
}
|
|
}
|
|
|
|
[RelayCommand]
|
|
public async Task LinkAccount()
|
|
{
|
|
OffTimer(false);
|
|
await DialogsController.ShowLinkerDialog();
|
|
}
|
|
|
|
[RelayCommand]
|
|
private async Task RemoveAuthenticator()
|
|
{
|
|
var selectedMafile = SelectedMafile;
|
|
if (selectedMafile == null) return;
|
|
if (string.IsNullOrWhiteSpace(selectedMafile.RevocationCode))
|
|
{
|
|
SnackbarController.SendSnackbar(LocManager.GetCommonOrDefault("Error", "Error") + ": " + GetLocalizationOrDefault("MissingRCode"));
|
|
return;
|
|
}
|
|
try
|
|
{
|
|
if (await DialogsController.ShowConfirmCancelDialog(GetLocalizationOrDefault("ConfirmRemovingAuthenticator")))
|
|
{
|
|
var result = await SessionHandler.Handle(() => MaClient.RemoveAuthenticator(selectedMafile), selectedMafile);
|
|
SnackbarController.SendSnackbar(
|
|
result.Success ? GetLocalizationOrDefault("AuthenticatorRemoved") : GetLocalizationOrDefault("AuthenticatorNotRemoved"));
|
|
|
|
if (result.Success)
|
|
{
|
|
Storage.MoveToRemoved(selectedMafile);
|
|
MaFiles.Remove(selectedMafile);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SnackbarController.SendSnackbar(LocManager.GetCommonOrDefault("Canceled", "Canceled"));
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
when (ExceptionHandler.Handle(ex, handleAllExceptions: true))
|
|
{
|
|
Shell.Logger.Error(ex);
|
|
}
|
|
}
|
|
|
|
[RelayCommand]
|
|
private async Task ConfirmLogin()
|
|
{
|
|
if (SelectedMafile == null) return;
|
|
|
|
try
|
|
{
|
|
LoginConfirmationResult res = await SessionHandler.Handle(() => MaClient.ConfirmLoginRequest(SelectedMafile), SelectedMafile);
|
|
if (res.Success)
|
|
{
|
|
SnackbarController.SendSnackbar($"{GetLocalizationOrDefault("ConfirmLoginSuccess")} {res.IP} ({res.Country})");
|
|
}
|
|
else
|
|
{
|
|
string msg = res.Error switch
|
|
{
|
|
LoginConfirmationError.NoRequests => GetLocalizationOrDefault("ConfirmLoginFailedNoRequests"),
|
|
LoginConfirmationError.MoreThanOneRequest => GetLocalizationOrDefault("ConfirmLoginFailedMoreThanOneRequest"), //TODO
|
|
_ => throw new ArgumentOutOfRangeException()
|
|
};
|
|
SnackbarController.SendSnackbar(msg);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
when (ExceptionHandler.Handle(ex, handleAllExceptions: true))
|
|
{
|
|
Shell.Logger.Error(ex);
|
|
}
|
|
}
|
|
} |