mirror of
https://github.com/achiez/NebulaAuth-Steam-Desktop-Authenticator-by-Achies.git
synced 2026-07-25 06:14:31 +00:00
1.5.4 prepared for release
- Compatibility update is completed - Added 'Copy SteamId' menu item in context menu of mafile - Proxy and password automatically saved in mafile after linking - SetCryptPasswordDialog now supports "Enter" hot-key - Loc updates - Added PlannedChanges.txt - Added ClipboardHelper.cs to improved code readability
This commit is contained in:
@@ -201,6 +201,7 @@
|
|||||||
<FrameworkElement.ContextMenu>
|
<FrameworkElement.ContextMenu>
|
||||||
<ContextMenu>
|
<ContextMenu>
|
||||||
<MenuItem InputGestureText="Ctrl+C" Header="{Tr MainWindow.ContextMenus.Mafile.CopyLogin}" Command="{Binding CopyLoginCommand}" CommandParameter="{Binding PlacementTarget.SelectedValue, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />
|
<MenuItem InputGestureText="Ctrl+C" Header="{Tr MainWindow.ContextMenus.Mafile.CopyLogin}" Command="{Binding CopyLoginCommand}" CommandParameter="{Binding PlacementTarget.SelectedValue, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />
|
||||||
|
<MenuItem Header="{Tr MainWindow.ContextMenus.Mafile.CopySteamId}" Command="{Binding CopySteamIdCommand}" CommandParameter="{Binding PlacementTarget.SelectedValue, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />
|
||||||
<MenuItem InputGestureText="Ctrl+X" Header="{Tr MainWindow.ContextMenus.Mafile.CopyMafile}" Command="{Binding CopyMafileCommand}" CommandParameter="{Binding PlacementTarget.SelectedValue, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />
|
<MenuItem InputGestureText="Ctrl+X" Header="{Tr MainWindow.ContextMenus.Mafile.CopyMafile}" Command="{Binding CopyMafileCommand}" CommandParameter="{Binding PlacementTarget.SelectedValue, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />
|
||||||
<MenuItem Header="{Tr MainWindow.ContextMenus.Mafile.AddToGroup}" ItemsSource="{Binding Groups}">
|
<MenuItem Header="{Tr MainWindow.ContextMenus.Mafile.AddToGroup}" ItemsSource="{Binding Groups}">
|
||||||
<ItemsControl.ItemContainerStyle>
|
<ItemsControl.ItemContainerStyle>
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
using System;
|
||||||
|
using NebulaAuth.Model.Entities;
|
||||||
|
using SteamLib;
|
||||||
|
|
||||||
|
namespace NebulaAuth.Model.Exceptions;
|
||||||
|
|
||||||
|
public class MafileNeedReloginException : Exception
|
||||||
|
{
|
||||||
|
public Mafile Mafile { get; }
|
||||||
|
|
||||||
|
public MafileNeedReloginException(Mafile mafile)
|
||||||
|
{
|
||||||
|
Mafile = mafile;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@ using SteamLib;
|
|||||||
using SteamLib.Utility.MafileSerialization;
|
using SteamLib.Utility.MafileSerialization;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System;
|
using System;
|
||||||
|
using NebulaAuth.Model.Exceptions;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace NebulaAuth.Model;
|
namespace NebulaAuth.Model;
|
||||||
@@ -20,7 +21,7 @@ public static class NebulaSerializer
|
|||||||
{
|
{
|
||||||
AllowDeviceIdGeneration = true,
|
AllowDeviceIdGeneration = true,
|
||||||
AllowSessionIdGeneration = true,
|
AllowSessionIdGeneration = true,
|
||||||
ThrowIfInvalidSteamId = true
|
ThrowIfInvalidSteamId = false
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -33,13 +34,19 @@ public static class NebulaSerializer
|
|||||||
var info = data.Info;
|
var info = data.Info;
|
||||||
if (info.IsExtended == false)
|
if (info.IsExtended == false)
|
||||||
throw new FormatException("Mafile is not extended data");
|
throw new FormatException("Mafile is not extended data");
|
||||||
|
|
||||||
|
|
||||||
var props = info.UnusedProperties ?? new Dictionary<string, JProperty>();
|
var props = info.UnusedProperties ?? new Dictionary<string, JProperty>();
|
||||||
var proxy = GetPropertyValue<MaProxy>("Proxy", props);
|
var proxy = GetPropertyValue<MaProxy>("Proxy", props);
|
||||||
var group = GetPropertyValue<string>("Group", props);
|
var group = GetPropertyValue<string>("Group", props);
|
||||||
var password = GetPropertyValue<string>("Password", props);
|
var password = GetPropertyValue<string>("Password", props);
|
||||||
return Mafile.FromMobileDataExtended((MobileDataExtended)mobileData, proxy, group, password);
|
var mafile = Mafile.FromMobileDataExtended((MobileDataExtended)mobileData, proxy, group, password);
|
||||||
|
|
||||||
|
|
||||||
|
if (!info.SteamIdValid)
|
||||||
|
throw new MafileNeedReloginException(mafile);
|
||||||
|
|
||||||
|
return mafile;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static T? GetPropertyValue<T>(string name, Dictionary<string, JProperty> dictionary)
|
private static T? GetPropertyValue<T>(string name, Dictionary<string, JProperty> dictionary)
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ using System.Collections.ObjectModel;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using AchiesUtilities.Extensions;
|
using AchiesUtilities.Extensions;
|
||||||
|
using NebulaAuth.Model.Exceptions;
|
||||||
|
using NLog.Targets;
|
||||||
using SteamLib;
|
using SteamLib;
|
||||||
|
|
||||||
namespace NebulaAuth.Model;
|
namespace NebulaAuth.Model;
|
||||||
@@ -66,7 +68,14 @@ public static class Storage
|
|||||||
MaFiles = new ObservableCollection<Mafile>(MaFiles.OrderBy(m => m.AccountName));
|
MaFiles = new ObservableCollection<Mafile>(MaFiles.OrderBy(m => m.AccountName));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path"></param>
|
||||||
|
/// <param name="overwrite"></param>
|
||||||
|
/// <exception cref="FormatException"></exception>
|
||||||
|
/// <exception cref="SessionInvalidException"></exception>
|
||||||
|
/// <exception cref="IOException"></exception>
|
||||||
public static void AddNewMafile(string path, bool overwrite)
|
public static void AddNewMafile(string path, bool overwrite)
|
||||||
{
|
{
|
||||||
Mafile data;
|
Mafile data;
|
||||||
@@ -74,17 +83,12 @@ public static class Storage
|
|||||||
{
|
{
|
||||||
data = ReadMafile(path);
|
data = ReadMafile(path);
|
||||||
}
|
}
|
||||||
catch (ArgumentException ex)
|
|
||||||
when(ex.ParamName == nameof(MobileDataExtended.SteamId))
|
|
||||||
{
|
|
||||||
throw new SessionInvalidException(); //Allows to handle LoginOnImport
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
when(ex is not MafileNeedReloginException)
|
||||||
{
|
{
|
||||||
Shell.Logger.Warn(ex, "Can't load mafile");
|
Shell.Logger.Warn(ex, "Can't load mafile");
|
||||||
throw new FormatException("File data is not valid", ex);
|
throw new FormatException("File data is not valid", ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(data.AccountName))
|
if (string.IsNullOrWhiteSpace(data.AccountName))
|
||||||
throw new FormatException("File data is not valid. Missing AccountName");
|
throw new FormatException("File data is not valid. Missing AccountName");
|
||||||
|
|
||||||
@@ -156,8 +160,8 @@ public static class Storage
|
|||||||
|
|
||||||
private static string CreatePathForMafile(Mafile data)
|
private static string CreatePathForMafile(Mafile data)
|
||||||
{
|
{
|
||||||
var fileName = Settings.Instance.UseAccountNameAsMafileName
|
var fileName = Settings.Instance.UseAccountNameAsMafileName
|
||||||
? CreateFileNameWithAccountName(data.AccountName)
|
? CreateFileNameWithAccountName(data.AccountName)
|
||||||
: CreateFileNameWithSteamId(data.SteamId);
|
: CreateFileNameWithSteamId(data.SteamId);
|
||||||
|
|
||||||
return Path.Combine(MafileFolder, fileName);
|
return Path.Combine(MafileFolder, fileName);
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<SatelliteResourceLanguages>en;ru;ua</SatelliteResourceLanguages>
|
<SatelliteResourceLanguages>en;ru;ua</SatelliteResourceLanguages>
|
||||||
<ApplicationIcon>Theme\lock.ico</ApplicationIcon>
|
<ApplicationIcon>Theme\lock.ico</ApplicationIcon>
|
||||||
<SupportedOSPlatformVersion>7.0</SupportedOSPlatformVersion>
|
<SupportedOSPlatformVersion>7.0</SupportedOSPlatformVersion>
|
||||||
<AssemblyVersion>1.5.3</AssemblyVersion>
|
<AssemblyVersion>1.5.4</AssemblyVersion>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
@@ -42,11 +42,6 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="Model\Exceptions\" />
|
|
||||||
<Folder Include="Utility\" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\SteamLibForked\SteamLibForked.csproj" />
|
<ProjectReference Include="..\SteamLibForked\SteamLibForked.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
• Есть люди которым нужна функция просмотра и завершения сессий аккаунта. Скорее всего в следующей версии это будет реализовано
|
||||||
|
• Сейчас, при наличии новой версии, отображается стандартное окно обновлений из библиотеки. Планируется сделать кастомный дизайн, для соответствия общему стилю.
|
||||||
|
• В приложении реализованы "совмещённые" подтверждения для торговой площадки. Т.е. при наличии более одного предмета, ожидающего подтверждение, можно либо отменить, либо подтвердить все. В планах добавить расширенный функционал, с возможностью точечного управления.
|
||||||
|
• Добавить кнопку "открыть мафайл" в меню "Файл" по аналогии с открытием папки
|
||||||
|
• Ускорить появление подсказок в интерфейсе
|
||||||
|
• Добавить запоминание пароля при привязке мафайла
|
||||||
|
• Функция переноса гуарда с мобильного устройства на ПК с созданием мафайла
|
||||||
|
• Добавить полное шифрование мафайлов по аналогии с SDA
|
||||||
|
• Сделать автоматический билд и загрузку обновления на Github при изменении в мастер ветке
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
using NebulaAuth.Core;
|
||||||
|
using NebulaAuth.Model;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Specialized;
|
||||||
|
using System.Windows;
|
||||||
|
|
||||||
|
namespace NebulaAuth.Utility;
|
||||||
|
|
||||||
|
public class ClipboardHelper
|
||||||
|
{
|
||||||
|
public static bool Set(string text)
|
||||||
|
{
|
||||||
|
var i = 0;
|
||||||
|
while (i < 20)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Clipboard.SetText(text);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (i == 19)
|
||||||
|
{
|
||||||
|
Shell.Logger.Error(ex);
|
||||||
|
SnackbarController.SendSnackbar(LocManager.GetCommonOrDefault("Error", "Error"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool SetFiles(StringCollection files)
|
||||||
|
{
|
||||||
|
var i = 0;
|
||||||
|
while (i < 20)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Clipboard.SetFileDropList(files);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (i == 19)
|
||||||
|
{
|
||||||
|
Shell.Logger.Error(ex);
|
||||||
|
SnackbarController.SendSnackbar(LocManager.GetCommonOrDefault("Error", "Error"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,13 +19,13 @@
|
|||||||
<RowDefinition Height="Auto"/>
|
<RowDefinition Height="Auto"/>
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<TextBlock IsHitTestVisible="False" TextWrapping="Wrap" FontWeight="Normal" Text="{Tr SetEncryptedPasswordDialog.DialogText}" theme:FontScaleWindow.Scale="0.8" theme:FontScaleWindow.ResizeFont="True" Margin="10,0,0,0" HorizontalAlignment="Left"/>
|
<TextBlock IsHitTestVisible="False" TextWrapping="Wrap" FontWeight="Normal" Text="{Tr SetEncryptedPasswordDialog.DialogText}" theme:FontScaleWindow.Scale="0.8" theme:FontScaleWindow.ResizeFont="True" Margin="10,0,0,0" HorizontalAlignment="Left"/>
|
||||||
<PasswordBox FontSize="16" materialDesign:PasswordBoxAssist.Password="{Binding Password}" Margin="10" Grid.Row="1" Style="{StaticResource MaterialDesignFloatingHintRevealPasswordBox}" materialDesign:HintAssist.Hint="{Tr SetEncryptedPasswordDialog.Password}" />
|
<PasswordBox FontSize="16" materialDesign:PasswordBoxAssist.Password="{Binding Password, UpdateSourceTrigger=PropertyChanged}" Margin="10" Grid.Row="1" Style="{StaticResource MaterialDesignFloatingHintRevealPasswordBox}" materialDesign:HintAssist.Hint="{Tr SetEncryptedPasswordDialog.Password}" />
|
||||||
<Grid Grid.Row="3">
|
<Grid Grid.Row="3">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition/>
|
<ColumnDefinition/>
|
||||||
<ColumnDefinition/>
|
<ColumnDefinition/>
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
<Button Margin="10,5,5,5" Style="{StaticResource MaterialDesignOutlinedButton}" Command="{x:Static materialDesign:DialogHost.CloseDialogCommand}" CommandParameter="{StaticResource True}" Content="{Tr SetEncryptedPasswordDialog.Ok}"/>
|
<Button IsDefault="True" Margin="10,5,5,5" Style="{StaticResource MaterialDesignOutlinedButton}" Command="{x:Static materialDesign:DialogHost.CloseDialogCommand}" CommandParameter="{StaticResource True}" Content="{Tr SetEncryptedPasswordDialog.Ok}"/>
|
||||||
<Button IsCancel="True" Grid.Column="1" Margin="5,5,10,5" Style="{StaticResource MaterialDesignOutlinedButton}" Command="{x:Static materialDesign:DialogHost.CloseDialogCommand}" CommandParameter="{StaticResource False}" Content="{Tr SetEncryptedPasswordDialog.Cancel}"/>
|
<Button IsCancel="True" Grid.Column="1" Margin="5,5,10,5" Style="{StaticResource MaterialDesignOutlinedButton}" Command="{x:Static materialDesign:DialogHost.CloseDialogCommand}" CommandParameter="{StaticResource False}" Content="{Tr SetEncryptedPasswordDialog.Cancel}"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ using System.Threading.Tasks;
|
|||||||
using System.Windows;
|
using System.Windows;
|
||||||
using AchiesUtilities.Extensions;
|
using AchiesUtilities.Extensions;
|
||||||
using NebulaAuth.Model.Entities;
|
using NebulaAuth.Model.Entities;
|
||||||
|
using NebulaAuth.Model.Exceptions;
|
||||||
using SteamLib.Exceptions;
|
using SteamLib.Exceptions;
|
||||||
using NebulaAuth.Utility;
|
using NebulaAuth.Utility;
|
||||||
using NebulaAuth.View.Dialogs;
|
using NebulaAuth.View.Dialogs;
|
||||||
@@ -99,11 +100,11 @@ public partial class MainVM //File //TODO: Refactor
|
|||||||
notAdded++;
|
notAdded++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (SessionInvalidException ex)
|
catch (MafileNeedReloginException ex)
|
||||||
{
|
{
|
||||||
if (path.Length == 1 && ex.Data.Contains("mafile"))
|
if (path.Length == 1 && ex.Mafile != null)
|
||||||
{
|
{
|
||||||
var mafile = (Mafile)ex.Data["mafile"]!;
|
var mafile = ex.Mafile;
|
||||||
if (await HandleAddMafileWithoutSession(mafile))
|
if (await HandleAddMafileWithoutSession(mafile))
|
||||||
{
|
{
|
||||||
added++;
|
added++;
|
||||||
@@ -243,58 +244,25 @@ public partial class MainVM //File //TODO: Refactor
|
|||||||
private void CopyLogin(object? mafile)
|
private void CopyLogin(object? mafile)
|
||||||
{
|
{
|
||||||
if(mafile is not Mafile maf) return;
|
if(mafile is not Mafile maf) return;
|
||||||
var i = 0;
|
if(ClipboardHelper.Set(maf.AccountName))
|
||||||
while (i < 20)
|
SnackbarController.SendSnackbar(GetLocalization("LoginCopied"));
|
||||||
{
|
}
|
||||||
try
|
|
||||||
{
|
|
||||||
Clipboard.SetText(maf.AccountName);
|
|
||||||
SnackbarController.SendSnackbar(GetLocalization("LoginCopied"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
if (i == 19)
|
|
||||||
{
|
|
||||||
Shell.Logger.Error(ex);
|
|
||||||
SnackbarController.SendSnackbar(LocManager.GetCommonOrDefault("Error", "Error"));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
[RelayCommand]
|
||||||
i++;
|
private void CopySteamId(object? mafile)
|
||||||
}
|
{
|
||||||
|
if (mafile is not Mafile maf) return;
|
||||||
|
|
||||||
|
if(ClipboardHelper.Set(maf.SteamId.ToString()))
|
||||||
|
SnackbarController.SendSnackbar(GetLocalization("SteamIdCopied"));
|
||||||
}
|
}
|
||||||
|
|
||||||
[RelayCommand]
|
[RelayCommand]
|
||||||
private void CopyMafile(object? mafile)
|
private void CopyMafile(object? mafile)
|
||||||
{
|
{
|
||||||
if (mafile is not Mafile maf) return;
|
if (mafile is not Mafile maf) return;
|
||||||
var i = 0;
|
|
||||||
var path = Storage.TryFindMafilePath(maf);
|
var path = Storage.TryFindMafilePath(maf);
|
||||||
if (path == null)
|
if(ClipboardHelper.SetFiles([path]))
|
||||||
{
|
SnackbarController.SendSnackbar(GetLocalization("MafileCopied"));
|
||||||
SnackbarController.SendSnackbar(GetLocalization("MafileNotCopied"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (i < 20)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Clipboard.SetFileDropList([path]);
|
|
||||||
SnackbarController.SendSnackbar(GetLocalization("MafileCopied"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
if (i == 19)
|
|
||||||
{
|
|
||||||
Shell.Logger.Error(ex);
|
|
||||||
SnackbarController.SendSnackbar(LocManager.GetCommonOrDefault("Error", "Error"));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -63,6 +63,8 @@ public partial class LinkAccountVM : ObservableObject, IEmailProvider, IPhoneNum
|
|||||||
|
|
||||||
private bool _isLinkStarted;
|
private bool _isLinkStarted;
|
||||||
private string _rCode = string.Empty;
|
private string _rCode = string.Empty;
|
||||||
|
private string _password = string.Empty;
|
||||||
|
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
[NotifyCanExecuteChangedFor(nameof(ProceedCommand))]
|
[NotifyCanExecuteChangedFor(nameof(ProceedCommand))]
|
||||||
private bool _canProceed = true;
|
private bool _canProceed = true;
|
||||||
@@ -136,6 +138,7 @@ public partial class LinkAccountVM : ObservableObject, IEmailProvider, IPhoneNum
|
|||||||
IsLogin = true;
|
IsLogin = true;
|
||||||
var userName = FieldText;
|
var userName = FieldText;
|
||||||
var pass = PassFieldText;
|
var pass = PassFieldText;
|
||||||
|
_password = pass;
|
||||||
FieldText = string.Empty;
|
FieldText = string.Empty;
|
||||||
IsFieldVisible = false;
|
IsFieldVisible = false;
|
||||||
HintText = string.Empty;
|
HintText = string.Empty;
|
||||||
@@ -192,6 +195,18 @@ public partial class LinkAccountVM : ObservableObject, IEmailProvider, IPhoneNum
|
|||||||
IsLinkCode = true;
|
IsLinkCode = true;
|
||||||
IsCompleted = true;
|
IsCompleted = true;
|
||||||
var mafile = Mafile.FromMobileDataExtended(result);
|
var mafile = Mafile.FromMobileDataExtended(result);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (SelectedProxy.HasValue)
|
||||||
|
mafile.Proxy = new MaProxy(SelectedProxy.Value.Key, SelectedProxy.Value.Value);
|
||||||
|
if (Settings.Instance.IsPasswordSet)
|
||||||
|
mafile.Password = PHandler.Encrypt(_password);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.Error(ex, "Error during saving Nebula data to mafile");
|
||||||
|
}
|
||||||
|
|
||||||
Storage.SaveMafile(mafile);
|
Storage.SaveMafile(mafile);
|
||||||
File.Delete(Path.Combine("mafiles_backup", mafile.AccountName + ".mafile"));
|
File.Delete(Path.Combine("mafiles_backup", mafile.AccountName + ".mafile"));
|
||||||
HintText =
|
HintText =
|
||||||
@@ -320,6 +335,7 @@ public partial class LinkAccountVM : ObservableObject, IEmailProvider, IPhoneNum
|
|||||||
CanProceed = true;
|
CanProceed = true;
|
||||||
_emailCodeTcs = new TaskCompletionSource<string>();
|
_emailCodeTcs = new TaskCompletionSource<string>();
|
||||||
_rCode = string.Empty;
|
_rCode = string.Empty;
|
||||||
|
_password = string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Backup(MobileDataExtended data)
|
private void Backup(MobileDataExtended data)
|
||||||
|
|||||||
@@ -269,6 +269,11 @@
|
|||||||
"ru": "Скопировать мафайл",
|
"ru": "Скопировать мафайл",
|
||||||
"ua": "Скопіювати мафайл"
|
"ua": "Скопіювати мафайл"
|
||||||
},
|
},
|
||||||
|
"CopySteamId": {
|
||||||
|
"en": "Copy SteamID",
|
||||||
|
"ru": "Скопировать SteamID",
|
||||||
|
"ua": "Скопіювати SteamID"
|
||||||
|
},
|
||||||
"AddToGroup": {
|
"AddToGroup": {
|
||||||
"en": "Add to group",
|
"en": "Add to group",
|
||||||
"ru": "Добавить в группу",
|
"ru": "Добавить в группу",
|
||||||
@@ -620,9 +625,9 @@
|
|||||||
"ua": "помилки:"
|
"ua": "помилки:"
|
||||||
},
|
},
|
||||||
"RemoveMafileConfirmation": {
|
"RemoveMafileConfirmation": {
|
||||||
"ru": "Удалить мафайл? Это действие переместит мафайл в папку 'mafiles_removed' (Это действие не удаляет Steam Guard с аккаунта)",
|
"ru": "Удалить мафайл? Мафайл будет перемещен в папку 'mafiles_removed' (Это действие не удаляет Steam Guard с аккаунта)",
|
||||||
"en": "Remove mafile? This action will move mafile to 'mafiles_removed' (This action does not remove the Steam Guard from the account)",
|
"en": "Remove mafile? Mafile will be moved to 'mafiles_removed' directory (This action does not remove the Steam Guard from the account)",
|
||||||
"ua": "Видалити мафайл? Ця дія перемістить мафайл у каталог 'mafiles_removed' (Ця дія не видаляє автентифікатор з облікового запису)"
|
"ua": "Видалити мафайл? Мафайл буде переміщено у каталог 'mafiles_removed' (Ця дія не видаляє автентифікатор з облікового запису)"
|
||||||
},
|
},
|
||||||
"CantRemoveAlreadyExist": {
|
"CantRemoveAlreadyExist": {
|
||||||
"ru": "Не удалось переместить мафайл, возможно в папке уже существует мафайл с таким именем.",
|
"ru": "Не удалось переместить мафайл, возможно в папке уже существует мафайл с таким именем.",
|
||||||
@@ -659,6 +664,11 @@
|
|||||||
"ru": "Логин скопирован",
|
"ru": "Логин скопирован",
|
||||||
"ua": "Логін скопійовано"
|
"ua": "Логін скопійовано"
|
||||||
},
|
},
|
||||||
|
"SteamIdCopied": {
|
||||||
|
"en": "SteamID copied",
|
||||||
|
"ru": "SteamID скопирован",
|
||||||
|
"ua": "SteamID скопійовано"
|
||||||
|
},
|
||||||
"MafileCopied": {
|
"MafileCopied": {
|
||||||
"en": "Mafile copied",
|
"en": "Mafile copied",
|
||||||
"ru": "Мафайл скопирован",
|
"ru": "Мафайл скопирован",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<item>
|
<item>
|
||||||
<version>1.5.3.0</version>
|
<version>1.5.4.0</version>
|
||||||
<url>https://github.com/achiez/NebulaAuth-Steam-Desktop-Authenticator-by-Achies/releases/download/1.5.3/NebulaAuth.1.5.3.zip</url>
|
<url>https://github.com/achiez/NebulaAuth-Steam-Desktop-Authenticator-by-Achies/releases/download/1.5.4/NebulaAuth.1.5.4.zip</url>
|
||||||
<changelog>https://achiez.github.io/NebulaAuth-Steam-Desktop-Authenticator-by-Achies/changelog/1.5.3.html</changelog>
|
<changelog>https://achiez.github.io/NebulaAuth-Steam-Desktop-Authenticator-by-Achies/changelog/1.5.4.html</changelog>
|
||||||
<mandatory>false</mandatory>
|
<mandatory>false</mandatory>
|
||||||
</item>
|
</item>
|
||||||
@@ -75,17 +75,20 @@ public class DeserializedMafileInfo
|
|||||||
public bool HasMissingImportantProperties => MissingImportantProperties is { Count: > 0 };
|
public bool HasMissingImportantProperties => MissingImportantProperties is { Count: > 0 };
|
||||||
public bool HasSession => SessionResult == DeserializedMafileSessionResult.Valid;
|
public bool HasSession => SessionResult == DeserializedMafileSessionResult.Valid;
|
||||||
public bool HasIdentificationProperty { get; init; }
|
public bool HasIdentificationProperty { get; init; }
|
||||||
|
public bool SteamIdValid { get; init; }
|
||||||
|
|
||||||
internal static DeserializedMafileInfo Create(MobileData mobileData, int? version = null, Dictionary<string, JProperty>? unusedProperties = null, HashSet<string>? missingProperties = null,
|
internal static DeserializedMafileInfo Create(MobileData mobileData, int? version = null, Dictionary<string, JProperty>? unusedProperties = null, HashSet<string>? missingProperties = null,
|
||||||
DeserializedMafileSessionResult sessionResult = DeserializedMafileSessionResult.Missing)
|
DeserializedMafileSessionResult sessionResult = DeserializedMafileSessionResult.Missing)
|
||||||
{
|
{
|
||||||
HashSet<string>? missingImportantProperties = null;
|
HashSet<string>? missingImportantProperties = null;
|
||||||
var hasIdentificationProperty = false;
|
var hasIdentificationProperty = false;
|
||||||
|
var steamIdValid = false;
|
||||||
var isExtended = false;
|
var isExtended = false;
|
||||||
if (mobileData is MobileDataExtended ext)
|
if (mobileData is MobileDataExtended ext)
|
||||||
{
|
{
|
||||||
hasIdentificationProperty = !string.IsNullOrWhiteSpace(ext.AccountName) || ext.SteamId.Steam64.Id > SteamId64.SEED;
|
steamIdValid = ext.SteamId.Steam64.Id > SteamId64.SEED;
|
||||||
isExtended = true;
|
hasIdentificationProperty = !string.IsNullOrWhiteSpace(ext.AccountName) || steamIdValid;
|
||||||
|
isExtended = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isExtended && missingProperties is { Count: > 0 })
|
if (isExtended && missingProperties is { Count: > 0 })
|
||||||
@@ -104,7 +107,8 @@ public class DeserializedMafileInfo
|
|||||||
MissingProperties = missingProperties,
|
MissingProperties = missingProperties,
|
||||||
UnusedProperties = unusedProperties,
|
UnusedProperties = unusedProperties,
|
||||||
SessionResult = sessionResult,
|
SessionResult = sessionResult,
|
||||||
HasIdentificationProperty = hasIdentificationProperty
|
HasIdentificationProperty = hasIdentificationProperty,
|
||||||
|
SteamIdValid = steamIdValid
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+17
-6
@@ -47,10 +47,10 @@
|
|||||||
padding: 0 15px;
|
padding: 0 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.description ul {
|
.description ul {
|
||||||
list-style: inside square;
|
list-style: inside square;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media only screen and (max-width: 600px) {
|
@media only screen and (max-width: 600px) {
|
||||||
.changelog-container {
|
.changelog-container {
|
||||||
@@ -67,11 +67,22 @@
|
|||||||
<!-- Changelog entry -->
|
<!-- Changelog entry -->
|
||||||
<div class="change">
|
<div class="change">
|
||||||
<div class="version">Version 1.5.4</div>
|
<div class="version">Version 1.5.4</div>
|
||||||
<div class="date">DATE</div>
|
<div class="date">10.11.2024</div>
|
||||||
<div class="description">
|
<div class="description">
|
||||||
- <b>NEWS:</b> Official Telegram group now available! Join us at <b><a href="https://t.me/nebulaauth">t.me/nebulaauth</a></b> <br />
|
<ul>
|
||||||
- <b>FIX:</b> TEMPORARY: Added workaround for old mafiles in MafileSerializer <br />
|
<li><b>NEWS:</b> Official Telegram group now available! Join us at <b><a href="https://t.me/nebulaauth">t.me/nebulaauth</a></b></li>
|
||||||
|
<li>
|
||||||
|
<b>Compatibility:</b> Improved mafiles compatibility:
|
||||||
|
<ul style="margin-left: 15px">
|
||||||
|
<li>Full: with SDA, MarketApp, SIH</li>
|
||||||
|
<li>Re-login after import: LZT, TO SDA, old mafiles</li>
|
||||||
|
<li>Re-login <b>on</b> import: Mafiles without "Session" data or "SteamId" property</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><b>UPDATE:</b> Proxy and password (if set) now automatically saved in mafile after linking guard</li>
|
||||||
|
<li><b>UI:</b> Encryption password dialog on startup now supports "Enter" hot-key</li>
|
||||||
|
<li><b>UI:</b> Added "Copy SteamId" button in the maFile context menu.</li>
|
||||||
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user