コード例 #1
0
        public List <Validator> GetValidators()
        {
            var(auth, tenantId, adminId, adminEmail) = Authorize();

            if (!auth)
            {
                return(new List <Validator>());
            }

            var list = _validationReader.Get(ValidatorLinkEntity.GeneratePartitionKey(tenantId));

            var result = list.Select(v => new Validator(
                                         v.RowKey,
                                         v.ValidatorId,
                                         v.PublicKeyPem,
                                         v.Name,
                                         v.Position,
                                         v.Description,
                                         v.IsAccepted,
                                         v.IsBlocked,
                                         v.DeviceInfo,
                                         v.CreatedAt,
                                         v.CreatedByAdminId,
                                         v.CreatedByAdminEmail))
                         .ToList();

            return(result);
        }
コード例 #2
0
        public async Task BlockValidatorAsync([FromBody] ValidatorRequest request)
        {
            var(auth, tenantId, adminId, adminEmail) = Authorize();

            if (!auth)
            {
                return;
            }

            var entity = _validationReader.Get(ValidatorLinkEntity.GeneratePartitionKey(tenantId),
                                               ValidatorLinkEntity.GenerateRowKey(request.ApiKeyId));

            if (entity == null)
            {
                _logger.LogInformation("ValidatorLinkEntity not found by API key: {ApiKeyId}", request.ApiKeyId);
                HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
                return;
            }

            entity.IsBlocked = true;

            await _validationWriter.InsertOrReplaceAsync(entity);

            _logger.LogInformation("Validator Api Key is Blocked. API key: {ApiKeyId}; ValidatorId: {ValidatorId}; TenantId: {TenantId}; Name: {Name}; AdminId: {AdminId}", request.ApiKeyId, entity.ValidatorId, entity.TenantId, entity.Name, adminId);
        }
コード例 #3
0
        public async Task <CreateInvitation> CreateInvitationAsync([FromBody] CreateInvitationRequest request)
        {
            var(auth, tenantId, adminId, adminEmail) = Authorize();

            if (!auth)
            {
                return(new CreateInvitation());
            }

            var invite = ValidatorLinkEntity.Generate(tenantId, Guid.NewGuid().ToString("N"));

            invite.InvitationToken     = Guid.NewGuid().ToString("N") + Guid.NewGuid().ToString("N") + Guid.NewGuid().ToString("N");
            invite.Name                = request.Name;
            invite.Position            = request.Position;
            invite.Description         = request.Description;
            invite.CreatedAt           = DateTime.UtcNow;
            invite.CreatedByAdminId    = adminId;
            invite.CreatedByAdminEmail = adminEmail;
            await _validationWriter.InsertOrReplaceAsync(invite);


            _logger.LogInformation("Invitation Created. TenantId: {TenantId}; AdminId: {AdminId}", tenantId, adminId);

            var resp = new CreateInvitation()
            {
                TenantId        = invite.TenantId,
                InvitationToken = invite.InvitationToken,
                Name            = invite.Name,
                Position        = invite.Position,
                Description     = invite.Description
            };

            return(resp);
        }
コード例 #4
0
        public override async Task <RemoveVaultConnectionResponse> RemoveVaultConnection(RemoveVaultConnectionRequest request, ServerCallContext context)
        {
            var tenantId = context.GetHttpContext().User.GetClaimOrDefault(Claims.TenantId);
            var apiKeyId = context.GetHttpContext().User.GetClaimOrDefault(Claims.ApiKeyId);

            if (string.IsNullOrEmpty(apiKeyId))
            {
                return(new RemoveVaultConnectionResponse()
                {
                    Error = new ValidatorApiError()
                    {
                        Code = ValidatorApiError.Types.ErrorCodes.InternalServerError,
                        Message = "Incorrect Bearer Token. "
                    }
                });
            }

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

            if (validatorLinkEntity != null)
            {
                await _validatorLinkWriter.DeleteAsync(
                    ValidatorLinkEntity.GeneratePartitionKey(tenantId),
                    ValidatorLinkEntity.GenerateRowKey(apiKeyId));
            }

            return(new RemoveVaultConnectionResponse());
        }
コード例 #5
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));
        }
コード例 #6
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());
        }
