Merge lp:~ted/remote-login-service/signal-ready into lp:~ted/remote-login-service/oo-cleanup

Proposed by Ted Gould
Status: Superseded
Proposed branch: lp:~ted/remote-login-service/signal-ready
Merge into: lp:~ted/remote-login-service/oo-cleanup
Diff against target: 807 lines (+379/-41)
12 files modified
src/citrix-server.c (+71/-4)
src/citrix-server.h (+5/-0)
src/defines.h (+2/-0)
src/main.c (+52/-14)
src/rdp-server.c (+71/-4)
src/rdp-server.h (+5/-0)
src/server.c (+17/-0)
src/server.h (+13/-0)
src/uccs-server.c (+45/-6)
tests/dbus-interface.c (+54/-12)
tests/server-test.c (+43/-0)
tests/slmock (+1/-1)
To merge this branch: bzr merge lp:~ted/remote-login-service/signal-ready
Reviewer Review Type Date Requested Status
Ted Gould Pending
Review via email: mp+123644@code.launchpad.net

This proposal has been superseded by a proposal from 2012-09-10.

Commit message

Add a state to the servers to know if they're configured

To post a comment you must log in.
76. By Ted Gould

Add an executable for the build system that don't have thin-client-config-agent

77. By Ted Gould

Attaching bug

Unmerged revisions

77. By Ted Gould

Attaching bug

76. By Ted Gould

Add an executable for the build system that don't have thin-client-config-agent

75. By Ted Gould

Don't need a tuple there apparently

74. By Ted Gould

Add a test to ensure we signaled updates

73. By Ted Gould

Pulling out the set_exec code so that we can test the signal stuff

72. By Ted Gould

When the server list changes emit the dbus signal

71. By Ted Gould

Handle a race with an extra DBus message

70. By Ted Gould

Moving where the config file is parsed to the servers aren't created until we've connected to DBus

69. By Ted Gould

Watching for servers updating themselves

68. By Ted Gould

