Blame SOURCES/nautilus-3.8-fix-chown.patch

01a8e4
From a56e545824e0cdce4bbfbdf9fc54aa7405194cd9 Mon Sep 17 00:00:00 2001
01a8e4
From: Alexander Larsson <alexl@redhat.com>
01a8e4
Date: Thu, 21 Aug 2014 12:17:31 +0200
01a8e4
Subject: [PATCH] Fix crash when changing owner of file
01a8e4
01a8e4
Cherry picked commits from git master:
01a8e4
ab6aa9aca1c25c34e3f1aece63efbe05a2984397
01a8e4
bfa2d63249a1f5de986f7f1ad21d79920fa4947f
01a8e4
f7d1394a03e6d02cd5c67f9c85a142e33f14566f
01a8e4
01a8e4
https://bugzilla.redhat.com/show_bug.cgi?id=1090999
01a8e4
---
01a8e4
 libnautilus-private/nautilus-file.c |   3 +-
01a8e4
 src/nautilus-properties-window.c    | 354 +++++++++++++++++-------------------
01a8e4
 2 files changed, 164 insertions(+), 193 deletions(-)
01a8e4
01a8e4
diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c
01a8e4
index 5e837f6..efef296 100644
01a8e4
--- a/libnautilus-private/nautilus-file.c
01a8e4
+++ b/libnautilus-private/nautilus-file.c
01a8e4
@@ -5670,7 +5670,8 @@ nautilus_file_get_owner_as_string (NautilusFile *file, gboolean include_real_nam
01a8e4
 		return NULL;
01a8e4
 	}
01a8e4
 
