Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Close stale issues and PRs / stale (push) Successful in 13s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
266 lines
10 KiB
C++
266 lines
10 KiB
C++
/*
|
|
SPDX-FileCopyrightText: 2014 Alex Richardson <arichardson.kde@gmail.com>
|
|
|
|
SPDX-License-Identifier: LGPL-2.0-or-later
|
|
*/
|
|
#include <QDebug>
|
|
#include <QTest>
|
|
|
|
#include "kcoreaddons_debug.h"
|
|
#include "kuser.h"
|
|
|
|
namespace QTest
|
|
{
|
|
template<>
|
|
char *toString(const KUserId &id)
|
|
{
|
|
return qstrdup(id.toString().toLocal8Bit().data());
|
|
}
|
|
template<>
|
|
char *toString(const KGroupId &id)
|
|
{
|
|
return qstrdup(id.toString().toLocal8Bit().data());
|
|
}
|
|
}
|
|
|
|
class KUserTest : public QObject
|
|
{
|
|
Q_OBJECT
|
|
private Q_SLOTS:
|
|
void testKUser();
|
|
void testKUserGroup();
|
|
void testKUserId();
|
|
void testKGroupId();
|
|
};
|
|
|
|
static inline void printUserInfo(KUser user)
|
|
{
|
|
qCDebug(KCOREADDONS_DEBUG) << "Login name:" << user.loginName();
|
|
qCDebug(KCOREADDONS_DEBUG) << "Full name:" << user.property(KUser::FullName);
|
|
qCDebug(KCOREADDONS_DEBUG) << "User ID:" << user.userId().toString();
|
|
qCDebug(KCOREADDONS_DEBUG) << "Group ID:" << user.groupId().toString();
|
|
qCDebug(KCOREADDONS_DEBUG) << "Home dir:" << user.homeDir();
|
|
qCDebug(KCOREADDONS_DEBUG) << "Superuser:" << user.isSuperUser();
|
|
qCDebug(KCOREADDONS_DEBUG) << "Shell: " << user.shell();
|
|
qCDebug(KCOREADDONS_DEBUG) << "Face icon path:" << user.faceIconPath();
|
|
qCDebug(KCOREADDONS_DEBUG) << "Groups:" << user.groupNames();
|
|
qCDebug(KCOREADDONS_DEBUG);
|
|
}
|
|
|
|
void KUserTest::testKUser()
|
|
{
|
|
KUser user(KUser::UseRealUserID);
|
|
KUser effectiveUser(KUser::UseRealUserID);
|
|
QVERIFY(user.isValid());
|
|
QVERIFY(effectiveUser.isValid());
|
|
QCOMPARE(user, effectiveUser); // should be the same, no suid
|
|
QVERIFY(user.groupId().isValid());
|
|
QCOMPARE(user.groupId(), KGroupId::currentGroupId());
|
|
QVERIFY(!user.groups().isEmpty()); // user must be in at least one group
|
|
QVERIFY(!user.groupNames().isEmpty()); // user must be in at least one group
|
|
QCOMPARE(user.groups().size(), user.groupNames().size());
|
|
|
|
QStringList allUserNames = KUser::allUserNames();
|
|
QList<KUser> allUsers = KUser::allUsers();
|
|
QVERIFY(!allUserNames.isEmpty());
|
|
QVERIFY(!allUsers.isEmpty());
|
|
QCOMPARE(allUsers.size(), allUserNames.size());
|
|
// check that the limiting works
|
|
QCOMPARE(user.groups(1).size(), 1);
|
|
QCOMPARE(user.groupNames(1).size(), 1);
|
|
qCDebug(KCOREADDONS_DEBUG) << "All users: " << allUserNames;
|
|
// check that the limiting works
|
|
QCOMPARE(KUser::allUserNames(1).size(), 1);
|
|
QCOMPARE(KUser::allUsers(1).size(), 1);
|
|
// We can't test the KUser properties, since they differ on each system
|
|
// instead just print them all out, this can be verified by the person running the test
|
|
printUserInfo(user);
|
|
#if 0 // enable this if you think that KUser might not be working correctly
|
|
Q_FOREACH (const KUser &u, allUsers) {
|
|
printUserInfo(u);
|
|
}
|
|
#endif
|
|
|
|
// test operator==
|
|
KUser invalidKUser = KUser(KUserId());
|
|
QVERIFY(invalidKUser != invalidKUser); // invalid never equal
|
|
QVERIFY(invalidKUser != user);
|
|
QVERIFY(user != invalidKUser); // now test the other way around
|
|
QCOMPARE(user, user);
|
|
|
|
// make sure we don't crash when accessing properties of an invalid instance
|
|
QCOMPARE(invalidKUser.faceIconPath(), QString());
|
|
#if KCOREADDONS_ENABLE_DEPRECATED_SINCE(5, 0)
|
|
QCOMPARE(invalidKUser.fullName(), QString());
|
|
#endif
|
|
QCOMPARE(invalidKUser.groupId(), KGroupId());
|
|
invalidKUser.groupNames(); // could be empty, or "nogroup", so no checks here
|
|
invalidKUser.groups(); // same as above
|
|
QCOMPARE(invalidKUser.homeDir(), QString());
|
|
QCOMPARE(invalidKUser.isSuperUser(), false);
|
|
QCOMPARE(invalidKUser.loginName(), QString());
|
|
QCOMPARE(invalidKUser.shell(), QString());
|
|
QCOMPARE(invalidKUser.userId(), KUserId());
|
|
QCOMPARE(invalidKUser.userId(), KUserId());
|
|
QCOMPARE(invalidKUser.property(KUser::RoomNumber), QVariant());
|
|
}
|
|
|
|
void KUserTest::testKUserGroup()
|
|
{
|
|
KUserGroup group(KUser::UseRealUserID);
|
|
KUserGroup effectiveUser(KUser::UseEffectiveUID);
|
|
QVERIFY(group.isValid());
|
|
QVERIFY(effectiveUser.isValid());
|
|
QCOMPARE(group, effectiveUser); // should be the same, no suid
|
|
#ifdef Q_OS_WIN
|
|
// on Windows the special group "None" has no members (often the only group that exists)
|
|
if (group.name() != QLatin1String("None")) {
|
|
#else
|
|
{
|
|
#endif
|
|
QStringList groupUserNames = group.userNames();
|
|
QList<KUser> groupUsers = group.users();
|
|
QVERIFY(!groupUsers.isEmpty()); // group must have at least one user (the current user)
|
|
QVERIFY(!groupUserNames.isEmpty()); // group must have at least one user (the current user)
|
|
QCOMPARE(groupUsers.size(), groupUserNames.size());
|
|
// check that the limiting works
|
|
QCOMPARE(group.users(1).size(), 1);
|
|
QCOMPARE(group.userNames(1).size(), 1);
|
|
}
|
|
|
|
QStringList allGroupNames = KUserGroup::allGroupNames();
|
|
QList<KUserGroup> allGroups = KUserGroup::allGroups();
|
|
QVERIFY(!allGroupNames.isEmpty());
|
|
QVERIFY(!allGroups.isEmpty());
|
|
QCOMPARE(allGroups.size(), allGroupNames.size());
|
|
qCDebug(KCOREADDONS_DEBUG) << "All groups: " << allGroupNames;
|
|
// check that the limiting works
|
|
QCOMPARE(KUserGroup::allGroupNames(1).size(), 1);
|
|
QCOMPARE(KUserGroup::allGroups(1).size(), 1);
|
|
// We can't test the KUser properties, since they differ on each system
|
|
// instead just print them all out, this can be verified by the person running the test
|
|
qCDebug(KCOREADDONS_DEBUG).nospace() << "Current group: " << group.name() << ", group ID =" << group.groupId().toString()
|
|
<< ", members = " << group.userNames();
|
|
#if 0 // enable this if you think that KUser might not be working correctly
|
|
for (int i = 0; i < allGroups.size(); ++i) {
|
|
qDebug().nospace() << "Group " << i << ": name = " << allGroups[i].name()
|
|
<< ", group ID =" << allGroups[i].groupId().toString();
|
|
qDebug() << allGroups[i].name() << "members:" << allGroups[i].userNames();
|
|
}
|
|
#endif
|
|
// test operator==
|
|
KUserGroup invalidKUserGroup = KUserGroup(KGroupId());
|
|
QVERIFY(invalidKUserGroup != invalidKUserGroup); // invalid never equal
|
|
QVERIFY(invalidKUserGroup != group);
|
|
QVERIFY(group != invalidKUserGroup); // now test the other way around
|
|
QCOMPARE(group, group);
|
|
|
|
// make sure we don't crash when accessing an invalid KUserGroup
|
|
QCOMPARE(invalidKUserGroup.groupId(), KGroupId());
|
|
invalidKUserGroup.name(); // could be empty, or "nogroup", so no checks here
|
|
QCOMPARE(invalidKUserGroup.userNames(), QStringList());
|
|
QCOMPARE(invalidKUserGroup.users(), QList<KUser>());
|
|
}
|
|
|
|
void KUserTest::testKUserId()
|
|
{
|
|
// make sure KUser::currentUserId() and KUser::curretEffectiveUserId() work
|
|
KUserId currentUser = KUserId::currentUserId();
|
|
QVERIFY(currentUser.isValid());
|
|
KUserId currentEffectiveUser = KUserId::currentEffectiveUserId();
|
|
QVERIFY(currentEffectiveUser.isValid());
|
|
// these should be the same since this is not a setuid program
|
|
QCOMPARE(currentUser, currentEffectiveUser);
|
|
|
|
KUser kuser(currentUser);
|
|
// now get the same user from his name
|
|
QString userName = kuser.loginName();
|
|
qDebug("Current user: %s, id: %s", qPrintable(userName), qPrintable(currentUser.toString()));
|
|
QVERIFY(!userName.isEmpty());
|
|
KUserId currentUserFromStr = KUserId::fromName(userName);
|
|
QVERIFY(currentUserFromStr.isValid());
|
|
KUserId currentUserCopyFromKUser = kuser.userId();
|
|
QVERIFY(currentUserCopyFromKUser.isValid());
|
|
KUserId invalid;
|
|
QVERIFY(!invalid.isValid());
|
|
#ifdef Q_OS_WIN
|
|
KUserId invalid2(nullptr);
|
|
#else
|
|
KUserId invalid2(-1);
|
|
#endif
|
|
QVERIFY(!invalid2.isValid());
|
|
// I guess it is safe to assume no user with this name exists
|
|
KUserId invalid3 = KUserId::fromName(QStringLiteral("This_user_does_not_exist"));
|
|
QVERIFY(!invalid3.isValid());
|
|
|
|
// check comparison
|
|
QCOMPARE(invalid, KUserId());
|
|
QCOMPARE(invalid, invalid2);
|
|
QCOMPARE(invalid, invalid3);
|
|
QCOMPARE(currentUser, currentUserFromStr);
|
|
QCOMPARE(currentUser, currentEffectiveUser);
|
|
QCOMPARE(currentUser, currentUserCopyFromKUser);
|
|
QVERIFY(currentUser != invalid);
|
|
QVERIFY(currentUser != invalid2);
|
|
QVERIFY(currentUser != invalid3);
|
|
QVERIFY(invalid != currentUser);
|
|
// Copy constructor and assignment
|
|
KUserId currentUserCopy = currentUser;
|
|
QCOMPARE(currentUser, currentUserCopy);
|
|
QCOMPARE(currentUser, KUserId(currentUser));
|
|
QCOMPARE(currentEffectiveUser, KUserId(currentUser));
|
|
}
|
|
|
|
void KUserTest::testKGroupId()
|
|
{
|
|
// make sure KGroup::currentGroupId() and KGroup::curretEffectiveGroupId() work
|
|
KGroupId currentGroup = KGroupId::currentGroupId();
|
|
QVERIFY(currentGroup.isValid());
|
|
KGroupId currentEffectiveGroup = KGroupId::currentEffectiveGroupId();
|
|
QVERIFY(currentEffectiveGroup.isValid());
|
|
// these should be the same since this is not a setuid program
|
|
QCOMPARE(currentGroup, currentEffectiveGroup);
|
|
|
|
// now get the same Group from his name
|
|
KUserGroup kuserGroup(currentGroup);
|
|
QString groupName = kuserGroup.name();
|
|
qDebug("Current group: %s, id: %s", qPrintable(groupName), qPrintable(currentGroup.toString()));
|
|
QVERIFY(!groupName.isEmpty());
|
|
KGroupId currentGroupFromStr = KGroupId::fromName(groupName);
|
|
QVERIFY(currentGroupFromStr.isValid());
|
|
KGroupId currentGroupCopyFromKUserGroup = kuserGroup.groupId();
|
|
QVERIFY(currentGroupCopyFromKUserGroup.isValid());
|
|
KGroupId invalid;
|
|
QVERIFY(!invalid.isValid());
|
|
#ifdef Q_OS_WIN
|
|
KGroupId invalid2(nullptr);
|
|
#else
|
|
KGroupId invalid2(-1);
|
|
#endif
|
|
QVERIFY(!invalid2.isValid());
|
|
// I guess it is safe to assume no Group with this name exists
|
|
KGroupId invalid3 = KGroupId::fromName(QStringLiteral("This_Group_does_not_exist"));
|
|
QVERIFY(!invalid3.isValid());
|
|
|
|
// check comparison
|
|
QCOMPARE(invalid, KGroupId());
|
|
QCOMPARE(invalid, invalid2);
|
|
QCOMPARE(invalid, invalid3);
|
|
QCOMPARE(currentGroup, currentGroupFromStr);
|
|
QCOMPARE(currentGroup, currentEffectiveGroup);
|
|
QCOMPARE(currentGroup, currentGroupCopyFromKUserGroup);
|
|
QVERIFY(invalid != currentGroup);
|
|
QVERIFY(currentGroup != invalid);
|
|
QVERIFY(currentGroup != invalid2);
|
|
QVERIFY(currentGroup != invalid3);
|
|
// Copy constructor and assignment
|
|
KGroupId currentGroupCopy = currentGroup;
|
|
QCOMPARE(currentGroup, currentGroupCopy);
|
|
QCOMPARE(currentGroup, KGroupId(currentGroup));
|
|
QCOMPARE(currentEffectiveGroup, KGroupId(currentGroup));
|
|
}
|
|
|
|
QTEST_MAIN(KUserTest)
|
|
|
|
#include "kusertest.moc"
|