Index: libnautilus-private/nautilus-dnd.c =================================================================== RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-dnd.c,v retrieving revision 1.24 diff -u -p -r1.24 nautilus-dnd.c --- libnautilus-private/nautilus-dnd.c 18 Mar 2006 07:13:49 -0000 1.24 +++ libnautilus-private/nautilus-dnd.c 20 Apr 2006 11:19:18 -0000 @@ -302,6 +302,26 @@ nautilus_drag_default_drop_action_for_ur return context->suggested_action; } +static gboolean +uri_is_user_owned (GnomeVFSURI *uri) +{ + gboolean user_owned; + + user_owned = FALSE; + + if (uri != NULL && !strcmp (gnome_vfs_uri_get_scheme (uri), "file")) { + GnomeVFSFileInfo *info; + + info = gnome_vfs_file_info_new (); + if (gnome_vfs_get_file_info_uri (uri, info, GNOME_VFS_FILE_INFO_GET_ACCESS_RIGHTS) == GNOME_VFS_OK) { + user_owned = (info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_IDS) && + geteuid () == info->uid; + } + gnome_vfs_file_info_unref (info); + } + + return user_owned; +} void nautilus_drag_default_drop_action_for_icons (GdkDragContext *context, @@ -385,11 +405,12 @@ nautilus_drag_default_drop_action_for_ic if (dropped_uri != NULL) { gnome_vfs_check_same_fs_uris (dropped_uri, target_uri, &same_fs); target_is_source_parent = gnome_vfs_uri_is_parent (target_uri, dropped_uri, FALSE); - gnome_vfs_uri_unref (dropped_uri); } - gnome_vfs_uri_unref (target_uri); - - if (same_fs || target_is_source_parent) { + + if ((same_fs || target_is_source_parent) && + /* use copy by default when dragging from user-owned location + * to location owned by somebody else */ + !(uri_is_user_owned (dropped_uri) && !uri_is_user_owned (target_uri))) { if (actions & GDK_ACTION_MOVE) { *action = GDK_ACTION_MOVE; } else { @@ -402,6 +423,15 @@ nautilus_drag_default_drop_action_for_ic *action = context->suggested_action; } } + + if (dropped_uri != NULL) { + gnome_vfs_uri_unref (dropped_uri); + } + + if (target_uri != NULL) { + gnome_vfs_uri_unref (target_uri); + } + } /* Encode a "x-special/gnome-icon-list" selection.