01a8e4
-	if (file->details->uid == getuid ()) {
01a8e4
+	if (include_real_name &&
01a8e4
+	    file->details->uid == getuid ()) {
01a8e4
 		/* Translators: "Me" is used to indicate the file is owned by me (the current user) */
01a8e4
 		user_name = g_strdup (_("Me"));
01a8e4
 	} else if (file->details->owner_real == NULL) {
01a8e4
diff --git a/src/nautilus-properties-window.c b/src/nautilus-properties-window.c
01a8e4
index 6793b7a..7a81ddd 100644
01a8e4
--- a/src/nautilus-properties-window.c
01a8e4
+++ b/src/nautilus-properties-window.c
01a8e4
@@ -89,6 +89,22 @@
01a8e4
 static GHashTable *windows;
01a8e4
 static GHashTable *pending_lists;
01a8e4
 
01a8e4
+typedef struct {
01a8e4
+	NautilusFile *file;
01a8e4
+	char         *owner;
01a8e4
+	GtkWindow    *window;
01a8e4
+	unsigned int  timeout;
01a8e4
+	gboolean      cancelled;
01a8e4
+} OwnerChange;
01a8e4
+
01a8e4
+typedef struct {
01a8e4
+	NautilusFile *file;
01a8e4
+	char         *group;
01a8e4
+	GtkWindow    *window;
01a8e4
+	unsigned int  timeout;
01a8e4
+	gboolean      cancelled;
01a8e4
+} GroupChange;
01a8e4
+
01a8e4
 struct NautilusPropertiesWindowDetails {	
01a8e4
 	GList *original_files;
01a8e4
 	GList *target_files;
01a8e4
@@ -112,12 +128,8 @@ struct NautilusPropertiesWindowDetails {
01a8e4
 	guint update_directory_contents_timeout_id;
01a8e4
 	guint update_files_timeout_id;
01a8e4
 
01a8e4
-	NautilusFile *group_change_file;
01a8e4
-	char         *group_change_group;
01a8e4
-	unsigned int  group_change_timeout;
01a8e4
-	NautilusFile *owner_change_file;
01a8e4
-	char         *owner_change_owner;
01a8e4
-	unsigned int  owner_change_timeout;
01a8e4
+	GroupChange  *group_change;
01a8e4
+	OwnerChange  *owner_change;
01a8e4
 
01a8e4
 	GList *permission_buttons;
01a8e4
 	GList *permission_combos;
01a8e4
@@ -208,8 +220,8 @@ static void properties_window_update              (NautilusPropertiesWindow *win
01a8e4
 						   GList              *files);
01a8e4
 static void is_directory_ready_callback           (NautilusFile       *file,
01a8e4
 						   gpointer            data);
01a8e4
-static void cancel_group_change_callback          (NautilusPropertiesWindow *window);
01a8e4
-static void cancel_owner_change_callback          (NautilusPropertiesWindow *window);
01a8e4
+static void cancel_group_change_callback          (GroupChange        *change);
01a8e4
+static void cancel_owner_change_callback          (OwnerChange        *change);
01a8e4
 static void parent_widget_destroyed_callback      (GtkWidget          *widget,
01a8e4
 						   gpointer            callback_data);
01a8e4
 static void select_image_button_callback          (GtkWidget          *widget,
01a8e4
@@ -1363,78 +1375,70 @@ attach_ellipsizing_value_field (NautilusPropertiesWindow *window,
01a8e4
 }
01a8e4
 
01a8e4
 static void
01a8e4
+group_change_free (GroupChange *change)
01a8e4
+{
01a8e4
+	nautilus_file_unref (change->file);
01a8e4
+	g_free (change->group);
01a8e4
+	g_object_unref (change->window);
01a8e4
+
01a8e4
+	g_free (change);
01a8e4
+}
01a8e4
+
01a8e4
+static void
01a8e4
 group_change_callback (NautilusFile *file,
01a8e4
 		       GFile *res_loc,
01a8e4
 		       GError *error,
01a8e4
-		       NautilusPropertiesWindow *window)
01a8e4
+		       GroupChange *change)
01a8e4
 {
01a8e4
-	char *group;
01a8e4
-
01a8e4
-	g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (window));
01a8e4
-	g_assert (window->details->group_change_file == file);
01a8e4
+	NautilusPropertiesWindow *window;
01a8e4
 
01a8e4
-	group = window->details->group_change_group;
01a8e4
-	g_assert (group != NULL);
01a8e4
+	g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (change->window));
01a8e4
+	g_assert (NAUTILUS_IS_FILE (change->file));
01a8e4
+	g_assert (change->group != NULL);
01a8e4
 
01a8e4
-	/* Report the error if it's an error. */
01a8e4
-	eel_timed_wait_stop ((EelCancelCallback) cancel_group_change_callback, window);
01a8e4
-	nautilus_report_error_setting_group (file, error, GTK_WINDOW (window));
01a8e4
+	if (!change->cancelled) {
01a8e4
+		/* Report the error if it's an error. */
01a8e4
+		eel_timed_wait_stop ((EelCancelCallback) cancel_group_change_callback, change);
01a8e4
+		nautilus_report_error_setting_group (change->file, error, change->window);
01a8e4
+	}
01a8e4
 
01a8e4
-	nautilus_file_unref (file);
01a8e4
-	g_free (group);
01a8e4
+	window = NAUTILUS_PROPERTIES_WINDOW(change->window);
01a8e4
+	if (window->details->group_change == change) {
01a8e4
+		window->details->group_change = NULL;
01a8e4
+	}
01a8e4
 
01a8e4
-	window->details->group_change_file = NULL;
01a8e4
-	window->details->group_change_group = NULL;
01a8e4
-	g_object_unref (G_OBJECT (window));
01a8e4
+	group_change_free (change);
01a8e4
 }
01a8e4
 
01a8e4
 static void
01a8e4
-cancel_group_change_callback (NautilusPropertiesWindow *window)
01a8e4
+cancel_group_change_callback (GroupChange *change)
01a8e4
 {
01a8e4
-	NautilusFile *file;
01a8e4
-	char *group;
01a8e4
+	g_assert (NAUTILUS_IS_FILE (change->file));
01a8e4
+	g_assert (change->group != NULL);
01a8e4
 
01a8e4
-	file = window->details->group_change_file;
01a8e4
-	g_assert (NAUTILUS_IS_FILE (file));
01a8e4
-
01a8e4
-	group = window->details->group_change_group;
01a8e4
-	g_assert (group != NULL);
01a8e4
-
01a8e4
-	nautilus_file_cancel (file, (NautilusFileOperationCallback) group_change_callback, window);
01a8e4
-
01a8e4
-	g_free (group);
01a8e4
-	nautilus_file_unref (file);
01a8e4
-
01a8e4
-	window->details->group_change_file = NULL;
01a8e4
-	window->details->group_change_group = NULL;
01a8e4
-	g_object_unref (window);
01a8e4
+	change->cancelled = TRUE;
01a8e4
+	nautilus_file_cancel (change->file, (NautilusFileOperationCallback) group_change_callback, change);
01a8e4
 }
01a8e4
 
01a8e4
 static gboolean
01a8e4
-schedule_group_change_timeout (NautilusPropertiesWindow *window)
01a8e4
+schedule_group_change_timeout (GroupChange *change)
01a8e4
 {
01a8e4
-	NautilusFile *file;
01a8e4
-	char *group;
01a8e4
+	g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (change->window));
01a8e4
+	g_assert (NAUTILUS_IS_FILE (change->file));
01a8e4
+	g_assert (change->group != NULL);
01a8e4
 
01a8e4
-	g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (window));
01a8e4
-
01a8e4
-	file = window->details->group_change_file;
01a8e4
-	g_assert (NAUTILUS_IS_FILE (file));
01a8e4
-
01a8e4
-	group = window->details->group_change_group;
01a8e4
-	g_assert (group != NULL);
01a8e4
+	change->timeout = 0;
01a8e4
 
01a8e4
 	eel_timed_wait_start
01a8e4
 		((EelCancelCallback) cancel_group_change_callback,
01a8e4
-		 window,
01a8e4
+		 change,
01a8e4
 		 _("Cancel Group Change?"),
01a8e4
-		 GTK_WINDOW (window));
01a8e4
+		 change->window);
01a8e4
 
