summaryrefslogtreecommitdiffstats
path: root/src/util/usertools.c
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2014-09-23 16:27:23 +0200
committerJakub Hrozek <jhrozek@redhat.com>2014-10-30 11:12:29 +0100
commitbb0970825fa8702d8b5dea94d9fc97c1041db338 (patch)
treebcd2d68511dafd836aaf95f7141ceb0695896c3d /src/util/usertools.c
parentb615258d6df8ad867cee99bdccffff05127fbc92 (diff)
downloadsssd-bb0970825fa8702d8b5dea94d9fc97c1041db338.tar.gz
sssd-bb0970825fa8702d8b5dea94d9fc97c1041db338.tar.xz
sssd-bb0970825fa8702d8b5dea94d9fc97c1041db338.zip
UTIL: Add a function to convert id_t from a number or a name
We need a custom function that would convert a numeric or string input into uid_t. The function will be used to drop privileges in servers and also in the PAC and IFP responders. Includes a unit test to test all code that changed as well as a fix for a misnamed attribute in the csv_to_uid_list function synopsis. Reviewed-by: Pavel Reichl <preichl@redhat.com> Reviewed-by: Simo Sorce <simo@redhat.com> (cherry picked from commit 5eda23c28c582b43b2a0a165b1750f3875c0fa84)
Diffstat (limited to 'src/util/usertools.c')
-rw-r--r--src/util/usertools.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/util/usertools.c b/src/util/usertools.c
index 809b42d67..a0b914e2f 100644
--- a/src/util/usertools.c
+++ b/src/util/usertools.c
@@ -23,8 +23,11 @@
#include <pcre.h>
#include <errno.h>
#include <talloc.h>
+#include <pwd.h>
+#include <grp.h>
#include "confdb/confdb.h"
+#include "util/strtonum.h"
#include "util/util.h"
#include "util/safe-format-string.h"
#include "responder/common/responder.h"
@@ -659,3 +662,44 @@ sss_get_domain_name(TALLOC_CTX *mem_ctx,
return user_name;
}
+
+errno_t sss_user_by_name_or_uid(const char *input, uid_t *_uid, gid_t *_gid)
+{
+ uid_t uid;
+ errno_t ret;
+ char *endptr;
+ struct passwd *pwd;
+
+ /* Try if it's an ID first */
+ errno = 0;
+ uid = strtouint32(input, &endptr, 10);
+ if (errno != 0 || *endptr != '\0') {
+ ret = errno;
+ if (ret == ERANGE) {
+ DEBUG(SSSDBG_OP_FAILURE,
+ "UID [%s] is out of range.\n", input);
+ return ret;
+ }
+
+ /* Nope, maybe a username? */
+ pwd = getpwnam(input);
+ } else {
+ pwd = getpwuid(uid);
+ }
+
+ if (pwd == NULL) {
+ DEBUG(SSSDBG_OP_FAILURE,
+ "[%s] is neither a valid UID nor a user name which could be "
+ "resolved by getpwnam().\n", input);
+ return EINVAL;
+ }
+
+ if (_uid) {
+ *_uid = pwd->pw_uid;
+ }
+
+ if (_gid) {
+ *_gid = pwd->pw_gid;
+ }
+ return EOK;
+}