#include <sys/stat.h>
#include <glib.h>
#include <unistd.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
#include <vconf.h>
#define WIFI_MAC_ADD_LENGTH 17
#define WIFI_MAC_ADD_PATH "/sys/class/net/wlan0/address"
+#define NET_DNS_ADDR_MAX 2
+
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;
gchar *is_hidden;
gchar *proxy_address;
struct wifi_eap_config *eap_config;
+ wifi_ip_info_s *ip_info;
gchar *last_error;
};
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);
+
+ 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);
}
}
mac[12] = '\0';
*mac_address = g_strdup(mac);
+ g_free(tmp);
return TRUE;
}
ret = __get_mac_address(&mac_address);
if ((ret != TRUE) || (strlen(mac_address) == 0)) {
ERR("Cannot get WIFI MAC address");
+ g_free(mac_address);
return FALSE;
}
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 {
+ 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);
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)
tmp_dst = (unsigned char *)g_try_malloc0(length + 1);
if (!tmp_dst) {
ERR("failed to allocate memory");
+ g_variant_iter_free(iter_copy);
return 0;
}
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);
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->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)
{
GVariant *value;
gchar *field;
gchar *group_name = NULL;
+ int order = 0;
if ((wifi == NULL) || (config_id == NULL) || (configuration == NULL)) {
ERR("Invalid parameter");
}
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)) {
} else {
conf->is_hidden = NULL;
}
+ } 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_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));
ret = __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;
g_key_file_set_boolean(keyfile, group_name, WIFI_CONFIG_HIDDEN, hidden);
}
+ 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);
+ g_key_file_set_integer(keyfile, group_name,
+ WIFI_CONFIG_IPV4_SUBNET_MASK, prefix_len);
+ }
+
+ 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 = _save_configuration(config_id, keyfile);
if (ret == TRUE) {
INFO("Success to save configuration [%s]", config_id);
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);
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);
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
} 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));
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);