/** * 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; _dbus_user_database_lock_system (); 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; _dbus_user_database_lock_system (); 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; }
dbus_bool_t _dbus_homedir_from_username (const DBusString *username, DBusString *homedir) { DBusUserDatabase *db; const DBusUserInfo *info; _dbus_user_database_lock_system (); 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 (!_dbus_string_append (homedir, info->homedir)) { _dbus_user_database_unlock_system (); return FALSE; } _dbus_user_database_unlock_system (); return TRUE; }
dbus_bool_t _dbus_credentials_from_username (const DBusString *username, DBusCredentials *credentials) { DBusUserDatabase *db; const DBusUserInfo *info; _dbus_user_database_lock_system (); 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; } credentials->pid = DBUS_PID_UNSET; credentials->uid = info->uid; credentials->gid = info->primary_gid; _dbus_user_database_unlock_system (); return TRUE; }
/** * Gets the home directory for the given user. * * @param uid the uid * @param homedir string to append home directory to * @returns #TRUE if user existed and we appended their homedir */ dbus_bool_t _dbus_homedir_from_uid (dbus_uid_t uid, DBusString *homedir) { 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_uid (db, uid, &info, NULL)) { _dbus_user_database_unlock_system (); return FALSE; } if (!_dbus_string_append (homedir, info->homedir)) { _dbus_user_database_unlock_system (); return FALSE; } _dbus_user_database_unlock_system (); return TRUE; }
/** * Adds the credentials corresponding to the given username. * * Used among other purposes to parses a desired identity provided * from a client in the auth protocol. On UNIX this means parsing a * UID, on Windows probably parsing an SID string. * * @todo this is broken because it treats OOM and parse error * the same way. Needs a #DBusError. * * @param credentials credentials to fill in * @param username the username * @returns #TRUE if the username existed and we got some credentials */ dbus_bool_t _dbus_credentials_add_from_user (DBusCredentials *credentials, const DBusString *username) { 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 (!_dbus_credentials_add_unix_uid(credentials, info->uid)) { _dbus_user_database_unlock_system (); return FALSE; } _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; }
/** * 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; }
/** * Adds the credentials corresponding to the given username. * * Used among other purposes to parses a desired identity provided * from a client in the auth protocol. On UNIX this means parsing a * UID, on Windows probably parsing an SID string. * * @todo this is broken because it treats OOM and parse error * the same way. Needs a #DBusError. * * @param credentials credentials to fill in * @param username the username * @returns #TRUE if the username existed and we got some credentials */ dbus_bool_t _dbus_credentials_add_from_user (DBusCredentials *credentials, const DBusString *username) { DBusUserDatabase *db; const DBusUserInfo *info; _dbus_user_database_lock_system (); 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 (!_dbus_credentials_add_unix_uid(credentials, info->uid)) { _dbus_user_database_unlock_system (); return FALSE; } _dbus_user_database_unlock_system (); return TRUE; }
/** * Flushes the system global user database; */ void _dbus_user_database_flush_system (void) { _dbus_user_database_lock_system (); _dbus_user_database_flush (system_db); _dbus_user_database_unlock_system (); }
dbus_bool_t _dbus_homedir_from_current_process (const DBusString **homedir) { _dbus_user_database_lock_system (); if (!init_system_db ()) { _dbus_user_database_unlock_system (); return FALSE; } *homedir = &process_homedir; _dbus_user_database_unlock_system (); return TRUE; }
dbus_bool_t _dbus_username_from_current_process (const DBusString **username) { _dbus_user_database_lock_system (); if (!init_system_db ()) { _dbus_user_database_unlock_system (); return FALSE; } *username = &process_username; _dbus_user_database_unlock_system (); return TRUE; }
/** * Flushes the system global user database; */ void _dbus_user_database_flush_system (void) { if (!_dbus_user_database_lock_system ()) { /* nothing to flush */ return; } if (system_db != NULL) _dbus_user_database_flush (system_db); _dbus_user_database_unlock_system (); }
/** * 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; }
/** * 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_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 */ _dbus_user_database_lock_system (); 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; }
/** * 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; }