Index: libnautilus-private/nautilus-file-operations.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-file-operations.c,v
retrieving revision 1.206
diff -u -p -r1.206 nautilus-file-operations.c
--- libnautilus-private/nautilus-file-operations.c	16 Feb 2006 23:58:03 -0000	1.206
+++ libnautilus-private/nautilus-file-operations.c	9 Mar 2006 21:38:06 -0000
@@ -1875,12 +1875,14 @@ nautilus_file_operations_copy_move (cons
 
 	TransferInfo *transfer_info;
 	SyncTransferInfo *sync_transfer_info;
+	GnomeVFSVolume *volume;
 	GnomeVFSResult result;
 	gboolean target_is_trash;
 	gboolean duplicate;
 	gboolean target_is_mapping;
 	gboolean have_nonmapping_source;
 	gboolean have_nonlocal_source;
+	gboolean have_readonly_source;
 	
 	IconPositionIterator *icon_position_iterator;
 
@@ -1914,6 +1916,7 @@ nautilus_file_operations_copy_move (cons
 	target_uri_list = NULL;
 	have_nonlocal_source = FALSE;
 	have_nonmapping_source = FALSE;
+	have_readonly_source = FALSE;
 	duplicate = copy_action != GDK_ACTION_MOVE;
 	for (p = item_uris; p != NULL; p = p->next) {
 		/* Filter out special Nautilus link files */
@@ -1938,7 +1941,13 @@ nautilus_file_operations_copy_move (cons
 		if (strcmp (source_uri->method_string, "burn") != 0) {
 			have_nonmapping_source = TRUE;
 		}
-			
+
+		volume = nautilus_get_enclosing_volume (source_uri);
+		if (volume != NULL && gnome_vfs_volume_is_read_only (volume)) {
+			have_readonly_source = TRUE;
+		}
+		gnome_vfs_volume_unref (volume);
+
 		/* Note: this could be null if we're e.g. copying the top level file of a web site */
 		source_dir_uri = gnome_vfs_uri_get_parent (source_uri);
 		target_uri = NULL;
@@ -1994,6 +2003,10 @@ nautilus_file_operations_copy_move (cons
 		 * for target files.
 		 */
 		move_options |= GNOME_VFS_XFER_USE_UNIQUE_NAMES;
+	}
+
+	if (have_readonly_source) {
+		move_options |= GNOME_VFS_XFER_TARGET_DEFAULT_PERMS;
 	}
 
 	/* List may be NULL if we filtered all items out */
Index: libnautilus-private/nautilus-file-utilities.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-file-utilities.c,v
retrieving revision 1.128
diff -u -p -r1.128 nautilus-file-utilities.c
--- libnautilus-private/nautilus-file-utilities.c	12 Dec 2005 16:59:10 -0000	1.128
+++ libnautilus-private/nautilus-file-utilities.c	9 Mar 2006 21:38:06 -0000
@@ -39,6 +39,8 @@
 #include <libgnomevfs/gnome-vfs-ops.h>
 #include <libgnomevfs/gnome-vfs-uri.h>
 #include <libgnomevfs/gnome-vfs-utils.h>
+#include <libgnomevfs/gnome-vfs-volume.h>
+#include <libgnomevfs/gnome-vfs-volume-monitor.h>
 #include <unistd.h>
 #include <stdlib.h>
 
@@ -581,6 +583,64 @@ nautilus_get_uri_shortname_for_display (
 	}
 
 	return name;
+}
+
+/* FIXME resolve basename symlinks before comparing URIs?
+ * We may wrongly match a volume, or wrongly not match it.
+ */
+GnomeVFSVolume *
+nautilus_get_enclosing_volume (GnomeVFSURI *uri)
+{
+	GnomeVFSVolume *volume, *one_volume;
+	GList *l, *list;
+	char *one_uri;
+	GnomeVFSURI *one_vfs_uri, *potential_vfs_uri;
+
+	g_assert (uri != NULL);
+
+	volume = NULL;
+	potential_vfs_uri = NULL;
+
+	list = gnome_vfs_volume_monitor_get_mounted_volumes (gnome_vfs_get_volume_monitor ());
+
+	for (l = list; l != NULL; l = l->next) {
+		one_volume = l->data;
+
+		one_uri = gnome_vfs_volume_get_activation_uri (one_volume);
+		if (one_uri == NULL) {
+			continue;
+		}
+
+		one_vfs_uri = gnome_vfs_uri_new (one_uri);
+		if (one_vfs_uri == NULL) {
+			g_free (one_uri);
+			continue;
+		}
+
+		if (gnome_vfs_uri_is_parent (one_vfs_uri, uri, TRUE) &&
+		    (potential_vfs_uri == NULL ||
+		     gnome_vfs_uri_is_parent (potential_vfs_uri, one_vfs_uri, TRUE))) {
+			if (potential_vfs_uri != NULL) {
+				gnome_vfs_uri_unref (potential_vfs_uri);
+				gnome_vfs_volume_unref (volume);
+			}
+
+			potential_vfs_uri = gnome_vfs_uri_ref (one_vfs_uri);
+			volume = gnome_vfs_volume_ref (one_volume);
+		}
+
+		gnome_vfs_uri_unref (one_vfs_uri);
+		g_free (one_uri);
+	}
+
+	if (potential_vfs_uri != NULL) {
+		gnome_vfs_uri_unref (potential_vfs_uri);
+	}
+
+	g_list_foreach (list, (GFunc) gnome_vfs_volume_unref, NULL);
+	g_list_free (list);
+
+	return volume;
 }
 
 #if !defined (NAUTILUS_OMIT_SELF_CHECK)
Index: libnautilus-private/nautilus-file-utilities.h
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-file-utilities.h,v
retrieving revision 1.58
diff -u -p -r1.58 nautilus-file-utilities.h
--- libnautilus-private/nautilus-file-utilities.h	12 Dec 2005 16:59:10 -0000	1.58
+++ libnautilus-private/nautilus-file-utilities.h	9 Mar 2006 21:38:06 -0000
@@ -26,6 +26,7 @@
 #define NAUTILUS_FILE_UTILITIES_H
 
 #include <libgnomevfs/gnome-vfs-types.h>
+#include <libgnomevfs/gnome-vfs-volume.h>
 
 #define NAUTILUS_SAVED_SEARCH_EXTENSION ".savedSearch"
 #define NAUTILUS_SAVED_SEARCH_MIMETYPE "application/x-gnome-saved-search"
@@ -87,5 +88,7 @@ GList *  nautilus_find_all_files_in_gnom
 
 const char *nautilus_get_vfs_method_display_name (char *method);
 char *      nautilus_get_uri_shortname_for_display (GnomeVFSURI *uri);
+
+GnomeVFSVolume *nautilus_get_enclosing_volume (GnomeVFSURI *uri);
 
 #endif /* NAUTILUS_FILE_UTILITIES_H */
