public async Task <IActionResult> Logout(CancellationToken cancellationToken)
        {
            var command = new SignOutCommand();
            await _mediator.Send(command, cancellationToken);

            return(RedirectToAction("Index", "Home"));
        }
示例#2
0
        public async Task SignOutAsync()
        {
            var userId  = User.Identity.GetId();
            var command = new SignOutCommand(userId);

            await Mediator.Send(command);
        }
示例#3
0
        public BaseViewModel(IUserDialogs userDialogs,
                             IMvxMessenger mvxMessenger, AppHelper appHelper)
        {
            _userDialogs  = userDialogs;
            _mvxMessenger = mvxMessenger;
            _appHelper    = appHelper;
            {}

            SignOutCommand = ReactiveCommand
                             .CreateFromObservable <Unit, bool>((_) =>
                                                                _appHelper.RequestConfirmation(AppResources.Profile_Confirm_SignOut)
                                                                .Where((confirmed) => confirmed));

            SignOutCommand.ThrownExceptions.Subscribe(HandleExceptions);

            SignOutCommand.Subscribe((_) =>
            {
                if (Settings.Current.DeviceRegistered)
                {
                    Mvx.Resolve <INotificationService>()?.unsubscribeDevice().Subscribe((result) => {
                        Settings.Current.DeviceRegistered = false;
                        Debug.WriteLine("Device successfully removed from device group ");
                    });
                }

                Bullytect.Core.Config.Settings.AccessToken = null;
                ShowViewModel <AuthenticationViewModel>(new AuthenticationViewModel.AuthenticationParameter()
                {
                    ReasonForAuthentication = AuthenticationViewModel.SIGN_OUT
                });
            });
        }
示例#4
0
        public async Task SignOutAsync(SignOutCommand command, CancellationToken cancellationToken = default)
        {
            var(force, session) = command;
            var    context = CommandContext.GetCurrent();
            string?userId;

            if (Computed.IsInvalidating())
            {
                GetUserAsync(session, default).Ignore();
                userId = context.Items.TryGet <OperationItem <string?> >()?.Value;
                if (userId != null)
                {
                    GetUserSessionsAsync(userId, default).Ignore();
                }
                if (force)
                {
                    IsSignOutForcedAsync(session, default).Ignore();
                }
                return;
            }

            await using var dbContext = await CreateCommandDbContextAsync(cancellationToken).ConfigureAwait(false);

            var dbSession = await GetOrCreateSessionAsync(dbContext, session, cancellationToken).ConfigureAwait(false);

            userId = dbSession.UserId;
            dbSession.IsSignOutForced = force;
            dbSession.UserId          = null;
            context.Items.Set(OperationItem.New(userId));
            await dbContext.SaveChangesAsync(cancellationToken);
        }
示例#5
0
        public UserPageViewModel(INavigationService navigationService, IPageDialogService pageDialogService, IGoogleService googleService, IFacebookService facebookService, IAppleService appleService) : base(navigationService)
        {
            _pageDialogService = pageDialogService;
            _googleService     = googleService;
            _facebookService   = facebookService;
            _appleService      = appleService;

            _multiFactorService = new MultiFactorService(this);

            Title = "User";

            var user = _auth.CurrentUser;

            Update(user);

            Name        = new ReactivePropertySlim <string>(user?.DisplayName);
            Email       = new ReactivePropertySlim <string>(user?.Email);
            PhoneNumber = new ReactivePropertySlim <string>(user?.PhoneNumber);

            _isEnrolledMultiFactor.Value = user.MultiFactor.EnrolledFactors.Any();

            UpdateNameCommand.Subscribe(UpdateName);
            UpdateEmailCommand.Subscribe(UpdateEmail);
            UpdatePhoneNumberCommand.Subscribe(UpdatePhoneNumber);
            SignOutCommand.Subscribe(SignOut);
            LinkOrUnlinkWithGoogleCommand.Subscribe(() => IsLinkedWithGoogle.Value ? UnlinkWithProvider("google.com") : LinkWithGoogle());
            LinkOrUnlinkWithTwitterCommand.Subscribe(() => IsLinkedWithTwitter.Value ? UnlinkWithProvider("twitter.com") : LinkWithProvider("twitter.com"));
            LinkOrUnlinkWithFacebookCommand.Subscribe(() => IsLinkedWithFacebook.Value ? UnlinkWithProvider("facebook.com") : LinkWithFacebook());
            LinkOrUnlinkWithGitHubCommand.Subscribe(() => IsLinkedWithGitHub.Value ? UnlinkWithProvider("github.com") : LinkWithProvider("github.com"));
            LinkOrUnlinkWithYahooCommand.Subscribe(() => IsLinkedWithYahoo.Value ? UnlinkWithProvider("yahoo.com") : LinkWithProvider("yahoo.com"));
            LinkOrUnlinkWithMicrosoftCommand.Subscribe(() => IsLinkedWithMicrosoft.Value ? UnlinkWithProvider("microsoft.com") : LinkWithProvider("microsoft.com"));
            LinkOrUnlinkWithAppleCommand.Subscribe(() => IsLinkedWithApple.Value ? UnlinkWithProvider("apple.com") : LinkWithApple());
            EnrollOrUnenrollMultiFactorCommand.Subscribe(() => IsEnrolledMultiFactor.Value ? UnenrollMultiFactor() : EnrollMultiFactor());
            DeleteCommand.Subscribe(Delete);
        }
