[gvfs] gvfs-mount: Allow mounting as an anonymous user
- From: Ross Lagerwall <rossl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gvfs] gvfs-mount: Allow mounting as an anonymous user
- Date: Wed, 21 Jan 2015 07:44:27 +0000 (UTC)
commit 0803c0fdc5bfd6d9f188088643aa2bc078c4ca36
Author: Ross Lagerwall <rosslagerwall gmail com>
Date: Thu Jan 1 10:15:46 2015 +0200
gvfs-mount: Allow mounting as an anonymous user
https://bugzilla.gnome.org/show_bug.cgi?id=742169
man/gvfs-mount.xml | 6 ++++
programs/gvfs-mount.c | 76 ++++++++++++++++++++++++++++++++++++-------------
2 files changed, 62 insertions(+), 20 deletions(-)
---
diff --git a/man/gvfs-mount.xml b/man/gvfs-mount.xml
index 64b7c37..a0c4738 100644
--- a/man/gvfs-mount.xml
+++ b/man/gvfs-mount.xml
@@ -118,6 +118,12 @@
</varlistentry>
<varlistentry>
+ <term><option>-a</option>, <option>--anonymous</option></term>
+
+ <listitem><para>Use an anonymous user when authenticating</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><option>-l</option>, <option>--list</option></term>
<listitem><para>List all known mounts.</para></listitem>
diff --git a/programs/gvfs-mount.c b/programs/gvfs-mount.c
index 96abaa2..dd31e30 100644
--- a/programs/gvfs-mount.c
+++ b/programs/gvfs-mount.c
@@ -38,6 +38,12 @@
#define STDIN_FILENO 0
+typedef enum {
+ MOUNT_OP_NONE,
+ MOUNT_OP_ASKED,
+ MOUNT_OP_ABORTED
+} MountOpState;
+
static int outstanding_mounts = 0;
static GMainLoop *main_loop;
@@ -46,6 +52,7 @@ static gboolean mount_mountable = FALSE;
static gboolean mount_unmount = FALSE;
static gboolean mount_eject = FALSE;
static gboolean force = FALSE;
+static gboolean anonymous = FALSE;
static gboolean mount_list = FALSE;
static gboolean extra_detail = FALSE;
static gboolean mount_monitor = FALSE;
@@ -63,6 +70,7 @@ static const GOptionEntry entries[] =
{ "eject", 'e', 0, G_OPTION_ARG_NONE, &mount_eject, N_("Eject"), NULL},
{ "unmount-scheme", 's', 0, G_OPTION_ARG_STRING, &unmount_scheme, N_("Unmount all mounts with the given
scheme"), N_("SCHEME") },
{ "force", 'f', 0, G_OPTION_ARG_NONE, &force, N_("Ignore outstanding file operations when unmounting or
ejecting"), NULL },
+ { "anonymous", 'a', 0, G_OPTION_ARG_NONE, &anonymous, N_("Use an anonymous user when authenticating"),
NULL },
/* Translator: List here is a verb as in 'List all mounts' */
{ "list", 'l', 0, G_OPTION_ARG_NONE, &mount_list, N_("List"), NULL},
{ "monitor", 'o', 0, G_OPTION_ARG_NONE, &mount_monitor, N_("Monitor events"), NULL},
@@ -132,31 +140,49 @@ ask_password_cb (GMountOperation *op,
const char *default_domain,
GAskPasswordFlags flags)
{
- char *s;
- g_print ("%s\n", message);
-
- if (flags & G_ASK_PASSWORD_NEED_USERNAME)
+ if ((flags & G_ASK_PASSWORD_ANONYMOUS_SUPPORTED) && anonymous)
{
- s = prompt_for ("User", default_user, TRUE);
- g_mount_operation_set_username (op, s);
- g_free (s);
+ g_mount_operation_set_anonymous (op, TRUE);
}
-
- if (flags & G_ASK_PASSWORD_NEED_DOMAIN)
+ else
{
- s = prompt_for ("Domain", default_domain, TRUE);
- g_mount_operation_set_domain (op, s);
- g_free (s);
+ char *s;
+ g_print ("%s\n", message);
+
+ if (flags & G_ASK_PASSWORD_NEED_USERNAME)
+ {
+ s = prompt_for ("User", default_user, TRUE);
+ g_mount_operation_set_username (op, s);
+ g_free (s);
+ }
+
+ if (flags & G_ASK_PASSWORD_NEED_DOMAIN)
+ {
+ s = prompt_for ("Domain", default_domain, TRUE);
+ g_mount_operation_set_domain (op, s);
+ g_free (s);
+ }
+
+ if (flags & G_ASK_PASSWORD_NEED_PASSWORD)
+ {
+ s = prompt_for ("Password", NULL, FALSE);
+ g_mount_operation_set_password (op, s);
+ g_free (s);
+ }
}
- if (flags & G_ASK_PASSWORD_NEED_PASSWORD)
+ /* Only try anonymous access once. */
+ if (anonymous &&
+ GPOINTER_TO_INT (g_object_get_data (G_OBJECT (op), "state")) == MOUNT_OP_ASKED)
{
- s = prompt_for ("Password", NULL, FALSE);
- g_mount_operation_set_password (op, s);
- g_free (s);
+ g_object_set_data (G_OBJECT (op), "state", GINT_TO_POINTER (MOUNT_OP_ABORTED));
+ g_mount_operation_reply (op, G_MOUNT_OPERATION_ABORTED);
+ }
+ else
+ {
+ g_object_set_data (G_OBJECT (op), "state", GINT_TO_POINTER (MOUNT_OP_ASKED));
+ g_mount_operation_reply (op, G_MOUNT_OPERATION_HANDLED);
}
-
- g_mount_operation_reply (op, G_MOUNT_OPERATION_HANDLED);
}
static void
@@ -195,13 +221,17 @@ mount_mountable_done_cb (GObject *object,
{
GFile *target;
GError *error = NULL;
+ GMountOperation *op = user_data;
target = g_file_mount_mountable_finish (G_FILE (object), res, &error);
if (target == NULL)
{
- g_printerr (_("Error mounting location: %s\n"), error->message);
success = FALSE;
+ if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (op), "state")) == MOUNT_OP_ABORTED)
+ g_printerr (_("Error mounting location: Anonymous access denied\n"));
+ else
+ g_printerr (_("Error mounting location: %s\n"), error->message);
}
else
g_object_unref (target);
@@ -219,13 +249,17 @@ mount_done_cb (GObject *object,
{
gboolean succeeded;
GError *error = NULL;
+ GMountOperation *op = user_data;
succeeded = g_file_mount_enclosing_volume_finish (G_FILE (object), res, &error);
if (!succeeded)
{
- g_printerr (_("Error mounting location: %s\n"), error->message);
success = FALSE;
+ if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (op), "state")) == MOUNT_OP_ABORTED)
+ g_printerr (_("Error mounting location: Anonymous access denied\n"));
+ else
+ g_printerr (_("Error mounting location: %s\n"), error->message);
}
outstanding_mounts--;
@@ -241,6 +275,8 @@ new_mount_op (void)
op = g_mount_operation_new ();
+ g_object_set_data (G_OBJECT (op), "state", GINT_TO_POINTER (MOUNT_OP_NONE));
+
g_signal_connect (op, "ask_password", G_CALLBACK (ask_password_cb), NULL);
g_signal_connect (op, "ask_question", G_CALLBACK (ask_question_cb), NULL);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]