From 3ce230d8561a8190cf687de1748f5d8f439b3bda Mon Sep 17 00:00:00 2001 From: Zhao zebin Date: Mon, 6 Jan 2025 17:44:57 +0800 Subject: [PATCH 1/3] add_usermanage_function.patch Signed-off-by: Zhao zebin --- 01_add_usermanage_function.patch | 583 +++++++++++++++++++++++++++++++ qt5-qtaccountsservice.spec | 15 +- 2 files changed, 597 insertions(+), 1 deletion(-) create mode 100644 01_add_usermanage_function.patch diff --git a/01_add_usermanage_function.patch b/01_add_usermanage_function.patch new file mode 100644 index 0000000..5c74b33 --- /dev/null +++ b/01_add_usermanage_function.patch @@ -0,0 +1,583 @@ +diff -urNp qtaccountsservice-0.6.0old/src/accountsservice/accountsmanager.cpp qtaccountsservice-0.6.0/src/accountsservice/accountsmanager.cpp +--- qtaccountsservice-0.6.0old/src/accountsservice/accountsmanager.cpp 2025-01-06 17:10:39.986383011 +0800 ++++ qtaccountsservice-0.6.0/src/accountsservice/accountsmanager.cpp 2025-01-06 17:11:02.451380767 +0800 +@@ -29,6 +29,10 @@ + #include "accountsmanager.h" + #include "accountsmanager_p.h" + ++#include ++ ++#define PATH_SDDM "/etc/sddm.conf" ++ + namespace QtAccountsService { + + /* +@@ -245,6 +249,140 @@ QString AccountsManager::findUserIconFil + return QString(); + } + ++bool AccountsManager::findAUserByName(const QString &checkUserName){ ++ UserAccount *findOutUser =findUserByName(checkUserName); ++ if(findOutUser == NULL){ ++ return false; ++ } ++ return true; ++} ++ ++bool AccountsManager::createAUser(const QString &userName,const QString &fullName,bool accountType, ++ const QString &password,const QString &fileName,bool userAutoLogin) ++{ ++ //add a user ++ if(!createUser(userName,fullName,(UserAccount::AccountType) accountType)){ ++ return false; ++ } ++ return editAUser(userName,userName,fullName,accountType,true,password,fileName,userAutoLogin); ++ ++} ++ ++bool AccountsManager::editAUser(const QString &userChangedName,const QString &userName,const QString &fullName,bool accountType, ++ bool passWordFlag,const QString &password,const QString &fileName,bool userAutoLogin){ ++ UserAccount *findOutUser =findUserByName(userChangedName); ++ if (findOutUser == NULL){ ++ return false; ++ } ++ ++ findOutUser->setUserName(userName); ++ ++ if(passWordFlag){ ++ findOutUser->setPassword(password,""); ++ } ++ findOutUser->setIconFileName(fileName); ++ ++ findOutUser->setAccountType((UserAccount::AccountType)accountType); ++ ++ if(userAutoLogin) ++ { ++ findOutUser->setAutomaticLogin(userAutoLogin); ++ }else{ ++ if(findOutUser->getAutoLoginUserName() == userName){ ++ findOutUser->setAutomaticLogin(userAutoLogin); ++ } ++ } ++ ++ return true; ++ ++} ++ ++bool AccountsManager::editAUserName(const QString &userChangedName,const QString &userName){ ++ UserAccount *findOutUser =findUserByName(userChangedName); ++ if (findOutUser == NULL){ ++ return false; ++ } ++ ++ return findOutUser->setUserName(userName); ++} ++ ++bool AccountsManager::editAUserPasswd(const QString &userChangedName,bool passWordFlag,const QString &password){ ++ UserAccount *findOutUser =findUserByName(userChangedName); ++ if (findOutUser == NULL){ ++ return false; ++ } ++ ++ if(passWordFlag){ ++ return findOutUser->setPassword(password,""); ++ } ++ ++ return true; ++ ++} ++ ++bool AccountsManager::editAUserType(const QString &userChangedName,bool accountType){ ++ UserAccount *findOutUser =findUserByName(userChangedName); ++ if (findOutUser == NULL){ ++ return false; ++ } ++ ++ return findOutUser->setAccountType((UserAccount::AccountType)accountType); ++ ++} ++ ++bool AccountsManager::editAUserAutoLogin(const QString &userChangedName,const QString &userName,bool userAutoLogin){ ++ UserAccount *findOutUser =findUserByName(userChangedName); ++ if (findOutUser == NULL){ ++ return false; ++ } ++ ++ // findOutUser->setUserName(userName); ++ ++ GError **error = NULL; ++ g_autoptr(GKeyFile) keyfile = NULL; ++ g_autofree gchar *data = NULL; ++ gboolean result; ++ ++ keyfile = g_key_file_new (); ++ if (!g_key_file_load_from_file (keyfile, ++ PATH_SDDM, ++ G_KEY_FILE_KEEP_COMMENTS, ++ error)) { ++ return false; ++ } ++ ++ if(userAutoLogin) { ++ g_key_file_set_string (keyfile, "Autologin", "User", userName.toLocal8Bit().data()); ++ }else{ ++ g_key_file_set_string (keyfile, "Autologin", "User", ""); ++ } ++ ++ data = g_key_file_to_data (keyfile, NULL, NULL); ++ result = g_file_set_contents (PATH_SDDM, data, -1, error); ++ ++ if(result) ++ { ++ findOutUser->setAutomaticLogin(userAutoLogin); ++ } ++ ++ return true; ++ ++} ++ ++bool AccountsManager::editAUserIcon(const QString &userChangedName,const QString &fileName){ ++ UserAccount *findOutUser =findUserByName(userChangedName); ++ if (findOutUser == NULL){ ++ return false; ++ } ++ ++ if(findOutUser->setIconFileName(fileName)) { ++ return true; ++ } ++ return false; ++ ++} ++ ++ + /*! + Creates a new \a accountType type user account whose name is \a userName, + real name is \a fullName. +@@ -259,15 +397,15 @@ bool AccountsManager::createUser(const Q + UserAccount::AccountType accountType) + { + Q_D(AccountsManager); +- ++ + QDBusPendingReply reply = d->interface->CreateUser(userName, fullName, accountType); ++ reply.waitForFinished(); + if (reply.isError()) { + QDBusError error = reply.error(); + qWarning("Couldn't create user %s: %s", userName.toUtf8().constData(), + error.errorString(error.type()).toUtf8().constData()); + return false; + } +- + return true; + } + +@@ -278,11 +416,12 @@ bool AccountsManager::createUser(const Q + \param removeFiles If true all files owned by the user will be removed. + \return whether the user was deleted successfully. + */ +-bool AccountsManager::deleteUser(uid_t uid, bool removeFiles) ++bool AccountsManager::deleteUser(qlonglong uid, bool removeFiles) + { + Q_D(AccountsManager); + + QDBusPendingReply reply = d->interface->DeleteUser(uid, removeFiles); ++ reply.waitForFinished(); + if (reply.isError()) { + QDBusError error = reply.error(); + qWarning("Couldn't delete user %d: %s", uid, +diff -urNp qtaccountsservice-0.6.0old/src/accountsservice/accountsmanager.h qtaccountsservice-0.6.0/src/accountsservice/accountsmanager.h +--- qtaccountsservice-0.6.0old/src/accountsservice/accountsmanager.h 2025-01-06 17:10:39.995383010 +0800 ++++ qtaccountsservice-0.6.0/src/accountsservice/accountsmanager.h 2025-01-06 17:11:02.451380767 +0800 +@@ -55,11 +55,28 @@ public: + + Q_INVOKABLE QString findUserIconFile(const QString &userName); + ++ Q_INVOKABLE bool findAUserByName(const QString &checkUserName); ++ Q_INVOKABLE bool createAUser(const QString &userName,const QString &fullName,bool accountType, ++ const QString &password,const QString &fileName,bool autoLogin); ++ ++ Q_INVOKABLE bool editAUser(const QString &userChangedName,const QString &userName,const QString &fullName,bool accountType, ++ bool passWordFlag,const QString &password,const QString &fileName,bool autoLogin); ++ ++ Q_INVOKABLE bool editAUserName(const QString &userChangedName,const QString &userName); ++ ++ Q_INVOKABLE bool editAUserPasswd(const QString &userChangedName,bool passWordFlag,const QString &password); ++ ++ Q_INVOKABLE bool editAUserType(const QString &userChangedName,bool accountType); ++ ++ Q_INVOKABLE bool editAUserAutoLogin(const QString &userChangedName,const QString &userName,bool userAutoLogin); ++ ++ Q_INVOKABLE bool editAUserIcon(const QString &userChangedName,const QString &fileName); ++ + bool createUser(const QString &userName, + const QString &fullName, + UserAccount::AccountType accountType); + +- bool deleteUser(uid_t uid, bool removeFiles); ++ Q_INVOKABLE bool deleteUser(qlonglong uid, bool removeFiles); + bool deleteUser(UserAccount *account, bool removeFiles); + + Q_SIGNALS: +diff -urNp qtaccountsservice-0.6.0old/src/accountsservice/CMakeLists.txt qtaccountsservice-0.6.0/src/accountsservice/CMakeLists.txt +--- qtaccountsservice-0.6.0old/src/accountsservice/CMakeLists.txt 2025-01-06 17:10:39.978383012 +0800 ++++ qtaccountsservice-0.6.0/src/accountsservice/CMakeLists.txt 2025-01-06 17:11:02.451380767 +0800 +@@ -12,6 +12,8 @@ include_directories( + ${CMAKE_SOURCE_DIR}/headers + ${CMAKE_BINARY_DIR}/headers + ) ++include_directories("/usr/include/glib-2.0/") ++include_directories("/usr/lib64/glib-2.0/include/") + + set(SOURCES + accountsmanager.cpp +@@ -40,6 +42,7 @@ target_link_libraries(QtAccountsService + Qt5::Core + Qt5::DBus + Qt5::Gui ++ glib-2.0 + ) + + set(QTACCOUNTSSERVICE_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}/QtAccountsService") +diff -urNp qtaccountsservice-0.6.0old/src/accountsservice/useraccount.cpp qtaccountsservice-0.6.0/src/accountsservice/useraccount.cpp +--- qtaccountsservice-0.6.0old/src/accountsservice/useraccount.cpp 2025-01-06 17:10:40.003383009 +0800 ++++ qtaccountsservice-0.6.0/src/accountsservice/useraccount.cpp 2025-01-06 17:11:02.452380767 +0800 +@@ -30,7 +30,9 @@ + #include + #include + #include ++#include + ++#define PATH_SDDM "/etc/sddm.conf" + namespace QtAccountsService { + + /* +@@ -67,6 +69,7 @@ UserAccount::UserAccount() + QDBusConnection::systemBus(), + this); + connect(d_ptr->user, SIGNAL(Changed()), this, SIGNAL(accountChanged())); ++ readConfigStr(); + } + + /*! +@@ -85,6 +88,7 @@ UserAccount::UserAccount(uid_t uid) + QDBusConnection::systemBus(), + this); + connect(d_ptr->user, SIGNAL(Changed()), this, SIGNAL(accountChanged())); ++ readConfigStr(); + } + + /*! +@@ -102,6 +106,18 @@ UserAccount::UserAccount(const QString & + QDBusConnection::systemBus(), + this); + connect(d_ptr->user, SIGNAL(Changed()), this, SIGNAL(accountChanged())); ++ readConfigStr(); ++} ++ ++void UserAccount::readConfigStr(){ ++ cfgPath = "/etc/sddm.conf"; ++ QFile readFile(cfgPath); ++ if(readFile.open(QIODevice::ReadOnly|QIODevice::Text)) ++ { ++ QTextStream stream(&readFile); ++ strAll=stream.readAll(); ++ } ++ readFile.close(); + } + + /*! +@@ -112,6 +128,81 @@ UserAccount::~UserAccount() + delete d_ptr; + } + ++ ++/*auto-login*/ ++ ++bool UserAccount::writeConf(QString Name) ++{ ++ QFile writeFile(cfgPath); ++ QString tempStr; ++ bool setAutoLogFlage=false; ++ if(writeFile.open(QIODevice::WriteOnly|QIODevice::Text)) ++ { ++ QTextStream stream(&writeFile); ++ strList=strAll.split("\n"); ++ for(int i=0;iuser->SetAccountType((int)type); ++ QDBusPendingReply reply = d->user->SetAccountType((int)type); ++ reply.waitForFinished(); ++ if (reply.isError()) { ++ QDBusError error = reply.error(); ++ qWarning("Couldn't change user type: %s", ++ error.errorString(error.type()).toUtf8().constData()); ++ if(error.errorString(error.type()).contains("other")) { ++ return false; ++ } ++ } + emit accountTypeChanged(); ++ return true; + } + + /*! +@@ -198,8 +299,32 @@ void UserAccount::setLocked(bool locked) + */ + bool UserAccount::automaticLogin() const + { +- Q_D(const UserAccount); +- return d->user->automaticLogin(); ++ // Q_D(const UserAccount); ++ // return d->user->automaticLogin(); ++ ++ g_autoptr(GKeyFile) keyfile = NULL; ++ GError *local_error = NULL; ++ gchar *name = NULL; ++ GError **error = NULL; ++ ++ keyfile = g_key_file_new (); ++ if (!g_key_file_load_from_file (keyfile, ++ PATH_SDDM, ++ G_KEY_FILE_KEEP_COMMENTS, ++ error)) { ++ return FALSE; ++ } ++ ++ name = g_key_file_get_string (keyfile, "Autologin", "User", &local_error); ++ if (local_error) { ++ g_propagate_error (error, local_error); ++ return FALSE; ++ } ++ if(name != NULL && userName() == QString(QLatin1String(name))) { ++ return true; ++ } ++ ++ return false; + } + + /*! +@@ -210,8 +335,8 @@ bool UserAccount::automaticLogin() const + */ + void UserAccount::setAutomaticLogin(bool automaticLogin) + { +- Q_D(UserAccount); +- d->user->SetAutomaticLogin(automaticLogin); ++ // Q_D(UserAccount); ++ // d->user->SetAutomaticLogin(automaticLogin); + emit automaticLoginChanged(); + } + +@@ -295,12 +420,22 @@ QString UserAccount::userName() const + + \param userName The new user name. + */ +-void UserAccount::setUserName(const QString &userName) ++bool UserAccount::setUserName(const QString &userName) + { + Q_D(UserAccount); +- d->user->SetUserName(userName); ++ QDBusPendingReply reply = d->user->SetUserName(userName); ++ reply.waitForFinished(); ++ if (reply.isError()) { ++ QDBusError error = reply.error(); ++ qWarning("Couldn't change user %s: %s", userName.toUtf8().constData(), ++ error.errorString(error.type()).toUtf8().constData()); ++ if(error.errorString(error.type()).contains("other")) { ++ return false; ++ } ++ } + emit userNameChanged(); + emit displayNameChanged(); ++ return true; + } + + /*! +@@ -391,11 +526,21 @@ QString UserAccount::iconFileName() cons + + \param fileName Picture absolute path. + */ +-void UserAccount::setIconFileName(const QString &fileName) ++bool UserAccount::setIconFileName(const QString &fileName) + { + Q_D(UserAccount); +- d->user->SetIconFile(fileName); ++ QDBusPendingReply reply = d->user->SetIconFile(fileName); ++ reply.waitForFinished(); ++ if (reply.isError()) { ++ QDBusError error = reply.error(); ++ qWarning("Couldn't change user icon: %s", ++ error.errorString(error.type()).toUtf8().constData()); ++ if(error.errorString(error.type()).contains("other")) { ++ return false; ++ } ++ } + emit iconFileNameChanged(); ++ return true; + } + + /*! +@@ -488,10 +633,20 @@ void UserAccount::setXSession(const QStr + \param password. + \param hint passwordHint. + */ +-void UserAccount::setPassword(const QString &password, const QString &hint) ++bool UserAccount::setPassword(const QString &password, const QString &hint) + { + Q_D(UserAccount); +- d->user->SetPassword(password, hint); ++ QDBusPendingReply reply = d->user->SetPassword(password, hint); ++ reply.waitForFinished(); ++ if (reply.isError()) { ++ QDBusError error = reply.error(); ++ qWarning("Couldn't change user password: %s", ++ error.errorString(error.type()).toUtf8().constData()); ++ if(error.errorString(error.type()).contains("other")) { ++ return false; ++ } ++ } ++ return true; + } + + } +diff -urNp qtaccountsservice-0.6.0old/src/accountsservice/useraccount.h qtaccountsservice-0.6.0/src/accountsservice/useraccount.h +--- qtaccountsservice-0.6.0old/src/accountsservice/useraccount.h 2025-01-06 17:10:40.012383009 +0800 ++++ qtaccountsservice-0.6.0/src/accountsservice/useraccount.h 2025-01-06 17:11:02.452380767 +0800 +@@ -29,7 +29,9 @@ + + #include + #include +- ++#include ++#include ++#include + #include + + namespace QtAccountsService { +@@ -82,8 +84,12 @@ public: + uid_t userId() const; + gid_t groupId() const; + +- AccountType accountType() const; +- void setAccountType(AccountType type); ++ Q_INVOKABLE QString getAutoLoginUserName(); ++ Q_INVOKABLE bool setAutoLogin(QString); ++ Q_INVOKABLE bool cancelAutoLogin(); ++ ++ Q_INVOKABLE AccountType accountType() const; ++ bool setAccountType(AccountType type); + + bool isLocked() const; + void setLocked(bool locked); +@@ -105,7 +111,7 @@ public: + bool isSystemAccount() const; + + QString userName() const; +- void setUserName(const QString &userName); ++ bool setUserName(const QString &userName); + + QString realName() const; + void setRealName(const QString &realName); +@@ -119,7 +125,7 @@ public: + void setShell(const QString &shell); + + QString iconFileName() const; +- void setIconFileName(const QString &fileName); ++ bool setIconFileName(const QString &fileName); + + QString email() const; + void setEmail(const QString &email); +@@ -133,7 +139,7 @@ public: + QString xsession() const; + void setXSession(const QString &session); + +- void setPassword(const QString &password, const QString &hint = ""); ++ bool setPassword(const QString &password, const QString &hint = ""); + + Q_SIGNALS: + void accountChanged(); +@@ -158,7 +164,13 @@ protected: + private: + friend class AccountsManager; + friend class AccountsManagerPrivate; +- ++ QString autoLoginUserName; ++ QString strAll; ++ QString cfgPath; ++ QStringList strList; ++ bool writeConf(QString); ++ void readConfigStr(); ++ + Q_DECLARE_PRIVATE(UserAccount) + + UserAccount(const QString &objectPath); diff --git a/qt5-qtaccountsservice.spec b/qt5-qtaccountsservice.spec index 4327651..4f52de6 100644 --- a/qt5-qtaccountsservice.spec +++ b/qt5-qtaccountsservice.spec @@ -3,12 +3,13 @@ Name: qt5-%{qt_module} Summary: Qt5 - AccountService addon Version: 0.6.0 -Release: 12%{?dist} +Release: 13.3%{?dist} License: LGPLv2+ URL: https://github.com/hawaii-desktop/qtaccountsservice Source0: https://github.com/hawaii-desktop/qtaccountsservice/releases/download/v%{version}/%{qt_module}-%{version}.tar.gz +Patch1000: 01_add_usermanage_function.patch BuildRequires: pkgconfig(Qt5Core) BuildRequires: pkgconfig(Qt5Gui) BuildRequires: pkgconfig(Qt5DBus) @@ -68,6 +69,18 @@ make install/fast DESTDIR=%{buildroot} -C %{_target_platform} %changelog +* Tue Feb 02 2021 Wu Shangmin - 0.6.0-13.3 +- 修改设置用户头像鉴权方式为阻塞运行 + +* Thu Jan 28 2021 Wu Shangmin - 0.6.0-13.2 +- 修改鉴权方式为阻塞运行 + +* Wed Jan 20 2021 Wu Shangmin - 0.6.0-13.1 +- 修复用户无法设置自动登录问题 + +* Tue Dec 15 2020 Wu Shangmin - 0.6.0-13 +- 增加用户管理模块用户创建、用户编辑、用户删除、修改用户名、密码、用户类型、自动登录、头像等接口(1177、1178、1179、1180、1181) + * Thu Jan 30 2020 Fedora Release Engineering - 0.6.0-12 - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild -- Gitee From ad633103128ce433e2614ca5342323f0040be4f8 Mon Sep 17 00:00:00 2001 From: sidoxi Date: Mon, 6 Jan 2025 10:24:14 +0000 Subject: [PATCH 2/3] Revert "add_usermanage_function.patch" This reverts commit 3ce230d8561a8190cf687de1748f5d8f439b3bda. --- 01_add_usermanage_function.patch | 583 ------------------------------- qt5-qtaccountsservice.spec | 15 +- 2 files changed, 1 insertion(+), 597 deletions(-) delete mode 100644 01_add_usermanage_function.patch diff --git a/01_add_usermanage_function.patch b/01_add_usermanage_function.patch deleted file mode 100644 index 5c74b33..0000000 --- a/01_add_usermanage_function.patch +++ /dev/null @@ -1,583 +0,0 @@ -diff -urNp qtaccountsservice-0.6.0old/src/accountsservice/accountsmanager.cpp qtaccountsservice-0.6.0/src/accountsservice/accountsmanager.cpp ---- qtaccountsservice-0.6.0old/src/accountsservice/accountsmanager.cpp 2025-01-06 17:10:39.986383011 +0800 -+++ qtaccountsservice-0.6.0/src/accountsservice/accountsmanager.cpp 2025-01-06 17:11:02.451380767 +0800 -@@ -29,6 +29,10 @@ - #include "accountsmanager.h" - #include "accountsmanager_p.h" - -+#include -+ -+#define PATH_SDDM "/etc/sddm.conf" -+ - namespace QtAccountsService { - - /* -@@ -245,6 +249,140 @@ QString AccountsManager::findUserIconFil - return QString(); - } - -+bool AccountsManager::findAUserByName(const QString &checkUserName){ -+ UserAccount *findOutUser =findUserByName(checkUserName); -+ if(findOutUser == NULL){ -+ return false; -+ } -+ return true; -+} -+ -+bool AccountsManager::createAUser(const QString &userName,const QString &fullName,bool accountType, -+ const QString &password,const QString &fileName,bool userAutoLogin) -+{ -+ //add a user -+ if(!createUser(userName,fullName,(UserAccount::AccountType) accountType)){ -+ return false; -+ } -+ return editAUser(userName,userName,fullName,accountType,true,password,fileName,userAutoLogin); -+ -+} -+ -+bool AccountsManager::editAUser(const QString &userChangedName,const QString &userName,const QString &fullName,bool accountType, -+ bool passWordFlag,const QString &password,const QString &fileName,bool userAutoLogin){ -+ UserAccount *findOutUser =findUserByName(userChangedName); -+ if (findOutUser == NULL){ -+ return false; -+ } -+ -+ findOutUser->setUserName(userName); -+ -+ if(passWordFlag){ -+ findOutUser->setPassword(password,""); -+ } -+ findOutUser->setIconFileName(fileName); -+ -+ findOutUser->setAccountType((UserAccount::AccountType)accountType); -+ -+ if(userAutoLogin) -+ { -+ findOutUser->setAutomaticLogin(userAutoLogin); -+ }else{ -+ if(findOutUser->getAutoLoginUserName() == userName){ -+ findOutUser->setAutomaticLogin(userAutoLogin); -+ } -+ } -+ -+ return true; -+ -+} -+ -+bool AccountsManager::editAUserName(const QString &userChangedName,const QString &userName){ -+ UserAccount *findOutUser =findUserByName(userChangedName); -+ if (findOutUser == NULL){ -+ return false; -+ } -+ -+ return findOutUser->setUserName(userName); -+} -+ -+bool AccountsManager::editAUserPasswd(const QString &userChangedName,bool passWordFlag,const QString &password){ -+ UserAccount *findOutUser =findUserByName(userChangedName); -+ if (findOutUser == NULL){ -+ return false; -+ } -+ -+ if(passWordFlag){ -+ return findOutUser->setPassword(password,""); -+ } -+ -+ return true; -+ -+} -+ -+bool AccountsManager::editAUserType(const QString &userChangedName,bool accountType){ -+ UserAccount *findOutUser =findUserByName(userChangedName); -+ if (findOutUser == NULL){ -+ return false; -+ } -+ -+ return findOutUser->setAccountType((UserAccount::AccountType)accountType); -+ -+} -+ -+bool AccountsManager::editAUserAutoLogin(const QString &userChangedName,const QString &userName,bool userAutoLogin){ -+ UserAccount *findOutUser =findUserByName(userChangedName); -+ if (findOutUser == NULL){ -+ return false; -+ } -+ -+ // findOutUser->setUserName(userName); -+ -+ GError **error = NULL; -+ g_autoptr(GKeyFile) keyfile = NULL; -+ g_autofree gchar *data = NULL; -+ gboolean result; -+ -+ keyfile = g_key_file_new (); -+ if (!g_key_file_load_from_file (keyfile, -+ PATH_SDDM, -+ G_KEY_FILE_KEEP_COMMENTS, -+ error)) { -+ return false; -+ } -+ -+ if(userAutoLogin) { -+ g_key_file_set_string (keyfile, "Autologin", "User", userName.toLocal8Bit().data()); -+ }else{ -+ g_key_file_set_string (keyfile, "Autologin", "User", ""); -+ } -+ -+ data = g_key_file_to_data (keyfile, NULL, NULL); -+ result = g_file_set_contents (PATH_SDDM, data, -1, error); -+ -+ if(result) -+ { -+ findOutUser->setAutomaticLogin(userAutoLogin); -+ } -+ -+ return true; -+ -+} -+ -+bool AccountsManager::editAUserIcon(const QString &userChangedName,const QString &fileName){ -+ UserAccount *findOutUser =findUserByName(userChangedName); -+ if (findOutUser == NULL){ -+ return false; -+ } -+ -+ if(findOutUser->setIconFileName(fileName)) { -+ return true; -+ } -+ return false; -+ -+} -+ -+ - /*! - Creates a new \a accountType type user account whose name is \a userName, - real name is \a fullName. -@@ -259,15 +397,15 @@ bool AccountsManager::createUser(const Q - UserAccount::AccountType accountType) - { - Q_D(AccountsManager); -- -+ - QDBusPendingReply reply = d->interface->CreateUser(userName, fullName, accountType); -+ reply.waitForFinished(); - if (reply.isError()) { - QDBusError error = reply.error(); - qWarning("Couldn't create user %s: %s", userName.toUtf8().constData(), - error.errorString(error.type()).toUtf8().constData()); - return false; - } -- - return true; - } - -@@ -278,11 +416,12 @@ bool AccountsManager::createUser(const Q - \param removeFiles If true all files owned by the user will be removed. - \return whether the user was deleted successfully. - */ --bool AccountsManager::deleteUser(uid_t uid, bool removeFiles) -+bool AccountsManager::deleteUser(qlonglong uid, bool removeFiles) - { - Q_D(AccountsManager); - - QDBusPendingReply reply = d->interface->DeleteUser(uid, removeFiles); -+ reply.waitForFinished(); - if (reply.isError()) { - QDBusError error = reply.error(); - qWarning("Couldn't delete user %d: %s", uid, -diff -urNp qtaccountsservice-0.6.0old/src/accountsservice/accountsmanager.h qtaccountsservice-0.6.0/src/accountsservice/accountsmanager.h ---- qtaccountsservice-0.6.0old/src/accountsservice/accountsmanager.h 2025-01-06 17:10:39.995383010 +0800 -+++ qtaccountsservice-0.6.0/src/accountsservice/accountsmanager.h 2025-01-06 17:11:02.451380767 +0800 -@@ -55,11 +55,28 @@ public: - - Q_INVOKABLE QString findUserIconFile(const QString &userName); - -+ Q_INVOKABLE bool findAUserByName(const QString &checkUserName); -+ Q_INVOKABLE bool createAUser(const QString &userName,const QString &fullName,bool accountType, -+ const QString &password,const QString &fileName,bool autoLogin); -+ -+ Q_INVOKABLE bool editAUser(const QString &userChangedName,const QString &userName,const QString &fullName,bool accountType, -+ bool passWordFlag,const QString &password,const QString &fileName,bool autoLogin); -+ -+ Q_INVOKABLE bool editAUserName(const QString &userChangedName,const QString &userName); -+ -+ Q_INVOKABLE bool editAUserPasswd(const QString &userChangedName,bool passWordFlag,const QString &password); -+ -+ Q_INVOKABLE bool editAUserType(const QString &userChangedName,bool accountType); -+ -+ Q_INVOKABLE bool editAUserAutoLogin(const QString &userChangedName,const QString &userName,bool userAutoLogin); -+ -+ Q_INVOKABLE bool editAUserIcon(const QString &userChangedName,const QString &fileName); -+ - bool createUser(const QString &userName, - const QString &fullName, - UserAccount::AccountType accountType); - -- bool deleteUser(uid_t uid, bool removeFiles); -+ Q_INVOKABLE bool deleteUser(qlonglong uid, bool removeFiles); - bool deleteUser(UserAccount *account, bool removeFiles); - - Q_SIGNALS: -diff -urNp qtaccountsservice-0.6.0old/src/accountsservice/CMakeLists.txt qtaccountsservice-0.6.0/src/accountsservice/CMakeLists.txt ---- qtaccountsservice-0.6.0old/src/accountsservice/CMakeLists.txt 2025-01-06 17:10:39.978383012 +0800 -+++ qtaccountsservice-0.6.0/src/accountsservice/CMakeLists.txt 2025-01-06 17:11:02.451380767 +0800 -@@ -12,6 +12,8 @@ include_directories( - ${CMAKE_SOURCE_DIR}/headers - ${CMAKE_BINARY_DIR}/headers - ) -+include_directories("/usr/include/glib-2.0/") -+include_directories("/usr/lib64/glib-2.0/include/") - - set(SOURCES - accountsmanager.cpp -@@ -40,6 +42,7 @@ target_link_libraries(QtAccountsService - Qt5::Core - Qt5::DBus - Qt5::Gui -+ glib-2.0 - ) - - set(QTACCOUNTSSERVICE_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}/QtAccountsService") -diff -urNp qtaccountsservice-0.6.0old/src/accountsservice/useraccount.cpp qtaccountsservice-0.6.0/src/accountsservice/useraccount.cpp ---- qtaccountsservice-0.6.0old/src/accountsservice/useraccount.cpp 2025-01-06 17:10:40.003383009 +0800 -+++ qtaccountsservice-0.6.0/src/accountsservice/useraccount.cpp 2025-01-06 17:11:02.452380767 +0800 -@@ -30,7 +30,9 @@ - #include - #include - #include -+#include - -+#define PATH_SDDM "/etc/sddm.conf" - namespace QtAccountsService { - - /* -@@ -67,6 +69,7 @@ UserAccount::UserAccount() - QDBusConnection::systemBus(), - this); - connect(d_ptr->user, SIGNAL(Changed()), this, SIGNAL(accountChanged())); -+ readConfigStr(); - } - - /*! -@@ -85,6 +88,7 @@ UserAccount::UserAccount(uid_t uid) - QDBusConnection::systemBus(), - this); - connect(d_ptr->user, SIGNAL(Changed()), this, SIGNAL(accountChanged())); -+ readConfigStr(); - } - - /*! -@@ -102,6 +106,18 @@ UserAccount::UserAccount(const QString & - QDBusConnection::systemBus(), - this); - connect(d_ptr->user, SIGNAL(Changed()), this, SIGNAL(accountChanged())); -+ readConfigStr(); -+} -+ -+void UserAccount::readConfigStr(){ -+ cfgPath = "/etc/sddm.conf"; -+ QFile readFile(cfgPath); -+ if(readFile.open(QIODevice::ReadOnly|QIODevice::Text)) -+ { -+ QTextStream stream(&readFile); -+ strAll=stream.readAll(); -+ } -+ readFile.close(); - } - - /*! -@@ -112,6 +128,81 @@ UserAccount::~UserAccount() - delete d_ptr; - } - -+ -+/*auto-login*/ -+ -+bool UserAccount::writeConf(QString Name) -+{ -+ QFile writeFile(cfgPath); -+ QString tempStr; -+ bool setAutoLogFlage=false; -+ if(writeFile.open(QIODevice::WriteOnly|QIODevice::Text)) -+ { -+ QTextStream stream(&writeFile); -+ strList=strAll.split("\n"); -+ for(int i=0;iuser->SetAccountType((int)type); -+ QDBusPendingReply reply = d->user->SetAccountType((int)type); -+ reply.waitForFinished(); -+ if (reply.isError()) { -+ QDBusError error = reply.error(); -+ qWarning("Couldn't change user type: %s", -+ error.errorString(error.type()).toUtf8().constData()); -+ if(error.errorString(error.type()).contains("other")) { -+ return false; -+ } -+ } - emit accountTypeChanged(); -+ return true; - } - - /*! -@@ -198,8 +299,32 @@ void UserAccount::setLocked(bool locked) - */ - bool UserAccount::automaticLogin() const - { -- Q_D(const UserAccount); -- return d->user->automaticLogin(); -+ // Q_D(const UserAccount); -+ // return d->user->automaticLogin(); -+ -+ g_autoptr(GKeyFile) keyfile = NULL; -+ GError *local_error = NULL; -+ gchar *name = NULL; -+ GError **error = NULL; -+ -+ keyfile = g_key_file_new (); -+ if (!g_key_file_load_from_file (keyfile, -+ PATH_SDDM, -+ G_KEY_FILE_KEEP_COMMENTS, -+ error)) { -+ return FALSE; -+ } -+ -+ name = g_key_file_get_string (keyfile, "Autologin", "User", &local_error); -+ if (local_error) { -+ g_propagate_error (error, local_error); -+ return FALSE; -+ } -+ if(name != NULL && userName() == QString(QLatin1String(name))) { -+ return true; -+ } -+ -+ return false; - } - - /*! -@@ -210,8 +335,8 @@ bool UserAccount::automaticLogin() const - */ - void UserAccount::setAutomaticLogin(bool automaticLogin) - { -- Q_D(UserAccount); -- d->user->SetAutomaticLogin(automaticLogin); -+ // Q_D(UserAccount); -+ // d->user->SetAutomaticLogin(automaticLogin); - emit automaticLoginChanged(); - } - -@@ -295,12 +420,22 @@ QString UserAccount::userName() const - - \param userName The new user name. - */ --void UserAccount::setUserName(const QString &userName) -+bool UserAccount::setUserName(const QString &userName) - { - Q_D(UserAccount); -- d->user->SetUserName(userName); -+ QDBusPendingReply reply = d->user->SetUserName(userName); -+ reply.waitForFinished(); -+ if (reply.isError()) { -+ QDBusError error = reply.error(); -+ qWarning("Couldn't change user %s: %s", userName.toUtf8().constData(), -+ error.errorString(error.type()).toUtf8().constData()); -+ if(error.errorString(error.type()).contains("other")) { -+ return false; -+ } -+ } - emit userNameChanged(); - emit displayNameChanged(); -+ return true; - } - - /*! -@@ -391,11 +526,21 @@ QString UserAccount::iconFileName() cons - - \param fileName Picture absolute path. - */ --void UserAccount::setIconFileName(const QString &fileName) -+bool UserAccount::setIconFileName(const QString &fileName) - { - Q_D(UserAccount); -- d->user->SetIconFile(fileName); -+ QDBusPendingReply reply = d->user->SetIconFile(fileName); -+ reply.waitForFinished(); -+ if (reply.isError()) { -+ QDBusError error = reply.error(); -+ qWarning("Couldn't change user icon: %s", -+ error.errorString(error.type()).toUtf8().constData()); -+ if(error.errorString(error.type()).contains("other")) { -+ return false; -+ } -+ } - emit iconFileNameChanged(); -+ return true; - } - - /*! -@@ -488,10 +633,20 @@ void UserAccount::setXSession(const QStr - \param password. - \param hint passwordHint. - */ --void UserAccount::setPassword(const QString &password, const QString &hint) -+bool UserAccount::setPassword(const QString &password, const QString &hint) - { - Q_D(UserAccount); -- d->user->SetPassword(password, hint); -+ QDBusPendingReply reply = d->user->SetPassword(password, hint); -+ reply.waitForFinished(); -+ if (reply.isError()) { -+ QDBusError error = reply.error(); -+ qWarning("Couldn't change user password: %s", -+ error.errorString(error.type()).toUtf8().constData()); -+ if(error.errorString(error.type()).contains("other")) { -+ return false; -+ } -+ } -+ return true; - } - - } -diff -urNp qtaccountsservice-0.6.0old/src/accountsservice/useraccount.h qtaccountsservice-0.6.0/src/accountsservice/useraccount.h ---- qtaccountsservice-0.6.0old/src/accountsservice/useraccount.h 2025-01-06 17:10:40.012383009 +0800 -+++ qtaccountsservice-0.6.0/src/accountsservice/useraccount.h 2025-01-06 17:11:02.452380767 +0800 -@@ -29,7 +29,9 @@ - - #include - #include -- -+#include -+#include -+#include - #include - - namespace QtAccountsService { -@@ -82,8 +84,12 @@ public: - uid_t userId() const; - gid_t groupId() const; - -- AccountType accountType() const; -- void setAccountType(AccountType type); -+ Q_INVOKABLE QString getAutoLoginUserName(); -+ Q_INVOKABLE bool setAutoLogin(QString); -+ Q_INVOKABLE bool cancelAutoLogin(); -+ -+ Q_INVOKABLE AccountType accountType() const; -+ bool setAccountType(AccountType type); - - bool isLocked() const; - void setLocked(bool locked); -@@ -105,7 +111,7 @@ public: - bool isSystemAccount() const; - - QString userName() const; -- void setUserName(const QString &userName); -+ bool setUserName(const QString &userName); - - QString realName() const; - void setRealName(const QString &realName); -@@ -119,7 +125,7 @@ public: - void setShell(const QString &shell); - - QString iconFileName() const; -- void setIconFileName(const QString &fileName); -+ bool setIconFileName(const QString &fileName); - - QString email() const; - void setEmail(const QString &email); -@@ -133,7 +139,7 @@ public: - QString xsession() const; - void setXSession(const QString &session); - -- void setPassword(const QString &password, const QString &hint = ""); -+ bool setPassword(const QString &password, const QString &hint = ""); - - Q_SIGNALS: - void accountChanged(); -@@ -158,7 +164,13 @@ protected: - private: - friend class AccountsManager; - friend class AccountsManagerPrivate; -- -+ QString autoLoginUserName; -+ QString strAll; -+ QString cfgPath; -+ QStringList strList; -+ bool writeConf(QString); -+ void readConfigStr(); -+ - Q_DECLARE_PRIVATE(UserAccount) - - UserAccount(const QString &objectPath); diff --git a/qt5-qtaccountsservice.spec b/qt5-qtaccountsservice.spec index 4f52de6..4327651 100644 --- a/qt5-qtaccountsservice.spec +++ b/qt5-qtaccountsservice.spec @@ -3,13 +3,12 @@ Name: qt5-%{qt_module} Summary: Qt5 - AccountService addon Version: 0.6.0 -Release: 13.3%{?dist} +Release: 12%{?dist} License: LGPLv2+ URL: https://github.com/hawaii-desktop/qtaccountsservice Source0: https://github.com/hawaii-desktop/qtaccountsservice/releases/download/v%{version}/%{qt_module}-%{version}.tar.gz -Patch1000: 01_add_usermanage_function.patch BuildRequires: pkgconfig(Qt5Core) BuildRequires: pkgconfig(Qt5Gui) BuildRequires: pkgconfig(Qt5DBus) @@ -69,18 +68,6 @@ make install/fast DESTDIR=%{buildroot} -C %{_target_platform} %changelog -* Tue Feb 02 2021 Wu Shangmin - 0.6.0-13.3 -- 修改设置用户头像鉴权方式为阻塞运行 - -* Thu Jan 28 2021 Wu Shangmin - 0.6.0-13.2 -- 修改鉴权方式为阻塞运行 - -* Wed Jan 20 2021 Wu Shangmin - 0.6.0-13.1 -- 修复用户无法设置自动登录问题 - -* Tue Dec 15 2020 Wu Shangmin - 0.6.0-13 -- 增加用户管理模块用户创建、用户编辑、用户删除、修改用户名、密码、用户类型、自动登录、头像等接口(1177、1178、1179、1180、1181) - * Thu Jan 30 2020 Fedora Release Engineering - 0.6.0-12 - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild -- Gitee From 0d655e9420a17dc0403b3b0bc32c67cd37bd4a1c Mon Sep 17 00:00:00 2001 From: Zhao zebin Date: Mon, 6 Jan 2025 18:25:57 +0800 Subject: [PATCH 3/3] add usermanager function Signed-off-by: Zhao zebin --- qt5-qtaccountsservice.spec | 14 +++++++++++++- qtaccountsservice-0.6.0.tar.gz | Bin 24346 -> 26380 bytes 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/qt5-qtaccountsservice.spec b/qt5-qtaccountsservice.spec index 4327651..fba49da 100644 --- a/qt5-qtaccountsservice.spec +++ b/qt5-qtaccountsservice.spec @@ -3,7 +3,7 @@ Name: qt5-%{qt_module} Summary: Qt5 - AccountService addon Version: 0.6.0 -Release: 12%{?dist} +Release: 13.3%{?dist} License: LGPLv2+ URL: https://github.com/hawaii-desktop/qtaccountsservice @@ -68,6 +68,18 @@ make install/fast DESTDIR=%{buildroot} -C %{_target_platform} %changelog +* Tue Feb 02 2021 Wu Shangmin - 0.6.0-13.3 +- 修改设置用户头像鉴权方式为阻塞运行 + +* Thu Jan 28 2021 Wu Shangmin - 0.6.0-13.2 +- 修改鉴权方式为阻塞运行 + +* Wed Jan 20 2021 Wu Shangmin - 0.6.0-13.1 +- 修复用户无法设置自动登录问题 + +* Tue Dec 15 2020 Wu Shangmin - 0.6.0-13 +- 增加用户管理模块用户创建、用户编辑、用户删除、修改用户名、密码、用户类型、自动登录、头像等接口(1177、1178、1179、1180、1181) + * Thu Jan 30 2020 Fedora Release Engineering - 0.6.0-12 - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild diff --git a/qtaccountsservice-0.6.0.tar.gz b/qtaccountsservice-0.6.0.tar.gz index 7cf4bbe0ca7bd5ec493a64ee0f3891e265c6e64e..7f7078e1f38039c2e2b661f03b17de998d477276 100644 GIT binary patch literal 26380 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 ZQC83DSv{*~_1wer{{!%6PVfLE0sw_m`ttw) -- Gitee