Besides adding Identity field into the API, this patch also removes the
restriction to receive value for only one field per response. Now both
Identity and Passphrase can be received in one call.
---
 src/agent.c   |   51 +++++++++++++++++++++++++++++++++++++++++++++++----
 src/connman.h |    3 ++-
 src/service.c |   18 ++++++++++++++++--
 3 files changed, 65 insertions(+), 7 deletions(-)

diff --git a/src/agent.c b/src/agent.c
index 9d42ad1..71e9333 100644
--- a/src/agent.c
+++ b/src/agent.c
@@ -95,6 +95,7 @@ static void request_input_passphrase_reply(DBusPendingCall 
*call, void *user_dat
 {
        struct request_input_reply *passphrase_reply = user_data;
        connman_bool_t wps = FALSE;
+       char *identity = NULL;
        char *passphrase = NULL;
        char *wpspin = NULL;
        char *key;
@@ -114,14 +115,25 @@ static void 
request_input_passphrase_reply(DBusPendingCall *call, void *user_dat
                        break;
 
                dbus_message_iter_get_basic(&entry, &key);
+
+               if (g_str_equal(key, "Identity")) {
+                       dbus_message_iter_next(&entry);
+                       if (dbus_message_iter_get_arg_type(&entry)
+                                                       != DBUS_TYPE_VARIANT)
+                               break;
+                       dbus_message_iter_recurse(&entry, &value);
+                       dbus_message_iter_get_basic(&value, &identity);
+               }
+
                if (g_str_equal(key, "Passphrase")) {
                        dbus_message_iter_next(&entry);
                        if (dbus_message_iter_get_arg_type(&entry) != 
DBUS_TYPE_VARIANT)
                                break;
                        dbus_message_iter_recurse(&entry, &value);
                        dbus_message_iter_get_basic(&value, &passphrase);
-                       break;
-               } else if (g_str_equal(key, "WPS")) {
+               }
+
+               if (g_str_equal(key, "WPS")) {
                        wps = TRUE;
 
                        dbus_message_iter_next(&entry);
@@ -130,8 +142,8 @@ static void request_input_passphrase_reply(DBusPendingCall 
*call, void *user_dat
                                break;
                        dbus_message_iter_recurse(&entry, &value);
                        dbus_message_iter_get_basic(&value, &wpspin);
-                       break;
                }
+
                dbus_message_iter_next(&dict);
        }
 
@@ -154,7 +166,7 @@ static void request_input_passphrase_reply(DBusPendingCall 
*call, void *user_dat
        }
 
 done:
-       passphrase_reply->callback(passphrase_reply->service,
+       passphrase_reply->callback(passphrase_reply->service, identity,
                                passphrase, passphrase_reply->user_data);
        connman_service_unref(passphrase_reply->service);
        dbus_message_unref(reply);
@@ -181,11 +193,24 @@ static void 
request_input_append_alternates(DBusMessageIter *iter,
        g_strfreev(alternates);
 }
 
+static void request_input_append_identity(DBusMessageIter *iter,
+                                                       void *user_data)
+{
+       char *str = "string";
+
+       connman_dbus_dict_append_basic(iter, "Type",
+                               DBUS_TYPE_STRING, &str);
+       str = "Mandatory";
+       connman_dbus_dict_append_basic(iter, "Requirement",
+                               DBUS_TYPE_STRING, &str);
+}
+
 static void request_input_append_passphrase(DBusMessageIter *iter,
                                                        void *user_data)
 {
        struct connman_service *service = user_data;
        char *value;
+       const char *phase2;
 
        switch (__connman_service_get_security(service)) {
        case CONNMAN_SERVICE_SECURITY_WEP:
@@ -194,6 +219,17 @@ static void 
request_input_append_passphrase(DBusMessageIter *iter,
        case CONNMAN_SERVICE_SECURITY_PSK:
                value = "psk";
                break;
+       case CONNMAN_SERVICE_SECURITY_8021X:
+               phase2 = __connman_service_get_phase2(service);
+
+               if (phase2 != NULL && (
+                               g_str_has_suffix(phase2, "GTC") == TRUE ||
+                               g_str_has_suffix(phase2, "OTP") == TRUE))
+                       value = "eap-response";
+               else
+                       value = "eap-password";
+
+               break;
        default:
                value = "string";
                break;
@@ -249,6 +285,13 @@ int __connman_agent_request_input(struct connman_service 
*service,
                                DBUS_TYPE_OBJECT_PATH, &path);
 
        connman_dbus_dict_open(&iter, &dict);
+
+       if (__connman_service_get_security(service) ==
+                       CONNMAN_SERVICE_SECURITY_8021X) {
+               connman_dbus_dict_append_dict(&dict, "Identity",
+                                       request_input_append_identity, service);
+       }
+
        connman_dbus_dict_append_dict(&dict, "Passphrase",
                                request_input_append_passphrase, service);
 
diff --git a/src/connman.h b/src/connman.h
index 1eda025..c819e58 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -72,7 +72,8 @@ void __connman_counter_cleanup(void);
 struct connman_service *service;
 
 typedef void (* passphrase_cb_t) (struct connman_service *service,
-                               const char *passphrase, void *user_data);
+                               const char *identity, const char *passphrase,
+                               void *user_data);
 typedef void (* report_error_cb_t) (struct connman_service *service,
                                gboolean retry, void *user_data);
 int __connman_agent_request_input(struct connman_service *service,
diff --git a/src/service.c b/src/service.c
index a3f666c..1d9c650 100644
--- a/src/service.c
+++ b/src/service.c
@@ -2634,13 +2634,17 @@ static connman_bool_t get_reconnect_state(struct 
connman_service *service)
 }
 
 static void request_input_cb (struct connman_service *service,
-                       const char *passphrase, void *user_data)
+                       const char *identity, const char *passphrase,
+                       void *user_data)
 {
        DBG ("RequestInput return, %p", service);
 
-       if (passphrase == NULL && service->wps == FALSE)
+       if (identity == NULL && passphrase == NULL && service->wps == FALSE)
                return;
 
+       if (identity != NULL)
+               __connman_service_set_identity(service, identity);
+
        if (passphrase != NULL)
                __connman_service_set_passphrase(service, passphrase);
 
@@ -3778,6 +3782,16 @@ static int service_connect(struct connman_service 
*service)
                        }
                        break;
                case CONNMAN_SERVICE_SECURITY_8021X:
+                       if (service->eap == NULL)
+                               return -EINVAL;
+
+                       /* never request credentials if using EAP-TLS */
+                       if (g_str_equal(service->eap, "tls") == TRUE)
+                               break;
+
+                       if (service->immutable != TRUE)
+                               return -ENOKEY;
+
                        break;
                }
                break;
-- 
1.7.0.4


_______________________________________________
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman

Reply via email to