01a8e4
 	nautilus_file_set_group
01a8e4
-		(file,  group,
01a8e4
-		 (NautilusFileOperationCallback) group_change_callback, window);
01a8e4
+		(change->file, change->group,
01a8e4
+		 (NautilusFileOperationCallback) group_change_callback, change);
01a8e4
 
01a8e4
-	window->details->group_change_timeout = 0;
01a8e4
 	return FALSE;
01a8e4
 }
01a8e4
 
01a8e4
@@ -1443,55 +1447,45 @@ schedule_group_change (NautilusPropertiesWindow *window,
01a8e4
 		       NautilusFile       *file,
01a8e4
 		       const char         *group)
01a8e4
 {
01a8e4
+	GroupChange *change;
01a8e4
+
01a8e4
 	g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (window));
01a8e4
-	g_assert (window->details->group_change_group == NULL);
01a8e4
-	g_assert (window->details->group_change_file == NULL);
01a8e4
+	g_assert (window->details->group_change == NULL);
01a8e4
 	g_assert (NAUTILUS_IS_FILE (file));
01a8e4
 
01a8e4
-	window->details->group_change_file = nautilus_file_ref (file);
01a8e4
-	window->details->group_change_group = g_strdup (group);
01a8e4
-	g_object_ref (G_OBJECT (window));
01a8e4
-	window->details->group_change_timeout =
01a8e4
+	change = g_new0 (GroupChange, 1);
01a8e4
+
01a8e4
+	change->file = nautilus_file_ref (file);
01a8e4
+	change->group = g_strdup (group);
01a8e4
+	change->window = g_object_ref (G_OBJECT (window));
01a8e4
+	change->timeout =
01a8e4
 		g_timeout_add (CHOWN_CHGRP_TIMEOUT,
01a8e4
 			       (GSourceFunc) schedule_group_change_timeout,
01a8e4
-			       window);
01a8e4
+			       change);
01a8e4
+
01a8e4
+	window->details->group_change = change;
01a8e4
 }
