[Spice-devel] [v3: PATCH 2/3] Add "username" property to SpiceSession
Fabiano Fidêncio
fidencio at redhat.com
Tue Oct 7 07:21:03 PDT 2014
From: Dietmar Maurer <dietmar at proxmox.com>
---
Changes since v2:
- Parse the username from the URI instead of adding an additional parameter
---
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