Christian Kellner asked me to improve and submit a patch to this list that makes Nautilus use GNOME_VFS_FILE_INFO_FIELDS_ACCESS for determining file permissions. I've also attached a patch that makes gnome_vfs_file_info_matches check for valid_fields being identical, since this can make client applications assume that two file infos match where they don't, and Nautilus uses it. OK to commit? -- Christian Neumair <chris gnome-de org>
Index: libnautilus-private/nautilus-desktop-icon-file.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-desktop-icon-file.c,v
retrieving revision 1.6
diff -u -p -r1.6 nautilus-desktop-icon-file.c
--- libnautilus-private/nautilus-desktop-icon-file.c 22 Feb 2005 10:41:46 -0000 1.6
+++ libnautilus-private/nautilus-desktop-icon-file.c 1 Dec 2005 14:14:32 -0000
@@ -204,13 +204,16 @@ update_info_from_link (NautilusDesktopIc
GNOME_VFS_PERM_GROUP_WRITE |
GNOME_VFS_PERM_USER_READ |
GNOME_VFS_PERM_OTHER_READ |
- GNOME_VFS_PERM_GROUP_READ;
+ GNOME_VFS_PERM_GROUP_READ |
+ GNOME_VFS_PERM_ACCESS_READABLE |
+ GNOME_VFS_PERM_ACCESS_WRITABLE;
file_info->valid_fields = GNOME_VFS_FILE_INFO_FIELDS_TYPE |
GNOME_VFS_FILE_INFO_FIELDS_FLAGS |
GNOME_VFS_FILE_INFO_FIELDS_MIME_TYPE |
GNOME_VFS_FILE_INFO_FIELDS_SIZE |
GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS |
+ GNOME_VFS_FILE_INFO_FIELDS_ACCESS |
GNOME_VFS_FILE_INFO_FIELDS_LINK_COUNT;
volume = nautilus_desktop_link_get_volume (link);
Index: libnautilus-private/nautilus-directory-async.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-directory-async.c,v
retrieving revision 1.216
diff -u -p -r1.216 nautilus-directory-async.c
--- libnautilus-private/nautilus-directory-async.c 6 Sep 2005 15:12:46 -0000 1.216
+++ libnautilus-private/nautilus-directory-async.c 1 Dec 2005 14:14:33 -0000
@@ -1476,7 +1476,8 @@ nautilus_directory_get_info_for_new_file
(&handle,
vfs_uri_list,
(GNOME_VFS_FILE_INFO_GET_MIME_TYPE
- | GNOME_VFS_FILE_INFO_FOLLOW_LINKS),
+ | GNOME_VFS_FILE_INFO_FOLLOW_LINKS
+ | GNOME_VFS_FILE_INFO_GET_ACCESS_RIGHTS),
GNOME_VFS_PRIORITY_DEFAULT,
new_files_callback,
directory);
@@ -1996,7 +1997,8 @@ start_monitoring_file_list (NautilusDire
(&directory->details->directory_load_in_progress, /* handle */
directory->details->uri, /* uri */
(GNOME_VFS_FILE_INFO_GET_MIME_TYPE /* options */
- | GNOME_VFS_FILE_INFO_FOLLOW_LINKS),
+ | GNOME_VFS_FILE_INFO_FOLLOW_LINKS
+ | GNOME_VFS_FILE_INFO_GET_ACCESS_RIGHTS),
DIRECTORY_LOAD_ITEMS_PER_CALLBACK, /* items_per_notification */
GNOME_VFS_PRIORITY_DEFAULT,
directory_load_callback, /* callback */
@@ -2474,7 +2476,8 @@ mime_list_load (NautilusDirectory *direc
gnome_vfs_async_load_directory
(&directory->details->mime_list_in_progress,
uri,
- GNOME_VFS_FILE_INFO_GET_MIME_TYPE,
+ GNOME_VFS_FILE_INFO_GET_MIME_TYPE
+ | GNOME_VFS_FILE_INFO_GET_ACCESS_RIGHTS,
DIRECTORY_LOAD_ITEMS_PER_CALLBACK,
GNOME_VFS_PRIORITY_DEFAULT,
mime_list_callback,
@@ -2808,7 +2811,8 @@ file_info_start (NautilusDirectory *dire
fake_list.next = NULL;
options = GNOME_VFS_FILE_INFO_GET_MIME_TYPE
- | GNOME_VFS_FILE_INFO_FOLLOW_LINKS;
+ | GNOME_VFS_FILE_INFO_FOLLOW_LINKS
+ | GNOME_VFS_FILE_INFO_GET_ACCESS_RIGHTS;
if (need_slow_mime) {
options |= GNOME_VFS_FILE_INFO_FORCE_SLOW_MIME_TYPE;
}
Index: libnautilus-private/nautilus-file.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-file.c,v
retrieving revision 1.375
diff -u -p -r1.375 nautilus-file.c
--- libnautilus-private/nautilus-file.c 24 Nov 2005 10:49:19 -0000 1.375
+++ libnautilus-private/nautilus-file.c 1 Dec 2005 14:14:36 -0000
@@ -612,48 +612,6 @@ nautilus_file_get_parent (NautilusFile *
return nautilus_directory_get_corresponding_file (file->details->directory);
}
-struct NautilusUserInfo {
- uid_t user_id;
-
- gboolean has_primary_group;
- gid_t primary_group;
-
- int num_supplementary_groups;
- gid_t supplementary_groups[NGROUPS_MAX];
-};
-
-/* Returns a pointer to the cached info, does not need freeing */
-static struct NautilusUserInfo *
-nautilus_file_get_user_info (void)
-{
- static struct timeval cached_time;
- static struct NautilusUserInfo info;
- static gboolean has_cached_info = FALSE;
- struct passwd *password_info;
- struct timeval now;
-
- gettimeofday (&now, NULL);
-
- if (!has_cached_info ||
- ((now.tv_sec - cached_time.tv_sec) > GETPWUID_CACHE_TIME)) {
- cached_time = now;
- has_cached_info = TRUE;
-
- info.user_id = geteuid ();
-
- info.has_primary_group = FALSE;
- /* No need to free result of getpwuid. */
- password_info = getpwuid (info.user_id);
- if (password_info) {
- info.has_primary_group = TRUE;
- info.primary_group = password_info->pw_gid;
- }
- info.num_supplementary_groups = getgroups (NGROUPS_MAX, info.supplementary_groups);
- }
-
- return &info;
-}
-
/**
* nautilus_file_denies_access_permission:
*
@@ -662,9 +620,9 @@ nautilus_file_get_user_info (void)
* returns FALSE if permissions cannot be determined.
*
* @file: The file to check.
- * @owner_permission: The USER version of the permission (e.g. GNOME_VFS_PERM_USER_READ).
- * @group_permission: The GROUP version of the permission (e.g. GNOME_VFS_PERM_GROUP_READ).
- * @other_permission: The OTHER version of the permission (e.g. GNOME_VFS_PERM_OTHER_READ).
+ * @permissions: The permissions to check. Must be either
+ * GNOME_VFS_PERM_ACCESS_READABLE, GNOME_VFS_PERM_ACCESS_WRITABLE,
+ * GNOME_VFS_PERM_ACCESS_EXECUTABLE
*
* Return value: TRUE if the current user definitely does not have
* the specified permission. FALSE if the current user does have
@@ -672,15 +630,13 @@ nautilus_file_get_user_info (void)
*/
static gboolean
nautilus_file_denies_access_permission (NautilusFile *file,
- GnomeVFSFilePermissions owner_permission,
- GnomeVFSFilePermissions group_permission,
- GnomeVFSFilePermissions other_permission)
+ GnomeVFSFilePermissions permissions)
{
- struct NautilusUserInfo *user_info;
- int i;
-
g_assert (NAUTILUS_IS_FILE (file));
-
+ g_assert (permissions & (GNOME_VFS_PERM_ACCESS_READABLE |
+ GNOME_VFS_PERM_ACCESS_WRITABLE |
+ GNOME_VFS_PERM_ACCESS_EXECUTABLE));
+
/* Once the file is gone, you are denied permission to do anything. */
if (nautilus_file_is_gone (file)) {
return TRUE;
@@ -692,45 +648,8 @@ nautilus_file_denies_access_permission (
if (!nautilus_file_can_get_permissions (file)) {
return FALSE;
}
-
- /* This is called often. Cache the user information for five minutes */
-
- user_info = nautilus_file_get_user_info ();
-
- /* Check the user. */
- /* Root is not forbidden to do anything. */
- if (user_info->user_id == 0) {
- return FALSE;
- }
-
- /* File owner's access is governed by the owner bits. */
- /* FIXME bugzilla.gnome.org 40644:
- * Can we trust the uid in the file info? Might
- * there be garbage there? What will it do for non-local files?
- */
- if (user_info->user_id == (uid_t) file->details->info->uid) {
- return (file->details->info->permissions & owner_permission) == 0;
- }
-
-
- /* Group member's access is governed by the group bits. */
- /* FIXME bugzilla.gnome.org 40644:
- * Can we trust the gid in the file info? Might
- * there be garbage there? What will it do for non-local files?
- */
- if (user_info->has_primary_group
- && user_info->primary_group == (gid_t) file->details->info->gid) {
- return (file->details->info->permissions & group_permission) == 0;
- }
- /* Check supplementary groups */
- for (i = 0; i < user_info->num_supplementary_groups; i++) {
- if ((gid_t) file->details->info->gid == user_info->supplementary_groups[i]) {
- return (file->details->info->permissions & group_permission) == 0;
- }
- }
- /* Other users' access is governed by the other bits. */
- return (file->details->info->permissions & other_permission) == 0;
+ return (file->details->info->permissions & permissions) == 0;
}
/**
@@ -751,10 +670,7 @@ nautilus_file_can_read (NautilusFile *fi
g_return_val_if_fail (NAUTILUS_IS_FILE (file), FALSE);
return !nautilus_file_denies_access_permission
- (file,
- GNOME_VFS_PERM_USER_READ,
- GNOME_VFS_PERM_GROUP_READ,
- GNOME_VFS_PERM_OTHER_READ);
+ (file, GNOME_VFS_PERM_ACCESS_READABLE);
}
/**
@@ -775,10 +691,7 @@ nautilus_file_can_write (NautilusFile *f
g_return_val_if_fail (NAUTILUS_IS_FILE (file), FALSE);
return !nautilus_file_denies_access_permission
- (file,
- GNOME_VFS_PERM_USER_WRITE,
- GNOME_VFS_PERM_GROUP_WRITE,
- GNOME_VFS_PERM_OTHER_WRITE);
+ (file, GNOME_VFS_PERM_ACCESS_WRITABLE);
}
/**
@@ -799,10 +712,7 @@ nautilus_file_can_execute (NautilusFile
g_return_val_if_fail (NAUTILUS_IS_FILE (file), FALSE);
return !nautilus_file_denies_access_permission
- (file,
- GNOME_VFS_PERM_USER_EXEC,
- GNOME_VFS_PERM_GROUP_EXEC,
- GNOME_VFS_PERM_OTHER_EXEC);
+ (file, GNOME_VFS_PERM_ACCESS_EXECUTABLE);
}
/**
@@ -3425,7 +3335,7 @@ nautilus_file_get_size (NautilusFile *fi
gboolean
nautilus_file_can_get_permissions (NautilusFile *file)
{
- return !nautilus_file_info_missing (file, GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS);
+ return !nautilus_file_info_missing (file, GNOME_VFS_FILE_INFO_FIELDS_ACCESS);
}
/**
@@ -3540,7 +3450,8 @@ nautilus_file_set_permissions (NautilusF
op->use_slow_mime = file->details->got_slow_mime_type;
options = GNOME_VFS_FILE_INFO_GET_MIME_TYPE
- | GNOME_VFS_FILE_INFO_FOLLOW_LINKS;
+ | GNOME_VFS_FILE_INFO_FOLLOW_LINKS
+ | GNOME_VFS_FILE_INFO_GET_ACCESS_RIGHTS;
if (op->use_slow_mime) {
options |= GNOME_VFS_FILE_INFO_FORCE_SLOW_MIME_TYPE;
}
@@ -3725,11 +3636,7 @@ gboolean
nautilus_file_can_get_owner (NautilusFile *file)
{
/* Before we have info on a file, the owner is unknown. */
- /* FIXME bugzilla.gnome.org 40644:
- * Can we trust the uid in the file info? Might
- * there be garbage there? What will it do for non-local files?
- */
- return !nautilus_file_info_missing (file, 0 /* FIXME bugzilla.gnome.org 40644: GNOME_VFS_FILE_INFO_FIELDS_UID */);
+ return !nautilus_file_info_missing (file, GNOME_VFS_FILE_INFO_FIELDS_IDS);
}
/**
@@ -3948,11 +3855,7 @@ gboolean
nautilus_file_can_get_group (NautilusFile *file)
{
/* Before we have info on a file, the group is unknown. */
- /* FIXME bugzilla.gnome.org 40644:
- * Can we trust the gid in the file info? Might
- * there be garbage there? What will it do for non-local files?
- */
- return !nautilus_file_info_missing (file, 0 /* FIXME bugzilla.gnome.org 40644: GNOME_VFS_FILE_INFO_FIELDS_GID */);
+ return !nautilus_file_info_missing (file, GNOME_VFS_FILE_INFO_FIELDS_IDS);
}
/**
@@ -3972,14 +3875,10 @@ nautilus_file_get_group_name (NautilusFi
struct group *group_info;
/* Before we have info on a file, the owner is unknown. */
- if (nautilus_file_info_missing (file, 0 /* FIXME bugzilla.gnome.org 40644: GNOME_VFS_FILE_INFO_FIELDS_GID */)) {
+ if (nautilus_file_info_missing (file, GNOME_VFS_FILE_INFO_FIELDS_IDS)) {
return NULL;
}
- /* FIXME bugzilla.gnome.org 40644:
- * Can we trust the gid in the file info? Might
- * there be garbage there? What will it do for non-local files?
- */
/* No need to free result of getgrgid */
group_info = getgrgid ((gid_t) file->details->info->gid);
@@ -4279,11 +4178,7 @@ nautilus_file_get_owner_as_string (Nauti
char *user_name;
/* Before we have info on a file, the owner is unknown. */
- /* FIXME bugzilla.gnome.org 40644:
- * Can we trust the uid in the file info? Might
- * there be garbage there? What will it do for non-local files?
- */
- if (nautilus_file_info_missing (file, 0 /* FIXME bugzilla.gnome.org 40644: GNOME_VFS_FILE_INFO_FIELDS_UID */)) {
+ if (nautilus_file_info_missing (file, GNOME_VFS_FILE_INFO_FIELDS_IDS)) {
return NULL;
}
@@ -5226,10 +5121,8 @@ nautilus_file_is_executable (NautilusFil
return FALSE;
}
- return (file->details->info->permissions
- & (GNOME_VFS_PERM_USER_EXEC
- | GNOME_VFS_PERM_GROUP_EXEC
- | GNOME_VFS_PERM_OTHER_EXEC)) != 0;
+ return ((file->details->info->permissions
+ & GNOME_VFS_PERM_ACCESS_EXECUTABLE) != 0);
}
/**
Index: libgnomevfs/gnome-vfs-file-info.c
===================================================================
RCS file: /cvs/gnome/gnome-vfs/libgnomevfs/gnome-vfs-file-info.c,v
retrieving revision 1.26
diff -u -p -r1.26 gnome-vfs-file-info.c
--- libgnomevfs/gnome-vfs-file-info.c 14 Nov 2005 11:41:13 -0000 1.26
+++ libgnomevfs/gnome-vfs-file-info.c 1 Dec 2005 14:20:42 -0000
@@ -294,6 +294,7 @@ gnome_vfs_file_info_matches (const Gnome
|| a->link_count != b->link_count
|| a->uid != b->uid
|| a->gid != b->gid
+ || a->valid_fields != b->valid_fields
|| strcmp (a->name, b->name) != 0
|| !mime_matches (a->mime_type, b->mime_type)
|| !symlink_name_matches (a->symlink_name, b->symlink_name)) {
Attachment:
signature.asc
Description: This is a digitally signed message part