01a8e4
 
01a8e4
 static void
01a8e4
 unschedule_or_cancel_group_change (NautilusPropertiesWindow *window)
01a8e4
 {
01a8e4
-	NautilusFile *file;
01a8e4
-	char *group;
01a8e4
+	GroupChange *change;
01a8e4
 
01a8e4
 	g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (window));
01a8e4
 
01a8e4
-	file = window->details->group_change_file;
01a8e4
-	group = window->details->group_change_group;
01a8e4
-
01a8e4
-	g_assert ((file == NULL && group == NULL) ||
01a8e4
-		  (file != NULL && group != NULL));
01a8e4
+	change = window->details->group_change;
01a8e4
 
01a8e4
-	if (file != NULL) {
01a8e4
-		g_assert (NAUTILUS_IS_FILE (file));
01a8e4
-
01a8e4
-		if (window->details->group_change_timeout == 0) {
01a8e4
-			nautilus_file_cancel (file,
01a8e4
-					      (NautilusFileOperationCallback) group_change_callback, window);
01a8e4
-			eel_timed_wait_stop ((EelCancelCallback) cancel_group_change_callback, window);
01a8e4
+	if (change != NULL) {
01a8e4
+		if (change->timeout == 0) {
01a8e4
+			/* The operation was started, cancel it and let the operation callback free the change */
01a8e4
+			cancel_group_change_callback (change);
01a8e4
+			eel_timed_wait_stop ((EelCancelCallback) cancel_group_change_callback, change);
01a8e4
+		} else {
01a8e4
+			g_source_remove (change->timeout);
01a8e4
+			group_change_free (change);
01a8e4
 		}
01a8e4
 
01a8e4
-		nautilus_file_unref (file);
01a8e4
-		g_free (group);
01a8e4
-
01a8e4
-		window->details->group_change_file = NULL;
01a8e4
-		window->details->group_change_group = NULL;
01a8e4
-		g_object_unref (G_OBJECT (window));
01a8e4
-	}
01a8e4
-
01a8e4
-	if (window->details->group_change_timeout > 0) {
01a8e4
-		g_assert (file != NULL);
01a8e4
-		g_source_remove (window->details->group_change_timeout);
01a8e4
-		window->details->group_change_timeout = 0;
01a8e4
+		window->details->group_change = NULL;
01a8e4
 	}
01a8e4
 }
01a8e4
 
01a8e4
@@ -1713,18 +1707,18 @@ combo_box_row_separator_func (GtkTreeModel *model,
01a8e4
 static GtkComboBox *
01a8e4
 attach_combo_box (GtkGrid *grid,
01a8e4
 		  GtkWidget *sibling,
01a8e4
-		  gboolean two_columns)
01a8e4
+		  gboolean three_columns)
01a8e4
 {
01a8e4
 	GtkWidget *combo_box;
01a8e4
 	GtkWidget *aligner;
01a8e4
 
01a8e4
-	if (!two_columns) {
01a8e4
+	if (!three_columns) {
01a8e4
 		combo_box = gtk_combo_box_text_new ();
01a8e4
 	} else {
01a8e4
 		GtkTreeModel *model;
01a8e4
 		GtkCellRenderer *renderer;
01a8e4
 
01a8e4
-		model = GTK_TREE_MODEL (gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING));
01a8e4
+		model = GTK_TREE_MODEL (gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING));
01a8e4
 		combo_box = gtk_combo_box_new_with_model (model);
01a8e4
 		g_object_unref (G_OBJECT (model));
01a8e4
 
01a8e4
@@ -1778,78 +1772,70 @@ attach_group_combo_box (GtkGrid *grid,
01a8e4
 }	
01a8e4
 
01a8e4
 static void
01a8e4
+owner_change_free (OwnerChange *change)
01a8e4
+{
01a8e4
+	nautilus_file_unref (change->file);
01a8e4
+	g_free (change->owner);
01a8e4
+	g_object_unref (change->window);
01a8e4
+
01a8e4
+	g_free (change);
01a8e4
+}
01a8e4
+
01a8e4
+static void
01a8e4
 owner_change_callback (NautilusFile *file,
01a8e4
                        GFile 	    *result_location,
01a8e4
 		       GError        *error,
01a8e4
-		       NautilusPropertiesWindow *window)
01a8e4
+		       OwnerChange *change)
01a8e4
 {
01a8e4
-	char *owner;
01a8e4
-
01a8e4
-	g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (window));
01a8e4
-	g_assert (window->details->owner_change_file == file);
01a8e4
+	NautilusPropertiesWindow *window;
01a8e4
 
01a8e4
-	owner = window->details->owner_change_owner;
01a8e4
-	g_assert (owner != NULL);
01a8e4
+	g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (change->window));
01a8e4
+	g_assert (NAUTILUS_IS_FILE (change->file));
01a8e4
+	g_assert (change->owner != NULL);
01a8e4
 
