X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fwifi-agent.c;h=e66ffa4f1f34012568a8e3035538ae2f89f49f1f;hb=6240b218e6bb7efc03d2e33db80d1bdeb0023a0f;hp=c4456c796b036a7c4302c78117cddbef7219cb51;hpb=1ff4bffc29b8a263497175a45628e98601061c0d;p=platform%2Fcore%2Fconnectivity%2Fnet-config.git diff --git a/src/wifi-agent.c b/src/wifi-agent.c index c4456c7..e66ffa4 100755 --- a/src/wifi-agent.c +++ b/src/wifi-agent.c @@ -17,7 +17,6 @@ * */ -#include #include #include #include @@ -33,6 +32,7 @@ #include "wifi-eap-config.h" #include "network-state.h" #include "network-accessibility.h" +#include "wifi-key-encryption.h" #define NETCONFIG_AGENT_FIELD_NAME "Name" #define NETCONFIG_AGENT_FIELD_SSID "SSID" @@ -41,6 +41,10 @@ #define NETCONFIG_AGENT_FIELD_WPS "WPS" #define NETCONFIG_AGENT_FIELD_WPS_PBC "WPS_PBC" #define NETCONFIG_AGENT_FIELD_WPS_PIN "WPS_PIN" +#if defined TIZEN_CAPTIVE_PORTAL +#define NETCONFIG_AGENT_FIELD_USERNAME "Username" +#define NETCONFIG_AGENT_FIELD_PASSWORD "Password" +#endif #define NETCONFIG_AGENT_ERR_CONNECT_FAILED "connect-failed" @@ -50,6 +54,10 @@ struct netconfig_wifi_agent { char *identity; char *passphrase; char *wps_pin; +#if defined TIZEN_CAPTIVE_PORTAL + char *username; + char *password; +#endif gboolean wps_pbc; }; @@ -57,17 +65,26 @@ static struct netconfig_wifi_agent agent; static void __netconfig_agent_clear_fields(void) { - g_byte_array_free(agent.ssid, TRUE); + if (agent.ssid) + g_byte_array_free(agent.ssid, TRUE); g_free(agent.name); g_free(agent.identity); g_free(agent.passphrase); g_free(agent.wps_pin); +#if defined TIZEN_CAPTIVE_PORTAL + g_free(agent.username); + g_free(agent.password); +#endif agent.ssid = NULL; agent.name = NULL; agent.identity = NULL; agent.passphrase = NULL; agent.wps_pin = NULL; +#if defined TIZEN_CAPTIVE_PORTAL + agent.username = NULL; + agent.password = NULL; +#endif agent.wps_pbc = FALSE; } @@ -75,54 +92,21 @@ int connman_register_agent(void) { GVariant *reply = NULL; GVariant *params = NULL; - GError *error; - GDBusConnection *connection = NULL; - connection = netdbus_get_connection(); - if (connection == NULL) { - ERR("GDBusconnection is NULL"); - return -1; - } + params = g_variant_new("(o)", NETCONFIG_WIFI_PATH); + reply = netconfig_invoke_dbus_method(CONNMAN_SERVICE, + CONNMAN_MANAGER_PATH, CONNMAN_MANAGER_INTERFACE, + "RegisterAgent", params); - do { - error = NULL; - params = g_variant_new("(o)", NETCONFIG_WIFI_PATH); - - reply = g_dbus_connection_call_sync( - connection, - CONNMAN_SERVICE, - CONNMAN_MANAGER_PATH, - CONNMAN_MANAGER_INTERFACE, - "RegisterAgent", - params, - NULL, - G_DBUS_CALL_FLAGS_NONE, - DBUS_REPLY_TIMEOUT, - netdbus_get_cancellable(), - &error); - - if (reply == NULL) { - if (error != NULL) { - if (g_strcmp0(error->message, - "GDBus.Error:net.connman.Error.AlreadyExists: Already exists") == 0) { - break; - } else { - ERR("Fail to register agent [%d: %s]", - error->code, error->message); - } - - g_error_free(error); - } else - ERR("Fail to register agent"); - } else - g_variant_unref(reply); - - sleep(1); - } while (TRUE); + if (reply == NULL) { + ERR("Fail to register agent"); + return FALSE; + } else + g_variant_unref(reply); INFO("Registered to connman agent successfully"); - return 0; + return TRUE; } int connman_unregister_agent(void) @@ -161,7 +145,7 @@ gboolean netconfig_wifi_set_agent_field_for_eap_network( name_len = strlen(name); agent.ssid = g_byte_array_sized_new(name_len); agent.ssid->len = name_len; - memcpy(agent.ssid->data, name, name_len); + memcpy(agent.ssid->data, name, name_len + 1); if (identity) agent.identity = g_strdup(identity); @@ -169,6 +153,16 @@ gboolean netconfig_wifi_set_agent_field_for_eap_network( if (passphrase) agent.passphrase = g_strdup(passphrase); + gchar *enc_data = NULL; + enc_data = _netconfig_encrypt_passphrase(agent.passphrase); + + if (!enc_data) { + ERR("Failed to encrypt the passphrase"); + } else { + g_free(agent.passphrase); + agent.passphrase = enc_data; + } + DBG("Successfully configured for EAP network"); return TRUE; @@ -184,7 +178,7 @@ gboolean handle_set_field(NetConnmanAgent *connman_agent, gboolean updated = FALSE; gboolean reply = FALSE; - g_return_val_if_fail(connman_agent != NULL, FALSE); + g_return_val_if_fail(connman_agent != NULL, TRUE); DBG("Set agent fields for %s", service); @@ -196,24 +190,44 @@ gboolean handle_set_field(NetConnmanAgent *connman_agent, g_dbus_method_invocation_return_gerror(context, error); g_clear_error(&error); - return reply; + return TRUE; } __netconfig_agent_clear_fields(); g_variant_get(fields, "a{sv}", &iter); while (g_variant_iter_loop(iter, "{sv}", &field, &value)) { if (g_strcmp0(field, NETCONFIG_AGENT_FIELD_PASSPHRASE) == 0) { - g_free(agent.passphrase); if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) { agent.passphrase = g_strdup(g_variant_get_string(value, NULL)); updated = TRUE; DBG("Field [%s] - []", field); - } else { - agent.passphrase = NULL; + + if (agent.passphrase == NULL) + continue; + + if (netconfig_check_passphrase(service, agent.passphrase) == FALSE) { + ERR("Invalid passphrase"); + + g_free(agent.passphrase); + agent.passphrase = NULL; + + updated = FALSE; + continue; + } + + gchar *enc_data = NULL; + enc_data = _netconfig_encrypt_passphrase(agent.passphrase); + + if (!enc_data) { + ERR("Failed to encrypt the passphrase"); + continue; + } + + g_free(agent.passphrase); + agent.passphrase = enc_data; } } else if (g_strcmp0(field, NETCONFIG_AGENT_FIELD_WPS_PBC) == 0) { - agent.wps_pbc = FALSE; if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING) && g_strcmp0(g_variant_get_string(value, NULL), "enable") == 0) { agent.wps_pbc = TRUE; @@ -222,25 +236,18 @@ gboolean handle_set_field(NetConnmanAgent *connman_agent, DBG("Field [%s] - [%d]", field, agent.wps_pbc); } } else if (g_strcmp0(field, NETCONFIG_AGENT_FIELD_WPS_PIN) == 0) { - g_free(agent.wps_pin); - agent.wps_pbc = FALSE; if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) { agent.wps_pin = g_strdup(g_variant_get_string(value, NULL)); updated = TRUE; - DBG("Field [%s] - []", field); - } else { - agent.wps_pin = NULL; + DBG("Field [%s] - [%s]", field, agent.wps_pin); } } else if (g_strcmp0(field, NETCONFIG_AGENT_FIELD_NAME) == 0) { - g_free(agent.name); if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) { agent.name = g_strdup(g_variant_get_string(value, NULL)); updated = TRUE; - DBG("Field [%s] - []", field); - } else { - agent.name = NULL; + DBG("Field [%s] - [%s]", field, agent.name); } } else if (g_strcmp0(field, NETCONFIG_AGENT_FIELD_SSID) == 0) { if (agent.ssid != NULL) { @@ -254,9 +261,8 @@ gboolean handle_set_field(NetConnmanAgent *connman_agent, GByteArray *array = g_byte_array_new(); g_variant_get(value, "ay", &iter1); - while(g_variant_iter_loop(iter1, "y", &char_value)) { + while (g_variant_iter_loop(iter1, "y", &char_value)) g_byte_array_append(array, &char_value, 1); - } g_variant_iter_free(iter1); if (array != NULL && (array->len > 0)) { agent.ssid = g_byte_array_sized_new(array->len); @@ -268,49 +274,63 @@ gboolean handle_set_field(NetConnmanAgent *connman_agent, } } } else if (g_strcmp0(field, NETCONFIG_AGENT_FIELD_IDENTITY) == 0) { - g_free(agent.identity); if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) { agent.identity = g_strdup(g_variant_get_string(value, NULL)); updated = TRUE; - DBG("Field [%s] - []", field); - } else { - agent.identity = NULL; + DBG("Field [%s] - [%s]", field, agent.identity); } +#if defined TIZEN_CAPTIVE_PORTAL + } else if (g_strcmp0(field, NETCONFIG_AGENT_FIELD_USERNAME) == 0) { + if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) { + agent.username = g_strdup(g_variant_get_string(value, NULL)); + updated = TRUE; + + DBG("Field [%s] - [%s]", field, agent.username); + } + } else if (g_strcmp0(field, NETCONFIG_AGENT_FIELD_PASSWORD) == 0) { + if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) { + agent.password = g_strdup(g_variant_get_string(value, NULL)); + updated = TRUE; + + DBG("Field [%s] - [%s]", field, agent.password); + } +#endif } } + g_variant_iter_free(iter); + if (updated == TRUE) { reply = netconfig_invoke_dbus_method_nonblock(CONNMAN_SERVICE, - service, CONNMAN_SERVICE_INTERFACE, "Connect", NULL, NULL); - if (reply == TRUE) { - g_dbus_method_invocation_return_value (context, NULL); - } else { + service, CONNMAN_SERVICE_INTERFACE, "Connect", + NULL, __netconfig_wifi_connect_reply); + if (reply != TRUE) { + ERR("Fail to connect Wi-Fi"); + __netconfig_agent_clear_fields(); error = g_error_new(G_DBUS_ERROR, G_DBUS_ERROR_AUTH_FAILED, CONNMAN_ERROR_INTERFACE ".InvalidArguments"); g_dbus_method_invocation_return_gerror(context, error); g_clear_error(&error); + return TRUE; } } else { + ERR("Fail to connect Wi-Fi"); + __netconfig_agent_clear_fields(); + error = g_error_new(G_DBUS_ERROR, G_DBUS_ERROR_AUTH_FAILED, CONNMAN_ERROR_INTERFACE ".InvalidArguments"); g_dbus_method_invocation_return_gerror(context, error); g_clear_error(&error); + return TRUE; } - if (reply != TRUE) { - ERR("Fail to connect Wi-Fi"); - - __netconfig_agent_clear_fields(); - } - g_variant_iter_free(iter); - net_connman_agent_complete_set_field(connman_agent, context); - return reply; + return TRUE; } gboolean handle_request_input(NetConnmanAgent *connman_agent, @@ -323,14 +343,14 @@ gboolean handle_request_input(NetConnmanAgent *connman_agent, gboolean updated = FALSE; GVariantBuilder *builder = NULL; - g_return_val_if_fail(connman_agent != NULL, FALSE); + g_return_val_if_fail(connman_agent != NULL, TRUE); if (NULL == service) - return FALSE; + return TRUE; DBG("Agent fields requested for service: %s", service); - builder = g_variant_builder_new(G_VARIANT_TYPE ("a{sv}")); + builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); g_variant_get(fields, "a{sv}", &iter); while (g_variant_iter_loop(iter, "{sv}", &field, &r_value)) { @@ -341,11 +361,11 @@ gboolean handle_request_input(NetConnmanAgent *connman_agent, g_variant_new_string(agent.passphrase)); updated = TRUE; - DBG("Setting [%s] - []", field); + DBG("Setting [%s] - [%s]", field, agent.passphrase); } else if (g_strcmp0(field, NETCONFIG_AGENT_FIELD_WPS) == 0 && (agent.wps_pbc == TRUE || agent.wps_pin != NULL)) { if (agent.wps_pbc == TRUE) { - // Sending empty string for WPS push button method + /* Sending empty string for WPS push button method */ g_variant_builder_add(builder, "{sv}", NETCONFIG_AGENT_FIELD_WPS, g_variant_new_string("")); updated = TRUE; @@ -354,23 +374,22 @@ gboolean handle_request_input(NetConnmanAgent *connman_agent, g_variant_builder_add(builder, "{sv}", NETCONFIG_AGENT_FIELD_WPS, g_variant_new_string(agent.wps_pin)); updated = TRUE; - DBG("Setting string [%s] - []", field); + DBG("Setting string [%s] - [%s]", field, agent.wps_pin); } } else if (g_strcmp0(field, NETCONFIG_AGENT_FIELD_NAME) == 0 && agent.name != NULL) { g_variant_builder_add(builder, "{sv}", NETCONFIG_AGENT_FIELD_NAME, g_variant_new_string(agent.name)); updated = TRUE; - DBG("Settings [%s] - []", field); + DBG("Settings [%s] - [%s]", field, agent.name); } else if (g_strcmp0(field, NETCONFIG_AGENT_FIELD_SSID) == 0 && agent.ssid != NULL) { int i = 0; GVariantBuilder *builder1 = NULL; - builder1 = g_variant_builder_new (G_VARIANT_TYPE ("ay")); + builder1 = g_variant_builder_new(G_VARIANT_TYPE("ay")); - for (i = 0; i < (agent.ssid->len); i++) { - g_variant_builder_add (builder1, "y", agent.ssid->data[i]); - } + for (i = 0; i < (agent.ssid->len); i++) + g_variant_builder_add(builder1, "y", agent.ssid->data[i]); g_variant_builder_add(builder, "{sv}", NETCONFIG_AGENT_FIELD_SSID, g_variant_builder_end(builder1)); if (builder1 != NULL) @@ -383,7 +402,21 @@ gboolean handle_request_input(NetConnmanAgent *connman_agent, g_variant_builder_add(builder, "{sv}", NETCONFIG_AGENT_FIELD_IDENTITY, g_variant_new_string(agent.identity)); updated = TRUE; - DBG("Settings [%s] - []", field); + DBG("Settings [%s] - [%s]", field, agent.identity); +#if defined TIZEN_CAPTIVE_PORTAL + } else if (g_strcmp0(field, NETCONFIG_AGENT_FIELD_USERNAME) == 0 && + agent.username != NULL) { + g_variant_builder_add(builder, "{sv}", NETCONFIG_AGENT_FIELD_USERNAME, g_variant_new_string(agent.username)); + + updated = TRUE; + DBG("Settings [%s] - [%s]", field, agent.username); + } else if (g_strcmp0(field, NETCONFIG_AGENT_FIELD_PASSWORD) == 0 && + agent.password != NULL) { + g_variant_builder_add(builder, "{sv}", NETCONFIG_AGENT_FIELD_PASSWORD, g_variant_new_string(agent.password)); + + updated = TRUE; + DBG("Settings [%s] - [%s]", field, agent.password); +#endif } } @@ -395,14 +428,14 @@ gboolean handle_request_input(NetConnmanAgent *connman_agent, g_variant_iter_free(iter); - if (NULL == out_table){ + if (NULL == out_table) { net_connman_agent_complete_request_input(connman_agent, context, out_table); - return FALSE; + return TRUE; } if (updated == TRUE) - g_dbus_method_invocation_return_value (context, out_table); + g_dbus_method_invocation_return_value(context, out_table); else { GError *error = NULL; error = g_error_new(G_DBUS_ERROR, @@ -414,25 +447,22 @@ gboolean handle_request_input(NetConnmanAgent *connman_agent, } __netconfig_agent_clear_fields(); - g_variant_unref(out_table); - return updated; + return TRUE; } gboolean handle_report_error(NetConnmanAgent *connman_agent, GDBusMethodInvocation *context, const gchar *service, const gchar *error) { - gboolean ret = TRUE; - - g_return_val_if_fail(connman_agent != NULL, FALSE); + g_return_val_if_fail(connman_agent != NULL, TRUE); net_connman_agent_complete_report_error(connman_agent, context); DBG("Agent error for service[%s] - [%s]", service, error); - // Do something when it failed to make a connection + /* Do something when it failed to make a connection */ - return ret; + return TRUE; } #if defined TIZEN_CAPTIVE_PORTAL @@ -448,7 +478,6 @@ static gboolean is_monitor_notifier_registered = FALSE; #if defined TIZEN_WEARABLE static gboolean is_portal_msg_shown = FALSE; -static guint portal_msg_timer = 0; #endif struct poll_timer_data { @@ -457,8 +486,8 @@ struct poll_timer_data { void* data; }; -static struct poll_timer_data timer_data = - {QUERY_FOR_INTERNET_INTERVAL, 0, NULL}; +static struct poll_timer_data timer_data = { + QUERY_FOR_INTERNET_INTERVAL, 0, NULL}; static gboolean __check_ignore_portal_list(const char * ssid) { @@ -474,7 +503,7 @@ static gboolean __check_ignore_portal_list(const char * ssid) DBG("csc string [%s]", def_str); gchar ** ignore_ap_list = g_strsplit(def_str, ",", 0); ignore_ap_count = g_strv_length(ignore_ap_list); - for(i = 0; i < ignore_ap_count; i++) { + for (i = 0; i < ignore_ap_count; i++) { DBG("[%d] - [%s]", i, ignore_ap_list[i]); if (strncmp(ignore_ap_list[i], ssid, strlen(ssid)) == 0) { g_strfreev(ignore_ap_list); @@ -578,18 +607,6 @@ static gboolean __netconfig_wifi_portal_login_timeout(gpointer data) return FALSE; } -#if defined TIZEN_WEARABLE -static gboolean __netconfig_display_portal_msg(gpointer data) -{ - DBG(""); - wc_launch_popup(WC_POPUP_TYPE_CAPTIVE_PORTAL); - - netconfig_stop_timer(&portal_msg_timer); - - return FALSE; -} -#endif - static void __netconfig_wifi_portal_login_timer_start(struct poll_timer_data *data) { @@ -614,11 +631,10 @@ gboolean handle_request_browser(NetConnmanAgent *connman_agent, GDBusMethodInvocation *context, const gchar *service, const gchar *url) { #if defined TIZEN_CAPTIVE_PORTAL - gboolean ret = FALSE; gboolean ignore_portal = FALSE; const char * ssid = NULL; - g_return_val_if_fail(connman_agent != NULL, FALSE); + g_return_val_if_fail(connman_agent != NULL, TRUE); DBG("service[%s] - url[%s]", service, url); @@ -626,12 +642,12 @@ gboolean handle_request_browser(NetConnmanAgent *connman_agent, if (ssid == NULL) { ERR("Connected AP name is NULL!!"); net_connman_agent_complete_request_browser(connman_agent, context); - return FALSE; + return TRUE; } ignore_portal = __check_ignore_portal_list(ssid); - if (ignore_portal == TRUE){ + if (ignore_portal == TRUE) { net_connman_agent_complete_request_browser(connman_agent, context); return TRUE; } @@ -641,23 +657,13 @@ gboolean handle_request_browser(NetConnmanAgent *connman_agent, is_monitor_notifier_registered = TRUE; } -#if defined TIZEN_WEARABLE - if (is_portal_msg_shown){ - net_connman_agent_complete_request_browser(connman_agent, context); - return TRUE; - } - - is_portal_msg_shown = TRUE; - netconfig_start_timer_seconds(4, __netconfig_display_portal_msg, NULL, &portal_msg_timer); -#else - ret = netconfig_send_notification_to_net_popup(NETCONFIG_ADD_PORTAL_NOTI, ssid); -#endif + netconfig_send_notification_to_net_popup(NETCONFIG_ADD_PORTAL_NOTI, ssid); timer_data.time_elapsed = 0; __netconfig_wifi_portal_login_timer_start(&timer_data); net_connman_agent_complete_request_browser(connman_agent, context); - return ret; + return TRUE; #else GError *error = NULL; error = g_error_new(G_DBUS_ERROR, @@ -667,6 +673,6 @@ gboolean handle_request_browser(NetConnmanAgent *connman_agent, g_dbus_method_invocation_return_gerror(context, error); g_clear_error(&error); - return FALSE; + return TRUE; #endif }