diff options
author | Tim Dijkstra <tim@famdijkstra.org> | 2006-12-12 21:24:07 +0000 |
---|---|---|
committer | Tim Dijkstra <tim@famdijkstra.org> | 2006-12-12 21:24:07 +0000 |
commit | 145fb99b6e0351d92ffd2f85be77b426c89df59b (patch) | |
tree | 842a296b17f34ed145cdcbdfb1478ce28f0a7d2f /dbus | |
parent | 1a90c0193042bfc03d56d0f2454e46ec35667f3f (diff) |
commit.msg
Diffstat (limited to 'dbus')
-rw-r--r-- | dbus/dbus-userdb-util.c | 71 | ||||
-rw-r--r-- | dbus/dbus-userdb.c | 15 | ||||
-rw-r--r-- | dbus/dbus-userdb.h | 11 |
3 files changed, 65 insertions, 32 deletions
diff --git a/dbus/dbus-userdb-util.c b/dbus/dbus-userdb-util.c index 81564ad7..bd393a27 100644 --- a/dbus/dbus-userdb-util.c +++ b/dbus/dbus-userdb-util.c @@ -86,6 +86,8 @@ _dbus_is_console_user (dbus_uid_t uid, 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) @@ -347,45 +349,49 @@ _dbus_user_database_get_gid (DBusUserDatabase *db, /** - * Gets all groups for a particular user. Returns #FALSE + * 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. Sets error to the reason - * for returning #FALSE. + * group_ids to a NULL array. * - * @param db the user database object - * @param uid the user ID + * @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 - * @param error return location for error - * @returns #TRUE on success + * @returns #TRUE if the UID existed and we got some credentials */ dbus_bool_t -_dbus_user_database_get_groups (DBusUserDatabase *db, - dbus_uid_t uid, - dbus_gid_t **group_ids, - int *n_group_ids, - DBusError *error) +_dbus_groups_from_uid (dbus_uid_t uid, + dbus_gid_t **group_ids, + int *n_group_ids) { - DBusUserInfo *info; - - _DBUS_ASSERT_ERROR_IS_CLEAR (error); - + DBusUserDatabase *db; + const DBusUserInfo *info; *group_ids = NULL; *n_group_ids = 0; - - info = _dbus_user_database_lookup (db, uid, NULL, error); - if (info == NULL) + + _dbus_user_database_lock_system (); + + db = _dbus_user_database_get_system (); + if (db == NULL) { - _DBUS_ASSERT_ERROR_IS_SET (error); + _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_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); + _dbus_user_database_unlock_system (); return FALSE; } @@ -394,9 +400,9 @@ _dbus_user_database_get_groups (DBusUserDatabase *db, memcpy (*group_ids, info->group_ids, info->n_group_ids * sizeof (dbus_gid_t)); } + _dbus_user_database_unlock_system (); return TRUE; } - /** @} */ #ifdef DBUS_BUILD_TESTS @@ -412,6 +418,9 @@ _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; if (!_dbus_username_from_current_process (&username)) _dbus_assert_not_reached ("didn't get username"); @@ -419,10 +428,24 @@ _dbus_userdb_test (const char *test_data_dir) if (!_dbus_homedir_from_current_process (&homedir)) _dbus_assert_not_reached ("didn't get homedir"); - printf (" Current user: %s homedir: %s\n", + 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_free (group_ids); + return TRUE; } #endif /* DBUS_BUILD_TESTS */ diff --git a/dbus/dbus-userdb.c b/dbus/dbus-userdb.c index c4f35fb7..1be3dda6 100644 --- a/dbus/dbus-userdb.c +++ b/dbus/dbus-userdb.c @@ -79,7 +79,7 @@ _dbus_is_a_number (const DBusString *str, { int end; - if (_dbus_string_parse_int (str, 0, num, &end) && + if (_dbus_string_parse_uint (str, 0, num, &end) && end == _dbus_string_get_length (str)) return TRUE; else @@ -312,6 +312,19 @@ _dbus_user_database_get_system (void) } /** + * 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 (); +} + +/** * Gets username of user owning current process. The returned string * is valid until dbus_shutdown() is called. * diff --git a/dbus/dbus-userdb.h b/dbus/dbus-userdb.h index 906c6ab3..9e278544 100644 --- a/dbus/dbus-userdb.h +++ b/dbus/dbus-userdb.h @@ -47,17 +47,11 @@ struct DBusUserDatabase }; -#endif /* DBUS_USERDB_INCLUDES_PRIVATE */ DBusUserDatabase* _dbus_user_database_new (void); DBusUserDatabase* _dbus_user_database_ref (DBusUserDatabase *db); void _dbus_user_database_flush (DBusUserDatabase *db); void _dbus_user_database_unref (DBusUserDatabase *db); -dbus_bool_t _dbus_user_database_get_groups (DBusUserDatabase *db, - dbus_uid_t uid, - dbus_gid_t **group_ids, - int *n_group_ids, - DBusError *error); dbus_bool_t _dbus_user_database_get_uid (DBusUserDatabase *db, dbus_uid_t uid, const DBusUserInfo **info, @@ -75,7 +69,6 @@ dbus_bool_t _dbus_user_database_get_groupname (DBusUserDatabase *db, const DBusGroupInfo **info, DBusError *error); -#ifdef DBUS_USERDB_INCLUDES_PRIVATE DBusUserInfo* _dbus_user_database_lookup (DBusUserDatabase *db, dbus_uid_t uid, const DBusString *username, @@ -91,6 +84,7 @@ void _dbus_group_info_free_allocated (DBusGroupInfo *info); DBusUserDatabase* _dbus_user_database_get_system (void); void _dbus_user_database_lock_system (void); void _dbus_user_database_unlock_system (void); +void _dbus_user_database_flush_system (void); dbus_bool_t _dbus_username_from_current_process (const DBusString **username); dbus_bool_t _dbus_homedir_from_current_process (const DBusString **homedir); @@ -104,6 +98,9 @@ dbus_bool_t _dbus_credentials_from_username (const DBusString *username, DBusCredentials *credentials); dbus_bool_t _dbus_credentials_from_uid (dbus_uid_t user_id, DBusCredentials *credentials); +dbus_bool_t _dbus_groups_from_uid (dbus_uid_t uid, + dbus_gid_t **group_ids, + int *n_group_ids); dbus_bool_t _dbus_is_console_user (dbus_uid_t uid, DBusError *error); |