01a8e4
-	/* Report the error if it's an error. */
01a8e4
-	eel_timed_wait_stop ((EelCancelCallback) cancel_owner_change_callback, window);
01a8e4
-	nautilus_report_error_setting_owner (file, error, GTK_WINDOW (window));
01a8e4
+	if (!change->cancelled) {
01a8e4
+		/* Report the error if it's an error. */
01a8e4
+		eel_timed_wait_stop ((EelCancelCallback) cancel_owner_change_callback, change);
01a8e4
+		nautilus_report_error_setting_owner (file, error, change->window);
01a8e4
+	}
01a8e4
 
01a8e4
-	nautilus_file_unref (file);
01a8e4
-	g_free (owner);
01a8e4
+	window = NAUTILUS_PROPERTIES_WINDOW(change->window);
01a8e4
+	if (window->details->owner_change == change) {
01a8e4
+		window->details->owner_change = NULL;
01a8e4
+	}
01a8e4
 
01a8e4
-	window->details->owner_change_file = NULL;
01a8e4
-	window->details->owner_change_owner = NULL;
01a8e4
-	g_object_unref (G_OBJECT (window));
01a8e4
+	owner_change_free (change);
01a8e4
 }
01a8e4
 
01a8e4
 static void
01a8e4
-cancel_owner_change_callback (NautilusPropertiesWindow *window)
01a8e4
+cancel_owner_change_callback (OwnerChange *change)
01a8e4
 {
01a8e4
-	NautilusFile *file;
01a8e4
-	char *owner;
01a8e4
-
01a8e4
-	file = window->details->owner_change_file;
01a8e4
-	g_assert (NAUTILUS_IS_FILE (file));
01a8e4
-
01a8e4
-	owner = window->details->owner_change_owner;
01a8e4
-	g_assert (owner != NULL);
01a8e4
-
01a8e4
-	nautilus_file_cancel (file, (NautilusFileOperationCallback) owner_change_callback, window);
01a8e4
-
01a8e4
-	nautilus_file_unref (file);
01a8e4
-	g_free (owner);
01a8e4
+	g_assert (NAUTILUS_IS_FILE (change->file));
01a8e4
+	g_assert (change->owner != NULL);
01a8e4
 
01a8e4
-	window->details->owner_change_file = NULL;
01a8e4
-	window->details->owner_change_owner = NULL;
01a8e4
-	g_object_unref (window);
01a8e4
+	change->cancelled = TRUE;
01a8e4
+	nautilus_file_cancel (change->file, (NautilusFileOperationCallback) owner_change_callback, change);
01a8e4
 }
