nautilus-08-acl.diff revision 11438
11438N/A--- nautilus-2.18.0.1-orig/libnautilus-private/nautilus-directory-async.c 2007-04-10 02:59:55.163189000 +0200
11438N/A+++ nautilus-2.18.0.1-alo/libnautilus-private/nautilus-directory-async.c 2007-04-03 12:36:03.664915000 +0200
11438N/A@@ -2596,7 +2596,7 @@
11438N/A gnome_vfs_async_load_directory
11438N/A (&directory->details->mime_list_in_progress,
11438N/A uri,
11438N/A- GNOME_VFS_FILE_INFO_GET_MIME_TYPE,
11438N/A+ (GNOME_VFS_FILE_INFO_GET_MIME_TYPE | GNOME_VFS_FILE_INFO_GET_ACL),
11438N/A DIRECTORY_LOAD_ITEMS_PER_CALLBACK,
11438N/A GNOME_VFS_PRIORITY_DEFAULT,
11438N/A mime_list_callback,
11438N/A--- nautilus-2.18.0.1-orig/libnautilus-private/nautilus-file.h 2007-04-10 02:59:55.124136000 +0200
11438N/A+++ nautilus-2.18.0.1-alo/libnautilus-private/nautilus-file.h 2007-04-03 12:36:02.762619000 +0200
11438N/A@@ -201,6 +201,15 @@
11438N/A gboolean nautilus_file_can_get_selinux_context (NautilusFile *file);
11438N/A char * nautilus_file_get_selinux_context (NautilusFile *file);
11438N/A
11438N/A+/* ACL */
11438N/A+gboolean nautilus_file_can_get_acl (NautilusFile *file);
11438N/A+gboolean nautilus_file_can_set_acl (NautilusFile *file);
11438N/A+GnomeVFSACL * nautilus_file_get_acl (NautilusFile *file);
11438N/A+GnomeVFSResult nautilus_file_set_acl (NautilusFile *file,
11438N/A+ GnomeVFSACL *acl,
11438N/A+ NautilusFileOperationCallback callback,
11438N/A+ gpointer callback_data);
11438N/A+
11438N/A /* "Capabilities". */
11438N/A gboolean nautilus_file_can_read (NautilusFile *file);
11438N/A gboolean nautilus_file_can_write (NautilusFile *file);
11438N/A--- nautilus-2.18.0.1-orig/libnautilus-private/nautilus-file.c 2007-04-10 02:59:55.240107000 +0200
11438N/A+++ nautilus-2.18.0.1-alo/libnautilus-private/nautilus-file.c 2007-04-03 12:36:06.206964000 +0200
11438N/A@@ -65,6 +65,7 @@
11438N/A #include <libgnomevfs/gnome-vfs-volume.h>
11438N/A #include <libgnomevfs/gnome-vfs-volume-monitor.h>
11438N/A #include <libgnomevfs/gnome-vfs-drive.h>
11438N/A+#include <libgnomevfs/gnome-vfs-ops.h>
11438N/A #include <glib/gfileutils.h>
11438N/A #include <libnautilus-extension/nautilus-file-info.h>
11438N/A #include <libxml/parser.h>
11438N/A@@ -73,6 +74,7 @@
11438N/A #include <sys/time.h>
11438N/A #include <time.h>
11438N/A #include <unistd.h>
11438N/A+#include <errno.h>
11438N/A
11438N/A #ifdef HAVE_SELINUX
11438N/A #include <selinux/selinux.h>
11438N/A@@ -661,6 +663,30 @@
11438N/A return nautilus_directory_get_corresponding_file (file->details->directory);
11438N/A }
11438N/A
11438N/A+static GnomeVFSACLPerm
11438N/A+to_acl_perm (GnomeVFSFilePermissions p)
11438N/A+{
11438N/A+ if ((p == GNOME_VFS_PERM_USER_READ) ||
11438N/A+ (p == GNOME_VFS_PERM_GROUP_READ) ||
11438N/A+ (p == GNOME_VFS_PERM_OTHER_READ) ||
11438N/A+ (p == GNOME_VFS_PERM_ACCESS_READABLE))
11438N/A+ return GNOME_VFS_ACL_READ;
11438N/A+
11438N/A+ if ((p == GNOME_VFS_PERM_USER_WRITE) ||
11438N/A+ (p == GNOME_VFS_PERM_GROUP_WRITE) ||
11438N/A+ (p == GNOME_VFS_PERM_OTHER_WRITE) ||
11438N/A+ (p == GNOME_VFS_PERM_ACCESS_WRITABLE))
11438N/A+ return GNOME_VFS_ACL_WRITE;
11438N/A+
11438N/A+ if ((p == GNOME_VFS_PERM_USER_EXEC) ||
11438N/A+ (p == GNOME_VFS_PERM_GROUP_EXEC) ||
11438N/A+ (p == GNOME_VFS_PERM_OTHER_EXEC) ||
11438N/A+ (p == GNOME_VFS_PERM_ACCESS_EXECUTABLE))
11438N/A+ return GNOME_VFS_ACL_EXECUTE;
11438N/A+
11438N/A+ return GNOME_VFS_ACL_PERM_NULL;
11438N/A+}
11438N/A+
11438N/A /**
11438N/A * nautilus_file_denies_access_permission:
11438N/A *
11438N/A@@ -681,6 +707,9 @@
11438N/A nautilus_file_denies_access_permission (NautilusFile *file,
11438N/A GnomeVFSFilePermissions permissions)
11438N/A {
11438N/A+ GList *acls, *iter;
11438N/A+ GnomeVFSACL *acl;
11438N/A+
11438N/A g_assert (NAUTILUS_IS_FILE (file));
11438N/A g_assert (permissions & (GNOME_VFS_PERM_ACCESS_READABLE |
11438N/A GNOME_VFS_PERM_ACCESS_WRITABLE |
11438N/A@@ -698,7 +727,10 @@
11438N/A return FALSE;
11438N/A }
11438N/A
11438N/A- return (file->details->info->permissions & permissions) != permissions;
11438N/A+ if ((file->details->info->permissions & permissions) == permissions)
11438N/A+ return FALSE;
11438N/A+
11438N/A+ return TRUE;
11438N/A }
11438N/A
11438N/A /**
11438N/A@@ -3438,6 +3470,134 @@
11438N/A return !nautilus_file_info_missing (file, GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS);
11438N/A }
11438N/A
11438N/A+gboolean
11438N/A+nautilus_file_can_get_acl (NautilusFile *file)
11438N/A+{
11438N/A+ return !nautilus_file_info_missing (file, GNOME_VFS_FILE_INFO_FIELDS_ACL);
11438N/A+}
11438N/A+
11438N/A+gboolean
11438N/A+nautilus_file_can_set_acl (NautilusFile *file)
11438N/A+{
11438N/A+ uid_t user_id;
11438N/A+
11438N/A+ if (!nautilus_file_can_get_acl (file)) {
11438N/A+ return FALSE;
11438N/A+ }
11438N/A+
11438N/A+ /* Check the user. */
11438N/A+ user_id = geteuid();
11438N/A+
11438N/A+ /* Owner is allowed to set group (with restrictions). */
11438N/A+ if (user_id == (uid_t) file->details->info->uid) {
11438N/A+ return TRUE;
11438N/A+ }
11438N/A+
11438N/A+ /* Root is also allowed to set group. */
11438N/A+ if (user_id == 0) {
11438N/A+ return TRUE;
11438N/A+ }
11438N/A+
11438N/A+ return FALSE;
11438N/A+}
11438N/A+
11438N/A+static void
11438N/A+set_permissions_callback (GnomeVFSAsyncHandle *handle,
11438N/A+ GnomeVFSResult result,
11438N/A+ GnomeVFSFileInfo *new_info,
11438N/A+ gpointer callback_data)
11438N/A+{
11438N/A+ Operation *op;
11438N/A+
11438N/A+ op = callback_data;
11438N/A+ g_assert (handle == op->handle);
11438N/A+
11438N/A+ if (result == GNOME_VFS_OK && new_info != NULL) {
11438N/A+ nautilus_file_update_info (op->file, new_info, op->use_slow_mime);
11438N/A+ }
11438N/A+ operation_complete (op, result);
11438N/A+}
11438N/A+
11438N/A+static void
11438N/A+set_acl_callback (GnomeVFSAsyncHandle *handle,
11438N/A+ GnomeVFSResult result,
11438N/A+ GnomeVFSFileInfo *new_info,
11438N/A+ gpointer callback_data)
11438N/A+{
11438N/A+ Operation *op;
11438N/A+
11438N/A+ op = callback_data;
11438N/A+ g_assert (handle == op->handle);
11438N/A+
11438N/A+ if (result == GNOME_VFS_OK && new_info != NULL) {
11438N/A+ if (op->file->details->info->acl != NULL)
11438N/A+ g_object_unref (op->file->details->info->acl);
11438N/A+
11438N/A+ op->file->details->info->acl = new_info->acl;
11438N/A+ }
11438N/A+
11438N/A+ operation_complete (op, result);
11438N/A+}
11438N/A+
11438N/A+
11438N/A+GnomeVFSACL *
11438N/A+nautilus_file_get_acl (NautilusFile *file)
11438N/A+{
11438N/A+ return nautilus_file_info_missing (file, GNOME_VFS_FILE_INFO_FIELDS_ACL)
11438N/A+ ? NULL : file->details->info->acl;
11438N/A+}
11438N/A+
11438N/A+// void
11438N/A+GnomeVFSResult
11438N/A+nautilus_file_set_acl (NautilusFile *file,
11438N/A+ GnomeVFSACL *acl,
11438N/A+ NautilusFileOperationCallback callback,
11438N/A+ gpointer callback_data)
11438N/A+{
11438N/A+ Operation *op;
11438N/A+ GnomeVFSURI *vfs_uri;
11438N/A+ GnomeVFSFileInfo *partial_file_info;
11438N/A+ GnomeVFSFileInfoOptions options;
11438N/A+ GnomeVFSResult re;
11438N/A+
11438N/A+ if (!nautilus_file_can_set_acl (file)) {
11438N/A+ nautilus_file_changed (file);
11438N/A+ (* callback) (file, GNOME_VFS_ERROR_ACCESS_DENIED, callback_data);
11438N/A+ return;
11438N/A+ }
11438N/A+
11438N/A+ op = operation_new (file, callback, callback_data);
11438N/A+ op->use_slow_mime = file->details->got_slow_mime_type;
11438N/A+
11438N/A+ options = GNOME_VFS_FILE_INFO_GET_ACL
11438N/A+ | GNOME_VFS_FILE_INFO_GET_MIME_TYPE
11438N/A+ | GNOME_VFS_FILE_INFO_FOLLOW_LINKS;
11438N/A+ if (op->use_slow_mime) {
11438N/A+ options |= GNOME_VFS_FILE_INFO_FORCE_SLOW_MIME_TYPE;
11438N/A+ }
11438N/A+
11438N/A+ partial_file_info = gnome_vfs_file_info_new ();
11438N/A+ gnome_vfs_file_info_copy (partial_file_info, file->details->info);
11438N/A+ partial_file_info->acl = acl;
11438N/A+ vfs_uri = nautilus_file_get_gnome_vfs_uri (file);
11438N/A+#if 0
11438N/A+ gnome_vfs_async_set_file_info (&op->handle,
11438N/A+ vfs_uri, partial_file_info,
11438N/A+ GNOME_VFS_SET_FILE_INFO_ACL,
11438N/A+ options,
11438N/A+ GNOME_VFS_PRIORITY_DEFAULT,
11438N/A+ set_acl_callback, op);
11438N/A+#else
11438N/A+ re = gnome_vfs_set_file_info_uri (vfs_uri, partial_file_info,
11438N/A+ GNOME_VFS_SET_FILE_INFO_ACL);
11438N/A+ callback (file, re, callback_data);
11438N/A+#endif
11438N/A+ gnome_vfs_file_info_unref (partial_file_info);
11438N/A+ gnome_vfs_uri_unref (vfs_uri);
11438N/A+
11438N/A+ return re;
11438N/A+}
11438N/A+
11438N/A /**
11438N/A * nautilus_file_can_set_permissions:
11438N/A *
11438N/A@@ -3486,22 +3646,6 @@
11438N/A return file->details->info->permissions;
11438N/A }
11438N/A
11438N/A-static void
11438N/A-set_permissions_callback (GnomeVFSAsyncHandle *handle,
11438N/A- GnomeVFSResult result,
11438N/A- GnomeVFSFileInfo *new_info,
11438N/A- gpointer callback_data)
11438N/A-{
11438N/A- Operation *op;
11438N/A-
11438N/A- op = callback_data;
11438N/A- g_assert (handle == op->handle);
11438N/A-
11438N/A- if (result == GNOME_VFS_OK && new_info != NULL) {
11438N/A- nautilus_file_update_info (op->file, new_info, op->use_slow_mime);
11438N/A- }
11438N/A- operation_complete (op, result);
11438N/A-}
11438N/A
11438N/A /**
11438N/A * nautilus_file_set_permissions:
11438N/A@@ -3553,6 +3697,7 @@
11438N/A }
11438N/A /* Change the file-on-disk permissions. */
11438N/A partial_file_info = gnome_vfs_file_info_new ();
11438N/A+ gnome_vfs_file_info_copy(partial_file_info, file->details->info);
11438N/A partial_file_info->permissions = new_permissions;
11438N/A vfs_uri = nautilus_file_get_gnome_vfs_uri (file);
11438N/A gnome_vfs_async_set_file_info (&op->handle,
11438N/A--- nautilus-2.18.0.1-orig/libnautilus-private/nautilus-file-private.h 2007-04-10 02:59:55.167442000 +0200
11438N/A+++ nautilus-2.18.0.1-alo/libnautilus-private/nautilus-file-private.h 2007-04-03 12:36:04.930411000 +0200
11438N/A@@ -42,7 +42,8 @@
11438N/A (GNOME_VFS_FILE_INFO_FOLLOW_LINKS | \
11438N/A GNOME_VFS_FILE_INFO_GET_MIME_TYPE | \
11438N/A GNOME_VFS_FILE_INFO_GET_SELINUX_CONTEXT | \
11438N/A- GNOME_VFS_FILE_INFO_GET_ACCESS_RIGHTS)
11438N/A+ GNOME_VFS_FILE_INFO_GET_ACCESS_RIGHTS | \
11438N/A+ GNOME_VFS_FILE_INFO_GET_ACL)
11438N/A
11438N/A /* These are in the typical sort order. Known things come first, then
11438N/A * things where we can't know, finally things where we don't yet know.
11438N/A--- nautilus-2.18.0.1-orig/src/file-manager/fm-properties-window.c 2007-04-10 02:59:55.413853000 +0200
11438N/A+++ nautilus-2.18.0.1-alo/src/file-manager/fm-properties-window.c 2007-04-10 01:41:45.120623000 +0200
11438N/A@@ -3,6 +3,7 @@
11438N/A /* fm-properties-window.c - window that lets user modify file properties
11438N/A
11438N/A Copyright (C) 2000 Eazel, Inc.
11438N/A+ Copyright (C) 2006 Sun Microsystems, Inc.
11438N/A
11438N/A The Gnome Library is free software; you can redistribute it and/or
11438N/A modify it under the terms of the GNU Library General Public License as
11438N/A@@ -20,6 +21,7 @@
11438N/A Boston, MA 02111-1307, USA.
11438N/A
11438N/A Authors: Darin Adler <darin@bentspoon.com>
11438N/A+ Alvaro Lopez Ortega <alvaro@sun.com>
11438N/A */
11438N/A
11438N/A #include <config.h>
11438N/A@@ -86,6 +88,96 @@
11438N/A
11438N/A #define ROW_PAD 6
11438N/A
11438N/A+ /* SUN_BRANDING */
11438N/A+#define DEFAULT_USER_STR _("Default user")
11438N/A+ /* SUN_BRANDING */
11438N/A+#define DEFAULT_GROUP_STR _("Default group")
11438N/A+ /* SUN_BRANDING */
11438N/A+#define DEFAULT_OTHERS_STR _("Default others")
11438N/A+ /* SUN_BRANDING */
11438N/A+#define DEFAULT_MASK_STR _("Default mask")
11438N/A+ /* SUN_BRANDING */
11438N/A+#define MASK_STR _("Mask")
11438N/A+
11438N/A+enum {
11438N/A+ COL_KIND = 0,
11438N/A+ COL_ICON,
11438N/A+ COL_USER,
11438N/A+ COL_PERM_READ,
11438N/A+ COL_PERM_WRITE,
11438N/A+ COL_PERM_EXECUTE,
11438N/A+ COL_EFFECTIVE,
11438N/A+ NUM_COLS
11438N/A+};
11438N/A+
11438N/A+enum {
11438N/A+ COL_USER_ENTRY,
11438N/A+/* COL_NEG_USER_ENTRY, */
11438N/A+ COL_GROUP_ENTRY,
11438N/A+/* COL_NEG_GROUP_ENTRY, */
11438N/A+ NUM_PERM_TYPES
11438N/A+};
11438N/A+
11438N/A+enum {
11438N/A+ COL_ICON_USER,
11438N/A+ COL_ICON_NEG_USER,
11438N/A+ COL_ICON_GROUP,
11438N/A+ COL_ICON_NEG_GROUP,
11438N/A+ COL_ICON_MASK,
11438N/A+ COL_ICON_OTHER,
11438N/A+ COL_ICON_NEG_OTHER,
11438N/A+ NUM_COL_ICONS
11438N/A+};
11438N/A+
11438N/A+enum {
11438N/A+ NFS4_ACL_LIST_USER = 0,
11438N/A+ NFS4_ACL_LIST_ICON,
11438N/A+ NFS4_ACL_LIST_TYPE,
11438N/A+ NFS4_ACL_LIST_KIND,
11438N/A+ NFS4_ACL_LIST_N_COLUMNS
11438N/A+};
11438N/A+
11438N/A+
11438N/A+enum {
11438N/A+ NFS4_PERMISSIONS_SELECTED = 0,
11438N/A+ NFS4_PERMISSIONS_NAME,
11438N/A+ NFS4_PERMISSIONS_INCONSISTENT,
11438N/A+ NFS4_PERMISSIONS_N_COLUMNS
11438N/A+};
11438N/A+
11438N/A+/* SUN_BRANDING */
11438N/A+#define ACL_NFS4_APPLY_TO_THIS_FOLDER _("This folder")
11438N/A+#define ACL_NFS4_APPLY_TO_CHILD_FOLDERS _("Child folders")
11438N/A+#define ACL_NFS4_APPLY_TO_CHILD_FILES _("Child files")
11438N/A+#define ACL_NFS4_APPLY_TO_ALL_DESCENDANTS _("All descendants")
11438N/A+
11438N/A+#define ACL_NFS4_TYPE_ALLOW _("Allow")
11438N/A+#define ACL_NFS4_TYPE_DENY _("Deny")
11438N/A+
11438N/A+#define ACL_NFS4_PERM_ADMIN _("Administration")
11438N/A+#define ACL_NFS4_PERM_CHANGE_PERM _("Change Permissions")
11438N/A+#define ACL_NFS4_PERM_CHANGE_OWNER _("Change Owner")
11438N/A+#define ACL_NFS4_PERM_READ _("Read")
11438N/A+#define ACL_NFS4_PERM_READ_ATTRIBUTES _("Read Attributes")
11438N/A+#define ACL_NFS4_PERM_READ_EXT_ATTRIBUTES _("Read Extended Attributes")
11438N/A+#define ACL_NFS4_PERM_LIST_CONTENTS _("List Folder Contents (Read Data)")
11438N/A+#define ACL_NFS4_PERM_TRAVERSE_FOLDER _("Traverse Folder (Execute File)")
11438N/A+#define ACL_NFS4_PERM_READ_PERMISSIONS _("Read Permissions")
11438N/A+#define ACL_NFS4_PERM_WRITE _("Write")
11438N/A+#define ACL_NFS4_PERM_WRITE_ATTRIBUTES _("Write Attributes")
11438N/A+#define ACL_NFS4_PERM_WRITE_EXT_ATTRIBUTES _("Write Extended Attributes")
11438N/A+#define ACL_NFS4_PERM_CREATE_FILES _("Create Files (Write Data)")
11438N/A+#define ACL_NFS4_PERM_CREATE_FOLDER _("Create Folder (Append Data)")
11438N/A+#define ACL_NFS4_PERM_DELETE _("Delete")
11438N/A+#define ACL_NFS4_PERM_DELETE_SUBFOLDERS _("Delete Subfolders and Files")
11438N/A+
11438N/A+#define ACL_NFS4_WHO_OWNER_USER _("Owner user")
11438N/A+#define ACL_NFS4_WHO_OWNER_GROUP _("Owner group")
11438N/A+#define ACL_NFS4_WHO_USER _("User")
11438N/A+#define ACL_NFS4_WHO_GROUP _("Group")
11438N/A+#define ACL_NFS4_WHO_EVERYBODY _("Everybody")
11438N/A+
11438N/A+
11438N/A static GHashTable *windows;
11438N/A static GHashTable *pending_lists;
11438N/A
11438N/A@@ -127,6 +219,14 @@
11438N/A GHashTable *initial_permissions;
11438N/A gboolean has_recursive_apply;
11438N/A
11438N/A+ GtkWidget *acl_view;
11438N/A+ GtkWidget *acl_default_view;
11438N/A+ GHashTable *initial_acl;
11438N/A+ GdkPixbuf *acl_icons[NUM_COL_ICONS];
11438N/A+ GtkWidget *acl_buttons;
11438N/A+ GtkWidget *acl_def_buttons;
11438N/A+ gboolean updating_acl_tab;
11438N/A+
11438N/A GList *value_fields;
11438N/A
11438N/A GList *mime_list;
11438N/A@@ -1135,6 +1235,362 @@
11438N/A return ret;
11438N/A }
11438N/A
11438N/A+
11438N/A+static void
11438N/A+update_acl_page_add_entry (FMPropertiesWindow *window, GnomeVFSACL *acl)
11438N/A+{
11438N/A+ GList *ace_list;
11438N/A+ GList *i;
11438N/A+ GnomeVFSACE *ace;
11438N/A+ gboolean mr,mw,mx;
11438N/A+ gboolean imr,imw,imx;
11438N/A+
11438N/A+ imr = imw = imx = TRUE;
11438N/A+
11438N/A+ /* Read the mask
11438N/A+ */
11438N/A+ ace_list = gnome_vfs_acl_get_ace_list (acl);
11438N/A+
11438N/A+ mx = mw = mx = TRUE;
11438N/A+ for (i=ace_list; i; i=i->next) {
11438N/A+ ace = i->data;
11438N/A+ if (gnome_vfs_ace_get_kind (ace) == GNOME_VFS_ACL_MASK) {
11438N/A+ if (gnome_vfs_ace_get_inherance (ace)) {
11438N/A+ imr = gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_READ);
11438N/A+ imw = gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_WRITE);
11438N/A+ imx = gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_EXECUTE);
11438N/A+ } else {
11438N/A+ mr = gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_READ);
11438N/A+ mw = gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_WRITE);
11438N/A+ mx = gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_EXECUTE);
11438N/A+ }
11438N/A+ }
11438N/A+ }
11438N/A+
11438N/A+ /* Add the ACL entries
11438N/A+ */
11438N/A+ for (i=ace_list; i; i=i->next) {
11438N/A+ const char *id;
11438N/A+ const GnomeVFSACLPerm *perms;
11438N/A+ GnomeVFSACLKind kind;
11438N/A+ gboolean inherit;
11438N/A+ gchar masked_str[4] = {'-','-','-',0};
11438N/A+ gboolean r,w,x;
11438N/A+ GdkPixbuf *icon = NULL;
11438N/A+
11438N/A+ GtkTreeIter iter;
11438N/A+ GtkTreeModel *model;
11438N/A+
11438N/A+ ace = i->data;
11438N/A+
11438N/A+ id = gnome_vfs_ace_get_id (ace);
11438N/A+ kind = gnome_vfs_ace_get_kind (ace);
11438N/A+ perms = gnome_vfs_ace_get_perms (ace);
11438N/A+ inherit = gnome_vfs_ace_get_inherance (ace);
11438N/A+
11438N/A+ r = gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_READ);
11438N/A+ w = gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_WRITE);
11438N/A+ x = gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_EXECUTE);
11438N/A+
11438N/A+ if (inherit) {
11438N/A+ if (imr & r) masked_str[0] = 'r';
11438N/A+ if (imw & w) masked_str[1] = 'w';
11438N/A+ if (imx & x) masked_str[2] = 'x';
11438N/A+ } else {
11438N/A+ if (mr & r) masked_str[0] = 'r';
11438N/A+ if (mw & w) masked_str[1] = 'w';
11438N/A+ if (mx & x) masked_str[2] = 'x';
11438N/A+ }
11438N/A+
11438N/A+ if (inherit)
11438N/A+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (window->details->acl_default_view));
11438N/A+ else
11438N/A+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (window->details->acl_view));
11438N/A+
11438N/A+ switch (kind) {
11438N/A+ case GNOME_VFS_ACL_USER:
11438N/A+ if (inherit && !id)
11438N/A+ id = DEFAULT_USER_STR;
11438N/A+
11438N/A+ if (id != NULL) {
11438N/A+ icon = window->details->acl_icons[COL_ICON_USER];
11438N/A+ gtk_list_store_append (model , &iter);
11438N/A+ gtk_list_store_set (model, &iter,
11438N/A+ COL_ICON, icon,
11438N/A+ COL_KIND, kind,
11438N/A+ COL_USER, id,
11438N/A+ COL_PERM_READ, r,
11438N/A+ COL_PERM_WRITE, w,
11438N/A+ COL_PERM_EXECUTE, x,
11438N/A+ COL_EFFECTIVE, masked_str,
11438N/A+ -1);
11438N/A+ }
11438N/A+ break;
11438N/A+ case GNOME_VFS_ACL_GROUP:
11438N/A+ if (inherit && !id)
11438N/A+ id = DEFAULT_GROUP_STR;
11438N/A+
11438N/A+ if (id != NULL) {
11438N/A+ icon = window->details->acl_icons[COL_ICON_GROUP];
11438N/A+
11438N/A+ gtk_list_store_append (model , &iter);
11438N/A+ gtk_list_store_set (model, &iter,
11438N/A+ COL_ICON, icon,
11438N/A+ COL_KIND, kind,
11438N/A+ COL_USER, id,
11438N/A+ COL_PERM_READ, r,
11438N/A+ COL_PERM_WRITE, w,
11438N/A+ COL_PERM_EXECUTE, x,
11438N/A+ COL_EFFECTIVE, masked_str,
11438N/A+ -1);
11438N/A+ }
11438N/A+ break;
11438N/A+ case GNOME_VFS_ACL_OTHER:
11438N/A+ if (inherit && !id)
11438N/A+ id = DEFAULT_OTHERS_STR;
11438N/A+
11438N/A+ if (id != NULL) {
11438N/A+ icon = window->details->acl_icons[COL_ICON_OTHER];
11438N/A+
11438N/A+ gtk_list_store_append (model , &iter);
11438N/A+ gtk_list_store_set (model, &iter,
11438N/A+ COL_ICON, icon,
11438N/A+ COL_KIND, kind,
11438N/A+ COL_USER, id,
11438N/A+ COL_PERM_READ, r,
11438N/A+ COL_PERM_WRITE, w,
11438N/A+ COL_PERM_EXECUTE, x,
11438N/A+ COL_EFFECTIVE, masked_str,
11438N/A+ -1);
11438N/A+ }
11438N/A+ break;
11438N/A+ case GNOME_VFS_ACL_MASK:
11438N/A+ id = (inherit) ? DEFAULT_MASK_STR : MASK_STR;
11438N/A+
11438N/A+ icon = window->details->acl_icons[COL_ICON_MASK];
11438N/A+
11438N/A+ gtk_list_store_append (model , &iter);
11438N/A+ gtk_list_store_set (model, &iter,
11438N/A+ COL_ICON, icon,
11438N/A+ COL_KIND, kind,
11438N/A+ COL_USER, id,
11438N/A+ COL_PERM_READ, r,
11438N/A+ COL_PERM_WRITE, w,
11438N/A+ COL_PERM_EXECUTE, x,
11438N/A+ COL_EFFECTIVE, masked_str,
11438N/A+ -1);
11438N/A+ break;
11438N/A+ default:
11438N/A+ g_error ("Unhandled ACE: kind=%d\n", kind);
11438N/A+ continue;
11438N/A+ }
11438N/A+ }
11438N/A+
11438N/A+ gnome_vfs_acl_free_ace_list (ace_list);
11438N/A+}
11438N/A+
11438N/A+static void
11438N/A+update_acl_page_classic (FMPropertiesWindow *window)
11438N/A+{
11438N/A+ GtkTreeModel *model;
11438N/A+ gboolean can_set_acl;
11438N/A+ gboolean can_get_acl;
11438N/A+ NautilusFile *file;
11438N/A+
11438N/A+ file = get_target_file (window);
11438N/A+ can_set_acl = nautilus_file_can_set_acl (file);
11438N/A+ can_get_acl = nautilus_file_can_get_acl (file);
11438N/A+
11438N/A+ /* Clean it up
11438N/A+ */
11438N/A+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (window->details->acl_view));
11438N/A+ gtk_list_store_clear (GTK_LIST_STORE(model));
11438N/A+
11438N/A+ gtk_widget_set_sensitive (window->details->acl_buttons, can_set_acl);
11438N/A+
11438N/A+ if (window->details->acl_default_view) {
11438N/A+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (window->details->acl_default_view));
11438N/A+ gtk_list_store_clear (GTK_LIST_STORE(model));
11438N/A+
11438N/A+ gtk_widget_set_sensitive (window->details->acl_def_buttons, can_set_acl);
11438N/A+ }
11438N/A+
11438N/A+ /* Fill it out again
11438N/A+ */
11438N/A+ if (window->details->initial_acl != NULL && can_get_acl) {
11438N/A+ GnomeVFSACL *acl;
11438N/A+
11438N/A+ g_hash_table_remove (window->details->initial_acl, file);
11438N/A+ acl = nautilus_file_get_acl (file);
11438N/A+ g_hash_table_insert (window->details->initial_acl, file, acl);
11438N/A+
11438N/A+ update_acl_page_add_entry (window, acl);
11438N/A+
11438N/A+ /* Update the sentitivity of the lists
11438N/A+ */
11438N/A+ gtk_widget_set_sensitive (window->details->acl_view, can_set_acl);
11438N/A+
11438N/A+ if (window->details->acl_default_view)
11438N/A+ gtk_widget_set_sensitive (window->details->acl_default_view, can_set_acl);
11438N/A+ }
11438N/A+}
11438N/A+
11438N/A+static void
11438N/A+update_acl_nfs4_list_guts (FMPropertiesWindow *window,
11438N/A+ GtkTreeView *acl,
11438N/A+ GnomeVFSACL *file_acl)
11438N/A+{
11438N/A+ GList *i;
11438N/A+ GList *ace_list;
11438N/A+ GnomeVFSACE *ace;
11438N/A+ GtkListStore *list_store;
11438N/A+ GtkTreeIter iter;
11438N/A+ const gchar *type_str;
11438N/A+
11438N/A+ g_assert (GNOME_VFS_IS_ACL(file_acl));
11438N/A+
11438N/A+ ace_list = gnome_vfs_acl_get_ace_list (file_acl);
11438N/A+ list_store = gtk_tree_view_get_model (acl);
11438N/A+
11438N/A+ for (i=ace_list; i; i=i->next) {
11438N/A+ const char *id;
11438N/A+ GnomeVFSACLType type;
11438N/A+ GnomeVFSACLKind kind;
11438N/A+ GdkPixbuf *icon;
11438N/A+
11438N/A+ ace = i->data;
11438N/A+ icon = NULL;
11438N/A+
11438N/A+ g_assert (GNOME_VFS_IS_ACE(ace));
11438N/A+
11438N/A+ type = gnome_vfs_ace_get_ace_type(ace);
11438N/A+ kind = gnome_vfs_ace_get_kind (ace);
11438N/A+
11438N/A+
11438N/A+ type_str = (type == GNOME_VFS_ACL_DENY) ? ACL_NFS4_TYPE_DENY : ACL_NFS4_TYPE_ALLOW;
11438N/A+
11438N/A+ switch (kind) {
11438N/A+ case GNOME_VFS_ACL_USER:
11438N/A+ id = gnome_vfs_ace_get_id (ace);
11438N/A+ if (type == GNOME_VFS_ACL_DENY)
11438N/A+ icon = window->details->acl_icons[COL_ICON_NEG_USER];
11438N/A+ else
11438N/A+ icon = window->details->acl_icons[COL_ICON_USER];
11438N/A+ break;
11438N/A+ case GNOME_VFS_ACL_GROUP:
11438N/A+ id = gnome_vfs_ace_get_id (ace);
11438N/A+ if (type == GNOME_VFS_ACL_DENY)
11438N/A+ icon = window->details->acl_icons[COL_ICON_NEG_GROUP];
11438N/A+ else
11438N/A+ icon = window->details->acl_icons[COL_ICON_GROUP];
11438N/A+ break;
11438N/A+ case GNOME_VFS_ACL_OTHER:
11438N/A+ id = g_strdup(_("Others"));
11438N/A+ if (type == GNOME_VFS_ACL_DENY)
11438N/A+ icon = window->details->acl_icons[COL_ICON_NEG_OTHER];
11438N/A+ else
11438N/A+ icon = window->details->acl_icons[COL_ICON_OTHER];
11438N/A+ break;
11438N/A+ case GNOME_VFS_ACL_MASK:
11438N/A+ id = g_strdup(_("Mask"));
11438N/A+ icon = window->details->acl_icons[COL_ICON_MASK];
11438N/A+ break;
11438N/A+ case GNOME_VFS_ACL_EVERYONE:
11438N/A+ id = g_strdup(_("Everyone"));
11438N/A+ break;
11438N/A+ case GNOME_VFS_ACL_OWNER_USER:
11438N/A+ id = g_strdup(_("Owner user"));
11438N/A+ if (type == GNOME_VFS_ACL_DENY)
11438N/A+ icon = window->details->acl_icons[COL_ICON_NEG_USER];
11438N/A+ else
11438N/A+ icon = window->details->acl_icons[COL_ICON_USER];
11438N/A+ break;
11438N/A+ case GNOME_VFS_ACL_OWNER_GROUP:
11438N/A+ id = g_strdup(_("Owner group"));
11438N/A+ if (type == GNOME_VFS_ACL_DENY)
11438N/A+ icon = window->details->acl_icons[COL_ICON_NEG_GROUP];
11438N/A+ else
11438N/A+ icon = window->details->acl_icons[COL_ICON_GROUP];
11438N/A+ break;
11438N/A+ default:
11438N/A+ id = g_strdup("UNKNOWN");
11438N/A+ }
11438N/A+
11438N/A+ gtk_list_store_append (list_store , &iter);
11438N/A+ gtk_list_store_set (list_store, &iter,
11438N/A+ NFS4_ACL_LIST_USER, id,
11438N/A+ NFS4_ACL_LIST_TYPE, type_str,
11438N/A+ NFS4_ACL_LIST_KIND, kind,
11438N/A+ -1);
11438N/A+
11438N/A+ if (icon != NULL) {
11438N/A+ gtk_list_store_set (list_store, &iter,
11438N/A+ NFS4_ACL_LIST_ICON, icon,
11438N/A+ -1);
11438N/A+ }
11438N/A+ }
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static void
11438N/A+update_acl_nfs4_list (FMPropertiesWindow *window)
11438N/A+{
11438N/A+ GtkTreeView *tree_view;
11438N/A+ GtkListStore *list_store;
11438N/A+ NautilusFile *file;
11438N/A+ GnomeVFSACL *acl;
11438N/A+
11438N/A+ g_assert (FM_IS_PROPERTIES_WINDOW(window));
11438N/A+
11438N/A+ /* Get the ACL
11438N/A+ */
11438N/A+ file = get_target_file (window);
11438N/A+ acl = nautilus_file_get_acl (file);
11438N/A+
11438N/A+ /* Clean the list
11438N/A+ */
11438N/A+ tree_view = g_object_get_data(window, "acl_list_tree_view");
11438N/A+ list_store = gtk_tree_view_get_model(tree_view);
11438N/A+ gtk_list_store_clear (list_store);
11438N/A+
11438N/A+ update_acl_nfs4_list_guts (window, tree_view, acl);
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static void
11438N/A+update_acl_page_nfs4 (FMPropertiesWindow *window)
11438N/A+{
11438N/A+ update_acl_nfs4_list (window);
11438N/A+
11438N/A+ gtk_widget_set_sensitive (g_object_get_data (window, "ace_props_frame"), FALSE);
11438N/A+ gtk_widget_set_sensitive (g_object_get_data (window, "acl_list_add_button"), FALSE);
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static void
11438N/A+update_acl_page (FMPropertiesWindow *window)
11438N/A+{
11438N/A+ GnomeVFSACL *acl;
11438N/A+ GnomeVFSACLScheme acl_scheme;
11438N/A+ NautilusFile *file;
11438N/A+
11438N/A+ file = get_target_file (window);
11438N/A+ acl = nautilus_file_get_acl (file);
11438N/A+ if (acl == NULL)
11438N/A+ return;
11438N/A+ acl_scheme = gnome_vfs_acl_get_scheme(acl);
11438N/A+
11438N/A+ window->details->updating_acl_tab = TRUE;
11438N/A+
11438N/A+ if (acl_scheme == GNOME_VFS_ACL_SCHEME_CLASSIC)
11438N/A+ update_acl_page_classic (window);
11438N/A+ else
11438N/A+ update_acl_page_nfs4 (window);
11438N/A+
11438N/A+ window->details->updating_acl_tab = FALSE;
11438N/A+}
11438N/A+
11438N/A+
11438N/A static void
11438N/A properties_window_update (FMPropertiesWindow *window,
11438N/A GList *files)
11438N/A@@ -1179,6 +1633,9 @@
11438N/A update_properties_window_icon (GTK_IMAGE (window->details->icon_image));
11438N/A
11438N/A update_name_field (window);
11438N/A+ if (should_show_acls (window)) {
11438N/A+ update_acl_page (window);
11438N/A+ }
11438N/A
11438N/A for (l = window->details->emblem_buttons; l != NULL; l = l->next) {
11438N/A emblem_button_update (window, GTK_TOGGLE_BUTTON (l->data));
11438N/A@@ -1337,6 +1794,18 @@
11438N/A return TRUE;
11438N/A }
11438N/A
11438N/A+static gboolean
11438N/A+file_list_some_directory (GList *file_list)
11438N/A+{
11438N/A+ GList *l;
11438N/A+ for (l = file_list; l != NULL; l = l->next) {
11438N/A+ if (nautilus_file_is_directory (NAUTILUS_FILE (l->data))) {
11438N/A+ return TRUE;
11438N/A+ }
11438N/A+ }
11438N/A+ return FALSE;
11438N/A+}
11438N/A+
11438N/A static void
11438N/A value_field_update_internal (GtkLabel *label,
11438N/A GList *file_list)
11438N/A@@ -3689,6 +4158,24 @@
11438N/A }
11438N/A
11438N/A static gboolean
11438N/A+all_can_get_acl (GList *file_list)
11438N/A+{
11438N/A+ GList *l;
11438N/A+
11438N/A+ for (l = file_list; l != NULL; l = l->next) {
11438N/A+ NautilusFile *file;
11438N/A+
11438N/A+ file = NAUTILUS_FILE (l->data);
11438N/A+
11438N/A+ if (!nautilus_file_can_get_acl (file)) {
11438N/A+ return FALSE;
11438N/A+ }
11438N/A+ }
11438N/A+
11438N/A+ return TRUE;
11438N/A+}
11438N/A+
11438N/A+static gboolean
11438N/A all_can_set_permissions (GList *file_list)
11438N/A {
11438N/A GList *l;
11438N/A@@ -4143,112 +4630,2016 @@
11438N/A }
11438N/A }
11438N/A
11438N/A-static void
11438N/A-create_permissions_page (FMPropertiesWindow *window)
11438N/A+static GHashTable *
11438N/A+get_initial_acl (GList *file_list)
11438N/A {
11438N/A- GtkWidget *vbox, *button, *hbox;
11438N/A- GtkTable *page_table;
11438N/A- char *file_name, *prompt_text;
11438N/A- GList *file_list;
11438N/A- guint last_row;
11438N/A-
11438N/A- vbox = create_page_with_vbox (window->details->notebook,
11438N/A- _("Permissions"));
11438N/A-
11438N/A- file_list = window->details->original_files;
11438N/A-
11438N/A- window->details->initial_permissions = NULL;
11438N/A-
11438N/A- if (all_can_get_permissions (file_list) && all_can_get_permissions (window->details->target_files)) {
11438N/A- window->details->initial_permissions = get_initial_permissions (window->details->target_files);
11438N/A- window->details->has_recursive_apply = files_has_changable_permissions_directory (window);
11438N/A-
11438N/A- if (!all_can_set_permissions (file_list)) {
11438N/A- add_prompt_and_separator (
11438N/A- GTK_VBOX (vbox),
11438N/A- _("You are not the owner, so you can't change these permissions."));
11438N/A- }
11438N/A-
11438N/A- page_table = GTK_TABLE (gtk_table_new (1, COLUMN_COUNT, FALSE));
11438N/A- window->details->permissions_table = page_table;
11438N/A-
11438N/A- apply_standard_table_padding (page_table);
11438N/A- gtk_widget_show (GTK_WIDGET (page_table));
11438N/A- gtk_box_pack_start (GTK_BOX (vbox),
11438N/A- GTK_WIDGET (page_table),
11438N/A- TRUE, TRUE, 0);
11438N/A+ GHashTable *ret;
11438N/A+ GList *l;
11438N/A
11438N/A- if (eel_preferences_get_boolean (NAUTILUS_PREFERENCES_SHOW_ADVANCED_PERMISSIONS)) {
11438N/A- window->details->advanced_permissions = TRUE;
11438N/A- create_advanced_permissions (window, page_table);
11438N/A- } else {
11438N/A- window->details->advanced_permissions = FALSE;
11438N/A- create_simple_permissions (window, page_table);
11438N/A- }
11438N/A-
11438N/A- gtk_table_set_row_spacing (page_table, page_table->nrows - 1, 18);
11438N/A-
11438N/A- append_title_value_pair
11438N/A- (window, page_table, _("SELinux Context:"),
11438N/A- "selinux_context", _("--"),
11438N/A- FALSE);
11438N/A- append_title_value_pair
11438N/A- (window, page_table, _("Last changed:"),
11438N/A- "date_permissions", _("--"),
11438N/A- FALSE);
11438N/A+ ret = g_hash_table_new (g_direct_hash,
11438N/A+ g_direct_equal);
11438N/A
11438N/A- if (window->details->has_recursive_apply) {
11438N/A- last_row = append_row (page_table);
11438N/A- hbox = gtk_hbox_new (FALSE, 0);
11438N/A- gtk_widget_show (hbox);
11438N/A- gtk_table_attach (page_table, hbox,
11438N/A- 0, 2,
11438N/A- last_row, last_row+1,
11438N/A- GTK_FILL, 0,
11438N/A- 0, 0);
11438N/A+ for (l = file_list; l != NULL; l = l->next) {
11438N/A+ GnomeVFSACL *acl;
11438N/A+ NautilusFile *file;
11438N/A
11438N/A- button = gtk_button_new_with_mnemonic (_("Apply permissions to enclosed files"));
11438N/A- gtk_widget_show (button);
11438N/A- gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
11438N/A- g_signal_connect (button, "clicked",
11438N/A- G_CALLBACK (apply_recursive_clicked),
11438N/A- window);
11438N/A- }
11438N/A- } else {
11438N/A- if (!is_multi_file_window (window)) {
11438N/A- file_name = nautilus_file_get_display_name (get_target_file (window));
11438N/A- prompt_text = g_strdup_printf (_("The permissions of \"%s\" could not be determined."), file_name);
11438N/A- g_free (file_name);
11438N/A- } else {
11438N/A- prompt_text = g_strdup (_("The permissions of the selected file could not be determined."));
11438N/A- }
11438N/A+ file = NAUTILUS_FILE (l->data);
11438N/A
11438N/A- add_prompt (GTK_VBOX (vbox), prompt_text, TRUE);
11438N/A- g_free (prompt_text);
11438N/A+ acl = nautilus_file_get_acl (file);
11438N/A+ g_hash_table_insert (ret, file, acl);
11438N/A }
11438N/A+
11438N/A+ return ret;
11438N/A }
11438N/A
11438N/A+
11438N/A static void
11438N/A-append_extension_pages (FMPropertiesWindow *window)
11438N/A+acl_change_callback (NautilusFile *file, GnomeVFSResult result, gpointer callback_data)
11438N/A {
11438N/A- GList *providers;
11438N/A- GList *p;
11438N/A-
11438N/A- providers = nautilus_module_get_extensions_for_type (NAUTILUS_TYPE_PROPERTY_PAGE_PROVIDER);
11438N/A-
11438N/A- for (p = providers; p != NULL; p = p->next) {
11438N/A- NautilusPropertyPageProvider *provider;
11438N/A- GList *pages;
11438N/A- GList *l;
11438N/A+ FMPropertiesWindow *window;
11438N/A+ g_assert (callback_data != NULL);
11438N/A
11438N/A- provider = NAUTILUS_PROPERTY_PAGE_PROVIDER (p->data);
11438N/A-
11438N/A- pages = nautilus_property_page_provider_get_pages
11438N/A- (provider, window->details->original_files);
11438N/A-
11438N/A- for (l = pages; l != NULL; l = l->next) {
11438N/A- NautilusPropertyPage *page;
11438N/A- GtkWidget *page_widget;
11438N/A+ window = FM_PROPERTIES_WINDOW (callback_data);
11438N/A+ if (GTK_WIDGET (window)->window != NULL &&
11438N/A+ window->details->long_operation_underway == 1) {
11438N/A+ /* finished !! */
11438N/A+ gdk_window_set_cursor (GTK_WIDGET (window)->window, NULL);
11438N/A+ }
11438N/A+ window->details->long_operation_underway--;
11438N/A+
11438N/A+ /* Report the error if it's an error. */
11438N/A+ fm_report_error_setting_permissions (file, result, NULL);
11438N/A+ g_object_unref (window);
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static void
11438N/A+ace_perm_toggled_cb (GtkCellRendererToggle *cell_renderer,
11438N/A+ gchar *path,
11438N/A+ gpointer user_data,
11438N/A+ GnomeVFSACLPerm perm,
11438N/A+ gboolean is_default_acl)
11438N/A+{
11438N/A+ GtkTreeIter iter;
11438N/A+ GtkTreeModel *model;
11438N/A+ FMPropertiesWindow *window = user_data;
11438N/A+
11438N/A+ gchar *row_id;
11438N/A+ gboolean perm_val;
11438N/A+ GnomeVFSACLKind row_kind;
11438N/A+ int column;
11438N/A+
11438N/A+ GList *file_list, *l;
11438N/A+
11438N/A+ /* Look for the row
11438N/A+ */
11438N/A+ if (is_default_acl)
11438N/A+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (window->details->acl_default_view));
11438N/A+ else
11438N/A+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (window->details->acl_view));
11438N/A+
11438N/A+ gtk_tree_model_get_iter_from_string (model, &iter, path);
11438N/A+
11438N/A+ switch (perm) {
11438N/A+ case GNOME_VFS_ACL_READ:
11438N/A+ column = COL_PERM_READ;
11438N/A+ break;
11438N/A+ case GNOME_VFS_ACL_WRITE:
11438N/A+ column = COL_PERM_WRITE;
11438N/A+ break;
11438N/A+ case GNOME_VFS_ACL_EXECUTE:
11438N/A+ column = COL_PERM_EXECUTE;
11438N/A+ break;
11438N/A+ }
11438N/A+
11438N/A+ /* Update the model
11438N/A+ */
11438N/A+ gtk_tree_model_get (model, &iter,
11438N/A+ COL_USER, &row_id,
11438N/A+ COL_KIND, &row_kind,
11438N/A+ column, &perm_val,
11438N/A+ -1);
11438N/A+
11438N/A+ perm_val = !perm_val;
11438N/A+
11438N/A+ /* Update the files
11438N/A+ */
11438N/A+ file_list = window->details->original_files;
11438N/A+
11438N/A+ for (l = file_list; l != NULL; l = l->next) {
11438N/A+ GnomeVFSACL *acl;
11438N/A+ NautilusFile *file;
11438N/A+ GList *ace_list, *i;
11438N/A+
11438N/A+ file = NAUTILUS_FILE (l->data);
11438N/A+ acl = nautilus_file_get_acl (file);
11438N/A+
11438N/A+ ace_list = gnome_vfs_acl_get_ace_list (acl);
11438N/A+ for (i=ace_list; i; i=i->next) {
11438N/A+ const char *id;
11438N/A+ GnomeVFSACE *ace;
11438N/A+ const GnomeVFSACLPerm *perms;
11438N/A+ GnomeVFSACLKind kind;
11438N/A+ gboolean inherit;
11438N/A+ gboolean default_acl_obj = FALSE;
11438N/A+
11438N/A+ ace = i->data;
11438N/A+
11438N/A+ id = gnome_vfs_ace_get_id (ace);
11438N/A+ kind = gnome_vfs_ace_get_kind (ace);
11438N/A+ perms = gnome_vfs_ace_get_perms (ace);
11438N/A+ inherit = gnome_vfs_ace_get_inherance (ace);
11438N/A+
11438N/A+ if ((kind != row_kind) ||
11438N/A+ (is_default_acl != inherit))
11438N/A+ continue;
11438N/A+
11438N/A+ if ((id == NULL) &&
11438N/A+ ((strcmp (row_id, MASK_STR) == 0) ||
11438N/A+ (strcmp (row_id, DEFAULT_MASK_STR) == 0) ||
11438N/A+ (strcmp (row_id, DEFAULT_USER_STR) == 0) ||
11438N/A+ (strcmp (row_id, DEFAULT_GROUP_STR) == 0) ||
11438N/A+ (strcmp (row_id, DEFAULT_OTHERS_STR) == 0)))
11438N/A+ default_acl_obj = TRUE;
11438N/A+
11438N/A+ if (!default_acl_obj)
11438N/A+ {
11438N/A+ if (id && !row_id)
11438N/A+ continue;
11438N/A+ if (!id && row_id)
11438N/A+ continue;
11438N/A+ if (id && row_id && (strcmp (id, row_id) != 0))
11438N/A+ continue;
11438N/A+ }
11438N/A+
11438N/A+ if (perm_val) {
11438N/A+ gnome_vfs_ace_add_perm (ace, perm);
11438N/A+ } else {
11438N/A+ gnome_vfs_ace_del_perm (ace, perm);
11438N/A+ }
11438N/A+
11438N/A+ g_object_ref (window);
11438N/A+ nautilus_file_set_acl (file, acl,
11438N/A+ acl_change_callback,
11438N/A+ window);
11438N/A+ }
11438N/A+
11438N/A+ gnome_vfs_acl_free_ace_list (ace_list);
11438N/A+ }
11438N/A+
11438N/A+ /* Update the model
11438N/A+ */
11438N/A+ gtk_list_store_set (model, &iter,
11438N/A+ column, perm_val,
11438N/A+ -1);
11438N/A+}
11438N/A+
11438N/A+static void
11438N/A+ace_r_perm_toggled_cb (GtkCellRendererToggle *cell_renderer,
11438N/A+ gchar *path,
11438N/A+ gpointer user_data)
11438N/A+{
11438N/A+ ace_perm_toggled_cb (cell_renderer, path, user_data, GNOME_VFS_ACL_READ, FALSE);
11438N/A+}
11438N/A+static void
11438N/A+ace_w_perm_toggled_cb (GtkCellRendererToggle *cell_renderer,
11438N/A+ gchar *path,
11438N/A+ gpointer user_data)
11438N/A+{
11438N/A+ ace_perm_toggled_cb (cell_renderer, path, user_data, GNOME_VFS_ACL_WRITE, FALSE);
11438N/A+}
11438N/A+static void
11438N/A+ace_x_perm_toggled_cb (GtkCellRendererToggle *cell_renderer,
11438N/A+ gchar *path,
11438N/A+ gpointer user_data)
11438N/A+{
11438N/A+ ace_perm_toggled_cb (cell_renderer, path, user_data, GNOME_VFS_ACL_EXECUTE, FALSE);
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static void
11438N/A+ace_r_perm_def_toggled_cb (GtkCellRendererToggle *cell_renderer,
11438N/A+ gchar *path,
11438N/A+ gpointer user_data)
11438N/A+{
11438N/A+ ace_perm_toggled_cb (cell_renderer, path, user_data, GNOME_VFS_ACL_READ, TRUE);
11438N/A+}
11438N/A+static void
11438N/A+ace_w_perm_def_toggled_cb (GtkCellRendererToggle *cell_renderer,
11438N/A+ gchar *path,
11438N/A+ gpointer user_data)
11438N/A+{
11438N/A+ ace_perm_toggled_cb (cell_renderer, path, user_data, GNOME_VFS_ACL_WRITE, TRUE);
11438N/A+}
11438N/A+static void
11438N/A+ace_x_perm_def_toggled_cb (GtkCellRendererToggle *cell_renderer,
11438N/A+ gchar *path,
11438N/A+ gpointer user_data)
11438N/A+{
11438N/A+ ace_perm_toggled_cb (cell_renderer, path, user_data, GNOME_VFS_ACL_EXECUTE, TRUE);
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static GtkWidget *
11438N/A+create_acl_page_list (GtkWidget *container,
11438N/A+ FMPropertiesWindow *window,
11438N/A+ gboolean default_acl_list)
11438N/A+{
11438N/A+ GtkListStore *store; // GtkTreeModel
11438N/A+ GtkWidget *view;
11438N/A+ GtkCellRenderer *renderer;
11438N/A+ GtkTreeViewColumn *col;
11438N/A+
11438N/A+ /* Load the icons
11438N/A+ */
11438N/A+ window->details->acl_icons[COL_ICON_USER] = gdk_pixbuf_new_from_file (DATADIR"/pixmaps/nautilus/user.png", NULL);
11438N/A+ window->details->acl_icons[COL_ICON_NEG_USER] = gdk_pixbuf_new_from_file (DATADIR"/pixmaps/nautilus/user_neg.png", NULL);
11438N/A+ window->details->acl_icons[COL_ICON_GROUP] = gdk_pixbuf_new_from_file (DATADIR"/pixmaps/nautilus/group.png", NULL);
11438N/A+ window->details->acl_icons[COL_ICON_NEG_GROUP] = gdk_pixbuf_new_from_file (DATADIR"/pixmaps/nautilus/group_neg.png", NULL);
11438N/A+ window->details->acl_icons[COL_ICON_MASK] = gdk_pixbuf_new_from_file (DATADIR"/pixmaps/nautilus/mask.png", NULL);
11438N/A+ window->details->acl_icons[COL_ICON_OTHER] = gdk_pixbuf_new_from_file (DATADIR"/pixmaps/nautilus/other.png", NULL);
11438N/A+ window->details->acl_icons[COL_ICON_NEG_OTHER] = gdk_pixbuf_new_from_file (DATADIR"/pixmaps/nautilus/other_neg.png", NULL);
11438N/A+
11438N/A+ /* Interface
11438N/A+ */
11438N/A+ view = gtk_tree_view_new ();
11438N/A+
11438N/A+ /* The model
11438N/A+ */
11438N/A+ store = gtk_list_store_new (NUM_COLS,
11438N/A+ G_TYPE_INT, /* Kind: user, group, other */
11438N/A+ GDK_TYPE_PIXBUF, /* Type: user, group, other */
11438N/A+ G_TYPE_STRING, /* ID */
11438N/A+ G_TYPE_BOOLEAN, /* r */
11438N/A+ G_TYPE_BOOLEAN, /* w */
11438N/A+ G_TYPE_BOOLEAN, /* x */
11438N/A+ G_TYPE_STRING); /* Effective */
11438N/A+
11438N/A+ gtk_tree_view_set_model (GTK_TREE_VIEW(view), GTK_TREE_MODEL(store));
11438N/A+ g_object_unref (store);
11438N/A+
11438N/A+ /* First column */
11438N/A+ col = gtk_tree_view_column_new();
11438N/A+ gtk_tree_view_column_set_title (col, "");
11438N/A+ gtk_tree_view_column_set_reorderable (col, TRUE);
11438N/A+ gtk_tree_view_column_set_resizable (col, TRUE);
11438N/A+ gtk_tree_view_append_column (GTK_TREE_VIEW(view), col);
11438N/A+
11438N/A+ renderer = gtk_cell_renderer_pixbuf_new();
11438N/A+ gtk_tree_view_column_pack_start(col, renderer, FALSE);
11438N/A+ gtk_tree_view_column_add_attribute(col, renderer, "pixbuf", COL_ICON);
11438N/A+
11438N/A+ renderer = gtk_cell_renderer_text_new();
11438N/A+ gtk_tree_view_column_pack_start(col, renderer, TRUE);
11438N/A+ gtk_tree_view_column_add_attribute(col, renderer, "text", COL_USER);
11438N/A+
11438N/A+ /* READ column */
11438N/A+ col = gtk_tree_view_column_new();
11438N/A+ /* SUN_BRANDING */
11438N/A+ gtk_tree_view_column_set_title (col, _("read"));
11438N/A+ gtk_tree_view_column_set_reorderable (col, FALSE);
11438N/A+ gtk_tree_view_append_column (GTK_TREE_VIEW(view), col);
11438N/A+
11438N/A+ renderer = gtk_cell_renderer_toggle_new();
11438N/A+ gtk_tree_view_column_pack_start (col, renderer, TRUE);
11438N/A+ gtk_tree_view_column_add_attribute (col, renderer, "active", COL_PERM_READ);
11438N/A+
11438N/A+ if (default_acl_list)
11438N/A+ g_signal_connect_object (renderer, "toggled", G_CALLBACK(ace_r_perm_def_toggled_cb), G_OBJECT(window), 0);
11438N/A+ else
11438N/A+ g_signal_connect_object (renderer, "toggled", G_CALLBACK(ace_r_perm_toggled_cb), G_OBJECT(window), 0);
11438N/A+
11438N/A+
11438N/A+ /* WRITE column */
11438N/A+ col = gtk_tree_view_column_new();
11438N/A+ /* SUN_BRANDING */
11438N/A+ gtk_tree_view_column_set_title (col, _("write"));
11438N/A+ gtk_tree_view_column_set_reorderable (col, FALSE);
11438N/A+ gtk_tree_view_append_column (GTK_TREE_VIEW(view), col);
11438N/A+
11438N/A+ renderer = gtk_cell_renderer_toggle_new();
11438N/A+ gtk_tree_view_column_pack_start (col, renderer, TRUE);
11438N/A+ gtk_tree_view_column_add_attribute (col, renderer, "active", COL_PERM_WRITE);
11438N/A+
11438N/A+ if (default_acl_list)
11438N/A+ g_signal_connect_object (renderer, "toggled", G_CALLBACK(ace_w_perm_def_toggled_cb), G_OBJECT(window), 0);
11438N/A+ else
11438N/A+ g_signal_connect_object (renderer, "toggled", G_CALLBACK(ace_w_perm_toggled_cb), G_OBJECT(window), 0);
11438N/A+
11438N/A+ /* EXECUTE column */
11438N/A+ col = gtk_tree_view_column_new();
11438N/A+ /* SUN_BRANDING */
11438N/A+ gtk_tree_view_column_set_title (col, _("exec"));
11438N/A+ gtk_tree_view_column_set_reorderable (col, FALSE);
11438N/A+ gtk_tree_view_append_column (GTK_TREE_VIEW(view), col);
11438N/A+
11438N/A+ renderer = gtk_cell_renderer_toggle_new();
11438N/A+ gtk_tree_view_column_pack_start (col, renderer, TRUE);
11438N/A+ gtk_tree_view_column_add_attribute (col, renderer, "active", COL_PERM_EXECUTE);
11438N/A+
11438N/A+ if (default_acl_list)
11438N/A+ g_signal_connect_object (renderer, "toggled", G_CALLBACK(ace_x_perm_def_toggled_cb), G_OBJECT(window), 0);
11438N/A+ else
11438N/A+ g_signal_connect_object (renderer, "toggled", G_CALLBACK(ace_x_perm_toggled_cb), G_OBJECT(window), 0);
11438N/A+
11438N/A+ /* Effective */
11438N/A+ col = gtk_tree_view_column_new();
11438N/A+ /* SUN_BRANDING */
11438N/A+ gtk_tree_view_column_set_title(col, _("Effective"));
11438N/A+ gtk_tree_view_column_set_reorderable(col, FALSE);
11438N/A+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
11438N/A+
11438N/A+ renderer = gtk_cell_renderer_text_new();
11438N/A+ gtk_tree_view_column_pack_start(col, renderer, TRUE);
11438N/A+ gtk_tree_view_column_add_attribute(col, renderer, "text", COL_EFFECTIVE);
11438N/A+
11438N/A+ gtk_container_add (GTK_CONTAINER(container), view);
11438N/A+
11438N/A+ return view;
11438N/A+}
11438N/A+
11438N/A+static void
11438N/A+acl_add_dialog_response_cb (GtkDialog *dialog,
11438N/A+ gint arg1,
11438N/A+ gpointer user_data)
11438N/A+{
11438N/A+ gchar *id;
11438N/A+ GnomeVFSACE *ace = GNOME_VFS_ACE(user_data);
11438N/A+ GnomeVFSACLPerm perms[4] = {0, 0, 0, 0};
11438N/A+ guint iperm = 0;
11438N/A+
11438N/A+ GtkWidget *check_r = g_object_get_data (G_OBJECT(dialog), "check_r");
11438N/A+ GtkWidget *check_w = g_object_get_data (G_OBJECT(dialog), "check_w");
11438N/A+ GtkWidget *check_x = g_object_get_data (G_OBJECT(dialog), "check_x");
11438N/A+ GtkWidget *combo = g_object_get_data (G_OBJECT(dialog), "combo");
11438N/A+ GtkWidget *entry = g_object_get_data (G_OBJECT(dialog), "entry");
11438N/A+
11438N/A+ if (arg1 == GTK_RESPONSE_CANCEL)
11438N/A+ return;
11438N/A+
11438N/A+ /* Kind
11438N/A+ */
11438N/A+ switch (gtk_combo_box_get_active (GTK_COMBO_BOX(combo))) {
11438N/A+ case COL_USER_ENTRY:
11438N/A+ gnome_vfs_ace_set_kind (ace, GNOME_VFS_ACL_USER);
11438N/A+ break;
11438N/A+/* case COL_NEG_USER_ENTRY: */
11438N/A+/* gnome_vfs_ace_set_kind (ace, GNOME_VFS_ACL_USER); */
11438N/A+/* gnome_vfs_ace_set_negative (ace, TRUE); */
11438N/A+/* break; */
11438N/A+ case COL_GROUP_ENTRY:
11438N/A+ gnome_vfs_ace_set_kind (ace, GNOME_VFS_ACL_GROUP);
11438N/A+ break;
11438N/A+/* case COL_NEG_GROUP_ENTRY: */
11438N/A+/* gnome_vfs_ace_set_kind (ace, GNOME_VFS_ACL_GROUP); */
11438N/A+/* gnome_vfs_ace_set_negative (ace, TRUE); */
11438N/A+/* break; */
11438N/A+ default:
11438N/A+ break;
11438N/A+ }
11438N/A+
11438N/A+ /* ID
11438N/A+ */
11438N/A+ id = gtk_entry_get_text (GTK_ENTRY(entry));
11438N/A+ if (id != NULL) {
11438N/A+ gnome_vfs_ace_set_id (ace, id);
11438N/A+ }
11438N/A+
11438N/A+ /* Perms
11438N/A+ */
11438N/A+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(check_r))) {
11438N/A+ perms[iperm] = GNOME_VFS_ACL_READ;
11438N/A+ iperm++;
11438N/A+ }
11438N/A+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(check_w))) {
11438N/A+ perms[iperm] = GNOME_VFS_ACL_WRITE;
11438N/A+ iperm++;
11438N/A+ }
11438N/A+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(check_x))) {
11438N/A+ perms[iperm] = GNOME_VFS_ACL_EXECUTE;
11438N/A+ iperm++;
11438N/A+ }
11438N/A+
11438N/A+ gnome_vfs_ace_set_perms (ace, perms);
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static GtkWidget *
11438N/A+build_new_add_acl_dialog (FMPropertiesWindow *window, GnomeVFSACE *ace)
11438N/A+{
11438N/A+ GtkWidget *dialog;
11438N/A+ GtkWidget *table;
11438N/A+ GtkWidget *label;
11438N/A+ GtkWidget *check;
11438N/A+ GtkWidget *combo;
11438N/A+ GtkCellRenderer *renderer;
11438N/A+ GtkListStore *combo_store;
11438N/A+ GtkWidget *entry;
11438N/A+ GtkTreeIter iter;
11438N/A+
11438N/A+ /* SUN_BRANDING */
11438N/A+ dialog = gtk_dialog_new_with_buttons (_("Add User/Group"),
11438N/A+ GTK_WINDOW(window),
11438N/A+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
11438N/A+ GTK_STOCK_CANCEL,
11438N/A+ GTK_RESPONSE_CANCEL,
11438N/A+ GTK_STOCK_ADD,
11438N/A+ GTK_RESPONSE_ACCEPT,
11438N/A+ NULL);
11438N/A+
11438N/A+ table = gtk_table_new (2, 6, FALSE);
11438N/A+
11438N/A+ /* SUN_BRANDING */
11438N/A+ label = gtk_label_new (_("User/Group"));
11438N/A+ gtk_table_attach (GTK_TABLE(table), label, 0, 1, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
11438N/A+ /* SUN_BRANDING */
11438N/A+ label = gtk_label_new (_("Name"));
11438N/A+ gtk_table_attach (GTK_TABLE(table), label, 1, 2, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
11438N/A+ label = gtk_label_new ("r");
11438N/A+ gtk_table_attach (GTK_TABLE(table), label, 2, 3, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
11438N/A+ label = gtk_label_new ("w");
11438N/A+ gtk_table_attach (GTK_TABLE(table), label, 3, 4, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
11438N/A+ label = gtk_label_new ("x");
11438N/A+ gtk_table_attach (GTK_TABLE(table), label, 4, 5, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
11438N/A+ /* SUN_BRANDING */
11438N/A+ label = gtk_label_new (_("Effective"));
11438N/A+ gtk_table_attach (GTK_TABLE(table), label, 5, 6, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
11438N/A+
11438N/A+ combo_store = gtk_list_store_new (1, G_TYPE_STRING, NULL);
11438N/A+ gtk_list_store_append (combo_store , &iter);
11438N/A+ /* SUN_BRANDING */
11438N/A+ gtk_list_store_set (combo_store, &iter, 0, _("User"), -1);
11438N/A+/* gtk_list_store_append (combo_store , &iter); */
11438N/A+ /* SUN_BRANDING */
11438N/A+/* gtk_list_store_set (combo_store, &iter, 0, _("User negative"), -1); */
11438N/A+ gtk_list_store_append (combo_store , &iter);
11438N/A+ /* SUN_BRANDING */
11438N/A+ gtk_list_store_set (combo_store, &iter, 0, _("Group"), -1);
11438N/A+/* gtk_list_store_append (combo_store , &iter); */
11438N/A+ /* SUN_BRANDING */
11438N/A+/* gtk_list_store_set (combo_store, &iter, 0, _("Group negative"), -1); */
11438N/A+
11438N/A+ combo = gtk_combo_box_new ();
11438N/A+ g_object_set_data (G_OBJECT(dialog), "combo", combo);
11438N/A+ renderer = gtk_cell_renderer_text_new ();
11438N/A+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(combo), renderer, TRUE);
11438N/A+ gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT(combo), renderer, "text", 0, NULL);
11438N/A+ gtk_combo_box_set_model (GTK_COMBO_BOX (combo), GTK_TREE_MODEL(combo_store));
11438N/A+ g_object_unref (G_OBJECT (combo_store));
11438N/A+ gtk_combo_box_set_active (combo, 0);
11438N/A+ gtk_table_attach (GTK_TABLE(table), combo, 0, 1, 1, 2, GTK_SHRINK, GTK_SHRINK, 0, 0);
11438N/A+
11438N/A+ entry = gtk_entry_new();
11438N/A+ g_object_set_data (G_OBJECT(dialog), "entry", entry);
11438N/A+ gtk_entry_set_max_length (GTK_ENTRY(entry), 64);
11438N/A+ gtk_table_attach (GTK_TABLE(table), entry, 1, 2, 1, 2, GTK_SHRINK, GTK_SHRINK, 0, 0);
11438N/A+
11438N/A+ check = gtk_check_button_new();
11438N/A+ g_object_set_data (G_OBJECT(dialog), "check_r", check);
11438N/A+ gtk_table_attach (GTK_TABLE(table), check, 2, 3, 1, 2, GTK_SHRINK, GTK_SHRINK, 0, 0);
11438N/A+ check = gtk_check_button_new();
11438N/A+ g_object_set_data (G_OBJECT(dialog), "check_w", check);
11438N/A+ gtk_table_attach (GTK_TABLE(table), check, 3, 4, 1, 2, GTK_SHRINK, GTK_SHRINK, 0, 0);
11438N/A+ check = gtk_check_button_new();
11438N/A+ g_object_set_data (G_OBJECT(dialog), "check_x", check);
11438N/A+ gtk_table_attach (GTK_TABLE(table), check, 4, 5, 1, 2, GTK_SHRINK, GTK_SHRINK, 0, 0);
11438N/A+
11438N/A+ label = gtk_label_new (" - - - ");
11438N/A+ gtk_table_attach (GTK_TABLE(table), label, 5, 6, 1, 2, GTK_SHRINK, GTK_SHRINK, 0, 0);
11438N/A+
11438N/A+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG(dialog)->vbox), table, TRUE, TRUE, 0);
11438N/A+
11438N/A+ g_signal_connect_object (dialog, "response",
11438N/A+ G_CALLBACK (acl_add_dialog_response_cb),
11438N/A+ G_OBJECT (ace), 0);
11438N/A+
11438N/A+ return dialog;
11438N/A+}
11438N/A+
11438N/A+static void
11438N/A+add_acl_callback_generic (GtkWidget *button, gpointer user_data, gboolean inherit)
11438N/A+{
11438N/A+ gint result;
11438N/A+ GtkWidget *dialog;
11438N/A+ GnomeVFSACL *acl;
11438N/A+ GnomeVFSACE *ace;
11438N/A+ NautilusFile *file;
11438N/A+ FMPropertiesWindow *window = user_data;
11438N/A+ GnomeVFSResult re;
11438N/A+
11438N/A+ ace = gnome_vfs_ace_new (0, NULL, 0, GNOME_VFS_ACL_ALLOW, GNOME_VFS_ACL_SCHEME_CLASSIC);
11438N/A+
11438N/A+ dialog = build_new_add_acl_dialog (window, ace);
11438N/A+ gtk_widget_show_all (dialog);
11438N/A+
11438N/A+ result = gtk_dialog_run (dialog);
11438N/A+ gtk_widget_destroy (dialog);
11438N/A+
11438N/A+ if (result == GTK_RESPONSE_CANCEL) {
11438N/A+ g_object_unref (ace);
11438N/A+ return;
11438N/A+ }
11438N/A+
11438N/A+ gnome_vfs_ace_set_inherance (ace, inherit);
11438N/A+
11438N/A+ file = get_target_file (window);
11438N/A+ acl = nautilus_file_get_acl (file);
11438N/A+
11438N/A+ gnome_vfs_acl_set (acl, ace);
11438N/A+ g_object_unref (ace);
11438N/A+ g_object_ref (window);
11438N/A+
11438N/A+ g_object_ref (window);
11438N/A+ re = nautilus_file_set_acl (file, acl,
11438N/A+ acl_change_callback,
11438N/A+ window);
11438N/A+
11438N/A+ if (re != GNOME_VFS_OK)
11438N/A+ gnome_vfs_acl_unset (acl, ace);
11438N/A+
11438N/A+ update_acl_page (window);
11438N/A+}
11438N/A+
11438N/A+static void
11438N/A+add_acl_callback (GtkWidget *button, gpointer user_data)
11438N/A+{
11438N/A+ add_acl_callback_generic (button, user_data, FALSE);
11438N/A+}
11438N/A+
11438N/A+static void
11438N/A+add_acl_default_callback (GtkWidget *button, gpointer user_data)
11438N/A+{
11438N/A+ add_acl_callback_generic (button, user_data, TRUE);
11438N/A+}
11438N/A+
11438N/A+static void
11438N/A+del_acl_foreach_selected_generic (GtkTreeModel *model,
11438N/A+ GtkTreePath *path,
11438N/A+ GtkTreeIter *iter,
11438N/A+ gpointer data,
11438N/A+ gboolean is_default)
11438N/A+{
11438N/A+ GList *l, *i;
11438N/A+ gchar *row_id;
11438N/A+ GList *file_list;
11438N/A+ gboolean row_r, row_w, row_x;
11438N/A+ GnomeVFSACLKind row_kind;
11438N/A+ FMPropertiesWindow *window = data;
11438N/A+
11438N/A+ /* Extract the information from the row
11438N/A+ */
11438N/A+ gtk_tree_model_get (model, iter,
11438N/A+ COL_USER, &row_id,
11438N/A+ COL_KIND, &row_kind,
11438N/A+ COL_PERM_READ, &row_r,
11438N/A+ COL_PERM_WRITE, &row_w,
11438N/A+ COL_PERM_EXECUTE, &row_x,
11438N/A+ -1);
11438N/A+
11438N/A+ if (row_kind == GNOME_VFS_ACL_MASK) {
11438N/A+ return;
11438N/A+ }
11438N/A+
11438N/A+ /* Compare it with the ACEs
11438N/A+ */
11438N/A+ file_list = window->details->original_files;
11438N/A+
11438N/A+ for (l = file_list; l != NULL; l = l->next) {
11438N/A+ GnomeVFSACL *acl;
11438N/A+ NautilusFile *file;
11438N/A+ GList *ace_list;
11438N/A+
11438N/A+ file = NAUTILUS_FILE (l->data);
11438N/A+ acl = nautilus_file_get_acl (file);
11438N/A+
11438N/A+ ace_list = gnome_vfs_acl_get_ace_list (acl);
11438N/A+ for (i=ace_list; i; i=i->next) {
11438N/A+ const char *id;
11438N/A+ GnomeVFSACE *ace;
11438N/A+ const GnomeVFSACLPerm *perms;
11438N/A+ GnomeVFSACLKind kind;
11438N/A+ gboolean inherit;
11438N/A+
11438N/A+ ace = i->data;
11438N/A+
11438N/A+ id = gnome_vfs_ace_get_id (ace);
11438N/A+ kind = gnome_vfs_ace_get_kind (ace);
11438N/A+ perms = gnome_vfs_ace_get_perms (ace);
11438N/A+ inherit = gnome_vfs_ace_get_inherance (ace);
11438N/A+
11438N/A+ if ((kind != row_kind) ||
11438N/A+ (inherit != is_default) ||
11438N/A+ (row_r != gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_READ)) ||
11438N/A+ (row_w != gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_WRITE)) ||
11438N/A+ (row_x != gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_EXECUTE)))
11438N/A+ {
11438N/A+ continue;
11438N/A+ }
11438N/A+
11438N/A+ if (id && row_id && (strcmp (id, row_id) == 0)) {
11438N/A+ gnome_vfs_acl_unset (acl, ace);
11438N/A+
11438N/A+ g_object_ref (window);
11438N/A+ nautilus_file_set_acl (file, acl,
11438N/A+ acl_change_callback,
11438N/A+ window);
11438N/A+ }
11438N/A+ }
11438N/A+
11438N/A+ gnome_vfs_acl_free_ace_list (ace_list);
11438N/A+ }
11438N/A+
11438N/A+ /* Remove that list row
11438N/A+ */
11438N/A+ gtk_list_store_remove (model, iter);
11438N/A+}
11438N/A+
11438N/A+static void
11438N/A+del_acl_foreach_selected (GtkTreeModel *model,
11438N/A+ GtkTreePath *path,
11438N/A+ GtkTreeIter *iter,
11438N/A+ gpointer data)
11438N/A+{
11438N/A+ del_acl_foreach_selected_generic (model, path, iter, data, FALSE);
11438N/A+}
11438N/A+
11438N/A+static void
11438N/A+del_acl_default_foreach_selected (GtkTreeModel *model,
11438N/A+ GtkTreePath *path,
11438N/A+ GtkTreeIter *iter,
11438N/A+ gpointer data)
11438N/A+{
11438N/A+ del_acl_foreach_selected_generic (model, path, iter, data, TRUE);
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static void
11438N/A+remove_acl_callback (GtkWidget *button, gpointer user_data)
11438N/A+{
11438N/A+ GtkTreeSelection *selection;
11438N/A+ FMPropertiesWindow *window = user_data;
11438N/A+
11438N/A+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (window->details->acl_view));
11438N/A+ gtk_tree_selection_selected_foreach (selection, del_acl_foreach_selected, window);
11438N/A+}
11438N/A+
11438N/A+static void
11438N/A+remove_acl_default_callback (GtkWidget *button, gpointer user_data)
11438N/A+{
11438N/A+ GtkTreeSelection *selection;
11438N/A+ FMPropertiesWindow *window = user_data;
11438N/A+
11438N/A+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (window->details->acl_default_view));
11438N/A+ gtk_tree_selection_selected_foreach (selection, del_acl_default_foreach_selected, window);
11438N/A+}
11438N/A+
11438N/A+static GnomeVFSACLScheme
11438N/A+get_acl_scheme (GList *file_list)
11438N/A+{
11438N/A+ GList *l;
11438N/A+ GnomeVFSACLScheme scheme = GNOME_VFS_ACL_SCHEME_CLASSIC;
11438N/A+
11438N/A+ for (l = file_list; l != NULL; l = l->next) {
11438N/A+ GnomeVFSACL *acl;
11438N/A+ NautilusFile *file;
11438N/A+ GnomeVFSACLScheme acl_scheme;
11438N/A+
11438N/A+ file = NAUTILUS_FILE (l->data);
11438N/A+ acl = nautilus_file_get_acl (file);
11438N/A+
11438N/A+ acl_scheme = gnome_vfs_acl_get_scheme(acl);
11438N/A+ if (acl_scheme != GNOME_VFS_ACL_SCHEME_CLASSIC)
11438N/A+ scheme = acl_scheme;
11438N/A+ }
11438N/A+
11438N/A+ return scheme;
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static void
11438N/A+fix_acl_nfs4_tree_status (GtkTreeStore *tree_model, const char *path)
11438N/A+{
11438N/A+ gboolean re;
11438N/A+ GtkTreeIter iter;
11438N/A+ GtkTreeIter children;
11438N/A+ const char *name;
11438N/A+ gboolean selected;
11438N/A+ gboolean is_top_level;
11438N/A+
11438N/A+
11438N/A+ is_top_level = (strchr(path, ':') == NULL);
11438N/A+
11438N/A+ /* Handle top level node switchs
11438N/A+ */
11438N/A+ if (is_top_level) {
11438N/A+ /* Check if the top level is selected
11438N/A+ */
11438N/A+ gtk_tree_model_get_iter_from_string (tree_model, &iter, path);
11438N/A+ gtk_tree_model_get (tree_model, &iter,
11438N/A+ NFS4_PERMISSIONS_NAME, &name,
11438N/A+ NFS4_PERMISSIONS_SELECTED, &selected,
11438N/A+ -1);
11438N/A+
11438N/A+ /* (Un)Select children
11438N/A+ */
11438N/A+ gtk_tree_model_iter_children (tree_model, &children, &iter);
11438N/A+ do {
11438N/A+ gtk_tree_store_set (tree_model, &children,
11438N/A+ NFS4_PERMISSIONS_SELECTED, selected,
11438N/A+ -1);
11438N/A+ } while (gtk_tree_model_iter_next (tree_model, &children));
11438N/A+ }
11438N/A+
11438N/A+
11438N/A+ /* Set the inconsistent state to top level nodes
11438N/A+ */
11438N/A+ gtk_tree_model_get_iter_first (tree_model, &iter);
11438N/A+ do {
11438N/A+ guint nsel;
11438N/A+ guint nunsel;
11438N/A+ gboolean top_selected;
11438N/A+ gboolean inconsistent;
11438N/A+
11438N/A+ gtk_tree_model_get (tree_model, &iter,
11438N/A+ NFS4_PERMISSIONS_SELECTED, &top_selected,
11438N/A+ -1);
11438N/A+
11438N/A+ /* Check children
11438N/A+ */
11438N/A+ nsel = 0;
11438N/A+ nunsel = 0;
11438N/A+
11438N/A+ re = gtk_tree_model_iter_children (tree_model, &children, &iter);
11438N/A+ g_assert (re == TRUE);
11438N/A+
11438N/A+ do {
11438N/A+ const char *tmp;
11438N/A+
11438N/A+ gtk_tree_model_get (tree_model, &children,
11438N/A+ NFS4_PERMISSIONS_SELECTED, &selected,
11438N/A+ -1);
11438N/A+ if (selected)
11438N/A+ nsel++;
11438N/A+ else
11438N/A+ nunsel++;
11438N/A+ } while (gtk_tree_model_iter_next (tree_model, &children));
11438N/A+
11438N/A+ /* Set parent consistency
11438N/A+ */
11438N/A+ inconsistent = ((nsel > 0) && (nunsel > 0));
11438N/A+ gtk_tree_store_set (tree_model, &iter,
11438N/A+ NFS4_PERMISSIONS_INCONSISTENT, inconsistent,
11438N/A+ -1);
11438N/A+
11438N/A+ /* If there is an unset entry, parent shouldn't be selected.
11438N/A+ */
11438N/A+ gtk_tree_store_set (tree_model, &iter,
11438N/A+ NFS4_PERMISSIONS_SELECTED, (nunsel <= 0),
11438N/A+ -1);
11438N/A+
11438N/A+ } while (gtk_tree_model_iter_next (tree_model, &iter));
11438N/A+}
11438N/A+
11438N/A+static void
11438N/A+debug_print_ace_permissions (GnomeVFSACE *ace)
11438N/A+{
11438N/A+#define print_perm(s,g) \
11438N/A+ printf (" %s/%d: %d\n", s, g, gnome_vfs_ace_check_perm(ace,g));
11438N/A+
11438N/A+ printf ("ACE %p\n", ace);
11438N/A+ print_perm ("read", GNOME_VFS_ACL_READ);
11438N/A+ print_perm ("exec", GNOME_VFS_ACL_EXECUTE);
11438N/A+ print_perm ("write", GNOME_VFS_ACL_WRITE);
11438N/A+
11438N/A+ print_perm ("list dir", GNOME_VFS_ACL_LIST_DIRECTORY);
11438N/A+ print_perm ("add file", GNOME_VFS_ACL_ADD_FILE);
11438N/A+ print_perm ("append", GNOME_VFS_ACL_APPEND_DATA);
11438N/A+ print_perm ("add subdir", GNOME_VFS_ACL_ADD_SUBDIRECTORY);
11438N/A+ print_perm ("read named", GNOME_VFS_ACL_READ_NAMED_ATTRS);
11438N/A+ print_perm ("write named", GNOME_VFS_ACL_WRITE_NAMED_ATTRS);
11438N/A+ print_perm ("delete child", GNOME_VFS_ACL_DELETE_CHILD);
11438N/A+ print_perm ("read attr", GNOME_VFS_ACL_READ_ATTRIBUTES);
11438N/A+ print_perm ("write attr", GNOME_VFS_ACL_WRITE_ATTRIBUTES);
11438N/A+ print_perm ("del", GNOME_VFS_ACL_DELETE);
11438N/A+ print_perm ("read acl", GNOME_VFS_ACL_READ_ACL);
11438N/A+ print_perm ("write acl", GNOME_VFS_ACL_WRITE_ACL);
11438N/A+ print_perm ("write owner", GNOME_VFS_ACL_WRITE_OWNER);
11438N/A+#undef print_perm
11438N/A+
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static void
11438N/A+set_nfs4_permission_into_ace (FMPropertiesWindow *window,
11438N/A+ GnomeVFSACE *ace)
11438N/A+{
11438N/A+ GtkTreeView *tree_view;
11438N/A+ GtkTreeModel *model;
11438N/A+ GtkTreeIter iter;
11438N/A+
11438N/A+ tree_view = g_object_get_data (window, "ace_permissions_tree_view");
11438N/A+ g_assert (GTK_IS_TREE_VIEW(tree_view));
11438N/A+ model = gtk_tree_view_get_model (tree_view);
11438N/A+
11438N/A+#define set_perm(p) \
11438N/A+ do { \
11438N/A+ if (selected) { \
11438N/A+ gnome_vfs_ace_add_perm (ace, p); \
11438N/A+ } else \
11438N/A+ gnome_vfs_ace_del_perm (ace, p); \
11438N/A+ } while(0)
11438N/A+
11438N/A+ gtk_tree_model_get_iter_first (model, &iter);
11438N/A+ do {
11438N/A+ const char *name;
11438N/A+ gboolean selected;
11438N/A+ GtkTreeIter iter_child;
11438N/A+
11438N/A+ gtk_tree_model_get (model, &iter,
11438N/A+ NFS4_PERMISSIONS_NAME, &name,
11438N/A+ -1);
11438N/A+
11438N/A+ if (!gtk_tree_model_iter_children (model, &iter_child, &iter))
11438N/A+ continue;
11438N/A+
11438N/A+ if (strcmp (name, ACL_NFS4_PERM_ADMIN) == 0) {
11438N/A+ do {
11438N/A+ gtk_tree_model_get (model, &iter_child,
11438N/A+ NFS4_PERMISSIONS_NAME, &name,
11438N/A+ NFS4_PERMISSIONS_SELECTED, &selected,
11438N/A+ -1);
11438N/A+
11438N/A+ if (strcmp (name, ACL_NFS4_PERM_CHANGE_PERM) == 0) {
11438N/A+ set_perm (GNOME_VFS_ACL_WRITE_ACL);
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_CHANGE_OWNER) == 0) {
11438N/A+ set_perm (GNOME_VFS_ACL_WRITE_OWNER);
11438N/A+ }
11438N/A+ } while (gtk_tree_model_iter_next (model, &iter_child));
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_READ) == 0) {
11438N/A+ do {
11438N/A+ gtk_tree_model_get (model, &iter_child,
11438N/A+ NFS4_PERMISSIONS_NAME, &name,
11438N/A+ NFS4_PERMISSIONS_SELECTED, &selected,
11438N/A+ -1);
11438N/A+
11438N/A+ if (strcmp (name, ACL_NFS4_PERM_READ_ATTRIBUTES) == 0) {
11438N/A+ set_perm (GNOME_VFS_ACL_READ_ATTRIBUTES);
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_READ_EXT_ATTRIBUTES) == 0) {
11438N/A+ set_perm (GNOME_VFS_ACL_READ_NAMED_ATTRS);
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_LIST_CONTENTS) == 0) {
11438N/A+ set_perm (GNOME_VFS_ACL_READ);
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_TRAVERSE_FOLDER) == 0) {
11438N/A+ set_perm (GNOME_VFS_ACL_EXECUTE);
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_READ_PERMISSIONS) == 0) {
11438N/A+ set_perm (GNOME_VFS_ACL_READ_ACL);
11438N/A+ }
11438N/A+ } while (gtk_tree_model_iter_next (model, &iter_child));
11438N/A+
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_WRITE) == 0) {
11438N/A+ do {
11438N/A+ gtk_tree_model_get (model, &iter_child,
11438N/A+ NFS4_PERMISSIONS_NAME, &name,
11438N/A+ NFS4_PERMISSIONS_SELECTED, &selected,
11438N/A+ -1);
11438N/A+
11438N/A+ if (strcmp (name, ACL_NFS4_PERM_WRITE_ATTRIBUTES) == 0) {
11438N/A+ set_perm (GNOME_VFS_ACL_WRITE_ATTRIBUTES);
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_WRITE_EXT_ATTRIBUTES) == 0) {
11438N/A+ set_perm (GNOME_VFS_ACL_WRITE_NAMED_ATTRS);
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_CREATE_FILES) == 0) {
11438N/A+ set_perm (GNOME_VFS_ACL_ADD_SUBDIRECTORY);
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_CREATE_FOLDER) == 0) {
11438N/A+ set_perm (GNOME_VFS_ACL_APPEND_DATA);
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_DELETE) == 0) {
11438N/A+ set_perm (GNOME_VFS_ACL_DELETE);
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_DELETE_SUBFOLDERS) == 0) {
11438N/A+ set_perm (GNOME_VFS_ACL_DELETE_CHILD);
11438N/A+ }
11438N/A+ } while (gtk_tree_model_iter_next (model, &iter_child));
11438N/A+ } else {
11438N/A+ g_error ("Unknown entry: '%s'\n", name?name:"");
11438N/A+ }
11438N/A+ } while (gtk_tree_model_iter_next (model, &iter));
11438N/A+#undef set_perm
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static void
11438N/A+set_nfs4_permission_from_ace (FMPropertiesWindow *window,
11438N/A+ GnomeVFSACE *ace)
11438N/A+{
11438N/A+ GtkTreeIter iter;
11438N/A+ GtkTreeView *tree_view;
11438N/A+ GtkTreeModel *model;
11438N/A+ GnomeVFSACLInherance inherance;
11438N/A+ GnomeVFSACLType type;
11438N/A+ GtkWidget *combo;
11438N/A+ const char *name;
11438N/A+
11438N/A+ g_assert (GNOME_VFS_IS_ACE(ace));
11438N/A+ g_assert (FM_IS_PROPERTIES_WINDOW(window));
11438N/A+
11438N/A+ tree_view = g_object_get_data (window, "ace_permissions_tree_view");
11438N/A+ g_assert (GTK_IS_TREE_VIEW(tree_view));
11438N/A+
11438N/A+ gtk_widget_set_sensitive (g_object_get_data (window, "ace_props_frame"), TRUE);
11438N/A+ gtk_widget_set_sensitive (g_object_get_data (window, "acl_list_add_button"), TRUE);
11438N/A+
11438N/A+ /* Set the permissions
11438N/A+ */
11438N/A+ model = gtk_tree_view_get_model (tree_view);
11438N/A+ gtk_tree_model_get_iter_first (model, &iter);
11438N/A+ do {
11438N/A+ const char *name;
11438N/A+ GtkTreeIter iter_child;
11438N/A+
11438N/A+ gtk_tree_model_get (model, &iter,
11438N/A+ NFS4_PERMISSIONS_NAME, &name,
11438N/A+ -1);
11438N/A+
11438N/A+ if (!gtk_tree_model_iter_children (model, &iter_child, &iter))
11438N/A+ continue;
11438N/A+
11438N/A+ if (strcmp (name, ACL_NFS4_PERM_ADMIN) == 0) {
11438N/A+ do {
11438N/A+ gtk_tree_model_get (model, &iter_child, NFS4_PERMISSIONS_NAME, &name, -1);
11438N/A+ if (strcmp (name, ACL_NFS4_PERM_CHANGE_PERM) == 0) {
11438N/A+ gtk_tree_store_set (model, &iter_child, NFS4_PERMISSIONS_SELECTED,
11438N/A+ gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_WRITE_ACL), -1);
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_CHANGE_OWNER) == 0) {
11438N/A+ gtk_tree_store_set (model, &iter_child, NFS4_PERMISSIONS_SELECTED,
11438N/A+ gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_WRITE_OWNER), -1);
11438N/A+ }
11438N/A+ } while (gtk_tree_model_iter_next (model, &iter_child));
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_READ) == 0) {
11438N/A+ do {
11438N/A+ gtk_tree_model_get (model, &iter_child, NFS4_PERMISSIONS_NAME, &name, -1);
11438N/A+ if (strcmp (name, ACL_NFS4_PERM_READ_ATTRIBUTES) == 0) {
11438N/A+ gtk_tree_store_set (model, &iter_child, NFS4_PERMISSIONS_SELECTED,
11438N/A+ gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_READ_ATTRIBUTES), -1);
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_READ_EXT_ATTRIBUTES) == 0) {
11438N/A+ gtk_tree_store_set (model, &iter_child, NFS4_PERMISSIONS_SELECTED,
11438N/A+ gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_READ_NAMED_ATTRS), -1);
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_LIST_CONTENTS) == 0) {
11438N/A+ gtk_tree_store_set (model, &iter_child, NFS4_PERMISSIONS_SELECTED,
11438N/A+ gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_READ), -1);
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_TRAVERSE_FOLDER) == 0) {
11438N/A+ gtk_tree_store_set (model, &iter_child, NFS4_PERMISSIONS_SELECTED,
11438N/A+ gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_EXECUTE), -1);
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_READ_PERMISSIONS) == 0) {
11438N/A+ gtk_tree_store_set (model, &iter_child, NFS4_PERMISSIONS_SELECTED,
11438N/A+ gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_READ_ACL), -1);
11438N/A+ }
11438N/A+ } while (gtk_tree_model_iter_next (model, &iter_child));
11438N/A+
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_WRITE) == 0) {
11438N/A+ do {
11438N/A+ gtk_tree_model_get (model, &iter_child, NFS4_PERMISSIONS_NAME, &name, -1);
11438N/A+ if (strcmp (name, ACL_NFS4_PERM_WRITE_ATTRIBUTES) == 0) {
11438N/A+ gtk_tree_store_set (model, &iter_child, NFS4_PERMISSIONS_SELECTED,
11438N/A+ gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_WRITE_ATTRIBUTES), -1);
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_WRITE_EXT_ATTRIBUTES) == 0) {
11438N/A+ gtk_tree_store_set (model, &iter_child, NFS4_PERMISSIONS_SELECTED,
11438N/A+ gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_WRITE_NAMED_ATTRS), -1);
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_CREATE_FILES) == 0) {
11438N/A+ gtk_tree_store_set (model, &iter_child, NFS4_PERMISSIONS_SELECTED,
11438N/A+ gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_ADD_SUBDIRECTORY), -1);
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_CREATE_FOLDER) == 0) {
11438N/A+ gtk_tree_store_set (model, &iter_child, NFS4_PERMISSIONS_SELECTED,
11438N/A+ gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_APPEND_DATA), -1);
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_DELETE) == 0) {
11438N/A+ gtk_tree_store_set (model, &iter_child, NFS4_PERMISSIONS_SELECTED,
11438N/A+ gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_DELETE), -1);
11438N/A+ } else if (strcmp (name, ACL_NFS4_PERM_DELETE_SUBFOLDERS) == 0) {
11438N/A+ gtk_tree_store_set (model, &iter_child, NFS4_PERMISSIONS_SELECTED,
11438N/A+ gnome_vfs_ace_check_perm (ace, GNOME_VFS_ACL_DELETE_CHILD), -1);
11438N/A+ }
11438N/A+ } while (gtk_tree_model_iter_next (model, &iter_child));
11438N/A+ } else {
11438N/A+ g_error ("Unknown entry: '%s'\n", name?name:"");
11438N/A+ }
11438N/A+
11438N/A+ fix_acl_nfs4_tree_status (model, ":");
11438N/A+
11438N/A+ } while (gtk_tree_model_iter_next (model, &iter));
11438N/A+
11438N/A+ /* Set Inherance
11438N/A+ */
11438N/A+ inherance = gnome_vfs_ace_get_inherance (ace);
11438N/A+ combo = g_object_get_data (window, "acl_nfs4_inherance_combo");
11438N/A+
11438N/A+ model = gtk_combo_box_get_model(combo);
11438N/A+ gtk_tree_model_get_iter_first (model, &iter);
11438N/A+ do {
11438N/A+ gtk_tree_model_get (model, &iter, 0, &name, -1);
11438N/A+ if (((!strcmp (name, ACL_NFS4_APPLY_TO_THIS_FOLDER)) && (inherance == GNOME_VFS_ACL_NO_PROPAGATE)) ||
11438N/A+ ((!strcmp (name, ACL_NFS4_APPLY_TO_CHILD_FOLDERS)) && (inherance == GNOME_VFS_ACL_DIR_INHERIT)) ||
11438N/A+ ((!strcmp (name, ACL_NFS4_APPLY_TO_CHILD_FILES)) && (inherance == GNOME_VFS_ACL_FILE_INHERIT)) ||
11438N/A+ ((!strcmp (name, ACL_NFS4_APPLY_TO_ALL_DESCENDANTS)) && (inherance == GNOME_VFS_ACL_INHERIT_ONLY)))
11438N/A+ gtk_combo_box_set_active_iter (combo, &iter);
11438N/A+ } while (gtk_tree_model_iter_next (model, &iter));
11438N/A+
11438N/A+ /* Set type
11438N/A+ */
11438N/A+ type = gnome_vfs_ace_get_ace_type (ace);
11438N/A+ combo = g_object_get_data (window, "acl_nfs4_type_combo");
11438N/A+
11438N/A+ model = gtk_combo_box_get_model(combo);
11438N/A+ gtk_tree_model_get_iter_first (model, &iter);
11438N/A+ do {
11438N/A+ gtk_tree_model_get (model, &iter, 0, &name, -1);
11438N/A+ if (((!strcmp (name, ACL_NFS4_TYPE_ALLOW)) && (type == GNOME_VFS_ACL_ALLOW)) ||
11438N/A+ ((!strcmp (name, ACL_NFS4_TYPE_DENY)) && (type == GNOME_VFS_ACL_DENY)))
11438N/A+ gtk_combo_box_set_active_iter (combo, &iter);
11438N/A+ } while (gtk_tree_model_iter_next (model, &iter));
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static GnomeVFSACE *
11438N/A+acl_nfs4_acl_list_get_active_ace (FMPropertiesWindow *window,
11438N/A+ GnomeVFSACL **acl_ret,
11438N/A+ GList **ace_list_ret)
11438N/A+{
11438N/A+ gint re;
11438N/A+ GtkTreeView *tree_view;
11438N/A+ GtkTreeModel *model;
11438N/A+ GtkTreeSelection *selection;
11438N/A+ GtkTreeIter iter;
11438N/A+ const char *id;
11438N/A+ const char *name;
11438N/A+ const char *type_str;
11438N/A+ GnomeVFSACLType type;
11438N/A+ GnomeVFSACLKind kind;
11438N/A+ NautilusFile *file;
11438N/A+ GnomeVFSACL *file_acl;
11438N/A+ GList *ace_list;
11438N/A+ GList *i;
11438N/A+ GnomeVFSACE *ace;
11438N/A+ GnomeVFSACE *the_ace = NULL;
11438N/A+
11438N/A+ tree_view = g_object_get_data (window, "acl_list_tree_view");
11438N/A+ selection = gtk_tree_view_get_selection (tree_view);
11438N/A+
11438N/A+ re = gtk_tree_selection_get_selected (selection, &model, &iter);
11438N/A+ if (!re) {
11438N/A+ return NULL;
11438N/A+ }
11438N/A+
11438N/A+ gtk_tree_model_get (model, &iter,
11438N/A+ NFS4_ACL_LIST_USER, &name,
11438N/A+ NFS4_ACL_LIST_TYPE, &type_str,
11438N/A+ NFS4_ACL_LIST_KIND, &kind,
11438N/A+ -1);
11438N/A+ /* Type
11438N/A+ */
11438N/A+ if (strcmp (type_str, ACL_NFS4_TYPE_DENY) == 0) {
11438N/A+ type = GNOME_VFS_ACL_DENY;
11438N/A+ } else {
11438N/A+ type = GNOME_VFS_ACL_ALLOW;
11438N/A+ }
11438N/A+
11438N/A+ /* Look for the right ACE
11438N/A+ */
11438N/A+ file = get_target_file (window);
11438N/A+ file_acl = nautilus_file_get_acl (file);
11438N/A+ ace_list = gnome_vfs_acl_get_ace_list (file_acl);
11438N/A+
11438N/A+ *acl_ret = file_acl;
11438N/A+ *ace_list_ret = ace_list;
11438N/A+
11438N/A+ for (i=ace_list; i; i=i->next) {
11438N/A+ ace = i->data;
11438N/A+ g_assert (GNOME_VFS_IS_ACE(ace));
11438N/A+
11438N/A+ id = gnome_vfs_ace_get_id (ace);
11438N/A+
11438N/A+ if (gnome_vfs_ace_get_ace_type(ace) != type)
11438N/A+ continue;
11438N/A+
11438N/A+ if (gnome_vfs_ace_get_kind (ace) != kind)
11438N/A+ continue;
11438N/A+
11438N/A+ if ((kind == GNOME_VFS_ACL_USER) ||
11438N/A+ (kind == GNOME_VFS_ACL_GROUP))
11438N/A+ {
11438N/A+ if (strcmp (name, id) != 0)
11438N/A+ continue;
11438N/A+ }
11438N/A+
11438N/A+ return ace;
11438N/A+ }
11438N/A+
11438N/A+ return NULL;
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static void
11438N/A+nfs4_permission_toggled_cb (GtkCellRendererToggle *cellrenderertoggle,
11438N/A+ gchar *path,
11438N/A+ FMPropertiesWindow *window)
11438N/A+{
11438N/A+ gint re;
11438N/A+ GtkTreeIter iter;
11438N/A+ GtkTreeStore *tree_model;
11438N/A+ GValue value;
11438N/A+ gboolean old;
11438N/A+ GtkTreeView *tree_view;
11438N/A+ NautilusFile *file;
11438N/A+ GnomeVFSACL *acl;
11438N/A+ GnomeVFSACE *ace;
11438N/A+ GList *list;
11438N/A+
11438N/A+ g_assert (path != NULL);
11438N/A+
11438N/A+ /* Get find the iter
11438N/A+ */
11438N/A+ tree_view = g_object_get_data (window, "ace_permissions_tree_view");
11438N/A+
11438N/A+ tree_model = gtk_tree_view_get_model (tree_view);
11438N/A+ g_return_if_fail (GTK_IS_TREE_MODEL (tree_model));
11438N/A+
11438N/A+ re = gtk_tree_model_get_iter_from_string (tree_model, &iter, path);
11438N/A+ if (re != TRUE) {
11438N/A+ g_warning ("Couldn't access path %s\n", path);
11438N/A+ return;
11438N/A+ }
11438N/A+
11438N/A+ /* Read the value
11438N/A+ */
11438N/A+ memset (&value, 0, sizeof(value));
11438N/A+ gtk_tree_model_get_value (tree_model,
11438N/A+ &iter,
11438N/A+ NFS4_PERMISSIONS_SELECTED,
11438N/A+ &value);
11438N/A+
11438N/A+ old = g_value_get_boolean (&value);
11438N/A+ g_value_unset (&value);
11438N/A+
11438N/A+ /* Set the new value
11438N/A+ */
11438N/A+ gtk_tree_store_set (GTK_TREE_STORE(tree_model), &iter, NFS4_PERMISSIONS_SELECTED, !old, -1);
11438N/A+
11438N/A+ /* Now that the state has change, check that everething is
11438N/A+ * still coherent.
11438N/A+ */
11438N/A+ fix_acl_nfs4_tree_status (tree_model, path);
11438N/A+
11438N/A+ /* Apply the changes to the NautilusFile
11438N/A+ */
11438N/A+ file = get_target_file (window);
11438N/A+
11438N/A+ ace = acl_nfs4_acl_list_get_active_ace (window, &acl, &list);
11438N/A+ if (!ace) return;
11438N/A+
11438N/A+ set_nfs4_permission_into_ace (window, ace);
11438N/A+
11438N/A+ g_object_ref (window);
11438N/A+ re = nautilus_file_set_acl (file, acl,
11438N/A+ acl_change_callback,
11438N/A+ window);
11438N/A+
11438N/A+// gnome_vfs_acl_free_ace_list (list);
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static void
11438N/A+acl_nfs4_acl_list_selection_changed_cb (GtkTreeSelection *selection,
11438N/A+ FMPropertiesWindow *window)
11438N/A+{
11438N/A+ GList *list;
11438N/A+ GnomeVFSACL *acl;
11438N/A+ GnomeVFSACE *ace;
11438N/A+
11438N/A+ window->details->updating_acl_tab = TRUE;
11438N/A+
11438N/A+ g_assert (GTK_IS_TREE_SELECTION(selection));
11438N/A+ g_assert (FM_IS_PROPERTIES_WINDOW(window));
11438N/A+
11438N/A+ ace = acl_nfs4_acl_list_get_active_ace (window, &acl, &list);
11438N/A+ if (!ace) goto out;
11438N/A+
11438N/A+ set_nfs4_permission_from_ace (window, ace);
11438N/A+ gnome_vfs_acl_free_ace_list (list);
11438N/A+
11438N/A+out:
11438N/A+ window->details->updating_acl_tab = FALSE;
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static GtkWidget *
11438N/A+create_acl_nfs4_permission_tree (FMPropertiesWindow *window)
11438N/A+{
11438N/A+ GtkTreeView *tree_view;
11438N/A+ GtkTreeStore *tree_store;
11438N/A+ GtkTreeIter iter;
11438N/A+ GtkTreeIter iter_child;
11438N/A+ GtkTreeViewColumn *column;
11438N/A+ GtkCellRenderer *checkbox_renderer;
11438N/A+ GtkCellRenderer *text_renderer;
11438N/A+ GtkTreeSelection *selection;
11438N/A+
11438N/A+
11438N/A+ /* Create the tree view widget
11438N/A+ */
11438N/A+ tree_view = gtk_tree_view_new ();
11438N/A+
11438N/A+ /* Create the model
11438N/A+ */
11438N/A+ tree_store = gtk_tree_store_new (NFS4_PERMISSIONS_N_COLUMNS,
11438N/A+ G_TYPE_BOOLEAN,
11438N/A+ G_TYPE_STRING,
11438N/A+ G_TYPE_BOOLEAN);
11438N/A+
11438N/A+ gtk_tree_view_set_model (tree_view, GTK_TREE_MODEL(tree_store));
11438N/A+ g_object_unref (tree_store);
11438N/A+
11438N/A+ /* Add a few examples
11438N/A+ */
11438N/A+#define list_add_child(str) \
11438N/A+ list_add (str, &iter_child, &iter)
11438N/A+
11438N/A+#define list_add(str, iter_child, iter) \
11438N/A+ gtk_tree_store_append (tree_store, iter_child, iter); \
11438N/A+ gtk_tree_store_set (tree_store, iter_child, \
11438N/A+ NFS4_PERMISSIONS_SELECTED, FALSE, \
11438N/A+ NFS4_PERMISSIONS_NAME, (str), \
11438N/A+ NFS4_PERMISSIONS_INCONSISTENT, FALSE,\
11438N/A+ -1)
11438N/A+
11438N/A+ list_add (_("Administration"), &iter, NULL);
11438N/A+ list_add_child (_("Change Permissions"));
11438N/A+ list_add_child (_("Change Owner"));
11438N/A+
11438N/A+ list_add (_("Read"), &iter, NULL);
11438N/A+ list_add_child (_("Read Attributes"));
11438N/A+ list_add_child (_("Read Extended Attributes"));
11438N/A+ list_add_child (_("List Folder Contents (Read Data)"));
11438N/A+ list_add_child (_("Traverse Folder (Execute File)"));
11438N/A+ list_add_child (_("Read Permissions"));
11438N/A+
11438N/A+
11438N/A+ list_add (_("Write"), &iter, NULL);
11438N/A+ list_add_child (_("Write Attributes"));
11438N/A+ list_add_child (_("Write Extended Attributes"));
11438N/A+ list_add_child (_("Create Files (Write Data)"));
11438N/A+ list_add_child (_("Create Folder (Append Data)"));
11438N/A+ list_add_child (_("Delete"));
11438N/A+ list_add_child (_("Delete Subfolders and Files"));
11438N/A+
11438N/A+#undef list_add
11438N/A+#undef list_add_child
11438N/A+
11438N/A+ /* Add the columns
11438N/A+ */
11438N/A+ text_renderer = gtk_cell_renderer_text_new();
11438N/A+ checkbox_renderer = gtk_cell_renderer_toggle_new();
11438N/A+ g_signal_connect (checkbox_renderer,
11438N/A+ "toggled",
11438N/A+ G_CALLBACK(nfs4_permission_toggled_cb),
11438N/A+ window);
11438N/A+
11438N/A+ column = gtk_tree_view_column_new_with_attributes (_("Set"), checkbox_renderer,
11438N/A+ "active", NFS4_PERMISSIONS_SELECTED,
11438N/A+ "inconsistent", NFS4_PERMISSIONS_INCONSISTENT,
11438N/A+ NULL);
11438N/A+ gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
11438N/A+ gtk_tree_view_append_column (tree_view, column);
11438N/A+
11438N/A+ column = gtk_tree_view_column_new_with_attributes (_("Permission"), text_renderer,
11438N/A+ "text", NFS4_PERMISSIONS_NAME,
11438N/A+ NULL);
11438N/A+ gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
11438N/A+ gtk_tree_view_append_column (tree_view, column);
11438N/A+
11438N/A+
11438N/A+ /* Final steps
11438N/A+ */
11438N/A+#if 0
11438N/A+ gtk_tree_view_expand_all (tree_view);
11438N/A+#endif
11438N/A+ return GTK_WIDGET(tree_view);
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static GtkWidget *
11438N/A+create_acl_nfs4_acl_list (FMPropertiesWindow *window)
11438N/A+{
11438N/A+ GtkListStore *list_store;
11438N/A+ GtkTreeView *tree_view;
11438N/A+ GtkCellRenderer *text_renderer;
11438N/A+ GtkCellRenderer *pixbuf_renderer;
11438N/A+ GtkTreeViewColumn *column;
11438N/A+
11438N/A+ /* Instance the store and the tree_view
11438N/A+ */
11438N/A+ tree_view = gtk_tree_view_new ();
11438N/A+ list_store = gtk_list_store_new (NFS4_ACL_LIST_N_COLUMNS,
11438N/A+ G_TYPE_STRING,
11438N/A+ GDK_TYPE_PIXBUF,
11438N/A+ G_TYPE_STRING,
11438N/A+ G_TYPE_INT);
11438N/A+
11438N/A+ gtk_tree_view_set_model (tree_view, GTK_TREE_MODEL(list_store));
11438N/A+ g_object_unref (list_store);
11438N/A+
11438N/A+ /* Add columns
11438N/A+ */
11438N/A+ text_renderer = gtk_cell_renderer_text_new();
11438N/A+ pixbuf_renderer = gtk_cell_renderer_pixbuf_new();
11438N/A+
11438N/A+ column = gtk_tree_view_column_new();
11438N/A+ gtk_tree_view_column_set_title (column, _("Name"));
11438N/A+ gtk_tree_view_column_set_reorderable (column, TRUE);
11438N/A+ gtk_tree_view_column_set_resizable (column, TRUE);
11438N/A+ gtk_tree_view_append_column (GTK_TREE_VIEW(tree_view), column);
11438N/A+
11438N/A+ gtk_tree_view_column_pack_start(column, pixbuf_renderer, FALSE);
11438N/A+ gtk_tree_view_column_add_attribute(column, pixbuf_renderer, "pixbuf", NFS4_ACL_LIST_ICON);
11438N/A+
11438N/A+ gtk_tree_view_column_pack_start(column, text_renderer, TRUE);
11438N/A+ gtk_tree_view_column_add_attribute(column, text_renderer, "text", NFS4_ACL_LIST_USER);
11438N/A+
11438N/A+
11438N/A+ text_renderer = gtk_cell_renderer_text_new();
11438N/A+ column = gtk_tree_view_column_new_with_attributes (_("Type"), text_renderer,
11438N/A+ "text", NFS4_ACL_LIST_TYPE,
11438N/A+ NULL);
11438N/A+ gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
11438N/A+ gtk_tree_view_append_column (tree_view, column);
11438N/A+
11438N/A+ /* Events
11438N/A+ */
11438N/A+ g_signal_connect_after (G_OBJECT (gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view))),
11438N/A+ "changed", G_CALLBACK(acl_nfs4_acl_list_selection_changed_cb), window);
11438N/A+
11438N/A+ return GTK_WIDGET(tree_view);
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static void
11438N/A+acl_nfs4_inherance_changed_cb (GtkComboBox *widget,
11438N/A+ FMPropertiesWindow *window)
11438N/A+{
11438N/A+ guint re;
11438N/A+ GList *list;
11438N/A+ GnomeVFSACL *acl;
11438N/A+ GnomeVFSACE *ace;
11438N/A+ GnomeVFSACLInherance inherance;
11438N/A+ const char *active;
11438N/A+ NautilusFile *file;
11438N/A+
11438N/A+ if (window->details->updating_acl_tab)
11438N/A+ return;
11438N/A+
11438N/A+ file = get_target_file (window);
11438N/A+
11438N/A+ ace = acl_nfs4_acl_list_get_active_ace (window, &acl, &list);
11438N/A+ if (!ace) return;
11438N/A+
11438N/A+ active = gtk_combo_box_get_active_text (widget);
11438N/A+ if (!active) return;
11438N/A+
11438N/A+ if (!strcmp (active, ACL_NFS4_APPLY_TO_THIS_FOLDER)) {
11438N/A+ inherance = GNOME_VFS_ACL_NO_PROPAGATE;
11438N/A+ } else if (!strcmp (active, ACL_NFS4_APPLY_TO_CHILD_FOLDERS)) {
11438N/A+ inherance = GNOME_VFS_ACL_DIR_INHERIT;
11438N/A+ } else if (!strcmp (active, ACL_NFS4_APPLY_TO_CHILD_FILES)) {
11438N/A+ inherance = GNOME_VFS_ACL_FILE_INHERIT;
11438N/A+ } else if (!strcmp (active, ACL_NFS4_APPLY_TO_ALL_DESCENDANTS)) {
11438N/A+ inherance = GNOME_VFS_ACL_INHERIT_ONLY;
11438N/A+ } else {
11438N/A+ inherance = GNOME_VFS_ACL_INHERANCE_NULL;
11438N/A+ }
11438N/A+
11438N/A+ gnome_vfs_ace_set_inherance (ace, inherance);
11438N/A+
11438N/A+ g_object_ref (window);
11438N/A+ re = nautilus_file_set_acl (file, acl,
11438N/A+ acl_change_callback,
11438N/A+ window);
11438N/A+
11438N/A+// gnome_vfs_acl_free_ace_list (list);
11438N/A+ update_acl_page (window);
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static void
11438N/A+build_new_add_acl_nfs4_dialog_who_changed_cb (GtkComboBox *widget,
11438N/A+ GtkWidget *dialog)
11438N/A+{
11438N/A+ gboolean hide;
11438N/A+ const char *text;
11438N/A+ GtkWidget *entry;
11438N/A+
11438N/A+ entry = g_object_get_data (dialog, "id_text");
11438N/A+
11438N/A+ text = gtk_combo_box_get_active_text(widget);
11438N/A+ if (!text) return;
11438N/A+
11438N/A+ hide = ((!strcmp(text, ACL_NFS4_WHO_OWNER_USER)) ||
11438N/A+ (!strcmp(text, ACL_NFS4_WHO_OWNER_GROUP)) ||
11438N/A+ (!strcmp(text, ACL_NFS4_WHO_EVERYBODY)));
11438N/A+
11438N/A+ gtk_widget_set_sensitive (entry, !hide);
11438N/A+
11438N/A+ if (hide)
11438N/A+ gtk_entry_set_text (entry, "");
11438N/A+}
11438N/A+
11438N/A+static GtkWidget *
11438N/A+build_new_add_acl_nfs4_dialog (FMPropertiesWindow *window)
11438N/A+{
11438N/A+ GtkWidget *dialog;
11438N/A+ GtkWidget *table;
11438N/A+ GtkWidget *label;
11438N/A+ GtkWidget *who_combo;
11438N/A+ GtkWidget *sense_combo;
11438N/A+ GtkWidget *id;
11438N/A+
11438N/A+ dialog = gtk_dialog_new_with_buttons (_("Add User/Group"),
11438N/A+ GTK_WINDOW(window),
11438N/A+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
11438N/A+ GTK_STOCK_CANCEL,
11438N/A+ GTK_RESPONSE_CANCEL,
11438N/A+ GTK_STOCK_ADD,
11438N/A+ GTK_RESPONSE_ACCEPT,
11438N/A+ NULL);
11438N/A+
11438N/A+ table = gtk_table_new (2, 6, FALSE);
11438N/A+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG(dialog)->vbox), table, TRUE, TRUE, 0);
11438N/A+
11438N/A+ label = gtk_label_new (_("Sense"));
11438N/A+ gtk_table_attach (GTK_TABLE(table), label, 0, 1, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
11438N/A+
11438N/A+ label = gtk_label_new (_("Who"));
11438N/A+ gtk_table_attach (GTK_TABLE(table), label, 1, 2, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
11438N/A+
11438N/A+ label = gtk_label_new (_("ID"));
11438N/A+ gtk_table_attach (GTK_TABLE(table), label, 2, 3, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
11438N/A+
11438N/A+ sense_combo = gtk_combo_box_new_text();
11438N/A+ gtk_combo_box_append_text(sense_combo, ACL_NFS4_TYPE_ALLOW);
11438N/A+ gtk_combo_box_append_text(sense_combo, ACL_NFS4_TYPE_DENY);
11438N/A+ gtk_table_attach (GTK_TABLE(table), sense_combo, 0, 1, 1, 2, GTK_SHRINK, GTK_SHRINK, 6, 6);
11438N/A+
11438N/A+ who_combo = gtk_combo_box_new_text();
11438N/A+ gtk_combo_box_append_text(who_combo, ACL_NFS4_WHO_OWNER_USER);
11438N/A+ gtk_combo_box_append_text(who_combo, ACL_NFS4_WHO_OWNER_GROUP);
11438N/A+ gtk_combo_box_append_text(who_combo, ACL_NFS4_WHO_USER);
11438N/A+ gtk_combo_box_append_text(who_combo, ACL_NFS4_WHO_GROUP);
11438N/A+ gtk_combo_box_append_text(who_combo, ACL_NFS4_WHO_EVERYBODY);
11438N/A+ gtk_table_attach (GTK_TABLE(table), who_combo, 1, 2, 1, 2, GTK_SHRINK, GTK_SHRINK, 6, 6);
11438N/A+
11438N/A+ id = gtk_entry_new();
11438N/A+ gtk_table_attach (GTK_TABLE(table), id, 2, 3, 1, 2, GTK_SHRINK, GTK_SHRINK, 6, 6);
11438N/A+
11438N/A+ /* Initial state
11438N/A+ */
11438N/A+ gtk_combo_box_set_active (who_combo, 0);
11438N/A+ gtk_combo_box_set_active (sense_combo, 0);
11438N/A+ gtk_widget_set_sensitive(id, FALSE);
11438N/A+
11438N/A+ /* Pointers
11438N/A+ */
11438N/A+ g_object_set_data (dialog, "sense_combo", sense_combo);
11438N/A+ g_object_set_data (dialog, "who_combo", who_combo);
11438N/A+ g_object_set_data (dialog, "id_text", id);
11438N/A+
11438N/A+ /* Events
11438N/A+ */
11438N/A+ g_signal_connect (G_OBJECT(who_combo), "changed",
11438N/A+ G_CALLBACK(build_new_add_acl_nfs4_dialog_who_changed_cb), dialog);
11438N/A+
11438N/A+ return dialog;
11438N/A+}
11438N/A+
11438N/A+static void
11438N/A+acl_nfs4_add_button_cb (GtkButton *button,
11438N/A+ FMPropertiesWindow *window)
11438N/A+{
11438N/A+ gint re;
11438N/A+ gint result;
11438N/A+ GnomeVFSACL *acl;
11438N/A+ GnomeVFSACE *ace;
11438N/A+ NautilusFile *file;
11438N/A+ GtkWidget *dialog;
11438N/A+
11438N/A+ GtkWidget *sense_combo;
11438N/A+ GtkWidget *who_combo;
11438N/A+ const char *combo_text;
11438N/A+ gboolean read_id = FALSE;
11438N/A+
11438N/A+ file = get_target_file (window);
11438N/A+ acl = nautilus_file_get_acl (file);
11438N/A+
11438N/A+ dialog = build_new_add_acl_nfs4_dialog (window);
11438N/A+ gtk_widget_show_all (dialog);
11438N/A+ result = gtk_dialog_run (dialog);
11438N/A+
11438N/A+ if (result == GTK_RESPONSE_CANCEL) {
11438N/A+ gtk_widget_destroy (dialog);
11438N/A+ return;
11438N/A+ }
11438N/A+
11438N/A+ ace = gnome_vfs_ace_new (0, NULL, 0, GNOME_VFS_ACL_ALLOW, GNOME_VFS_ACL_SCHEME_NFS4);
11438N/A+
11438N/A+ /* Read Type
11438N/A+ */
11438N/A+ sense_combo = g_object_get_data (dialog, "sense_combo");
11438N/A+ combo_text = gtk_combo_box_get_active_text (sense_combo);
11438N/A+ if (!strcmp(combo_text, ACL_NFS4_TYPE_DENY))
11438N/A+ gnome_vfs_ace_set_ace_type (ace, GNOME_VFS_ACL_DENY);
11438N/A+ else
11438N/A+ gnome_vfs_ace_set_ace_type (ace, GNOME_VFS_ACL_ALLOW);
11438N/A+
11438N/A+ /* Read Kind
11438N/A+ */
11438N/A+ who_combo = g_object_get_data (dialog, "who_combo");
11438N/A+ combo_text = gtk_combo_box_get_active_text (who_combo);
11438N/A+ if (!strcmp(combo_text, ACL_NFS4_WHO_OWNER_USER))
11438N/A+ gnome_vfs_ace_set_kind (ace, GNOME_VFS_ACL_OWNER_USER);
11438N/A+ else if (!strcmp(combo_text, ACL_NFS4_WHO_OWNER_GROUP))
11438N/A+ gnome_vfs_ace_set_kind (ace, GNOME_VFS_ACL_OWNER_GROUP);
11438N/A+ else if (!strcmp(combo_text, ACL_NFS4_WHO_EVERYBODY))
11438N/A+ gnome_vfs_ace_set_kind (ace, GNOME_VFS_ACL_EVERYONE);
11438N/A+ else if (!strcmp(combo_text, ACL_NFS4_WHO_USER)) {
11438N/A+ gnome_vfs_ace_set_kind (ace, GNOME_VFS_ACL_USER);
11438N/A+ read_id = TRUE;
11438N/A+ } else if (!strcmp(combo_text, ACL_NFS4_WHO_GROUP)) {
11438N/A+ gnome_vfs_ace_set_kind (ace, GNOME_VFS_ACL_GROUP);
11438N/A+ read_id = TRUE;
11438N/A+ }
11438N/A+
11438N/A+ /* ID
11438N/A+ */
11438N/A+ if (read_id) {
11438N/A+ GtkWidget *id_text = g_object_get_data (dialog, "id_text");
11438N/A+ combo_text = gtk_entry_get_text(id_text);
11438N/A+ if ((combo_text) && strlen(combo_text))
11438N/A+ gnome_vfs_ace_set_id (ace, combo_text);
11438N/A+ }
11438N/A+
11438N/A+ gnome_vfs_acl_set (acl, ace);
11438N/A+ g_object_unref (ace);
11438N/A+
11438N/A+ g_object_ref (window);
11438N/A+ re = nautilus_file_set_acl (file, acl,
11438N/A+ acl_change_callback,
11438N/A+ window);
11438N/A+
11438N/A+ if (re != GNOME_VFS_OK)
11438N/A+ gnome_vfs_acl_unset (acl, ace);
11438N/A+
11438N/A+ update_acl_page (window);
11438N/A+ gtk_widget_destroy (dialog);
11438N/A+}
11438N/A+
11438N/A+static void
11438N/A+acl_nfs4_del_button_cb (GtkButton *button,
11438N/A+ FMPropertiesWindow *window)
11438N/A+{
11438N/A+ gint re;
11438N/A+ GList *list;
11438N/A+ GnomeVFSACL *acl;
11438N/A+ GnomeVFSACE *ace;
11438N/A+ NautilusFile *file;
11438N/A+
11438N/A+ file = get_target_file (window);
11438N/A+
11438N/A+ ace = acl_nfs4_acl_list_get_active_ace (window, &acl, &list);
11438N/A+ if (!ace) return;
11438N/A+
11438N/A+ gnome_vfs_acl_unset (acl, ace);
11438N/A+
11438N/A+ g_object_ref (window);
11438N/A+ re = nautilus_file_set_acl (file, acl,
11438N/A+ acl_change_callback,
11438N/A+ window);
11438N/A+
11438N/A+// gnome_vfs_acl_free_ace_list (list);
11438N/A+ update_acl_page (window);
11438N/A+}
11438N/A+
11438N/A+static void
11438N/A+acl_nfs4_type_changed_cb (GtkComboBox *widget,
11438N/A+ FMPropertiesWindow *window)
11438N/A+{
11438N/A+ guint re;
11438N/A+ GList *list;
11438N/A+ GnomeVFSACL *acl;
11438N/A+ GnomeVFSACE *ace;
11438N/A+ const char *active;
11438N/A+ NautilusFile *file;
11438N/A+ GnomeVFSACLType type;
11438N/A+
11438N/A+ if (window->details->updating_acl_tab) {
11438N/A+ return;
11438N/A+ }
11438N/A+
11438N/A+ file = get_target_file (window);
11438N/A+
11438N/A+ ace = acl_nfs4_acl_list_get_active_ace (window, &acl, &list);
11438N/A+ if (!ace) return;
11438N/A+
11438N/A+
11438N/A+ active = gtk_combo_box_get_active_text (widget);
11438N/A+ if (!active) return;
11438N/A+
11438N/A+ if (!strcmp (active, ACL_NFS4_TYPE_DENY))
11438N/A+ type = GNOME_VFS_ACL_DENY;
11438N/A+ else
11438N/A+ type = GNOME_VFS_ACL_ALLOW;
11438N/A+
11438N/A+
11438N/A+ gnome_vfs_ace_set_ace_type(ace, type);
11438N/A+
11438N/A+ g_object_ref (window);
11438N/A+ re = nautilus_file_set_acl (file, acl,
11438N/A+ acl_change_callback,
11438N/A+ window);
11438N/A+
11438N/A+// gnome_vfs_acl_free_ace_list (list);
11438N/A+ update_acl_page (window);
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static void
11438N/A+create_acl_page_nfs4 (FMPropertiesWindow *window)
11438N/A+{
11438N/A+ GtkWidget *hpaned;
11438N/A+ GtkWidget *vbox;
11438N/A+ GtkWidget *vbox_acl_list;
11438N/A+ GtkWidget *acl_list;
11438N/A+ GtkWidget *perms;
11438N/A+ GtkWidget *props_vbox;
11438N/A+ GtkWidget *props_hbox;
11438N/A+ GtkWidget *buttons_hbox;
11438N/A+ GtkWidget *inherance_combo;
11438N/A+ GtkWidget *type_combo;
11438N/A+ GtkWidget *button_add;
11438N/A+ GtkWidget *button_remove;
11438N/A+
11438N/A+ /* Load the icons
11438N/A+ */
11438N/A+ window->details->acl_icons[COL_ICON_USER] = gdk_pixbuf_new_from_file (DATADIR"/pixmaps/nautilus/user.png", NULL);
11438N/A+ window->details->acl_icons[COL_ICON_NEG_USER] = gdk_pixbuf_new_from_file (DATADIR"/pixmaps/nautilus/user_neg.png", NULL);
11438N/A+ window->details->acl_icons[COL_ICON_GROUP] = gdk_pixbuf_new_from_file (DATADIR"/pixmaps/nautilus/group.png", NULL);
11438N/A+ window->details->acl_icons[COL_ICON_NEG_GROUP] = gdk_pixbuf_new_from_file (DATADIR"/pixmaps/nautilus/group_neg.png", NULL);
11438N/A+ window->details->acl_icons[COL_ICON_MASK] = gdk_pixbuf_new_from_file (DATADIR"/pixmaps/nautilus/mask.png", NULL);
11438N/A+ window->details->acl_icons[COL_ICON_OTHER] = gdk_pixbuf_new_from_file (DATADIR"/pixmaps/nautilus/other.png", NULL);
11438N/A+ window->details->acl_icons[COL_ICON_NEG_OTHER] = gdk_pixbuf_new_from_file (DATADIR"/pixmaps/nautilus/other_neg.png", NULL);
11438N/A+
11438N/A+ /* Panel
11438N/A+ */
11438N/A+ hpaned = gtk_hpaned_new ();
11438N/A+ vbox = create_page_with_vbox (window->details->notebook,
11438N/A+ /* SUN_BRANDING */
11438N/A+ _("Access List"));
11438N/A+ gtk_box_pack_start (GTK_BOX (vbox), hpaned, TRUE, TRUE, 0);
11438N/A+
11438N/A+ /* Add ACL
11438N/A+ */
11438N/A+ acl_list = create_acl_nfs4_acl_list (window);
11438N/A+
11438N/A+ buttons_hbox = gtk_hbox_new(TRUE, 0);
11438N/A+ button_add = gtk_button_new_from_stock (GTK_STOCK_ADD);
11438N/A+ button_remove = gtk_button_new_from_stock (GTK_STOCK_REMOVE);
11438N/A+ gtk_box_pack_start (GTK_BOX(buttons_hbox), button_add, FALSE, TRUE, 6);
11438N/A+ gtk_box_pack_end (GTK_BOX(buttons_hbox), button_remove, FALSE, TRUE, 6);
11438N/A+
11438N/A+ vbox_acl_list = gtk_vbox_new(FALSE, 0);
11438N/A+ gtk_box_pack_start (GTK_BOX(vbox_acl_list), acl_list, TRUE, TRUE, 0);
11438N/A+ gtk_box_pack_start (GTK_BOX(vbox_acl_list), buttons_hbox, FALSE, FALSE, 6);
11438N/A+
11438N/A+ gtk_paned_pack1 (GTK_PANED (hpaned), vbox_acl_list, TRUE, FALSE);
11438N/A+
11438N/A+ /* Add the property tree
11438N/A+ */
11438N/A+ inherance_combo = gtk_combo_box_new_text();
11438N/A+ gtk_combo_box_append_text(inherance_combo, ACL_NFS4_APPLY_TO_THIS_FOLDER);
11438N/A+ gtk_combo_box_append_text(inherance_combo, ACL_NFS4_APPLY_TO_CHILD_FOLDERS);
11438N/A+ gtk_combo_box_append_text(inherance_combo, ACL_NFS4_APPLY_TO_CHILD_FILES);
11438N/A+ gtk_combo_box_append_text(inherance_combo, ACL_NFS4_APPLY_TO_ALL_DESCENDANTS);
11438N/A+
11438N/A+ type_combo = gtk_combo_box_new_text();
11438N/A+ gtk_combo_box_append_text(type_combo, ACL_NFS4_TYPE_ALLOW);
11438N/A+ gtk_combo_box_append_text(type_combo, ACL_NFS4_TYPE_DENY);
11438N/A+
11438N/A+ props_hbox = gtk_hbox_new(FALSE, 0);
11438N/A+ gtk_box_pack_start (GTK_BOX(props_hbox), gtk_label_new(_("Apply to")), FALSE, FALSE, 6);
11438N/A+ gtk_box_pack_start (GTK_BOX(props_hbox), inherance_combo, FALSE, FALSE, 0);
11438N/A+ gtk_box_pack_end (GTK_BOX(props_hbox), type_combo, FALSE, FALSE, 0);
11438N/A+ gtk_box_pack_end (GTK_BOX(props_hbox), gtk_label_new(_("Type")), FALSE, FALSE, 6);
11438N/A+
11438N/A+ props_vbox = gtk_vbox_new(FALSE, 0);
11438N/A+ perms = create_acl_nfs4_permission_tree(window);
11438N/A+ gtk_box_pack_start (GTK_BOX(props_vbox), props_hbox, FALSE, FALSE, 6);
11438N/A+ gtk_box_pack_start (GTK_BOX(props_vbox), perms, TRUE, TRUE, 0);
11438N/A+ gtk_box_pack_start (GTK_BOX(props_vbox), buttons_hbox, FALSE, FALSE, 6);
11438N/A+
11438N/A+ gtk_paned_pack2 (GTK_PANED (hpaned), props_vbox, TRUE, FALSE);
11438N/A+
11438N/A+ window->details->acl_view = perms;
11438N/A+
11438N/A+ /* Events
11438N/A+ */
11438N/A+ g_signal_connect (G_OBJECT(type_combo), "changed",
11438N/A+ G_CALLBACK(acl_nfs4_type_changed_cb), window);
11438N/A+ g_signal_connect (G_OBJECT(inherance_combo), "changed",
11438N/A+ G_CALLBACK(acl_nfs4_inherance_changed_cb), window);
11438N/A+
11438N/A+ g_signal_connect (G_OBJECT(button_add), "clicked",
11438N/A+ G_CALLBACK(acl_nfs4_add_button_cb), window);
11438N/A+ g_signal_connect (G_OBJECT(button_remove), "clicked",
11438N/A+ G_CALLBACK(acl_nfs4_del_button_cb), window);
11438N/A+
11438N/A+ /* Store a few pointers
11438N/A+ */
11438N/A+ g_object_set_data (window, "ace_props_frame", props_vbox);
11438N/A+ g_object_set_data (window, "acl_nfs4_type_combo", type_combo);
11438N/A+ g_object_set_data (window, "acl_nfs4_inherance_combo", inherance_combo);
11438N/A+ g_object_set_data (window, "acl_list_tree_view", acl_list);
11438N/A+ g_object_set_data (window, "acl_list_add_button", button_remove);
11438N/A+ g_object_set_data (window, "ace_permissions_tree_view", perms);
11438N/A+
11438N/A+ /* Set initial state
11438N/A+ */
11438N/A+ gtk_widget_set_sensitive (props_vbox, FALSE);
11438N/A+ gtk_widget_set_sensitive (button_remove, FALSE);
11438N/A+
11438N/A+ gtk_widget_show_all (vbox);
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static void
11438N/A+create_acl_page_classic (FMPropertiesWindow *window)
11438N/A+{
11438N/A+ GtkWidget *vbox;
11438N/A+ GtkWidget *hbox;
11438N/A+ GtkWidget *button_box;
11438N/A+ GList *file_list;
11438N/A+ GtkWidget *button_add;
11438N/A+ GtkWidget *button_remove;
11438N/A+ GtkWidget *empty_label;
11438N/A+ GtkWidget *scroll;
11438N/A+ GtkWidget *view;
11438N/A+ GtkWidget *title;
11438N/A+ gboolean dir_found;
11438N/A+ GtkWidget *panel = NULL;
11438N/A+ GtkWidget *block;
11438N/A+
11438N/A+ dir_found = file_list_some_directory (window->details->target_files);
11438N/A+
11438N/A+ vbox = create_page_with_vbox (window->details->notebook,
11438N/A+ /* SUN_BRANDING */
11438N/A+ _("Access List"));
11438N/A+ if (dir_found) {
11438N/A+ panel = gtk_vpaned_new();
11438N/A+ gtk_box_pack_start (GTK_BOX (vbox), panel, TRUE, TRUE, 0);
11438N/A+ }
11438N/A+
11438N/A+ file_list = window->details->original_files;
11438N/A+
11438N/A+// if (all_can_get_acl (file_list)) {
11438N/A+ block = gtk_vbox_new (FALSE, 0);
11438N/A+
11438N/A+ window->details->initial_acl = get_initial_acl (window->details->target_files);
11438N/A+
11438N/A+ /* SUN_BRANDING */
11438N/A+ title = gtk_label_new (_("Common ACL"));
11438N/A+ gtk_label_set_justify (GTK_LABEL(title), GTK_JUSTIFY_LEFT);
11438N/A+ gtk_box_pack_start (GTK_BOX (block), title, FALSE, FALSE, 0);
11438N/A+
11438N/A+ hbox = gtk_hbox_new (FALSE, 0);
11438N/A+ gtk_container_set_border_width (GTK_CONTAINER (hbox), GNOME_PAD);
11438N/A+ gtk_box_pack_start (GTK_BOX (block), hbox, TRUE, TRUE, 0);
11438N/A+
11438N/A+ /* Left hand column
11438N/A+ */
11438N/A+ scroll = gtk_scrolled_window_new (NULL, NULL);
11438N/A+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
11438N/A+ GTK_POLICY_AUTOMATIC,
11438N/A+ GTK_POLICY_AUTOMATIC);
11438N/A+
11438N/A+
11438N/A+ window->details->acl_view = create_acl_page_list (scroll, window, FALSE);
11438N/A+ gtk_box_pack_start (GTK_BOX(hbox), GTK_WIDGET(scroll), TRUE, TRUE, 0);
11438N/A+
11438N/A+ /* Right hand column
11438N/A+ */
11438N/A+ button_box = gtk_vbox_new (FALSE, 0);
11438N/A+ window->details->acl_buttons = button_box;
11438N/A+ button_add = gtk_button_new_from_stock (GTK_STOCK_ADD);
11438N/A+ button_remove = gtk_button_new_from_stock (GTK_STOCK_REMOVE);
11438N/A+ empty_label = gtk_label_new("");
11438N/A+
11438N/A+ g_signal_connect_object (button_add, "clicked",
11438N/A+ G_CALLBACK (add_acl_callback),
11438N/A+ G_OBJECT (window),
11438N/A+ 0);
11438N/A+ g_signal_connect_object (button_remove, "clicked",
11438N/A+ G_CALLBACK (remove_acl_callback),
11438N/A+ G_OBJECT (window),
11438N/A+ 0);
11438N/A+
11438N/A+ gtk_box_pack_start (GTK_BOX(button_box), button_add, FALSE, FALSE, 0);
11438N/A+ gtk_box_pack_start (GTK_BOX(button_box), button_remove, FALSE, FALSE, 0);
11438N/A+ gtk_box_pack_start (GTK_BOX(button_box), empty_label, TRUE, TRUE, 0);
11438N/A+
11438N/A+ gtk_box_pack_start (GTK_BOX(hbox), GTK_WIDGET(button_box), FALSE, FALSE, 0);
11438N/A+
11438N/A+ if (panel)
11438N/A+ gtk_paned_add1 (panel, block);
11438N/A+ else
11438N/A+ gtk_box_pack_start (GTK_BOX (vbox), block, TRUE, TRUE, 0);
11438N/A+// }
11438N/A+
11438N/A+ /* Default ACLs
11438N/A+ */
11438N/A+ if (dir_found) {
11438N/A+ block = gtk_vbox_new (FALSE, 0);
11438N/A+
11438N/A+ /* SUN_BRANDING */
11438N/A+ title = gtk_label_new (_("Default ACL"));
11438N/A+ gtk_label_set_justify (title, GTK_JUSTIFY_LEFT);
11438N/A+ gtk_box_pack_start (GTK_BOX (block), title, FALSE, FALSE, 0);
11438N/A+
11438N/A+ hbox = gtk_hbox_new (FALSE, 0);
11438N/A+ gtk_container_set_border_width (GTK_CONTAINER (hbox), GNOME_PAD);
11438N/A+ gtk_box_pack_start (GTK_BOX (block), hbox, TRUE, TRUE, 0);
11438N/A+
11438N/A+ scroll = gtk_scrolled_window_new (NULL, NULL);
11438N/A+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
11438N/A+ GTK_POLICY_AUTOMATIC,
11438N/A+ GTK_POLICY_AUTOMATIC);
11438N/A+
11438N/A+ window->details->acl_default_view = create_acl_page_list (scroll, window, TRUE);
11438N/A+ gtk_box_pack_start (GTK_BOX(hbox), GTK_WIDGET(scroll), TRUE, TRUE, 0);
11438N/A+
11438N/A+ /* Right hand column
11438N/A+ */
11438N/A+ button_box = gtk_vbox_new (FALSE, 0);
11438N/A+ window->details->acl_def_buttons = button_box;
11438N/A+ button_add = gtk_button_new_from_stock (GTK_STOCK_ADD);
11438N/A+ button_remove = gtk_button_new_from_stock (GTK_STOCK_REMOVE);
11438N/A+ empty_label = gtk_label_new("");
11438N/A+
11438N/A+ g_signal_connect_object (button_add, "clicked",
11438N/A+ G_CALLBACK (add_acl_default_callback),
11438N/A+ G_OBJECT (window),
11438N/A+ 0);
11438N/A+ g_signal_connect_object (button_remove, "clicked",
11438N/A+ G_CALLBACK (remove_acl_default_callback),
11438N/A+ G_OBJECT (window),
11438N/A+ 0);
11438N/A+
11438N/A+ gtk_box_pack_start (GTK_BOX(button_box), button_add, FALSE, FALSE, 0);
11438N/A+ gtk_box_pack_start (GTK_BOX(button_box), button_remove, FALSE, FALSE, 0);
11438N/A+ gtk_box_pack_start (GTK_BOX(button_box), empty_label, TRUE, TRUE, 0);
11438N/A+
11438N/A+ gtk_box_pack_start (GTK_BOX(hbox), GTK_WIDGET(button_box), FALSE, FALSE, 0);
11438N/A+
11438N/A+ gtk_paned_add2 (panel, block);
11438N/A+ }
11438N/A+
11438N/A+ gtk_widget_show_all (vbox);
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static void
11438N/A+create_acl_page (FMPropertiesWindow *window)
11438N/A+{
11438N/A+ GList *file_list;
11438N/A+ GnomeVFSACLScheme scheme;
11438N/A+
11438N/A+ /* Ensure the ACL tab should be shown
11438N/A+ */
11438N/A+ file_list = window->details->original_files;
11438N/A+ if (! all_can_get_acl (file_list))
11438N/A+ return;
11438N/A+
11438N/A+ /* Check the ACL type
11438N/A+ */
11438N/A+ scheme = get_acl_scheme (window->details->original_files);
11438N/A+ if (scheme == GNOME_VFS_ACL_SCHEME_CLASSIC) {
11438N/A+ create_acl_page_classic (window);
11438N/A+ return;
11438N/A+
11438N/A+ } else if (scheme == GNOME_VFS_ACL_SCHEME_NFS4) {
11438N/A+ create_acl_page_nfs4 (window);
11438N/A+ return;
11438N/A+ }
11438N/A+
11438N/A+ g_error ("Unknown ACL scheme: scheme=%d\n", scheme);
11438N/A+}
11438N/A+
11438N/A+
11438N/A+static void
11438N/A+create_permissions_page (FMPropertiesWindow *window)
11438N/A+{
11438N/A+ GtkWidget *vbox, *button, *hbox;
11438N/A+ GtkTable *page_table;
11438N/A+ char *file_name, *prompt_text;
11438N/A+ GList *file_list;
11438N/A+ guint last_row;
11438N/A+
11438N/A+ vbox = create_page_with_vbox (window->details->notebook,
11438N/A+ _("Permissions"));
11438N/A+
11438N/A+ file_list = window->details->original_files;
11438N/A+
11438N/A+ window->details->initial_permissions = NULL;
11438N/A+
11438N/A+ if (all_can_get_permissions (file_list) && all_can_get_permissions (window->details->target_files)) {
11438N/A+ window->details->initial_permissions = get_initial_permissions (window->details->target_files);
11438N/A+ window->details->has_recursive_apply = files_has_changable_permissions_directory (window);
11438N/A+
11438N/A+ if (!all_can_set_permissions (file_list)) {
11438N/A+ add_prompt_and_separator (
11438N/A+ GTK_VBOX (vbox),
11438N/A+ _("You are not the owner, so you can't change these permissions."));
11438N/A+ }
11438N/A+
11438N/A+ page_table = GTK_TABLE (gtk_table_new (1, COLUMN_COUNT, FALSE));
11438N/A+ window->details->permissions_table = page_table;
11438N/A+
11438N/A+ apply_standard_table_padding (page_table);
11438N/A+ gtk_widget_show (GTK_WIDGET (page_table));
11438N/A+ gtk_box_pack_start (GTK_BOX (vbox),
11438N/A+ GTK_WIDGET (page_table),
11438N/A+ TRUE, TRUE, 0);
11438N/A+
11438N/A+ if (eel_preferences_get_boolean (NAUTILUS_PREFERENCES_SHOW_ADVANCED_PERMISSIONS)) {
11438N/A+ window->details->advanced_permissions = TRUE;
11438N/A+ create_advanced_permissions (window, page_table);
11438N/A+ } else {
11438N/A+ window->details->advanced_permissions = FALSE;
11438N/A+ create_simple_permissions (window, page_table);
11438N/A+ }
11438N/A+
11438N/A+ gtk_table_set_row_spacing (page_table, page_table->nrows - 1, 18);
11438N/A+
11438N/A+ append_title_value_pair
11438N/A+ (window, page_table, _("SELinux Context:"),
11438N/A+ "selinux_context", _("--"),
11438N/A+ FALSE);
11438N/A+ append_title_value_pair
11438N/A+ (window, page_table, _("Last changed:"),
11438N/A+ "date_permissions", _("--"),
11438N/A+ FALSE);
11438N/A+
11438N/A+ if (window->details->has_recursive_apply) {
11438N/A+ last_row = append_row (page_table);
11438N/A+ hbox = gtk_hbox_new (FALSE, 0);
11438N/A+ gtk_widget_show (hbox);
11438N/A+ gtk_table_attach (page_table, hbox,
11438N/A+ 0, 2,
11438N/A+ last_row, last_row+1,
11438N/A+ GTK_FILL, 0,
11438N/A+ 0, 0);
11438N/A+
11438N/A+ button = gtk_button_new_with_mnemonic (_("Apply permissions to enclosed files"));
11438N/A+ gtk_widget_show (button);
11438N/A+ gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
11438N/A+ g_signal_connect (button, "clicked",
11438N/A+ G_CALLBACK (apply_recursive_clicked),
11438N/A+ window);
11438N/A+ }
11438N/A+ } else {
11438N/A+ if (!is_multi_file_window (window)) {
11438N/A+ file_name = nautilus_file_get_display_name (get_target_file (window));
11438N/A+ prompt_text = g_strdup_printf (_("The permissions of \"%s\" could not be determined."), file_name);
11438N/A+ g_free (file_name);
11438N/A+ } else {
11438N/A+ prompt_text = g_strdup (_("The permissions of the selected file could not be determined."));
11438N/A+ }
11438N/A+
11438N/A+ add_prompt (GTK_VBOX (vbox), prompt_text, TRUE);
11438N/A+ g_free (prompt_text);
11438N/A+ }
11438N/A+}
11438N/A+
11438N/A+static void
11438N/A+append_extension_pages (FMPropertiesWindow *window)
11438N/A+{
11438N/A+ GList *providers;
11438N/A+ GList *p;
11438N/A+
11438N/A+ providers = nautilus_module_get_extensions_for_type (NAUTILUS_TYPE_PROPERTY_PAGE_PROVIDER);
11438N/A+
11438N/A+ for (p = providers; p != NULL; p = p->next) {
11438N/A+ NautilusPropertyPageProvider *provider;
11438N/A+ GList *pages;
11438N/A+ GList *l;
11438N/A+
11438N/A+ provider = NAUTILUS_PROPERTY_PAGE_PROVIDER (p->data);
11438N/A+
11438N/A+ pages = nautilus_property_page_provider_get_pages
11438N/A+ (provider, window->details->original_files);
11438N/A+
11438N/A+ for (l = pages; l != NULL; l = l->next) {
11438N/A+ NautilusPropertyPage *page;
11438N/A+ GtkWidget *page_widget;
11438N/A GtkWidget *label;
11438N/A
11438N/A page = NAUTILUS_PROPERTY_PAGE (l->data);
11438N/A@@ -4306,6 +6697,27 @@
11438N/A return TRUE;
11438N/A }
11438N/A
11438N/A+static gboolean
11438N/A+should_show_acls (FMPropertiesWindow *window)
11438N/A+{
11438N/A+ NautilusFile *file;
11438N/A+
11438N/A+ if (is_multi_file_window (window)) {
11438N/A+ return FALSE;
11438N/A+ }
11438N/A+
11438N/A+ /* Don't show ACL tab for desktop special icons (trash, etc)
11438N/A+ * or desktop files. We don't get the open-with menu for these anyway.
11438N/A+ */
11438N/A+ file = get_original_file (window);
11438N/A+ if (file == NULL ||
11438N/A+ NAUTILUS_IS_DESKTOP_ICON_FILE (file) ||
11438N/A+ nautilus_file_is_nautilus_link (file)) {
11438N/A+ return FALSE;
11438N/A+ }
11438N/A+ return TRUE;
11438N/A+}
11438N/A+
11438N/A static char *
11438N/A get_pending_key (GList *file_list)
11438N/A {
11438N/A@@ -4547,6 +6959,12 @@
11438N/A create_open_with_page (window);
11438N/A }
11438N/A
11438N/A+ printf ("should_show_acls (window) %d\n", should_show_acls (window));
11438N/A+
11438N/A+ if (should_show_acls (window)) {
11438N/A+ create_acl_page (window);
11438N/A+ }
11438N/A+
11438N/A /* append pages from available views */
11438N/A append_extension_pages (window);
11438N/A
11438N/A@@ -4799,6 +7217,7 @@
11438N/A {
11438N/A FMPropertiesWindow *window;
11438N/A GList *l;
11438N/A+ guint i;
11438N/A
11438N/A window = FM_PROPERTIES_WINDOW (object);
11438N/A
11438N/A@@ -4829,6 +7248,18 @@
11438N/A window->details->initial_emblems = NULL;
11438N/A }
11438N/A
11438N/A+ if (window->details->initial_acl) {
11438N/A+ g_hash_table_destroy (window->details->initial_acl);
11438N/A+ window->details->initial_acl = NULL;
11438N/A+ }
11438N/A+
11438N/A+ for (i = 0; i<NUM_COL_ICONS; i++) {
11438N/A+ if (window->details->acl_icons[i]) {
11438N/A+ g_object_unref (window->details->acl_icons[i]);
11438N/A+ window->details->acl_icons[i] = NULL;
11438N/A+ }
11438N/A+ }
11438N/A+
11438N/A g_list_free (window->details->permission_buttons);
11438N/A window->details->permission_buttons = NULL;
11438N/A
11438N/A--- nautilus-2.18.0.1-orig/icons/Makefile.am 2007-04-10 02:59:55.100929000 +0200
11438N/A+++ nautilus-2.18.0.1-alo/icons/Makefile.am 2007-04-03 12:35:58.912379000 +0200
11438N/A@@ -14,6 +14,13 @@
11438N/A knob.png \
11438N/A note-indicator.png \
11438N/A thumbnail_frame.png \
11438N/A+ user.png \
11438N/A+ user_neg.png \
11438N/A+ group.png \
11438N/A+ group_neg.png \
11438N/A+ mask.png \
11438N/A+ other.png \
11438N/A+ other_neg.png \
11438N/A $(NULL)
11438N/A
11438N/A EXTRA_DIST = $(icon_DATA)