示例#6
0
        public async Task <IActionResult> SignOut()
        {
            var command = new SignOutCommand();

            await _mediator.Send(command);

            return(Ok());
        }
        private ICommand CreateSignOutCommand()
        {
            var command = new SignOutCommand(
                this.ninjectKernel.Get <IUserService>(),
                this.ninjectKernel.Get <IServerChatService>(),
                this.mainWindowViewModel);

            return(command);
        }
        public UserPageViewModel(INavigationService navigationService, IPageDialogService pageDialogService, IAuthService authService) : base(navigationService)
        {
            _pageDialogService = pageDialogService;
            _authService       = authService;

            Title = "User";

            _user.Value = CrossFirebaseAuth.Current.Instance.CurrentUser;

            Name        = new ReactivePropertySlim <string>(_user.Value?.DisplayName);
            Email       = new ReactivePropertySlim <string>(_user.Value?.Email);
            PhoneNumber = new ReactivePropertySlim <string>(_user.Value?.PhoneNumber);

            IsLinkedWithGoogle = _user.Where(user => user != null)
                                 .Select(user => user.ProviderData.FirstOrDefault(data => data.ProviderId == CrossFirebaseAuth.Current.GoogleAuthProvider.ProviderId) != null)
                                 .ToReadOnlyReactivePropertySlim();

            IsLinkedWithTwitter = _user.Where(user => user != null)
                                  .Select(user => user.ProviderData.FirstOrDefault(data => data.ProviderId == CrossFirebaseAuth.Current.TwitterAuthProvider.ProviderId) != null)
                                  .ToReadOnlyReactivePropertySlim();

            IsLinkedWithFacebook = _user.Where(user => user != null)
                                   .Select(user => user.ProviderData.FirstOrDefault(data => data.ProviderId == CrossFirebaseAuth.Current.FacebookAuthProvider.ProviderId) != null)
                                   .ToReadOnlyReactivePropertySlim();

            IsLinkedWithGitHub = _user.Where(user => user != null)
                                 .Select(user => user.ProviderData.FirstOrDefault(data => data.ProviderId == CrossFirebaseAuth.Current.GitHubAuthProvider.ProviderId) != null)
                                 .ToReadOnlyReactivePropertySlim();

            _user.Where(user => user != null)
            .Select(user => user.DisplayName)
            .DistinctUntilChanged()
            .Subscribe(name => Name.Value = name);

            _user.Where(user => user != null)
            .Select(user => user.Email)
            .DistinctUntilChanged()
            .Subscribe(email => Email.Value = email);

            _user.Where(user => user != null)
            .Select(user => user.PhoneNumber)
            .DistinctUntilChanged()
            .Subscribe(phoneNumber => PhoneNumber.Value = phoneNumber);

            UpdateNameCommand.Subscribe(UpdateName);
            UpdateEmailCommand.Subscribe(UpdateEmail);
            UpdatePhoneNumberCommand.Subscribe(UpdatePhoneNumber);
            SignOutCommand.Subscribe(SignOut);
            LinkOrUnlinkWithGoogleCommand.Subscribe(() => IsLinkedWithGoogle.Value ? UnlinkWithGoogle() : LinkWithGoogle());
            LinkOrUnlinkWithTwitterCommand.Subscribe(() => IsLinkedWithTwitter.Value ? UnlinkWithTwitter() : LinkWithTwitter());
            LinkOrUnlinkWithFacebookCommand.Subscribe(() => IsLinkedWithFacebook.Value ? UnlinkWithFacebook() : LinkWithFacebook());
            LinkOrUnlinkWithGitHubCommand.Subscribe(() => IsLinkedWithGitHub.Value ? UnlinkWithGitHub() : LinkWithGitHub());
            DeleteCommand.Subscribe(Delete);
        }
