Example #1
0
        private void InternalUserRegistration(string login, string password, string notes)
        {
            try
            {
                RiseInfoStatusChanged("Регистрация пользователя");

                var user = ClientCore.Instance.DataStore.GetUser(login);
                if (user != null)
                {
                    if ((!string.IsNullOrWhiteSpace(user.PasswordHash)) && (!StringComparer.Ordinal.Equals(user.PasswordHash, BcryptHash(password))))
                    {
                        RiseAuthError("Пароль не совпадает с текущим на клиенте");
                        return;
                    }
                    var userKey = ClientCore.Instance.DataStore.GetCurrentUserKey(user.UserIDGuid);
                    if (userKey != null && userKey.IsActivatedBool)
                    {
                        _logger.InfoFormat("Пользователь с таким логином уже существует, отправка ключей невозможна {0}", login);
                        RiseAuthError("Такой пользователь уже есть");
                        return;
                    }
                }

                _logger.InfoFormat("Старт генерации ключей для пользователя {0}.", login);
                RiseInfoStatusChanged("Генерация ключей");

                var privateFilePath = Path.Combine(LocationUtils.GetFullPath(), PrivateKeyFileName);
                var publicFilePath  = Path.Combine(LocationUtils.GetFullPath(), PublicKeyFileName);
                ClientCore.Instance.CryptoService.CreateRsaKeyPair(publicFilePath, privateFilePath, password);

                if (!File.Exists(privateFilePath) || !File.Exists(publicFilePath))
                {
                    throw new Exception("Ключи не создались");
                } //if

                var publicKeyData  = File.ReadAllText(publicFilePath, _rsaKeyEncoding);
                var privateKeyData = File.ReadAllText(privateFilePath, _rsaKeyEncoding);

                RiseInfoStatusChanged("Отправка запроса на сервер");
                var domainId = ClientCore.Instance.DataStore.GetFirstUserDomainID();

                var request = new RegisterPublicKeyRequest();
                request.ClientUserDomainID = domainId;
                request.EventDate          = DateTime.Now;
                request.KeyNotes           = notes;
                request.PublicKeyData      = publicKeyData;
                request.UserLogin          = login;

                var response = ClientCore.Instance.WebClient.RegisterPublicKey(request);

                if (user == null)
                {
                    RiseInfoStatusChanged("Ответ получен, сохраняем локально пользователя");

                    user = new User();
                    user.DomainIDGuid = response.UserDomainID;
                    user.LoginName    = login;

                    user.FirstName     = string.Empty;
                    user.Email         = string.Empty;
                    user.LastName      = string.Empty;
                    user.Email         = string.Empty;
                    user.ProjectRoleID = ProjectRoleSet.GetMinimumRoleID();
                    user.Phone         = string.Empty;
                    user.PasswordHash  = BcryptHash(password);
                    ClientCore.Instance.DataStore.SaveUser(user);
                }
                else
                {
                    if (string.IsNullOrWhiteSpace(user.PasswordHash))//при первой регистрации пользователя
                    {
                        user.PasswordHash = BcryptHash(password);
                        ClientCore.Instance.DataStore.SaveUser(user);
                    }
                }

                RiseInfoStatusChanged("Сохраняем пользовательский ключ");

                var key = new UserKey();
                key.EventDateDateTime = request.EventDate;
                key.UserIDGuid        = user.UserIDGuid;
                key.Number            = response.Number;
                key.PrivateKeyData    = privateKeyData;
                key.PublicKeyData     = publicKeyData;
                key.IsActivatedBool   = false;

                ClientCore.Instance.DataStore.SaveUserKey(key);//TODO удалить пользователя, если ключ не сохранился
                RiseInfoStatusChanged("Пользователь успешно зарегистрировался");
                RiseUserRegistredEventArgs(login);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex,
                                 string.Format("Во время регистрации ключей пользователя {0} произошла ошибка ", login));

                RiseAuthError(ex.Message, ex);
            } //try
        }