provider: Refactor server and user route handling
[platform/upstream/connman.git] / vpn / vpn-provider.c
1 /*
2  *
3  *  ConnMan VPN daemon
4  *
5  *  Copyright (C) 2012  Intel Corporation. All rights reserved.
6  *
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License version 2 as
9  *  published by the Free Software Foundation.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19  *
20  */
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <errno.h>
27 #include <stdio.h>
28 #include <string.h>
29 #include <stdlib.h>
30 #include <gdbus.h>
31 #include <connman/log.h>
32 #include <gweb/gresolv.h>
33 #include <netdb.h>
34
35 #include "../src/connman.h"
36 #include "connman/vpn-dbus.h"
37 #include "vpn-provider.h"
38 #include "vpn.h"
39
40 enum {
41         USER_ROUTES_CHANGED = 0x01,
42         SERVER_ROUTES_CHANGED = 0x02,
43 };
44
45 static DBusConnection *connection;
46 static GHashTable *provider_hash;
47 static GSList *driver_list;
48 static int configuration_count;
49
50 struct vpn_route {
51         int family;
52         char *network;
53         char *netmask;
54         char *gateway;
55 };
56
57 struct vpn_provider {
58         int refcount;
59         int index;
60         int fd;
61         enum vpn_provider_state state;
62         char *path;
63         char *identifier;
64         char *name;
65         char *type;
66         char *host;
67         char *domain;
68         int family;
69         GHashTable *routes;
70         struct vpn_provider_driver *driver;
71         void *driver_data;
72         GHashTable *setting_strings;
73         GHashTable *user_routes;
74         GSList *user_networks;
75         GResolv *resolv;
76         char **host_ip;
77         DBusMessage *pending_msg;
78         struct vpn_ipconfig *ipconfig_ipv4;
79         struct vpn_ipconfig *ipconfig_ipv6;
80         char **nameservers;
81         int what_changed;
82         guint notify_id;
83 };
84
85 static void free_route(gpointer data)
86 {
87         struct vpn_route *route = data;
88
89         g_free(route->network);
90         g_free(route->netmask);
91         g_free(route->gateway);
92
93         g_free(route);
94 }
95
96 static void append_route(DBusMessageIter *iter, void *user_data)
97 {
98         struct vpn_route *route = user_data;
99         DBusMessageIter item;
100         int family = 0;
101
102         connman_dbus_dict_open(iter, &item);
103
104         if (route == NULL)
105                 goto empty_dict;
106
107         if (route->family == AF_INET)
108                 family = 4;
109         else if (route->family == AF_INET6)
110                 family = 6;
111
112         if (family != 0)
113                 connman_dbus_dict_append_basic(&item, "ProtocolFamily",
114                                         DBUS_TYPE_INT32, &family);
115
116         if (route->network != NULL)
117                 connman_dbus_dict_append_basic(&item, "Network",
118                                         DBUS_TYPE_STRING, &route->network);
119
120         if (route->netmask != NULL)
121                 connman_dbus_dict_append_basic(&item, "Netmask",
122                                         DBUS_TYPE_STRING, &route->netmask);
123
124         if (route->gateway != NULL)
125                 connman_dbus_dict_append_basic(&item, "Gateway",
126                                         DBUS_TYPE_STRING, &route->gateway);
127
128 empty_dict:
129         connman_dbus_dict_close(iter, &item);
130 }
131
132 static void append_routes(DBusMessageIter *iter, void *user_data)
133 {
134         GHashTable *routes = user_data;
135         GHashTableIter hash;
136         gpointer value, key;
137
138         if (routes == NULL) {
139                 append_route(iter, NULL);
140                 return;
141         }
142
143         g_hash_table_iter_init(&hash, routes);
144
145         while (g_hash_table_iter_next(&hash, &key, &value) == TRUE) {
146                 DBusMessageIter dict;
147
148                 dbus_message_iter_open_container(iter, DBUS_TYPE_STRUCT, NULL,
149                                                 &dict);
150                 append_route(&dict, value);
151                 dbus_message_iter_close_container(iter, &dict);
152         }
153 }
154
155 static void send_routes(struct vpn_provider *provider, GHashTable *routes,
156                         const char *name)
157 {
158         connman_dbus_property_changed_array(provider->path,
159                                         VPN_CONNECTION_INTERFACE,
160                                         name,
161                                         DBUS_TYPE_DICT_ENTRY,
162                                         append_routes,
163                                         routes);
164 }
165
166 static int provider_property_changed(struct vpn_provider *provider,
167                                 const char *name)
168 {
169         DBG("provider %p name %s", provider, name);
170
171         if (g_str_equal(name, "UserRoutes") == TRUE)
172                 send_routes(provider, provider->user_routes, name);
173         else if (g_str_equal(name, "ServerRoutes") == TRUE)
174                 send_routes(provider, provider->routes, name);
175
176         return 0;
177 }
178
179 static GSList *read_route_dict(GSList *routes, DBusMessageIter *dicts)
180 {
181         DBusMessageIter dict, value, entry;
182         const char *network, *netmask, *gateway;
183         struct vpn_route *route;
184         int family, type;
185         const char *key;
186
187         dbus_message_iter_recurse(dicts, &entry);
188
189         network = netmask = gateway = NULL;
190         family = PF_UNSPEC;
191
192         while (dbus_message_iter_get_arg_type(&entry) == DBUS_TYPE_DICT_ENTRY) {
193
194                 dbus_message_iter_recurse(&entry, &dict);
195                 dbus_message_iter_get_basic(&dict, &key);
196
197                 dbus_message_iter_next(&dict);
198                 dbus_message_iter_recurse(&dict, &value);
199
200                 type = dbus_message_iter_get_arg_type(&value);
201
202                 switch (type) {
203                 case DBUS_TYPE_STRING:
204                         if (g_str_equal(key, "ProtocolFamily") == TRUE)
205                                 dbus_message_iter_get_basic(&value, &family);
206                         else if (g_str_equal(key, "Network") == TRUE)
207                                 dbus_message_iter_get_basic(&value, &network);
208                         else if (g_str_equal(key, "Netmask") == TRUE)
209                                 dbus_message_iter_get_basic(&value, &netmask);
210                         else if (g_str_equal(key, "Gateway") == TRUE)
211                                 dbus_message_iter_get_basic(&value, &gateway);
212                         break;
213                 }
214
215                 dbus_message_iter_next(&entry);
216         }
217
218         DBG("family %d network %s netmask %s gateway %s", family,
219                 network, netmask, gateway);
220
221         if (network == NULL || netmask == NULL) {
222                 DBG("Ignoring route as network/netmask is missing");
223                 return routes;
224         }
225
226         route = g_try_new(struct vpn_route, 1);
227         if (route == NULL) {
228                 g_slist_free_full(routes, free_route);
229                 return NULL;
230         }
231
232         if (family == PF_UNSPEC) {
233                 family = connman_inet_check_ipaddress(network);
234                 if (family < 0) {
235                         DBG("Cannot get address family of %s (%d/%s)", network,
236                                 family, gai_strerror(family));
237                         if (strstr(network, ":") != NULL) {
238                                 DBG("Guessing it is IPv6");
239                                 family = AF_INET6;
240                         } else {
241                                 DBG("Guessing it is IPv4");
242                                 family = AF_INET;
243                         }
244                 }
245         } else {
246                 switch (family) {
247                 case '4':
248                         family = AF_INET;
249                         break;
250                 case '6':
251                         family = AF_INET6;
252                         break;
253                 default:
254                         family = PF_UNSPEC;
255                         break;
256                 }
257         }
258
259         route->family = family;
260         route->network = g_strdup(network);
261         route->netmask = g_strdup(netmask);
262         route->gateway = g_strdup(gateway);
263
264         routes = g_slist_prepend(routes, route);
265         return routes;
266 }
267
268 static GSList *get_user_networks(DBusMessageIter *array)
269 {
270         DBusMessageIter entry;
271         GSList *list = NULL;
272
273         while (dbus_message_iter_get_arg_type(array) == DBUS_TYPE_ARRAY) {
274
275                 dbus_message_iter_recurse(array, &entry);
276
277                 while (dbus_message_iter_get_arg_type(&entry) ==
278                                                         DBUS_TYPE_STRUCT) {
279                         DBusMessageIter dicts;
280
281                         dbus_message_iter_recurse(&entry, &dicts);
282
283                         while (dbus_message_iter_get_arg_type(&dicts) ==
284                                                         DBUS_TYPE_ARRAY) {
285
286                                 list = read_route_dict(list, &dicts);
287                                 dbus_message_iter_next(&dicts);
288                         }
289
290                         dbus_message_iter_next(&entry);
291                 }
292
293                 dbus_message_iter_next(array);
294         }
295
296         return list;
297 }
298
299 static void set_user_networks(struct vpn_provider *provider, GSList *networks)
300 {
301         GSList *list;
302
303         for (list = networks; list != NULL; list = g_slist_next(list)) {
304                 struct vpn_route *route= list->data;
305
306                 if (__vpn_provider_append_user_route(provider,
307                                         route->family, route->network,
308                                         route->netmask) != 0)
309                         break;
310         }
311 }
312
313 static void del_routes(struct vpn_provider *provider)
314 {
315         GHashTableIter hash;
316         gpointer value, key;
317
318         g_hash_table_iter_init(&hash, provider->user_routes);
319         while (g_hash_table_iter_next(&hash, &key, &value) == TRUE) {
320                 struct vpn_route *route = value;
321                 if (route->family == AF_INET6) {
322                         unsigned char prefixlen = atoi(route->netmask);
323                         connman_inet_del_ipv6_network_route(provider->index,
324                                                         route->network,
325                                                         prefixlen);
326                 } else
327                         connman_inet_del_host_route(provider->index,
328                                                 route->network);
329         }
330
331         g_hash_table_remove_all(provider->user_routes);
332         g_slist_free_full(provider->user_networks, free_route);
333         provider->user_networks = NULL;
334 }
335
336 static gboolean provider_send_changed(gpointer data)
337 {
338         struct vpn_provider *provider = data;
339
340         if (provider->what_changed & USER_ROUTES_CHANGED)
341                 provider_property_changed(provider, "UserRoutes");
342
343         if (provider->what_changed & SERVER_ROUTES_CHANGED)
344                 provider_property_changed(provider, "ServerRoutes");
345
346         provider->what_changed = 0;
347         provider->notify_id = 0;
348
349         return FALSE;
350 }
351
352 static void provider_schedule_changed(struct vpn_provider *provider, int flag)
353 {
354         if (provider->notify_id != 0)
355                 g_source_remove(provider->notify_id);
356
357         provider->what_changed |= flag;
358
359         provider->notify_id = g_timeout_add(100, provider_send_changed,
360                                                                 provider);
361 }
362
363 static DBusMessage *set_property(DBusConnection *conn, DBusMessage *msg,
364                                                                 void *data)
365 {
366         struct vpn_provider *provider = data;
367         DBusMessageIter iter, value;
368         const char *name;
369         int type;
370
371         DBG("conn %p", conn);
372
373         if (dbus_message_iter_init(msg, &iter) == FALSE)
374                 return __connman_error_invalid_arguments(msg);
375
376         if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
377                 return __connman_error_invalid_arguments(msg);
378
379         dbus_message_iter_get_basic(&iter, &name);
380         dbus_message_iter_next(&iter);
381
382         if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
383                 return __connman_error_invalid_arguments(msg);
384
385         dbus_message_iter_recurse(&iter, &value);
386
387         type = dbus_message_iter_get_arg_type(&value);
388
389         if (g_str_equal(name, "UserRoutes") == TRUE) {
390                 GSList *networks;
391
392                 if (type != DBUS_TYPE_ARRAY)
393                         return __connman_error_invalid_arguments(msg);
394
395                 networks = get_user_networks(&value);
396                 if (networks != NULL) {
397                         del_routes(provider);
398                         provider->user_networks = networks;
399                         set_user_networks(provider, provider->user_networks);
400
401                         provider_schedule_changed(provider, USER_ROUTES_CHANGED);
402                         provider_property_changed(provider, name);
403                 }
404         } else
405                 return __connman_error_invalid_property(msg);
406
407         return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
408 }
409
410 static DBusMessage *clear_property(DBusConnection *conn, DBusMessage *msg,
411                                                                 void *data)
412 {
413         struct vpn_provider *provider = data;
414         const char *name;
415
416         DBG("conn %p", conn);
417
418         dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &name,
419                                                         DBUS_TYPE_INVALID);
420
421         if (g_str_equal(name, "UserRoutes") == TRUE) {
422                 del_routes(provider);
423
424                 provider_property_changed(provider, name);
425         } else {
426                 return __connman_error_invalid_property(msg);
427         }
428
429         return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
430 }
431
432 static DBusMessage *do_connect(DBusConnection *conn, DBusMessage *msg,
433                                                                 void *data)
434 {
435         struct vpn_provider *provider = data;
436         int err;
437
438         DBG("conn %p provider %p", conn, provider);
439
440         err = __vpn_provider_connect(provider);
441         if (err < 0)
442                 return __connman_error_failed(msg, -err);
443
444         return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
445 }
446
447 static DBusMessage *do_disconnect(DBusConnection *conn, DBusMessage *msg,
448                                                                 void *data)
449 {
450         struct vpn_provider *provider = data;
451         int err;
452
453         DBG("conn %p provider %p", conn, provider);
454
455         err = __vpn_provider_disconnect(provider);
456         if (err < 0)
457                 return __connman_error_failed(msg, -err);
458         else
459                 return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
460 }
461
462 static const GDBusMethodTable connection_methods[] = {
463         { GDBUS_METHOD("SetProperty",
464                         GDBUS_ARGS({ "name", "s" }, { "value", "v" }),
465                         NULL, set_property) },
466         { GDBUS_METHOD("ClearProperty",
467                         GDBUS_ARGS({ "name", "s" }), NULL,
468                         clear_property) },
469         { GDBUS_ASYNC_METHOD("Connect", NULL, NULL, do_connect) },
470         { GDBUS_METHOD("Disconnect", NULL, NULL, do_disconnect) },
471         { },
472 };
473
474 static const GDBusSignalTable connection_signals[] = {
475         { GDBUS_SIGNAL("PropertyChanged",
476                         GDBUS_ARGS({ "name", "s" }, { "value", "v" })) },
477         { },
478 };
479
480 static void resolv_result(GResolvResultStatus status,
481                                         char **results, gpointer user_data)
482 {
483         struct vpn_provider *provider = user_data;
484
485         DBG("status %d", status);
486
487         if (status == G_RESOLV_RESULT_STATUS_SUCCESS && results != NULL &&
488                                                 g_strv_length(results) > 0)
489                 provider->host_ip = g_strdupv(results);
490
491         vpn_provider_unref(provider);
492 }
493
494 static void provider_resolv_host_addr(struct vpn_provider *provider)
495 {
496         if (provider->host == NULL)
497                 return;
498
499         if (connman_inet_check_ipaddress(provider->host) > 0)
500                 return;
501
502         if (provider->host_ip != NULL)
503                 return;
504
505         /*
506          * If the hostname is not numeric, try to resolv it. We do not wait
507          * the result as it might take some time. We will get the result
508          * before VPN will feed routes to us because VPN client will need
509          * the IP address also before VPN connection can be established.
510          */
511         provider->resolv = g_resolv_new(0);
512         if (provider->resolv == NULL) {
513                 DBG("Cannot resolv %s", provider->host);
514                 return;
515         }
516
517         DBG("Trying to resolv %s", provider->host);
518
519         vpn_provider_ref(provider);
520
521         g_resolv_lookup_hostname(provider->resolv, provider->host,
522                                 resolv_result, provider);
523 }
524
525 void __vpn_provider_append_properties(struct vpn_provider *provider,
526                                                         DBusMessageIter *iter)
527 {
528         if (provider->host != NULL)
529                 connman_dbus_dict_append_basic(iter, "Host",
530                                         DBUS_TYPE_STRING, &provider->host);
531
532         if (provider->domain != NULL)
533                 connman_dbus_dict_append_basic(iter, "Domain",
534                                         DBUS_TYPE_STRING, &provider->domain);
535
536         if (provider->type != NULL)
537                 connman_dbus_dict_append_basic(iter, "Type", DBUS_TYPE_STRING,
538                                                  &provider->type);
539 }
540
541 int __vpn_provider_append_user_route(struct vpn_provider *provider,
542                         int family, const char *network, const char *netmask)
543 {
544         struct vpn_route *route;
545         char *key = g_strdup_printf("%d/%s/%s", family, network, netmask);
546
547         DBG("family %d network %s netmask %s", family, network, netmask);
548
549         route = g_hash_table_lookup(provider->user_routes, key);
550         if (route == NULL) {
551                 route = g_try_new0(struct vpn_route, 1);
552                 if (route == NULL) {
553                         connman_error("out of memory");
554                         return -ENOMEM;
555                 }
556
557                 route->family = family;
558                 route->network = g_strdup(network);
559                 route->netmask = g_strdup(netmask);
560
561                 g_hash_table_replace(provider->user_routes, key, route);
562         } else
563                 g_free(key);
564
565         return 0;
566 }
567
568 static struct vpn_route *get_route(char *route_str)
569 {
570         char **elems = g_strsplit(route_str, "/", 0);
571         char *network, *netmask, *gateway, *family_str;
572         int family = PF_UNSPEC;
573         struct vpn_route *route = NULL;
574
575         if (elems == NULL)
576                 return NULL;
577
578         family_str = elems[0];
579
580         network = elems[1];
581         if (network == NULL || network[0] == '\0')
582                 goto out;
583
584         netmask = elems[2];
585         if (netmask == NULL || netmask[0] == '\0')
586                 goto out;
587
588         gateway = elems[3];
589
590         route = g_try_new0(struct vpn_route, 1);
591         if (route == NULL)
592                 goto out;
593
594         if (family_str[0] == '\0' || atoi(family_str) == 0) {
595                 family = PF_UNSPEC;
596         } else {
597                 switch (family_str[0]) {
598                 case '4':
599                         family = AF_INET;
600                         break;
601                 case '6':
602                         family = AF_INET6;
603                         break;
604                 }
605         }
606
607         if (g_strrstr(network, ":") != NULL) {
608                 if (family != PF_UNSPEC && family != AF_INET6)
609                         DBG("You have IPv6 address but you have non IPv6 route");
610         } else if (g_strrstr(network, ".") != NULL) {
611                 if (family != PF_UNSPEC && family != AF_INET)
612                         DBG("You have IPv4 address but you have non IPv4 route");
613
614                 if (g_strrstr(netmask, ".") == NULL) {
615                         /* We have netmask length */
616                         in_addr_t addr;
617                         struct in_addr netmask_in;
618                         unsigned char prefix_len = 32;
619
620                         if (netmask != NULL) {
621                                 char *ptr;
622                                 long int value = strtol(netmask, &ptr, 10);
623                                 if (ptr != netmask && *ptr == '\0' &&
624                                                                 value <= 32)
625                                         prefix_len = value;
626                         }
627
628                         addr = 0xffffffff << (32 - prefix_len);
629                         netmask_in.s_addr = htonl(addr);
630                         netmask = inet_ntoa(netmask_in);
631
632                         DBG("network %s netmask %s", network, netmask);
633                 }
634         }
635
636         if (family == PF_UNSPEC) {
637                 family = connman_inet_check_ipaddress(network);
638                 if (family < 0 || family == PF_UNSPEC)
639                         goto out;
640         }
641
642         route->family = family;
643         route->network = g_strdup(network);
644         route->netmask = g_strdup(netmask);
645         route->gateway = g_strdup(gateway);
646
647 out:
648         g_strfreev(elems);
649         return route;
650 }
651
652 static GSList *get_routes(gchar **networks)
653 {
654         struct vpn_route *route;
655         GSList *routes = NULL;
656         int i;
657
658         for (i = 0; networks[i] != NULL; i++) {
659                 route = get_route(networks[i]);
660                 if (route != NULL)
661                         routes = g_slist_prepend(routes, route);
662         }
663
664         return routes;
665 }
666
667 static int provider_load_from_keyfile(struct vpn_provider *provider,
668                 GKeyFile *keyfile)
669 {
670         gsize idx = 0;
671         gchar **settings;
672         gchar *key, *value;
673         gsize length, num_user_networks;
674         gchar **networks = NULL;
675
676         settings = g_key_file_get_keys(keyfile, provider->identifier, &length,
677                                 NULL);
678         if (settings == NULL) {
679                 g_key_file_free(keyfile);
680                 return -ENOENT;
681         }
682
683         while (idx < length) {
684                 key = settings[idx];
685                 if (key != NULL) {
686                         if (g_str_equal(key, "Networks") == TRUE) {
687                                 networks = g_key_file_get_string_list(keyfile,
688                                                 provider->identifier,
689                                                 key,
690                                                 &num_user_networks,
691                                                 NULL);
692                                 provider->user_networks = get_routes(networks);
693
694                         } else {
695                                 value = g_key_file_get_string(keyfile,
696                                                         provider->identifier,
697                                                         key, NULL);
698                                 vpn_provider_set_string(provider, key,
699                                                         value);
700                                 g_free(value);
701                         }
702                 }
703                 idx += 1;
704         }
705         g_strfreev(settings);
706         g_strfreev(networks);
707
708         if (provider->user_networks != NULL)
709                 set_user_networks(provider, provider->user_networks);
710
711         return 0;
712 }
713
714
715 static int vpn_provider_load(struct vpn_provider *provider)
716 {
717         GKeyFile *keyfile;
718
719         DBG("provider %p", provider);
720
721         keyfile = __connman_storage_load_provider(provider->identifier);
722         if (keyfile == NULL)
723                 return -ENOENT;
724
725         provider_load_from_keyfile(provider, keyfile);
726
727         g_key_file_free(keyfile);
728         return 0;
729 }
730
731 static gchar **create_network_list(GSList *networks, gsize *count)
732 {
733         GSList *list;
734         gchar **result = NULL;
735         unsigned int num_elems = 0;
736
737         for (list = networks; list != NULL; list = g_slist_next(list)) {
738                 struct vpn_route *route = list->data;
739                 int family;
740
741                 result = g_try_realloc(result,
742                                 (num_elems + 1) * sizeof(gchar *));
743                 if (result == NULL)
744                         return NULL;
745
746                 switch (route->family) {
747                 case AF_INET:
748                         family = 4;
749                         break;
750                 case AF_INET6:
751                         family = 6;
752                         break;
753                 default:
754                         family = 0;
755                         break;
756                 }
757
758                 result[num_elems] = g_strdup_printf("%d/%s/%s/%s",
759                                 family, route->network, route->netmask,
760                                 route->gateway == NULL ? "" : route->gateway);
761
762                 num_elems++;
763         }
764
765         result = g_try_realloc(result, (num_elems + 1) * sizeof(gchar *));
766         if (result == NULL)
767                 return NULL;
768
769         result[num_elems] = NULL;
770         *count = num_elems;
771         return result;
772 }
773
774 static int vpn_provider_save(struct vpn_provider *provider)
775 {
776         GKeyFile *keyfile;
777
778         DBG("provider %p", provider);
779
780         keyfile = g_key_file_new();
781         if (keyfile == NULL)
782                 return -ENOMEM;
783
784         g_key_file_set_string(keyfile, provider->identifier,
785                         "Name", provider->name);
786         g_key_file_set_string(keyfile, provider->identifier,
787                         "Type", provider->type);
788         g_key_file_set_string(keyfile, provider->identifier,
789                         "Host", provider->host);
790         g_key_file_set_string(keyfile, provider->identifier,
791                         "VPN.Domain", provider->domain);
792         if (provider->user_networks != NULL) {
793                 gchar **networks;
794                 gsize network_count;
795
796                 networks = create_network_list(provider->user_networks,
797                                                         &network_count);
798                 if (networks != NULL) {
799                         g_key_file_set_string_list(keyfile,
800                                                 provider->identifier,
801                                                 "Networks",
802                                                 (const gchar ** const)networks,
803                                                 network_count);
804                         g_strfreev(networks);
805                 }
806         }
807
808         if (provider->driver != NULL && provider->driver->save != NULL)
809                 provider->driver->save(provider, keyfile);
810
811         __connman_storage_save_provider(keyfile, provider->identifier);
812         g_key_file_free(keyfile);
813
814         return 0;
815 }
816
817 static struct vpn_provider *vpn_provider_lookup(const char *identifier)
818 {
819         struct vpn_provider *provider = NULL;
820
821         provider = g_hash_table_lookup(provider_hash, identifier);
822
823         return provider;
824 }
825
826 static gboolean match_driver(struct vpn_provider *provider,
827                                 struct vpn_provider_driver *driver)
828 {
829         if (g_strcmp0(driver->name, provider->type) == 0)
830                 return TRUE;
831
832         return FALSE;
833 }
834
835 static int provider_probe(struct vpn_provider *provider)
836 {
837         GSList *list;
838
839         DBG("provider %p name %s", provider, provider->name);
840
841         if (provider->driver != NULL)
842                 return -EALREADY;
843
844         for (list = driver_list; list; list = list->next) {
845                 struct vpn_provider_driver *driver = list->data;
846
847                 if (match_driver(provider, driver) == FALSE)
848                         continue;
849
850                 DBG("driver %p name %s", driver, driver->name);
851
852                 if (driver->probe != NULL && driver->probe(provider) == 0) {
853                         provider->driver = driver;
854                         break;
855                 }
856         }
857
858         if (provider->driver == NULL)
859                 return -ENODEV;
860
861         return 0;
862 }
863
864 static void provider_remove(struct vpn_provider *provider)
865 {
866         if (provider->driver != NULL) {
867                 provider->driver->remove(provider);
868                 provider->driver = NULL;
869         }
870 }
871
872 static int provider_register(struct vpn_provider *provider)
873 {
874         return provider_probe(provider);
875 }
876
877 static void provider_unregister(struct vpn_provider *provider)
878 {
879         provider_remove(provider);
880 }
881
882 struct vpn_provider *
883 vpn_provider_ref_debug(struct vpn_provider *provider,
884                         const char *file, int line, const char *caller)
885 {
886         DBG("%p ref %d by %s:%d:%s()", provider, provider->refcount + 1,
887                 file, line, caller);
888
889         __sync_fetch_and_add(&provider->refcount, 1);
890
891         return provider;
892 }
893
894 static void provider_destruct(struct vpn_provider *provider)
895 {
896         DBG("provider %p", provider);
897
898         if (provider->notify_id != 0)
899                 g_source_remove(provider->notify_id);
900
901         g_free(provider->name);
902         g_free(provider->type);
903         g_free(provider->host);
904         g_free(provider->domain);
905         g_free(provider->identifier);
906         g_free(provider->path);
907         g_slist_free_full(provider->user_networks, free_route);
908         g_strfreev(provider->nameservers);
909         g_hash_table_destroy(provider->routes);
910         g_hash_table_destroy(provider->user_routes);
911         g_hash_table_destroy(provider->setting_strings);
912         if (provider->resolv != NULL) {
913                 g_resolv_unref(provider->resolv);
914                 provider->resolv = NULL;
915         }
916         g_strfreev(provider->host_ip);
917         g_free(provider);
918 }
919
920 void vpn_provider_unref_debug(struct vpn_provider *provider,
921                                 const char *file, int line, const char *caller)
922 {
923         DBG("%p ref %d by %s:%d:%s()", provider, provider->refcount - 1,
924                 file, line, caller);
925
926         if (__sync_fetch_and_sub(&provider->refcount, 1) != 1)
927                 return;
928
929         provider_remove(provider);
930
931         provider_destruct(provider);
932 }
933
934 static void configuration_count_add(void)
935 {
936         DBG("count %d", configuration_count + 1);
937
938         __sync_fetch_and_add(&configuration_count, 1);
939 }
940
941 static void configuration_count_del(void)
942 {
943         DBG("count %d", configuration_count - 1);
944
945         if (__sync_fetch_and_sub(&configuration_count, 1) != 1)
946                 return;
947
948         raise(SIGTERM);
949 }
950
951 int __vpn_provider_disconnect(struct vpn_provider *provider)
952 {
953         int err;
954
955         DBG("provider %p", provider);
956
957         if (provider->driver != NULL && provider->driver->disconnect != NULL)
958                 err = provider->driver->disconnect(provider);
959         else
960                 return -EOPNOTSUPP;
961
962         if (err < 0) {
963                 if (err != -EINPROGRESS)
964                         return err;
965
966                 return -EINPROGRESS;
967         }
968
969         return 0;
970 }
971
972 int __vpn_provider_connect(struct vpn_provider *provider)
973 {
974         int err;
975
976         DBG("provider %p", provider);
977
978         if (provider->driver != NULL && provider->driver->connect != NULL)
979                 err = provider->driver->connect(provider);
980         else
981                 return -EOPNOTSUPP;
982
983         return err;
984 }
985
986 int __vpn_provider_remove(const char *path)
987 {
988         struct vpn_provider *provider;
989
990         DBG("path %s", path);
991
992         provider = vpn_provider_lookup(path);
993         if (provider != NULL) {
994                 DBG("Removing VPN %s", provider->identifier);
995
996                 provider_unregister(provider);
997                 g_hash_table_remove(provider_hash, provider->identifier);
998                 return 0;
999         }
1000
1001         return -ENXIO;
1002 }
1003
1004 static void append_ipv4(DBusMessageIter *iter, void *user_data)
1005 {
1006         struct vpn_provider *provider = user_data;
1007         const char *address, *gateway, *peer;
1008
1009         address = __vpn_ipconfig_get_local(provider->ipconfig_ipv4);
1010         if (address != NULL) {
1011                 in_addr_t addr;
1012                 struct in_addr netmask;
1013                 char *mask;
1014                 int prefixlen;
1015
1016                 prefixlen = __vpn_ipconfig_get_prefixlen(
1017                                                 provider->ipconfig_ipv4);
1018
1019                 addr = 0xffffffff << (32 - prefixlen);
1020                 netmask.s_addr = htonl(addr);
1021                 mask = inet_ntoa(netmask);
1022
1023                 connman_dbus_dict_append_basic(iter, "Address",
1024                                                 DBUS_TYPE_STRING, &address);
1025
1026                 connman_dbus_dict_append_basic(iter, "Netmask",
1027                                                 DBUS_TYPE_STRING, &mask);
1028         }
1029
1030         gateway = __vpn_ipconfig_get_gateway(provider->ipconfig_ipv4);
1031         if (gateway != NULL)
1032                 connman_dbus_dict_append_basic(iter, "Gateway",
1033                                                 DBUS_TYPE_STRING, &gateway);
1034
1035         peer = __vpn_ipconfig_get_peer(provider->ipconfig_ipv4);
1036         if (peer != NULL)
1037                 connman_dbus_dict_append_basic(iter, "Peer",
1038                                                 DBUS_TYPE_STRING, &peer);
1039 }
1040
1041 static void append_ipv6(DBusMessageIter *iter, void *user_data)
1042 {
1043         struct vpn_provider *provider = user_data;
1044         const char *address, *gateway, *peer;
1045
1046         address = __vpn_ipconfig_get_local(provider->ipconfig_ipv6);
1047         if (address != NULL) {
1048                 unsigned char prefixlen;
1049
1050                 connman_dbus_dict_append_basic(iter, "Address",
1051                                                 DBUS_TYPE_STRING, &address);
1052
1053                 prefixlen = __vpn_ipconfig_get_prefixlen(
1054                                                 provider->ipconfig_ipv6);
1055
1056                 connman_dbus_dict_append_basic(iter, "PrefixLength",
1057                                                 DBUS_TYPE_BYTE, &prefixlen);
1058         }
1059
1060         gateway = __vpn_ipconfig_get_gateway(provider->ipconfig_ipv6);
1061         if (gateway != NULL)
1062                 connman_dbus_dict_append_basic(iter, "Gateway",
1063                                                 DBUS_TYPE_STRING, &gateway);
1064
1065         peer = __vpn_ipconfig_get_peer(provider->ipconfig_ipv6);
1066         if (peer != NULL)
1067                 connman_dbus_dict_append_basic(iter, "Peer",
1068                                                 DBUS_TYPE_STRING, &peer);
1069 }
1070
1071 static const char *state2string(enum vpn_provider_state state)
1072 {
1073         switch (state) {
1074         case VPN_PROVIDER_STATE_UNKNOWN:
1075                 break;
1076         case VPN_PROVIDER_STATE_IDLE:
1077                 return "idle";
1078         case VPN_PROVIDER_STATE_CONNECT:
1079                 return "configuration";
1080         case VPN_PROVIDER_STATE_READY:
1081                 return "ready";
1082         case VPN_PROVIDER_STATE_DISCONNECT:
1083                 return "disconnect";
1084         case VPN_PROVIDER_STATE_FAILURE:
1085                 return "failure";
1086         }
1087
1088         return NULL;
1089 }
1090
1091 static int provider_indicate_state(struct vpn_provider *provider,
1092                                 enum vpn_provider_state state)
1093 {
1094         const char *str;
1095
1096         DBG("provider %p state %d", provider, state);
1097
1098         str = state2string(state);
1099         if (str == NULL)
1100                 return -EINVAL;
1101
1102         provider->state = state;
1103
1104         if (state == VPN_PROVIDER_STATE_READY) {
1105                 connman_dbus_property_changed_basic(provider->path,
1106                                         VPN_CONNECTION_INTERFACE, "Index",
1107                                         DBUS_TYPE_INT32, &provider->index);
1108
1109                 if (provider->family == AF_INET)
1110                         connman_dbus_property_changed_dict(provider->path,
1111                                         VPN_CONNECTION_INTERFACE, "IPv4",
1112                                         append_ipv4, provider);
1113                 else if (provider->family == AF_INET6)
1114                         connman_dbus_property_changed_dict(provider->path,
1115                                         VPN_CONNECTION_INTERFACE, "IPv6",
1116                                         append_ipv6, provider);
1117         }
1118
1119         connman_dbus_property_changed_basic(provider->path,
1120                                         VPN_CONNECTION_INTERFACE, "State",
1121                                         DBUS_TYPE_STRING, &str);
1122         return 0;
1123 }
1124
1125 static void append_nameservers(DBusMessageIter *iter, char **servers)
1126 {
1127         int i;
1128
1129         DBG("%p", servers);
1130
1131         for (i = 0; servers[i] != NULL; i++) {
1132                 DBG("servers[%d] %s", i, servers[i]);
1133                 dbus_message_iter_append_basic(iter,
1134                                         DBUS_TYPE_STRING, &servers[i]);
1135         }
1136 }
1137
1138 static void append_dns(DBusMessageIter *iter, void *user_data)
1139 {
1140         struct vpn_provider *provider = user_data;
1141
1142         if (provider->nameservers != NULL)
1143                 append_nameservers(iter, provider->nameservers);
1144 }
1145
1146 static void append_state(DBusMessageIter *iter,
1147                                         struct vpn_provider *provider)
1148 {
1149         char *str;
1150
1151         switch (provider->state) {
1152         case VPN_PROVIDER_STATE_UNKNOWN:
1153         case VPN_PROVIDER_STATE_IDLE:
1154                 str = "idle";
1155                 break;
1156         case VPN_PROVIDER_STATE_CONNECT:
1157                 str = "configuration";
1158                 break;
1159         case VPN_PROVIDER_STATE_READY:
1160                 str = "ready";
1161                 break;
1162         case VPN_PROVIDER_STATE_DISCONNECT:
1163                 str = "disconnect";
1164                 break;
1165         case VPN_PROVIDER_STATE_FAILURE:
1166                 str = "failure";
1167                 break;
1168         }
1169
1170         connman_dbus_dict_append_basic(iter, "State",
1171                                 DBUS_TYPE_STRING, &str);
1172 }
1173
1174 static void append_properties(DBusMessageIter *iter,
1175                                         struct vpn_provider *provider)
1176 {
1177         DBusMessageIter dict;
1178
1179         connman_dbus_dict_open(iter, &dict);
1180
1181         append_state(&dict, provider);
1182
1183         if (provider->type != NULL)
1184                 connman_dbus_dict_append_basic(&dict, "Type",
1185                                         DBUS_TYPE_STRING, &provider->type);
1186
1187         if (provider->name != NULL)
1188                 connman_dbus_dict_append_basic(&dict, "Name",
1189                                         DBUS_TYPE_STRING, &provider->name);
1190
1191         if (provider->host != NULL)
1192                 connman_dbus_dict_append_basic(&dict, "Host",
1193                                         DBUS_TYPE_STRING, &provider->host);
1194         if (provider->index >= 0)
1195                 connman_dbus_dict_append_basic(&dict, "Index",
1196                                         DBUS_TYPE_INT32, &provider->index);
1197         if (provider->domain != NULL)
1198                 connman_dbus_dict_append_basic(&dict, "Domain",
1199                                         DBUS_TYPE_STRING, &provider->domain);
1200
1201         if (provider->family == AF_INET)
1202                 connman_dbus_dict_append_dict(&dict, "IPv4", append_ipv4,
1203                                                 provider);
1204         else if (provider->family == AF_INET6)
1205                 connman_dbus_dict_append_dict(&dict, "IPv6", append_ipv6,
1206                                                 provider);
1207
1208         connman_dbus_dict_append_array(&dict, "Nameservers",
1209                                 DBUS_TYPE_STRING, append_dns, provider);
1210
1211         connman_dbus_dict_append_array(&dict, "UserRoutes",
1212                                 DBUS_TYPE_DICT_ENTRY, append_routes,
1213                                 provider->user_routes);
1214
1215         connman_dbus_dict_append_array(&dict, "ServerRoutes",
1216                                 DBUS_TYPE_DICT_ENTRY, append_routes,
1217                                 provider->routes);
1218
1219         connman_dbus_dict_close(iter, &dict);
1220 }
1221
1222 static connman_bool_t check_host(char **hosts, char *host)
1223 {
1224         int i;
1225
1226         if (hosts == NULL)
1227                 return FALSE;
1228
1229         for (i = 0; hosts[i] != NULL; i++) {
1230                 if (g_strcmp0(hosts[i], host) == 0)
1231                         return TRUE;
1232         }
1233
1234         return FALSE;
1235 }
1236
1237 static void provider_append_routes(gpointer key, gpointer value,
1238                                         gpointer user_data)
1239 {
1240         struct vpn_route *route = value;
1241         struct vpn_provider *provider = user_data;
1242         int index = provider->index;
1243
1244         /*
1245          * If the VPN administrator/user has given a route to
1246          * VPN server, then we must discard that because the
1247          * server cannot be contacted via VPN tunnel.
1248          */
1249         if (check_host(provider->host_ip, route->network) == TRUE) {
1250                 DBG("Discarding VPN route to %s via %s at index %d",
1251                         route->network, route->gateway, index);
1252                 return;
1253         }
1254
1255         if (route->family == AF_INET6) {
1256                 unsigned char prefix_len = atoi(route->netmask);
1257
1258                 connman_inet_add_ipv6_network_route(index, route->network,
1259                                                         route->gateway,
1260                                                         prefix_len);
1261         } else {
1262                 connman_inet_add_network_route(index, route->network,
1263                                                 route->gateway,
1264                                                 route->netmask);
1265         }
1266 }
1267
1268 static int set_connected(struct vpn_provider *provider,
1269                                         connman_bool_t connected)
1270 {
1271         struct vpn_ipconfig *ipconfig;
1272
1273         DBG("provider %p id %s connected %d", provider,
1274                                         provider->identifier, connected);
1275
1276         if (connected == TRUE) {
1277                 if (provider->family == AF_INET6)
1278                         ipconfig = provider->ipconfig_ipv6;
1279                 else
1280                         ipconfig = provider->ipconfig_ipv4;
1281
1282                 __vpn_ipconfig_address_add(ipconfig, provider->family);
1283                 __vpn_ipconfig_gateway_add(ipconfig, provider->family);
1284
1285                 provider_indicate_state(provider,
1286                                         VPN_PROVIDER_STATE_READY);
1287
1288                 g_hash_table_foreach(provider->routes, provider_append_routes,
1289                                         provider);
1290
1291                 g_hash_table_foreach(provider->user_routes,
1292                                         provider_append_routes, provider);
1293
1294         } else {
1295                 provider_indicate_state(provider,
1296                                         VPN_PROVIDER_STATE_DISCONNECT);
1297
1298                 provider_indicate_state(provider,
1299                                         VPN_PROVIDER_STATE_IDLE);
1300         }
1301
1302         return 0;
1303 }
1304
1305 int vpn_provider_set_state(struct vpn_provider *provider,
1306                                         enum vpn_provider_state state)
1307 {
1308         if (provider == NULL)
1309                 return -EINVAL;
1310
1311         switch (state) {
1312         case VPN_PROVIDER_STATE_UNKNOWN:
1313                 return -EINVAL;
1314         case VPN_PROVIDER_STATE_IDLE:
1315                 return set_connected(provider, FALSE);
1316         case VPN_PROVIDER_STATE_CONNECT:
1317                 return provider_indicate_state(provider, state);
1318         case VPN_PROVIDER_STATE_READY:
1319                 return set_connected(provider, TRUE);
1320         case VPN_PROVIDER_STATE_DISCONNECT:
1321                 return provider_indicate_state(provider, state);
1322         case VPN_PROVIDER_STATE_FAILURE:
1323                 return provider_indicate_state(provider, state);
1324         }
1325         return -EINVAL;
1326 }
1327
1328 int vpn_provider_indicate_error(struct vpn_provider *provider,
1329                                         enum vpn_provider_error error)
1330 {
1331         DBG("provider %p id %s error %d", provider, provider->identifier,
1332                                                                         error);
1333
1334         switch (error) {
1335         case VPN_PROVIDER_ERROR_LOGIN_FAILED:
1336                 break;
1337         case VPN_PROVIDER_ERROR_AUTH_FAILED:
1338                 break;
1339         case VPN_PROVIDER_ERROR_CONNECT_FAILED:
1340                 break;
1341         default:
1342                 break;
1343         }
1344
1345         return 0;
1346 }
1347
1348 static void unregister_provider(gpointer data)
1349 {
1350         struct vpn_provider *provider = data;
1351
1352         configuration_count_del();
1353
1354         vpn_provider_unref(provider);
1355 }
1356
1357 static void provider_initialize(struct vpn_provider *provider)
1358 {
1359         DBG("provider %p", provider);
1360
1361         provider->index = 0;
1362         provider->fd = -1;
1363         provider->name = NULL;
1364         provider->type = NULL;
1365         provider->domain = NULL;
1366         provider->identifier = NULL;
1367         provider->user_networks = NULL;
1368         provider->routes = g_hash_table_new_full(g_direct_hash, g_direct_equal,
1369                                         NULL, free_route);
1370         provider->user_routes = g_hash_table_new_full(g_str_hash, g_str_equal,
1371                                         g_free, free_route);
1372         provider->setting_strings = g_hash_table_new_full(g_str_hash,
1373                                                 g_str_equal, g_free, g_free);
1374 }
1375
1376 static struct vpn_provider *vpn_provider_new(void)
1377 {
1378         struct vpn_provider *provider;
1379
1380         provider = g_try_new0(struct vpn_provider, 1);
1381         if (provider == NULL)
1382                 return NULL;
1383
1384         provider->refcount = 1;
1385
1386         DBG("provider %p", provider);
1387         provider_initialize(provider);
1388
1389         return provider;
1390 }
1391
1392 static struct vpn_provider *vpn_provider_get(const char *identifier)
1393 {
1394         struct vpn_provider *provider;
1395
1396         provider = g_hash_table_lookup(provider_hash, identifier);
1397         if (provider != NULL)
1398                 return provider;
1399
1400         provider = vpn_provider_new();
1401         if (provider == NULL)
1402                 return NULL;
1403
1404         DBG("provider %p", provider);
1405
1406         provider->identifier = g_strdup(identifier);
1407
1408         g_hash_table_insert(provider_hash, provider->identifier, provider);
1409
1410         configuration_count_add();
1411
1412         return provider;
1413 }
1414
1415 static void provider_dbus_ident(char *ident)
1416 {
1417         int i, len = strlen(ident);
1418
1419         for (i = 0; i < len; i++) {
1420                 if (ident[i] >= '0' && ident[i] <= '9')
1421                         continue;
1422                 if (ident[i] >= 'a' && ident[i] <= 'z')
1423                         continue;
1424                 if (ident[i] >= 'A' && ident[i] <= 'Z')
1425                         continue;
1426                 ident[i] = '_';
1427         }
1428 }
1429
1430 static int connection_unregister(struct vpn_provider *provider)
1431 {
1432         if (provider->path == NULL)
1433                 return -EALREADY;
1434
1435         g_dbus_unregister_interface(connection, provider->path,
1436                                 VPN_CONNECTION_INTERFACE);
1437
1438         g_free(provider->path);
1439         provider->path = NULL;
1440
1441         return 0;
1442 }
1443
1444 static int connection_register(struct vpn_provider *provider)
1445 {
1446         DBG("provider %p path %s", provider, provider->path);
1447
1448         if (provider->path != NULL)
1449                 return -EALREADY;
1450
1451         provider->path = g_strdup_printf("%s/connection/%s", VPN_PATH,
1452                                                 provider->identifier);
1453
1454         g_dbus_register_interface(connection, provider->path,
1455                                 VPN_CONNECTION_INTERFACE,
1456                                 connection_methods, connection_signals,
1457                                 NULL, provider, NULL);
1458
1459         return 0;
1460 }
1461
1462 static struct vpn_provider *provider_create_from_keyfile(GKeyFile *keyfile,
1463                 const char *ident)
1464 {
1465         struct vpn_provider *provider;
1466
1467         if (keyfile == NULL || ident == NULL)
1468                 return NULL;
1469
1470         provider = vpn_provider_lookup(ident);
1471         if (provider == NULL) {
1472                 provider = vpn_provider_get(ident);
1473                 if (provider == NULL) {
1474                         DBG("can not create provider");
1475                         return NULL;
1476                 }
1477
1478                 provider_load_from_keyfile(provider, keyfile);
1479
1480                 if (provider->name == NULL || provider->host == NULL ||
1481                                 provider->domain == NULL) {
1482                         DBG("cannot get name, host or domain");
1483                         vpn_provider_unref(provider);
1484                         return NULL;
1485                 }
1486
1487                 if (provider_register(provider) == 0)
1488                         connection_register(provider);
1489         }
1490         return provider;
1491 }
1492
1493 static void provider_create_all_from_type(const char *provider_type)
1494 {
1495         unsigned int i;
1496         char **providers;
1497         char *id, *type;
1498         GKeyFile *keyfile;
1499
1500         DBG("provider type %s", provider_type);
1501
1502         providers = __connman_storage_get_providers();
1503
1504         for (i = 0; providers[i] != NULL; i+=1) {
1505
1506                 if (strncmp(providers[i], "provider_", 9) != 0)
1507                         continue;
1508
1509                 id = providers[i] + 9;
1510                 keyfile = __connman_storage_load_provider(id);
1511
1512                 if (keyfile == NULL)
1513                         continue;
1514
1515                 type = g_key_file_get_string(keyfile, id, "Type", NULL);
1516
1517                 DBG("keyfile %p id %s type %s", keyfile, id, type);
1518
1519                 if (strcmp(provider_type, type) != 0) {
1520                         g_free(type);
1521                         g_key_file_free(keyfile);
1522                         continue;
1523                 }
1524
1525                 if (provider_create_from_keyfile(keyfile, id) == NULL)
1526                         DBG("could not create provider");
1527
1528                 g_free(type);
1529                 g_key_file_free(keyfile);
1530         }
1531         g_strfreev(providers);
1532 }
1533
1534 int __vpn_provider_create_and_connect(DBusMessage *msg)
1535 {
1536         struct vpn_provider *provider;
1537         DBusMessageIter iter, array;
1538         const char *type = NULL, *name = NULL;
1539         const char *host = NULL, *domain = NULL;
1540         GSList *networks = NULL;
1541         char *ident;
1542         int err;
1543
1544         dbus_message_iter_init(msg, &iter);
1545         dbus_message_iter_recurse(&iter, &array);
1546
1547         while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_DICT_ENTRY) {
1548                 DBusMessageIter entry, value;
1549                 const char *key;
1550
1551                 dbus_message_iter_recurse(&array, &entry);
1552                 dbus_message_iter_get_basic(&entry, &key);
1553
1554                 dbus_message_iter_next(&entry);
1555                 dbus_message_iter_recurse(&entry, &value);
1556
1557                 switch (dbus_message_iter_get_arg_type(&value)) {
1558                 case DBUS_TYPE_STRING:
1559                         if (g_str_equal(key, "Type") == TRUE)
1560                                 dbus_message_iter_get_basic(&value, &type);
1561                         else if (g_str_equal(key, "Name") == TRUE)
1562                                 dbus_message_iter_get_basic(&value, &name);
1563                         else if (g_str_equal(key, "Host") == TRUE)
1564                                 dbus_message_iter_get_basic(&value, &host);
1565                         else if (g_str_equal(key, "VPN.Domain") == TRUE)
1566                                 dbus_message_iter_get_basic(&value, &domain);
1567                         break;
1568                 case DBUS_TYPE_ARRAY:
1569                         if (g_str_equal(key, "UserRoutes") == TRUE)
1570                                 networks = get_user_networks(&value);
1571                         break;
1572                 }
1573
1574                 dbus_message_iter_next(&array);
1575         }
1576
1577         if (host == NULL || domain == NULL)
1578                 return -EINVAL;
1579
1580         DBG("Type %s name %s networks %p", type, name, networks);
1581
1582         if (type == NULL || name == NULL)
1583                 return -EOPNOTSUPP;
1584
1585         ident = g_strdup_printf("%s_%s", host, domain);
1586         provider_dbus_ident(ident);
1587
1588         DBG("ident %s", ident);
1589
1590         provider = vpn_provider_lookup(ident);
1591         if (provider == NULL) {
1592                 provider = vpn_provider_get(ident);
1593                 if (provider == NULL) {
1594                         DBG("can not create provider");
1595                         g_free(ident);
1596                         return -EOPNOTSUPP;
1597                 }
1598
1599                 provider->host = g_strdup(host);
1600                 provider->domain = g_strdup(domain);
1601                 provider->name = g_strdup(name);
1602                 provider->type = g_strdup(type);
1603
1604                 if (provider_register(provider) == 0)
1605                         vpn_provider_load(provider);
1606
1607                 provider_resolv_host_addr(provider);
1608         }
1609
1610         if (networks != NULL) {
1611                 g_slist_free_full(provider->user_networks, free_route);
1612                 provider->user_networks = networks;
1613                 set_user_networks(provider, provider->user_networks);
1614         }
1615
1616         dbus_message_iter_init(msg, &iter);
1617         dbus_message_iter_recurse(&iter, &array);
1618
1619         while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_DICT_ENTRY) {
1620                 DBusMessageIter entry, value;
1621                 const char *key, *str;
1622
1623                 dbus_message_iter_recurse(&array, &entry);
1624                 dbus_message_iter_get_basic(&entry, &key);
1625
1626                 dbus_message_iter_next(&entry);
1627                 dbus_message_iter_recurse(&entry, &value);
1628
1629                 switch (dbus_message_iter_get_arg_type(&value)) {
1630                 case DBUS_TYPE_STRING:
1631                         dbus_message_iter_get_basic(&value, &str);
1632                         vpn_provider_set_string(provider, key, str);
1633                         break;
1634                 }
1635
1636                 dbus_message_iter_next(&array);
1637         }
1638
1639         g_free(ident);
1640
1641         provider->pending_msg = dbus_message_ref(msg);
1642
1643         DBG("provider %p pending %p", provider, provider->pending_msg);
1644
1645         if (provider->index > 0) {
1646                 DBG("provider already connected");
1647         } else {
1648                 err = __vpn_provider_connect(provider);
1649                 if (err < 0 && err != -EINPROGRESS)
1650                         goto failed;
1651         }
1652
1653         vpn_provider_save(provider);
1654
1655         return 0;
1656
1657 failed:
1658         DBG("Can not connect (%d), deleting provider %p %s", err, provider,
1659                 provider->identifier);
1660
1661         vpn_provider_indicate_error(provider,
1662                                 VPN_PROVIDER_ERROR_CONNECT_FAILED);
1663
1664         g_hash_table_remove(provider_hash, provider->identifier);
1665
1666         return err;
1667 }
1668
1669 static void append_connection_structs(DBusMessageIter *iter, void *user_data)
1670 {
1671         DBusMessageIter entry;
1672         GHashTableIter hash;
1673         gpointer value, key;
1674
1675         g_hash_table_iter_init(&hash, provider_hash);
1676
1677         while (g_hash_table_iter_next(&hash, &key, &value) == TRUE) {
1678                 struct vpn_provider *provider = value;
1679
1680                 DBG("path %s", provider->path);
1681
1682                 if (provider->identifier == NULL)
1683                         continue;
1684
1685                 dbus_message_iter_open_container(iter, DBUS_TYPE_STRUCT,
1686                                 NULL, &entry);
1687                 dbus_message_iter_append_basic(&entry, DBUS_TYPE_OBJECT_PATH,
1688                                 &provider->path);
1689                 append_properties(&entry, provider);
1690                 dbus_message_iter_close_container(iter, &entry);
1691         }
1692 }
1693
1694 DBusMessage *__vpn_provider_get_connections(DBusMessage *msg)
1695 {
1696         DBusMessage *reply;
1697
1698         DBG("");
1699
1700         reply = dbus_message_new_method_return(msg);
1701         if (reply == NULL)
1702                 return NULL;
1703
1704         __connman_dbus_append_objpath_dict_array(reply,
1705                         append_connection_structs, NULL);
1706
1707         return reply;
1708 }
1709
1710 const char * __vpn_provider_get_ident(struct vpn_provider *provider)
1711 {
1712         if (provider == NULL)
1713                 return NULL;
1714
1715         return provider->identifier;
1716 }
1717
1718 int vpn_provider_set_string(struct vpn_provider *provider,
1719                                         const char *key, const char *value)
1720 {
1721         DBG("provider %p key %s value %s", provider, key, value);
1722
1723         if (g_str_equal(key, "Type") == TRUE) {
1724                 g_free(provider->type);
1725                 provider->type = g_strdup(value);
1726         } else if (g_str_equal(key, "Name") == TRUE) {
1727                 g_free(provider->name);
1728                 provider->name = g_strdup(value);
1729         } else if (g_str_equal(key, "Host") == TRUE) {
1730                 g_free(provider->host);
1731                 provider->host = g_strdup(value);
1732         } else if (g_str_equal(key, "VPN.Domain") == TRUE) {
1733                 g_free(provider->domain);
1734                 provider->domain = g_strdup(value);
1735         } else
1736                 g_hash_table_replace(provider->setting_strings,
1737                                 g_strdup(key), g_strdup(value));
1738         return 0;
1739 }
1740
1741 const char *vpn_provider_get_string(struct vpn_provider *provider,
1742                                                         const char *key)
1743 {
1744         DBG("provider %p key %s", provider, key);
1745
1746         if (g_str_equal(key, "Type") == TRUE)
1747                 return provider->type;
1748         else if (g_str_equal(key, "Name") == TRUE)
1749                 return provider->name;
1750         else if (g_str_equal(key, "Host") == TRUE)
1751                 return provider->host;
1752         else if (g_str_equal(key, "VPN.Domain") == TRUE)
1753                 return provider->domain;
1754
1755         return g_hash_table_lookup(provider->setting_strings, key);
1756 }
1757
1758 connman_bool_t __vpn_provider_check_routes(struct vpn_provider *provider)
1759 {
1760         if (provider == NULL)
1761                 return FALSE;
1762
1763         if (provider->user_routes != NULL &&
1764                         g_hash_table_size(provider->user_routes) > 0)
1765                 return TRUE;
1766
1767         if (provider->routes != NULL &&
1768                         g_hash_table_size(provider->routes) > 0)
1769                 return TRUE;
1770
1771         return FALSE;
1772 }
1773
1774 void *vpn_provider_get_data(struct vpn_provider *provider)
1775 {
1776         return provider->driver_data;
1777 }
1778
1779 void vpn_provider_set_data(struct vpn_provider *provider, void *data)
1780 {
1781         provider->driver_data = data;
1782 }
1783
1784 void vpn_provider_set_index(struct vpn_provider *provider, int index)
1785 {
1786         DBG("index %d provider %p pending %p", index, provider,
1787                 provider->pending_msg);
1788
1789         if (provider->pending_msg != NULL) {
1790                 g_dbus_send_reply(connection, provider->pending_msg,
1791                                 DBUS_TYPE_STRING, &provider->identifier,
1792                                 DBUS_TYPE_INT32, &index,
1793                                 DBUS_TYPE_INVALID);
1794                 dbus_message_unref(provider->pending_msg);
1795                 provider->pending_msg = NULL;
1796         }
1797
1798         if (provider->ipconfig_ipv4 == NULL) {
1799                 provider->ipconfig_ipv4 = __vpn_ipconfig_create(index,
1800                                                                 AF_INET);
1801                 if (provider->ipconfig_ipv4 == NULL) {
1802                         DBG("Couldnt create ipconfig for IPv4");
1803                         goto done;
1804                 }
1805         }
1806
1807         __vpn_ipconfig_set_index(provider->ipconfig_ipv4, index);
1808
1809         if (provider->ipconfig_ipv6 == NULL) {
1810                 provider->ipconfig_ipv6 = __vpn_ipconfig_create(index,
1811                                                                 AF_INET6);
1812                 if (provider->ipconfig_ipv6 == NULL) {
1813                         DBG("Couldnt create ipconfig for IPv6");
1814                         goto done;
1815                 }
1816         }
1817
1818         __vpn_ipconfig_set_index(provider->ipconfig_ipv6, index);
1819
1820 done:
1821         provider->index = index;
1822 }
1823
1824 int vpn_provider_get_index(struct vpn_provider *provider)
1825 {
1826         return provider->index;
1827 }
1828
1829 int vpn_provider_set_ipaddress(struct vpn_provider *provider,
1830                                         struct connman_ipaddress *ipaddress)
1831 {
1832         struct vpn_ipconfig *ipconfig = NULL;
1833
1834         switch (ipaddress->family) {
1835         case AF_INET:
1836                 ipconfig = provider->ipconfig_ipv4;
1837                 break;
1838         case AF_INET6:
1839                 ipconfig = provider->ipconfig_ipv6;
1840                 break;
1841         default:
1842                 break;
1843         }
1844
1845         DBG("provider %p ipconfig %p family %d", provider, ipconfig,
1846                                                         ipaddress->family);
1847
1848         if (ipconfig == NULL)
1849                 return -EINVAL;
1850
1851         provider->family = ipaddress->family;
1852
1853         __vpn_ipconfig_set_local(ipconfig, ipaddress->local);
1854         __vpn_ipconfig_set_peer(ipconfig, ipaddress->peer);
1855         __vpn_ipconfig_set_broadcast(ipconfig, ipaddress->broadcast);
1856         __vpn_ipconfig_set_gateway(ipconfig, ipaddress->gateway);
1857         __vpn_ipconfig_set_prefixlen(ipconfig, ipaddress->prefixlen);
1858
1859         return 0;
1860 }
1861
1862 int vpn_provider_set_pac(struct vpn_provider *provider,
1863                                 const char *pac)
1864 {
1865         DBG("provider %p pac %s", provider, pac);
1866
1867         return 0;
1868 }
1869
1870
1871 int vpn_provider_set_domain(struct vpn_provider *provider,
1872                                         const char *domain)
1873 {
1874         DBG("provider %p domain %s", provider, domain);
1875
1876         g_free(provider->domain);
1877         provider->domain = g_strdup(domain);
1878
1879         return 0;
1880 }
1881
1882 int vpn_provider_set_nameservers(struct vpn_provider *provider,
1883                                         const char *nameservers)
1884 {
1885         DBG("provider %p nameservers %s", provider, nameservers);
1886
1887         g_strfreev(provider->nameservers);
1888         provider->nameservers = NULL;
1889
1890         if (nameservers == NULL)
1891                 return 0;
1892
1893         provider->nameservers = g_strsplit(nameservers, " ", 0);
1894
1895         return 0;
1896 }
1897
1898 enum provider_route_type {
1899         PROVIDER_ROUTE_TYPE_NONE = 0,
1900         PROVIDER_ROUTE_TYPE_MASK = 1,
1901         PROVIDER_ROUTE_TYPE_ADDR = 2,
1902         PROVIDER_ROUTE_TYPE_GW   = 3,
1903 };
1904
1905 static int route_env_parse(struct vpn_provider *provider, const char *key,
1906                                 int *family, unsigned long *idx,
1907                                 enum provider_route_type *type)
1908 {
1909         char *end;
1910         const char *start;
1911
1912         DBG("name %s", provider->name);
1913
1914         if (!strcmp(provider->type, "openvpn")) {
1915                 if (g_str_has_prefix(key, "route_network_") == TRUE) {
1916                         start = key + strlen("route_network_");
1917                         *type = PROVIDER_ROUTE_TYPE_ADDR;
1918                 } else if (g_str_has_prefix(key, "route_netmask_") == TRUE) {
1919                         start = key + strlen("route_netmask_");
1920                         *type = PROVIDER_ROUTE_TYPE_MASK;
1921                 } else if (g_str_has_prefix(key, "route_gateway_") == TRUE) {
1922                         start = key + strlen("route_gateway_");
1923                         *type = PROVIDER_ROUTE_TYPE_GW;
1924                 } else
1925                         return -EINVAL;
1926
1927                 *family = AF_INET;
1928                 *idx = g_ascii_strtoull(start, &end, 10);
1929
1930         } else if (!strcmp(provider->type, "openconnect")) {
1931                 if (g_str_has_prefix(key, "CISCO_SPLIT_INC_") == TRUE) {
1932                         *family = AF_INET;
1933                         start = key + strlen("CISCO_SPLIT_INC_");
1934                 } else if (g_str_has_prefix(key,
1935                                         "CISCO_IPV6_SPLIT_INC_") == TRUE) {
1936                         *family = AF_INET6;
1937                         start = key + strlen("CISCO_IPV6_SPLIT_INC_");
1938                 } else
1939                         return -EINVAL;
1940
1941                 *idx = g_ascii_strtoull(start, &end, 10);
1942
1943                 if (strncmp(end, "_ADDR", 5) == 0)
1944                         *type = PROVIDER_ROUTE_TYPE_ADDR;
1945                 else if (strncmp(end, "_MASK", 5) == 0)
1946                         *type = PROVIDER_ROUTE_TYPE_MASK;
1947                 else if (strncmp(end, "_MASKLEN", 8) == 0 &&
1948                                 *family == AF_INET6) {
1949                         *type = PROVIDER_ROUTE_TYPE_MASK;
1950                 } else
1951                         return -EINVAL;
1952         }
1953
1954         return 0;
1955 }
1956
1957 int vpn_provider_append_route(struct vpn_provider *provider,
1958                                         const char *key, const char *value)
1959 {
1960         struct vpn_route *route;
1961         int ret, family = 0;
1962         unsigned long idx = 0;
1963         enum provider_route_type type = PROVIDER_ROUTE_TYPE_NONE;
1964
1965         DBG("key %s value %s", key, value);
1966
1967         ret = route_env_parse(provider, key, &family, &idx, &type);
1968         if (ret < 0)
1969                 return ret;
1970
1971         DBG("idx %lu family %d type %d", idx, family, type);
1972
1973         route = g_hash_table_lookup(provider->routes, GINT_TO_POINTER(idx));
1974         if (route == NULL) {
1975                 route = g_try_new0(struct vpn_route, 1);
1976                 if (route == NULL) {
1977                         connman_error("out of memory");
1978                         return -ENOMEM;
1979                 }
1980
1981                 route->family = family;
1982
1983                 g_hash_table_replace(provider->routes, GINT_TO_POINTER(idx),
1984                                                 route);
1985         }
1986
1987         switch (type) {
1988         case PROVIDER_ROUTE_TYPE_NONE:
1989                 break;
1990         case PROVIDER_ROUTE_TYPE_MASK:
1991                 route->netmask = g_strdup(value);
1992                 break;
1993         case PROVIDER_ROUTE_TYPE_ADDR:
1994                 route->network = g_strdup(value);
1995                 break;
1996         case PROVIDER_ROUTE_TYPE_GW:
1997                 route->gateway = g_strdup(value);
1998                 break;
1999         }
2000
2001         return 0;
2002 }
2003
2004 const char *vpn_provider_get_driver_name(struct vpn_provider *provider)
2005 {
2006         if (provider->driver == NULL)
2007                 return NULL;
2008
2009         return provider->driver->name;
2010 }
2011
2012 const char *vpn_provider_get_save_group(struct vpn_provider *provider)
2013 {
2014         return provider->identifier;
2015 }
2016
2017 static gint compare_priority(gconstpointer a, gconstpointer b)
2018 {
2019         return 0;
2020 }
2021
2022 static void clean_provider(gpointer key, gpointer value, gpointer user_data)
2023 {
2024         struct vpn_provider *provider = value;
2025
2026         if (provider->driver != NULL && provider->driver->remove)
2027                 provider->driver->remove(provider);
2028
2029         connection_unregister(provider);
2030 }
2031
2032 int vpn_provider_driver_register(struct vpn_provider_driver *driver)
2033 {
2034         DBG("driver %p name %s", driver, driver->name);
2035
2036         driver_list = g_slist_insert_sorted(driver_list, driver,
2037                                                         compare_priority);
2038         provider_create_all_from_type(driver->name);
2039         return 0;
2040 }
2041
2042 void vpn_provider_driver_unregister(struct vpn_provider_driver *driver)
2043 {
2044         DBG("driver %p name %s", driver, driver->name);
2045
2046         driver_list = g_slist_remove(driver_list, driver);
2047 }
2048
2049 int __vpn_provider_init(void)
2050 {
2051         DBG("");
2052
2053         connection = connman_dbus_get_connection();
2054
2055         provider_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
2056                                                 NULL, unregister_provider);
2057
2058         return 0;
2059 }
2060
2061 void __vpn_provider_cleanup(void)
2062 {
2063         DBG("");
2064
2065         g_hash_table_foreach(provider_hash, clean_provider, NULL);
2066
2067         g_hash_table_destroy(provider_hash);
2068         provider_hash = NULL;
2069
2070         dbus_connection_unref(connection);
2071 }