Don't free dbus method invocation twice
[platform/core/connectivity/net-config.git] / src / wifi-agent.c
index fa5f49b..e66ffa4 100755 (executable)
@@ -32,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"
 #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"
 
@@ -49,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;
 };
 
@@ -62,12 +71,20 @@ static void __netconfig_agent_clear_fields(void)
        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;
 }
 
@@ -136,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;
@@ -151,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);
 
@@ -163,7 +190,7 @@ 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();
@@ -175,6 +202,30 @@ gboolean handle_set_field(NetConnmanAgent *connman_agent,
                                updated = TRUE;
 
                                DBG("Field [%s] - []", field);
+
+                               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) {
                        if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING) &&
@@ -189,14 +240,14 @@ gboolean handle_set_field(NetConnmanAgent *connman_agent,
                                agent.wps_pin = g_strdup(g_variant_get_string(value, NULL));
                                updated = TRUE;
 
-                               DBG("Field [%s] - []", field);
+                               DBG("Field [%s] - [%s]", field, agent.wps_pin);
                        }
                } else if (g_strcmp0(field, NETCONFIG_AGENT_FIELD_NAME) == 0) {
                        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);
+                               DBG("Field [%s] - [%s]", field, agent.name);
                        }
                } else if (g_strcmp0(field, NETCONFIG_AGENT_FIELD_SSID) == 0) {
                        if (agent.ssid != NULL) {
@@ -227,11 +278,29 @@ gboolean handle_set_field(NetConnmanAgent *connman_agent,
                                agent.identity = g_strdup(g_variant_get_string(value, NULL));
                                updated = TRUE;
 
-                               DBG("Field [%s] - []", field);
+                               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",
@@ -245,22 +314,23 @@ gboolean handle_set_field(NetConnmanAgent *connman_agent,
 
                        g_dbus_method_invocation_return_gerror(context, error);
                        g_clear_error(&error);
-                       return reply;
+                       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 reply;
+               return TRUE;
        }
 
-       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,
@@ -273,10 +343,10 @@ 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);
 
@@ -291,7 +361,7 @@ 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) {
@@ -304,14 +374,14 @@ 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;
@@ -332,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
                }
        }
 
@@ -347,7 +431,7 @@ gboolean handle_request_input(NetConnmanAgent *connman_agent,
        if (NULL == out_table) {
                net_connman_agent_complete_request_input(connman_agent, context, out_table);
 
-               return FALSE;
+               return TRUE;
        }
 
        if (updated == TRUE)
@@ -364,23 +448,21 @@ gboolean handle_request_input(NetConnmanAgent *connman_agent,
 
        __netconfig_agent_clear_fields();
 
-       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 */
 
-       return ret;
+       return TRUE;
 }
 
 #if defined TIZEN_CAPTIVE_PORTAL
@@ -549,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);
 
@@ -561,7 +642,7 @@ 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);
@@ -576,13 +657,13 @@ gboolean handle_request_browser(NetConnmanAgent *connman_agent,
                is_monitor_notifier_registered = TRUE;
        }
 
-       ret = netconfig_send_notification_to_net_popup(NETCONFIG_ADD_PORTAL_NOTI, ssid);
+       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,
@@ -592,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
 }