X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fservice.c;h=dbd36f339548504f24f77866b7ffaa275851b1c2;hb=HEAD;hp=bf5c11bec2f5f02dc9c2c5ea8b0cb7b6c7a8d7a7;hpb=3f10ee1199ce6255786fab4bc4c337c1ad476503;p=platform%2Fupstream%2Fconnman.git diff --git a/src/service.c b/src/service.c index bf5c11b..2ac5a04 100755 --- a/src/service.c +++ b/src/service.c @@ -7344,13 +7344,90 @@ bool __connman_service_remove(struct connman_service *service) return true; } +#if defined TIZEN_EXT +static char *__connman_service_get_wpa_id_to_remove(struct connman_service *service) +{ + char *identifier; + char *ptr; + + if (service->type != CONNMAN_SERVICE_TYPE_WIFI) + return NULL; + + if (service->security != CONNMAN_SERVICE_SECURITY_SAE && + service->security != CONNMAN_SERVICE_SECURITY_PSK) + return NULL; + + identifier = g_strdup(service->identifier); + if (!identifier) + return NULL; + + if (service->security == CONNMAN_SERVICE_SECURITY_SAE) { + ptr = strstr(identifier, "_sae"); + if (!ptr) { + g_free(identifier); + return NULL; + } + + memcpy(ptr, "_psk", strlen("_psk")); + } else if (service->security == CONNMAN_SERVICE_SECURITY_PSK) { + ptr = strstr(identifier, "_psk"); + if (!ptr) { + g_free(identifier); + return NULL; + } + + memcpy(ptr, "_sae", strlen("_sae")); + } + + return identifier; +} + + +static void __connman_service_remove_wpa_service(struct connman_service *service) +{ + gchar *dir; + GList *list; + char *identifier = __connman_service_get_wpa_id_to_remove(service); + + if (!identifier) + return; + + dir = g_strdup_printf("%s/%s", STORAGEDIR, identifier); + if (!dir) + goto done; + + if (g_file_test(dir, G_FILE_TEST_EXISTS) != TRUE) + goto done; + + for (list = service_list; list; list = list->next) { + struct connman_service *dst_service = list->data; + + if (dst_service->type != CONNMAN_SERVICE_TYPE_WIFI) + continue; + + if (g_strcmp0(dst_service->identifier, identifier) == 0) { + __connman_service_remove(dst_service); + goto done; + } + } + + __connman_storage_remove_service(identifier); + +done: + g_free(identifier); + g_free(dir); +} +#endif + static DBusMessage *remove_service(DBusConnection *conn, DBusMessage *msg, void *user_data) { struct connman_service *service = user_data; DBG("service %p", service); - +#if defined TIZEN_EXT + __connman_service_remove_wpa_service(service); +#endif if (!__connman_service_remove(service)) return __connman_error_not_supported(msg); @@ -10562,6 +10639,65 @@ static struct connman_service *service_get(const char *identifier) return service; } +#if defined TIZEN_EXT +static void service_load_wpa_passphrase(struct connman_service *service) +{ + char *identifier; + char *ptr; + GKeyFile *keyfile; + bool favorite; + bool autoconnect; + char *passphrase; + + if (service->security != CONNMAN_SERVICE_SECURITY_SAE) + return; + + if (service->passphrase) + return; + + if (!service->identifier) + return; + + identifier = g_strdup(service->identifier); + if (!identifier) + return; + + ptr = strstr(identifier, "_sae"); + if (!ptr) { + g_free(identifier); + return; + } + + memcpy(ptr, "_psk", strlen("_psk")); + + keyfile = connman_storage_load_service(identifier); + if (!keyfile) { + g_free(identifier); + return; + } + + favorite = g_key_file_get_boolean(keyfile, identifier, "Favorite", NULL); + autoconnect = g_key_file_get_boolean(keyfile, identifier, "AutoConnect", NULL); + + if (!favorite || !autoconnect) { + g_free(identifier); + g_key_file_free(keyfile); + return; + } + + passphrase = g_key_file_get_string(keyfile, identifier, "Passphrase", NULL); + if (passphrase) { + service->passphrase = g_strdup(passphrase); + service->favorite = favorite; + service->autoconnect = autoconnect; + } + + g_free(identifier); + g_free(passphrase); + g_key_file_free(keyfile); +} +#endif + static int service_register(struct connman_service *service) { #if defined TIZEN_EXT @@ -10580,6 +10716,7 @@ static int service_register(struct connman_service *service) #if defined TIZEN_EXT int ret; service_load(service); + service_load_wpa_passphrase(service); if (TIZEN_INS_ENABLED) { ret = service_ext_load(service);