コード例 #7
0
        public async Task PingValidatorAsync([FromBody] PingValidatorRequest request)
        {
            var(auth, tenantId, adminId, adminEmail) = Authorize();

            if (!auth)
            {
                return;
            }

            var entity = _validationReader.Get(ValidatorLinkEntity.GeneratePartitionKey(tenantId),
                                               ValidatorLinkEntity.GenerateRowKey(request.ApiKeyId));

            if (entity == null)
            {
                _logger.LogInformation("Cannot send ping. ValidatorLinkEntity not found by API key: {ApiKeyId}", request.ApiKeyId);
                HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
                return;
            }

            if (!entity.IsAccepted)
            {
                _logger.LogInformation("Cannot send ping. ValidatorLinkEntity is not accepted: {ApiKeyId}", request.ApiKeyId);
                HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
                return;
            }

            if (string.IsNullOrEmpty(request.Message))
            {
                _logger.LogInformation("Cannot send ping. Message cannot be empty: {ApiKeyId}", request.ApiKeyId);
                HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
                return;
            }

            if (Encoding.UTF8.GetBytes(request.Message).Length > 100)
            {
                _logger.LogInformation("Cannot send ping. Message length in bytes more that 100: {ApiKeyId}; Message: {Message}", request.ApiKeyId, request.Message);
                HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
                return;
            }

            var message = PingMessageMyNoSqlEntity.Generate(entity.ValidatorId, request.Message);

            await _pingMessageWriter.InsertOrReplaceAsync(message);

            _logger.LogInformation("Ping message are created. API key: {ApiKeyId}; ValidatorId: {ValidatorId}; TenantId: {TenantId}; Name: {Name}; AdminId: {AdminId}", request.ApiKeyId, entity.ValidatorId, entity.TenantId, entity.Name, adminId);
        }
コード例 #8
0
        public override async Task <RefreshPushNotificationFCMTokenResponse> RefreshPushNotificationFCMToken(RefreshPushNotificationFCMTokenRequest request, ServerCallContext context)
        {
            var tenantId = context.GetHttpContext().User.GetClaimOrDefault(Claims.TenantId);
            var apiKeyId = context.GetHttpContext().User.GetClaimOrDefault(Claims.ApiKeyId);

            if (string.IsNullOrEmpty(apiKeyId))
            {
                return(new RefreshPushNotificationFCMTokenResponse()
                {
                    Error = new ValidatorApiError()
                    {
                        Code = ValidatorApiError.Types.ErrorCodes.InternalServerError,
                        Message = "Incorrect Bearer Token. "
                    }
                });
            }

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

            if (validatorLinkEntity != null)
            {
                validatorLinkEntity.PushNotificationFcmToken = request.PushNotificationFCMToken;
                await _validatorLinkWriter.InsertOrReplaceAsync(validatorLinkEntity);

                _logger.LogInformation("Refresh PushNotificationFcmToken. ValidatorId='{ValidatorId}'; PushNotificationFcmToken='{PushNotificationFcmToken}'", validatorLinkEntity.ValidatorId, request.PushNotificationFCMToken);
            }
            else
            {
                return(new RefreshPushNotificationFCMTokenResponse
                {
                    Error = new ValidatorApiError
                    {
                        Code = ValidatorApiError.Types.ErrorCodes.ExpiredApiKey,
                        Message = "API key is expired or deleted",
                        Data = apiKeyId
                    }
                });
            }

            return(new RefreshPushNotificationFCMTokenResponse());
        }
コード例 #9
0
        public async Task RemoveValidatorApiKeyAsync([FromBody] ValidatorRequest request)
        {
            var(auth, tenantId, adminId, adminEmail) = Authorize();

            if (!auth)
            {
                return;
            }

            var entity = _validationReader.Get(ValidatorLinkEntity.GeneratePartitionKey(tenantId),
                                               ValidatorLinkEntity.GenerateRowKey(request.ApiKeyId));

            if (entity == null)
            {
                return;
            }

            await _validationWriter.DeleteAsync(entity.PartitionKey, entity.RowKey);

            _logger.LogInformation("Removed validator Api Key: {ApiKeyId}; AdminId: {AdminId}; Name: {Name}; Device: {Device}; TenantId: {TenantId}", request.ApiKeyId, adminId, entity.Name, entity.DeviceInfo, tenantId);
        }