Ejemplo n.º 1
0
        public override async Task <CreateApprovalRequestResponse> CreateApprovalRequest(CreateApprovalRequestRequest request, ServerCallContext context)
        {
            var tenantId = request.TenantId;
            var vaultId  = context.GetVaultId();

            foreach (var validatorRequest in request.ValidatorRequests)
            {
                var entity = ApprovalRequestMyNoSqlEntity.Generate(validatorRequest.ValidatorId, request.TransferSigningRequestId);
                entity.TenantId   = tenantId;
                entity.MessageEnc = validatorRequest.TransactionDetailsEncBase64;
                entity.SecretEnc  = validatorRequest.SecretEncBase64;
                entity.IvNonce    = validatorRequest.IvNonce;
                entity.IsOpen     = true;
                entity.VaultId    = vaultId;

                await _dataWriter.InsertOrReplaceAsync(entity);

                await _pushNotificator.SendPushNotifications(entity);

                _logger.LogInformation("CreateApprovalRequest processed. TransferSigningRequestId={TransferSigningRequestId}; TenantId={TenantId}; VaultId={VaultId}; ValidatorId={ValidatorId}", request.TransferSigningRequestId, tenantId, vaultId, validatorRequest.ValidatorId);
            }

            //await _dataWriter.BulkInsertOrReplaceAsync(list, DataSynchronizationPeriod.Immediately);

            var resp = new CreateApprovalRequestResponse();

            return(resp);
        }
Ejemplo n.º 2
0
        public override Task <GetApprovalRequestsResponse> GetApprovalRequests(GetApprovalRequestsRequests request, ServerCallContext context)
        {
            var validatorId = context.GetHttpContext().User.GetClaimOrDefault(Claims.KeyKeeperId);
            var tenantId    = context.GetHttpContext().User.GetTenantIdOrDefault();
            var apiKeyId    = context.GetHttpContext().User.GetClaimOrDefault(Claims.ApiKeyId);

            if (string.IsNullOrEmpty(tenantId))
            {
                return(Task.FromResult(new GetApprovalRequestsResponse
                {
                    Error = new ValidatorApiError
                    {
                        Code = ValidatorApiError.Types.ErrorCodes.Unknown,
                        Message = "Tenant Id required"
                    }
                }));
            }

            var validatorLinkEntity = _validatorLinkReader.Get(
                ValidatorLinkEntity.GeneratePartitionKey(tenantId),
                ValidatorLinkEntity.GenerateRowKey(apiKeyId));

            if (validatorLinkEntity == null)
            {
                return(Task.FromResult(new GetApprovalRequestsResponse
                {
                    Error = new ValidatorApiError
                    {
                        Code = ValidatorApiError.Types.ErrorCodes.ExpiredApiKey,
                        Message = "API key is expired or deleted",
                        Data = apiKeyId
                    }
                }));
            }

            var res = new GetApprovalRequestsResponse();

            var requests = _approvalRequestReader.Get(ApprovalRequestMyNoSqlEntity.GeneratePartitionKey(validatorId))
                           .Where(r => r.IsOpen && r.TenantId == tenantId);

            //todo: add filter by tenant from API key, need to add tenant into api key

            foreach (var entity in requests)
            {
                var item = new GetApprovalRequestsResponse.Types.ApprovalRequest()
                {
                    TransferSigningRequestId = entity.TransferSigningRequestId,
                    Status = GetApprovalRequestsResponse.Types.ApprovalRequest.Types.RequestStatus.Open,
                    TransactionDetailsEncBase64 = entity.MessageEnc,
                    SecretEncBase64             = entity.SecretEnc,
                    IvNonce = entity.IvNonce
                };
                res.Payload.Add(item);
            }

            _logger.LogInformation("Return {Count} ApprovalRequests to ValidatorId='{ValidatorId}'", res.Payload.Count, validatorId);

            return(Task.FromResult(res));
        }
Ejemplo n.º 3
0
        public override async Task <ResolveApprovalRequestsResponse> ResolveApprovalRequests(ResolveApprovalRequestsRequest request, ServerCallContext context)
        {
            var validatorId = context.GetHttpContext().User.GetClaimOrDefault(Claims.KeyKeeperId);
            var tenantId    = context.GetHttpContext().User.GetTenantIdOrDefault();
            var apiKeyId    = context.GetHttpContext().User.GetClaimOrDefault(Claims.ApiKeyId);

            var validatorLinkEntity = _validatorLinkReader.Get(
                ValidatorLinkEntity.GeneratePartitionKey(tenantId),
                ValidatorLinkEntity.GenerateRowKey(apiKeyId));

            if (validatorLinkEntity == null)
            {
                return(new ResolveApprovalRequestsResponse
                {
                    Error = new ValidatorApiError
                    {
                        Code = ValidatorApiError.Types.ErrorCodes.ExpiredApiKey,
                        Message = "API key is expired or deleted",
                        Data = apiKeyId
                    }
                });
            }

            Console.WriteLine($"===============================");
            Console.WriteLine("Receive ResolveApprovalRequests:");
            Console.WriteLine($"{DateTime.UtcNow:s}");
            Console.WriteLine($"validatorId: {validatorId}");
            Console.WriteLine($"DeviceInfo: {request.DeviceInfo}");
            Console.WriteLine($"TransferSigningRequestId: {request.TransferSigningRequestId}");
            Console.WriteLine($"Signature: {request.Signature}");
            Console.WriteLine($"ResolutionDocumentEncBase64: {request.ResolutionDocumentEncBase64}");
            Console.WriteLine($"-------------------------------");


            var approvalRequest = _approvalRequestReader.Get(
                ApprovalRequestMyNoSqlEntity.GeneratePartitionKey(validatorId),
                ApprovalRequestMyNoSqlEntity.GenerateRowKey(request.TransferSigningRequestId));

            if (approvalRequest == null || !approvalRequest.IsOpen)
            {
                _logger.LogInformation("ResolveApprovalRequests skip because active request not found. TransferSigningRequestId={TransferSigningRequestId}; ValidatorId={ValidatorId}", request.TransferSigningRequestId, validatorId);
                return(new ResolveApprovalRequestsResponse());
            }

            approvalRequest.ResolutionDocumentEncBase64 = request.ResolutionDocumentEncBase64;
            approvalRequest.ResolutionSignature         = request.Signature;
            approvalRequest.IsOpen = false;

            await _approvalRequestWriter.InsertOrReplaceAsync(approvalRequest);

            _logger.LogInformation("ResolveApprovalRequests processed. TransferSigningRequestId={TransferSigningRequestId}; ValidatorId={ValidatorId}", request.TransferSigningRequestId, validatorId);

            return(new ResolveApprovalRequestsResponse());
        }