示例#9
0
        public SignOutResult Handle(SignOutCommand command)
        {
            Task.Run(() => _signInManager.SignOutAsync()).Wait();

            var user = _userManager.GetUserAsync(_contextAccessor.HttpContext.User).Result;

            if (user != null)
            {
                var deleteResult = _userManager.DeleteAsync(user).Result;
            }

            return(new SignOutResult());
        }
示例#10
0
        public MainWindowVm()
        {
            SignInCommand              = new SignInCommand();
            SignOutCommand             = new SignOutCommand();
            AddAnimalCommand           = new AddAnimalCommand();
            EditAnimalCommand          = new EditAnimalCommand();
            DeleteAnimalCommand        = new DeleteAnimalCommand();
            CallVaccineCommand         = new CallVaccineCommand();
            CallTreatmentCommand       = new CallTreatmentCommand();
            CompleteCallCommand        = new CompleteCallCommand();
            ShowVaccinationCardCommand = new ShowVaccinationCardCommand();
            SignInCommand.Execute(this);

            Update();
        }
示例#11
0
        public HomeVM(User loggedInUser, Window view)
        {
            //System.Diagnostics.PresentationTraceSources.SetTraceLevel(this.View.dataGrid.ItemContainerGenerator, System.Diagnostics.PresentationTraceLevel.High);
            CurrentUser = loggedInUser;
            this.View   = view;

            //InMemoryAppender.LogData

            selectedSubstationChangedCmd = new SubstationSelectionChanged(this);
            selectedDeviceChangedCmd     = new DeviceSelectionChanged(this);
            openAddSubstationDialogCmd   = new OpenAddSubstation(this);
            deleteSubstationCmd          = new DeleteSubstation(this);
            redoCmd = new RedoCommand(this);
            undoCmd = new UndoCommand(this);
            openEditSubstationCmd = new OpenEditSubstation(this);
            refreshCommand        = new RefreshCommand(this);
            signOutCmd            = new SignOutCommand(this);
            openAddUserCmd        = new OpenAddUser(this);
            openEditUserDataCmd   = new OpenEditUserData(this);
            cloneSubstationCmd    = new CloneSubstationCmd(this);
            filterSubstationCmd   = new FilterSubstationsCmd(this);
            openAddDeviceCmd      = new OpenAddDevice(this);
            deleteDeviceCmd       = new DeleteDeviceCmd(this);
            openAddMeasurementCmd = new OpenAddMeasurement(this);
            deleteMeasurementCmd  = new DeleteMeasurement(this);

            #region initialize Undo/Redo data holders
            RedoHistory = new List <BaseCommand>();
            UndoHistory = new List <BaseCommand>();

            SubstationsUndo  = new List <Substation>();
            DevicesUndo      = new List <Device>();
            MeasurementsUndo = new List <Measurement>();

            SubstationsRedo  = new List <Substation>();
            DevicesRedo      = new List <Device>();
            MeasurementsRedo = new List <Measurement>();
            #endregion

            FilterName     = "";
            FilterLocation = "";

            //CurrentUser = UserProxy.Instance.Proxy.Login("admin", "admin");
            visibleIfAdmin = CurrentUser.isAdmin ? "Visible" : "Hidden"; // show/hide GUI elements based on priviledge

            RefreshData();
        }
