summaryrefslogtreecommitdiff
path: root/src/3rd_party/dbus-1.7.8/dbus/dbus-userdb-util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rd_party/dbus-1.7.8/dbus/dbus-userdb-util.c')
-rw-r--r--src/3rd_party/dbus-1.7.8/dbus/dbus-userdb-util.c489
1 files changed, 0 insertions, 489 deletions
diff --git a/src/3rd_party/dbus-1.7.8/dbus/dbus-userdb-util.c b/src/3rd_party/dbus-1.7.8/dbus/dbus-userdb-util.c
deleted file mode 100644
index 888a23e9f5..0000000000
--- a/src/3rd_party/dbus-1.7.8/dbus/dbus-userdb-util.c
+++ /dev/null
@@ -1,489 +0,0 @@
-/* -*- 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
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * 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
- *
- */
-#include <config.h>
-#include <unistd.h>
-#define DBUS_USERDB_INCLUDES_PRIVATE 1
-#include "dbus-userdb.h"
-#include "dbus-test.h"
-#include "dbus-internals.h"
-#include "dbus-protocol.h"
-#include <string.h>
-
-#if HAVE_SYSTEMD
-#include <systemd/sd-login.h>
-#endif
-
-/**
- * @addtogroup DBusInternalsUtils
- * @{
- */
-
-/**
- * Checks to see if the UID sent in is the console user
- *
- * @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
- */
-dbus_bool_t
-_dbus_is_console_user (dbus_uid_t uid,
- DBusError *error)
-{
-
- DBusUserDatabase *db;
- const DBusUserInfo *info;
- dbus_bool_t result = FALSE;
-
-#ifdef HAVE_SYSTEMD
- /* check if we have logind */
- if (access ("/run/systemd/seats/", F_OK) >= 0)
- {
- int r;
-
- /* Check whether this user is logged in on at least one physical
- seat */
- r = sd_uid_get_seats (uid, 0, NULL);
- if (r < 0)
- {
- dbus_set_error (error, _dbus_error_from_errno (-r),
- "Failed to determine seats of user \"" DBUS_UID_FORMAT "\": %s",
- uid,
- _dbus_strerror (-r));
- return FALSE;
- }
-
- return (r > 0);
- }
-#endif
-
-#ifdef HAVE_CONSOLE_OWNER_FILE
-
- DBusString f;
- DBusStat st;
-
- if (!_dbus_string_init (&f))
- {
- _DBUS_SET_OOM (error);
- return FALSE;
- }
-
- if (!_dbus_string_append(&f, DBUS_CONSOLE_OWNER_FILE))
- {
- _dbus_string_free(&f);
- _DBUS_SET_OOM (error);
- return FALSE;
- }
-
- if (_dbus_stat(&f, &st, NULL) && (st.uid == uid))
- {
- _dbus_string_free(&f);
- return TRUE;
- }
-
- _dbus_string_free(&f);
-
-#endif /* HAVE_CONSOLE_OWNER_FILE */
-
- if (!_dbus_user_database_lock_system ())
- {
- _DBUS_SET_OOM (error);
- return FALSE;
- }
-
- db = _dbus_user_database_get_system ();
- if (db == NULL)
- {
- dbus_set_error (error, DBUS_ERROR_FAILED, "Could not get system database.");
- _dbus_user_database_unlock_system ();
- return FALSE;
- }
-
- /* TPTD: this should be cache-safe, we've locked the DB and
- _dbus_user_at_console doesn't pass it on. */
- info = _dbus_user_database_lookup (db, uid, NULL, error);
-
- if (info == NULL)
- {
- _dbus_user_database_unlock_system ();
- return FALSE;
- }
-
- result = _dbus_user_at_console (info->username, error);
-
- _dbus_user_database_unlock_system ();
-
- return result;
-}
-
-/**
- * Gets user ID given username
- *
- * @param username the username
- * @param uid return location for UID
- * @returns #TRUE if username existed and we got the UID
- */
-dbus_bool_t
-_dbus_get_user_id (const DBusString *username,
- dbus_uid_t *uid)
-{
- return _dbus_get_user_id_and_primary_group (username, uid, NULL);
-}
-
-/**
- * Gets group ID given groupname
- *
- * @param groupname the groupname
- * @param gid return location for GID
- * @returns #TRUE if group name existed and we got the GID
- */
-dbus_bool_t
-_dbus_get_group_id (const DBusString *groupname,
- dbus_gid_t *gid)
-{
- DBusUserDatabase *db;
- const DBusGroupInfo *info;
-
- /* FIXME: this can't distinguish ENOMEM from other errors */
- if (!_dbus_user_database_lock_system ())
- return FALSE;
-
- db = _dbus_user_database_get_system ();
- if (db == NULL)
- {
- _dbus_user_database_unlock_system ();
- return FALSE;
- }
-
- if (!_dbus_user_database_get_groupname (db, groupname,
- &info, NULL))
- {
- _dbus_user_database_unlock_system ();
- return FALSE;
- }
-
- *gid = info->gid;
-
- _dbus_user_database_unlock_system ();
- return TRUE;
-}
-
-/**
- * Gets user ID and primary group given username
- *
- * @param username the username
- * @param uid_p return location for UID
- * @param gid_p return location for GID
- * @returns #TRUE if username existed and we got the UID and GID
- */
-dbus_bool_t
-_dbus_get_user_id_and_primary_group (const DBusString *username,
- dbus_uid_t *uid_p,
- dbus_gid_t *gid_p)
-{
- DBusUserDatabase *db;
- const DBusUserInfo *info;
-
- /* FIXME: this can't distinguish ENOMEM from other errors */
- if (!_dbus_user_database_lock_system ())
- return FALSE;
-
- db = _dbus_user_database_get_system ();
- if (db == NULL)
- {
- _dbus_user_database_unlock_system ();
- return FALSE;
- }
-
- if (!_dbus_user_database_get_username (db, username,
- &info, NULL))
- {
- _dbus_user_database_unlock_system ();
- return FALSE;
- }
-
- if (uid_p)
- *uid_p = info->uid;
- if (gid_p)
- *gid_p = info->primary_gid;
-
- _dbus_user_database_unlock_system ();
- return TRUE;
-}
-
-/**
- * Looks up a gid or group name in the user database. Only one of
- * name or GID can be provided. There are wrapper functions for this
- * that are better to use, this one does no locking or anything on the
- * database and otherwise sort of sucks.
- *
- * @param db the database
- * @param gid the group ID or #DBUS_GID_UNSET
- * @param groupname group name or #NULL
- * @param error error to fill in
- * @returns the entry in the database
- */
-DBusGroupInfo*
-_dbus_user_database_lookup_group (DBusUserDatabase *db,
- dbus_gid_t gid,
- const DBusString *groupname,
- DBusError *error)
-{
- DBusGroupInfo *info;
-
- _DBUS_ASSERT_ERROR_IS_CLEAR (error);
-
- /* See if the group is really a number */
- if (gid == DBUS_UID_UNSET)
- {
- unsigned long n;
-
- if (_dbus_is_a_number (groupname, &n))
- gid = n;
- }
-
- if (gid != DBUS_GID_UNSET)
- info = _dbus_hash_table_lookup_uintptr (db->groups, gid);
- else
- info = _dbus_hash_table_lookup_string (db->groups_by_name,
- _dbus_string_get_const_data (groupname));
- if (info)
- {
- _dbus_verbose ("Using cache for GID "DBUS_GID_FORMAT" information\n",
- info->gid);
- return info;
- }
- else
- {
- if (gid != DBUS_GID_UNSET)
- _dbus_verbose ("No cache for GID "DBUS_GID_FORMAT"\n",
- gid);
- else
- _dbus_verbose ("No cache for groupname \"%s\"\n",
- _dbus_string_get_const_data (groupname));
-
- info = dbus_new0 (DBusGroupInfo, 1);
- if (info == NULL)
- {
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
- return NULL;
- }
-
- if (gid != DBUS_GID_UNSET)
- {
- if (!_dbus_group_info_fill_gid (info, gid, error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- _dbus_group_info_free_allocated (info);
- return NULL;
- }
- }
- else
- {
- if (!_dbus_group_info_fill (info, groupname, error))
- {
- _DBUS_ASSERT_ERROR_IS_SET (error);
- _dbus_group_info_free_allocated (info);
- return NULL;
- }
- }
-
- /* don't use these past here */
- gid = DBUS_GID_UNSET;
- groupname = NULL;
-
- if (!_dbus_hash_table_insert_uintptr (db->groups, info->gid, info))
- {
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
- _dbus_group_info_free_allocated (info);
- return NULL;
- }
-
-
- if (!_dbus_hash_table_insert_string (db->groups_by_name,
- info->groupname,
- info))
- {
- _dbus_hash_table_remove_uintptr (db->groups, info->gid);
- dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
- return NULL;
- }
-
- return info;
- }
-}
-
-
-/**
- * Gets the user information for the given group name,
- * returned group info should not be freed.
- *
- * @param db user database
- * @param groupname the group name
- * @param info return location for const ref to group info
- * @param error error location
- * @returns #FALSE if error is set
- */
-dbus_bool_t
-_dbus_user_database_get_groupname (DBusUserDatabase *db,
- const DBusString *groupname,
- const DBusGroupInfo **info,
- DBusError *error)
-{
- *info = _dbus_user_database_lookup_group (db, DBUS_GID_UNSET, groupname, error);
- return *info != NULL;
-}
-
-/**
- * Gets the user information for the given GID,
- * returned group info should not be freed.
- *
- * @param db user database
- * @param gid the group ID
- * @param info return location for const ref to group info
- * @param error error location
- * @returns #FALSE if error is set
- */
-dbus_bool_t
-_dbus_user_database_get_gid (DBusUserDatabase *db,
- dbus_gid_t gid,
- const DBusGroupInfo **info,
- DBusError *error)
-{
- *info = _dbus_user_database_lookup_group (db, gid, NULL, error);
- return *info != NULL;
-}
-
-
-/**
- * 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.
- *
- * @param uid the UID
- * @param group_ids return location for array of group IDs
- * @param n_group_ids return location for length of returned array
- * @returns #TRUE if the UID existed and we got some credentials
- */
-dbus_bool_t
-_dbus_groups_from_uid (dbus_uid_t uid,
- dbus_gid_t **group_ids,
- int *n_group_ids)
-{
- DBusUserDatabase *db;
- const DBusUserInfo *info;
- *group_ids = NULL;
- *n_group_ids = 0;
-
- /* FIXME: this can't distinguish ENOMEM from other errors */
- if (!_dbus_user_database_lock_system ())
- return FALSE;
-
- db = _dbus_user_database_get_system ();
- if (db == NULL)
- {
- _dbus_user_database_unlock_system ();
- return FALSE;
- }
-
- if (!_dbus_user_database_get_uid (db, uid,
- &info, NULL))
- {
- _dbus_user_database_unlock_system ();
- return FALSE;
- }
-
- _dbus_assert (info->uid == uid);
-
- if (info->n_group_ids > 0)
- {
- *group_ids = dbus_new (dbus_gid_t, info->n_group_ids);
- if (*group_ids == NULL)
- {
- _dbus_user_database_unlock_system ();
- return FALSE;
- }
-
- *n_group_ids = info->n_group_ids;
-
- memcpy (*group_ids, info->group_ids, info->n_group_ids * sizeof (dbus_gid_t));
- }
-
- _dbus_user_database_unlock_system ();
- return TRUE;
-}
-/** @} */
-
-#ifdef DBUS_ENABLE_EMBEDDED_TESTS
-#include <stdio.h>
-
-/**
- * Unit test for dbus-userdb.c.
- *
- * @returns #TRUE on success.
- */
-dbus_bool_t
-_dbus_userdb_test (const char *test_data_dir)
-{
- const DBusString *username;
- const DBusString *homedir;
- 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");
-
- if (!_dbus_get_user_id (username, &uid))
- _dbus_assert_not_reached ("didn't get uid");
-
- if (!_dbus_groups_from_uid (uid, &group_ids, &n_group_ids))
- _dbus_assert_not_reached ("didn't get groups");
-
- printf (" Current user: %s homedir: %s gids:",
- _dbus_string_get_const_data (username),
- _dbus_string_get_const_data (homedir));
-
- for (i=0; i<n_group_ids; i++)
- 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);
- printf ("Is Console user 4711: %i\n",
- _dbus_is_console_user (4711, &error));
- printf ("Invocation was OK: %s\n", error.message ? error.message : "yes");
- dbus_error_free (&error);
-
- dbus_free (group_ids);
-
- return TRUE;
-}
-#endif /* DBUS_ENABLE_EMBEDDED_TESTS */