Пример #1
0
        public override async Task Details(DetailsReq request, IServerStreamWriter <DetailsResp> responseStream,
                                           ServerCallContext context)
        {
            var options = request.Options;

            var user = await GetUser(_authenticationProvider, context.RequestHeaders).ConfigureAwait(false);

            var detailsSource = new TaskCompletionSource <UserManagementMessage.UserData[]>();

            var envelope = new CallbackEnvelope(OnMessage);

            _queue.Publish(string.IsNullOrWhiteSpace(options?.LoginName)
                                ? (Message) new UserManagementMessage.GetAll(envelope, user)
                                : new UserManagementMessage.Get(envelope, user, options.LoginName));

            var details = await detailsSource.Task.ConfigureAwait(false);

            foreach (var detail in details)
            {
                await responseStream.WriteAsync(new DetailsResp {
                    UserDetails = new DetailsResp.Types.UserDetails {
                        Disabled    = detail.Disabled,
                        Groups      = { detail.Groups },
                        FullName    = detail.FullName,
                        LoginName   = detail.LoginName,
                        LastUpdated = detail.DateLastUpdated.HasValue
                                                        ? new DetailsResp.Types.UserDetails.Types.DateTime
                        {
                            TicksSinceEpoch = detail.DateLastUpdated.Value.UtcDateTime.ToTicksSinceEpoch()
                        }
                                                        : null
                    }
                }).ConfigureAwait(false);
            }

            void OnMessage(Message message)
            {
                if (HandleErrors(options?.LoginName, message, detailsSource))
                {
                    return;
                }

                switch (message)
                {
                case UserManagementMessage.UserDetailsResult userDetails:
                    detailsSource.TrySetResult(new[] { userDetails.Data });
                    break;

                case UserManagementMessage.AllUserDetailsResult allUserDetails:
                    detailsSource.TrySetResult(allUserDetails.Data);
                    break;

                default:
                    detailsSource.TrySetException(RpcExceptions.UnknownError(1));
                    break;
                }
            }
        }
Пример #2
0
        public override async Task Details(DetailsReq request, IServerStreamWriter <DetailsResp> responseStream,
                                           ServerCallContext context)
        {
            var options = request.Options;

            var user          = context.GetHttpContext().User;
            var readOperation = ReadOperation;

            if (user?.Identity?.Name != null)
            {
                readOperation =
                    readOperation.WithParameter(
                        Plugins.Authorization.Operations.Users.Parameters.User(user.Identity.Name));
            }
            if (!await _authorizationProvider.CheckAccessAsync(user, readOperation, context.CancellationToken).ConfigureAwait(false))
            {
                throw AccessDenied();
            }
            var detailsSource = new TaskCompletionSource <UserManagementMessage.UserData[]>();

            var envelope = new CallbackEnvelope(OnMessage);

            _publisher.Publish(string.IsNullOrWhiteSpace(options?.LoginName)
                                ? (Message) new UserManagementMessage.GetAll(envelope, user)
                                : new UserManagementMessage.Get(envelope, user, options.LoginName));

            var details = await detailsSource.Task.ConfigureAwait(false);

            foreach (var detail in details)
            {
                await responseStream.WriteAsync(new DetailsResp {
                    UserDetails = new DetailsResp.Types.UserDetails {
                        Disabled    = detail.Disabled,
                        Groups      = { detail.Groups },
                        FullName    = detail.FullName,
                        LoginName   = detail.LoginName,
                        LastUpdated = detail.DateLastUpdated.HasValue
                                                        ? new DetailsResp.Types.UserDetails.Types.DateTime
                        {
                            TicksSinceEpoch = detail.DateLastUpdated.Value.UtcDateTime.ToTicksSinceEpoch()
                        }
                                                        : null
                    }
                }).ConfigureAwait(false);
            }

            void OnMessage(Message message)
            {
                if (HandleErrors(options?.LoginName, message, detailsSource))
                {
                    return;
                }

                switch (message)
                {
                case UserManagementMessage.UserDetailsResult userDetails:
                    detailsSource.TrySetResult(new[] { userDetails.Data });
                    break;

                case UserManagementMessage.AllUserDetailsResult allUserDetails:
                    detailsSource.TrySetResult(allUserDetails.Data);
                    break;

                default:
                    detailsSource.TrySetException(RpcExceptions.UnknownError(1));
                    break;
                }
            }
        }