X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fwifi-config.c;h=97b9c6d4a55a66567be08ec8008148da0cda6cbe;hb=4d049dc6877bf31694283630ce72a2736108c5a1;hp=aea051b8f86ed3f8d00c3f1d59ab621a9085cab2;hpb=c955b04ec785ee8bfcb5df372625580988317369;p=platform%2Fcore%2Fconnectivity%2Fnet-config.git diff --git a/src/wifi-config.c b/src/wifi-config.c index aea051b..97b9c6d 100755 --- a/src/wifi-config.c +++ b/src/wifi-config.c @@ -25,6 +25,9 @@ #include #include #include +#include +#include +#include #include @@ -50,17 +53,33 @@ #define WIFI_MAC_ADD_LENGTH 17 #define WIFI_MAC_ADD_PATH "/sys/class/net/wlan0/address" +#define NET_DNS_ADDR_MAX 2 + +#define MAX_WIFI_PROFILES 200 + struct wifi_eap_config { gchar *anonymous_identity; gchar *ca_cert; gchar *client_cert; gchar *private_key; + gchar *private_key_password; gchar *identity; gchar *eap_type; gchar *eap_auth_type; gchar *subject_match; }; +typedef struct { + gchar *ip_address; + gchar *subnet_mask; + gchar *gateway_address; + gchar *dns_address[NET_DNS_ADDR_MAX]; + int prefix_length; + int dns_count; + gchar *ip_type; + gchar *dns_type; +} wifi_ip_info_s; + struct wifi_config { gchar *name; gchar *ssid; @@ -69,8 +88,10 @@ struct wifi_config { gboolean favorite; gboolean autoconnect; gchar *is_hidden; + gboolean is_created; gchar *proxy_address; struct wifi_eap_config *eap_config; + wifi_ip_info_s *ip_info; gchar *last_error; }; @@ -91,12 +112,29 @@ static void __free_wifi_configuration(struct wifi_config *conf) g_free(conf->eap_config->ca_cert); g_free(conf->eap_config->client_cert); g_free(conf->eap_config->private_key); + g_free(conf->eap_config->private_key_password); g_free(conf->eap_config->identity); g_free(conf->eap_config->eap_type); g_free(conf->eap_config->eap_auth_type); g_free(conf->eap_config->subject_match); g_free(conf->eap_config); } + + if (conf->ip_info) { + g_free(conf->ip_info->ip_type); + g_free(conf->ip_info->ip_address); + g_free(conf->ip_info->subnet_mask); + g_free(conf->ip_info->gateway_address); + g_free(conf->ip_info->dns_type); + conf->ip_info->prefix_length = 0; + + int i = 0, count = conf->ip_info->dns_count; + while (i < count) { + g_free(conf->ip_info->dns_address[i]); + i++; + } + g_free(conf->ip_info); + } g_free(conf); } @@ -152,11 +190,12 @@ static gboolean __get_mac_address(gchar **mac_address) } mac[12] = '\0'; *mac_address = g_strdup(mac); + g_free(tmp); return TRUE; } -static gboolean __get_group_name(const gchar *prefix, const gchar *config_id, gchar **group_name) +gboolean wifi_config_get_group_name(const gchar *prefix, const gchar *config_id, gchar **group_name) { gchar *mac_address = NULL; gchar *g_name = NULL; @@ -264,7 +303,6 @@ static gboolean __remove_configuration(const gchar *pathname) ERR("Cannot remove [%s]", pathname); return FALSE; } - return TRUE; } @@ -275,7 +313,7 @@ static gboolean _load_configuration(const gchar *config_id, struct wifi_config * gboolean hidden = FALSE; gboolean ret = FALSE; - ret = __get_group_name(WIFI_CONFIG_PREFIX, config_id, &group_name); + ret = wifi_config_get_group_name(WIFI_CONFIG_PREFIX, config_id, &group_name); if (ret != TRUE) { ERR("Fail to get_wifi_config_group_name"); return FALSE; @@ -300,6 +338,9 @@ static gboolean _load_configuration(const gchar *config_id, struct wifi_config * } DBG("security_type [%s]", config->security_type); + config->passphrase = g_key_file_get_string(keyfile, group_name, WIFI_CONFIG_PASSPHRASE, NULL); + DBG("passphrase []"); + config->proxy_address = g_key_file_get_string(keyfile, group_name, WIFI_CONFIG_PROXY_SERVER, NULL); if (config->proxy_address) DBG("proxy_address [%s]", config->proxy_address); @@ -311,11 +352,73 @@ static gboolean _load_configuration(const gchar *config_id, struct wifi_config * config->is_hidden = g_strdup("FALSE"); DBG("is_hidden [%s]", config->is_hidden); + if (config->ip_info) { + GError *error = NULL; + config->ip_info->ip_type = g_key_file_get_string(keyfile, group_name, + WIFI_CONFIG_IPV4_METHOD, NULL); + if (config->ip_info->ip_type) + DBG("IPv4.Method:%s", config->ip_info->ip_type); + + config->ip_info->ip_address = g_key_file_get_string(keyfile, group_name, + WIFI_CONFIG_IPV4_ADDRESS, NULL); + if (config->ip_info->ip_address) + DBG("IPv4.Address:%s", config->ip_info->ip_address); + + int prefix_len; + in_addr_t addr; + struct in_addr netmask; + char *mask; + prefix_len = g_key_file_get_integer(keyfile, group_name, + WIFI_CONFIG_IPV4_SUBNET_MASK, &error); + if (error != NULL) { + DBG("g_key_file_get_integer failed error[%d: %s]", error->code, error->message); + g_error_free(error); + } else { + if (prefix_len > 0 && prefix_len < 32) { + addr = 0xffffffff << (32 - prefix_len); + netmask.s_addr = htonl(addr); + mask = inet_ntoa(netmask); + config->ip_info->subnet_mask = g_strdup(mask); + } + if (config->ip_info->subnet_mask) + DBG("IPv4.SubnetMask:%s", config->ip_info->subnet_mask); + } + + config->ip_info->gateway_address = g_key_file_get_string(keyfile, + group_name, WIFI_CONFIG_IPV4_GATEWAY_ADDRESS, NULL); + if (config->ip_info->gateway_address) + DBG("IPv4.gateway:%s", config->ip_info->gateway_address); + + config->ip_info->dns_type = g_key_file_get_string(keyfile, group_name, + WIFI_CONFIG_IPV4_DNS_METHOD, NULL); + if (config->ip_info->dns_type) + DBG("DNS.IPv4Method:%s", config->ip_info->dns_type); + + char **nameservers; + gsize length; + nameservers = g_key_file_get_string_list(keyfile, group_name, + WIFI_CONFIG_DNS_ADDRESS, &length, NULL); + if (nameservers) { + if (length > 0) { + config->ip_info->dns_count = length; + int i = 0; + while (i < NET_DNS_ADDR_MAX && nameservers[i]) { + config->ip_info->dns_address[i] = g_strdup(nameservers[i]); + DBG("DNSAddress[%d]:%s", i+1, config->ip_info->dns_address[i]); + i += 1; + } + } + g_strfreev(nameservers); + } + } + + if (g_strcmp0(config->security_type, WIFI_SECURITY_EAP) == 0) { config->eap_config->anonymous_identity = g_key_file_get_string(keyfile, group_name, WIFI_CONFIG_EAP_ANONYMOUS_IDENTITY, NULL); config->eap_config->ca_cert = g_key_file_get_string(keyfile, group_name, WIFI_CONFIG_EAP_CACERT, NULL); config->eap_config->client_cert = g_key_file_get_string(keyfile, group_name, WIFI_CONFIG_EAP_CLIENTCERT, NULL); config->eap_config->private_key = g_key_file_get_string(keyfile, group_name, WIFI_CONFIG_EAP_PRIVATEKEY, NULL); + config->eap_config->private_key_password = g_key_file_get_string(keyfile, group_name, WIFI_CONFIG_EAP_PRIVATEKEY_PASSWORD, NULL); config->eap_config->identity = g_key_file_get_string(keyfile, group_name, WIFI_CONFIG_EAP_IDENTITY, NULL); config->eap_config->eap_type = g_key_file_get_string(keyfile, group_name, WIFI_CONFIG_EAP_TYPE, NULL); config->eap_config->eap_auth_type = g_key_file_get_string(keyfile, group_name, WIFI_CONFIG_EAP_AUTH_TYPE, NULL); @@ -329,6 +432,8 @@ static gboolean _load_configuration(const gchar *config_id, struct wifi_config * DBG("client_cert [%s]", config->eap_config->client_cert); if (config->eap_config->private_key) DBG("private_key [%s]", config->eap_config->private_key); + if (config->eap_config->private_key_password) + DBG("private_key_password [%s]", config->eap_config->private_key_password); if (config->eap_config->identity) DBG("identity [%s]", config->eap_config->identity); if (config->eap_config->eap_type) @@ -349,14 +454,14 @@ static gboolean _load_configuration(const gchar *config_id, struct wifi_config * return TRUE; } -static gboolean _save_configuration(const gchar *config_id, GKeyFile *keyfile) +gboolean wifi_config_save_configuration(const gchar *config_id, GKeyFile *keyfile) { gchar *dir; gchar *path; gchar *group_name; gboolean ret = FALSE; - ret = __get_group_name(WIFI_CONFIG_PREFIX, config_id, &group_name); + ret = wifi_config_get_group_name(WIFI_CONFIG_PREFIX, config_id, &group_name); if (ret != TRUE) { ERR("Fail to get_wifi_config_group_name"); return FALSE; @@ -394,7 +499,7 @@ static gboolean _remove_configuration(const gchar *config_id) gchar *dir; gchar *group_name; - ret = __get_group_name(WIFI_CONFIG_PREFIX, config_id, &group_name); + ret = wifi_config_get_group_name(WIFI_CONFIG_PREFIX, config_id, &group_name); if (ret != TRUE) { ERR("Fail to get_wifi_config_group_name"); return FALSE; @@ -426,7 +531,7 @@ static gboolean _set_field(const gchar *config_id, const gchar *key, const gchar GKeyFile *keyfile; gchar *group_name; - ret = __get_group_name(WIFI_CONFIG_PREFIX, config_id, &group_name); + ret = wifi_config_get_group_name(WIFI_CONFIG_PREFIX, config_id, &group_name); if (ret != TRUE) { ERR("Fail to get_wifi_config_group_name"); return FALSE; @@ -470,7 +575,7 @@ static gboolean _set_field(const gchar *config_id, const gchar *key, const gchar ret = FALSE; } - _save_configuration(config_id, keyfile); + wifi_config_save_configuration(config_id, keyfile); g_key_file_free(keyfile); g_free(group_name); @@ -486,7 +591,7 @@ static gboolean _get_field(const gchar *config_id, const gchar *key, gchar **val gboolean hidden = FALSE; gboolean ret = FALSE; - ret = __get_group_name(WIFI_CONFIG_PREFIX, config_id, &group_name); + ret = wifi_config_get_group_name(WIFI_CONFIG_PREFIX, config_id, &group_name); if (ret != TRUE) { ERR("Fail to get_wifi_config_group_name"); return FALSE; @@ -958,9 +1063,11 @@ gboolean handle_load_configuration(Wifi *wifi, GDBusMethodInvocation *context, g_return_val_if_fail(wifi != NULL, TRUE); conf = g_new0(struct wifi_config, 1); + conf->ip_info = g_new0(wifi_ip_info_s, 1); ret = _load_configuration(config_id, conf); if (ret != TRUE) { + g_free(conf->ip_info); g_free(conf); ERR("Fail to _load_configuration"); netconfig_error_no_profile(context); @@ -970,6 +1077,7 @@ gboolean handle_load_configuration(Wifi *wifi, GDBusMethodInvocation *context, b = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); g_variant_builder_add(b, "{sv}", WIFI_CONFIG_NAME, g_variant_new_string(conf->name)); g_variant_builder_add(b, "{sv}", WIFI_CONFIG_SECURITY_TYPE, g_variant_new_string(conf->security_type)); + g_variant_builder_add(b, "{sv}", WIFI_CONFIG_PASSPHRASE, g_variant_new_string(conf->passphrase)); g_variant_builder_add(b, "{sv}", WIFI_CONFIG_HIDDEN, g_variant_new_string(conf->is_hidden)); if (conf->proxy_address != NULL) @@ -977,23 +1085,68 @@ gboolean handle_load_configuration(Wifi *wifi, GDBusMethodInvocation *context, else g_variant_builder_add(b, "{sv}", WIFI_CONFIG_PROXYADDRESS, g_variant_new_string("NONE")); + if (conf->ip_info->ip_type != NULL) + g_variant_builder_add(b, "{sv}", WIFI_CONFIG_IPV4_METHOD, g_variant_new_string(conf->ip_info->ip_type)); + + if (conf->ip_info->ip_address != NULL) + g_variant_builder_add(b, "{sv}", WIFI_CONFIG_IPV4_ADDRESS, g_variant_new_string(conf->ip_info->ip_address)); + + if (conf->ip_info->subnet_mask != NULL) + g_variant_builder_add(b, "{sv}", WIFI_CONFIG_IPV4_SUBNET_MASK, g_variant_new_string(conf->ip_info->subnet_mask)); + + if (conf->ip_info->prefix_length > 0) + g_variant_builder_add(b, "{sv}", WIFI_CONFIG_IPV6_PREFIX_LEN, g_variant_new_int32(conf->ip_info->prefix_length)); + + if (conf->ip_info->gateway_address != NULL) + g_variant_builder_add(b, "{sv}", WIFI_CONFIG_IPV4_GATEWAY_ADDRESS, g_variant_new_string(conf->ip_info->gateway_address)); + + if (conf->ip_info->dns_type != NULL) + g_variant_builder_add(b, "{sv}", WIFI_CONFIG_IPV4_DNS_METHOD, g_variant_new_string(conf->ip_info->dns_type)); + + int i = 0, count = conf->ip_info->dns_count; + while (i < count) { + if (conf->ip_info->dns_address[i] != NULL) + g_variant_builder_add(b, "{sv}", WIFI_CONFIG_DNS_ADDRESS, g_variant_new_string(conf->ip_info->dns_address[i])); + + i += 1; + } + if (conf->last_error != NULL) g_variant_builder_add(b, "{sv}", WIFI_CONFIG_FAILURE, g_variant_new_string(conf->last_error)); else g_variant_builder_add(b, "{sv}", WIFI_CONFIG_FAILURE, g_variant_new_string("ERROR_NONE")); - g_free(conf->proxy_address); - g_free(conf->last_error); - g_free(conf->name); - g_free(conf->security_type); - g_free(conf->is_hidden); - g_free(conf); + __free_wifi_configuration(conf); wifi_complete_load_configuration(wifi, context, g_variant_builder_end(b)); g_variant_builder_unref(b); return TRUE; } +static unsigned char __netconfig_convert_netmask_to_prefixlen( + const char *netmask) +{ + unsigned char bits; + in_addr_t mask; + in_addr_t host; + + if (!netmask) + return 32; + + mask = inet_network(netmask); + host = ~mask; + + /* a valid netmask must be 2^n - 1 */ + if ((host & (host + 1)) != 0) + return -1; + + bits = 0; + for (; mask; mask <<= 1) + ++bits; + + return bits; +} + gboolean handle_save_configuration(Wifi *wifi, GDBusMethodInvocation *context, const gchar *config_id, GVariant *configuration) { @@ -1004,6 +1157,7 @@ gboolean handle_save_configuration(Wifi *wifi, GDBusMethodInvocation *context, GVariant *value; gchar *field; gchar *group_name = NULL; + int order = 0; if ((wifi == NULL) || (config_id == NULL) || (configuration == NULL)) { ERR("Invalid parameter"); @@ -1012,6 +1166,7 @@ gboolean handle_save_configuration(Wifi *wifi, GDBusMethodInvocation *context, } conf = g_new0(struct wifi_config, 1); + conf->ip_info = g_new0(wifi_ip_info_s, 1); g_variant_get(configuration, "a{sv}", &iter); while (g_variant_iter_loop(iter, "{sv}", &field, &value)) { @@ -1043,6 +1198,64 @@ gboolean handle_save_configuration(Wifi *wifi, GDBusMethodInvocation *context, } else { conf->is_hidden = NULL; } + } else if (g_strcmp0(field, WIFI_CONFIG_CREATED) == 0) { + if (g_variant_is_of_type(value, G_VARIANT_TYPE_BOOLEAN)) { + conf->is_created = g_variant_get_boolean(value); + DBG("is_created [%d]", conf->is_created); + } else { + conf->is_created = FALSE; + } + } else if (g_strcmp0(field, WIFI_CONFIG_IPV4_METHOD) == 0) { + if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) { + conf->ip_info->ip_type = g_strdup(g_variant_get_string(value, NULL)); + DBG("IP config type [%s]", conf->ip_info->ip_type); + } else { + conf->ip_info->ip_type = NULL; + } + } else if (g_strcmp0(field, WIFI_CONFIG_IPV4_ADDRESS) == 0) { + if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) { + conf->ip_info->ip_address = g_strdup(g_variant_get_string(value, NULL)); + DBG("IP address [%s]", conf->ip_info->ip_address); + } else { + conf->ip_info->ip_address = NULL; + } + } else if (g_strcmp0(field, WIFI_CONFIG_IPV4_SUBNET_MASK) == 0) { + if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) { + conf->ip_info->subnet_mask = g_strdup(g_variant_get_string(value, NULL)); + DBG("Subnet Mask [%s]", conf->ip_info->subnet_mask); + } else { + conf->ip_info->subnet_mask = NULL; + } + } else if (g_strcmp0(field, WIFI_CONFIG_IPV6_PREFIX_LEN) == 0) { + if (g_variant_is_of_type(value, G_VARIANT_TYPE_INT32)) { + conf->ip_info->prefix_length = g_variant_get_int32(value); + DBG("IPv6 Prefix Length [%d]", conf->ip_info->prefix_length); + } else { + conf->ip_info->prefix_length = 0; + } + } else if (g_strcmp0(field, WIFI_CONFIG_IPV4_GATEWAY_ADDRESS) == 0) { + if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) { + conf->ip_info->gateway_address = g_strdup(g_variant_get_string(value, NULL)); + DBG("Gateway address [%s]", conf->ip_info->gateway_address); + } else { + conf->ip_info->gateway_address = NULL; + } + } else if (g_strcmp0(field, WIFI_CONFIG_IPV4_DNS_METHOD) == 0) { + if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) { + conf->ip_info->dns_type = g_strdup(g_variant_get_string(value, NULL)); + DBG("DNS config type [%s]", conf->ip_info->dns_type); + } else { + conf->ip_info->dns_type = NULL; + } + } else if (g_strcmp0(field, WIFI_CONFIG_DNS_ADDRESS) == 0) { + if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) { + conf->ip_info->dns_address[order] = g_strdup(g_variant_get_string(value, NULL)); + DBG("DNS address [%s]", conf->ip_info->dns_address[order]); + conf->ip_info->dns_count = order + 1; + order++; + } else { + conf->ip_info->dns_address[order++] = NULL; + } } else if (g_strcmp0(field, WIFI_CONFIG_PROXYADDRESS) == 0) { if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) { conf->proxy_address = g_strdup(g_variant_get_string(value, NULL)); @@ -1055,14 +1268,9 @@ gboolean handle_save_configuration(Wifi *wifi, GDBusMethodInvocation *context, conf->favorite = TRUE; conf->autoconnect = TRUE; - ret = __get_group_name(WIFI_CONFIG_PREFIX, config_id, &group_name); + ret = wifi_config_get_group_name(WIFI_CONFIG_PREFIX, config_id, &group_name); if (ret != TRUE) { - g_free(conf->name); - g_free(conf->ssid); - g_free(conf->passphrase); - g_free(conf->is_hidden); - g_free(conf->proxy_address); - g_free(conf); + __free_wifi_configuration(conf); ERR("Fail to get_wifi_config_group_name"); netconfig_error_fail_save_congifuration(context); return TRUE; @@ -1074,7 +1282,11 @@ gboolean handle_save_configuration(Wifi *wifi, GDBusMethodInvocation *context, if (conf->passphrase != NULL) { gchar *enc_data = NULL; - enc_data = _netconfig_encrypt_passphrase(conf->passphrase); + + if (conf->is_created == true) + enc_data = _netconfig_encrypt_passphrase(conf->passphrase); + else + enc_data = g_strdup(conf->passphrase); if (!enc_data) { ERR("Failed to encrypt the passphrase"); @@ -1089,6 +1301,32 @@ gboolean handle_save_configuration(Wifi *wifi, GDBusMethodInvocation *context, g_key_file_set_boolean(keyfile, group_name, WIFI_CONFIG_FAVORITE, conf->favorite); g_key_file_set_boolean(keyfile, group_name, WIFI_CONFIG_AUTOCONNECT, conf->autoconnect); +#if GLIB_CHECK_VERSION(2,62,0) + gint64 real_time = 0; + GDateTime *dt_real_time = NULL; + + real_time = g_get_real_time(); + dt_real_time = g_date_time_new_from_unix_utc(real_time); + if (dt_real_time) { + gchar *str = g_date_time_format_iso8601(dt_real_time); + g_date_time_unref(dt_real_time); + if (str) { + g_key_file_set_string(keyfile, group_name, + WIFI_CONFIG_MODIFIED, str); + g_free(str); + } + } +#else /* GLIB_CHECK_VERSION(2,62,0) */ + GTimeVal modified; + g_get_current_time(&modified); + gchar *str = g_time_val_to_iso8601(&modified); + if (str) { + g_key_file_set_string(keyfile, group_name, + WIFI_CONFIG_MODIFIED, str); + g_free(str); + } +#endif /* GLIB_CHECK_VERSION(2,62,0) */ + /* Optional field */ if (conf->proxy_address != NULL) { g_key_file_set_string(keyfile, group_name, WIFI_CONFIG_PROXY_METHOD, "manual"); @@ -1102,10 +1340,63 @@ gboolean handle_save_configuration(Wifi *wifi, GDBusMethodInvocation *context, g_key_file_set_boolean(keyfile, group_name, WIFI_CONFIG_HIDDEN, hidden); } - ret = _save_configuration(config_id, keyfile); + if (conf->ip_info->ip_type != NULL) + g_key_file_set_string(keyfile, group_name, + WIFI_CONFIG_IPV4_METHOD, conf->ip_info->ip_type); + + if (conf->ip_info->ip_address != NULL) + g_key_file_set_string(keyfile, group_name, + WIFI_CONFIG_IPV4_ADDRESS, conf->ip_info->ip_address); + + if (conf->ip_info->subnet_mask != NULL) { + unsigned char prefix_len; + prefix_len = __netconfig_convert_netmask_to_prefixlen( + conf->ip_info->subnet_mask); + if (prefix_len > 0 && prefix_len < 32) + g_key_file_set_integer(keyfile, group_name, + WIFI_CONFIG_IPV4_SUBNET_MASK, prefix_len); + } + + if (conf->ip_info->prefix_length > 0) + g_key_file_set_integer(keyfile, group_name, + WIFI_CONFIG_IPV6_PREFIX_LEN, conf->ip_info->prefix_length); + + if (conf->ip_info->gateway_address != NULL) + g_key_file_set_string(keyfile, group_name, + WIFI_CONFIG_IPV4_GATEWAY_ADDRESS, conf->ip_info->gateway_address); + + if (conf->ip_info->dns_type != NULL) + g_key_file_set_string(keyfile, group_name, + WIFI_CONFIG_IPV4_DNS_METHOD, conf->ip_info->dns_type); + + int i = 0, count = conf->ip_info->dns_count; + while (i < count) { + if (conf->ip_info->dns_address[i] != NULL) + g_key_file_set_string(keyfile, group_name, WIFI_CONFIG_DNS_ADDRESS, + conf->ip_info->dns_address[i]); + + i += 1; + } + + ret = wifi_config_save_configuration(config_id, keyfile); if (ret == TRUE) { INFO("Success to save configuration [%s]", config_id); wifi_complete_save_configuration(wifi, context); + char *file; + if (get_files_count(CONNMAN_STORAGE) > MAX_WIFI_PROFILES) { + file = get_least_recently_profile(CONNMAN_STORAGE); + if (file) { + gchar *profileName = g_strdup_printf(CONNMAN_STORAGE "/%s", file); + INFO("least modified file: %s", profileName); + if (profileName) { + if (__remove_configuration(profileName) != TRUE) + DBG("Failed to remove profile: [%s]", profileName); + } else + ERR("Profile: [%s] does not exist", file); + + g_free(profileName); + } + } } else { INFO("Fail to save configuration [%s]", config_id); netconfig_error_dbus_method_return(context, NETCONFIG_ERROR_INTERNAL, "FailSaveConfiguration"); @@ -1113,12 +1404,7 @@ gboolean handle_save_configuration(Wifi *wifi, GDBusMethodInvocation *context, g_key_file_free(keyfile); g_free(group_name); - g_free(conf->name); - g_free(conf->ssid); - g_free(conf->passphrase); - g_free(conf->is_hidden); - g_free(conf->proxy_address); - g_free(conf); + __free_wifi_configuration(conf); g_variant_iter_free(iter); @@ -1136,10 +1422,12 @@ gboolean handle_load_eap_configuration(Wifi *wifi, GDBusMethodInvocation *contex conf = g_new0(struct wifi_config, 1); conf->eap_config = g_new0(struct wifi_eap_config, 1); + conf->ip_info = g_new0(wifi_ip_info_s, 1); ret = _load_configuration(config_id, conf); if (ret != TRUE) { g_free(conf->eap_config); + g_free(conf->ip_info); g_free(conf); ERR("Fail to _load_configuration"); netconfig_error_no_profile(context); @@ -1181,6 +1469,11 @@ gboolean handle_load_eap_configuration(Wifi *wifi, GDBusMethodInvocation *contex else g_variant_builder_add(b, "{sv}", WIFI_CONFIG_EAP_PRIVATEKEY, g_variant_new_string("NONE")); + if (conf->eap_config->private_key_password != NULL) + g_variant_builder_add(b, "{sv}", WIFI_CONFIG_EAP_PRIVATEKEY_PASSWORD, g_variant_new_string(conf->eap_config->private_key_password)); + else + g_variant_builder_add(b, "{sv}", WIFI_CONFIG_EAP_PRIVATEKEY_PASSWORD, g_variant_new_string("NONE")); + if (conf->eap_config->identity != NULL) g_variant_builder_add(b, "{sv}", WIFI_CONFIG_EAP_IDENTITY, g_variant_new_string(conf->eap_config->identity)); else @@ -1259,6 +1552,13 @@ gboolean handle_save_eap_configuration(Wifi *wifi, GDBusMethodInvocation *contex } else { conf->is_hidden = NULL; } + } else if (g_strcmp0(field, WIFI_CONFIG_CREATED) == 0) { + if (g_variant_is_of_type(value, G_VARIANT_TYPE_BOOLEAN)) { + conf->is_created = g_variant_get_boolean(value); + DBG("is_created [%d]", conf->is_created); + } else { + conf->is_created = FALSE; + } } else if (g_strcmp0(field, WIFI_CONFIG_PROXYADDRESS) == 0) { if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) { conf->proxy_address = g_strdup(g_variant_get_string(value, NULL)); @@ -1294,6 +1594,13 @@ gboolean handle_save_eap_configuration(Wifi *wifi, GDBusMethodInvocation *contex } else { conf->eap_config->private_key = NULL; } + } else if (g_strcmp0(field, WIFI_CONFIG_EAP_PRIVATEKEY_PASSWORD) == 0) { + if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) { + conf->eap_config->private_key_password = g_strdup(g_variant_get_string(value, NULL)); + DBG("private_key_password[%s]", conf->eap_config->private_key_password); + } else { + conf->eap_config->private_key_password = NULL; + } } else if (g_strcmp0(field, WIFI_CONFIG_EAP_IDENTITY) == 0) { if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) { conf->eap_config->identity = g_strdup(g_variant_get_string(value, NULL)); @@ -1327,7 +1634,7 @@ gboolean handle_save_eap_configuration(Wifi *wifi, GDBusMethodInvocation *contex conf->favorite = TRUE; conf->autoconnect = TRUE; - ret = __get_group_name(WIFI_CONFIG_PREFIX, config_id, &group_name); + ret = wifi_config_get_group_name(WIFI_CONFIG_PREFIX, config_id, &group_name); if (ret != TRUE) { __free_wifi_configuration(conf); ERR("Fail to get_wifi_config_group_name"); @@ -1340,7 +1647,11 @@ gboolean handle_save_eap_configuration(Wifi *wifi, GDBusMethodInvocation *contex if (conf->passphrase != NULL) { gchar *enc_data = NULL; - enc_data = _netconfig_encrypt_passphrase(conf->passphrase); + + if (conf->is_created == true) + enc_data = _netconfig_encrypt_passphrase(conf->passphrase); + else + enc_data = g_strdup(conf->passphrase); if (!enc_data) { ERR("Failed to encrypt the passphrase"); @@ -1383,6 +1694,10 @@ gboolean handle_save_eap_configuration(Wifi *wifi, GDBusMethodInvocation *contex g_key_file_set_string(keyfile, group_name, WIFI_CONFIG_EAP_PRIVATEKEY, conf->eap_config->private_key); + if (conf->eap_config->private_key_password != NULL) + g_key_file_set_string(keyfile, group_name, + WIFI_CONFIG_EAP_PRIVATEKEY_PASSWORD, conf->eap_config->private_key_password); + if (conf->eap_config->identity != NULL) g_key_file_set_string(keyfile, group_name, WIFI_CONFIG_EAP_IDENTITY, conf->eap_config->identity); @@ -1399,7 +1714,7 @@ gboolean handle_save_eap_configuration(Wifi *wifi, GDBusMethodInvocation *contex g_key_file_set_string(keyfile, group_name, WIFI_CONFIG_EAP_SUBJECT_MATCH, conf->eap_config->subject_match); - ret = _save_configuration(config_id, keyfile); + ret = wifi_config_save_configuration(config_id, keyfile); if (ret == TRUE) { INFO("Success to save eap configuration [%s]", config_id); wifi_complete_save_eap_configuration(wifi, context); @@ -1469,7 +1784,7 @@ gboolean handle_set_config_field(Wifi *wifi, GDBusMethodInvocation *context, g_return_val_if_fail(config_id != NULL, TRUE); g_return_val_if_fail(key != NULL, TRUE); - DBG("Key[%s] Value[%d]", key, value); + DBG("Key[%s] Value[%s]", key, value); if (g_strcmp0(key, WIFI_CONFIG_PROXYADDRESS) == 0) { ret = _set_field(config_id, WIFI_CONFIG_PROXY_METHOD, "manual");