public async Task <Response> CreateResponseAsync() { try { clientConnection.FileAccessToken = RandomExtensions.NextString(64); TokensResponse response = default; if (request.DeviceTokenId != null && !string.IsNullOrWhiteSpace(request.DeviceTokenId)) { await tokensService.SetDeviceTokenIdNullAsync(request.DeviceTokenId).ConfigureAwait(false); } UserVm user = null; switch (request.LoginType) { case LoginType.VerificationCode: { TokenVm token = null; if (request.UidType == UidType.Phone) { token = await tokensService.PhoneVCodeCreateTokenPairAsync(request.Uid, request.VCode.GetValueOrDefault(), request.DeviceTokenId).ConfigureAwait(false); } else if (request.UidType == UidType.Email) { token = await tokensService.EmailVCodeCreateTokenPairAsync(request.Uid, request.VCode.GetValueOrDefault(), request.DeviceTokenId).ConfigureAwait(false); } else if (request.UidType == UidType.UserId) { token = await tokensService.UserIdVCodeCreateTokenPairAsync(Convert.ToInt64(request.Uid), request.VCode.GetValueOrDefault(), request.DeviceTokenId).ConfigureAwait(false); } clientConnection.UserId = token.UserId; token = await tokensService.UpdateTokenDataAsync(request.OSName, request.DeviceName, request.AppName, clientConnection.ClientIP.ToString(), token).ConfigureAwait(false); clientConnection.CurrentToken = token; user = await loadUsersService.GetUserInformationAsync(token.UserId).ConfigureAwait(false); response = new TokensResponse(request.RequestId, token, clientConnection.FileAccessToken, null, user); noticeService.SendNewSessionNoticeAsync(clientConnection); } break; case LoginType.AccessTokenAndUserId: { TokenVm token = new TokenVm { UserId = request.Token.UserId, AccessToken = request.Token.AccessToken, RefreshToken = request.Token.RefreshToken, DeviceTokenId = request.DeviceTokenId }; token = await tokensService.CheckTokenAsync(token, NodeSettings.Configs.Node.Id).ConfigureAwait(false); clientConnection.UserId = token.UserId; token = await tokensService.UpdateTokenDataAsync(request.OSName, request.DeviceName, request.AppName, clientConnection.ClientIP.ToString(), token).ConfigureAwait(false); clientConnection.CurrentToken = token; user = await loadUsersService.GetUserInformationAsync(token.UserId).ConfigureAwait(false); response = new TokensResponse(request.RequestId, token, clientConnection.FileAccessToken, null, user); } break; case LoginType.Password: { ValuePair <TokenVm, string> tokenPasswordPair; if (request.UidType == UidType.Phone) { tokenPasswordPair = await tokensService.PhonePasswordCreateTokenPairAsync(request.Uid, request.Password, request.DeviceTokenId).ConfigureAwait(false); } else if (request.UidType == UidType.Email) { tokenPasswordPair = await tokensService.EmailPasswordCreateTokenPairAsync(request.Uid, request.Password, request.DeviceTokenId).ConfigureAwait(false); } else if (request.UidType == UidType.UserId) { tokenPasswordPair = await tokensService.UserIdPasswordCreateTokenPairAsync(Convert.ToInt64(request.Uid), request.Password, request.DeviceTokenId).ConfigureAwait(false); } else { var errorObject = new { UidType = "Unknown UidType." }; return(new ResultResponse(request.RequestId, ObjectSerializer.ObjectToJson(errorObject), ErrorCode.WrongArgumentError)); } clientConnection.UserId = tokenPasswordPair.FirstValue.UserId; tokenPasswordPair.FirstValue = await tokensService.UpdateTokenDataAsync(request.OSName, request.DeviceName, request.AppName, clientConnection.ClientIP.ToString(), tokenPasswordPair.FirstValue) .ConfigureAwait(false); clientConnection.CurrentToken = tokenPasswordPair.FirstValue; user = await loadUsersService.GetUserInformationAsync(clientConnection.UserId.Value).ConfigureAwait(false); response = new TokensResponse( request.RequestId, tokenPasswordPair.FirstValue, clientConnection.FileAccessToken, tokenPasswordPair.SecondValue, user); noticeService.SendNewSessionNoticeAsync(clientConnection); } break; } clientConnection.Confirmed = user.Confirmed; clientConnection.Banned = user.Banned; connectionsService.AddOrUpdateUserConnection(clientConnection.UserId.Value, clientConnection); SendPendingMessagesAsync(); return(response); } catch (InvalidTokenException ex) { Logger.WriteLog(ex, request); return(new ResultResponse(request.RequestId, "Invalid token.", ErrorCode.InvalidAccessToken)); } catch (WrongVerificationCodeException ex) { Logger.WriteLog(ex, request); return(new ResultResponse(request.RequestId, "Invalid verification code.", ErrorCode.WrongVerificationCode)); } catch (UserNotFoundException ex) { Logger.WriteLog(ex, request); return(new ResultResponse(request.RequestId, "User not found.", ErrorCode.UserNotFound)); } catch (CreateTokenPairException ex) { Logger.WriteLog(ex, request); return(new ResultResponse(request.RequestId, "Login failed.", ErrorCode.AuthorizationProblem)); } catch (TokensTimeoutException ex) { Logger.WriteLog(ex, request); await noticeService.SendNeedLoginNoticeAsync(clientConnection).ConfigureAwait(false); return(new ResultResponse(request.RequestId, "Refresh token expired.", ErrorCode.RefreshTokenTimeout)); } catch (UserFromAnotherNodeException ex) { await MetricsHelper.Instance.SetCrossNodeApiInvolvedAsync(request.RequestId).ConfigureAwait(false); var userToken = await nodeRequestSender.CheckTokenAsync( request.Token.UserId, request.Token, ex.NodeId.GetValueOrDefault()).ConfigureAwait(false); if (userToken != null) { clientConnection.UserId = userToken.FirstValue.UserId; clientConnection.ProxyNodeWebSocket = connectionsService.GetNodeConnection(ex.NodeId.GetValueOrDefault()).NodeWebSocket; connectionsService.AddOrUpdateUserConnection(clientConnection.UserId.Value, clientConnection); return(new TokensResponse(request.RequestId, userToken.FirstValue, clientConnection.FileAccessToken, null, userToken.SecondValue)); } return(new ResultResponse(request.RequestId, "Login failed.", ErrorCode.AuthorizationProblem)); } catch (Exception ex) { Logger.WriteLog(ex, request); return(new ResultResponse(request.RequestId, null, ErrorCode.UnknownError)); } }
public async Task <Response> CreateResponseAsync() { if (request.NodeId == null || request.NodeId == NodeSettings.Configs.Node.Id) { byte[] symmetricKey = Encryptor.GetSymmetricKey( 256, RandomExtensions.NextInt64(), 100000, NodeData.Instance.NodeKeys.Password); byte[] publicKey; byte[] signPublicKey; if (request.UserId != null && request.PublicKeyId != null && request.SignPublicKeyId != null) { var userKey = await keysService.GetUserKeyAsync(request.PublicKeyId.Value, request.UserId.Value, false).ConfigureAwait(false); var signKey = await keysService.GetUserKeyAsync(request.SignPublicKeyId.Value, request.UserId.Value, true).ConfigureAwait(false); if (userKey != null && signKey != null) { publicKey = userKey.Data; signPublicKey = signKey.Data; clientConnection.UserId = userKey.UserId; connectionsService.AddOrUpdateUserConnection(userKey.UserId.Value, clientConnection); } else { return(new ResultResponse(request.RequestId, "Key not found", ObjectsLibrary.Enums.ErrorCode.ObjectDoesNotExists)); } } else { publicKey = request.PublicKey; signPublicKey = request.SignPublicKey; } byte[] encryptedKey = Encryptor.AsymmetricDataEncrypt( symmetricKey, publicKey, NodeData.Instance.NodeKeys.SignPrivateKey, NodeData.Instance.NodeKeys.Password); clientConnection.SymmetricKey = symmetricKey; clientConnection.PublicKey = publicKey; clientConnection.SignPublicKey = signPublicKey; return(new EncryptedKeyResponse(request.RequestId, encryptedKey)); } else { await MetricsHelper.Instance.SetCrossNodeApiInvolvedAsync(request.RequestId).ConfigureAwait(false); var nodeConnection = connectionsService.GetNodeConnection(request.NodeId.Value); if (nodeConnection != null) { clientConnection.UserId = request.UserId; clientConnection.ProxyNodeWebSocket = nodeConnection.NodeWebSocket; clientConnection.PublicKey = request.PublicKey; clientConnection.SignPublicKey = request.SignPublicKey; if (request.UserId != null) { connectionsService.AddOrUpdateUserConnection(request.UserId.GetValueOrDefault(), clientConnection); } var response = await nodeRequestSender.SendProxyUsersCommunicationsNodeRequestAsync( ObjectSerializer.CommunicationObjectToBytes(request), clientConnection.UserId.GetValueOrDefault(), nodeConnection, ObjectType.Request, clientConnection.PublicKey, clientConnection.SignPublicKey).ConfigureAwait(false); return(ObjectSerializer.BytesToResponse(response.CommunicationData)); } return(new ResultResponse(request.RequestId, "Internal server error.", ObjectsLibrary.Enums.ErrorCode.UnknownError)); } }