diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2c6f650..268446d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -153,7 +153,7 @@ set(backend_SRC dbusifs/upowerhelper.cpp dbusifs/enginedevice.cpp dbusifs/device.cpp - dbusifs/accountservicehelper.cpp + dbusifs/accountshelper.cpp dbusifs/sessionhelper.cpp dbusifs/uniauthservice.cpp dbusifs/biometrichelper.cpp diff --git a/src/common/definetypes.h b/src/common/definetypes.h index a04bf8e..cc08b1f 100644 --- a/src/common/definetypes.h +++ b/src/common/definetypes.h @@ -203,6 +203,7 @@ enum SessionStatus #define DM_DBUS_PATH "/org/freedesktop/DisplayManager" #define DM_DBUS_INTERFACE "org.freedesktop.DisplayManager" #define DM_SEAT_INTERFACE "org.freedesktop.DisplayManager.Seat" +#define DM_SESSION_INTERFACE "org.freedesktop.DisplayManager.Session" #define SSWND_DBUS_SERVICE "org.ukui.ScreenSaverWnd" #define SSWND_DBUS_PATH "/" @@ -310,5 +311,13 @@ typedef enum { #define FD_DBUS_SERVICE "org.freedesktop.DBus" #define FD_DBUS_PATH "/org/freedesktop/DBus" #define FD_DBUS_INTERFACE "org.freedesktop.DBus" +#define FD_PROPERTIES_INTERFACE "org.freedesktop.DBus.Properties" + +#define ACCOUNTS_DBUS_SERVICE "org.freedesktop.Accounts" +#define ACCOUNTS_DBUS_PATH "/org/freedesktop/Accounts" +#define ACCOUNTS_DBUS_INTERFACE "org.freedesktop.Accounts" + +#define ACCOUNTS_USER_DBUS_INTERFACE "org.freedesktop.Accounts.User" +#define ACCOUNTS_USER_LDM_SERVICE_INTERFACE "org.freedesktop.DisplayManager.AccountsService" #endif // DEFINETYPES_H diff --git a/src/dbusifs/accountservicehelper.cpp b/src/dbusifs/accountshelper.cpp similarity index 56% rename from src/dbusifs/accountservicehelper.cpp rename to src/dbusifs/accountshelper.cpp index a7c426d..f6462e4 100644 --- a/src/dbusifs/accountservicehelper.cpp +++ b/src/dbusifs/accountshelper.cpp @@ -15,34 +15,27 @@ * along with this program; if not, see . * **/ -#include "accountservicehelper.h" +#include "accountshelper.h" +#include "definetypes.h" #include #include #include #include +#include "userinfo.h" -const static QString accountsService = QStringLiteral("org.freedesktop.Accounts"); -const static QString accountsPath = QStringLiteral("/org/freedesktop/Accounts"); -const static QString accountsInterface = QStringLiteral("org.freedesktop.Accounts"); -const static QString propertiesInterface = QStringLiteral("org.freedesktop.DBus.Properties"); -const static QString accountsUserInterface = QStringLiteral("org.freedesktop.Accounts.User"); - -AccountServiceHelper::AccountServiceHelper(QObject *parent) +AccountsHelper::AccountsHelper(QObject *parent) : QObject(parent) { - m_accountsInterface = new QDBusInterface(accountsService, - accountsPath, - accountsInterface, - QDBusConnection::systemBus(), - this); + initData(); + initConnections(); } -AccountServiceHelper::~AccountServiceHelper() +AccountsHelper::~AccountsHelper() { } -QString AccountServiceHelper::getUserLanguageByName(QString strUserName) +QString AccountsHelper::getUserLanguageByName(QString strUserName) { QString strLanguage = ""; if(!m_accountsInterface) @@ -51,9 +44,9 @@ QString AccountServiceHelper::getUserLanguageByName(QString strUserName) if(!userPath.isValid()) qWarning() << "Get UserPath error:" << userPath.error(); else { - QDBusInterface userIface(accountsService, userPath.value().path(), - propertiesInterface, QDBusConnection::systemBus()); - QDBusReply languageReply = userIface.call("Get", accountsUserInterface, "Language"); + QDBusInterface userIface(ACCOUNTS_DBUS_SERVICE, userPath.value().path(), + FD_PROPERTIES_INTERFACE, QDBusConnection::systemBus()); + QDBusReply languageReply = userIface.call("Get", ACCOUNTS_USER_DBUS_INTERFACE, "Language"); if(!languageReply.isValid()) qWarning() << "Get User's language error" << languageReply.error(); else { @@ -63,7 +56,7 @@ QString AccountServiceHelper::getUserLanguageByName(QString strUserName) return strLanguage; } -QString AccountServiceHelper::getUserBackgroundByName(QString strUserName) +QString AccountsHelper::getUserBackgroundByName(QString strUserName) { QString strBackground = ""; if(!m_accountsInterface) @@ -72,9 +65,9 @@ QString AccountServiceHelper::getUserBackgroundByName(QString strUserName) if(!userPath.isValid()) qWarning() << "Get UserPath error:" << userPath.error(); else { - QDBusInterface userIface(accountsService, userPath.value().path(), - propertiesInterface, QDBusConnection::systemBus()); - QDBusReply backgroundReply = userIface.call("Get", accountsUserInterface, "BackgroundFile"); + QDBusInterface userIface(ACCOUNTS_DBUS_SERVICE, userPath.value().path(), + FD_PROPERTIES_INTERFACE, QDBusConnection::systemBus()); + QDBusReply backgroundReply = userIface.call("Get", ACCOUNTS_USER_DBUS_INTERFACE, "BackgroundFile"); if(!backgroundReply.isValid()) qWarning() << "Get User's background error" << backgroundReply.error(); else { @@ -84,7 +77,7 @@ QString AccountServiceHelper::getUserBackgroundByName(QString strUserName) return strBackground; } -QString AccountServiceHelper::getUserSessionByName(QString strUserName) +QString AccountsHelper::getUserSessionByName(QString strUserName) { QString strSession = ""; if(!m_accountsInterface) @@ -93,9 +86,9 @@ QString AccountServiceHelper::getUserSessionByName(QString strUserName) if(!userPath.isValid()) qWarning() << "Get UserPath error:" << userPath.error(); else { - QDBusInterface userIface(accountsService, userPath.value().path(), - propertiesInterface, QDBusConnection::systemBus()); - QDBusReply sessionReply = userIface.call("Get", accountsUserInterface, "XSession"); + QDBusInterface userIface(ACCOUNTS_DBUS_SERVICE, userPath.value().path(), + FD_PROPERTIES_INTERFACE, QDBusConnection::systemBus()); + QDBusReply sessionReply = userIface.call("Get", ACCOUNTS_USER_DBUS_INTERFACE, "XSession"); if(!sessionReply.isValid()) qWarning() << "Get User's xsession error" << sessionReply.error(); else { @@ -105,7 +98,7 @@ QString AccountServiceHelper::getUserSessionByName(QString strUserName) return strSession; } -QString AccountServiceHelper::getAccountBackground(uid_t uid) +QString AccountsHelper::getAccountBackground(uid_t uid) { QString strBackground = ""; if(!m_accountsInterface) @@ -114,9 +107,9 @@ QString AccountServiceHelper::getAccountBackground(uid_t uid) if(!userPath.isValid()) qWarning() << "Get UserPath error:" << userPath.error(); else { - QDBusInterface userIface(accountsService, userPath.value().path(), - propertiesInterface, QDBusConnection::systemBus()); - QDBusReply backgroundReply = userIface.call("Get", accountsUserInterface, "BackgroundFile"); + QDBusInterface userIface(ACCOUNTS_DBUS_SERVICE, userPath.value().path(), + FD_PROPERTIES_INTERFACE, QDBusConnection::systemBus()); + QDBusReply backgroundReply = userIface.call("Get", ACCOUNTS_USER_DBUS_INTERFACE, "BackgroundFile"); if(!backgroundReply.isValid()) qWarning() << "Get User's BackgroundFile error" << backgroundReply.error(); else { @@ -125,3 +118,39 @@ QString AccountServiceHelper::getAccountBackground(uid_t uid) } return strBackground; } + +void AccountsHelper::initData() +{ + if (!m_accountsInterface) { + m_accountsInterface = new QDBusInterface(ACCOUNTS_DBUS_SERVICE, + ACCOUNTS_DBUS_PATH, + ACCOUNTS_DBUS_INTERFACE, + QDBusConnection::systemBus(), + this); + } +} + +void AccountsHelper::initConnections() +{ + connect(m_accountsInterface, SIGNAL(UserAdded(QDBusObjectPath)), this, SIGNAL(UserAdded(QDBusObjectPath))); + connect(m_accountsInterface, SIGNAL(UserDeleted(QDBusObjectPath)), this, SIGNAL(UserRemoved(QDBusObjectPath))); +} + +QStringList AccountsHelper::getUserList() +{ + QStringList listUsers; + if (!m_accountsInterface) + return listUsers; + QDBusMessage ret = m_accountsInterface->call("ListCachedUsers"); + QList outArgs = ret.arguments(); + QVariant first = outArgs.at(0); + const QDBusArgument &dbusArgs = first.value(); + QDBusObjectPath path; + dbusArgs.beginArray(); + while (!dbusArgs.atEnd()) { + dbusArgs >> path; + listUsers << path.path(); + } + dbusArgs.endArray(); + return listUsers; +} diff --git a/src/dbusifs/accountservicehelper.h b/src/dbusifs/accountshelper.h similarity index 75% rename from src/dbusifs/accountservicehelper.h rename to src/dbusifs/accountshelper.h index 74fb23b..daae4e0 100644 --- a/src/dbusifs/accountservicehelper.h +++ b/src/dbusifs/accountshelper.h @@ -20,14 +20,16 @@ #include #include +#include +#include -class AccountServiceHelper : public QObject +class AccountsHelper : public QObject { Q_OBJECT public: - explicit AccountServiceHelper(QObject *parent = nullptr); + explicit AccountsHelper(QObject *parent = nullptr); - virtual ~AccountServiceHelper(); + virtual ~AccountsHelper(); QString getUserLanguageByName(QString strUserName); @@ -37,6 +39,16 @@ public: QString getAccountBackground(uid_t uid); + QStringList getUserList(); + +Q_SIGNALS: + void UserAdded(const QDBusObjectPath &path); + void UserRemoved(const QDBusObjectPath &path); + +private: + void initData(); + void initConnections(); + private: QDBusInterface *m_accountsInterface = nullptr; }; diff --git a/src/lock-backend/dbusupperinterface.cpp b/src/lock-backend/dbusupperinterface.cpp index f081ea9..6443d72 100644 --- a/src/lock-backend/dbusupperinterface.cpp +++ b/src/lock-backend/dbusupperinterface.cpp @@ -33,7 +33,7 @@ #include "switchuserutils.h" #include "pamauthenticate.h" #include "upowerhelper.h" -#include "accountservicehelper.h" +#include "accountshelper.h" #include "sessionhelper.h" #include "sessionwatcher.h" #include "freedesktophelper.h" @@ -56,7 +56,7 @@ void DbusUpperInterface::initData() { m_bLockState = false; m_bSlpState = false; - m_accountsHelper = new AccountServiceHelper(this); + m_accountsHelper = new AccountsHelper(this); m_lightDmHelper = new LightDMHelper(m_accountsHelper, this); m_login1Helper = new Login1Helper(this); m_config = new Configuration(this); diff --git a/src/lock-backend/dbusupperinterface.h b/src/lock-backend/dbusupperinterface.h index 892f9db..42c046b 100644 --- a/src/lock-backend/dbusupperinterface.h +++ b/src/lock-backend/dbusupperinterface.h @@ -37,7 +37,7 @@ class QJsonObject; class PamAuthenticate; class UsdHelper; class UpowerHelper; -class AccountServiceHelper; +class AccountsHelper; class SessionHelper; class SessionWatcher; class BioAuthenticate; @@ -381,7 +381,7 @@ private: PamAuthenticate *m_pamAuth = nullptr; UsdHelper *m_usdHelper = nullptr; UpowerHelper *m_upowerHelper = nullptr; - AccountServiceHelper *m_accountsHelper = nullptr; + AccountsHelper *m_accountsHelper = nullptr; bool lockState = false; SessionHelper *m_sessionHelper = nullptr; SessionWatcher *m_sessionWatcher = nullptr; diff --git a/src/lock-backend/lightdmhelper.cpp b/src/lock-backend/lightdmhelper.cpp index fa1544d..ea2298e 100644 --- a/src/lock-backend/lightdmhelper.cpp +++ b/src/lock-backend/lightdmhelper.cpp @@ -22,14 +22,21 @@ #include "securityuser.h" #include #include "proxymodel.h" -#include "accountservicehelper.h" +#include "accountshelper.h" +#include "definetypes.h" +#include +#include +#include -LightDMHelper::LightDMHelper(AccountServiceHelper *accountHelper, QObject *parent) +LightDMHelper::LightDMHelper(AccountsHelper *accountHelper, QObject *parent) : QLightDM::Greeter(parent) , m_sessionsModel(nullptr) , m_secUser(SecurityUser::instance()) , m_strCurUserName("") , m_accountServiceHelper(accountHelper) + , m_ldmSessions(new QMap>()) + , m_mapUsers(new QMap()) + , m_dbusIfsLDM(nullptr) { //连接到lightdm if(!connectToDaemonSync()){ @@ -46,11 +53,10 @@ void LightDMHelper::initData() updateSessionsInfo(); setSession(defaultSessionHint()); // 获取用户信息 + initLDMSessionsInfo(); m_isShowManualLogin = showManualLoginHint(); if(!hideUsersHint()){ - m_modelUsers = new UsersModel(this); - m_modelUsers->setSourceModel(new QLightDM::UsersModel(this)); - connect(m_modelUsers, &UsersModel::userInfoChanged, this, &LightDMHelper::onUsersChanged); + initAccountsUsersInfo(); if(hasValidUsers() == 0) { m_isShowManualLogin = true; } @@ -127,7 +133,7 @@ bool LightDMHelper::setCurrentUser(QString strUserName) UserInfoPtr LightDMHelper::findUserByUid(uid_t id) { - for (auto userInfoPtr : m_listUsers) { + for (auto userInfoPtr : m_mapUsers->values()) { if (userInfoPtr->uid() == id) { return userInfoPtr; } @@ -137,7 +143,7 @@ UserInfoPtr LightDMHelper::findUserByUid(uid_t id) UserInfoPtr LightDMHelper::findUserByName(QString strName) { - for (auto userInfoPtr : m_listUsers) { + for (auto userInfoPtr : m_mapUsers->values()) { if (userInfoPtr->name() == strName) { return userInfoPtr; } @@ -147,7 +153,7 @@ UserInfoPtr LightDMHelper::findUserByName(QString strName) bool LightDMHelper::hasSameUser(const UserInfoPtr userInfoPtr) { - for (auto user : m_listUsers) { + for (auto user : m_mapUsers->values()) { if (user->uid() == userInfoPtr->uid() && user->name() == userInfoPtr->name()) { return true; @@ -158,12 +164,9 @@ bool LightDMHelper::hasSameUser(const UserInfoPtr userInfoPtr) bool LightDMHelper::hasValidUsers() { - if (!m_modelUsers) - return false; int count = 0; - for(int i = 0; i < m_modelUsers->rowCount(QModelIndex()); i++){ - QString name = m_modelUsers->index(i).data(QLightDM::UsersModel::NameRole).toString(); - if(m_secUser->isSecrityUser(name)) + for (auto user : m_mapUsers->values()) { + if(m_secUser->isSecrityUser(user->name())) count++; } return (bool)(count>0); @@ -182,58 +185,18 @@ bool LightDMHelper::isSameUser(UserInfoPtr userA, UserInfoPtr userB) void LightDMHelper::onUsersChanged() { - if (!m_modelUsers) - return ; updateUsersInfo(); Q_EMIT usersInfoChanged(); } void LightDMHelper::updateUsersInfo() { - m_listUsers.clear(); - if (m_modelUsers) { - for(int i = 0; i < m_modelUsers->rowCount(QModelIndex()); i++){ - QString name = m_modelUsers->index(i).data(QLightDM::UsersModel::NameRole).toString(); - if(m_secUser->isSecrityUser(name)) { - std::shared_ptr userInfoPtr = std::make_shared(); - userInfoPtr->updateName(name); - uid_t uid = m_modelUsers->index(i).data(QLightDM::UsersModel::UidRole).toUInt(); - userInfoPtr->updateUid(uid); - QString strRealName = m_modelUsers->index(i).data(QLightDM::UsersModel::RealNameRole).toString(); - if (strRealName.isEmpty()) { - strRealName = name; - } - userInfoPtr->updateFullName(strRealName); - QString strBackGround = m_modelUsers->index(i).data(QLightDM::UsersModel::BackgroundPathRole).toString(); - if (!strBackGround.isEmpty() && QFileInfo(strBackGround).exists()){ - userInfoPtr->updateBackground(strBackGround); - } else { - if (m_accountServiceHelper) { - strBackGround = m_accountServiceHelper->getAccountBackground(uid); - if (!strBackGround.isEmpty() && QFileInfo(strBackGround).exists()){ - userInfoPtr->updateBackground(strBackGround); - } - } - } - QString strImgHead = m_modelUsers->index(i).data(QLightDM::UsersModel::ImagePathRole).toString(); - if (!strImgHead.isEmpty() && QFileInfo(strImgHead).exists()){ - userInfoPtr->updateHeadImage(strImgHead); - } - - bool isLoggedIn = m_modelUsers->index(i).data(QLightDM::UsersModel::LoggedInRole).toBool(); - userInfoPtr->updateLoggedIn(isLoggedIn); - - if (m_accountServiceHelper) { - QString strLang = m_accountServiceHelper->getUserLanguageByName(name); - if (!strLang.isEmpty()){ - userInfoPtr->updateLang(strLang); - } - } - - if (!hasSameUser(userInfoPtr)) { - m_listUsers.append(userInfoPtr); - } - } + QList userInfos = m_mapUsers->values(); + for (auto user : userInfos) { + if (isUserLoggined(user->name())) { + user->updateLoggedIn(true); + } else { + user->updateLoggedIn(false); } } if (m_isShowManualLogin) { @@ -241,7 +204,8 @@ void LightDMHelper::updateUsersInfo() userInfoPtr->updateFullName(tr("Login")); userInfoPtr->updateName("*login"); if (!hasSameUser(userInfoPtr)) { - m_listUsers.append(userInfoPtr); + const QString path = userInfoPtr->path().isEmpty() ? userInfoPtr->name() : userInfoPtr->path(); + m_mapUsers->insert(path, userInfoPtr); } } if (hasGuestAccountHint()) { @@ -249,7 +213,8 @@ void LightDMHelper::updateUsersInfo() userInfoPtr->updateFullName(tr("Guest")); userInfoPtr->updateName("*guest"); if (!hasSameUser(userInfoPtr)) { - m_listUsers.append(userInfoPtr); + const QString path = userInfoPtr->path().isEmpty() ? userInfoPtr->name() : userInfoPtr->path(); + m_mapUsers->insert(path, userInfoPtr); } } } @@ -268,5 +233,199 @@ void LightDMHelper::updateSessionsInfo() QList LightDMHelper::getUsersInfo() { - return m_listUsers; + return m_mapUsers->values(); +} + +bool LightDMHelper::isUserLoggined(const QString &strUserName) +{ + QList> sessionList = m_ldmSessions->values(); + auto it = std::find_if(sessionList.begin(), sessionList.end(), [strUserName](std::shared_ptr &session) { + return session->userName() == strUserName; + }); + if (it != sessionList.end()) { + return true; + } + return false; +} + +void LightDMHelper::initLDMSessionsInfo() +{ + if (!m_dbusIfsLDM) { + m_dbusIfsLDM = new QDBusInterface(DM_DBUS_SERVICE, DM_DBUS_PATH, DM_DBUS_INTERFACE, QDBusConnection::systemBus(), this); + connect(m_dbusIfsLDM, SIGNAL(SessionAdded(QDBusObjectPath)), this, SLOT(onLDMSessionAdded(QDBusObjectPath))); + connect(m_dbusIfsLDM, SIGNAL(SessionRemoved(QDBusObjectPath)), this, SLOT(onLDMSessionRemoved(QDBusObjectPath))); + + QStringList listSessions; + QDBusInterface ifLDMProp(DM_DBUS_SERVICE, DM_DBUS_PATH, FD_PROPERTIES_INTERFACE, QDBusConnection::systemBus()); + QDBusMessage ret = ifLDMProp.call("GetAll", DM_DBUS_INTERFACE); + QList outArgs = ret.arguments(); + QVariant first = outArgs.at(0); + const QDBusArgument &dbusArgs = first.value(); + dbusArgs.beginMap(); + while(!dbusArgs.atEnd()) { + QString key; + QVariant value; + dbusArgs.beginMapEntry(); + dbusArgs >> key >> value; + if (key == "Sessions") { + const QDBusArgument &dbusObjPaths = value.value(); + QDBusObjectPath path; + dbusObjPaths.beginArray(); + while (!dbusObjPaths.atEnd()) { + dbusObjPaths >> path; + listSessions << path.path(); + } + dbusObjPaths.endArray(); + } + dbusArgs.endMapEntry(); + } + dbusArgs.endMap(); + for (auto session : listSessions) { + std::shared_ptr ldmSessionInfo(new LightDMSessionInfo(session, this)); + m_ldmSessions->insert(session, ldmSessionInfo); + } + } +} + +void LightDMHelper::onLDMSessionAdded(QDBusObjectPath objPath) +{ + qDebug()<< "Add LDM Session, path:"<contains(objPath.path())) { + return; + } + std::shared_ptr ldmSessionInfo(new LightDMSessionInfo(objPath.path(), this)); + m_ldmSessions->insert(objPath.path(), ldmSessionInfo); + onUsersChanged(); +} + +void LightDMHelper::onLDMSessionRemoved(QDBusObjectPath objPath) +{ + if (!m_ldmSessions->contains(objPath.path())) { + return; + } + const std::shared_ptr session = m_ldmSessions->value(objPath.path()); + m_ldmSessions->remove(objPath.path()); + onUsersChanged(); +} + +void LightDMHelper::initAccountsUsersInfo() +{ + if (m_accountServiceHelper) { + QStringList listUsers = m_accountServiceHelper->getUserList(); + for (auto user : listUsers) { + LocalUserInfoPtr userInfo(new LocalUserInfo(user, this)); + connect(userInfo.get(), &UserInfo::userPropChanged, this, &LightDMHelper::onUsersChanged); + m_mapUsers->insert(user, userInfo); + } + } +} + +void LightDMHelper::onUserAdded(QDBusObjectPath objPath) +{ + qDebug()<< "Add Accounts User, path:"<contains(objPath.path())) { + return; + } + LocalUserInfoPtr userInfo(new LocalUserInfo(objPath.path(), this)); + connect(userInfo.get(), &UserInfo::userPropChanged, this, &LightDMHelper::onUsersChanged); + m_mapUsers->insert(objPath.path(), userInfo); + onUsersChanged(); +} + +void LightDMHelper::onUserRemoved(QDBusObjectPath objPath) +{ + if (!m_mapUsers->contains(objPath.path())) { + return; + } + const UserInfoPtr userInfo = m_mapUsers->value(objPath.path()); + qDebug()<< "Remove Accounts User, name:"<name(); + m_mapUsers->remove(objPath.path()); + onUsersChanged(); +} + +LightDMSessionInfo::LightDMSessionInfo(const QString &strPath, QObject* parent) + : QObject(parent) + , m_strPath(strPath) +{ + initData(); + initConnections(); +} + +LightDMSessionInfo::~LightDMSessionInfo() +{ + if (m_propertiesChangedConnected) { + QDBusConnection::systemBus().disconnect(DM_DBUS_SERVICE, + m_strPath, + FD_PROPERTIES_INTERFACE, + "PropertiesChanged", + this, + SLOT(onPropertiesChanged(QString, QVariantMap, QStringList))); + m_propertiesChangedConnected = false; + } +} + +void LightDMSessionInfo::initData() +{ + QDBusInterface ifaceExtra(DM_DBUS_SERVICE, m_strPath, FD_PROPERTIES_INTERFACE, QDBusConnection::systemBus()); + QDBusMessage ret = ifaceExtra.call("GetAll", DM_SESSION_INTERFACE); + QList outArgs = ret.arguments(); + QVariant first = outArgs.at(0); + const QDBusArgument &dbusArgs = first.value(); + dbusArgs.beginMap(); + while(!dbusArgs.atEnd()) { + QString key; + QVariant value; + dbusArgs.beginMapEntry(); + dbusArgs >> key >> value; + if (key == "Seat") { + m_strSeatPath = value.toString(); + } else if (key == "UserName") { + m_strUserName = value.toString(); + } + dbusArgs.endMapEntry(); + } + dbusArgs.endMap(); +} + +void LightDMSessionInfo::initConnections() +{ + if (!m_propertiesChangedConnected) { + QDBusConnection::systemBus().connect(DM_DBUS_SERVICE, + m_strPath, + FD_PROPERTIES_INTERFACE, + "PropertiesChanged", + this, + SLOT(onPropertiesChanged(QString, QVariantMap, QStringList))); + m_propertiesChangedConnected = true; + } +} + +void LightDMSessionInfo::onPropertiesChanged(const QString& interfaceName, + const QVariantMap& changedProperties, + const QStringList& invalidatedProperties) +{ + Q_UNUSED(invalidatedProperties); + if (interfaceName == DM_SESSION_INTERFACE) { + QVariantMap::const_iterator itVar = changedProperties.constBegin(); + for ( ; itVar != changedProperties.constEnd(); itVar++) { + QVariant varValue = itVar.value(); + if(itVar.key() == "Seat") { + m_strSeatPath = varValue.toString(); + } else if(itVar.key() == "UserName") { + m_strUserName = varValue.toString(); + } + } + } +} + +QDebug operator <<(QDebug stream, const LightDMSessionInfo &sessionInfo) +{ + stream << "[" + << sessionInfo.path() + << sessionInfo.userName() + << sessionInfo.seatPath() + << "]"; + return stream; } diff --git a/src/lock-backend/lightdmhelper.h b/src/lock-backend/lightdmhelper.h index 54829fd..8fc5053 100644 --- a/src/lock-backend/lightdmhelper.h +++ b/src/lock-backend/lightdmhelper.h @@ -24,11 +24,13 @@ #include #include #include +#include #include "userinfo.h" class SecurityUser; class UsersModel; -class AccountServiceHelper; +class AccountsHelper; +class LightDMSessionInfo; /** * @brief lightdm工具类 * @@ -42,7 +44,7 @@ public: * * @param parent 父指针 */ - explicit LightDMHelper(AccountServiceHelper *accountHelper, QObject *parent = nullptr); + explicit LightDMHelper(AccountsHelper *accountHelper, QObject *parent = nullptr); public: /** @@ -103,6 +105,14 @@ public Q_SLOTS: */ void onUsersChanged(); + void onLDMSessionAdded(QDBusObjectPath objPath); + + void onLDMSessionRemoved(QDBusObjectPath objPath); + + void onUserAdded(QDBusObjectPath objPath); + + void onUserRemoved(QDBusObjectPath objPath); + Q_SIGNALS: /** * @brief 认证成功 @@ -153,16 +163,51 @@ private: void updateSessionsInfo(); + void initLDMSessionsInfo(); + + bool isUserLoggined(const QString &strUserName); + + void initAccountsUsersInfo(); + private: bool m_isShowManualLogin; /**< 是否显示手动登录 */ QString m_strSession; /**< 当前会话 */ QString m_strCurUserName; /**< 当前选择用户 */ - QList m_listUsers; /**< 用户信息列表 */ SecurityUser *m_secUser = nullptr; /**< 安全用户信息指针 */ QLightDM::SessionsModel *m_sessionsModel; /**< lightdm 会话数据指针 */ QList m_listSessions; /**< 会话列表 */ - UsersModel *m_modelUsers = nullptr; /**< lightdm 用户数据指针 */ - AccountServiceHelper *m_accountServiceHelper = nullptr; + QMap *m_mapUsers; /**< accounts 用户信息列表指针 */ + AccountsHelper *m_accountServiceHelper = nullptr; + QMap> *m_ldmSessions; + QDBusInterface *m_dbusIfsLDM; }; +class LightDMSessionInfo : public QObject +{ + Q_OBJECT +public: + explicit LightDMSessionInfo(const QString &strPath, QObject* parent = nullptr); + + virtual ~LightDMSessionInfo(); + + inline QString path() const { return m_strPath; } + inline QString userName() const { return m_strUserName; } + inline QString seatPath() const { return m_strSeatPath; } + +private: + void initData(); + void initConnections(); + +private Q_SLOTS: + void onPropertiesChanged(const QString&, const QVariantMap&, const QStringList&); + +private: + QString m_strPath; + bool m_propertiesChangedConnected = false; + QString m_strSeatPath; + QString m_strUserName; +}; + +QDebug operator <<(QDebug stream, const LightDMSessionInfo &userInfo); + #endif // LIGHTDMHELPER_H diff --git a/src/userinfo.cpp b/src/userinfo.cpp index be2e55f..f566bf2 100644 --- a/src/userinfo.cpp +++ b/src/userinfo.cpp @@ -17,9 +17,16 @@ **/ #include "userinfo.h" #include "global_utils.h" +#include "definetypes.h" +#include +#include +#include +#include +#include -UserInfo::UserInfo() - : m_isLoggedIn(false) +UserInfo::UserInfo(QObject *parent) + : QObject(parent) + , m_isLoggedIn(false) , m_uId(-1) , m_strBackground(DEFAULT_BACKGROUND_PATH) , m_strLang(qgetenv("LANG")) @@ -29,7 +36,8 @@ UserInfo::UserInfo() } UserInfo::UserInfo(const UserInfo &userInfo) - : m_isLoggedIn(userInfo.m_isLoggedIn) + : QObject(userInfo.parent()) + , m_isLoggedIn(userInfo.m_isLoggedIn) , m_uId(userInfo.m_uId) , m_strHeadImage(userInfo.m_strHeadImage) , m_strFullName(userInfo.m_strFullName) @@ -50,23 +58,13 @@ bool UserInfo::operator==(const UserInfo &userInfo) const return userInfo.uid() == m_uId && userInfo.name() == m_strName; } -UserInfo& UserInfo::operator=(const UserInfo &userInfo) -{ - if (this == &userInfo) return *this; - - updateLoggedIn(userInfo.isLoggedIn()); - updateUid(userInfo.uid()); - updateHeadImage(userInfo.headImage()); - updateFullName(userInfo.fullName()); - updateBackground(userInfo.backGround()); - updateLang(userInfo.lang()); - updateName(userInfo.name()); - return *this; -} - void UserInfo::updateLoggedIn(const bool &isLoggedIn) { + if (isLoggedIn == m_isLoggedIn) { + return ; + } m_isLoggedIn = isLoggedIn; + Q_EMIT userPropChanged(m_strName); } void UserInfo::updateUid(const uid_t &id) @@ -112,3 +110,174 @@ QDebug operator <<(QDebug stream, const UserInfo &userInfo) << "]"; return stream; } + + +LocalUserInfo::LocalUserInfo(const uid_t &uId, QObject* parent) + : UserInfo(parent) + , m_strPath("/org/freedesktop/Accounts/User" + QString::number(uId)) +{ + initData(); + initConnections(); +} + +LocalUserInfo::LocalUserInfo(const QString &strPath, QObject* parent) + : UserInfo(parent) + , m_strPath(strPath) +{ + initData(); + initConnections(); +} + +LocalUserInfo::LocalUserInfo(const LocalUserInfo &localUser) + : UserInfo(localUser) + , m_strPath(localUser.path()) +{ + if (m_strPath.isEmpty()) { + m_strPath = QString("/org/freedesktop/Accounts/User" + QString::number(localUser.uid())); + } + initConnections(); +} + +LocalUserInfo::~LocalUserInfo() +{ + if (m_propertiesChangedConnected) { + QDBusConnection::systemBus().disconnect(ACCOUNTS_DBUS_SERVICE, + m_strPath, + FD_PROPERTIES_INTERFACE, + "PropertiesChanged", + this, + SLOT(onPropertiesChanged(QString, QVariantMap, QStringList))); + m_propertiesChangedConnected = false; + } +} + +void LocalUserInfo::initData() +{ + QDBusInterface ifaceExtra(ACCOUNTS_DBUS_SERVICE, m_strPath, FD_PROPERTIES_INTERFACE, QDBusConnection::systemBus()); + QDBusMessage ret = ifaceExtra.call("GetAll", ACCOUNTS_USER_LDM_SERVICE_INTERFACE); + QList outArgs = ret.arguments(); + QVariant first = outArgs.at(0); + const QDBusArgument &dbusArgsExtra = first.value(); + dbusArgsExtra.beginMap(); + while(!dbusArgsExtra.atEnd()) { + QString key; + QVariant value; + dbusArgsExtra.beginMapEntry(); + dbusArgsExtra >> key >> value; + if(key == "BackgroundFile") { + QString strBackground = value.toString(); + if(strBackground.isEmpty() || !QFile(strBackground).exists() || !QFile(strBackground).size()) { + m_strBackground = DEFAULT_BACKGROUND_PATH; + } else { + m_strBackground = strBackground; + } + } + dbusArgsExtra.endMapEntry(); + } + dbusArgsExtra.endMap(); + + QDBusInterface iface(ACCOUNTS_DBUS_SERVICE, m_strPath, FD_PROPERTIES_INTERFACE, QDBusConnection::systemBus()); + ret = iface.call("GetAll", ACCOUNTS_USER_DBUS_INTERFACE); + outArgs = ret.arguments(); + first = outArgs.at(0); + const QDBusArgument &dbusArgs = first.value(); + dbusArgs.beginMap(); + while(!dbusArgs.atEnd()) { + QString key; + QVariant value; + dbusArgs.beginMapEntry(); + dbusArgs >> key >> value; + if(key == "UserName") { + m_strName = value.toString(); + } else if(key == "RealName") { + m_strFullName = value.toString(); + } else if(key == "IconFile") { + QString strHeadImage = value.toString(); + if(strHeadImage.isEmpty() || !QFile(strHeadImage).exists() || !QFile(strHeadImage).size()) { + m_strHeadImage = getDefaultFace(); + } else { + m_strHeadImage = strHeadImage; + } + } else if(key == "Uid") { + m_uId = value.toUInt(); + } else if(key == "Language") { + m_strLang = value.toString(); + } else if (key == "BackgroundFile") { + QString strBackground = value.toString(); + if(!strBackground.isEmpty() && QFile(strBackground).exists() && QFile(strBackground).size()) { + m_strBackground = strBackground; + } + } + dbusArgs.endMapEntry(); + } + dbusArgs.endMap(); + if(m_strFullName.isEmpty()) { + m_strFullName = m_strName; + } +} + +void LocalUserInfo::initConnections() +{ + if (!m_propertiesChangedConnected) { + QDBusConnection::systemBus().connect(ACCOUNTS_DBUS_SERVICE, + m_strPath, + FD_PROPERTIES_INTERFACE, + "PropertiesChanged", + this, + SLOT(onPropertiesChanged(QString, QVariantMap, QStringList))); + m_propertiesChangedConnected = true; + } +} + +void LocalUserInfo::onPropertiesChanged(const QString& interfaceName, + const QVariantMap& changedProperties, + const QStringList& invalidatedProperties) +{ + Q_UNUSED(invalidatedProperties); + if (interfaceName == ACCOUNTS_USER_DBUS_INTERFACE) { + QVariantMap::const_iterator itVar = changedProperties.constBegin(); + for ( ; itVar != changedProperties.constEnd(); itVar++) { + QVariant varValue = itVar.value(); + if(itVar.key() == "UserName") { + m_strName = varValue.toString(); + } else if(itVar.key() == "RealName") { + m_strFullName = varValue.toString(); + } else if(itVar.key() == "IconFile") { + QString strHeadImage = varValue.toString(); + if(strHeadImage.isEmpty() || !QFile(strHeadImage).exists() || !QFile(strHeadImage).size()) { + m_strHeadImage = getDefaultFace(); + } else { + m_strHeadImage = strHeadImage; + } + } else if(itVar.key() == "Uid") { + m_uId = varValue.toUInt(); + } else if(itVar.key() == "Language") { + m_strLang = varValue.toString(); + } else if (itVar.key() == "BackgroundFile") { + QString strBackground = varValue.toString(); + if(!strBackground.isEmpty() && QFile(strBackground).exists() && QFile(strBackground).size()) { + m_strBackground = strBackground; + } + } + } + if(m_strFullName.isEmpty()) { + m_strFullName = m_strName; + } + Q_EMIT userPropChanged(m_strName); + } +} + +QDebug operator <<(QDebug stream, const LocalUserInfo &userInfo) +{ + stream << "[" + << userInfo.path() + << userInfo.uid() + << userInfo.name() + << userInfo.fullName() + << userInfo.headImage() + << userInfo.backGround() + << userInfo.isLoggedIn() + << userInfo.lang() + << "]"; + return stream; +} diff --git a/src/userinfo.h b/src/userinfo.h index 593858b..f4ec45c 100644 --- a/src/userinfo.h +++ b/src/userinfo.h @@ -22,15 +22,15 @@ #include #include -class UserInfo +class UserInfo : public QObject { + Q_OBJECT public: - UserInfo(); - UserInfo(const UserInfo &userInfo); + explicit UserInfo(QObject *parent = nullptr); + explicit UserInfo(const UserInfo &userInfo); virtual ~UserInfo(); bool operator==(const UserInfo &userInfo) const; - UserInfo& operator=(const UserInfo &userInfo); public: inline bool isLoggedIn() const { return m_isLoggedIn; } @@ -41,6 +41,9 @@ public: inline QString lang() const { return m_strLang; } inline QString name() const { return m_strName; } + virtual inline QString path() const { return QString(); } + +public: void updateLoggedIn(const bool &isLoggedIn); void updateUid(const uid_t &id); void updateHeadImage(const QString &path); @@ -49,6 +52,9 @@ public: void updateLang(const QString &lang); void updateName(const QString &name); +Q_SIGNALS: + void userPropChanged(const QString &userName); + protected: bool m_isLoggedIn; // 是否已登录 uid_t m_uId; // 用户 uid @@ -63,4 +69,32 @@ typedef std::shared_ptr UserInfoPtr; QDebug operator <<(QDebug stream, const UserInfo &userInfo); +class LocalUserInfo : public UserInfo +{ + Q_OBJECT +public: + explicit LocalUserInfo(const uid_t &uId, QObject* parent = nullptr); + explicit LocalUserInfo(const QString &strPath, QObject* parent = nullptr); + explicit LocalUserInfo(const LocalUserInfo &localUser); + + virtual ~LocalUserInfo(); + + inline QString path() const override { return m_strPath; } + +private: + void initData(); + void initConnections(); + +private Q_SLOTS: + void onPropertiesChanged(const QString&, const QVariantMap&, const QStringList&); + +private: + QString m_strPath; + bool m_propertiesChangedConnected = false; +}; + +typedef std::shared_ptr LocalUserInfoPtr; + +QDebug operator <<(QDebug stream, const LocalUserInfo &userInfo); + #endif // USERINFO_H diff --git a/src/widgets/authdialog.cpp b/src/widgets/authdialog.cpp index f8de26f..9e0d523 100644 --- a/src/widgets/authdialog.cpp +++ b/src/widgets/authdialog.cpp @@ -19,7 +19,7 @@ #include "../lock-dialog/pam-tally.h" #include "global_utils.h" -AuthDialog::AuthDialog(LockDialogModel *model, UserInfo userInfo, QWidget *parent) +AuthDialog::AuthDialog(LockDialogModel *model, UserInfoPtr userInfo, QWidget *parent) : QWidget(parent) , m_modelLockDialog(model) , m_isLockingFlg(false) @@ -336,21 +336,21 @@ void AuthDialog::initLoginoptionWidget() void AuthDialog::updateUI() { - QPixmap p(m_curUserInfo.headImage()); + QPixmap p(m_curUserInfo->headImage()); QPixmap userIcon = scaledPixmap(p); userIcon = userIcon.scaled(154*scale, 154*scale, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); userIcon = PixmapToRound(userIcon, 77*scale); m_labelHeadImg->setPixmap(userIcon); - m_nameLabel->setText(m_curUserInfo.fullName()); + m_nameLabel->setText(m_curUserInfo->fullName()); m_fRetryButton->setStyleSheet(QString("QPushButton{border-radius: %1px; border:0px solid white;background-color: rgba(255,255,255,10%);}" "QPushButton::hover{background-color: rgb(255,255,255,30%);}" "QPushButton::pressed {background-color: rgba(255,255,255,40%);}").arg((int)(77*scale))); m_fRetryButton->setFixedSize(154*scale, 154*scale); m_fRetryButton->setIconSize(QSize(48*scale, 48*scale)); - qDebug()<<"AuthDialog updateUI:"<isLoggedIn(); + if (!isGreeterMode() && m_curUserInfo->isLoggedIn()) { QPixmap iconLogin = QIcon::fromTheme("system-lock-screen-symbolic").pixmap(12,12); iconLogin = drawSymbolicColoredPixmap(iconLogin, "white"); if (m_passwordEdit) { @@ -530,7 +530,7 @@ void AuthDialog::switchLoginOptType(unsigned uLoginOptType, bool faceBtnClicked) return; } - if (uLoginOptType != m_uCurLoginOptType || (m_deviceInfo && m_deviceInfo->id != m_nLastDeviceId) || m_curUserInfo.name() != m_lastUserName) { + if (uLoginOptType != m_uCurLoginOptType || (m_deviceInfo && m_deviceInfo->id != m_nLastDeviceId) || m_curUserInfo->name() != m_lastUserName) { clearMessage(); switch(uLoginOptType) { case LOGINOPT_TYPE_PASSWORD: @@ -591,7 +591,7 @@ void AuthDialog::switchLoginOptType(unsigned uLoginOptType, bool faceBtnClicked) m_nLastDeviceId = -1; } - m_lastUserName = m_curUserInfo.name(); + m_lastUserName = m_curUserInfo->name(); m_uCurLoginOptType = uLoginOptType; } @@ -695,7 +695,7 @@ void AuthDialog::onRespondUkey(const QString &text) { if (m_loginOpts && m_deviceInfo){ m_loginOpts->SetExtraInfo(text,"pincode"); - m_loginOpts->startAuth(m_deviceInfo, m_curUserInfo.uid()); + m_loginOpts->startAuth(m_deviceInfo, m_curUserInfo->uid()); } } @@ -913,11 +913,11 @@ void AuthDialog::onPamShowPrompt(QString strPrompt, int nType) void AuthDialog::onPamAuthCompleted() { - if (m_curUserInfo.name().isEmpty()) + if (m_curUserInfo->name().isEmpty()) return ; m_passwordEdit->stopWaiting(); bool isAuthenticated = (Q_EMIT m_modelLockDialog->pamIsAuthenticated()); - qDebug()<<"onPamAuthCompleted:"<name(); if(isAuthenticated) { if((m_bRecvPrompt && !m_bHasUnacknowledgedMsg ) || m_bDirectLogin) { m_bDirectLogin = false; @@ -926,12 +926,12 @@ void AuthDialog::onPamAuthCompleted() m_passwordEdit->readOnly(false); m_passwordEdit->clear(); clearMessage(); - m_failMap.remove(m_curUserInfo.uid()); + m_failMap.remove(m_curUserInfo->uid()); setLoginTypeTip(""); setUkeyTypeTip(""); authMode = UNKNOWN; m_uCurLoginOptType = LOGINOPT_TYPE_PASSWORD; - Q_EMIT authSucceed(m_curUserInfo.name()); + Q_EMIT authSucceed(m_curUserInfo->name()); } else { qDebug()<<"m_bRecvPrompt = "<name().isEmpty()) { qInfo()<<"No user be selected!!"; return ; } m_bHasUnacknowledgedMsg = false; clearMessage(); - qDebug()<<"onRespond:"<pamAuthenticate(m_curUserInfo.name()); - } else if(m_curUserInfo.name() == "*login") { //用户输入用户名 + qDebug()<<"onRespond:"<name(); + if(m_curUserInfo->name() == "*guest"){ + Q_EMIT m_modelLockDialog->pamAuthenticate(m_curUserInfo->name()); + } else if(m_curUserInfo->name() == "*login") { //用户输入用户名 m_isManual = true; m_isNameLogin = true; @@ -1021,19 +1021,19 @@ void AuthDialog::onRespond(const QString &strRes) void AuthDialog::startAuth() { - if (!m_curUserInfo.name().isEmpty()) { + if (!m_curUserInfo->name().isEmpty()) { m_bRecvPrompt = false; m_bHasUnacknowledgedMsg = false; //用户认证 - if(m_curUserInfo.name() == "*guest") { //游客登录 + if(m_curUserInfo->name() == "*guest") { //游客登录 qDebug() << "guest login"; m_passwordEdit->show(); m_passwordEdit->setPrompt(tr("login")); - } else if(m_curUserInfo.name() == "*login") { //手动输入用户名 + } else if(m_curUserInfo->name() == "*login") { //手动输入用户名 Q_EMIT m_modelLockDialog->pamAuthenticate(""); } else { - qDebug() << "login: " << m_curUserInfo.name(); - Q_EMIT m_modelLockDialog->pamAuthenticate(m_curUserInfo.name()); + qDebug() << "login: " << m_curUserInfo->name(); + Q_EMIT m_modelLockDialog->pamAuthenticate(m_curUserInfo->name()); m_passwordEdit->clear(); m_passwordEdit->readOnly(true); } @@ -1053,15 +1053,15 @@ void AuthDialog::stopAuth() clearMessage(); } -void AuthDialog::onCurUserInfoChanged(const UserInfo &userInfo) +void AuthDialog::onCurUserInfoChanged(UserInfoPtr userInfo) { - if (m_curUserInfo.uid() > -1 && userInfo.uid() == m_curUserInfo.uid()) { + if (m_curUserInfo->uid() > -1 && userInfo->uid() == m_curUserInfo->uid()) { m_curUserInfo = userInfo; updateUI(); } } -void AuthDialog::onCurUserChanged(const UserInfo &userInfo) +void AuthDialog::onCurUserChanged(UserInfoPtr userInfo) { if(m_loginOpts){ m_loginOpts->stopAuth(); @@ -1121,13 +1121,13 @@ void AuthDialog::onMessageButtonClicked() m_passwordEdit->clear(); clearMessage(); - m_failMap.remove(m_curUserInfo.uid()); + m_failMap.remove(m_curUserInfo->uid()); setLoginTypeTip(""); setUkeyTypeTip(""); authMode = UNKNOWN; m_uCurLoginOptType = LOGINOPT_TYPE_PASSWORD; - Q_EMIT authSucceed(m_curUserInfo.name()); + Q_EMIT authSucceed(m_curUserInfo->name()); } else { m_messageButton->hide(); m_messageLabel->setText(""); @@ -1145,14 +1145,14 @@ void AuthDialog::clearMessage() bool AuthDialog::unlockUserTimer() { - if (m_curUserInfo.name().isEmpty()) + if (m_curUserInfo->name().isEmpty()) return false; int failed_count = 0; int time_left = 0; int deny = 0; int fail_time =0; int unlock_time = 0; - QString curUserName = m_curUserInfo.name(); + QString curUserName = m_curUserInfo->name(); if (NULL == curUserName.toLatin1().data()) { qDebug() << "get user info failed." ; @@ -1257,7 +1257,7 @@ void AuthDialog::pamBioSuccess() if(m_deviceInfo && m_deviceInfo->deviceType == LOGINOPT_TYPE_GENERAL_UKEY){ //ukey时不调用ukey认证 }else{ - m_loginOpts->startAuth(m_deviceInfo, m_curUserInfo.uid()); + m_loginOpts->startAuth(m_deviceInfo, m_curUserInfo->uid()); } if (m_deviceInfo) { @@ -1370,10 +1370,10 @@ void AuthDialog::performBiometricAuth() //获取默认设备 if (m_loginOpts) { - if(m_curUserInfo.name() == "*login") + if(m_curUserInfo->name() == "*login") m_deviceName = m_loginOpts->getDefaultDevice(m_strManualLoginName); else - m_deviceName = m_loginOpts->getDefaultDevice(m_curUserInfo.name()); + m_deviceName = m_loginOpts->getDefaultDevice(m_curUserInfo->name()); if (m_isCustomDefault) { // 认证插件配置默认插件认证 if (m_loginOpts) { @@ -1408,7 +1408,7 @@ void AuthDialog::performBiometricAuth() } //已经错误超过3次 - if(m_failMap.contains(m_curUserInfo.uid()) && m_failMap[m_curUserInfo.uid()][m_deviceInfo->id] >= maxFailedTimes) + if(m_failMap.contains(m_curUserInfo->uid()) && m_failMap[m_curUserInfo->uid()][m_deviceInfo->id] >= maxFailedTimes) { if (m_deviceInfo->deviceType == UniT_Remote) { setLoginTypeTip(tr("Failed to verify %1, please enter password to unlock").arg(getDeviceType_tr(m_deviceInfo->deviceType))); @@ -1445,11 +1445,11 @@ void AuthDialog::skipBiometricAuth() void AuthDialog::initBiometricWidget() { if(m_loginOpts) { - m_loginOpts->setUser(m_curUserInfo.uid()); + m_loginOpts->setUser(m_curUserInfo->uid()); } else { QHBoxLayout *optsLayout = new QHBoxLayout(m_widgetLoginOpts); optsLayout->setContentsMargins(0,0,0,0); - m_loginOpts = new LoginOptionsWidget(m_biometricProxy, m_curUserInfo.uid(), m_uniauthService, m_widgetLoginOpts); + m_loginOpts = new LoginOptionsWidget(m_biometricProxy, m_curUserInfo->uid(), m_uniauthService, m_widgetLoginOpts); optsLayout->addWidget(m_loginOpts); connect(m_loginOpts, &LoginOptionsWidget::authComplete, this, &AuthDialog::onBiometricAuthComplete); @@ -1463,7 +1463,7 @@ void AuthDialog::initBiometricWidget() this, &AuthDialog::onLoginOptsCount); connect(m_loginOpts, &LoginOptionsWidget::updateAuthMsg, this, &AuthDialog::setLoginMsg); - m_loginOpts->setUser(m_curUserInfo.uid()); + m_loginOpts->setUser(m_curUserInfo->uid()); } qDebug()<<"OptsCount:"<getLoginOptCount(); @@ -1524,7 +1524,7 @@ void AuthDialog::onLoginOptsCount(unsigned uCount) } //获取默认设备 - if(m_curUserInfo.name() == "*login"){ + if(m_curUserInfo->name() == "*login"){ if(isLoadingUkey){ m_deviceName = m_loginOpts->getDefaultDevice(m_strManualLoginName,UniT_General_Ukey); }else{ @@ -1532,9 +1532,9 @@ void AuthDialog::onLoginOptsCount(unsigned uCount) } } else{ if(isLoadingUkey){ - m_deviceName = m_loginOpts->getDefaultDevice(m_curUserInfo.name(),UniT_General_Ukey); + m_deviceName = m_loginOpts->getDefaultDevice(m_curUserInfo->name(),UniT_General_Ukey); }else{ - m_deviceName = m_loginOpts->getDefaultDevice(m_curUserInfo.name()); + m_deviceName = m_loginOpts->getDefaultDevice(m_curUserInfo->name()); } } @@ -1560,7 +1560,7 @@ void AuthDialog::onLoginOptsCount(unsigned uCount) } //已经错误超过3次 - if(m_failMap.contains(m_curUserInfo.uid()) && m_failMap[m_curUserInfo.uid()][m_deviceInfo->id] >= maxFailedTimes) + if(m_failMap.contains(m_curUserInfo->uid()) && m_failMap[m_curUserInfo->uid()][m_deviceInfo->id] >= maxFailedTimes) { if (m_deviceInfo->deviceType == UniT_Remote) { setLoginTypeTip(tr("Failed to verify %1, please enter password to unlock").arg(getDeviceType_tr(m_deviceInfo->deviceType))); @@ -1641,7 +1641,7 @@ void AuthDialog::onDeviceChanged(unsigned uCurLoginOptType, const DeviceInfoPtr if(deviceInfo) qDebug() << "device changed: " << *deviceInfo; - if(deviceInfo && m_failMap[m_curUserInfo.uid()][deviceInfo->id] >= maxFailedTimes){ + if(deviceInfo && m_failMap[m_curUserInfo->uid()][deviceInfo->id] >= maxFailedTimes){ qDebug() << "Failed MAX!!"; return ; } @@ -1691,18 +1691,18 @@ void AuthDialog::onBiometricAuthComplete(bool result, int nStatus) return; } else if (nStatus >= 2 && nStatus != 5){ if (m_deviceInfo) { - if(m_failMap.contains(m_curUserInfo.uid()) && m_failMap[m_curUserInfo.uid()].contains(m_deviceInfo->id)){ - m_failMap[m_curUserInfo.uid()][m_deviceInfo->id] = m_failMap[m_curUserInfo.uid()][m_deviceInfo->id] + 1; + if(m_failMap.contains(m_curUserInfo->uid()) && m_failMap[m_curUserInfo->uid()].contains(m_deviceInfo->id)){ + m_failMap[m_curUserInfo->uid()][m_deviceInfo->id] = m_failMap[m_curUserInfo->uid()][m_deviceInfo->id] + 1; }else{ - m_failMap[m_curUserInfo.uid()][m_deviceInfo->id] = 1; + m_failMap[m_curUserInfo->uid()][m_deviceInfo->id] = 1; } - qDebug()<<"Failed count:"<id]<<",Max:"<uid()][m_deviceInfo->id]<<",Max:"<deviceType == BioT_Face) { QImage imgFailed; setFaceImg(imgFailed, 1); m_fTimeoutTimes = 0; } - if(m_failMap[m_curUserInfo.uid()][m_deviceInfo->id] >= maxFailedTimes){ + if(m_failMap[m_curUserInfo->uid()][m_deviceInfo->id] >= maxFailedTimes){ if (m_deviceInfo->deviceType == UniT_Remote) { setLoginTypeTip(tr("Failed to verify %1, please enter password to unlock").arg(getDeviceType_tr(m_deviceInfo->deviceType))); QImage nullImage; @@ -1725,11 +1725,11 @@ void AuthDialog::onBiometricAuthComplete(bool result, int nStatus) if(m_deviceInfo->deviceType == LOGINOPT_TYPE_GENERAL_UKEY){ setUkeyTypeTip(tr("Failed to verify %1, you still have %2 verification opportunities") .arg(getDeviceType_tr(m_deviceInfo->deviceType)) - .arg(maxFailedTimes-m_failMap[m_curUserInfo.uid()][m_deviceInfo->id])); + .arg(maxFailedTimes-m_failMap[m_curUserInfo->uid()][m_deviceInfo->id])); }else { setLoginTypeTip(tr("Failed to verify %1, you still have %2 verification opportunities") .arg(getDeviceType_tr(m_deviceInfo->deviceType)) - .arg(maxFailedTimes-m_failMap[m_curUserInfo.uid()][m_deviceInfo->id])); + .arg(maxFailedTimes-m_failMap[m_curUserInfo->uid()][m_deviceInfo->id])); } } } @@ -1852,10 +1852,10 @@ void AuthDialog::onBiometricDbusChanged(bool bActive) //获取默认设备 if (m_loginOpts) { - if(m_curUserInfo.name() == "*login") + if(m_curUserInfo->name() == "*login") m_deviceName = m_loginOpts->getDefaultDevice(m_strManualLoginName); else - m_deviceName = m_loginOpts->getDefaultDevice(m_curUserInfo.name()); + m_deviceName = m_loginOpts->getDefaultDevice(m_curUserInfo->name()); } qDebug() << m_deviceName; if (m_deviceInfo) { @@ -1879,7 +1879,7 @@ void AuthDialog::onBiometricDbusChanged(bool bActive) } //已经错误超过3次 - if(m_failMap.contains(m_curUserInfo.uid()) && m_failMap[m_curUserInfo.uid()][m_deviceInfo->id] >= maxFailedTimes) { + if(m_failMap.contains(m_curUserInfo->uid()) && m_failMap[m_curUserInfo->uid()][m_deviceInfo->id] >= maxFailedTimes) { if (m_deviceInfo->deviceType == UniT_Remote) { setLoginTypeTip(tr("Failed to verify %1, please enter password to unlock").arg(getDeviceType_tr(m_deviceInfo->deviceType))); } else { @@ -1972,17 +1972,17 @@ QString AuthDialog::onCustomRequest(QString strReqJson) if (reqType == "GetInformations") { // 请求信息 QString strType = rootObj.value("Type").toString(); if (strType.contains("CurrentUser")) { // 当前用户信息 - if (m_curUserInfo.uid() >= 0 && !m_curUserInfo.name().isEmpty() && !m_curUserInfo.name().startsWith("*")) { + if (m_curUserInfo->uid() >= 0 && !m_curUserInfo->name().isEmpty() && !m_curUserInfo->name().startsWith("*")) { QJsonObject user; - user["Name"] = m_curUserInfo.name(); - user["Id"] = (double)(m_curUserInfo.uid()); + user["Name"] = m_curUserInfo->name(); + user["Id"] = (double)(m_curUserInfo->uid()); QFile faceFile(m_face); if (!faceFile.exists()) { user["HeadImg"] = m_strDefaultFace; } else { user["HeadImg"] = m_face; } - user["RealName"] = m_curUserInfo.fullName(); + user["RealName"] = m_curUserInfo->fullName(); contentObj["CurrentUser"] = user; } else { retObj["Ret"] = -1; diff --git a/src/widgets/authdialog.h b/src/widgets/authdialog.h index 9d52775..baaf3d3 100644 --- a/src/widgets/authdialog.h +++ b/src/widgets/authdialog.h @@ -25,7 +25,7 @@ class AuthDialog : public QWidget Q_OBJECT public: - explicit AuthDialog(LockDialogModel *model, UserInfo userInfo, QWidget *parent = nullptr); + explicit AuthDialog(LockDialogModel *model, UserInfoPtr userInfo, QWidget *parent = nullptr); void initUI(); void switchLoginOptType(unsigned uLoginOptType,bool faceBtnClicked = false); @@ -33,8 +33,8 @@ public: public: void startAuth(); void stopAuth(); - void onCurUserChanged(const UserInfo &userInfo); - void onCurUserInfoChanged(const UserInfo &userInfo); + void onCurUserChanged(UserInfoPtr userInfo); + void onCurUserInfoChanged(UserInfoPtr userInfo); void updateUI(); void updateAuthSize(); @@ -184,7 +184,7 @@ private: BioButtonListWidget *bottomListWidget = nullptr; - UserInfo m_curUserInfo; + UserInfoPtr m_curUserInfo; bool m_bRecvPrompt = false; bool m_bHasUnacknowledgedMsg = false; bool m_bDirectLogin = false; diff --git a/src/widgets/lockwidget.cpp b/src/widgets/lockwidget.cpp index 3e2a612..5f64fb6 100644 --- a/src/widgets/lockwidget.cpp +++ b/src/widgets/lockwidget.cpp @@ -46,10 +46,7 @@ LockWidget::LockWidget(LockDialogModel *model, QWidget *parent) , m_modelLockDialog(model) { scale = 1.0; - UserInfoPtr ptrUser = m_modelLockDialog->findUserByName(m_modelLockDialog->defaultUserName()); - if (ptrUser) { - m_curUserInfo = *ptrUser; - } + m_curUserInfo = m_modelLockDialog->findUserByName(m_modelLockDialog->defaultUserName()); initUI(); initConnections(); initUsdMediaKeys(); @@ -194,7 +191,7 @@ void LockWidget::resizeEvent(QResizeEvent *event) m_powerListWidget->move((width() - m_powerListWidget->width())/2, (height() - m_powerListWidget->height())/2 - BOTTOM_MARGIN*scale); updateBottomButton(); - if (m_curUserInfo.isLoggedIn() && m_sessionButton) { + if (m_curUserInfo->isLoggedIn() && m_sessionButton) { buttonListWidget->setFixedSize(QSize(48*(buttonListWidget->count() - 1) + buttonListWidget->spacing()*2*(buttonListWidget->count() - 1), 64)); } else { buttonListWidget->setFixedSize(QSize(48*buttonListWidget->count() + buttonListWidget->spacing()*2*buttonListWidget->count(), 64)); @@ -386,7 +383,7 @@ void LockWidget::initButtonWidget() buttonListWidget->setItemWidget(m_btnItemSession, m_sessionButton); buttonListWidget->addItem(m_btnItemSession); m_sessionButton->setObjectName("BtnSession"); - if (m_curUserInfo.isLoggedIn()) { + if (m_curUserInfo->isLoggedIn()) { buttonListWidget->setItemHidden(m_btnItemSession, true); } else { buttonListWidget->setItemHidden(m_btnItemSession, false); @@ -495,7 +492,7 @@ void LockWidget::initButtonWidget() }); } - if (m_curUserInfo.isLoggedIn() && m_sessionButton) { + if (m_curUserInfo->isLoggedIn() && m_sessionButton) { buttonListWidget->setFixedSize(QSize(48*(buttonListWidget->count() - 1) + buttonListWidget->spacing()*2*(buttonListWidget->count() - 1), 64)); } else { buttonListWidget->setFixedSize(QSize(48*buttonListWidget->count() + buttonListWidget->spacing()*2*buttonListWidget->count(), 64)); @@ -643,9 +640,9 @@ void LockWidget::onUsersInfoChanged() height()- BOTTOM_MARGIN*scale - buttonListWidget->height() - buttonListWidget->spacing()*scale - m_userListWidget->height()); } } - UserInfoPtr ptrUser = m_modelLockDialog->findUserByName(m_curUserInfo.name()); + UserInfoPtr ptrUser = m_modelLockDialog->findUserByName(m_curUserInfo->name()); if (ptrUser) { - m_curUserInfo = *ptrUser; + m_curUserInfo = ptrUser; if (authDialog) { authDialog->onCurUserInfoChanged(m_curUserInfo); } @@ -656,15 +653,15 @@ void LockWidget::onCurUserChanged(const QString &strUserName) { UserInfoPtr ptrUser = m_modelLockDialog->findUserByName(strUserName); if (ptrUser) { - m_curUserInfo = *ptrUser; - qDebug()<<"CurUserInfo:"<onLanguageChanged(m_curUserInfo.lang()); + LanguageSetting::instance()->onLanguageChanged(m_curUserInfo->lang()); } if (authDialog) authDialog->onCurUserChanged(m_curUserInfo); } - if (m_btnItemSession && m_curUserInfo.isLoggedIn()) { + if (m_btnItemSession && m_curUserInfo->isLoggedIn()) { buttonListWidget->setItemHidden(m_btnItemSession, true); } else { buttonListWidget->setItemHidden(m_btnItemSession, false); diff --git a/src/widgets/lockwidget.h b/src/widgets/lockwidget.h index 3fedf26..96bb7c7 100644 --- a/src/widgets/lockwidget.h +++ b/src/widgets/lockwidget.h @@ -138,7 +138,7 @@ private: LockDialogModel *m_modelLockDialog = nullptr; - UserInfo m_curUserInfo; + UserInfoPtr m_curUserInfo; AuthDialog *authDialog = nullptr; QTimer *m_timerChkActive = nullptr;