01a8e4
 
01a8e4
 static gboolean
01a8e4
-schedule_owner_change_timeout (NautilusPropertiesWindow *window)
01a8e4
+schedule_owner_change_timeout (OwnerChange *change)
01a8e4
 {
01a8e4
-	NautilusFile *file;
01a8e4
-	char *owner;
01a8e4
-
01a8e4
-	g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (window));
01a8e4
-
01a8e4
-	file = window->details->owner_change_file;
01a8e4
-	g_assert (NAUTILUS_IS_FILE (file));
01a8e4
+	g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (change->window));
01a8e4
+	g_assert (NAUTILUS_IS_FILE (change->file));
01a8e4
+	g_assert (change->owner != NULL);
01a8e4
 
01a8e4
-	owner = window->details->owner_change_owner;
01a8e4
-	g_assert (owner != NULL);
01a8e4
+	change->timeout = 0;
01a8e4
 
01a8e4
 	eel_timed_wait_start
01a8e4
 		((EelCancelCallback) cancel_owner_change_callback,
01a8e4
-		 window,
01a8e4
+		 change,
01a8e4
 		 _("Cancel Owner Change?"),
01a8e4
-		 GTK_WINDOW (window));
01a8e4
+		 change->window);
01a8e4
 
01a8e4
 	nautilus_file_set_owner
01a8e4
-		(file,  owner,
01a8e4
-		 (NautilusFileOperationCallback) owner_change_callback, window);
01a8e4
+		(change->file, change->owner,
01a8e4
+		 (NautilusFileOperationCallback) owner_change_callback, change);
01a8e4
 
01a8e4
-	window->details->owner_change_timeout = 0;
01a8e4
 	return FALSE;
01a8e4
 }
01a8e4
 
01a8e4
@@ -1858,55 +1844,47 @@ schedule_owner_change (NautilusPropertiesWindow *window,
01a8e4
 		       NautilusFile       *file,
01a8e4
 		       const char         *owner)
01a8e4
 {
01a8e4
+	OwnerChange *change;
01a8e4
+
01a8e4
 	g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (window));
01a8e4
-	g_assert (window->details->owner_change_owner == NULL);
01a8e4
-	g_assert (window->details->owner_change_file == NULL);
01a8e4
+	g_assert (window->details->owner_change == NULL);
01a8e4
 	g_assert (NAUTILUS_IS_FILE (file));
01a8e4
 
01a8e4
-	window->details->owner_change_file = nautilus_file_ref (file);
01a8e4
-	window->details->owner_change_owner = g_strdup (owner);
01a8e4
-	g_object_ref (G_OBJECT (window));
01a8e4
-	window->details->owner_change_timeout =
01a8e4
+	change = g_new0 (OwnerChange, 1);
01a8e4
+
01a8e4
+	change->file = nautilus_file_ref (file);
01a8e4
+	change->owner = g_strdup (owner);
01a8e4
+	change->window = g_object_ref (G_OBJECT (window));
01a8e4
+	change->timeout =
01a8e4
 		g_timeout_add (CHOWN_CHGRP_TIMEOUT,
01a8e4
 			       (GSourceFunc) schedule_owner_change_timeout,
01a8e4
-			       window);
01a8e4
+			       change);
01a8e4
+
01a8e4
+	window->details->owner_change = change;
01a8e4
 }
01a8e4
 
01a8e4
 static void
01a8e4
 unschedule_or_cancel_owner_change (NautilusPropertiesWindow *window)
