filechooser: check if we can access the parent folder
If we manually enter an unaccessible path in the entry, e.g "/root/foo.txt", we should receive an error saying that the folder is not accessible instead of showing the replace confirmation dialog. https://bugzilla.gnome.org/show_bug.cgi?id=753969
This commit is contained in:
parent
2bf97567ce
commit
8e975b28ff
@ -6431,7 +6431,8 @@ name_entry_get_parent_info_cb (GCancellable *cancellable,
|
|||||||
const GError *error,
|
const GError *error,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
gboolean parent_is_folder;
|
gboolean parent_is_folder = FALSE;
|
||||||
|
gboolean parent_is_accessible = FALSE;
|
||||||
gboolean cancelled = g_cancellable_is_cancelled (cancellable);
|
gboolean cancelled = g_cancellable_is_cancelled (cancellable);
|
||||||
struct FileExistsData *data = user_data;
|
struct FileExistsData *data = user_data;
|
||||||
GtkFileChooserWidget *impl = data->impl;
|
GtkFileChooserWidget *impl = data->impl;
|
||||||
@ -6447,12 +6448,14 @@ name_entry_get_parent_info_cb (GCancellable *cancellable,
|
|||||||
if (cancelled)
|
if (cancelled)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!info)
|
if (info)
|
||||||
parent_is_folder = FALSE;
|
{
|
||||||
else
|
parent_is_folder = _gtk_file_info_consider_as_directory (info);
|
||||||
parent_is_folder = _gtk_file_info_consider_as_directory (info);
|
parent_is_accessible = g_file_info_has_attribute (info, "access::can-execute") &&
|
||||||
|
g_file_info_get_attribute_boolean (info, "access::can-execute");
|
||||||
|
}
|
||||||
|
|
||||||
if (parent_is_folder)
|
if (parent_is_folder && parent_is_accessible)
|
||||||
{
|
{
|
||||||
if (priv->action == GTK_FILE_CHOOSER_ACTION_OPEN)
|
if (priv->action == GTK_FILE_CHOOSER_ACTION_OPEN)
|
||||||
{
|
{
|
||||||
@ -6500,24 +6503,31 @@ name_entry_get_parent_info_cb (GCancellable *cancellable,
|
|||||||
else
|
else
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
}
|
}
|
||||||
|
else if (parent_is_folder)
|
||||||
|
{
|
||||||
|
GError *error;
|
||||||
|
|
||||||
|
error = NULL;
|
||||||
|
g_set_error_literal (&error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED,
|
||||||
|
_("You do not have access to the specified folder."));
|
||||||
|
|
||||||
|
error_changing_folder_dialog (impl, data->parent_file, error);
|
||||||
|
}
|
||||||
|
else if (info)
|
||||||
|
{
|
||||||
|
/* The parent exists, but it's not a folder!
|
||||||
|
* Someone probably typed existing_file.txt/subfile.txt
|
||||||
|
*/
|
||||||
|
error_with_file_under_nonfolder (impl, data->parent_file);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (info)
|
GError *error_copy;
|
||||||
{
|
|
||||||
/* The parent exists, but it's not a folder!
|
|
||||||
* Someone probably typed existing_file.txt/subfile.txt
|
|
||||||
*/
|
|
||||||
error_with_file_under_nonfolder (impl, data->parent_file);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GError *error_copy;
|
|
||||||
|
|
||||||
/* The parent folder is not readable for some reason */
|
/* The parent folder is not readable for some reason */
|
||||||
|
|
||||||
error_copy = g_error_copy (error);
|
error_copy = g_error_copy (error);
|
||||||
error_changing_folder_dialog (impl, data->parent_file, error_copy);
|
error_changing_folder_dialog (impl, data->parent_file, error_copy);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
@ -6629,7 +6639,7 @@ file_exists_get_info_cb (GCancellable *cancellable,
|
|||||||
priv->should_respond_get_info_cancellable =
|
priv->should_respond_get_info_cancellable =
|
||||||
_gtk_file_system_get_info (priv->file_system,
|
_gtk_file_system_get_info (priv->file_system,
|
||||||
data->parent_file,
|
data->parent_file,
|
||||||
"standard::type",
|
"standard::type,access::can-execute",
|
||||||
name_entry_get_parent_info_cb,
|
name_entry_get_parent_info_cb,
|
||||||
data);
|
data);
|
||||||
set_busy_cursor (impl, TRUE);
|
set_busy_cursor (impl, TRUE);
|
||||||
|
Loading…
Reference in New Issue
Block a user