Ejemplo n.º 4
0
        public override async Task <AcknowledgeResultResponse> AcknowledgeResult(AcknowledgeResultRequest request, ServerCallContext context)
        {
            var vaultId = context.GetVaultId();

            var item = _dataReader.Get(ApprovalRequestMyNoSqlEntity.GeneratePartitionKey(request.ValidatorId),
                                       ApprovalRequestMyNoSqlEntity.GenerateRowKey(request.TransferSigningRequestId));

            if (item != null && item.VaultId == vaultId)
            {
                await _dataWriter.DeleteAsync(ApprovalRequestMyNoSqlEntity.GeneratePartitionKey(request.ValidatorId),
                                              ApprovalRequestMyNoSqlEntity.GenerateRowKey(request.TransferSigningRequestId));

                _logger.LogInformation("Acknowledge ApprovalResults. TransferSigningRequestId={TransferSigningRequestId}; TenantId={TenantId}; VaultId={VaultId}; ValidatorId={ValidatorId}", item.TransferSigningRequestId, item.TenantId, item.VaultId, item.ValidatorId);
            }

            return(new AcknowledgeResultResponse());
        }
        public async Task SendPushNotifications(ApprovalRequestMyNoSqlEntity approvalRequest)
        {
            var traceLog = string.Empty;

            try
            {
                if (!_isActive)
                {
                    return;
                }

                var validators = _validatorLinkReader.Get()
                                 .Where(v => v.TenantId == approvalRequest.TenantId)
                                 .Where(v => v.ValidatorId == approvalRequest.ValidatorId)
                                 .Where(v => v.IsAccepted)
                                 .Where(v => !v.IsBlocked)
                                 .Where(v => !string.IsNullOrEmpty(v.DeviceInfo))
                                 .Where(v => !string.IsNullOrEmpty(v.PushNotificationFcmToken));

                var hashset = new HashSet <string>();
                var tokens  = new List <string>();

                foreach (var validator in validators)
                {
                    if (!hashset.Contains(validator.DeviceInfo))
                    {
                        tokens.Add(validator.PushNotificationFcmToken);
                        hashset.Add(validator.DeviceInfo);
                    }
                }

                if (!tokens.Any())
                {
                    _logger.LogInformation(
                        "Push notification for TransferSigningRequestId={TransferSigningRequestId} is sent to {ValidatorId}. SuccessCount: {SuccessCount}. FailureCount: {FailureCount}.",
                        approvalRequest.TransferSigningRequestId,
                        approvalRequest.ValidatorId,
                        0,
                        0);
                    return;
                }

                var message = new MulticastMessage()
                {
                    Notification = new Notification()
                    {
                        Title = "New Approval Request",
                        Body  =
                            "You receive a new approval request. Please check the transfer details in the application."
                    },
                    Tokens = tokens
                };

                traceLog = JsonConvert.SerializeObject(message);

                var response = await FirebaseMessaging.DefaultInstance.SendMulticastAsync(message);

                _logger.LogInformation(
                    "Push notification for TransferSigningRequestId={TransferSigningRequestId} is sent to {ValidatorId}. SuccessCount: {SuccessCount}. FailureCount: {FailureCount}.",
                    approvalRequest.TransferSigningRequestId,
                    approvalRequest.ValidatorId,
                    response.SuccessCount,
                    response.FailureCount);

                if (response.FailureCount > 0)
                {
                    var tokensList = JsonConvert.SerializeObject(tokens);

                    foreach (var result in response.Responses.Where(r => r.IsSuccess == false))
                    {
                        _logger.LogWarning(
                            "Fail push notification. TransferSigningRequestId: {TransferSigningRequestId}; ValidatorId: {ValidatorId}; MessageId: {MessageId}; MessagingErrorCode: {MessagingErrorCode}; Message: {Message}; Tokens: {TokensList}",
                            approvalRequest.TransferSigningRequestId,
                            approvalRequest.ValidatorId,
                            result.MessageId,
                            result.Exception.MessagingErrorCode,
                            result.Exception.Message,
                            tokensList);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(traceLog);
                _logger.LogError(ex, "Cannot send push notification to validator. TransferSigningRequestId={TransferSigningRequestId}; ValidatorId={ValidatorId}", approvalRequest.TransferSigningRequestId, approvalRequest.ValidatorId);
            }
        }