示例#12
0
 public bool SignOut(SignOutCommand signOutCommand)
 {
     try
     {
         using (var db = _paintStoreContext)
         {
             var userToSignOut = db.Users.First(x => x.Id == signOutCommand.UserId);
             userToSignOut.Token = CredentialsHelpers.CreateSalt();
             db.SaveChanges();
         }
         return(true);
     }
     catch (Exception)
     {
         return(false);
     }
 }
        public virtual async Task UpdateAuthState(HttpContext httpContext, CancellationToken cancellationToken = default)
        {
            var httpUser = httpContext.User;
            var httpAuthenticationSchema = httpUser.Identity?.AuthenticationType ?? "";
            var isAuthenticated          = !string.IsNullOrEmpty(httpAuthenticationSchema);

            var session   = SessionResolver.Session;
            var ipAddress = httpContext.Connection.RemoteIpAddress?.ToString() ?? "";
            var userAgent = httpContext.Request.Headers.TryGetValue("User-Agent", out var userAgentValues)
                ? userAgentValues.FirstOrDefault() ?? ""
                : "";
            var setupSessionCommand = new SetupSessionCommand(session, ipAddress, userAgent).MarkServerSide();
            var sessionInfo         = await AuthService.SetupSession(setupSessionCommand, cancellationToken).ConfigureAwait(false);

            var userId = sessionInfo.UserId;
            var userIsAuthenticated = sessionInfo.IsAuthenticated && !sessionInfo.IsSignOutForced;
            var user = userIsAuthenticated
                ? (await AuthService.TryGetUser(userId, cancellationToken).ConfigureAwait(false)
                   ?? throw new KeyNotFoundException())
                : new User(session.Id); // Guest

            try {
                if (isAuthenticated)
                {
                    if (userIsAuthenticated && IsSameUser(user, httpUser, httpAuthenticationSchema))
                    {
                        return;
                    }
                    var(newUser, authenticatedIdentity) = CreateOrUpdateUser(user, httpUser, httpAuthenticationSchema);
                    var signInCommand = new SignInCommand(session, newUser, authenticatedIdentity).MarkServerSide();
                    await AuthService.SignIn(signInCommand, cancellationToken).ConfigureAwait(false);
                }
                else
                {
                    if (userIsAuthenticated)
                    {
                        var signOutCommand = new SignOutCommand(session);
                        await AuthService.SignOut(signOutCommand, cancellationToken).ConfigureAwait(false);
                    }
                }
            }
            finally {
                // Ideally this should be done once important things are completed
                Task.Run(() => AuthService.UpdatePresence(session, default), default).Ignore();
示例#14
0
        public virtual async Task SignOutAsync(
            SignOutCommand command, CancellationToken cancellationToken = default)
        {
            var(session, force) = command;
            var context = CommandContext.GetCurrent();

            if (Computed.IsInvalidating())
            {
                GetSessionInfoAsync(session, default).Ignore();
                var invSessionInfo = context.Operation().Items.TryGet <SessionInfo>();
                if (invSessionInfo != null)
                {
                    TryGetUserAsync(invSessionInfo.UserId, default).Ignore();
                    GetUserSessionsAsync(invSessionInfo.UserId, default).Ignore();
                }
                return;
            }

            await using var dbContext = await CreateCommandDbContextAsync(cancellationToken).ConfigureAwait(false);

            var dbSessionInfo = await Sessions.FindOrCreateAsync(dbContext, session, cancellationToken).ConfigureAwait(false);

            var sessionInfo = dbSessionInfo.ToModel();

            if (sessionInfo.IsSignOutForced)
            {
                return;
            }

            context.Operation().Items.Set(sessionInfo);
            sessionInfo = sessionInfo with {
                LastSeenAt            = Clock.Now,
                AuthenticatedIdentity = "",
                UserId          = "",
                IsSignOutForced = force,
            };
            await Sessions.CreateOrUpdateAsync(dbContext, sessionInfo, cancellationToken).ConfigureAwait(false);
        }
示例#15
0
 public Task SignOut([FromBody] SignOutCommand command, CancellationToken cancellationToken = default)
 {
     command.UseDefaultSession(SessionResolver);
     return(AuthService.SignOut(command, cancellationToken));
 }
示例#16
0
        public MainWindowViewModel()
        {
            Locator.CurrentMutable.RegisterConstant(this);
            User = new CurrentUserViewModel();
            Locator.CurrentMutable.RegisterConstant <ICurrentUser>(User);
            configuration = Locator.Current.GetService <IConfiguration>();
            settings      = configuration?.GetSection("ChatClientSettings")?.Get <ChatClientSettings>();

            var mapper = Locator.Current.GetService <IMapper>();

            if (settings == null)
            {
                settings = new ChatClientSettings();
            }

            if (settings.HostUrl.IsNullOrEmpty())
            {
                settings.HostUrl = "http://localhost:5000";
            }

            if (settings.AttachmentDefaultPath.IsNullOrEmpty())
            {
                settings.AttachmentDefaultPath = "\\Download";
            }

            serviceClient = new JsonServiceClient(settings.HostUrl);

            ProfileViewModel = new ProfileViewModel(serviceClient);
            Locator.CurrentMutable.RegisterConstant <IProfile>(ProfileViewModel);
            ProfileViewModel.IsOpenProfileEvent += () => WindowStates(WindowState.OpenProfile);

            AttachmentViewModel = new SendAttachmentsViewModel(serviceClient);

            SettingsViewModel = new SettingsViewModel(serviceClient);
            SettingsViewModel.OpenSettingsActiveEvent        += (e) => { WindowStates(WindowState.WindowSettings); };
            SettingsViewModel.TypeEnterEvent                 += (e) => { KeySendMessage = e; };
            SettingsViewModel.ContextMenuSettingsActiveEvent += (e) => { WindowStates(WindowState.HeaderMenuPopup); };
            SettingsViewModel.SetSelectedOnSettingsItemEvent += e => { TextHeaderMenuInSettings = SettingsViewModel.SettingsMenuActiveMain ? "Сообщения и чаты" : "Аудит входа"; };

            Width(false);
            User.UserName = settings.UserName;
            Tokens        = new TokenResult {
                AccessToken = settings.AccessToken, RefreshToken = settings.RefreshToken
            };

            Messages = new ObservableCollection <IMessagesContainerViewModel>();

            var bits            = Environment.Is64BitOperatingSystem ? "PC 64bit, " : "PC 32bit, ";
            var operatingSystem = bits + RuntimeInformation.OSDescription;

            string ipAddress = "";

            try
            {
                ipAddress = new WebClient().DownloadString("https://api.ipify.org");
            }
            catch (Exception e)
            {
                try
                {
                    IPHostEntry ipHost = Dns.GetHostEntry("localhost");
                    if (ipHost.AddressList.Length > 0)
                    {
                        ipAddress = ipHost.AddressList.Last().ToString();
                    }
                }
                catch (Exception exception) { }
            }
            var nameVersionClient = "SkillChat Avalonia Client 1.0";

            ConnectCommand = ReactiveCommand.CreateFromTask(async() =>
            {
                try
                {
                    _connection = new HubConnectionBuilder()
                                  .WithUrl(settings.HostUrl + "/ChatHub")
                                  .Build();

                    _hub = _connection.CreateHub <IChatHub>();
                    ProfileViewModel.SetChatHub(_hub);
                    AttachmentViewModel.SetChatHub(_hub);

                    if (Tokens == null || Tokens.AccessToken.IsNullOrEmpty())
                    {
                        Tokens = await serviceClient.PostAsync(new AuthViaPassword
                        {
                            Login = User.UserName, Password = User.Password
                        });
                        settings.AccessToken  = Tokens.AccessToken;
                        settings.RefreshToken = Tokens.RefreshToken;
                        settings.UserName     = User.UserName;
                        configuration.GetSection("ChatClientSettings").Set(settings);
                    }

                    serviceClient.BearerToken = Tokens.AccessToken;
                    this.ObservableForProperty(m => m.ExpireTime).Subscribe(change =>
                    {
                        if (change.Value != null)
                        {
                            //TODO запуск обновления токена
                        }
                    });

                    _connection.Subscribe <LogOn>(async data =>
                    {
                        if (data.Error)
                        {
                            IsSignedIn = false;
                            serviceClient.BearerToken = Tokens.RefreshToken;
                            try
                            {
                                Tokens = await serviceClient.PostAsync(new PostRefreshToken());
                                settings.AccessToken  = Tokens.AccessToken;
                                settings.RefreshToken = Tokens.RefreshToken;
                                configuration.GetSection("ChatClientSettings").Set(configuration);
                                await _hub.Login(Tokens.AccessToken, operatingSystem, ipAddress, nameVersionClient);
                            }
                            catch (Exception e)
                            {
                                Tokens = null;
                            }
                        }
                        else
                        {
                            IsSignedIn = true;
                            User.Id    = data.Id;
                            User.Login = data.UserLogin;
                            ExpireTime = data.ExpireTime;
                            var chats  = await serviceClient.GetAsync(new GetChatsList());
                            var chat   = chats.Chats.FirstOrDefault();
                            ChatId     = chat?.Id;
                            ChatName   = chat?.ChatName;
                            LoadMessageHistoryCommand.Execute(null);
                            //Получаем настройки
                            SettingsViewModel.ChatSettings = await serviceClient.GetAsync(new GetMySettings());
                            KeySendMessage = SettingsViewModel.ChatSettings.SendingMessageByEnterKey;
                        }
                    });

                    _connection.Subscribe <UpdateUserDisplayName>(async user =>
                    {
                        try
                        {
                            var updateMessages = Messages.Where(s => s is UserMessagesContainerViewModel);
                            foreach (var message in updateMessages)
                            {
                                foreach (var item in message.Messages.Where(s => s.UserId == user.Id))
                                {
                                    item.UserNickname = user.DisplayName;
                                }
                            }

                            ProfileViewModel.UpdateUserProfile(user.DisplayName, user.Id);
                        }
                        catch (Exception e)
                        {
                            SignOutCommand.Execute(null);
                        }
                    });

                    _connection.Subscribe <ReceiveMessage>(async data =>
                    {
                        var isMyMessage    = User.Id == data.UserId;
                        var hasAttachments = data.Attachments != null && data.Attachments.Count > 0;

                        MessageViewModel newMessage;

                        if (isMyMessage)
                        {
                            newMessage = hasAttachments ? new MyAttachmentViewModel() : new MyMessageViewModel();
                        }
                        else
                        {
                            newMessage = hasAttachments ? new UserAttachmentViewModel() : new UserMessageViewModel();
                        }

                        newMessage.Id           = data.Id;
                        newMessage.Text         = data.Message;
                        newMessage.PostTime     = data.PostTime;
                        newMessage.UserNickname = data.UserNickname ?? data.UserLogin;
                        newMessage.UserId       = data.UserId;

                        newMessage.Attachments = data.Attachments?
                                                 .Select(s =>
                        {
                            var attah = mapper?.Map <AttachmentMold>(s);
                            return(new AttachmentMessageViewModel(attah));
                        }).ToList();

                        var container = Messages.LastOrDefault();

                        if (isMyMessage)
                        {
                            if (!(container is MyMessagesContainerViewModel))
                            {
                                container = new MyMessagesContainerViewModel();
                                Messages.Add(container);
                            }
                        }
                        else
                        {
                            if (container is UserMessagesContainerViewModel)
                            {
                                var lastMessage = container.Messages.LastOrDefault();
                                if (lastMessage?.UserId != newMessage.UserId)
                                {
                                    container = new UserMessagesContainerViewModel();
                                    Messages.Add(container);
                                }
                            }
                            else
                            {
                                container = new UserMessagesContainerViewModel();
                                Messages.Add(container);
                            }

                            if (!windowIsFocused || SettingsViewModel.IsOpened)
                            {
                                Notify.NewMessage(newMessage.UserNickname, newMessage.Text.Replace("\r\n", " "));
                            }
                        }

                        container.Messages.Add(newMessage);
                        if (container.Messages.First() == newMessage)
                        {
                            newMessage.ShowNickname = true;
                        }

                        MessageReceived?.Invoke(new ReceivedMessageArgs(newMessage));
                    });

                    _connection.Closed += connectionOnClosed();
                    await _connection.StartAsync();
                    await _hub.Login(Tokens.AccessToken, operatingSystem, ipAddress, nameVersionClient);
                    //Messages.Add("Connection started");
                    IsShowingLoginPage    = false;
                    IsShowingRegisterPage = false;
                    ValidationError       = "";
                    IsConnected           = true;
                    User.Password         = "";
                }
                catch (Exception ex)
                {
                    //Изменение параеметров TextBox в случае ошибки
                    User.Error("неверный логин или пароль");
                    ErrorBe?.Invoke();
                    IsShowingLoginPage = _connection.State != HubConnectionState.Connected ? true : false;
                    //Messages.Add(ex.Message);
                }
            });

            if (Tokens.AccessToken.IsNullOrEmpty() == false)
            {
                ConnectCommand.Execute(null);
            }

            SendCommand = ReactiveCommand.CreateFromTask(async() =>
            {
                try
                {
                    await _hub.SendMessage(new HubMessage(ChatId, MessageText));
                    MessageText = null;
                }
                catch (Exception ex)
                {
                    SignOutCommand.Execute(null);
                }
            },
                                                         this.WhenAnyValue(m => m.IsConnected, m => m.MessageText,
                                                                           (b, m) => b == true && !string.IsNullOrEmpty(m)));

            LoadMessageHistoryCommand = ReactiveCommand.CreateFromTask(async() =>
            {
                try
                {
                    var first   = Messages.FirstOrDefault()?.Messages.FirstOrDefault();
                    var request = new GetMessages {
                        ChatId = ChatId, BeforePostTime = first?.PostTime
                    };

                    // Логика выбора сообщений по id чата
                    var result = await serviceClient.GetAsync(request);
                    foreach (var item in result.Messages)
                    {
                        var isMyMessage    = User.Id == item.UserId;
                        var hasAttachments = item.Attachments != null && item.Attachments.Count > 0;

                        MessageViewModel newMessage;

                        if (isMyMessage)
                        {
                            newMessage = hasAttachments ? new MyAttachmentViewModel() : new MyMessageViewModel();
                        }
                        else
                        {
                            newMessage = hasAttachments ? new UserAttachmentViewModel() : new UserMessageViewModel();
                        }

                        newMessage.Id           = item.Id;
                        newMessage.Text         = item.Text;
                        newMessage.PostTime     = item.PostTime;
                        newMessage.UserNickname = item.UserNickName;
                        newMessage.UserId       = item.UserId;

                        newMessage.Attachments = item.Attachments?.Select(s => new AttachmentMessageViewModel(s)).ToList();

                        var container = Messages.FirstOrDefault();

                        if (isMyMessage)
                        {
                            if (!(container is MyMessagesContainerViewModel))
                            {
                                container = new MyMessagesContainerViewModel();
                                Messages.Insert(0, container);
                            }
                        }
                        else
                        {
                            if (container is UserMessagesContainerViewModel)
                            {
                                var firstMessage = container.Messages.FirstOrDefault();
                                if (firstMessage?.UserId != newMessage.UserId)
                                {
                                    container = new UserMessagesContainerViewModel();
                                    Messages.Insert(0, container);
                                }
                            }
                            else
                            {
                                container = new UserMessagesContainerViewModel();
                                Messages.Insert(0, container);
                            }
                        }

                        container.Messages.Insert(0, newMessage);

                        var firstInBlock = container.Messages.First();
                        foreach (var message in container.Messages)
                        {
                            message.ShowNickname = firstInBlock == message;
                        }
                    }
                }
                catch (Exception e)
                {
                }
            });

            SignOutCommand = ReactiveCommand.CreateFromTask(async() =>
            {
                try
                {
                    Messages.Clear();
                    MessageText = null;
                    Tokens      = null;
                    IsSignedIn  = false;
                    IsConnected = false;
                    serviceClient.BearerToken = null;
                    if (_connection != null)
                    {
                        _connection.Closed -= connectionOnClosed();
                        await _connection.StopAsync();
                    }

                    _connection = null;
                    _hub        = null;

                    settings.AccessToken  = null;
                    settings.RefreshToken = null;
                    configuration.GetSection("ChatClientSettings").Set(settings);

                    WindowStates(WindowState.SignOut);
                }
                catch (Exception ex)
                {
                }
                finally
                {
                    IsShowingLoginPage = true;
                }
            });
            IsShowingLoginPage = true;

            // Скрывает окно регистрации
            IsShowingRegisterPage = false;
            IsShowingLoginPage    = true;
            GoToRegisterCommand   = ReactiveCommand.Create <object>(_ =>
            {
                IsShowingRegisterPage = true;
                IsShowingLoginPage    = false;
                RegisterUser.Login    = User.UserName;
                User.Password         = "";
            });

            RegisterUser = new RegisterUserViewModel();
            RegisterUser.GoToLoginCommand = ReactiveCommand.Create <object>(_ =>
            {
                IsShowingRegisterPage = false;
                IsShowingLoginPage    = true;
                RegisterUser.Password = "";
                User.UserName         = RegisterUser.Login;
            });
            IsConnected     = false; //Скрывает окно чата
            RegisterCommand = ReactiveCommand.CreateFromTask(async() =>
            {
                var request = new RegisterNewUser();
                try
                {
                    ValidationError = "";
                    if (string.IsNullOrWhiteSpace(RegisterUser.Login) ||
                        string.IsNullOrWhiteSpace(RegisterUser.Password))
                    {
                        throw new Exception("Не заполнены логин и/или пароль");
                    }
                    request.Login    = RegisterUser.Login;
                    request.Password = RegisterUser.Password;
                    request.UserName = RegisterUser.UserName;

                    Tokens = await serviceClient.PostAsync(request);

                    settings.AccessToken  = Tokens.AccessToken;
                    settings.RefreshToken = Tokens.RefreshToken;
                    settings.UserName     = RegisterUser.Login;
                    configuration.GetSection("ChatClientSettings").Set(settings);
                    ConnectCommand.Execute(null);
                }
                catch (Exception ex)
                {
                    Debug.WriteLine($"Ошибка регистрации {ex.Message}");
                    ValidationError = ex.Message;
                }
            });

            NotifyCommand = ReactiveCommand.Create <object>(obj =>
            {
                if (obj is IHaveIsActive win)
                {
                    windowIsFocused = win.IsActive;
                }
            });
            PointerPressedCommand = ReactiveCommand.Create <object>(obj =>
            {
                ProfileViewModel.ContextMenuClose();
                SettingsViewModel.CloseContextMenu();
            });

            ProfileViewModel.SignOutCommand            = SignOutCommand;
            ProfileViewModel.LoadMessageHistoryCommand = LoadMessageHistoryCommand;
        }
示例#17
0
 public Task SignOut([FromBody] SignOutCommand command, CancellationToken cancellationToken = default)
 => Auth.SignOut(command.UseDefaultSession(SessionResolver), cancellationToken);
示例#18
0
 public IActionResult SignOut([FromBody] SignOutCommand command) => ProcessCommand(command);
示例#19
0
 // IAuth
 public abstract Task SignOut(SignOutCommand command, CancellationToken cancellationToken                  = default);
        public async Task LongFlowTest()
        {
            var authServer     = Services.GetRequiredService <IServerSideAuthService>();
            var sessionFactory = ClientServices.GetRequiredService <ISessionFactory>();
            var sessionA       = sessionFactory.CreateSession();
            var sessionB       = sessionFactory.CreateSession();

            var sessions = await authServer.GetUserSessions(sessionA);

            sessions.Length.Should().Be(0);
            sessions = await authServer.GetUserSessions(sessionB);

            sessions.Length.Should().Be(0);

            var bob       = new User("", "Bob").WithIdentity("g:1");
            var signInCmd = new SignInCommand(sessionA, bob).MarkServerSide();
            await authServer.SignIn(signInCmd);

            var user = await authServer.GetUser(sessionA);

            user.Name.Should().Be(bob.Name);
            bob = await authServer.TryGetUser(user.Id)
                  ?? throw new NullReferenceException();

            sessions = await authServer.GetUserSessions(sessionA);

            sessions.Select(s => s.Id).Should().BeEquivalentTo(new[] { sessionA.Id });
            sessions = await authServer.GetUserSessions(sessionB);

            sessions.Length.Should().Be(0);

            signInCmd = new SignInCommand(sessionB, bob).MarkServerSide();
            await authServer.SignIn(signInCmd);

            user = await authServer.GetUser(sessionB);

            user.Name.Should().Be(bob.Name);

            sessions = await authServer.GetUserSessions(sessionA);

            sessions.Select(s => s.Id).Should().BeEquivalentTo(new[] { sessionA.Id, sessionB.Id });
            sessions = await authServer.GetUserSessions(sessionB);

            sessions.Select(s => s.Id).Should().BeEquivalentTo(new[] { sessionA.Id, sessionB.Id });

            var signOutCmd = new SignOutCommand(sessionA);
            await authServer.SignOut(signOutCmd);

            (await authServer.IsSignOutForced(sessionB)).Should().BeFalse();
            user = await authServer.GetUser(sessionA);

            user.IsAuthenticated.Should().BeFalse();

            sessions = await authServer.GetUserSessions(sessionA);

            sessions.Length.Should().Be(0);
            sessions = await authServer.GetUserSessions(sessionB);

            sessions.Select(s => s.Id).Should().BeEquivalentTo(new[] { sessionB.Id });

            signInCmd = new SignInCommand(sessionA, bob).MarkServerSide();
            await authServer.SignIn(signInCmd);

            user = await authServer.GetUser(sessionA);

            user.Name.Should().Be(bob.Name);

            sessions = await authServer.GetUserSessions(sessionA);

            sessions.Select(s => s.Id).Should().BeEquivalentTo(new[] { sessionA.Id, sessionB.Id });
            sessions = await authServer.GetUserSessions(sessionB);

            sessions.Select(s => s.Id).Should().BeEquivalentTo(new[] { sessionA.Id, sessionB.Id });

            signOutCmd = new SignOutCommand(sessionB, true);
            await authServer.SignOut(signOutCmd);

            (await authServer.IsSignOutForced(sessionB)).Should().BeTrue();
            (await authServer.GetSessionInfo(sessionB)).IsSignOutForced.Should().BeTrue();
            user = await authServer.GetUser(sessionB);

            user.IsAuthenticated.Should().BeFalse();

            sessions = await authServer.GetUserSessions(sessionA);

            sessions.Select(s => s.Id).Should().BeEquivalentTo(new[] { sessionA.Id });
            sessions = await authServer.GetUserSessions(sessionB);

            sessions.Length.Should().Be(0);

            await Assert.ThrowsAsync <SecurityException>(async() => {
                var sessionInfo     = await authServer.GetSessionInfo(sessionB);
                var setupSessionCmd = new SetupSessionCommand(sessionB).MarkServerSide();
                await authServer.SetupSession(setupSessionCmd);
            });

            await Assert.ThrowsAsync <SecurityException>(async() => {
                signInCmd = new SignInCommand(sessionB, bob).MarkServerSide();
                await authServer.SignIn(signInCmd);
            });
        }
示例#21
0
 public async Task <IActionResult> Post([FromBody] SignOutCommand command)
 {
     return(await HandleRequestWithToken(command));
 }
示例#22
0
     new(new TransientOperation()
 {
     Command = new SignOutCommand()
 });
示例#23
0
        public async Task <IActionResult> SignOut(SignOutCommand request)
        {
            await _mediator.Send(request);

            return(Ok());
        }
示例#24
0
 public IActionResult SignOut([FromBody] SignOutCommand signOutCommand)
 {
     return(Ok(_signInService.SignOut(signOutCommand)));
 }
示例#25
0
 public async Task <IActionResult> SignOut(SignOutCommand command)
 {
     return(Ok(await Mediator.Send(command)));
 }