Exemplo n.º 1
0
        /// <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);
            }
        }
Exemplo n.º 2
0
        //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);
            }
        }