diff options
Diffstat (limited to 'src/x2go-server.c')
-rw-r--r-- | src/x2go-server.c | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/src/x2go-server.c b/src/x2go-server.c new file mode 100644 index 0000000..fb0935e --- /dev/null +++ b/src/x2go-server.c @@ -0,0 +1,227 @@ +/* + * Copyright © 2012 Canonical Ltd. + * Copyright © 2013 Mike Gabriel <mike.gabriel@das-netzwerkteam.de> + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 3, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranties of + * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + * + * Author: Ted Gould <ted@canonical.com> + * Modified for X2Go: Mike Gabriel <mike.gabriel@das-netzwerkteam.de> + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <sys/mman.h> + +#include <glib/gi18n.h> + +#include <string.h> + +#include "x2go-server.h" +#include "defines.h" + +static void x2go_server_class_init (X2GoServerClass *klass); +static void x2go_server_init (X2GoServer *self); +static void x2go_server_dispose (GObject *object); +static void x2go_server_finalize (GObject *object); +static GVariant * get_properties (Server * server); + +G_DEFINE_TYPE (X2GoServer, x2go_server, SERVER_TYPE); + +static void +x2go_server_class_init (X2GoServerClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = x2go_server_dispose; + object_class->finalize = x2go_server_finalize; + + ServerClass * server_class = SERVER_CLASS(klass); + + server_class->get_properties = get_properties; + + return; +} + +static void +x2go_server_init (X2GoServer *self) +{ + self->username = NULL; + self->password = NULL; + self->sessiontype = NULL; + self->sessiontype_required = FALSE; + + return; +} + +static void +x2go_server_dispose (GObject *object) +{ + + G_OBJECT_CLASS (x2go_server_parent_class)->dispose (object); + return; +} + +/* Unlocks the memory before freeing */ +static void +password_clear (gpointer data) +{ + char * pass = (char *)data; + munlock(pass, strlen(pass)); + g_free(pass); + return; +} + +static void +x2go_server_finalize (GObject *object) +{ + X2GoServer * server = X2GO_SERVER(object); + + g_clear_pointer(&server->username, g_free); + g_clear_pointer(&server->password, password_clear); + g_clear_pointer(&server->sessiontype, g_free); + + G_OBJECT_CLASS (x2go_server_parent_class)->finalize (object); + return; +} + +static GVariant * +get_properties (Server * server) +{ + X2GoServer * rserver = X2GO_SERVER(server); + + GVariantBuilder propbuilder; + g_variant_builder_init(&propbuilder, G_VARIANT_TYPE_ARRAY); + + GVariantBuilder namebuilder; + g_variant_builder_init(&namebuilder, G_VARIANT_TYPE_TUPLE); + g_variant_builder_add_value(&namebuilder, g_variant_new_string("username")); + g_variant_builder_add_value(&namebuilder, g_variant_new_boolean(TRUE)); + if (rserver->username == NULL) { + g_variant_builder_add_value(&namebuilder, g_variant_new_variant(g_variant_new_string(""))); + } else { + g_variant_builder_add_value(&namebuilder, g_variant_new_variant(g_variant_new_string(rserver->username))); + } + g_variant_builder_add_value(&namebuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL)); + g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&namebuilder)); + + GVariantBuilder passbuilder; + g_variant_builder_init(&passbuilder, G_VARIANT_TYPE_TUPLE); + g_variant_builder_add_value(&passbuilder, g_variant_new_string("password")); + g_variant_builder_add_value(&passbuilder, g_variant_new_boolean(TRUE)); + if (rserver->password == NULL) { + g_variant_builder_add_value(&passbuilder, g_variant_new_variant(g_variant_new_string(""))); + } else { + g_variant_builder_add_value(&passbuilder, g_variant_new_variant(g_variant_new_string(rserver->password))); + } + g_variant_builder_add_value(&passbuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL)); + g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&passbuilder)); + + GVariantBuilder sessiontypebuilder; + g_variant_builder_init(&sessiontypebuilder, G_VARIANT_TYPE_TUPLE); + g_variant_builder_add_value(&sessiontypebuilder, g_variant_new_string("x2gosession")); + g_variant_builder_add_value(&sessiontypebuilder, g_variant_new_boolean(rserver->sessiontype_required)); + if (rserver->sessiontype == NULL) { + g_variant_builder_add_value(&sessiontypebuilder, g_variant_new_variant(g_variant_new_string(""))); + } else { + g_variant_builder_add_value(&sessiontypebuilder, g_variant_new_variant(g_variant_new_string(rserver->sessiontype))); + } + g_variant_builder_add_value(&sessiontypebuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL)); + g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&sessiontypebuilder)); + + return g_variant_builder_end(&propbuilder); +} + +Server * +x2go_server_new_from_keyfile (GKeyFile * keyfile, const gchar * groupname) +{ + g_return_val_if_fail(keyfile != NULL, NULL); /* NOTE: No way to check if that's really a keyfile :-( */ + g_return_val_if_fail(groupname != NULL, NULL); + + if (!g_key_file_has_group(keyfile, groupname)) { + g_warning("Server specified but group '%s' was not found", groupname); + return NULL; + } + + X2GoServer * server = g_object_new(X2GO_SERVER_TYPE, NULL); + + if (g_key_file_has_key(keyfile, groupname, CONFIG_SERVER_NAME, NULL)) { + gchar * keyname = g_key_file_get_string(keyfile, groupname, CONFIG_SERVER_NAME, NULL); + server->parent.name = g_strdup(_(keyname)); + g_free(keyname); + } + + if (g_key_file_has_key(keyfile, groupname, CONFIG_SERVER_URI, NULL)) { + server->parent.uri = g_key_file_get_string(keyfile, groupname, CONFIG_SERVER_URI, NULL); + } + + return SERVER(server); +} + +/* Build the X2Go server from information in the JSON object */ +Server * +x2go_server_new_from_json (JsonObject * object) +{ + X2GoServer * server = g_object_new(X2GO_SERVER_TYPE, NULL); + + if (json_object_has_member(object, JSON_SERVER_NAME)) { + JsonNode * node = json_object_get_member(object, JSON_SERVER_NAME); + if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) { + const gchar * name = json_node_get_string(node); + server->parent.name = g_strdup(name); + } + } + + if (json_object_has_member(object, JSON_URI)) { + JsonNode * node = json_object_get_member(object, JSON_URI); + if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) { + const gchar * uri = json_node_get_string(node); + server->parent.uri = g_strdup(uri); + } + } + + if (json_object_has_member(object, JSON_USERNAME)) { + JsonNode * node = json_object_get_member(object, JSON_USERNAME); + if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) { + const gchar * username = json_node_get_string(node); + server->username = g_strdup(username); + } + } + + if (json_object_has_member(object, JSON_PASSWORD)) { + JsonNode * node = json_object_get_member(object, JSON_PASSWORD); + if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) { + const gchar * password = json_node_get_string(node); + server->password = g_strdup(password); + mlock(server->password, strlen(server->password)); + } + } + + if (json_object_has_member(object, JSON_SESSIONTYPE)) { + JsonNode * node = json_object_get_member(object, JSON_SESSIONTYPE); + if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) { + const gchar * sessiontype = json_node_get_string(node); + server->sessiontype = g_strdup(sessiontype); + } + } + + if (json_object_has_member(object, JSON_SESSIONTYPE_REQ)) { + JsonNode * node = json_object_get_member(object, JSON_SESSIONTYPE_REQ); + if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_BOOLEAN) { + server->sessiontype_required = json_node_get_boolean(node); + } + } + + return SERVER(server); +} |