01a8e4
 {
01a8e4
-	NautilusFile *file;
01a8e4
-	char *owner;
01a8e4
+	OwnerChange *change;
01a8e4
 
01a8e4
 	g_assert (NAUTILUS_IS_PROPERTIES_WINDOW (window));
01a8e4
 
01a8e4
-	file = window->details->owner_change_file;
01a8e4
-	owner = window->details->owner_change_owner;
01a8e4
+	change = window->details->owner_change;
01a8e4
 
01a8e4
-	g_assert ((file == NULL && owner == NULL) ||
01a8e4
-		  (file != NULL && owner != NULL));
01a8e4
+	if (change != NULL) {
01a8e4
+		g_assert (NAUTILUS_IS_FILE (change->file));
01a8e4
 
01a8e4
-	if (file != NULL) {
01a8e4
-		g_assert (NAUTILUS_IS_FILE (file));
01a8e4
-
01a8e4
-		if (window->details->owner_change_timeout == 0) {
01a8e4
-			nautilus_file_cancel (file,
01a8e4
-					      (NautilusFileOperationCallback) owner_change_callback, window);
01a8e4
-			eel_timed_wait_stop ((EelCancelCallback) cancel_owner_change_callback, window);
01a8e4
+		if (change->timeout == 0) {
01a8e4
+			/* The operation was started, cancel it and let the operation callback free the change */
01a8e4
+			cancel_owner_change_callback (change);
01a8e4
+			eel_timed_wait_stop ((EelCancelCallback) cancel_owner_change_callback, change);
01a8e4
+		} else {
01a8e4
+			g_source_remove (change->timeout);
01a8e4
+			owner_change_free (change);
01a8e4
 		}
01a8e4
 
01a8e4
-		nautilus_file_unref (file);
01a8e4
-		g_free (owner);
01a8e4
-
01a8e4
-		window->details->owner_change_file = NULL;
01a8e4
-		window->details->owner_change_owner = NULL;
01a8e4
-		g_object_unref (G_OBJECT (window));
01a8e4
-	}
01a8e4
-
01a8e4
-	if (window->details->owner_change_timeout > 0) {
01a8e4
-		g_assert (file != NULL);
01a8e4
-		g_source_remove (window->details->owner_change_timeout);
01a8e4
-		window->details->owner_change_timeout = 0;
01a8e4
+		window->details->owner_change = NULL;
01a8e4
 	}
01a8e4
 }
01a8e4
 
01a8e4
@@ -1914,20 +1892,15 @@ static void
01a8e4
 changed_owner_callback (GtkComboBox *combo_box, NautilusFile* file)
01a8e4
 {
01a8e4
 	NautilusPropertiesWindow *window;
01a8e4
-	char *owner_text;
01a8e4
-	char **name_array;
01a8e4
 	char *new_owner;
01a8e4
 	char *cur_owner;
01a8e4
 
01a8e4
 	g_assert (GTK_IS_COMBO_BOX (combo_box));
01a8e4
 	g_assert (NAUTILUS_IS_FILE (file));
01a8e4
 
01a8e4
-	owner_text = combo_box_get_active_entry (combo_box, 0);
01a8e4
-        if (! owner_text)
01a8e4
+	new_owner = combo_box_get_active_entry (combo_box, 2);
01a8e4
+        if (! new_owner)
01a8e4
 	    return;
01a8e4
-    	name_array = g_strsplit (owner_text, " - ", 2);
01a8e4
-	new_owner = name_array[0];
01a8e4
-	g_free (owner_text);
01a8e4
 	cur_owner = nautilus_file_get_owner_name (file);
01a8e4
 
01a8e4
 	if (strcmp (new_owner, cur_owner) != 0) {
01a8e4
@@ -1937,7 +1910,7 @@ changed_owner_callback (GtkComboBox *combo_box, NautilusFile* file)
01a8e4
 		unschedule_or_cancel_owner_change (window);
01a8e4
 		schedule_owner_change (window, file, new_owner);
01a8e4
 	}
01a8e4
-	g_strfreev (name_array);
01a8e4
+	g_free (new_owner);
01a8e4
 	g_free (cur_owner);
01a8e4
 }
01a8e4
 
01a8e4
@@ -1951,6 +1924,7 @@ synch_user_menu (GtkComboBox *combo_box, NautilusFile *file)
01a8e4
 	GtkTreeIter iter;
01a8e4
 	char *user_name;
01a8e4
 	char *owner_name;
01a8e4
+	char *nice_owner_name;
01a8e4
 	int user_index;
01a8e4
 	int owner_index;
01a8e4
 	char **name_array;
01a8e4
@@ -1980,7 +1954,7 @@ synch_user_menu (GtkComboBox *combo_box, NautilusFile *file)
01a8e4
 			user_name = (char *)node->data;
01a8e4
 
01a8e4
 			name_array = g_strsplit (user_name, "\n", 2);
01a8e4
-			if (name_array[1] != NULL) {
01a8e4
+			if (name_array[1] != NULL && *name_array[1] != 0) {
01a8e4
 				combo_text = g_strdup_printf ("%s - %s", name_array[0], name_array[1]);
01a8e4
 			} else {
01a8e4
 				combo_text = g_strdup (name_array[0]);
01a8e4
@@ -1990,6 +1964,7 @@ synch_user_menu (GtkComboBox *combo_box, NautilusFile *file)
01a8e4
 			gtk_list_store_set (store, &iter,
01a8e4
 					    0, combo_text,
01a8e4
 					    1, user_name,
01a8e4
+					    2, name_array[0],
01a8e4
 					    -1);
01a8e4
 
01a8e4
 			g_strfreev (name_array);
01a8e4
@@ -1997,8 +1972,9 @@ synch_user_menu (GtkComboBox *combo_box, NautilusFile *file)
01a8e4
 		}
01a8e4
 	}
01a8e4
 
01a8e4
-	owner_name = nautilus_file_get_string_attribute (file, "owner");
01a8e4
-	owner_index = tree_model_get_entry_index (model, 0, owner_name);
01a8e4
+	owner_name = nautilus_file_get_owner_name (file);
01a8e4
+	owner_index = tree_model_get_entry_index (model, 2, owner_name);
01a8e4
+	nice_owner_name = nautilus_file_get_string_attribute (file, "owner");
01a8e4
 
01a8e4
 	/* If owner wasn't in list, we prepend it (with a separator). 
01a8e4
 	 * This can happen if the owner is an id with no matching
01a8e4
@@ -2011,30 +1987,24 @@ synch_user_menu (GtkComboBox *combo_box, NautilusFile *file)
01a8e4
 			gtk_list_store_set (store, &iter,
01a8e4
 					    0, "-",
01a8e4
 					    1, NULL,
01a8e4
+					    2, NULL,
01a8e4
 					    -1);
01a8e4
 		}
01a8e4
 
01a8e4
-		name_array = g_strsplit (owner_name, " - ", 2);
01a8e4
-		if (name_array[1] != NULL) {
01a8e4
-			user_name = g_strdup_printf ("%s\n%s", name_array[0], name_array[1]);
01a8e4
-		} else {
01a8e4
-			user_name = g_strdup (name_array[0]);
01a8e4
-		}
01a8e4
 		owner_index = 0;
01a8e4
 
01a8e4
 		gtk_list_store_prepend (store, &iter);
01a8e4
 		gtk_list_store_set (store, &iter,
01a8e4
-				    0, owner_name,
01a8e4
-				    1, user_name,
01a8e4
+				    0, nice_owner_name,
01a8e4
+				    1, owner_name,
01a8e4
+				    2, owner_name,
01a8e4
 				    -1);
01a8e4
-
01a8e4
-		g_free (user_name);
01a8e4
-		g_strfreev (name_array);
01a8e4
 	}
01a8e4
 
01a8e4
 	gtk_combo_box_set_active (combo_box, owner_index);
01a8e4
 
01a8e4
 	g_free (owner_name);
01a8e4
+	g_free (nice_owner_name);
01a8e4
 	g_list_free_full (users, g_free);
01a8e4
 }	
01a8e4
 
01a8e4
-- 
01a8e4
2.0.4
01a8e4