kusertest.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. /*
  2. SPDX-FileCopyrightText: 2014 Alex Richardson <arichardson.kde@gmail.com>
  3. SPDX-License-Identifier: LGPL-2.0-or-later
  4. */
  5. #include <QDebug>
  6. #include <QTest>
  7. #include "kcoreaddons_debug.h"
  8. #include "kuser.h"
  9. namespace QTest
  10. {
  11. template<>
  12. char *toString(const KUserId &id)
  13. {
  14. return qstrdup(id.toString().toLocal8Bit().data());
  15. }
  16. template<>
  17. char *toString(const KGroupId &id)
  18. {
  19. return qstrdup(id.toString().toLocal8Bit().data());
  20. }
  21. }
  22. class KUserTest : public QObject
  23. {
  24. Q_OBJECT
  25. private Q_SLOTS:
  26. void testKUser();
  27. void testKUserGroup();
  28. void testKUserId();
  29. void testKGroupId();
  30. };
  31. static inline void printUserInfo(KUser user)
  32. {
  33. qCDebug(KCOREADDONS_DEBUG) << "Login name:" << user.loginName();
  34. qCDebug(KCOREADDONS_DEBUG) << "Full name:" << user.property(KUser::FullName);
  35. qCDebug(KCOREADDONS_DEBUG) << "User ID:" << user.userId().toString();
  36. qCDebug(KCOREADDONS_DEBUG) << "Group ID:" << user.groupId().toString();
  37. qCDebug(KCOREADDONS_DEBUG) << "Home dir:" << user.homeDir();
  38. qCDebug(KCOREADDONS_DEBUG) << "Superuser:" << user.isSuperUser();
  39. qCDebug(KCOREADDONS_DEBUG) << "Shell: " << user.shell();
  40. qCDebug(KCOREADDONS_DEBUG) << "Face icon path:" << user.faceIconPath();
  41. qCDebug(KCOREADDONS_DEBUG) << "Groups:" << user.groupNames();
  42. qCDebug(KCOREADDONS_DEBUG);
  43. }
  44. void KUserTest::testKUser()
  45. {
  46. KUser user(KUser::UseRealUserID);
  47. KUser effectiveUser(KUser::UseRealUserID);
  48. QVERIFY(user.isValid());
  49. QVERIFY(effectiveUser.isValid());
  50. QCOMPARE(user, effectiveUser); // should be the same, no suid
  51. QVERIFY(user.groupId().isValid());
  52. QCOMPARE(user.groupId(), KGroupId::currentGroupId());
  53. QVERIFY(!user.groups().isEmpty()); // user must be in at least one group
  54. QVERIFY(!user.groupNames().isEmpty()); // user must be in at least one group
  55. QCOMPARE(user.groups().size(), user.groupNames().size());
  56. QStringList allUserNames = KUser::allUserNames();
  57. QList<KUser> allUsers = KUser::allUsers();
  58. QVERIFY(!allUserNames.isEmpty());
  59. QVERIFY(!allUsers.isEmpty());
  60. QCOMPARE(allUsers.size(), allUserNames.size());
  61. // check that the limiting works
  62. QCOMPARE(user.groups(1).size(), 1);
  63. QCOMPARE(user.groupNames(1).size(), 1);
  64. qCDebug(KCOREADDONS_DEBUG) << "All users: " << allUserNames;
  65. // check that the limiting works
  66. QCOMPARE(KUser::allUserNames(1).size(), 1);
  67. QCOMPARE(KUser::allUsers(1).size(), 1);
  68. // We can't test the KUser properties, since they differ on each system
  69. // instead just print them all out, this can be verified by the person running the test
  70. printUserInfo(user);
  71. #if 0 // enable this if you think that KUser might not be working correctly
  72. Q_FOREACH (const KUser &u, allUsers) {
  73. printUserInfo(u);
  74. }
  75. #endif
  76. // test operator==
  77. KUser invalidKUser = KUser(KUserId());
  78. QVERIFY(invalidKUser != invalidKUser); // invalid never equal
  79. QVERIFY(invalidKUser != user);
  80. QVERIFY(user != invalidKUser); // now test the other way around
  81. QCOMPARE(user, user);
  82. // make sure we don't crash when accessing properties of an invalid instance
  83. QCOMPARE(invalidKUser.faceIconPath(), QString());
  84. #if KCOREADDONS_ENABLE_DEPRECATED_SINCE(5, 0)
  85. QCOMPARE(invalidKUser.fullName(), QString());
  86. #endif
  87. QCOMPARE(invalidKUser.groupId(), KGroupId());
  88. invalidKUser.groupNames(); // could be empty, or "nogroup", so no checks here
  89. invalidKUser.groups(); // same as above
  90. QCOMPARE(invalidKUser.homeDir(), QString());
  91. QCOMPARE(invalidKUser.isSuperUser(), false);
  92. QCOMPARE(invalidKUser.loginName(), QString());
  93. QCOMPARE(invalidKUser.shell(), QString());
  94. QCOMPARE(invalidKUser.userId(), KUserId());
  95. QCOMPARE(invalidKUser.userId(), KUserId());
  96. QCOMPARE(invalidKUser.property(KUser::RoomNumber), QVariant());
  97. }
  98. void KUserTest::testKUserGroup()
  99. {
  100. KUserGroup group(KUser::UseRealUserID);
  101. KUserGroup effectiveUser(KUser::UseEffectiveUID);
  102. QVERIFY(group.isValid());
  103. QVERIFY(effectiveUser.isValid());
  104. QCOMPARE(group, effectiveUser); // should be the same, no suid
  105. #ifdef Q_OS_WIN
  106. // on Windows the special group "None" has no members (often the only group that exists)
  107. if (group.name() != QLatin1String("None")) {
  108. #else
  109. {
  110. #endif
  111. QStringList groupUserNames = group.userNames();
  112. QList<KUser> groupUsers = group.users();
  113. QVERIFY(!groupUsers.isEmpty()); // group must have at least one user (the current user)
  114. QVERIFY(!groupUserNames.isEmpty()); // group must have at least one user (the current user)
  115. QCOMPARE(groupUsers.size(), groupUserNames.size());
  116. // check that the limiting works
  117. QCOMPARE(group.users(1).size(), 1);
  118. QCOMPARE(group.userNames(1).size(), 1);
  119. }
  120. QStringList allGroupNames = KUserGroup::allGroupNames();
  121. QList<KUserGroup> allGroups = KUserGroup::allGroups();
  122. QVERIFY(!allGroupNames.isEmpty());
  123. QVERIFY(!allGroups.isEmpty());
  124. QCOMPARE(allGroups.size(), allGroupNames.size());
  125. qCDebug(KCOREADDONS_DEBUG) << "All groups: " << allGroupNames;
  126. // check that the limiting works
  127. QCOMPARE(KUserGroup::allGroupNames(1).size(), 1);
  128. QCOMPARE(KUserGroup::allGroups(1).size(), 1);
  129. // We can't test the KUser properties, since they differ on each system
  130. // instead just print them all out, this can be verified by the person running the test
  131. qCDebug(KCOREADDONS_DEBUG).nospace() << "Current group: " << group.name() << ", group ID =" << group.groupId().toString()
  132. << ", members = " << group.userNames();
  133. #if 0 // enable this if you think that KUser might not be working correctly
  134. for (int i = 0; i < allGroups.size(); ++i) {
  135. qDebug().nospace() << "Group " << i << ": name = " << allGroups[i].name()
  136. << ", group ID =" << allGroups[i].groupId().toString();
  137. qDebug() << allGroups[i].name() << "members:" << allGroups[i].userNames();
  138. }
  139. #endif
  140. // test operator==
  141. KUserGroup invalidKUserGroup = KUserGroup(KGroupId());
  142. QVERIFY(invalidKUserGroup != invalidKUserGroup); // invalid never equal
  143. QVERIFY(invalidKUserGroup != group);
  144. QVERIFY(group != invalidKUserGroup); // now test the other way around
  145. QCOMPARE(group, group);
  146. // make sure we don't crash when accessing an invalid KUserGroup
  147. QCOMPARE(invalidKUserGroup.groupId(), KGroupId());
  148. invalidKUserGroup.name(); // could be empty, or "nogroup", so no checks here
  149. QCOMPARE(invalidKUserGroup.userNames(), QStringList());
  150. QCOMPARE(invalidKUserGroup.users(), QList<KUser>());
  151. }
  152. void KUserTest::testKUserId()
  153. {
  154. // make sure KUser::currentUserId() and KUser::curretEffectiveUserId() work
  155. KUserId currentUser = KUserId::currentUserId();
  156. QVERIFY(currentUser.isValid());
  157. KUserId currentEffectiveUser = KUserId::currentEffectiveUserId();
  158. QVERIFY(currentEffectiveUser.isValid());
  159. // these should be the same since this is not a setuid program
  160. QCOMPARE(currentUser, currentEffectiveUser);
  161. KUser kuser(currentUser);
  162. // now get the same user from his name
  163. QString userName = kuser.loginName();
  164. qDebug("Current user: %s, id: %s", qPrintable(userName), qPrintable(currentUser.toString()));
  165. QVERIFY(!userName.isEmpty());
  166. KUserId currentUserFromStr = KUserId::fromName(userName);
  167. QVERIFY(currentUserFromStr.isValid());
  168. KUserId currentUserCopyFromKUser = kuser.userId();
  169. QVERIFY(currentUserCopyFromKUser.isValid());
  170. KUserId invalid;
  171. QVERIFY(!invalid.isValid());
  172. #ifdef Q_OS_WIN
  173. KUserId invalid2(nullptr);
  174. #else
  175. KUserId invalid2(-1);
  176. #endif
  177. QVERIFY(!invalid2.isValid());
  178. // I guess it is safe to assume no user with this name exists
  179. KUserId invalid3 = KUserId::fromName(QStringLiteral("This_user_does_not_exist"));
  180. QVERIFY(!invalid3.isValid());
  181. // check comparison
  182. QCOMPARE(invalid, KUserId());
  183. QCOMPARE(invalid, invalid2);
  184. QCOMPARE(invalid, invalid3);
  185. QCOMPARE(currentUser, currentUserFromStr);
  186. QCOMPARE(currentUser, currentEffectiveUser);
  187. QCOMPARE(currentUser, currentUserCopyFromKUser);
  188. QVERIFY(currentUser != invalid);
  189. QVERIFY(currentUser != invalid2);
  190. QVERIFY(currentUser != invalid3);
  191. QVERIFY(invalid != currentUser);
  192. // Copy constructor and assignment
  193. KUserId currentUserCopy = currentUser;
  194. QCOMPARE(currentUser, currentUserCopy);
  195. QCOMPARE(currentUser, KUserId(currentUser));
  196. QCOMPARE(currentEffectiveUser, KUserId(currentUser));
  197. }
  198. void KUserTest::testKGroupId()
  199. {
  200. // make sure KGroup::currentGroupId() and KGroup::curretEffectiveGroupId() work
  201. KGroupId currentGroup = KGroupId::currentGroupId();
  202. QVERIFY(currentGroup.isValid());
  203. KGroupId currentEffectiveGroup = KGroupId::currentEffectiveGroupId();
  204. QVERIFY(currentEffectiveGroup.isValid());
  205. // these should be the same since this is not a setuid program
  206. QCOMPARE(currentGroup, currentEffectiveGroup);
  207. // now get the same Group from his name
  208. KUserGroup kuserGroup(currentGroup);
  209. QString groupName = kuserGroup.name();
  210. qDebug("Current group: %s, id: %s", qPrintable(groupName), qPrintable(currentGroup.toString()));
  211. QVERIFY(!groupName.isEmpty());
  212. KGroupId currentGroupFromStr = KGroupId::fromName(groupName);
  213. QVERIFY(currentGroupFromStr.isValid());
  214. KGroupId currentGroupCopyFromKUserGroup = kuserGroup.groupId();
  215. QVERIFY(currentGroupCopyFromKUserGroup.isValid());
  216. KGroupId invalid;
  217. QVERIFY(!invalid.isValid());
  218. #ifdef Q_OS_WIN
  219. KGroupId invalid2(nullptr);
  220. #else
  221. KGroupId invalid2(-1);
  222. #endif
  223. QVERIFY(!invalid2.isValid());
  224. // I guess it is safe to assume no Group with this name exists
  225. KGroupId invalid3 = KGroupId::fromName(QStringLiteral("This_Group_does_not_exist"));
  226. QVERIFY(!invalid3.isValid());
  227. // check comparison
  228. QCOMPARE(invalid, KGroupId());
  229. QCOMPARE(invalid, invalid2);
  230. QCOMPARE(invalid, invalid3);
  231. QCOMPARE(currentGroup, currentGroupFromStr);
  232. QCOMPARE(currentGroup, currentEffectiveGroup);
  233. QCOMPARE(currentGroup, currentGroupCopyFromKUserGroup);
  234. QVERIFY(invalid != currentGroup);
  235. QVERIFY(currentGroup != invalid);
  236. QVERIFY(currentGroup != invalid2);
  237. QVERIFY(currentGroup != invalid3);
  238. // Copy constructor and assignment
  239. KGroupId currentGroupCopy = currentGroup;
  240. QCOMPARE(currentGroup, currentGroupCopy);
  241. QCOMPARE(currentGroup, KGroupId(currentGroup));
  242. QCOMPARE(currentEffectiveGroup, KGroupId(currentGroup));
  243. }
  244. QTEST_MAIN(KUserTest)
  245. #include "kusertest.moc"