/// <exception cref="ArgumentNullException">formOfSender == null. -или- OfflineMessageForm == null. -или- /// resultOfOperation == null.</exception> public override bool SendOfflineMessage(OfflineMessageForm offlineMessage, UserForm formOfSender, ResultOfOperation resultOfOperation) { if (formOfSender == null) { throw new ArgumentNullException(nameof(formOfSender)) { Source = GetType().AssemblyQualifiedName } } ; if (offlineMessage == null) { throw new ArgumentNullException(nameof(offlineMessage)) { Source = GetType().AssemblyQualifiedName } } ; if (resultOfOperation == null) { throw new ArgumentNullException(nameof(resultOfOperation)) { Source = GetType().AssemblyQualifiedName } } ; try { var receiver = (UserForm)UsersF.Users.First((form => form.Login == offlineMessage.LoginOfReciever)); while (true) { OfflineMessagesConcurent messages; if (!receiver.ValidateIpAdressesAndPorts(1, false, resultOfOperation)) { //OfflineMessagesConcurent messagesConcurentOffline; if (OfflineMessagesF.TryGetValue(receiver.Login, out messages)) { if (messages.Count > 50) { resultOfOperation.ErrorMessage = "Кол-во сообщений для офлайн пользователей не может превышать 50."; resultOfOperation.OperationWasFinishedSuccessful = false; return(false); } //messagesConcurentOffline = // messages.Where( // offlineMessages => offlineMessages.FormOfSender.Login.Equals(formOfSender.Login)) // .ToArray()[0]; //if (messagesConcurentOffline == null) //{ // messagesConcurentOffline = new OfflineMessagesConcurent(formOfSender); // messages.Add(messagesConcurentOffline); //} messages.Add(formOfSender.Login, offlineMessage.Message); //messagesConcurentOffline.Messages.Add(offlineMessage.Message); resultOfOperation.OperationWasFinishedSuccessful = true; return(true); } else { while (true) { messages = new OfflineMessagesConcurent(offlineMessage.LoginOfReciever); if (OfflineMessagesF.TryAdd(offlineMessage.LoginOfReciever, messages)) { messages.Add(formOfSender.Login, offlineMessage.Message); break; } else { if (OfflineMessagesF.TryGetValue(receiver.Login, out messages)) { messages.Add(formOfSender.Login, offlineMessage.Message); break; } } } } } else { resultOfOperation.ErrorMessage = "Пользователь находится в сети."; resultOfOperation.OperationWasFinishedSuccessful = false; return(false); } } } catch (InvalidOperationException) { resultOfOperation.ErrorMessage = "Пользователь получатель не зарегистрирован."; resultOfOperation.OperationWasFinishedSuccessful = false; return(false); } }
//public override UserForm GetPublicKey() //{ // var formNew = new UserForm(); // if (CryptoProvider == CryptoProvider.CngMicrosoft) // { // if (AsymmetricAlgorithm is RSACng) // { // var rsa = (RSACng) AsymmetricAlgorithm; // //var cngKeyBlob = rsa.Key.Export(CngKeyBlobFormat.GenericPublicBlob); // var key = rsa.ExportParameters(false); // var cngKeyBlob = Serializer.Serialize(key, false); // formNew = new UserForm() // { // CryptoProvider = CryptoProvider.CngMicrosoft, // PublicKeyParamsBlob = cngKeyBlob // }; // } // } // return formNew; //} ///// <exception cref="ArgumentNullException">form == null. -или- resultOfOperation == null.</exception> //public override UserForm AuthenticateUser(UserForm form, out IEnumerable<byte[]> messages, // ResultOfOperation resultOfOperation) //{ // if (form == null) // throw new ArgumentNullException(nameof(form)) { Source = GetType().AssemblyQualifiedName }; // if (resultOfOperation == null) // throw new ArgumentNullException(nameof(resultOfOperation)) { Source = GetType().AssemblyQualifiedName }; // messages = new byte[0][]; // var formWasFinded = UsersF.FirstOrDefault((registrationForm => registrationForm.Login.Equals(form.Login))); // var KeyBlob = formWasFinded.SignPublicKeyBlob; // if (KeyBlob == null) // { // resultOfOperation.ErrorMessage = "Пользователь не зарегистрирован."; // resultOfOperation.OperationWasFinishedSuccessful = false; // return null; // } // form.SignPublicKeyBlob = KeyBlob; // if (!form.ValidateSign(false, resultOfOperation)) // return null; // if (OfflineMessagesF.ContainsKey(form.Login)) // messages = OfflineMessagesF[form.Login].MessagesAsBytes.ToArray(); // return form; //} /// <exception cref="ArgumentNullException">form == null. -или- resultOfOperation == null.</exception> public override async Task <Tuple <UserFormSurrogate, OfflineMessagesConcurent> > AuthenticateUserAsync(IAuthenticationForm formAuth, CryptoFactoryBase cryptoFactory, CryptoInfo choosenCrypto, ResultOfOperation resultOfOperation) { if (formAuth == null) { throw new ArgumentNullException(nameof(formAuth)) { Source = GetType().AssemblyQualifiedName } } ; if (resultOfOperation == null) { throw new ArgumentNullException(nameof(resultOfOperation)) { Source = GetType().AssemblyQualifiedName } } ; //messages = null; try { //var formWasFinded = UsersF.First(registrationForm => registrationForm.Login.Equals(formAuth.Login)); var formWasFinded = await UsersF.Users.FirstAsync(registrationForm => registrationForm.Login == formAuth.Login) .ConfigureAwait(false); switch (formAuth.AuthenticationMethod) { case AuthenticationMethod.Classic: var formClassicAuth = formAuth as IAuthenticationFormClassic; if (formClassicAuth == null) { throw new InvalidCastException("Преобразование из типа IAuthenticationForm в тип " + "IAuthenticationFormClassic завершилось с ошибкой.") { Source = GetType().AssemblyQualifiedName } } ; var hashAlg = cryptoFactory.CreateHashAlgorithm(choosenCrypto.Provider, formClassicAuth.HashAlgotitm); var hashOfTruePass = hashAlg.ComputeHash(Encoding.UTF8.GetBytes(formWasFinded.Password)); if (hashOfTruePass.SequenceEqual(formClassicAuth.HashOfPassword)) { resultOfOperation.OperationWasFinishedSuccessful = true; } else { resultOfOperation.ErrorMessage = "Правильность пароля под сомнением?"; resultOfOperation.OperationWasFinishedSuccessful = false; } break; case AuthenticationMethod.Sign: var formSignAuth = formAuth as IAuthenticationFormSign; if (formSignAuth == null) { throw new InvalidCastException("Преобразование из типа IAuthenticationForm в тип " + "IAuthenticationFormSign завершилось с ошибкой.") { Source = GetType().AssemblyQualifiedName } } ; var signAlg = cryptoFactory.CreateSignAlgoritm(formSignAuth.CryptoProvider, formSignAuth.SignantureAlgoritmName); //var signAlg = cryptoFactory.CreateSignAlgoritm(choosenCrypto.Provider, formSignAuth.SignantureAlgoritmName); signAlg.Import(formWasFinded.KeyParametrsBlob.Key); if (signAlg.VerifySign(formSignAuth.Hash, formSignAuth.Sign)) { resultOfOperation.OperationWasFinishedSuccessful = true; } else { resultOfOperation.ErrorMessage = "Достоверность цифровой подписи под сомнением?"; resultOfOperation.OperationWasFinishedSuccessful = false; } break; } OfflineMessagesConcurent messages; OfflineMessagesF.TryRemove(formWasFinded.Login, out messages); if (messages == null) { messages = new OfflineMessagesConcurent(formWasFinded.Login); } return(new Tuple <UserFormSurrogate, OfflineMessagesConcurent>(formWasFinded, messages)); } catch (InvalidOperationException ex) { CreateResultWithError(3, resultOfOperation, formAuth.Login); return(null); } }