[Spice-devel] [v3: PATCH 1/3] Add "username" property to SpiceSession

Fabiano Fidêncio fidencio at redhat.com
Wed Oct 8 04:23:06 PDT 2014


From: Dietmar Maurer <dietmar at proxmox.com>

---
No changes since v2
---
 gtk/spice-session-priv.h |  2 ++
 gtk/spice-session.c      | 63 +++++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 61 insertions(+), 4 deletions(-)

diff --git a/gtk/spice-session-priv.h b/gtk/spice-session-priv.h
index 4b2c151..da43866 100644
--- a/gtk/spice-session-priv.h
+++ b/gtk/spice-session-priv.h
@@ -45,6 +45,7 @@ struct _SpiceSessionPrivate {
     char              *host;
     char              *port;
     char              *tls_port;
+    char              *username;
     char              *password;
     char              *ca_file;
     char              *ciphers;
@@ -146,6 +147,7 @@ void spice_session_set_migration_state(SpiceSession *session, SpiceSessionMigrat
 void spice_session_set_port(SpiceSession *session, int port, gboolean tls);
 void spice_session_get_pubkey(SpiceSession *session, guint8 **pubkey, guint *size);
 guint spice_session_get_verify(SpiceSession *session);
+const gchar* spice_session_get_username(SpiceSession *session);
 const gchar* spice_session_get_password(SpiceSession *session);
 const gchar* spice_session_get_host(SpiceSession *session);
 const gchar* spice_session_get_cert_subject(SpiceSession *session);
diff --git a/gtk/spice-session.c b/gtk/spice-session.c
index 49afc97..17c18f9 100644
--- a/gtk/spice-session.c
+++ b/gtk/spice-session.c
@@ -111,7 +111,8 @@ enum {
     PROP_CA,
     PROP_PROXY,
     PROP_SECURE_CHANNELS,
-    PROP_SHARED_DIR
+    PROP_SHARED_DIR,
+    PROP_USERNAME
 };
 
 /* signals */
@@ -217,6 +218,7 @@ spice_session_finalize(GObject *gobject)
     g_free(s->host);
     g_free(s->port);
     g_free(s->tls_port);
+    g_free(s->username);
     g_free(s->password);
     g_free(s->ca_file);
     g_free(s->ciphers);
@@ -262,11 +264,12 @@ static int spice_uri_create(SpiceSession *session, char *dest, int len)
 static int spice_parse_uri(SpiceSession *session, const char *original_uri)
 {
     SpiceSessionPrivate *s = session->priv;
-    gchar *host = NULL, *port = NULL, *tls_port = NULL, *uri = NULL, *password = NULL;
+    gchar *host = NULL, *port = NULL, *tls_port = NULL, *uri = NULL, *username = NULL, *password = NULL;
     gchar *path = NULL;
     gchar *unescaped_path = NULL;
     gchar *authority = NULL;
     gchar *query = NULL;
+    gchar *tmp = NULL;
 
     g_return_val_if_fail(original_uri != NULL, -1);
 
@@ -281,6 +284,22 @@ static int spice_parse_uri(SpiceSession *session, const char *original_uri)
         goto fail;
     }
     authority = uri + strlen(URI_SCHEME_SPICE);
+
+    tmp = strchr(authority, '@');
+    if (tmp) {
+        gchar *buffer = g_strndup(authority, tmp - authority);
+        if (strstr(buffer, "%40") == NULL) {
+            username = buffer;
+            buffer = NULL;
+        } else {
+            username = g_uri_unescape_string(buffer, NULL);
+            g_free(buffer);
+        }
+
+        authority = ++tmp;
+        tmp = NULL;
+    }
+
     path = strchr(authority, '/');
     if (path) {
         path[0] = '\0';
@@ -303,7 +322,7 @@ static int spice_parse_uri(SpiceSession *session, const char *original_uri)
     /* Now process the individual parts */
 
     if (authority[0] == '[') {
-        gchar *tmp = strchr(authority, ']');
+        tmp = strchr(authority, ']');
         if (!tmp) {
             g_warning("Missing closing ']' in authority for URI '%s'", uri);
             goto fail;
@@ -314,7 +333,7 @@ static int spice_parse_uri(SpiceSession *session, const char *original_uri)
         if (tmp[0] == ':')
             port = g_strdup(tmp + 1);
     } else {
-        gchar *tmp = strchr(authority, ':');
+        tmp = strchr(authority, ':');
         if (tmp) {
             *tmp = '\0';
             tmp++;
@@ -375,10 +394,12 @@ static int spice_parse_uri(SpiceSession *session, const char *original_uri)
     g_free(s->host);
     g_free(s->port);
     g_free(s->tls_port);
+    g_free(s->username);
     g_free(s->password);
     s->host = host;
     s->port = port;
     s->tls_port = tls_port;
+    s->username = username;
     s->password = password;
     return 0;
 
@@ -388,6 +409,7 @@ fail:
     g_free(host);
     g_free(port);
     g_free(tls_port);
+    g_free(username);
     g_free(password);
     return -1;
 }
@@ -412,6 +434,9 @@ static void spice_session_get_property(GObject    *gobject,
     case PROP_TLS_PORT:
         g_value_set_string(value, s->tls_port);
 	break;
+    case PROP_USERNAME:
+        g_value_set_string(value, s->username);
+	break;
     case PROP_PASSWORD:
         g_value_set_string(value, s->password);
 	break;
@@ -522,6 +547,10 @@ static void spice_session_set_property(GObject      *gobject,
         g_free(s->tls_port);
         s->tls_port = g_value_dup_string(value);
         break;
+    case PROP_USERNAME:
+        g_free(s->username);
+        s->username = g_value_dup_string(value);
+        break;
     case PROP_PASSWORD:
         g_free(s->password);
         s->password = g_value_dup_string(value);
@@ -688,6 +717,21 @@ static void spice_session_class_init(SpiceSessionClass *klass)
                              G_PARAM_STATIC_STRINGS));
 
     /**
+     * SpiceSession:username:
+     *
+     * Username to use
+     *
+     **/
+    g_object_class_install_property
+        (gobject_class, PROP_USERNAME,
+         g_param_spec_string("username",
+                             "Username",
+                             "Username used for SASL connections",
+                             NULL,
+                             G_PARAM_READWRITE |
+                             G_PARAM_STATIC_STRINGS));
+
+    /**
      * SpiceSession:password:
      *
      * TLS password to use
@@ -1214,6 +1258,7 @@ SpiceSession *spice_session_new_from_session(SpiceSession *session)
 
     g_warn_if_fail(c->host == NULL);
     g_warn_if_fail(c->tls_port == NULL);
+    g_warn_if_fail(c->username == NULL);
     g_warn_if_fail(c->password == NULL);
     g_warn_if_fail(c->ca_file == NULL);
     g_warn_if_fail(c->ciphers == NULL);
@@ -1225,6 +1270,7 @@ SpiceSession *spice_session_new_from_session(SpiceSession *session)
     g_object_get(session,
                  "host", &c->host,
                  "tls-port", &c->tls_port,
+                 "username", &c->username,
                  "password", &c->password,
                  "ca-file", &c->ca_file,
                  "ciphers", &c->ciphers,
@@ -2073,6 +2119,15 @@ void spice_session_set_migration_state(SpiceSession *session, SpiceSessionMigrat
 }
 
 G_GNUC_INTERNAL
+const gchar* spice_session_get_username(SpiceSession *session)
+{
+    SpiceSessionPrivate *s = session->priv;
+
+    g_return_val_if_fail(s != NULL, NULL);
+    return s->username;
+}
+
+G_GNUC_INTERNAL
 const gchar* spice_session_get_password(SpiceSession *session)
 {
     SpiceSessionPrivate *s = session->priv;
-- 
2.1.0



More information about the Spice-devel mailing list