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;