Merge lp:~ted/remote-login-service/signal-ready into lp:~ted/remote-login-service/oo-cleanup
- signal-ready
- Merge into 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 |
Related bugs: |
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
Description of the change
To post a comment you must log in.
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
1 | === modified file 'src/citrix-server.c' | |||
2 | --- src/citrix-server.c 2012-08-29 19:09:54 +0000 | |||
3 | +++ src/citrix-server.c 2012-09-10 21:37:19 +0000 | |||
4 | @@ -20,6 +20,8 @@ | |||
5 | 20 | #include "config.h" | 20 | #include "config.h" |
6 | 21 | #endif | 21 | #endif |
7 | 22 | 22 | ||
8 | 23 | #include <string.h> | ||
9 | 24 | |||
10 | 23 | #include "citrix-server.h" | 25 | #include "citrix-server.h" |
11 | 24 | #include "defines.h" | 26 | #include "defines.h" |
12 | 25 | 27 | ||
13 | @@ -49,6 +51,10 @@ | |||
14 | 49 | static void | 51 | static void |
15 | 50 | citrix_server_init (CitrixServer *self) | 52 | citrix_server_init (CitrixServer *self) |
16 | 51 | { | 53 | { |
17 | 54 | self->username = NULL; | ||
18 | 55 | self->password = NULL; | ||
19 | 56 | self->domain = NULL; | ||
20 | 57 | self->domain_required = FALSE; | ||
21 | 52 | 58 | ||
22 | 53 | return; | 59 | return; |
23 | 54 | } | 60 | } |
24 | @@ -61,9 +67,24 @@ | |||
25 | 61 | return; | 67 | return; |
26 | 62 | } | 68 | } |
27 | 63 | 69 | ||
28 | 70 | /* Unlocks the memory before freeing */ | ||
29 | 71 | static void | ||
30 | 72 | password_clear (gpointer data) | ||
31 | 73 | { | ||
32 | 74 | char * pass = (char *)data; | ||
33 | 75 | munlock(pass, strlen(pass)); | ||
34 | 76 | g_free(pass); | ||
35 | 77 | return; | ||
36 | 78 | } | ||
37 | 79 | |||
38 | 64 | static void | 80 | static void |
39 | 65 | citrix_server_finalize (GObject *object) | 81 | citrix_server_finalize (GObject *object) |
40 | 66 | { | 82 | { |
41 | 83 | CitrixServer * server = CITRIX_SERVER(object); | ||
42 | 84 | |||
43 | 85 | g_clear_pointer(&server->username, g_free); | ||
44 | 86 | g_clear_pointer(&server->password, password_clear); | ||
45 | 87 | g_clear_pointer(&server->domain, g_free); | ||
46 | 67 | 88 | ||
47 | 68 | G_OBJECT_CLASS (citrix_server_parent_class)->finalize (object); | 89 | G_OBJECT_CLASS (citrix_server_parent_class)->finalize (object); |
48 | 69 | return; | 90 | return; |
49 | @@ -72,6 +93,8 @@ | |||
50 | 72 | static GVariant * | 93 | static GVariant * |
51 | 73 | get_properties (Server * server) | 94 | get_properties (Server * server) |
52 | 74 | { | 95 | { |
53 | 96 | CitrixServer * cserver = CITRIX_SERVER(server); | ||
54 | 97 | |||
55 | 75 | GVariantBuilder propbuilder; | 98 | GVariantBuilder propbuilder; |
56 | 76 | g_variant_builder_init(&propbuilder, G_VARIANT_TYPE_ARRAY); | 99 | g_variant_builder_init(&propbuilder, G_VARIANT_TYPE_ARRAY); |
57 | 77 | 100 | ||
58 | @@ -79,7 +102,11 @@ | |||
59 | 79 | g_variant_builder_init(&namebuilder, G_VARIANT_TYPE_TUPLE); | 102 | g_variant_builder_init(&namebuilder, G_VARIANT_TYPE_TUPLE); |
60 | 80 | g_variant_builder_add_value(&namebuilder, g_variant_new_string("username")); | 103 | g_variant_builder_add_value(&namebuilder, g_variant_new_string("username")); |
61 | 81 | g_variant_builder_add_value(&namebuilder, g_variant_new_boolean(TRUE)); | 104 | g_variant_builder_add_value(&namebuilder, g_variant_new_boolean(TRUE)); |
63 | 82 | g_variant_builder_add_value(&namebuilder, g_variant_new_variant(g_variant_new_string(""))); | 105 | if (cserver->username == NULL) { |
64 | 106 | g_variant_builder_add_value(&namebuilder, g_variant_new_variant(g_variant_new_string(""))); | ||
65 | 107 | } else { | ||
66 | 108 | g_variant_builder_add_value(&namebuilder, g_variant_new_variant(g_variant_new_string(cserver->username))); | ||
67 | 109 | } | ||
68 | 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)); |
69 | 84 | g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&namebuilder)); | 111 | g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&namebuilder)); |
70 | 85 | 112 | ||
71 | @@ -87,15 +114,23 @@ | |||
72 | 87 | g_variant_builder_init(&passbuilder, G_VARIANT_TYPE_TUPLE); | 114 | g_variant_builder_init(&passbuilder, G_VARIANT_TYPE_TUPLE); |
73 | 88 | g_variant_builder_add_value(&passbuilder, g_variant_new_string("password")); | 115 | g_variant_builder_add_value(&passbuilder, g_variant_new_string("password")); |
74 | 89 | g_variant_builder_add_value(&passbuilder, g_variant_new_boolean(TRUE)); | 116 | g_variant_builder_add_value(&passbuilder, g_variant_new_boolean(TRUE)); |
76 | 90 | g_variant_builder_add_value(&passbuilder, g_variant_new_variant(g_variant_new_string(""))); | 117 | if (cserver->password == NULL) { |
77 | 118 | g_variant_builder_add_value(&passbuilder, g_variant_new_variant(g_variant_new_string(""))); | ||
78 | 119 | } else { | ||
79 | 120 | g_variant_builder_add_value(&passbuilder, g_variant_new_variant(g_variant_new_string(cserver->password))); | ||
80 | 121 | } | ||
81 | 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)); |
82 | 92 | g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&passbuilder)); | 123 | g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&passbuilder)); |
83 | 93 | 124 | ||
84 | 94 | GVariantBuilder domainbuilder; | 125 | GVariantBuilder domainbuilder; |
85 | 95 | g_variant_builder_init(&domainbuilder, G_VARIANT_TYPE_TUPLE); | 126 | g_variant_builder_init(&domainbuilder, G_VARIANT_TYPE_TUPLE); |
86 | 96 | g_variant_builder_add_value(&domainbuilder, g_variant_new_string("domain")); | 127 | g_variant_builder_add_value(&domainbuilder, g_variant_new_string("domain")); |
89 | 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)); |
90 | 98 | g_variant_builder_add_value(&domainbuilder, g_variant_new_variant(g_variant_new_string(""))); | 129 | if (cserver->domain == NULL) { |
91 | 130 | g_variant_builder_add_value(&domainbuilder, g_variant_new_variant(g_variant_new_string(""))); | ||
92 | 131 | } else { | ||
93 | 132 | g_variant_builder_add_value(&domainbuilder, g_variant_new_variant(g_variant_new_string(cserver->domain))); | ||
94 | 133 | } | ||
95 | 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)); |
96 | 100 | g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&domainbuilder)); | 135 | g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&domainbuilder)); |
97 | 101 | 136 | ||
98 | @@ -148,5 +183,37 @@ | |||
99 | 148 | } | 183 | } |
100 | 149 | } | 184 | } |
101 | 150 | 185 | ||
102 | 186 | if (json_object_has_member(object, JSON_USERNAME)) { | ||
103 | 187 | JsonNode * node = json_object_get_member(object, JSON_USERNAME); | ||
104 | 188 | if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) { | ||
105 | 189 | const gchar * username = json_node_get_string(node); | ||
106 | 190 | server->username = g_strdup(username); | ||
107 | 191 | } | ||
108 | 192 | } | ||
109 | 193 | |||
110 | 194 | if (json_object_has_member(object, JSON_PASSWORD)) { | ||
111 | 195 | JsonNode * node = json_object_get_member(object, JSON_PASSWORD); | ||
112 | 196 | if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) { | ||
113 | 197 | const gchar * password = json_node_get_string(node); | ||
114 | 198 | server->password = g_strdup(password); | ||
115 | 199 | mlock(server->password, strlen(server->password)); | ||
116 | 200 | } | ||
117 | 201 | } | ||
118 | 202 | |||
119 | 203 | if (json_object_has_member(object, JSON_DOMAIN)) { | ||
120 | 204 | JsonNode * node = json_object_get_member(object, JSON_DOMAIN); | ||
121 | 205 | if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) { | ||
122 | 206 | const gchar * domain = json_node_get_string(node); | ||
123 | 207 | server->domain = g_strdup(domain); | ||
124 | 208 | } | ||
125 | 209 | } | ||
126 | 210 | |||
127 | 211 | if (json_object_has_member(object, JSON_DOMAIN_REQ)) { | ||
128 | 212 | JsonNode * node = json_object_get_member(object, JSON_DOMAIN_REQ); | ||
129 | 213 | if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_BOOLEAN) { | ||
130 | 214 | server->domain_required = json_node_get_boolean(node); | ||
131 | 215 | } | ||
132 | 216 | } | ||
133 | 217 | |||
134 | 151 | return SERVER(server); | 218 | return SERVER(server); |
135 | 152 | } | 219 | } |
136 | 153 | 220 | ||
137 | === modified file 'src/citrix-server.h' | |||
138 | --- src/citrix-server.h 2012-08-16 18:44:58 +0000 | |||
139 | +++ src/citrix-server.h 2012-09-10 21:37:19 +0000 | |||
140 | @@ -41,6 +41,11 @@ | |||
141 | 41 | 41 | ||
142 | 42 | struct _CitrixServer { | 42 | struct _CitrixServer { |
143 | 43 | Server parent; | 43 | Server parent; |
144 | 44 | |||
145 | 45 | gchar * username; | ||
146 | 46 | gchar * password; | ||
147 | 47 | gchar * domain; | ||
148 | 48 | gboolean domain_required; | ||
149 | 44 | }; | 49 | }; |
150 | 45 | 50 | ||
151 | 46 | GType citrix_server_get_type (void); | 51 | GType citrix_server_get_type (void); |
152 | 47 | 52 | ||
153 | === modified file 'src/defines.h' | |||
154 | --- src/defines.h 2012-08-29 19:09:54 +0000 | |||
155 | +++ src/defines.h 2012-09-10 21:37:19 +0000 | |||
156 | @@ -37,5 +37,7 @@ | |||
157 | 37 | #define JSON_URI "URL" | 37 | #define JSON_URI "URL" |
158 | 38 | #define JSON_USERNAME "Username" | 38 | #define JSON_USERNAME "Username" |
159 | 39 | #define JSON_PASSWORD "Password" | 39 | #define JSON_PASSWORD "Password" |
160 | 40 | #define JSON_DOMAIN_REQ "DomainRequired" | ||
161 | 41 | #define JSON_DOMAIN "WindowsDomain" | ||
162 | 40 | 42 | ||
163 | 41 | #endif /* __DEFINES_H__ */ | 43 | #endif /* __DEFINES_H__ */ |
164 | 42 | 44 | ||
165 | === modified file 'src/main.c' | |||
166 | --- src/main.c 2012-08-29 19:09:44 +0000 | |||
167 | +++ src/main.c 2012-09-10 21:37:19 +0000 | |||
168 | @@ -26,6 +26,8 @@ | |||
169 | 26 | #include "citrix-server.h" | 26 | #include "citrix-server.h" |
170 | 27 | #include "uccs-server.h" | 27 | #include "uccs-server.h" |
171 | 28 | 28 | ||
172 | 29 | gint server_list_to_array (GVariantBuilder * builder, GList * items); | ||
173 | 30 | |||
174 | 29 | enum { | 31 | enum { |
175 | 30 | ERROR_SERVER_URI, | 32 | ERROR_SERVER_URI, |
176 | 31 | ERROR_LOGIN | 33 | ERROR_LOGIN |
177 | @@ -44,8 +46,31 @@ | |||
178 | 44 | return value; | 46 | return value; |
179 | 45 | } | 47 | } |
180 | 46 | 48 | ||
183 | 47 | static void | 49 | /* When one of the state changes on the server emit that so that everone knows there |
184 | 48 | find_config_file (GKeyFile * parsed, const gchar * cmnd_line) | 50 | might be a new server available. */ |
185 | 51 | static void | ||
186 | 52 | server_status_updated (Server * server, ServerState newstate, RemoteLogin * rl) | ||
187 | 53 | { | ||
188 | 54 | GVariant * array = NULL; | ||
189 | 55 | |||
190 | 56 | GVariantBuilder builder; | ||
191 | 57 | g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY); | ||
192 | 58 | |||
193 | 59 | if (server_list_to_array(&builder, config_file_servers) > 0) { | ||
194 | 60 | array = g_variant_builder_end(&builder); | ||
195 | 61 | } else { | ||
196 | 62 | g_variant_builder_clear(&builder); | ||
197 | 63 | array = g_variant_new_array(G_VARIANT_TYPE("(sssba(sbva{sv})a(si))"), NULL, 0); | ||
198 | 64 | } | ||
199 | 65 | |||
200 | 66 | remote_login_emit_servers_updated(rl, array); | ||
201 | 67 | return; | ||
202 | 68 | } | ||
203 | 69 | |||
204 | 70 | /* Looks for the config file and does some basic parsing to pull out the UCCS servers | ||
205 | 71 | that are configured in it */ | ||
206 | 72 | static void | ||
207 | 73 | find_config_file (GKeyFile * parsed, const gchar * cmnd_line, RemoteLogin * rl) | ||
208 | 49 | { | 74 | { |
209 | 50 | GError * error = NULL; | 75 | GError * error = NULL; |
210 | 51 | const gchar * file = DEFAULT_CONFIG_FILE; | 76 | const gchar * file = DEFAULT_CONFIG_FILE; |
211 | @@ -82,25 +107,37 @@ | |||
212 | 82 | } | 107 | } |
213 | 83 | 108 | ||
214 | 84 | config_file_servers = g_list_append(config_file_servers, server); | 109 | config_file_servers = g_list_append(config_file_servers, server); |
215 | 110 | g_signal_connect(server, SERVER_SIGNAL_STATE_CHANGED, G_CALLBACK(server_status_updated), rl); | ||
216 | 85 | } | 111 | } |
217 | 86 | 112 | ||
218 | 87 | g_strfreev(grouplist); | 113 | g_strfreev(grouplist); |
219 | 88 | } | 114 | } |
220 | 89 | 115 | ||
221 | 116 | /* Signal the list of servers so that we're sure everyone's got them. This is to | ||
222 | 117 | solve a possible race where someone could ask while we're configuring these. */ | ||
223 | 118 | server_status_updated(NULL, SERVER_STATE_ALLGOOD, rl); | ||
224 | 90 | return; | 119 | return; |
225 | 91 | } | 120 | } |
226 | 92 | 121 | ||
228 | 93 | void | 122 | gint |
229 | 94 | server_list_to_array (GVariantBuilder * builder, GList * items) | 123 | server_list_to_array (GVariantBuilder * builder, GList * items) |
230 | 95 | { | 124 | { |
231 | 125 | gint servercnt = 0; | ||
232 | 96 | GList * head = NULL; | 126 | GList * head = NULL; |
233 | 97 | for (head = items; head != NULL; head = g_list_next(head)) { | 127 | for (head = items; head != NULL; head = g_list_next(head)) { |
234 | 98 | Server * server = SERVER(head->data); | 128 | Server * server = SERVER(head->data); |
235 | 129 | |||
236 | 130 | /* We only want servers that are all good */ | ||
237 | 131 | if (server->state != SERVER_STATE_ALLGOOD) { | ||
238 | 132 | continue; | ||
239 | 133 | } | ||
240 | 134 | |||
241 | 135 | servercnt++; | ||
242 | 99 | GVariant * variant = server_get_variant(server); | 136 | GVariant * variant = server_get_variant(server); |
243 | 100 | g_variant_builder_add_value(builder, variant); | 137 | g_variant_builder_add_value(builder, variant); |
244 | 101 | } | 138 | } |
245 | 102 | 139 | ||
247 | 103 | return; | 140 | return servercnt; |
248 | 104 | } | 141 | } |
249 | 105 | 142 | ||
250 | 106 | static gboolean | 143 | static gboolean |
251 | @@ -108,14 +145,13 @@ | |||
252 | 108 | { | 145 | { |
253 | 109 | GVariant * array = NULL; | 146 | GVariant * array = NULL; |
254 | 110 | 147 | ||
261 | 111 | if (g_list_length(config_file_servers) > 0) { | 148 | GVariantBuilder builder; |
262 | 112 | GVariantBuilder builder; | 149 | g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY); |
263 | 113 | g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY); | 150 | |
264 | 114 | 151 | if (server_list_to_array(&builder, config_file_servers) > 0) { | |
259 | 115 | server_list_to_array(&builder, config_file_servers); | ||
260 | 116 | |||
265 | 117 | array = g_variant_builder_end(&builder); | 152 | array = g_variant_builder_end(&builder); |
266 | 118 | } else { | 153 | } else { |
267 | 154 | g_variant_builder_clear(&builder); | ||
268 | 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); |
269 | 120 | } | 156 | } |
270 | 121 | 157 | ||
271 | @@ -279,7 +315,7 @@ | |||
272 | 279 | { | 315 | { |
273 | 280 | GMainLoop * mainloop = (GMainLoop *)user_data; | 316 | GMainLoop * mainloop = (GMainLoop *)user_data; |
274 | 281 | 317 | ||
276 | 282 | g_error("Unable to get name '%s'", name); | 318 | g_warning("Unable to get name '%s'. Exiting.", name); |
277 | 283 | g_main_loop_quit(mainloop); | 319 | g_main_loop_quit(mainloop); |
278 | 284 | 320 | ||
279 | 285 | return; | 321 | return; |
280 | @@ -313,9 +349,6 @@ | |||
281 | 313 | return 1; | 349 | return 1; |
282 | 314 | } | 350 | } |
283 | 315 | 351 | ||
284 | 316 | /* Parse config file */ | ||
285 | 317 | find_config_file(config, cmnd_line_config); | ||
286 | 318 | |||
287 | 319 | /* Start up D' Bus */ | 352 | /* Start up D' Bus */ |
288 | 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); |
289 | 321 | if (error != NULL) { | 354 | if (error != NULL) { |
290 | @@ -324,7 +357,9 @@ | |||
291 | 324 | return -1; | 357 | return -1; |
292 | 325 | } | 358 | } |
293 | 326 | 359 | ||
294 | 360 | /* Build Dbus Interface */ | ||
295 | 327 | RemoteLogin * skel = remote_login_skeleton_new(); | 361 | RemoteLogin * skel = remote_login_skeleton_new(); |
296 | 362 | /* Export it */ | ||
297 | 328 | g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(skel), | 363 | g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(skel), |
298 | 329 | session_bus, | 364 | session_bus, |
299 | 330 | "/com/canonical/RemoteLogin", | 365 | "/com/canonical/RemoteLogin", |
300 | @@ -341,6 +376,9 @@ | |||
301 | 341 | mainloop, | 376 | mainloop, |
302 | 342 | NULL); /* mainloop free */ | 377 | NULL); /* mainloop free */ |
303 | 343 | 378 | ||
304 | 379 | /* Parse config file */ | ||
305 | 380 | find_config_file(config, cmnd_line_config, skel); | ||
306 | 381 | |||
307 | 344 | /* Loop forever */ | 382 | /* Loop forever */ |
308 | 345 | g_main_loop_run(mainloop); | 383 | g_main_loop_run(mainloop); |
309 | 346 | 384 | ||
310 | 347 | 385 | ||
311 | === modified file 'src/rdp-server.c' | |||
312 | --- src/rdp-server.c 2012-08-29 19:09:54 +0000 | |||
313 | +++ src/rdp-server.c 2012-09-10 21:37:19 +0000 | |||
314 | @@ -20,6 +20,8 @@ | |||
315 | 20 | #include "config.h" | 20 | #include "config.h" |
316 | 21 | #endif | 21 | #endif |
317 | 22 | 22 | ||
318 | 23 | #include <string.h> | ||
319 | 24 | |||
320 | 23 | #include "rdp-server.h" | 25 | #include "rdp-server.h" |
321 | 24 | #include "defines.h" | 26 | #include "defines.h" |
322 | 25 | 27 | ||
323 | @@ -49,6 +51,10 @@ | |||
324 | 49 | static void | 51 | static void |
325 | 50 | rdp_server_init (RdpServer *self) | 52 | rdp_server_init (RdpServer *self) |
326 | 51 | { | 53 | { |
327 | 54 | self->username = NULL; | ||
328 | 55 | self->password = NULL; | ||
329 | 56 | self->domain = NULL; | ||
330 | 57 | self->domain_required = FALSE; | ||
331 | 52 | 58 | ||
332 | 53 | return; | 59 | return; |
333 | 54 | } | 60 | } |
334 | @@ -61,9 +67,24 @@ | |||
335 | 61 | return; | 67 | return; |
336 | 62 | } | 68 | } |
337 | 63 | 69 | ||
338 | 70 | /* Unlocks the memory before freeing */ | ||
339 | 71 | static void | ||
340 | 72 | password_clear (gpointer data) | ||
341 | 73 | { | ||
342 | 74 | char * pass = (char *)data; | ||
343 | 75 | munlock(pass, strlen(pass)); | ||
344 | 76 | g_free(pass); | ||
345 | 77 | return; | ||
346 | 78 | } | ||
347 | 79 | |||
348 | 64 | static void | 80 | static void |
349 | 65 | rdp_server_finalize (GObject *object) | 81 | rdp_server_finalize (GObject *object) |
350 | 66 | { | 82 | { |
351 | 83 | RdpServer * server = RDP_SERVER(object); | ||
352 | 84 | |||
353 | 85 | g_clear_pointer(&server->username, g_free); | ||
354 | 86 | g_clear_pointer(&server->password, password_clear); | ||
355 | 87 | g_clear_pointer(&server->domain, g_free); | ||
356 | 67 | 88 | ||
357 | 68 | G_OBJECT_CLASS (rdp_server_parent_class)->finalize (object); | 89 | G_OBJECT_CLASS (rdp_server_parent_class)->finalize (object); |
358 | 69 | return; | 90 | return; |
359 | @@ -72,6 +93,8 @@ | |||
360 | 72 | static GVariant * | 93 | static GVariant * |
361 | 73 | get_properties (Server * server) | 94 | get_properties (Server * server) |
362 | 74 | { | 95 | { |
363 | 96 | RdpServer * rserver = RDP_SERVER(server); | ||
364 | 97 | |||
365 | 75 | GVariantBuilder propbuilder; | 98 | GVariantBuilder propbuilder; |
366 | 76 | g_variant_builder_init(&propbuilder, G_VARIANT_TYPE_ARRAY); | 99 | g_variant_builder_init(&propbuilder, G_VARIANT_TYPE_ARRAY); |
367 | 77 | 100 | ||
368 | @@ -79,7 +102,11 @@ | |||
369 | 79 | g_variant_builder_init(&namebuilder, G_VARIANT_TYPE_TUPLE); | 102 | g_variant_builder_init(&namebuilder, G_VARIANT_TYPE_TUPLE); |
370 | 80 | g_variant_builder_add_value(&namebuilder, g_variant_new_string("username")); | 103 | g_variant_builder_add_value(&namebuilder, g_variant_new_string("username")); |
371 | 81 | g_variant_builder_add_value(&namebuilder, g_variant_new_boolean(TRUE)); | 104 | g_variant_builder_add_value(&namebuilder, g_variant_new_boolean(TRUE)); |
373 | 82 | g_variant_builder_add_value(&namebuilder, g_variant_new_variant(g_variant_new_string(""))); | 105 | if (rserver->username == NULL) { |
374 | 106 | g_variant_builder_add_value(&namebuilder, g_variant_new_variant(g_variant_new_string(""))); | ||
375 | 107 | } else { | ||
376 | 108 | g_variant_builder_add_value(&namebuilder, g_variant_new_variant(g_variant_new_string(rserver->username))); | ||
377 | 109 | } | ||
378 | 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)); |
379 | 84 | g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&namebuilder)); | 111 | g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&namebuilder)); |
380 | 85 | 112 | ||
381 | @@ -87,15 +114,23 @@ | |||
382 | 87 | g_variant_builder_init(&passbuilder, G_VARIANT_TYPE_TUPLE); | 114 | g_variant_builder_init(&passbuilder, G_VARIANT_TYPE_TUPLE); |
383 | 88 | g_variant_builder_add_value(&passbuilder, g_variant_new_string("password")); | 115 | g_variant_builder_add_value(&passbuilder, g_variant_new_string("password")); |
384 | 89 | g_variant_builder_add_value(&passbuilder, g_variant_new_boolean(TRUE)); | 116 | g_variant_builder_add_value(&passbuilder, g_variant_new_boolean(TRUE)); |
386 | 90 | g_variant_builder_add_value(&passbuilder, g_variant_new_variant(g_variant_new_string(""))); | 117 | if (rserver->password == NULL) { |
387 | 118 | g_variant_builder_add_value(&passbuilder, g_variant_new_variant(g_variant_new_string(""))); | ||
388 | 119 | } else { | ||
389 | 120 | g_variant_builder_add_value(&passbuilder, g_variant_new_variant(g_variant_new_string(rserver->password))); | ||
390 | 121 | } | ||
391 | 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)); |
392 | 92 | g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&passbuilder)); | 123 | g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&passbuilder)); |
393 | 93 | 124 | ||
394 | 94 | GVariantBuilder domainbuilder; | 125 | GVariantBuilder domainbuilder; |
395 | 95 | g_variant_builder_init(&domainbuilder, G_VARIANT_TYPE_TUPLE); | 126 | g_variant_builder_init(&domainbuilder, G_VARIANT_TYPE_TUPLE); |
396 | 96 | g_variant_builder_add_value(&domainbuilder, g_variant_new_string("domain")); | 127 | g_variant_builder_add_value(&domainbuilder, g_variant_new_string("domain")); |
399 | 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)); |
400 | 98 | g_variant_builder_add_value(&domainbuilder, g_variant_new_variant(g_variant_new_string(""))); | 129 | if (rserver->domain == NULL) { |
401 | 130 | g_variant_builder_add_value(&domainbuilder, g_variant_new_variant(g_variant_new_string(""))); | ||
402 | 131 | } else { | ||
403 | 132 | g_variant_builder_add_value(&domainbuilder, g_variant_new_variant(g_variant_new_string(rserver->domain))); | ||
404 | 133 | } | ||
405 | 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)); |
406 | 100 | g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&domainbuilder)); | 135 | g_variant_builder_add_value(&propbuilder, g_variant_builder_end(&domainbuilder)); |
407 | 101 | 136 | ||
408 | @@ -148,5 +183,37 @@ | |||
409 | 148 | } | 183 | } |
410 | 149 | } | 184 | } |
411 | 150 | 185 | ||
412 | 186 | if (json_object_has_member(object, JSON_USERNAME)) { | ||
413 | 187 | JsonNode * node = json_object_get_member(object, JSON_USERNAME); | ||
414 | 188 | if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) { | ||
415 | 189 | const gchar * username = json_node_get_string(node); | ||
416 | 190 | server->username = g_strdup(username); | ||
417 | 191 | } | ||
418 | 192 | } | ||
419 | 193 | |||
420 | 194 | if (json_object_has_member(object, JSON_PASSWORD)) { | ||
421 | 195 | JsonNode * node = json_object_get_member(object, JSON_PASSWORD); | ||
422 | 196 | if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) { | ||
423 | 197 | const gchar * password = json_node_get_string(node); | ||
424 | 198 | server->password = g_strdup(password); | ||
425 | 199 | mlock(server->password, strlen(server->password)); | ||
426 | 200 | } | ||
427 | 201 | } | ||
428 | 202 | |||
429 | 203 | if (json_object_has_member(object, JSON_DOMAIN)) { | ||
430 | 204 | JsonNode * node = json_object_get_member(object, JSON_DOMAIN); | ||
431 | 205 | if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_STRING) { | ||
432 | 206 | const gchar * domain = json_node_get_string(node); | ||
433 | 207 | server->domain = g_strdup(domain); | ||
434 | 208 | } | ||
435 | 209 | } | ||
436 | 210 | |||
437 | 211 | if (json_object_has_member(object, JSON_DOMAIN_REQ)) { | ||
438 | 212 | JsonNode * node = json_object_get_member(object, JSON_DOMAIN_REQ); | ||
439 | 213 | if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE && json_node_get_value_type(node) == G_TYPE_BOOLEAN) { | ||
440 | 214 | server->domain_required = json_node_get_boolean(node); | ||
441 | 215 | } | ||
442 | 216 | } | ||
443 | 217 | |||
444 | 151 | return SERVER(server); | 218 | return SERVER(server); |
445 | 152 | } | 219 | } |
446 | 153 | 220 | ||
447 | === modified file 'src/rdp-server.h' | |||
448 | --- src/rdp-server.h 2012-08-16 18:44:58 +0000 | |||
449 | +++ src/rdp-server.h 2012-09-10 21:37:19 +0000 | |||
450 | @@ -41,6 +41,11 @@ | |||
451 | 41 | 41 | ||
452 | 42 | struct _RdpServer { | 42 | struct _RdpServer { |
453 | 43 | Server parent; | 43 | Server parent; |
454 | 44 | |||
455 | 45 | gchar * username; | ||
456 | 46 | gchar * password; | ||
457 | 47 | gchar * domain; | ||
458 | 48 | gboolean domain_required; | ||
459 | 44 | }; | 49 | }; |
460 | 45 | 50 | ||
461 | 46 | GType rdp_server_get_type (void); | 51 | GType rdp_server_get_type (void); |
462 | 47 | 52 | ||
463 | === modified file 'src/server.c' | |||
464 | --- src/server.c 2012-08-29 18:49:21 +0000 | |||
465 | +++ src/server.c 2012-09-10 21:37:19 +0000 | |||
466 | @@ -31,8 +31,16 @@ | |||
467 | 31 | static void server_dispose (GObject *object); | 31 | static void server_dispose (GObject *object); |
468 | 32 | static void server_finalize (GObject *object); | 32 | static void server_finalize (GObject *object); |
469 | 33 | 33 | ||
470 | 34 | /* Signals */ | ||
471 | 35 | enum { | ||
472 | 36 | STATE_CHANGED, | ||
473 | 37 | LAST_SIGNAL | ||
474 | 38 | }; | ||
475 | 39 | |||
476 | 34 | G_DEFINE_TYPE (Server, server, G_TYPE_OBJECT); | 40 | G_DEFINE_TYPE (Server, server, G_TYPE_OBJECT); |
477 | 35 | 41 | ||
478 | 42 | static guint signals[LAST_SIGNAL] = { 0 }; | ||
479 | 43 | |||
480 | 36 | static void | 44 | static void |
481 | 37 | server_class_init (ServerClass *klass) | 45 | server_class_init (ServerClass *klass) |
482 | 38 | { | 46 | { |
483 | @@ -41,6 +49,14 @@ | |||
484 | 41 | object_class->dispose = server_dispose; | 49 | object_class->dispose = server_dispose; |
485 | 42 | object_class->finalize = server_finalize; | 50 | object_class->finalize = server_finalize; |
486 | 43 | 51 | ||
487 | 52 | signals[STATE_CHANGED] = g_signal_new(SERVER_SIGNAL_STATE_CHANGED, | ||
488 | 53 | G_TYPE_FROM_CLASS(klass), | ||
489 | 54 | G_SIGNAL_RUN_LAST, | ||
490 | 55 | G_STRUCT_OFFSET(ServerClass, state_changed), | ||
491 | 56 | NULL, NULL, | ||
492 | 57 | g_cclosure_marshal_VOID__INT, | ||
493 | 58 | G_TYPE_NONE, 1, G_TYPE_INT, G_TYPE_NONE); | ||
494 | 59 | |||
495 | 44 | return; | 60 | return; |
496 | 45 | } | 61 | } |
497 | 46 | 62 | ||
498 | @@ -50,6 +66,7 @@ | |||
499 | 50 | self->name = NULL; | 66 | self->name = NULL; |
500 | 51 | self->uri = NULL; | 67 | self->uri = NULL; |
501 | 52 | self->last_used = FALSE; | 68 | self->last_used = FALSE; |
502 | 69 | self->state = SERVER_STATE_ALLGOOD; | ||
503 | 53 | 70 | ||
504 | 54 | return; | 71 | return; |
505 | 55 | } | 72 | } |
506 | 56 | 73 | ||
507 | === modified file 'src/server.h' | |||
508 | --- src/server.h 2012-08-29 18:34:04 +0000 | |||
509 | +++ src/server.h 2012-09-10 21:37:19 +0000 | |||
510 | @@ -31,8 +31,16 @@ | |||
511 | 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)) |
512 | 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)) |
513 | 33 | 33 | ||
514 | 34 | #define SERVER_SIGNAL_STATE_CHANGED "state-changed" | ||
515 | 35 | |||
516 | 34 | typedef struct _Server Server; | 36 | typedef struct _Server Server; |
517 | 35 | typedef struct _ServerClass ServerClass; | 37 | typedef struct _ServerClass ServerClass; |
518 | 38 | typedef enum _ServerState ServerState; | ||
519 | 39 | |||
520 | 40 | enum _ServerState { | ||
521 | 41 | SERVER_STATE_ALLGOOD, | ||
522 | 42 | SERVER_STATE_UNAVAILABLE | ||
523 | 43 | }; | ||
524 | 36 | 44 | ||
525 | 37 | struct _ServerClass { | 45 | struct _ServerClass { |
526 | 38 | GObjectClass parent_class; | 46 | GObjectClass parent_class; |
527 | @@ -40,6 +48,9 @@ | |||
528 | 40 | GVariant * (*get_applications) (Server * server); | 48 | GVariant * (*get_applications) (Server * server); |
529 | 41 | GVariant * (*get_domains) (Server * server); | 49 | GVariant * (*get_domains) (Server * server); |
530 | 42 | Server * (*find_uri) (Server * server, const gchar * uri); | 50 | Server * (*find_uri) (Server * server, const gchar * uri); |
531 | 51 | |||
532 | 52 | /* signals */ | ||
533 | 53 | void (*state_changed) (Server * server, ServerState newstate, gpointer user_data); | ||
534 | 43 | }; | 54 | }; |
535 | 44 | 55 | ||
536 | 45 | struct _Server { | 56 | struct _Server { |
537 | @@ -48,6 +59,8 @@ | |||
538 | 48 | gchar * name; | 59 | gchar * name; |
539 | 49 | gchar * uri; | 60 | gchar * uri; |
540 | 50 | gboolean last_used; | 61 | gboolean last_used; |
541 | 62 | |||
542 | 63 | ServerState state; | ||
543 | 51 | }; | 64 | }; |
544 | 52 | 65 | ||
545 | 53 | GType server_get_type (void); | 66 | GType server_get_type (void); |
546 | 54 | 67 | ||
547 | === modified file 'src/uccs-server.c' | |||
548 | --- src/uccs-server.c 2012-08-29 19:09:54 +0000 | |||
549 | +++ src/uccs-server.c 2012-09-10 21:37:19 +0000 | |||
550 | @@ -90,6 +90,10 @@ | |||
551 | 90 | self->json_stream = NULL; | 90 | self->json_stream = NULL; |
552 | 91 | self->pass_stream = NULL; | 91 | self->pass_stream = NULL; |
553 | 92 | 92 | ||
554 | 93 | if (self->exec == NULL) { | ||
555 | 94 | self->parent.state = SERVER_STATE_UNAVAILABLE; | ||
556 | 95 | } | ||
557 | 96 | |||
558 | 93 | return; | 97 | return; |
559 | 94 | } | 98 | } |
560 | 95 | 99 | ||
561 | @@ -234,6 +238,33 @@ | |||
562 | 234 | return g_variant_builder_end(&propbuilder); | 238 | return g_variant_builder_end(&propbuilder); |
563 | 235 | } | 239 | } |
564 | 236 | 240 | ||
565 | 241 | /* Set the exec value for the server */ | ||
566 | 242 | const gchar * | ||
567 | 243 | uccs_server_set_exec (UccsServer * server, const gchar * exec) | ||
568 | 244 | { | ||
569 | 245 | g_return_val_if_fail(IS_UCCS_SERVER(server), NULL); | ||
570 | 246 | |||
571 | 247 | g_clear_pointer(&server->exec, g_free); | ||
572 | 248 | |||
573 | 249 | if (exec != NULL) { | ||
574 | 250 | server->exec = g_find_program_in_path(exec); | ||
575 | 251 | } | ||
576 | 252 | |||
577 | 253 | ServerState oldstate = server->parent.state; | ||
578 | 254 | if (server->exec != NULL) { | ||
579 | 255 | server->parent.state = SERVER_STATE_ALLGOOD; | ||
580 | 256 | } else { | ||
581 | 257 | server->parent.state = SERVER_STATE_UNAVAILABLE; | ||
582 | 258 | } | ||
583 | 259 | |||
584 | 260 | if (server->parent.state != oldstate) { | ||
585 | 261 | g_signal_emit_by_name(server, SERVER_SIGNAL_STATE_CHANGED, server->parent.state); | ||
586 | 262 | } | ||
587 | 263 | |||
588 | 264 | return server->exec; | ||
589 | 265 | } | ||
590 | 266 | |||
591 | 267 | /* Build a new uccs server from a keyfile and a group in it */ | ||
592 | 237 | Server * | 268 | Server * |
593 | 238 | uccs_server_new_from_keyfile (GKeyFile * keyfile, const gchar * groupname) | 269 | uccs_server_new_from_keyfile (GKeyFile * keyfile, const gchar * groupname) |
594 | 239 | { | 270 | { |
595 | @@ -256,9 +287,8 @@ | |||
596 | 256 | } | 287 | } |
597 | 257 | 288 | ||
598 | 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)) { |
599 | 259 | g_free(server->exec); | ||
600 | 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); |
602 | 261 | server->exec = g_find_program_in_path(key); | 291 | uccs_server_set_exec(server, key); |
603 | 262 | g_free(key); | 292 | g_free(key); |
604 | 263 | } | 293 | } |
605 | 264 | 294 | ||
606 | @@ -572,18 +602,27 @@ | |||
607 | 572 | return null_server_array(); | 602 | return null_server_array(); |
608 | 573 | } | 603 | } |
609 | 574 | 604 | ||
610 | 575 | if (g_list_length(server->subservers) == 0) { | ||
611 | 576 | return null_server_array(); | ||
612 | 577 | } | ||
613 | 578 | |||
614 | 579 | GVariantBuilder array; | 605 | GVariantBuilder array; |
615 | 580 | g_variant_builder_init(&array, G_VARIANT_TYPE_ARRAY); | 606 | g_variant_builder_init(&array, G_VARIANT_TYPE_ARRAY); |
616 | 581 | GList * lserver; | 607 | GList * lserver; |
617 | 608 | gint servercnt = 0; | ||
618 | 582 | for (lserver = server->subservers; lserver != NULL; lserver = g_list_next(lserver)) { | 609 | for (lserver = server->subservers; lserver != NULL; lserver = g_list_next(lserver)) { |
619 | 583 | Server * serv = SERVER(lserver->data); | 610 | Server * serv = SERVER(lserver->data); |
620 | 611 | |||
621 | 612 | /* We only want servers that are all good */ | ||
622 | 613 | if (serv->state != SERVER_STATE_ALLGOOD) { | ||
623 | 614 | continue; | ||
624 | 615 | } | ||
625 | 616 | |||
626 | 617 | servercnt++; | ||
627 | 584 | g_variant_builder_add_value(&array, server_get_variant(serv)); | 618 | g_variant_builder_add_value(&array, server_get_variant(serv)); |
628 | 585 | } | 619 | } |
629 | 586 | 620 | ||
630 | 621 | if (servercnt == 0) { | ||
631 | 622 | g_variant_builder_clear(&array); | ||
632 | 623 | return null_server_array(); | ||
633 | 624 | } | ||
634 | 625 | |||
635 | 587 | return g_variant_builder_end(&array); | 626 | return g_variant_builder_end(&array); |
636 | 588 | } | 627 | } |
637 | 589 | 628 | ||
638 | 590 | 629 | ||
639 | === modified file 'tests/dbus-interface.c' | |||
640 | --- tests/dbus-interface.c 2012-08-27 15:45:46 +0000 | |||
641 | +++ tests/dbus-interface.c 2012-09-10 21:37:19 +0000 | |||
642 | @@ -16,28 +16,31 @@ | |||
643 | 16 | const gchar * name; | 16 | const gchar * name; |
644 | 17 | const gchar * uri; | 17 | const gchar * uri; |
645 | 18 | const gchar * type; | 18 | const gchar * type; |
647 | 19 | /* TODO: Add more as we get more working */ | 19 | const gchar * username; |
648 | 20 | const gchar * password; | ||
649 | 21 | const gchar * domain; | ||
650 | 20 | }; | 22 | }; |
651 | 21 | 23 | ||
652 | 22 | slmock_server_t citrix_server_table[] = { | 24 | slmock_server_t citrix_server_table[] = { |
656 | 23 | {"Citrix USA", "107.21.17.35", "ica"}, | 25 | {"Citrix USA", "107.21.17.35", "ica", "useradmin1", "", "IP-0A00001E"}, |
657 | 24 | {"Citrix 2", "107.21.17.35", "ica"}, | 26 | {"Citrix 2", "107.21.17.35", "ica", "useradmin2", "", "IP-0A00001E"}, |
658 | 25 | {"Citrix 3", "107.21.17.35", "ica"}, | 27 | {"Citrix 3", "107.21.17.35", "ica", "useradmin3", "", "IP-0A00001E"}, |
659 | 28 | {"Citrix 4", "107.21.17.35", "ica", "useradmin4", "userpass", "IP-0A00001E"}, | ||
660 | 26 | {NULL, NULL, NULL} | 29 | {NULL, NULL, NULL} |
661 | 27 | }; | 30 | }; |
662 | 28 | 31 | ||
663 | 29 | slmock_server_t freerdp_server_table[] = { | 32 | slmock_server_t freerdp_server_table[] = { |
667 | 30 | {"FreeRDP US", "23.21.151.133", "freerdp"}, | 33 | {"FreeRDP US", "23.21.151.133", "freerdp", "Administrator", "", ""}, |
668 | 31 | {"FreeRDP Asia", "46.137.222.181", "freerdp"}, | 34 | {"FreeRDP Asia", "46.137.222.181", "freerdp", "Administrator", "", ""}, |
669 | 32 | {"FreeRDP UK", "46.137.189.194", "freerdp"}, | 35 | {"FreeRDP UK", "46.137.189.194", "freerdp", "Administrator", "", ""}, |
670 | 33 | {NULL, NULL, NULL} | 36 | {NULL, NULL, NULL} |
671 | 34 | }; | 37 | }; |
672 | 35 | 38 | ||
673 | 36 | slmock_server_t big_server_table[] = { | 39 | slmock_server_t big_server_table[] = { |
678 | 37 | {"XenServer", "107.21.17.35", "ica"}, | 40 | {"XenServer", "107.21.17.35", "ica", "", "", "ASIA"}, |
679 | 38 | {"Citrix2", "http://1.2.3.4", "ica"}, | 41 | {"Citrix2", "http://1.2.3.4", "ica", "fakeuser", "fakepassword", "DOMAIN1"}, |
680 | 39 | {"Accenture", "10.21.17.35", "freerdp"}, | 42 | {"Accenture", "10.21.17.35", "freerdp", "fakeuser", "", "EUROPE"}, |
681 | 40 | {"Accenture 2", "https://4.5.6.7", "freerdp"}, | 43 | {"Accenture 2", "https://4.5.6.7", "freerdp", "", "", "domain2"}, |
682 | 41 | {NULL, NULL, NULL} | 44 | {NULL, NULL, NULL} |
683 | 42 | }; | 45 | }; |
684 | 43 | 46 | ||
685 | @@ -79,8 +82,47 @@ | |||
686 | 79 | continue; | 82 | continue; |
687 | 80 | } | 83 | } |
688 | 81 | 84 | ||
689 | 85 | gboolean match_username = FALSE; | ||
690 | 86 | gboolean match_password = FALSE; | ||
691 | 87 | gboolean match_domain = FALSE; | ||
692 | 88 | |||
693 | 89 | GVariant * props = g_variant_get_child_value(child, 4); | ||
694 | 90 | int iprop; | ||
695 | 91 | for (iprop = 0; iprop < g_variant_n_children(props); iprop++) { | ||
696 | 92 | GVariant * prop = g_variant_get_child_value(props, iprop); | ||
697 | 93 | |||
698 | 94 | GVariant * prop_type = g_variant_get_child_value(prop, 0); | ||
699 | 95 | GVariant * prop_value_wrap = g_variant_get_child_value(prop, 2); | ||
700 | 96 | GVariant * prop_value = g_variant_get_variant(prop_value_wrap); | ||
701 | 97 | |||
702 | 98 | if (g_strcmp0(g_variant_get_string(prop_type, NULL), "username") == 0) { | ||
703 | 99 | if (g_strcmp0(g_variant_get_string(prop_value, NULL), server->username) == 0) { | ||
704 | 100 | match_username = TRUE; | ||
705 | 101 | } | ||
706 | 102 | } else if (g_strcmp0(g_variant_get_string(prop_type, NULL), "password") == 0) { | ||
707 | 103 | if (g_strcmp0(g_variant_get_string(prop_value, NULL), server->password) == 0) { | ||
708 | 104 | match_password = TRUE; | ||
709 | 105 | } | ||
710 | 106 | } else if (g_strcmp0(g_variant_get_string(prop_type, NULL), "domain") == 0) { | ||
711 | 107 | if (g_strcmp0(g_variant_get_string(prop_value, NULL), server->domain) == 0) { | ||
712 | 108 | match_domain = TRUE; | ||
713 | 109 | } | ||
714 | 110 | } | ||
715 | 111 | |||
716 | 112 | g_variant_unref(prop_value); | ||
717 | 113 | g_variant_unref(prop_value_wrap); | ||
718 | 114 | g_variant_unref(prop_type); | ||
719 | 115 | g_variant_unref(prop); | ||
720 | 116 | } | ||
721 | 117 | g_variant_unref(props); | ||
722 | 118 | |||
723 | 82 | g_variant_unref(child); | 119 | g_variant_unref(child); |
725 | 83 | return TRUE; | 120 | |
726 | 121 | if (match_username && match_password && match_domain) { | ||
727 | 122 | return TRUE; | ||
728 | 123 | } else { | ||
729 | 124 | continue; | ||
730 | 125 | } | ||
731 | 84 | } | 126 | } |
732 | 85 | 127 | ||
733 | 86 | return FALSE; | 128 | return FALSE; |
734 | 87 | 129 | ||
735 | === modified file 'tests/server-test.c' | |||
736 | --- tests/server-test.c 2012-08-29 19:44:17 +0000 | |||
737 | +++ tests/server-test.c 2012-09-10 21:37:19 +0000 | |||
738 | @@ -7,6 +7,48 @@ | |||
739 | 7 | #include "uccs-server.h" | 7 | #include "uccs-server.h" |
740 | 8 | 8 | ||
741 | 9 | static void | 9 | static void |
742 | 10 | state_signal (Server * server, ServerState newstate, gboolean * signaled) | ||
743 | 11 | { | ||
744 | 12 | *signaled = TRUE; | ||
745 | 13 | return; | ||
746 | 14 | } | ||
747 | 15 | |||
748 | 16 | static void | ||
749 | 17 | test_update_signal (void) | ||
750 | 18 | { | ||
751 | 19 | GKeyFile * keyfile = g_key_file_new(); | ||
752 | 20 | const gchar * groupname = CONFIG_SERVER_PREFIX " Server Name"; | ||
753 | 21 | g_key_file_set_string(keyfile, groupname, CONFIG_SERVER_NAME, "My Server"); | ||
754 | 22 | g_key_file_set_string(keyfile, groupname, CONFIG_SERVER_URI, "http://my.domain.com"); | ||
755 | 23 | |||
756 | 24 | Server * server = NULL; | ||
757 | 25 | server = server_new_from_keyfile(keyfile, groupname); | ||
758 | 26 | g_assert(server != NULL); | ||
759 | 27 | g_assert(g_strcmp0(server->name, "My Server") == 0); | ||
760 | 28 | g_assert(g_strcmp0(server->uri, "http://my.domain.com") == 0); | ||
761 | 29 | |||
762 | 30 | UccsServer * userver = UCCS_SERVER(server); | ||
763 | 31 | g_assert(userver != NULL); | ||
764 | 32 | |||
765 | 33 | gboolean signaled = FALSE; | ||
766 | 34 | g_signal_connect(G_OBJECT(server), SERVER_SIGNAL_STATE_CHANGED, G_CALLBACK(state_signal), &signaled); | ||
767 | 35 | |||
768 | 36 | if (server->state == SERVER_STATE_ALLGOOD) { | ||
769 | 37 | signaled = FALSE; | ||
770 | 38 | uccs_server_set_exec(userver, "thisshouldnotexist"); | ||
771 | 39 | g_assert(signaled); | ||
772 | 40 | g_assert(server->state == SERVER_STATE_UNAVAILABLE); | ||
773 | 41 | } | ||
774 | 42 | |||
775 | 43 | signaled = FALSE; | ||
776 | 44 | uccs_server_set_exec(userver, "ls"); | ||
777 | 45 | g_assert(signaled); | ||
778 | 46 | g_assert(server->state == SERVER_STATE_ALLGOOD); | ||
779 | 47 | |||
780 | 48 | return; | ||
781 | 49 | } | ||
782 | 50 | |||
783 | 51 | static void | ||
784 | 10 | test_uccs_domains (void) | 52 | test_uccs_domains (void) |
785 | 11 | { | 53 | { |
786 | 12 | GKeyFile * keyfile = g_key_file_new(); | 54 | GKeyFile * keyfile = g_key_file_new(); |
787 | @@ -199,6 +241,7 @@ | |||
788 | 199 | 241 | ||
789 | 200 | g_test_add_func ("/server/uccs/exec", test_uccs_exec); | 242 | g_test_add_func ("/server/uccs/exec", test_uccs_exec); |
790 | 201 | g_test_add_func ("/server/uccs/domains", test_uccs_domains); | 243 | g_test_add_func ("/server/uccs/domains", test_uccs_domains); |
791 | 244 | g_test_add_func ("/server/uccs/signal", test_update_signal); | ||
792 | 202 | 245 | ||
793 | 203 | return; | 246 | return; |
794 | 204 | } | 247 | } |
795 | 205 | 248 | ||
796 | === modified file 'tests/slmock' | |||
797 | --- tests/slmock 2012-08-21 15:46:54 +0000 | |||
798 | +++ tests/slmock 2012-09-10 21:37:19 +0000 | |||
799 | @@ -93,7 +93,7 @@ | |||
800 | 93 | ts3 = TerminalServer("107.21.17.35", "Citrix 3", "ICA", True, | 93 | ts3 = TerminalServer("107.21.17.35", "Citrix 3", "ICA", True, |
801 | 94 | "useradmin3") | 94 | "useradmin3") |
802 | 95 | ts4 = TerminalServer("107.21.17.35", "Citrix 4", "ICA", True, | 95 | ts4 = TerminalServer("107.21.17.35", "Citrix 4", "ICA", True, |
804 | 96 | "useradmin4") | 96 | "useradmin4", "userpass") |
805 | 97 | ts1.add_domain("IP-0A00001E") | 97 | ts1.add_domain("IP-0A00001E") |
806 | 98 | ts2.add_domain("IP-0A00001E") | 98 | ts2.add_domain("IP-0A00001E") |
807 | 99 | ts3.add_domain("IP-0A00001E") | 99 | ts3.add_domain("IP-0A00001E") |