Better handle the case of zero all good servers

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/citrix-server.c'
--- src/citrix-server.c 2012-08-29 19:09:54 +0000
+++ src/citrix-server.c 2012-09-10 21:37:19 +0000
@@ -20,6 +20,8 @@
20#include "config.h"20#include "config.h"
21#endif21#endif
2222
23#include <string.h>
24
23#include "citrix-server.h"25#include "citrix-server.h"
24#include "defines.h"26#include "defines.h"
2527
@@ -49,6 +51,10 @@
49static void51static void
50citrix_server_init (CitrixServer *self)52citrix_server_init (CitrixServer *self)
51{53{
54 self->username = NULL;
55 self->password = NULL;
56 self->domain = NULL;
57 self->domain_required = FALSE;
5258
53 return;59 return;
54}60}
@@ -61,9 +67,24 @@
61 return;67 return;
62}68}
6369
70/* Unlocks the memory before freeing */
71static void
72password_clear (gpointer data)
73{
74 char * pass = (char *)data;
75 munlock(pass, strlen(pass));
76 g_free(pass);
77 return;
78}
79
64static void80static void
65citrix_server_finalize (GObject *object)81citrix_server_finalize (GObject *object)
66{82{
83 CitrixServer * server = CITRIX_SERVER(object);
84
85 g_clear_pointer(&server->username, g_free);
86 g_clear_pointer(&server->password, password_clear);
87 g_clear_pointer(&server->domain, g_free);
6788
68 G_OBJECT_CLASS (citrix_server_parent_class)->finalize (object);89 G_OBJECT_CLASS (citrix_server_parent_class)->finalize (object);
69 return;90 return;
@@ -72,6 +93,8 @@
72static GVariant *93static GVariant *
73get_properties (Server * server)94get_properties (Server * server)
74{95{
96 CitrixServer * cserver = CITRIX_SERVER(server);
97
75 GVariantBuilder propbuilder;98 GVariantBuilder propbuilder;
76 g_variant_builder_init(&propbuilder, G_VARIANT_TYPE_ARRAY);99 g_variant_builder_init(&propbuilder, G_VARIANT_TYPE_ARRAY);
77100
@@ -79,7 +102,11 @@
79 g_variant_builder_init(&namebuilder, G_VARIANT_TYPE_TUPLE);102 g_variant_builder_init(&namebuilder, G_VARIANT_TYPE_TUPLE);
80 g_variant_builder_add_value(&namebuilder, g_variant_new_string("username"));103 g_variant_builder_add_value(&namebuilder, g_variant_new_string("username"));
81 g_variant_builder_add_value(&namebuilder, g_variant_new_boolean(TRUE));104 g_variant_builder_add_value(&namebuilder, g_variant_new_boolean(TRUE));
82 g_variant_builder_add_value(&namebuilder, g_variant_new_variant(g_variant_new_string("")));105 if (cserver->username == NULL) {
106 g_variant_builder_add_value(&namebuilder, g_variant_new_variant(g_variant_new_string("")));
107 } else {
108 g_variant_builder_add_value(&namebuilder, g_variant_new_variant(g_variant_new_string(cserver->username)));
109 }
83 g_variant_builder_add_value(&namebuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));110 g_variant_builder_add_value(&namebuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));
84 g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&namebuilder));111 g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&namebuilder));
85112
@@ -87,15 +114,23 @@
87 g_variant_builder_init(&passbuilder, G_VARIANT_TYPE_TUPLE);114 g_variant_builder_init(&passbuilder, G_VARIANT_TYPE_TUPLE);
88 g_variant_builder_add_value(&passbuilder, g_variant_new_string("password"));115 g_variant_builder_add_value(&passbuilder, g_variant_new_string("password"));
89 g_variant_builder_add_value(&passbuilder, g_variant_new_boolean(TRUE));116 g_variant_builder_add_value(&passbuilder, g_variant_new_boolean(TRUE));
90 g_variant_builder_add_value(&passbuilder, g_variant_new_variant(g_variant_new_string("")));117 if (cserver->password == NULL) {
118 g_variant_builder_add_value(&passbuilder, g_variant_new_variant(g_variant_new_string("")));
119 } else {
120 g_variant_builder_add_value(&passbuilder, g_variant_new_variant(g_variant_new_string(cserver->password)));
121 }
91 g_variant_builder_add_value(&passbuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));122 g_variant_builder_add_value(&passbuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));
92 g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&passbuilder));123 g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&passbuilder));
93124
94 GVariantBuilder domainbuilder;125 GVariantBuilder domainbuilder;
95 g_variant_builder_init(&domainbuilder, G_VARIANT_TYPE_TUPLE);126 g_variant_builder_init(&domainbuilder, G_VARIANT_TYPE_TUPLE);
96 g_variant_builder_add_value(&domainbuilder, g_variant_new_string("domain"));127 g_variant_builder_add_value(&domainbuilder, g_variant_new_string("domain"));
97 g_variant_builder_add_value(&domainbuilder, g_variant_new_boolean(TRUE));128 g_variant_builder_add_value(&domainbuilder, g_variant_new_boolean(cserver->domain_required));
98 g_variant_builder_add_value(&domainbuilder, g_variant_new_variant(g_variant_new_string("")));129 if (cserver->domain == NULL) {
130 g_variant_builder_add_value(&domainbuilder, g_variant_new_variant(g_variant_new_string("")));
131 } else {
132 g_variant_builder_add_value(&domainbuilder, g_variant_new_variant(g_variant_new_string(cserver->domain)));
133 }
99 g_variant_builder_add_value(&domainbuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));134 g_variant_builder_add_value(&domainbuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));
100 g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&domainbuilder));135 g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&domainbuilder));
101136
@@ -148,5 +183,37 @@
148 }183 }
149 }184 }
150185
186 if (json_object_has_member(object, JSON_USERNAME)) {
187 JsonNode * node = json_object_get_member(object, JSON_USERNAME);
188 if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) {
189 const gchar * username = json_node_get_string(node);
190 server->username = g_strdup(username);
191 }
192 }
193
194 if (json_object_has_member(object, JSON_PASSWORD)) {
195 JsonNode * node = json_object_get_member(object, JSON_PASSWORD);
196 if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) {
197 const gchar * password = json_node_get_string(node);
198 server->password = g_strdup(password);
199 mlock(server->password, strlen(server->password));
200 }
201 }
202
203 if (json_object_has_member(object, JSON_DOMAIN)) {
204 JsonNode * node = json_object_get_member(object, JSON_DOMAIN);
205 if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) {
206 const gchar * domain = json_node_get_string(node);
207 server->domain = g_strdup(domain);
208 }
209 }
210
211 if (json_object_has_member(object, JSON_DOMAIN_REQ)) {
212 JsonNode * node = json_object_get_member(object, JSON_DOMAIN_REQ);
213 if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_BOOLEAN) {
214 server->domain_required = json_node_get_boolean(node);
215 }
216 }
217
151 return SERVER(server);218 return SERVER(server);
152}219}
153220
=== modified file 'src/citrix-server.h'
--- src/citrix-server.h 2012-08-16 18:44:58 +0000
+++ src/citrix-server.h 2012-09-10 21:37:19 +0000
@@ -41,6 +41,11 @@
4141
42struct _CitrixServer {42struct _CitrixServer {
43 Server parent;43 Server parent;
44
45 gchar * username;
46 gchar * password;
47 gchar * domain;
48 gboolean domain_required;
44};49};
4550
46GType citrix_server_get_type (void);51GType citrix_server_get_type (void);
4752
=== modified file 'src/defines.h'
--- src/defines.h 2012-08-29 19:09:54 +0000
+++ src/defines.h 2012-09-10 21:37:19 +0000
@@ -37,5 +37,7 @@
37#define JSON_URI "URL"37#define JSON_URI "URL"
38#define JSON_USERNAME "Username"38#define JSON_USERNAME "Username"
39#define JSON_PASSWORD "Password"39#define JSON_PASSWORD "Password"
40#define JSON_DOMAIN_REQ "DomainRequired"
41#define JSON_DOMAIN "WindowsDomain"
4042
41#endif /* __DEFINES_H__ */43#endif /* __DEFINES_H__ */
4244
=== modified file 'src/main.c'
--- src/main.c 2012-08-29 19:09:44 +0000
+++ src/main.c 2012-09-10 21:37:19 +0000
@@ -26,6 +26,8 @@
26#include "citrix-server.h"26#include "citrix-server.h"
27#include "uccs-server.h"27#include "uccs-server.h"
2828
29gint server_list_to_array (GVariantBuilder * builder, GList * items);
30
29enum {31enum {
30 ERROR_SERVER_URI,32 ERROR_SERVER_URI,
31 ERROR_LOGIN33 ERROR_LOGIN
@@ -44,8 +46,31 @@
44 return value;46 return value;
45}47}
4648
47static void49/* When one of the state changes on the server emit that so that everone knows there
48find_config_file (GKeyFile * parsed, const gchar * cmnd_line)50 might be a new server available. */
51static void
52server_status_updated (Server * server, ServerState newstate, RemoteLogin * rl)
53{
54 GVariant * array = NULL;
55
56 GVariantBuilder builder;
57 g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
58
59 if (server_list_to_array(&builder, config_file_servers) > 0) {
60 array = g_variant_builder_end(&builder);
61 } else {
62 g_variant_builder_clear(&builder);
63 array = g_variant_new_array(G_VARIANT_TYPE("(sssba(sbva{sv})a(si))"), NULL, 0);
64 }
65
66 remote_login_emit_servers_updated(rl, array);
67 return;
68}
69
70/* Looks for the config file and does some basic parsing to pull out the UCCS servers
71 that are configured in it */
72static void
73find_config_file (GKeyFile * parsed, const gchar * cmnd_line, RemoteLogin * rl)
49{74{
50 GError * error = NULL;75 GError * error = NULL;
51 const gchar * file = DEFAULT_CONFIG_FILE;76 const gchar * file = DEFAULT_CONFIG_FILE;
@@ -82,25 +107,37 @@
82 }107 }
83108
84 config_file_servers = g_list_append(config_file_servers, server);109 config_file_servers = g_list_append(config_file_servers, server);
110 g_signal_connect(server, SERVER_SIGNAL_STATE_CHANGED, G_CALLBACK(server_status_updated), rl);
85 }111 }
86112
87 g_strfreev(grouplist);113 g_strfreev(grouplist);
88 }114 }
89115
116 /* Signal the list of servers so that we're sure everyone's got them. This is to
117 solve a possible race where someone could ask while we're configuring these. */
118 server_status_updated(NULL, SERVER_STATE_ALLGOOD, rl);
90 return;119 return;
91}120}
92121
93void122gint
94server_list_to_array (GVariantBuilder * builder, GList * items)123server_list_to_array (GVariantBuilder * builder, GList * items)
95{124{
125 gint servercnt = 0;
96 GList * head = NULL;126 GList * head = NULL;
97 for (head = items; head != NULL; head = g_list_next(head)) {127 for (head = items; head != NULL; head = g_list_next(head)) {
98 Server * server = SERVER(head->data);128 Server * server = SERVER(head->data);
129
130 /* We only want servers that are all good */
131 if (server->state != SERVER_STATE_ALLGOOD) {
132 continue;
133 }
134
135 servercnt++;
99 GVariant * variant = server_get_variant(server);136 GVariant * variant = server_get_variant(server);
100 g_variant_builder_add_value(builder, variant);137 g_variant_builder_add_value(builder, variant);
101 }138 }
102139
103 return;140 return servercnt;
104}141}
105142
106static gboolean143static gboolean
@@ -108,14 +145,13 @@
108{145{
109 GVariant * array = NULL;146 GVariant * array = NULL;
110147
111 if (g_list_length(config_file_servers) > 0) {148 GVariantBuilder builder;
112 GVariantBuilder builder;149 g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
113 g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);150
114151 if (server_list_to_array(&builder, config_file_servers) > 0) {
115 server_list_to_array(&builder, config_file_servers);
116
117 array = g_variant_builder_end(&builder);152 array = g_variant_builder_end(&builder);
118 } else {153 } else {
154 g_variant_builder_clear(&builder);
119 array = g_variant_new_array(G_VARIANT_TYPE("(sssba(sbva{sv})a(si))"), NULL, 0);155 array = g_variant_new_array(G_VARIANT_TYPE("(sssba(sbva{sv})a(si))"), NULL, 0);
120 }156 }
121157
@@ -279,7 +315,7 @@
279{315{
280 GMainLoop * mainloop = (GMainLoop *)user_data;316 GMainLoop * mainloop = (GMainLoop *)user_data;
281317
282 g_error("Unable to get name '%s'", name);318 g_warning("Unable to get name '%s'. Exiting.", name);
283 g_main_loop_quit(mainloop);319 g_main_loop_quit(mainloop);
284320
285 return;321 return;
@@ -313,9 +349,6 @@
313 return 1;349 return 1;
314 }350 }
315351
316 /* Parse config file */
317 find_config_file(config, cmnd_line_config);
318
319 /* Start up D' Bus */352 /* Start up D' Bus */
320 GDBusConnection * session_bus = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL /* cancel */, &error);353 GDBusConnection * session_bus = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL /* cancel */, &error);
321 if (error != NULL) {354 if (error != NULL) {
@@ -324,7 +357,9 @@
324 return -1;357 return -1;
325 }358 }
326359
360 /* Build Dbus Interface */
327 RemoteLogin * skel = remote_login_skeleton_new();361 RemoteLogin * skel = remote_login_skeleton_new();
362 /* Export it */
328 g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(skel),363 g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(skel),
329 session_bus,364 session_bus,
330 "/com/canonical/RemoteLogin",365 "/com/canonical/RemoteLogin",
@@ -341,6 +376,9 @@
341 mainloop,376 mainloop,
342 NULL); /* mainloop free */377 NULL); /* mainloop free */
343378
379 /* Parse config file */
380 find_config_file(config, cmnd_line_config, skel);
381
344 /* Loop forever */382 /* Loop forever */
345 g_main_loop_run(mainloop);383 g_main_loop_run(mainloop);
346384
347385
=== modified file 'src/rdp-server.c'
--- src/rdp-server.c 2012-08-29 19:09:54 +0000
+++ src/rdp-server.c 2012-09-10 21:37:19 +0000
@@ -20,6 +20,8 @@
20#include "config.h"20#include "config.h"
21#endif21#endif
2222
23#include <string.h>
24
23#include "rdp-server.h"25#include "rdp-server.h"
24#include "defines.h"26#include "defines.h"
2527
@@ -49,6 +51,10 @@
49static void51static void
50rdp_server_init (RdpServer *self)52rdp_server_init (RdpServer *self)
51{53{
54 self->username = NULL;
55 self->password = NULL;
56 self->domain = NULL;
57 self->domain_required = FALSE;
5258
53 return;59 return;
54}60}
@@ -61,9 +67,24 @@
61 return;67 return;
62}68}
6369
70/* Unlocks the memory before freeing */
71static void
72password_clear (gpointer data)
73{
74 char * pass = (char *)data;
75 munlock(pass, strlen(pass));
76 g_free(pass);
77 return;
78}
79
64static void80static void
65rdp_server_finalize (GObject *object)81rdp_server_finalize (GObject *object)
66{82{
83 RdpServer * server = RDP_SERVER(object);
84
85 g_clear_pointer(&server->username, g_free);
86 g_clear_pointer(&server->password, password_clear);
87 g_clear_pointer(&server->domain, g_free);
6788
68 G_OBJECT_CLASS (rdp_server_parent_class)->finalize (object);89 G_OBJECT_CLASS (rdp_server_parent_class)->finalize (object);
69 return;90 return;
@@ -72,6 +93,8 @@
72static GVariant *93static GVariant *
73get_properties (Server * server)94get_properties (Server * server)
74{95{
96 RdpServer * rserver = RDP_SERVER(server);
97
75 GVariantBuilder propbuilder;98 GVariantBuilder propbuilder;
76 g_variant_builder_init(&propbuilder, G_VARIANT_TYPE_ARRAY);99 g_variant_builder_init(&propbuilder, G_VARIANT_TYPE_ARRAY);
77100
@@ -79,7 +102,11 @@
79 g_variant_builder_init(&namebuilder, G_VARIANT_TYPE_TUPLE);102 g_variant_builder_init(&namebuilder, G_VARIANT_TYPE_TUPLE);
80 g_variant_builder_add_value(&namebuilder, g_variant_new_string("username"));103 g_variant_builder_add_value(&namebuilder, g_variant_new_string("username"));
81 g_variant_builder_add_value(&namebuilder, g_variant_new_boolean(TRUE));104 g_variant_builder_add_value(&namebuilder, g_variant_new_boolean(TRUE));
82 g_variant_builder_add_value(&namebuilder, g_variant_new_variant(g_variant_new_string("")));105 if (rserver->username == NULL) {
106 g_variant_builder_add_value(&namebuilder, g_variant_new_variant(g_variant_new_string("")));
107 } else {
108 g_variant_builder_add_value(&namebuilder, g_variant_new_variant(g_variant_new_string(rserver->username)));
109 }
83 g_variant_builder_add_value(&namebuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));110 g_variant_builder_add_value(&namebuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));
84 g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&namebuilder));111 g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&namebuilder));
85112
@@ -87,15 +114,23 @@
87 g_variant_builder_init(&passbuilder, G_VARIANT_TYPE_TUPLE);114 g_variant_builder_init(&passbuilder, G_VARIANT_TYPE_TUPLE);
88 g_variant_builder_add_value(&passbuilder, g_variant_new_string("password"));115 g_variant_builder_add_value(&passbuilder, g_variant_new_string("password"));
89 g_variant_builder_add_value(&passbuilder, g_variant_new_boolean(TRUE));116 g_variant_builder_add_value(&passbuilder, g_variant_new_boolean(TRUE));
90 g_variant_builder_add_value(&passbuilder, g_variant_new_variant(g_variant_new_string("")));117 if (rserver->password == NULL) {
118 g_variant_builder_add_value(&passbuilder, g_variant_new_variant(g_variant_new_string("")));
119 } else {
120 g_variant_builder_add_value(&passbuilder, g_variant_new_variant(g_variant_new_string(rserver->password)));
121 }
91 g_variant_builder_add_value(&passbuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));122 g_variant_builder_add_value(&passbuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));
92 g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&passbuilder));123 g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&passbuilder));
93124
94 GVariantBuilder domainbuilder;125 GVariantBuilder domainbuilder;
95 g_variant_builder_init(&domainbuilder, G_VARIANT_TYPE_TUPLE);126 g_variant_builder_init(&domainbuilder, G_VARIANT_TYPE_TUPLE);
96 g_variant_builder_add_value(&domainbuilder, g_variant_new_string("domain"));127 g_variant_builder_add_value(&domainbuilder, g_variant_new_string("domain"));
97 g_variant_builder_add_value(&domainbuilder, g_variant_new_boolean(TRUE));128 g_variant_builder_add_value(&domainbuilder, g_variant_new_boolean(rserver->domain_required));
98 g_variant_builder_add_value(&domainbuilder, g_variant_new_variant(g_variant_new_string("")));129 if (rserver->domain == NULL) {
130 g_variant_builder_add_value(&domainbuilder, g_variant_new_variant(g_variant_new_string("")));
131 } else {
132 g_variant_builder_add_value(&domainbuilder, g_variant_new_variant(g_variant_new_string(rserver->domain)));
133 }
99 g_variant_builder_add_value(&domainbuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));134 g_variant_builder_add_value(&domainbuilder, g_variant_parse(G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL));
100 g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&domainbuilder));135 g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&domainbuilder));
101136
@@ -148,5 +183,37 @@
148 }183 }
149 }184 }
150185
186 if (json_object_has_member(object, JSON_USERNAME)) {
187 JsonNode * node = json_object_get_member(object, JSON_USERNAME);
188 if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) {
189 const gchar * username = json_node_get_string(node);
190 server->username = g_strdup(username);
191 }
192 }
193
194 if (json_object_has_member(object, JSON_PASSWORD)) {
195 JsonNode * node = json_object_get_member(object, JSON_PASSWORD);
196 if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) {
197 const gchar * password = json_node_get_string(node);
198 server->password = g_strdup(password);
199 mlock(server->password, strlen(server->password));
200 }
201 }
202
203 if (json_object_has_member(object, JSON_DOMAIN)) {
204 JsonNode * node = json_object_get_member(object, JSON_DOMAIN);
205 if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) {
206 const gchar * domain = json_node_get_string(node);
207 server->domain = g_strdup(domain);
208 }
209 }
210
211 if (json_object_has_member(object, JSON_DOMAIN_REQ)) {
212 JsonNode * node = json_object_get_member(object, JSON_DOMAIN_REQ);
213 if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_BOOLEAN) {
214 server->domain_required = json_node_get_boolean(node);
215 }
216 }
217
151 return SERVER(server);218 return SERVER(server);
152}219}
153220
=== modified file 'src/rdp-server.h'
--- src/rdp-server.h 2012-08-16 18:44:58 +0000
+++ src/rdp-server.h 2012-09-10 21:37:19 +0000
@@ -41,6 +41,11 @@
4141
42struct _RdpServer {42struct _RdpServer {
43 Server parent;43 Server parent;
44
45 gchar * username;
46 gchar * password;
47 gchar * domain;
48 gboolean domain_required;
44};49};
4550
46GType rdp_server_get_type (void);51GType rdp_server_get_type (void);
4752
=== modified file 'src/server.c'
--- src/server.c 2012-08-29 18:49:21 +0000
+++ src/server.c 2012-09-10 21:37:19 +0000
@@ -31,8 +31,16 @@
31static void server_dispose (GObject *object);31static void server_dispose (GObject *object);
32static void server_finalize (GObject *object);32static void server_finalize (GObject *object);
3333
34/* Signals */
35enum {
36 STATE_CHANGED,
37 LAST_SIGNAL
38};
39
34G_DEFINE_TYPE (Server, server, G_TYPE_OBJECT);40G_DEFINE_TYPE (Server, server, G_TYPE_OBJECT);
3541
42static guint signals[LAST_SIGNAL] = { 0 };
43
36static void44static void
37server_class_init (ServerClass *klass)45server_class_init (ServerClass *klass)
38{46{
@@ -41,6 +49,14 @@
41 object_class->dispose = server_dispose;49 object_class->dispose = server_dispose;
42 object_class->finalize = server_finalize;50 object_class->finalize = server_finalize;
4351
52 signals[STATE_CHANGED] = g_signal_new(SERVER_SIGNAL_STATE_CHANGED,
53 G_TYPE_FROM_CLASS(klass),
54 G_SIGNAL_RUN_LAST,
55 G_STRUCT_OFFSET(ServerClass, state_changed),
56 NULL, NULL,
57 g_cclosure_marshal_VOID__INT,
58 G_TYPE_NONE, 1, G_TYPE_INT, G_TYPE_NONE);
59
44 return;60 return;
45}61}
4662
@@ -50,6 +66,7 @@
50 self->name = NULL;66 self->name = NULL;
51 self->uri = NULL;67 self->uri = NULL;
52 self->last_used = FALSE;68 self->last_used = FALSE;
69 self->state = SERVER_STATE_ALLGOOD;
5370
54 return;71 return;
55}72}
5673
=== modified file 'src/server.h'
--- src/server.h 2012-08-29 18:34:04 +0000
+++ src/server.h 2012-09-10 21:37:19 +0000
@@ -31,8 +31,16 @@
31#define IS_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SERVER_TYPE))31#define IS_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SERVER_TYPE))
32#define SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SERVER_TYPE, ServerClass))32#define SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SERVER_TYPE, ServerClass))
3333
34#define SERVER_SIGNAL_STATE_CHANGED "state-changed"
35
34typedef struct _Server Server;36typedef struct _Server Server;
35typedef struct _ServerClass ServerClass;37typedef struct _ServerClass ServerClass;
38typedef enum _ServerState ServerState;
39
40enum _ServerState {
41 SERVER_STATE_ALLGOOD,
42 SERVER_STATE_UNAVAILABLE
43};
3644
37struct _ServerClass {45struct _ServerClass {
38 GObjectClass parent_class;46 GObjectClass parent_class;
@@ -40,6 +48,9 @@
40 GVariant * (*get_applications) (Server * server);48 GVariant * (*get_applications) (Server * server);
41 GVariant * (*get_domains) (Server * server);49 GVariant * (*get_domains) (Server * server);
42 Server * (*find_uri) (Server * server, const gchar * uri);50 Server * (*find_uri) (Server * server, const gchar * uri);
51
52 /* signals */
53 void (*state_changed) (Server * server, ServerState newstate, gpointer user_data);
43};54};
4455
45struct _Server {56struct _Server {
@@ -48,6 +59,8 @@
48 gchar * name;59 gchar * name;
49 gchar * uri;60 gchar * uri;
50 gboolean last_used;61 gboolean last_used;
62
63 ServerState state;
51};64};
5265
53GType server_get_type (void);66GType server_get_type (void);
5467
=== modified file 'src/uccs-server.c'
--- src/uccs-server.c 2012-08-29 19:09:54 +0000
+++ src/uccs-server.c 2012-09-10 21:37:19 +0000
@@ -90,6 +90,10 @@
90 self->json_stream = NULL;90 self->json_stream = NULL;
91 self->pass_stream = NULL;91 self->pass_stream = NULL;
9292
93 if (self->exec == NULL) {
94 self->parent.state = SERVER_STATE_UNAVAILABLE;
95 }
96
93 return;97 return;
94}98}
9599
@@ -234,6 +238,33 @@
234 return g_variant_builder_end(&propbuilder);238 return g_variant_builder_end(&propbuilder);
235}239}
236240
241/* Set the exec value for the server */
242const gchar *
243uccs_server_set_exec (UccsServer * server, const gchar * exec)
244{
245 g_return_val_if_fail(IS_UCCS_SERVER(server), NULL);
246
247 g_clear_pointer(&server->exec, g_free);
248
249 if (exec != NULL) {
250 server->exec = g_find_program_in_path(exec);
251 }
252
253 ServerState oldstate = server->parent.state;
254 if (server->exec != NULL) {
255 server->parent.state = SERVER_STATE_ALLGOOD;
256 } else {
257 server->parent.state = SERVER_STATE_UNAVAILABLE;
258 }
259
260 if (server->parent.state != oldstate) {
261 g_signal_emit_by_name(server, SERVER_SIGNAL_STATE_CHANGED, server->parent.state);
262 }
263
264 return server->exec;
265}
266
267/* Build a new uccs server from a keyfile and a group in it */
237Server *268Server *
238uccs_server_new_from_keyfile (GKeyFile * keyfile, const gchar * groupname)269uccs_server_new_from_keyfile (GKeyFile * keyfile, const gchar * groupname)
239{270{
@@ -256,9 +287,8 @@
256 }287 }
257288
258 if (g_key_file_has_key(keyfile, groupname, CONFIG_UCCS_EXEC, NULL)) {289 if (g_key_file_has_key(keyfile, groupname, CONFIG_UCCS_EXEC, NULL)) {
259 g_free(server->exec);
260 gchar * key = g_key_file_get_string(keyfile, groupname, CONFIG_UCCS_EXEC, NULL);290 gchar * key = g_key_file_get_string(keyfile, groupname, CONFIG_UCCS_EXEC, NULL);
261 server->exec = g_find_program_in_path(key);291 uccs_server_set_exec(server, key);
262 g_free(key);292 g_free(key);
263 }293 }
264294
@@ -572,18 +602,27 @@
572 return null_server_array();602 return null_server_array();
573 }603 }
574604
575 if (g_list_length(server->subservers) == 0) {
576 return null_server_array();
577 }
578
579 GVariantBuilder array;605 GVariantBuilder array;
580 g_variant_builder_init(&array, G_VARIANT_TYPE_ARRAY);606 g_variant_builder_init(&array, G_VARIANT_TYPE_ARRAY);
581 GList * lserver;607 GList * lserver;
608 gint servercnt = 0;
582 for (lserver = server->subservers; lserver != NULL; lserver = g_list_next(lserver)) {609 for (lserver = server->subservers; lserver != NULL; lserver = g_list_next(lserver)) {
583 Server * serv = SERVER(lserver->data);610 Server * serv = SERVER(lserver->data);
611
612 /* We only want servers that are all good */
613 if (serv->state != SERVER_STATE_ALLGOOD) {
614 continue;
615 }
616
617 servercnt++;
584 g_variant_builder_add_value(&array, server_get_variant(serv));618 g_variant_builder_add_value(&array, server_get_variant(serv));
585 }619 }
586620
621 if (servercnt == 0) {
622 g_variant_builder_clear(&array);
623 return null_server_array();
624 }
625
587 return g_variant_builder_end(&array);626 return g_variant_builder_end(&array);
588}627}
589628
590629
=== modified file 'tests/dbus-interface.c'
--- tests/dbus-interface.c 2012-08-27 15:45:46 +0000
+++ tests/dbus-interface.c 2012-09-10 21:37:19 +0000
@@ -16,28 +16,31 @@
16 const gchar * name;16 const gchar * name;
17 const gchar * uri;17 const gchar * uri;
18 const gchar * type;18 const gchar * type;
19 /* TODO: Add more as we get more working */19 const gchar * username;
20 const gchar * password;
21 const gchar * domain;
20};22};
2123
22slmock_server_t citrix_server_table[] = {24slmock_server_t citrix_server_table[] = {
23 {"Citrix USA", "107.21.17.35", "ica"},25 {"Citrix USA", "107.21.17.35", "ica", "useradmin1", "", "IP-0A00001E"},
24 {"Citrix 2", "107.21.17.35", "ica"},26 {"Citrix 2", "107.21.17.35", "ica", "useradmin2", "", "IP-0A00001E"},
25 {"Citrix 3", "107.21.17.35", "ica"},27 {"Citrix 3", "107.21.17.35", "ica", "useradmin3", "", "IP-0A00001E"},
28 {"Citrix 4", "107.21.17.35", "ica", "useradmin4", "userpass", "IP-0A00001E"},
26 {NULL, NULL, NULL}29 {NULL, NULL, NULL}
27};30};
2831
29slmock_server_t freerdp_server_table[] = {32slmock_server_t freerdp_server_table[] = {
30 {"FreeRDP US", "23.21.151.133", "freerdp"},33 {"FreeRDP US", "23.21.151.133", "freerdp", "Administrator", "", ""},
31 {"FreeRDP Asia", "46.137.222.181", "freerdp"},34 {"FreeRDP Asia", "46.137.222.181", "freerdp", "Administrator", "", ""},
32 {"FreeRDP UK", "46.137.189.194", "freerdp"},35 {"FreeRDP UK", "46.137.189.194", "freerdp", "Administrator", "", ""},
33 {NULL, NULL, NULL}36 {NULL, NULL, NULL}
34};37};
3538
36slmock_server_t big_server_table[] = {39slmock_server_t big_server_table[] = {
37 {"XenServer", "107.21.17.35", "ica"},40 {"XenServer", "107.21.17.35", "ica", "", "", "ASIA"},
38 {"Citrix2", "http://1.2.3.4", "ica"},41 {"Citrix2", "http://1.2.3.4", "ica", "fakeuser", "fakepassword", "DOMAIN1"},
39 {"Accenture", "10.21.17.35", "freerdp"},42 {"Accenture", "10.21.17.35", "freerdp", "fakeuser", "", "EUROPE"},
40 {"Accenture 2", "https://4.5.6.7", "freerdp"},43 {"Accenture 2", "https://4.5.6.7", "freerdp", "", "", "domain2"},
41 {NULL, NULL, NULL}44 {NULL, NULL, NULL}
42};45};
4346
@@ -79,8 +82,47 @@
79 continue;82 continue;
80 }83 }
8184
85 gboolean match_username = FALSE;
86 gboolean match_password = FALSE;
87 gboolean match_domain = FALSE;
88
89 GVariant * props = g_variant_get_child_value(child, 4);
90 int iprop;
91 for (iprop = 0; iprop < g_variant_n_children(props); iprop++) {
92 GVariant * prop = g_variant_get_child_value(props, iprop);
93
94 GVariant * prop_type = g_variant_get_child_value(prop, 0);
95 GVariant * prop_value_wrap = g_variant_get_child_value(prop, 2);
96 GVariant * prop_value = g_variant_get_variant(prop_value_wrap);
97
98 if (g_strcmp0(g_variant_get_string(prop_type, NULL), "username") == 0) {
99 if (g_strcmp0(g_variant_get_string(prop_value, NULL), server->username) == 0) {
100 match_username = TRUE;
101 }
102 } else if (g_strcmp0(g_variant_get_string(prop_type, NULL), "password") == 0) {
103 if (g_strcmp0(g_variant_get_string(prop_value, NULL), server->password) == 0) {
104 match_password = TRUE;
105 }
106 } else if (g_strcmp0(g_variant_get_string(prop_type, NULL), "domain") == 0) {
107 if (g_strcmp0(g_variant_get_string(prop_value, NULL), server->domain) == 0) {
108 match_domain = TRUE;
109 }
110 }
111
112 g_variant_unref(prop_value);
113 g_variant_unref(prop_value_wrap);
114 g_variant_unref(prop_type);
115 g_variant_unref(prop);
116 }
117 g_variant_unref(props);
118
82 g_variant_unref(child);119 g_variant_unref(child);
83 return TRUE;120
121 if (match_username && match_password && match_domain) {
122 return TRUE;
123 } else {
124 continue;
125 }
84 }126 }
85127
86 return FALSE;128 return FALSE;
87129
=== modified file 'tests/server-test.c'
--- tests/server-test.c 2012-08-29 19:44:17 +0000
+++ tests/server-test.c 2012-09-10 21:37:19 +0000
@@ -7,6 +7,48 @@
7#include "uccs-server.h"7#include "uccs-server.h"
88
9static void9static void
10state_signal (Server * server, ServerState newstate, gboolean * signaled)
11{
12 *signaled = TRUE;
13 return;
14}
15
16static void
17test_update_signal (void)
18{
19 GKeyFile * keyfile = g_key_file_new();
20 const gchar * groupname = CONFIG_SERVER_PREFIX " Server Name";
21 g_key_file_set_string(keyfile, groupname, CONFIG_SERVER_NAME, "My Server");
22 g_key_file_set_string(keyfile, groupname, CONFIG_SERVER_URI, "http://my.domain.com");
23
24 Server * server = NULL;
25 server = server_new_from_keyfile(keyfile, groupname);
26 g_assert(server != NULL);
27 g_assert(g_strcmp0(server->name, "My Server") == 0);
28 g_assert(g_strcmp0(server->uri, "http://my.domain.com") == 0);
29
30 UccsServer * userver = UCCS_SERVER(server);
31 g_assert(userver != NULL);
32
33 gboolean signaled = FALSE;
34 g_signal_connect(G_OBJECT(server), SERVER_SIGNAL_STATE_CHANGED, G_CALLBACK(state_signal), &signaled);
35
36 if (server->state == SERVER_STATE_ALLGOOD) {
37 signaled = FALSE;
38 uccs_server_set_exec(userver, "thisshouldnotexist");
39 g_assert(signaled);
40 g_assert(server->state == SERVER_STATE_UNAVAILABLE);
41 }
42
43 signaled = FALSE;
44 uccs_server_set_exec(userver, "ls");
45 g_assert(signaled);
46 g_assert(server->state == SERVER_STATE_ALLGOOD);
47
48 return;
49}
50
51static void
10test_uccs_domains (void)52test_uccs_domains (void)
11{53{
12 GKeyFile * keyfile = g_key_file_new();54 GKeyFile * keyfile = g_key_file_new();
@@ -199,6 +241,7 @@
199241
200 g_test_add_func ("/server/uccs/exec", test_uccs_exec);242 g_test_add_func ("/server/uccs/exec", test_uccs_exec);
201 g_test_add_func ("/server/uccs/domains", test_uccs_domains);243 g_test_add_func ("/server/uccs/domains", test_uccs_domains);
244 g_test_add_func ("/server/uccs/signal", test_update_signal);
202245
203 return;246 return;
204}247}
205248
=== modified file 'tests/slmock'
--- tests/slmock 2012-08-21 15:46:54 +0000
+++ tests/slmock 2012-09-10 21:37:19 +0000
@@ -93,7 +93,7 @@
93 ts3 = TerminalServer("107.21.17.35", "Citrix 3", "ICA", True,93 ts3 = TerminalServer("107.21.17.35", "Citrix 3", "ICA", True,
94 "useradmin3")94 "useradmin3")
95 ts4 = TerminalServer("107.21.17.35", "Citrix 4", "ICA", True,95 ts4 = TerminalServer("107.21.17.35", "Citrix 4", "ICA", True,
96 "useradmin4")96 "useradmin4", "userpass")
97 ts1.add_domain("IP-0A00001E")97 ts1.add_domain("IP-0A00001E")
98 ts2.add_domain("IP-0A00001E")98 ts2.add_domain("IP-0A00001E")
99 ts3.add_domain("IP-0A00001E")99 ts3.add_domain("IP-0A00001E")

Subscribers

People subscribed via source and target branches

to all changes: