diff --git a/glib/sailfishaccesscontrol.c b/glib/sailfishaccesscontrol.c index 18f3f9b..74854ad 100644 --- a/glib/sailfishaccesscontrol.c +++ b/glib/sailfishaccesscontrol.c @@ -24,6 +24,8 @@ #include #define NO_GROUPS GINT_TO_POINTER(1) +#define SAILFISH_SYSTEM_GROUP "sailfish-system" +#define SAILFISH_SYSTEM_PREFIX "sailfish-" GHashTable *s_groups = NULL; @@ -77,3 +79,26 @@ bool sailfish_access_control_hasgroup(uid_t uid, const char *group_name) return false; } + +uid_t sailfish_access_control_systemuser_uid() +{ + struct group *grp = getgrnam(SAILFISH_SYSTEM_GROUP); + struct passwd *pw; + int i; + uid_t uid = SAILFISH_UNDEFINED_UID; + + // Get system user UID using sailfish-system group + if (grp) { + for (i = 0; grp->gr_mem[i]; i++) { + if (strncmp(grp->gr_mem[i], SAILFISH_SYSTEM_PREFIX, strlen(SAILFISH_SYSTEM_PREFIX))) { + pw = getpwnam(grp->gr_mem[i]); + if (pw) { + uid = pw->pw_uid; + break; + } + } + } + } + + return uid; +} diff --git a/glib/sailfishaccesscontrol.h b/glib/sailfishaccesscontrol.h index 1a62160..65bdbbd 100644 --- a/glib/sailfishaccesscontrol.h +++ b/glib/sailfishaccesscontrol.h @@ -22,12 +22,15 @@ #include #include +#define SAILFISH_UNDEFINED_UID UINT_MAX + #ifdef __cplusplus extern "C" { #endif #pragma GCC visibility push(default) bool sailfish_access_control_hasgroup(uid_t uid, const char *group_name); +uid_t sailfish_access_control_systemuser_uid(); #pragma GCC visibility pop diff --git a/qt/accesscontrol.cpp b/qt/accesscontrol.cpp index 236c993..df68727 100644 --- a/qt/accesscontrol.cpp +++ b/qt/accesscontrol.cpp @@ -38,9 +38,20 @@ bool AccessControl::hasGroup(int uid, const QString groupName) case EffectiveUid: uid = geteuid(); break; + case UndefinedUid: + return false; + break; default: Q_ASSERT_X(uid >= 0, Q_FUNC_INFO, "Uid must be either of enum type Uid or non-negative."); break; } return sailfish_access_control_hasgroup(uid, groupName.toLatin1().data()); } + +int AccessControl::systemUserUid() +{ + uid_t uid = sailfish_access_control_systemuser_uid(); + if (uid == SAILFISH_UNDEFINED_UID) + return Uid::UndefinedUid; + return uid; +} diff --git a/qt/accesscontrol.h b/qt/accesscontrol.h index 3a75828..56ab4dd 100644 --- a/qt/accesscontrol.h +++ b/qt/accesscontrol.h @@ -32,11 +32,13 @@ class AccessControl : public QObject enum Uid : int { RealUid = -1, - EffectiveUid = -2 + EffectiveUid = -2, + UndefinedUid = -INT_MAX }; Q_ENUM(Uid) Q_INVOKABLE bool hasGroup(int uid, const QString groupName); + Q_INVOKABLE int systemUserUid(); }; } diff --git a/rpm/sailfish-access-control-qt5.spec b/rpm/sailfish-access-control-qt5.spec index 9b2a0c8..c029e3e 100644 --- a/rpm/sailfish-access-control-qt5.spec +++ b/rpm/sailfish-access-control-qt5.spec @@ -5,7 +5,7 @@ Release: 1 License: LGPLv2+ URL: https://git.sailfishos.org/mer-core/sailfish-access-control Source0: %{name}-%{version}.tar.bz2 -BuildRequires: pkgconfig(sailfishaccesscontrol) = %{version} +BuildRequires: pkgconfig(sailfishaccesscontrol) >= %{version} BuildRequires: pkgconfig(Qt5Core) BuildRequires: pkgconfig(Qt5Qml)