summaryrefslogtreecommitdiffstats
path: root/dbus/dbus-userdb-util.c
diff options
context:
space:
mode:
Diffstat (limited to 'dbus/dbus-userdb-util.c')
-rw-r--r--dbus/dbus-userdb-util.c98
1 files changed, 77 insertions, 21 deletions
diff --git a/dbus/dbus-userdb-util.c b/dbus/dbus-userdb-util.c
index f75d1bc0..8361fcf3 100644
--- a/dbus/dbus-userdb-util.c
+++ b/dbus/dbus-userdb-util.c
@@ -1,10 +1,10 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* dbus-userdb-util.c Would be in dbus-userdb.c, but not used in libdbus
- *
+ *
* Copyright (C) 2003, 2004, 2005 Red Hat, Inc.
*
* Licensed under the Academic Free License version 2.1
- *
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -14,7 +14,7 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
@@ -25,7 +25,10 @@
#include "dbus-test.h"
#include "dbus-internals.h"
#include "dbus-protocol.h"
+#include "dbus-desktop-file.h"
#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
/**
* @addtogroup DBusInternalsUtils
@@ -35,7 +38,7 @@
/**
* Checks to see if the UID sent in is the console user
*
- * @param uid UID of person to check
+ * @param uid UID of person to check
* @param error return location for errors
* @returns #TRUE if the UID is the same as the console user and there are no errors
*/
@@ -44,11 +47,48 @@ _dbus_is_console_user (dbus_uid_t uid,
DBusError *error)
{
- DBusUserDatabase *db;
- const DBusUserInfo *info;
- dbus_bool_t result = FALSE;
+#if defined(HAVE_CONSOLEKIT_DATABASE)
+
+ DBusDesktopFile *f;
+ const char *section;
+ dbus_bool_t found = FALSE;
+ DBusString fn;
+ unsigned i = 0;
+
+ _dbus_string_init_const(&fn, DBUS_CONSOLEKIT_DATABASE);
+
+ f = _dbus_desktop_file_load(&fn, error);
+ if (!f)
+ return FALSE;
+
+ while ((section = _dbus_desktop_file_get_section(f, i++)))
+ {
+ const char *val;
+ char *e = NULL;
+ unsigned long console_uid;
+
+ if (strncmp(section, "Session ", 8))
+ continue;
+
+ if (!_dbus_desktop_file_get_raw(f, section, "uid", &val))
+ continue;
+
+ errno = 0;
+ console_uid = strtol(val, &e, 10);
+ if (errno != 0 || !e || *e != 0)
+ continue;
+
+ if (console_uid == uid)
+ {
+ found = TRUE;
+ break;
+ }
+ }
+
+ _dbus_desktop_file_free(f);
+ return found;
-#ifdef HAVE_CONSOLE_OWNER_FILE
+#elif defined(HAVE_CONSOLE_OWNER_FILE)
DBusString f;
DBusStat st;
@@ -74,7 +114,13 @@ _dbus_is_console_user (dbus_uid_t uid,
_dbus_string_free(&f);
-#endif /* HAVE_CONSOLE_OWNER_FILE */
+ return FALSE;
+
+#elif defined(HAVE_CONSOLE_AUTH_DIR)
+
+ DBusUserDatabase *db;
+ const DBusUserInfo *info;
+ dbus_bool_t result = FALSE;
_dbus_user_database_lock_system ();
@@ -101,6 +147,9 @@ _dbus_is_console_user (dbus_uid_t uid,
_dbus_user_database_unlock_system ();
return result;
+#else
+ return FALSE;
+#endif
}
/**
@@ -147,7 +196,7 @@ _dbus_get_group_id (const DBusString *groupname,
}
*gid = info->gid;
-
+
_dbus_user_database_unlock_system ();
return TRUE;
}
@@ -187,7 +236,7 @@ _dbus_get_user_id_and_primary_group (const DBusString *username,
*uid_p = info->uid;
if (gid_p)
*gid_p = info->primary_gid;
-
+
_dbus_user_database_unlock_system ();
return TRUE;
}
@@ -200,7 +249,7 @@ _dbus_get_user_id_and_primary_group (const DBusString *username,
*
* @param db the database
* @param gid the group ID or #DBUS_GID_UNSET
- * @param groupname group name or #NULL
+ * @param groupname group name or #NULL
* @param error error to fill in
* @returns the entry in the database
*/
@@ -246,7 +295,7 @@ _dbus_user_database_lookup_group (DBusUserDatabase *db,
else
_dbus_verbose ("No cache for groupname \"%s\"\n",
_dbus_string_get_const_data (groupname));
-
+
info = dbus_new0 (DBusGroupInfo, 1);
if (info == NULL)
{
@@ -293,7 +342,7 @@ _dbus_user_database_lookup_group (DBusUserDatabase *db,
dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
return NULL;
}
-
+
return info;
}
}
@@ -301,7 +350,7 @@ _dbus_user_database_lookup_group (DBusUserDatabase *db,
/**
* Gets the user information for the given group name,
- * returned group info should not be freed.
+ * returned group info should not be freed.
*
* @param db user database
* @param groupname the group name
@@ -321,7 +370,7 @@ _dbus_user_database_get_groupname (DBusUserDatabase *db,
/**
* Gets the user information for the given GID,
- * returned group info should not be freed.
+ * returned group info should not be freed.
*
* @param db user database
* @param gid the group ID
@@ -343,7 +392,7 @@ _dbus_user_database_get_gid (DBusUserDatabase *db,
/**
* Gets all groups corresponding to the given UID. Returns #FALSE
* if no memory, or user isn't known, but always initializes
- * group_ids to a NULL array.
+ * group_ids to a NULL array.
*
* @param uid the UID
* @param group_ids return location for array of group IDs
@@ -377,7 +426,7 @@ _dbus_groups_from_uid (dbus_uid_t uid,
}
_dbus_assert (info->uid == uid);
-
+
if (info->n_group_ids > 0)
{
*group_ids = dbus_new (dbus_gid_t, info->n_group_ids);
@@ -402,7 +451,7 @@ _dbus_groups_from_uid (dbus_uid_t uid,
/**
* Unit test for dbus-userdb.c.
- *
+ *
* @returns #TRUE on success.
*/
dbus_bool_t
@@ -413,12 +462,13 @@ _dbus_userdb_test (const char *test_data_dir)
dbus_uid_t uid;
unsigned long *group_ids;
int n_group_ids, i;
+ DBusError error;
if (!_dbus_username_from_current_process (&username))
_dbus_assert_not_reached ("didn't get username");
if (!_dbus_homedir_from_current_process (&homedir))
- _dbus_assert_not_reached ("didn't get homedir");
+ _dbus_assert_not_reached ("didn't get homedir");
if (!_dbus_get_user_id (username, &uid))
_dbus_assert_not_reached ("didn't get uid");
@@ -434,7 +484,13 @@ _dbus_userdb_test (const char *test_data_dir)
printf(" %ld", group_ids[i]);
printf ("\n");
-
+
+ dbus_error_init(&error);
+ printf ("Is Console user: %i\n",
+ _dbus_is_console_user(uid, &error));
+ printf ("Invocation was OK: %s\n", error.message ? error.message : "yes");
+ dbus_error_free(&error);
+
dbus_free (group_ids);
return TRUE;