diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCService.cpp b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCService.cpp index 7101bc64..d2f09275 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCService.cpp +++ b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCService.cpp @@ -412,15 +412,7 @@ Status GRPCService::Login(ServerContext *, LoginRequest const *request, Empty *) return Status::OK; } - SPUser const user = randomUser(); - QString const userID = user->id(); - user->setUsername(QString::fromStdString(request->username())); - usersTab.userTable().append(user); - - if (usersTab.nextUserAlreadyLoggedIn()) { - qtProxy_.sendDelayedEvent(newLoginAlreadyLoggedInEvent(userID)); - } - qtProxy_.sendDelayedEvent(newLoginFinishedEvent(userID)); + this->finishLogin(); return Status::OK; } @@ -445,15 +437,7 @@ Status GRPCService::Login2FA(ServerContext *, LoginRequest const *request, Empty return Status::OK; } - SPUser const user = randomUser(); - QString const userID = user->id(); - user->setUsername(QString::fromStdString(request->username())); - usersTab.userTable().append(user); - - if (usersTab.nextUserAlreadyLoggedIn()) { - qtProxy_.sendDelayedEvent(newLoginAlreadyLoggedInEvent(userID)); - } - qtProxy_.sendDelayedEvent(newLoginFinishedEvent(userID)); + this->finishLogin(); return Status::OK; } @@ -476,15 +460,7 @@ Status GRPCService::Login2Passwords(ServerContext *, LoginRequest const *request return Status::OK; } - SPUser const user = randomUser(); - QString const userID = user->id(); - user->setUsername(QString::fromStdString(request->username())); - usersTab.userTable().append(user); - - if (usersTab.nextUserAlreadyLoggedIn()) { - qtProxy_.sendDelayedEvent(newLoginAlreadyLoggedInEvent(userID)); - } - qtProxy_.sendDelayedEvent(newLoginFinishedEvent(userID)); + this->finishLogin(); return Status::OK; } @@ -842,3 +818,26 @@ bool GRPCService::sendEvent(SPStreamEvent const &event) { } return isStreaming_; } + + +//**************************************************************************************************************************************************** +// +//**************************************************************************************************************************************************** +void GRPCService::finishLogin() { + UsersTab &usersTab = app().mainWindow().usersTab(); + SPUser user = usersTab.userWithUsername(loginUsername_); + bool const alreadyExist = user.get(); + if (!user) { + user = randomUser(); + user->setUsername(loginUsername_); + usersTab.userTable().append(user); + } else { + if (user->state() == EUserState::State::Connected) { + qtProxy_.sendDelayedEvent(newLoginAlreadyLoggedInEvent(user->id())); + } else { + user->setState(EUserState::State::Connected); + } + } + + qtProxy_.sendDelayedEvent(newLoginFinishedEvent(user->id(), alreadyExist)); +} diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCService.h b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCService.h index 81677a98..79dab196 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCService.h +++ b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCService.h @@ -98,6 +98,9 @@ public: // member functions. bool sendEvent(bridgepp::SPStreamEvent const &event); ///< Queue an event for sending through the event stream. +private: // member functions + void finishLogin(); ///< finish the login procedure once the credentials have been validated. + private: // data member mutable QMutex eventStreamMutex_; ///< Mutex used to access eventQueue_, isStreaming_ and shouldStopStreaming_; QList eventQueue_; ///< The event queue. Acces protected by eventStreamMutex_; diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/UsersTab.cpp b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/UsersTab.cpp index d3e92c6b..0103da0a 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/UsersTab.cpp +++ b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/UsersTab.cpp @@ -71,7 +71,7 @@ void UsersTab::onAddUserButton() { users_.append(user); GRPCService &grpc = app().grpc(); if (grpc.isStreaming()) { - grpc.sendEvent(newLoginFinishedEvent(user->id())); + grpc.sendEvent(newLoginFinishedEvent(user->id(), false)); } } @@ -171,6 +171,16 @@ bridgepp::SPUser UsersTab::userWithID(QString const &userID) { } +//**************************************************************************************************************************************************** +/// \param[in] username The username. +/// \return The user with the given username. +/// \return A null pointer if the user is not in the list. +//**************************************************************************************************************************************************** +bridgepp::SPUser UsersTab::userWithUsername(QString const &username) { + return users_.userWithUsername(username); +} + + //**************************************************************************************************************************************************** /// \return true iff the next login attempt should trigger a username/password error. //**************************************************************************************************************************************************** @@ -235,14 +245,6 @@ bool UsersTab::nextUserTwoPasswordsAbort() const { } -//**************************************************************************************************************************************************** -/// \return true iff the next login attempt should trigger a 2nd password error with abort. -//**************************************************************************************************************************************************** -bool UsersTab::nextUserAlreadyLoggedIn() const { - return ui_.checkAlreadyLoggedIn->isChecked(); -} - - //**************************************************************************************************************************************************** /// \return the message for the username/password error. //**************************************************************************************************************************************************** diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/UsersTab.h b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/UsersTab.h index ab41519d..9e3da91e 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/UsersTab.h +++ b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/UsersTab.h @@ -38,6 +38,7 @@ public: // member functions. UsersTab &operator=(UsersTab &&) = delete; ///< Disabled move assignment operator. UserTable &userTable(); ///< Returns a reference to the user table. bridgepp::SPUser userWithID(QString const &userID); ///< Get the user with the given ID. + bridgepp::SPUser userWithUsername(QString const &username); ///< Get the user with the given username. bool nextUserUsernamePasswordError() const; ///< Check if next user login should trigger a username/password error. bool nextUserFreeUserError() const; ///< Check if next user login should trigger a Free user error. bool nextUserTFARequired() const; ///< Check if next user login should requires 2FA. @@ -46,7 +47,6 @@ public: // member functions. bool nextUserTwoPasswordsRequired() const; ///< Check if next user login requires 2nd password bool nextUserTwoPasswordsError() const; ///< Check if next user login should trigger 2nd password error. bool nextUserTwoPasswordsAbort() const; ///< Check if next user login should trigger 2nd password abort. - bool nextUserAlreadyLoggedIn() const; ///< Check if next user login should report user as already logged in. QString usernamePasswordErrorMessage() const; ///< Return the username password error message. public slots: diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/UsersTab.ui b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/UsersTab.ui index ad4db4ee..e34cf352 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/UsersTab.ui +++ b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/UsersTab.ui @@ -170,13 +170,6 @@ - - - - Already logged in - - - diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/UserDialog.cpp b/internal/frontend/bridge-gui/bridge-gui-tester/UserDialog.cpp index e476602a..5fbd22a1 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/UserDialog.cpp +++ b/internal/frontend/bridge-gui/bridge-gui-tester/UserDialog.cpp @@ -41,7 +41,6 @@ UserDialog::UserDialog(bridgepp::SPUser &user, QWidget *parent) ui_.editAvatarText->setText(user_->avatarText()); this->setState(user->state()); ui_.checkSplitMode->setChecked(user_->splitMode()); - ui_.checkSetupGuideSeen->setChecked(user_->setupGuideSeen()); ui_.spinUsedBytes->setValue(user->usedBytes()); ui_.spinTotalBytes->setValue(user->totalBytes()); } @@ -58,7 +57,6 @@ void UserDialog::onOK() { user_->setAvatarText(ui_.editAvatarText->text()); user_->setState(this->state()); user_->setSplitMode(ui_.checkSplitMode->isChecked()); - user_->setSetupGuideSeen(ui_.checkSetupGuideSeen->isChecked()); user_->setUsedBytes(float(ui_.spinUsedBytes->value())); user_->setTotalBytes(float(ui_.spinTotalBytes->value())); diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/UserDialog.ui b/internal/frontend/bridge-gui/bridge-gui-tester/UserDialog.ui index 02bf5909..5c74d596 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/UserDialog.ui +++ b/internal/frontend/bridge-gui/bridge-gui-tester/UserDialog.ui @@ -6,8 +6,8 @@ 0 0 - 654 - 544 + 634 + 493 @@ -16,54 +16,18 @@ - - + + - Avatar Text + Used Bytes - - + + - - - - true - - - - - - - UserID - - - - - - - - - - - 0 - 100 - - - - - 0 - 150 - - - - true - - - - - + + QAbstractSpinBox::NoButtons @@ -75,10 +39,24 @@ - - + + - Used Bytes + State + + + + + + + UserID + + + + + + + Split Mode @@ -121,8 +99,15 @@ - - + + + + Total Bytes + + + + + QAbstractSpinBox::NoButtons @@ -151,6 +136,38 @@ + + + + + + + + 0 + 100 + + + + + 0 + 150 + + + + true + + + + + + + + + + true + + + @@ -158,34 +175,10 @@ - - + + - Total Bytes - - - - - - - - - - Setup Guide Seen - - - - - - - State - - - - - - - Split Mode + Avatar Text @@ -249,7 +242,6 @@ spinUsedBytes spinTotalBytes checkSplitMode - checkSetupGuideSeen buttonOK buttonCancel diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/UserTable.cpp b/internal/frontend/bridge-gui/bridge-gui-tester/UserTable.cpp index 4c757926..b6ee1261 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/UserTable.cpp +++ b/internal/frontend/bridge-gui/bridge-gui-tester/UserTable.cpp @@ -149,6 +149,20 @@ bridgepp::SPUser UserTable::userWithID(QString const &userID) { } +//**************************************************************************************************************************************************** +/// \param[in] username The username. +/// \return The user with the given username. +/// \return A null pointer if the user is not in the list. +//**************************************************************************************************************************************************** +bridgepp::SPUser UserTable::userWithUsername(QString const &username) { + QList::const_iterator it = std::find_if(users_.constBegin(), users_.constEnd(), [&username](SPUser const &user) -> bool { + return user->username() == username; + }); + + return it == users_.end() ? nullptr : *it; +} + + //**************************************************************************************************************************************************** /// \param[in] userID The userID. /// \return the index of the user. @@ -200,3 +214,4 @@ bool UserTable::isIndexValid(qint32 index) const { QList UserTable::users() const { return users_; } + diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/UserTable.h b/internal/frontend/bridge-gui/bridge-gui-tester/UserTable.h index 26189f77..498d3a87 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/UserTable.h +++ b/internal/frontend/bridge-gui/bridge-gui-tester/UserTable.h @@ -40,6 +40,7 @@ public: // member functions. void append(bridgepp::SPUser const &user); ///< Append a user. bridgepp::SPUser userAtIndex(qint32 index); ///< Return the user at the given index. bridgepp::SPUser userWithID(QString const &userID); ///< Return the user with a given id. + bridgepp::SPUser userWithUsername(QString const &username); ///< Return the user with a given username. qint32 indexOfUser(QString const &userID); ///< Return the index of a given User. void touch(qint32 index); ///< touch the user at a given index (indicates it has been modified). void remove(qint32 index); ///< Remove the user at a given index. diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/EventFactory.h b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/EventFactory.h index dcf5cf5b..12c17786 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/EventFactory.h +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/EventFactory.h @@ -40,7 +40,7 @@ SPStreamEvent newShowMainWindowEvent(); ///< Create a new ShowMainWindowEvent ev SPStreamEvent newLoginError(grpc::LoginErrorType error, QString const &message); ///< Create a new LoginError event. SPStreamEvent newLoginTfaRequestedEvent(QString const &username); ///< Create a new LoginTfaRequestedEvent event. SPStreamEvent newLoginTwoPasswordsRequestedEvent(); ///< Create a new LoginTwoPasswordsRequestedEvent event. -SPStreamEvent newLoginFinishedEvent(QString const &userID); ///< Create a new LoginFinishedEvent event. +SPStreamEvent newLoginFinishedEvent(QString const &userID, bool wasSignedOut); ///< Create a new LoginFinishedEvent event. SPStreamEvent newLoginAlreadyLoggedInEvent(QString const &userID); ///< Create a new LoginAlreadyLoggedInEvent event. // Update related events