summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@redhat.com>2011-01-24 21:04:15 +0100
committerMarc-André Lureau <marcandre.lureau@redhat.com>2011-01-25 13:05:00 +0100
commitf100682a497e1635895e52ee091e783edabc1877 (patch)
tree580961b53be8121785e0b3c767b0f03b6dafb816
parent7ee5ee8d08ba16b547bc960af177ae7736587b0a (diff)
gtk: add 'pubkey' and 'cert-subject' properties
-rw-r--r--gtk/spice-session-priv.h1
-rw-r--r--gtk/spice-session.c122
2 files changed, 76 insertions, 47 deletions
diff --git a/gtk/spice-session-priv.h b/gtk/spice-session-priv.h
index f6a6b7f..651d8de 100644
--- a/gtk/spice-session-priv.h
+++ b/gtk/spice-session-priv.h
@@ -42,6 +42,7 @@ void spice_session_set_migration(SpiceSession *session, SpiceSession *migration)
void spice_session_abort_migration(SpiceSession *session);
void spice_session_set_port(SpiceSession *session, int port, gboolean tls);
+void spice_session_get_pubkey(SpiceSession *session, guint8 **pubkey, guint *size);
G_END_DECLS
diff --git a/gtk/spice-session.c b/gtk/spice-session.c
index 23fd345..0e70054 100644
--- a/gtk/spice-session.c
+++ b/gtk/spice-session.c
@@ -39,6 +39,9 @@ struct spice_session {
char *tls_port;
char *password;
char *ca_file;
+ GByteArray *pubkey;
+ char *cert_subject;
+
int connection_id;
int protocol;
SpiceChannel *cmain;
@@ -103,6 +106,8 @@ enum {
PROP_PROTOCOL,
PROP_URI,
PROP_CLIENT_SOCKETS,
+ PROP_PUBKEY,
+ PROP_CERT_SUBJECT,
};
/* signals */
@@ -157,11 +162,15 @@ spice_session_finalize(GObject *gobject)
spice_session *s = SPICE_SESSION_GET_PRIVATE(session);
/* release stuff */
- free(s->host);
- free(s->port);
- free(s->tls_port);
- free(s->password);
- free(s->ca_file);
+ g_free(s->host);
+ g_free(s->port);
+ g_free(s->tls_port);
+ g_free(s->password);
+ g_free(s->ca_file);
+ g_free(s->cert_subject);
+
+ if (s->pubkey)
+ g_byte_array_unref(s->pubkey);
/* Chain up to the parent class */
if (G_OBJECT_CLASS(spice_session_parent_class)->finalize)
@@ -285,6 +294,12 @@ static void spice_session_get_property(GObject *gobject,
case PROP_CLIENT_SOCKETS:
g_value_set_boolean(value, s->client_provided_sockets);
break;
+ case PROP_PUBKEY:
+ g_value_set_boxed(value, s->pubkey);
+ break;
+ case PROP_CERT_SUBJECT:
+ g_value_set_string(value, s->cert_subject);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
break;
@@ -302,29 +317,24 @@ static void spice_session_set_property(GObject *gobject,
switch (prop_id) {
case PROP_HOST:
- free(s->host);
- str = g_value_get_string(value);
- s->host = str ? strdup(str) : NULL;
+ g_free(s->host);
+ s->host = g_value_dup_string(value);
break;
case PROP_PORT:
- free(s->port);
- str = g_value_get_string(value);
- s->port = str ? strdup(str) : NULL;
+ g_free(s->port);
+ s->port = g_value_dup_string(value);
break;
case PROP_TLS_PORT:
- free(s->tls_port);
- str = g_value_get_string(value);
- s->tls_port = str ? strdup(str) : NULL;
+ g_free(s->tls_port);
+ s->tls_port = g_value_dup_string(value);
break;
case PROP_PASSWORD:
- free(s->password);
- str = g_value_get_string(value);
- s->password = str ? strdup(str) : NULL;
+ g_free(s->password);
+ s->password = g_value_dup_string(value);
break;
case PROP_CA_FILE:
- free(s->ca_file);
- str = g_value_get_string(value);
- s->ca_file = str ? strdup(str) : NULL;
+ g_free(s->ca_file);
+ s->ca_file = g_value_dup_string(value);
break;
case PROP_PROTOCOL:
s->protocol = g_value_get_int(value);
@@ -337,6 +347,14 @@ static void spice_session_set_property(GObject *gobject,
case PROP_CLIENT_SOCKETS:
s->client_provided_sockets = g_value_get_boolean(value);
break;
+ case PROP_PUBKEY:
+ g_byte_array_unref(s->pubkey);
+ s->pubkey = g_value_get_boxed(value);
+ break;
+ case PROP_CERT_SUBJECT:
+ g_free(s->cert_subject);
+ s->cert_subject = g_value_dup_string(value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
break;
@@ -360,9 +378,7 @@ static void spice_session_class_init(SpiceSessionClass *klass)
"localhost",
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT |
- G_PARAM_STATIC_NAME |
- G_PARAM_STATIC_NICK |
- G_PARAM_STATIC_BLURB));
+ G_PARAM_STATIC_STRINGS));
g_object_class_install_property
(gobject_class, PROP_PORT,
@@ -371,10 +387,7 @@ static void spice_session_class_init(SpiceSessionClass *klass)
"Remote port (plaintext)",
NULL,
G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT |
- G_PARAM_STATIC_NAME |
- G_PARAM_STATIC_NICK |
- G_PARAM_STATIC_BLURB));
+ G_PARAM_STATIC_STRINGS));
g_object_class_install_property
(gobject_class, PROP_TLS_PORT,
@@ -383,10 +396,7 @@ static void spice_session_class_init(SpiceSessionClass *klass)
"Remote port (encrypted)",
NULL,
G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT |
- G_PARAM_STATIC_NAME |
- G_PARAM_STATIC_NICK |
- G_PARAM_STATIC_BLURB));
+ G_PARAM_STATIC_STRINGS));
g_object_class_install_property
(gobject_class, PROP_PASSWORD,
@@ -395,10 +405,7 @@ static void spice_session_class_init(SpiceSessionClass *klass)
"",
NULL,
G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT |
- G_PARAM_STATIC_NAME |
- G_PARAM_STATIC_NICK |
- G_PARAM_STATIC_BLURB));
+ G_PARAM_STATIC_STRINGS));
g_object_class_install_property
(gobject_class, PROP_CA_FILE,
@@ -407,10 +414,7 @@ static void spice_session_class_init(SpiceSessionClass *klass)
"File holding the CA certificates",
NULL,
G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT |
- G_PARAM_STATIC_NAME |
- G_PARAM_STATIC_NICK |
- G_PARAM_STATIC_BLURB));
+ G_PARAM_STATIC_STRINGS));
g_object_class_install_property
(gobject_class, PROP_PROTOCOL,
@@ -420,9 +424,7 @@ static void spice_session_class_init(SpiceSessionClass *klass)
1, 2, 2,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT |
- G_PARAM_STATIC_NAME |
- G_PARAM_STATIC_NICK |
- G_PARAM_STATIC_BLURB));
+ G_PARAM_STATIC_STRINGS));
g_object_class_install_property
(gobject_class, PROP_URI,
@@ -431,10 +433,7 @@ static void spice_session_class_init(SpiceSessionClass *klass)
"Spice connection URI",
NULL,
G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT |
- G_PARAM_STATIC_NAME |
- G_PARAM_STATIC_NICK |
- G_PARAM_STATIC_BLURB));
+ G_PARAM_STATIC_STRINGS));
g_object_class_install_property
(gobject_class, PROP_CLIENT_SOCKETS,
@@ -443,9 +442,25 @@ static void spice_session_class_init(SpiceSessionClass *klass)
"Sockets are provided by the client",
FALSE,
G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property
+ (gobject_class, PROP_PUBKEY,
+ g_param_spec_boxed("pubkey",
+ "Pub Key",
+ "Public key to check",
+ G_TYPE_BYTE_ARRAY,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property
+ (gobject_class, PROP_CERT_SUBJECT,
+ g_param_spec_string("cert-subject",
+ "Cert Subject",
+ "Certificate subject to check",
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
/**
* SpiceSession::channel-new:
* @session: the session that emitted the signal
@@ -966,3 +981,16 @@ void spice_session_set_port(SpiceSession *session, int port, gboolean tls)
g_object_set(session, prop, tmp, NULL);
g_free(tmp);
}
+
+G_GNUC_INTERNAL
+void spice_session_get_pubkey(SpiceSession *session, guint8 **pubkey, guint *size)
+{
+ spice_session *s = SPICE_SESSION_GET_PRIVATE(session);
+
+ g_return_if_fail(s != NULL);
+ g_return_if_fail(pubkey != NULL);
+ g_return_if_fail(size != NULL);
+
+ *pubkey = s->pubkey ? s->pubkey->data : NULL;
+ *size = s->pubkey ? s->pubkey->len : 0;
+}