diff --git a/LauncherDM/App.xaml.cs b/LauncherDM/App.xaml.cs index 8760e28..0a8b550 100644 --- a/LauncherDM/App.xaml.cs +++ b/LauncherDM/App.xaml.cs @@ -14,7 +14,7 @@ namespace LauncherDM /// public partial class App : Application { - private static Mutex mutex = new Mutex(true, Assembly.GetExecutingAssembly().GetName().Name); + private static Mutex mutex = new Mutex(true, "fjoasdkjff8139darkmilk"); [STAThread] // Это означает, что все потоки в этой программе выполняются в рамках одного процесса, а управление программой осуществляется одним главным потоком protected override void OnStartup(StartupEventArgs e) { diff --git a/LauncherDM/Services/AuthorizationService.cs b/LauncherDM/Services/AuthorizationService.cs index 82489ee..e93e4e8 100644 --- a/LauncherDM/Services/AuthorizationService.cs +++ b/LauncherDM/Services/AuthorizationService.cs @@ -1,6 +1,9 @@ -using LauncherDM.Services.Interfaces; +using System; +using System.Security.Cryptography; +using System.Text; +using LauncherDM.Properties; +using LauncherDM.Services.Interfaces; using ServerTCP; -using ServerTCP.Сryptographies; namespace LauncherDM.Services { @@ -9,15 +12,29 @@ internal class AuthorizationService : IAuthorizationService private IServerRequestService _serverRequest; public bool Authorization(string login, string password) { + if (string.IsNullOrEmpty(login)) + throw new ArgumentNullException(login); + + if (string.IsNullOrEmpty(password)) + throw new ArgumentNullException(password); + + + var hash = SHA256.HashData(Encoding.UTF8.GetBytes(password)); + var convertHash = Convert.ToHexString(hash); //var requestPublicKey = _serverRequest.SendMessageRequest(MessageHeader.MessageType.PublicKey); //var publicKey = requestPublicKey.Message.ToString(); - var data = string.Concat(login, ",", password); + var data = string.Concat(login, ",", convertHash); //var cryptMessage = CryptoRsa.Encrypt(publicKey, data); //var requestToken = _serverRequest.SendMessageRequest(cryptMessage, MessageHeader.MessageType.Login); - var requestToken = _serverRequest.SendMessageRequest(data, MessageHeader.MessageType.Login); - return false; + + if (requestToken?.Message.ToString() == "0") + return false; + + SettingsApp.Default.Token = requestToken?.Message.ToString(); + SettingsApp.Default.Save(); + return true; } public AuthorizationService() diff --git a/LauncherDM/Services/DialogWindowService.cs b/LauncherDM/Services/DialogWindowService.cs index 9f7ff68..d6b60a3 100644 --- a/LauncherDM/Services/DialogWindowService.cs +++ b/LauncherDM/Services/DialogWindowService.cs @@ -32,9 +32,9 @@ public void OpenWindow(object viewModel) else if (viewModel is AccountUserControlViewModel or AuthorizationWindowViewModel) { var regAndLogWindow = new RegAndLogWindow(); - regAndLogWindow.DataContext = new RegAndLogWindowViewModel(new ToolbarToWindowViewModel(new WindowService(regAndLogWindow)), + regAndLogWindow.DataContext = new RegAndLogWindowViewModel(regAndLogWindow.Close, new ToolbarToWindowViewModel(new WindowService(regAndLogWindow)), new ResourcesHelperService()); - regAndLogWindow.Show(); + regAndLogWindow.ShowDialog(); return; } else if (viewModel is ToolbarToWindowViewModel) diff --git a/LauncherDM/Services/Interfaces/ISignUpService.cs b/LauncherDM/Services/Interfaces/ISignUpService.cs new file mode 100644 index 0000000..39d263d --- /dev/null +++ b/LauncherDM/Services/Interfaces/ISignUpService.cs @@ -0,0 +1,7 @@ +namespace LauncherDM.Services.Interfaces +{ + internal interface ISignUpService + { + bool SignUp(string login, string email, string password); + } +} diff --git a/LauncherDM/Services/SignUpService.cs b/LauncherDM/Services/SignUpService.cs new file mode 100644 index 0000000..92525fb --- /dev/null +++ b/LauncherDM/Services/SignUpService.cs @@ -0,0 +1,42 @@ +using LauncherDM.Properties; +using LauncherDM.Services.Interfaces; +using ServerTCP; +using System.Text; +using System; +using System.Security.Cryptography; + +namespace LauncherDM.Services +{ + internal class SignUpService : ISignUpService + { + private IServerRequestService _serverRequest; + public bool SignUp(string login, string email, string password) + { + if (string.IsNullOrEmpty(login)) + throw new ArgumentNullException(login); + + if (string.IsNullOrEmpty(email)) + throw new ArgumentNullException(email); + + if (string.IsNullOrEmpty(password)) + throw new ArgumentNullException(password); + + var hash = SHA256.HashData(Encoding.UTF8.GetBytes(password)); + var convertHash = Convert.ToHexString(hash); + var data = string.Concat(login, ",", convertHash, ",", email); + var requestToken = _serverRequest.SendMessageRequest(data, MessageHeader.MessageType.Registration); + + if (requestToken?.Message.ToString() == "0") + return false; + + SettingsApp.Default.Token = requestToken?.Message.ToString(); + SettingsApp.Default.Save(); + return true; + } + + public SignUpService() + { + _serverRequest = new ServerRequestService(); + } + } +} diff --git a/LauncherDM/ViewModels/RegAndLogWindowViewModel.cs b/LauncherDM/ViewModels/RegAndLogWindowViewModel.cs index e0bd486..7def6bc 100644 --- a/LauncherDM/ViewModels/RegAndLogWindowViewModel.cs +++ b/LauncherDM/ViewModels/RegAndLogWindowViewModel.cs @@ -5,6 +5,7 @@ using LauncherDM.Infastructure.Commands.Base; using LauncherDM.Infastructure.Commands; using LauncherDM.Models; +using System; namespace LauncherDM.ViewModels { @@ -20,6 +21,12 @@ class RegAndLogWindowViewModel : ViewModel.Base.ViewModel #endregion + #region Fields + + private Action _closeAction; + + #endregion + #region Bindings public string Title => _resourcesHelper.LocalizationGet("Authorization"); @@ -124,7 +131,9 @@ private void OnLoginCommandExecuted(object p) IAuthorizationService authorization = new AuthorizationService(); if (authorization.Authorization(Login, Password)) { - + _dialogWindow.OpenWindow(this); + _dialogWindow.CloseAction = _closeAction; + _dialogWindow.CloseWindow(); } else { @@ -141,6 +150,16 @@ private void OnLoginCommandExecuted(object p) private bool CanSignUpCommandExecute(object p) => true; private void OnSignUpCommandExecuted(object p) { + ISignUpService signUpService = new SignUpService(); + if (signUpService.SignUp(RegLogin, Email, RegPassword)) + { + + } + else + { + IDialogMessageBoxService dialogMessageBox = new DialogMessageBoxService(); + dialogMessageBox.DialogShow("Error Server Reques", "Error Server Reques"); + } } @@ -148,9 +167,10 @@ private void OnSignUpCommandExecuted(object p) #endregion - public RegAndLogWindowViewModel(ToolbarToWindowViewModel toolbarViewModel, ResourcesHelperService resourcesHelper) + public RegAndLogWindowViewModel(Action closeWindow ,ToolbarToWindowViewModel toolbarViewModel, ResourcesHelperService resourcesHelper) { _resourcesHelper = resourcesHelper; + _closeAction = closeWindow; ToolbarVM = toolbarViewModel; _dialogWindow = new DialogWindowService(); _regAndLogWindowService = new RegAndLogWindowServiceService(); diff --git a/LauncherDM/Views/Windows/RegAndLogWindow.xaml b/LauncherDM/Views/Windows/RegAndLogWindow.xaml index 6ecaa06..dc5b61a 100644 --- a/LauncherDM/Views/Windows/RegAndLogWindow.xaml +++ b/LauncherDM/Views/Windows/RegAndLogWindow.xaml @@ -423,9 +423,9 @@ - + @@ -466,7 +466,7 @@ - + @@ -481,7 +481,7 @@ - + @@ -496,7 +496,7 @@ - + diff --git a/ServerTCP/DataBase/DataBaseCommands.cs b/ServerTCP/DataBase/DataBaseCommands.cs index 790ebd1..f2140c2 100644 --- a/ServerTCP/DataBase/DataBaseCommands.cs +++ b/ServerTCP/DataBase/DataBaseCommands.cs @@ -1,12 +1,15 @@ -using System.Threading.Channels; -using ServerTCP.Models; +using ServerTCP.Models; using ServerTCP.Models.Data; namespace ServerTCP.DataBase { internal class DataBaseCommands { - public static void Insert(object table, MessageHeader.MessageType messageType) + + public const string SaltPassword = "1asdjh192jd1286sdarkmilk"; + public const string PaperPassword = "jf10hdsj12fbzd12darkmilk"; + + public static bool Insert(object table, MessageHeader.MessageType messageType) { using (var db = new ApplicationContext()) { @@ -19,11 +22,11 @@ public static void Insert(object table, MessageHeader.MessageType messageType) db.users.Add(user); break; } - db.SaveChanges(); + return db.SaveChanges() == 1; } } - public static object Select(MessageHeader.MessageType messageType) + public static object Select(MessageHeader.MessageType messageType, params string[] data ) { using (var db = new ApplicationContext()) { @@ -35,6 +38,10 @@ public static object Select(MessageHeader.MessageType messageType) var appWPF = db.apps.Where(x => x.parametername == "wpfDMVersion").ToArray(); result = appWPF[0].parametervalue; break; + case MessageHeader.MessageType.Login: + var user = db.users.Where(x => x.username == data[0] && x.password == data[1]).ToArray(); + result = user.Length > 0; + break; default: result = null; break; diff --git a/ServerTCP/MessageHeader.cs b/ServerTCP/MessageHeader.cs index 7accc38..1538bb2 100644 --- a/ServerTCP/MessageHeader.cs +++ b/ServerTCP/MessageHeader.cs @@ -90,9 +90,9 @@ public byte[] MessageToArray(bool loadToken = false) switch (Type) { - case MessageType.Login: - //message = (byte[])Message; - Encoding.UTF8.GetBytes(Message.ToString()); + case MessageType.Login: + case MessageType.Registration: + message = Encoding.UTF8.GetBytes(Message.ToString()); break; } @@ -112,6 +112,7 @@ public byte[] MessageToArray(bool loadToken = false) switch (Type) { case MessageType.Login: + case MessageType.Registration: Array.Copy(bytes, 0, result, 3, bytes.Length); Array.Copy(message ?? [0], 0, result, LengthAndDataType, messageLength); break; @@ -132,6 +133,8 @@ internal byte[] MessageServerToArray(bool loadToken = false) switch (Type) { case MessageType.Token: + case MessageType.Login: + case MessageType.Registration: case MessageType.TitleLoading: case MessageType.PublicKey: case MessageType.Version: @@ -169,6 +172,7 @@ public static MessageHeader FromArray(ReadOnlySpan buffer) case MessageHeader.MessageType.Version: case MessageHeader.MessageType.PublicKey: case MessageHeader.MessageType.Login: + case MessageHeader.MessageType.Registration: case MessageHeader.MessageType.TitleLoading: case MessageHeader.MessageType.Check: return new MessageHeader(Encoding.UTF8.GetString(buffer.ToArray(), LengthAndDataType, buffer.Length - LengthAndDataType), (MessageType)buffer[0], (MessageLanguages.Languages)buffer[1]); @@ -188,12 +192,6 @@ public static MessageHeader FromArray(ReadOnlySpan buffer) // return new MessageHeader(result.ToArray(), // (MessageType)buffer[0]); // break; - case MessageHeader.MessageType.Registration: - case MessageHeader.MessageType.Log: - case MessageHeader.MessageType.File: - case MessageHeader.MessageType.Photo: - case MessageHeader.MessageType.Data: - case MessageHeader.MessageType.Title: default: return null; break; diff --git a/ServerTCP/Models/User.cs b/ServerTCP/Models/User.cs index 327cca7..2602009 100644 --- a/ServerTCP/Models/User.cs +++ b/ServerTCP/Models/User.cs @@ -1,7 +1,11 @@ -namespace ServerTCP.Models +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace ServerTCP.Models { internal class User { + [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] public int id { get; set; } public string username { get; set; } public string login { get; set; } diff --git a/ServerTCP/Program.cs b/ServerTCP/Program.cs index d7438c0..8b41f4c 100644 --- a/ServerTCP/Program.cs +++ b/ServerTCP/Program.cs @@ -1,5 +1,7 @@ using System.Net; using System.Net.Sockets; +using System.Security.Cryptography; +using System.Text; using ServerTCP.DataBase; using ServerTCP.Models; @@ -15,6 +17,8 @@ internal class Program private static Random rand = new Random(); + private static string SaltPassword = "sdlfjkpo213ndarkmilk"; + static void Main(string[] args) { //LoadingRSA(); @@ -50,29 +54,54 @@ static void Main(string[] args) case MessageHeader.MessageType.Check: headerRequest = new MessageHeader("1", MessageHeader.MessageType.Check); break; + case MessageHeader.MessageType.Login: - // byte[] s = (byte[])header.Message; - //var r = CryptoRsa.Decrypt(_privateKey, s); - //Console.WriteLine(r); - Console.WriteLine(header.Message.ToString()); + var userInfo = header.Message.ToString().Split(','); + var hashLogin = SHA256.HashData(Encoding.UTF8.GetBytes(userInfo[1] + SaltPassword)); + var convertHashLogin = Convert.ToHexString(hashLogin); + + var login = DataBaseCommands.Select(MessageHeader.MessageType.Login, userInfo[0], convertHashLogin); + + if ((bool)login) + { + headerRequest = new MessageHeader(Token.GenerateToken(userInfo[0], convertHashLogin), + MessageHeader.MessageType.Login); + } + else + headerRequest = new MessageHeader("0", MessageHeader.MessageType.Login); break; + case MessageHeader.MessageType.Registration: + var newuserInfo = header.Message.ToString().Split(','); + + if (newuserInfo.Length < 3) + throw new ArgumentException(newuserInfo.Length.ToString()); + + var hash = SHA256.HashData(Encoding.UTF8.GetBytes(newuserInfo[1] + SaltPassword)); + var convertHash = Convert.ToHexString(hash); var user = new User { - id = 1, login = "Gustaf", email = "gustavo@milk.su", username = "Gustavo", password = "sjafhfjhlkj12pje12j31kl23j1l123j" + login = newuserInfo[0], email = newuserInfo[2], username = newuserInfo[0], password = convertHash }; - DataBaseCommands.Insert(user, MessageHeader.MessageType.Registration); + var result = DataBaseCommands.Insert(user, MessageHeader.MessageType.Registration); + + headerRequest = result + ? new MessageHeader("1", MessageHeader.MessageType.Registration) + : new MessageHeader("0", MessageHeader.MessageType.Registration); break; + case MessageHeader.MessageType.TitleLoading: var text = rand.Next(0, 3) == 0 ? ResourcesHelper.LocalizationGet("LoadingText", header.Language) : ResourcesHelper.LocalizationGet("LoadingTextTwo", header.Language); headerRequest = new MessageHeader(text, MessageHeader.MessageType.TitleLoading); break; + case MessageHeader.MessageType.Version: var version = DataBaseCommands.Select(MessageHeader.MessageType.Version); headerRequest = new MessageHeader(version.ToString(), MessageHeader.MessageType.Version); break; + case MessageHeader.MessageType.PublicKey: headerRequest = new MessageHeader(_privateKey, MessageHeader.MessageType.PublicKey); break; diff --git a/ServerTCP/Token.cs b/ServerTCP/Token.cs new file mode 100644 index 0000000..f3ea0af --- /dev/null +++ b/ServerTCP/Token.cs @@ -0,0 +1,31 @@ +using System.Security.Cryptography; +using System.Text; +using ServerTCP.Сryptographies; + +namespace ServerTCP +{ + internal class Token + { + private static string Key = "sdkjoidarkmilk="; + + public static Dictionary Tokens = new Dictionary(); + + public static string GenerateToken(string login, string password) + { + var tokenData = string.Concat(login, ",", password); + var regToken = string.Concat(login, ",", DateTime.Now); + using (var myAes = Aes.Create()) + { + byte[] aesKey = SHA256Managed.Create().ComputeHash(Encoding.UTF8.GetBytes(Key)); + byte[] aesIV = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(Key)); + myAes.Key = aesKey; + myAes.IV = aesIV; + var tokenResult = Convert.ToBase64String(CryptoAes.EncryptStringToBytes_Aes(tokenData, myAes.Key, myAes.IV)); + + if(!Tokens.ContainsKey(tokenResult)) + Tokens.Add(tokenResult, regToken); + return tokenResult; + } + } + } +} diff --git "a/ServerTCP/\320\241ryptographies/CryptoAes.cs" "b/ServerTCP/\320\241ryptographies/CryptoAes.cs" new file mode 100644 index 0000000..720abc1 --- /dev/null +++ "b/ServerTCP/\320\241ryptographies/CryptoAes.cs" @@ -0,0 +1,90 @@ +using System.Security.Cryptography; + +namespace ServerTCP.Сryptographies +{ + internal class CryptoAes + { + public static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV) + { + // Check arguments. + if (plainText == null || plainText.Length <= 0) + throw new ArgumentNullException("plainText"); + if (Key == null || Key.Length <= 0) + throw new ArgumentNullException("Key"); + if (IV == null || IV.Length <= 0) + throw new ArgumentNullException("IV"); + byte[] encrypted; + + // Create an Aes object + // with the specified key and IV. + using (Aes aesAlg = Aes.Create()) + { + aesAlg.Key = Key; + aesAlg.IV = IV; + + // Create an encryptor to perform the stream transform. + ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); + + // Create the streams used for encryption. + using (MemoryStream msEncrypt = new MemoryStream()) + { + using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) + { + using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) + { + //Write all data to the stream. + swEncrypt.Write(plainText); + } + encrypted = msEncrypt.ToArray(); + } + } + } + + // Return the encrypted bytes from the memory stream. + return encrypted; + } + + public static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] Key, byte[] IV) + { + // Check arguments. + if (cipherText == null || cipherText.Length <= 0) + throw new ArgumentNullException("cipherText"); + if (Key == null || Key.Length <= 0) + throw new ArgumentNullException("Key"); + if (IV == null || IV.Length <= 0) + throw new ArgumentNullException("IV"); + + // Declare the string used to hold + // the decrypted text. + string plaintext = null; + + // Create an Aes object + // with the specified key and IV. + using (Aes aesAlg = Aes.Create()) + { + aesAlg.Key = Key; + aesAlg.IV = IV; + + // Create a decryptor to perform the stream transform. + ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); + + // Create the streams used for decryption. + using (MemoryStream msDecrypt = new MemoryStream(cipherText)) + { + using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) + { + using (StreamReader srDecrypt = new StreamReader(csDecrypt)) + { + + // Read the decrypted bytes from the decrypting stream + // and place them in a string. + plaintext = srDecrypt.ReadToEnd(); + } + } + } + } + + return plaintext; + } + } +}