[Spice-devel] [spice-gtk 03/13] spice-proxy: parse user and pass

Marc-André Lureau marcandre.lureau at gmail.com
Mon Feb 3 10:02:34 PST 2014


From: Marc-André Lureau <marcandre.lureau at redhat.com>

Someday this ought to be GURI.. or SoupUri?
---
 gtk/spice-proxy.c   | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 gtk/spice-proxy.h   |  4 +++
 gtk/spice-session.c |  2 +-
 3 files changed, 88 insertions(+), 2 deletions(-)

diff --git a/gtk/spice-proxy.c b/gtk/spice-proxy.c
index bc4037e..834aa10 100644
--- a/gtk/spice-proxy.c
+++ b/gtk/spice-proxy.c
@@ -19,6 +19,7 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "glib-compat.h"
 #include "spice-client.h"
 #include "spice-proxy.h"
 
@@ -26,6 +27,8 @@ struct _SpiceProxyPrivate {
     gchar *protocol;
     gchar *hostname;
     guint port;
+    gchar *user;
+    gchar *password;
 };
 
 #define SPICE_PROXY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), SPICE_TYPE_PROXY, SpiceProxyPrivate))
@@ -35,6 +38,8 @@ G_DEFINE_TYPE(SpiceProxy, spice_proxy, G_TYPE_OBJECT);
 enum  {
     SPICE_PROXY_DUMMY_PROPERTY,
     SPICE_PROXY_PROTOCOL,
+    SPICE_PROXY_USER,
+    SPICE_PROXY_PASSWORD,
     SPICE_PROXY_HOSTNAME,
     SPICE_PROXY_PORT
 };
@@ -74,7 +79,18 @@ gboolean spice_proxy_parse(SpiceProxy *self, const gchar *proxyuri, GError **err
     spice_proxy_set_protocol(self, "http");
     spice_proxy_set_port(self, 3128);
 
-    gchar **proxyv = g_strsplit(uri, ":", 0);
+    gchar *saveptr, *auth = strtok_r(uri, "@", &saveptr);
+    if (saveptr && *saveptr) {
+        gchar *saveptr2;
+        const gchar *user = strtok_r(auth, ":", &saveptr2);
+        const gchar *pass = strtok_r(NULL, ":", &saveptr2);
+        spice_proxy_set_user(self, user);
+        spice_proxy_set_password(self, pass);
+        g_debug("user: %s pass: %s", user, pass);
+        uri = saveptr;
+    }
+
+    gchar **proxyv = g_strsplit(uri, ":", 2);
     const gchar *proxy_port = NULL;
 
     if (proxyv[0] == NULL || strlen(proxyv[0]) == 0) {
@@ -172,6 +188,12 @@ static void spice_proxy_get_property(GObject *object, guint property_id,
     case SPICE_PROXY_PORT:
         g_value_set_uint(value, spice_proxy_get_port(self));
         break;
+    case SPICE_PROXY_USER:
+        g_value_set_string(value, spice_proxy_get_user(self));
+        break;
+    case SPICE_PROXY_PASSWORD:
+        g_value_set_string(value, spice_proxy_get_password(self));
+        break;
     default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
         break;
@@ -192,6 +214,12 @@ static void spice_proxy_set_property(GObject *object, guint property_id,
     case SPICE_PROXY_HOSTNAME:
         spice_proxy_set_hostname(self, g_value_get_string(value));
         break;
+    case SPICE_PROXY_USER:
+        spice_proxy_set_user(self, g_value_get_string(value));
+        break;
+    case SPICE_PROXY_PASSWORD:
+        spice_proxy_set_password(self, g_value_get_string(value));
+        break;
     case SPICE_PROXY_PORT:
         spice_proxy_set_port(self, g_value_get_uint(value));
         break;
@@ -253,6 +281,24 @@ static void spice_proxy_class_init(SpiceProxyClass *klass)
                                                        0, G_MAXUINT, 0,
                                                        G_PARAM_STATIC_STRINGS |
                                                        G_PARAM_READWRITE));
+
+    g_object_class_install_property(G_OBJECT_CLASS (klass),
+                                    SPICE_PROXY_USER,
+                                    g_param_spec_string ("user",
+                                                         "user",
+                                                         "user",
+                                                         NULL,
+                                                         G_PARAM_STATIC_STRINGS |
+                                                         G_PARAM_READWRITE));
+
+    g_object_class_install_property(G_OBJECT_CLASS (klass),
+                                    SPICE_PROXY_PASSWORD,
+                                    g_param_spec_string ("password",
+                                                         "password",
+                                                         "password",
+                                                         NULL,
+                                                         G_PARAM_STATIC_STRINGS |
+                                                         G_PARAM_READWRITE));
 }
 
 G_GNUC_INTERNAL
@@ -268,3 +314,39 @@ gchar* spice_proxy_to_string(SpiceProxy* self)
 
     return g_strdup_printf("%s://%s:%u", p->protocol, p->hostname, p->port);
 }
+
+G_GNUC_INTERNAL
+const gchar* spice_proxy_get_user(SpiceProxy *self)
+{
+    g_return_val_if_fail(SPICE_IS_PROXY(self), NULL);
+    return self->priv->user;
+}
+
+
+G_GNUC_INTERNAL
+void spice_proxy_set_user(SpiceProxy *self, const gchar *value)
+{
+    g_return_if_fail(SPICE_IS_PROXY(self));
+
+    g_free(self->priv->user);
+    self->priv->user = g_strdup(value);
+    g_object_notify((GObject *)self, "user");
+}
+
+G_GNUC_INTERNAL
+const gchar* spice_proxy_get_password(SpiceProxy *self)
+{
+    g_return_val_if_fail(SPICE_IS_PROXY(self), NULL);
+    return self->priv->password;
+}
+
+
+G_GNUC_INTERNAL
+void spice_proxy_set_password(SpiceProxy *self, const gchar *value)
+{
+    g_return_if_fail(SPICE_IS_PROXY(self));
+
+    g_free(self->priv->password);
+    self->priv->password = g_strdup(value);
+    g_object_notify((GObject *)self, "password");
+}
diff --git a/gtk/spice-proxy.h b/gtk/spice-proxy.h
index 1e7b6d7..e74053b 100644
--- a/gtk/spice-proxy.h
+++ b/gtk/spice-proxy.h
@@ -54,6 +54,10 @@ void spice_proxy_set_hostname(SpiceProxy* self, const gchar* value);
 guint spice_proxy_get_port(SpiceProxy* self);
 void spice_proxy_set_port(SpiceProxy* self, guint port);
 gchar *spice_proxy_to_string(SpiceProxy* self);
+const gchar* spice_proxy_get_user(SpiceProxy* self);
+void spice_proxy_set_user(SpiceProxy* self, const gchar* value);
+const gchar* spice_proxy_get_password(SpiceProxy* self);
+void spice_proxy_set_password(SpiceProxy* self, const gchar* value);
 
 G_END_DECLS
 
diff --git a/gtk/spice-session.c b/gtk/spice-session.c
index bcbba27..ae14a1f 100644
--- a/gtk/spice-session.c
+++ b/gtk/spice-session.c
@@ -1839,7 +1839,7 @@ GSocketConnection* spice_session_channel_open_host(SpiceSession *session, SpiceC
 #endif
 
     if (open_host.error != NULL) {
-        g_warning("%s", open_host.error->message);
+        g_warning("open host: %s", open_host.error->message);
         g_clear_error(&open_host.error);
     } else if (open_host.connection != NULL) {
         GSocket *socket;
-- 
1.8.4.2



More information about the Spice-devel mailing list