Add new fields for agent provided identity/passphrase in service struct
(agent_identity/agent_passphrase) and network ("WiFi.AgentIdentity" and
"WiFi.AgentPassphrase").

Preparing these values in prepare_8021x() is left out because the same
thing is done in request_input_cb(), which is where the values always
come from.
---
 src/connman.h |    4 ++++
 src/network.c |   14 ++++++++++++++
 src/service.c |   46 +++++++++++++++++++++++++++++++++++++++++++---
 3 files changed, 61 insertions(+), 3 deletions(-)

diff --git a/src/connman.h b/src/connman.h
index 681b29f..1dc6e51 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -542,8 +542,12 @@ void __connman_service_set_proxy_autoconfig(struct 
connman_service *service,
 
 void __connman_service_set_identity(struct connman_service *service,
                                        const char *identity);
+void __connman_service_set_agent_identity(struct connman_service *service,
+                                               const char *agent_identity);
 void __connman_service_set_passphrase(struct connman_service *service,
                                        const char* passphrase);
+void __connman_service_set_agent_passphrase(struct connman_service *service,
+                                               const char *agent_passphrase);
 
 void __connman_service_notify(struct connman_service *service,
                        unsigned int rx_packets, unsigned int tx_packets,
diff --git a/src/network.c b/src/network.c
index 40ab8aa..62f15b6 100644
--- a/src/network.c
+++ b/src/network.c
@@ -63,8 +63,10 @@ struct connman_network {
                unsigned short channel;
                char *security;
                char *passphrase;
+               char *agent_passphrase;
                char *eap;
                char *identity;
+               char *agent_identity;
                char *ca_cert_path;
                char *client_cert_path;
                char *private_key_path;
@@ -315,8 +317,10 @@ static void network_destruct(struct connman_network 
*network)
        g_free(network->wifi.mode);
        g_free(network->wifi.security);
        g_free(network->wifi.passphrase);
+       g_free(network->wifi.agent_passphrase);
        g_free(network->wifi.eap);
        g_free(network->wifi.identity);
+       g_free(network->wifi.agent_identity);
        g_free(network->wifi.ca_cert_path);
        g_free(network->wifi.client_cert_path);
        g_free(network->wifi.private_key_path);
@@ -1564,12 +1568,18 @@ int connman_network_set_string(struct connman_network 
*network,
        } else if (g_str_equal(key, "WiFi.Passphrase") == TRUE) {
                g_free(network->wifi.passphrase);
                network->wifi.passphrase = g_strdup(value);
+       } else if (g_str_equal(key, "WiFi.AgentPassphrase") == TRUE) {
+               g_free(network->wifi.agent_passphrase);
+               network->wifi.agent_passphrase = g_strdup(value);
        } else if (g_str_equal(key, "WiFi.EAP") == TRUE) {
                g_free(network->wifi.eap);
                network->wifi.eap = g_strdup(value);
        } else if (g_str_equal(key, "WiFi.Identity") == TRUE) {
                g_free(network->wifi.identity);
                network->wifi.identity = g_strdup(value);
+       } else if (g_str_equal(key, "WiFi.AgentIdentity") == TRUE) {
+               g_free(network->wifi.agent_identity);
+               network->wifi.agent_identity = g_strdup(value);
        } else if (g_str_equal(key, "WiFi.CACertFile") == TRUE) {
                g_free(network->wifi.ca_cert_path);
                network->wifi.ca_cert_path = g_strdup(value);
@@ -1619,10 +1629,14 @@ const char *connman_network_get_string(struct 
connman_network *network,
                return network->wifi.security;
        else if (g_str_equal(key, "WiFi.Passphrase") == TRUE)
                return network->wifi.passphrase;
+       else if (g_str_equal(key, "WiFi.AgentPassphrase") == TRUE)
+               return network->wifi.agent_passphrase;
        else if (g_str_equal(key, "WiFi.EAP") == TRUE)
                return network->wifi.eap;
        else if (g_str_equal(key, "WiFi.Identity") == TRUE)
                return network->wifi.identity;
+       else if (g_str_equal(key, "WiFi.AgentIdentity") == TRUE)
+               return network->wifi.agent_identity;
        else if (g_str_equal(key, "WiFi.CACertFile") == TRUE)
                return network->wifi.ca_cert_path;
        else if (g_str_equal(key, "WiFi.ClientCertFile") == TRUE)
diff --git a/src/service.c b/src/service.c
index d442c16..c3d3e14 100644
--- a/src/service.c
+++ b/src/service.c
@@ -75,6 +75,7 @@ struct connman_service {
        unsigned int order;
        char *name;
        char *passphrase;
+       char *agent_passphrase;
        char *profile;
        connman_bool_t roaming;
        connman_bool_t login_required;
@@ -91,6 +92,7 @@ struct connman_service {
        /* 802.1x settings from the config files */
        char *eap;
        char *identity;
+       char *agent_identity;
        char *ca_cert_file;
        char *client_cert_file;
        char *private_key_file;
@@ -2048,6 +2050,18 @@ void __connman_service_set_identity(struct 
connman_service *service,
                                        service->identity);
 }
 
+void __connman_service_set_agent_identity(struct connman_service *service,
+                                               const char *agent_identity)
+{
+       g_free(service->agent_identity);
+       service->agent_identity = g_strdup(agent_identity);
+
+       if (service->network != NULL)
+               connman_network_set_string(service->network,
+                                       "WiFi.AgentIdentity",
+                                       service->agent_identity);
+}
+
 void __connman_service_set_passphrase(struct connman_service *service,
                                        const char* passphrase)
 {
@@ -2067,6 +2081,18 @@ void __connman_service_set_passphrase(struct 
connman_service *service,
        __connman_storage_save_service(service);
 }
 
+void __connman_service_set_agent_passphrase(struct connman_service *service,
+                                               const char *agent_passphrase)
+{
+       g_free(service->agent_passphrase);
+       service->agent_passphrase = g_strdup(agent_passphrase);
+
+       if (service->network != NULL)
+               connman_network_set_string(service->network,
+                                       "WiFi.AgentPassphrase",
+                                       service->agent_passphrase);
+}
+
 static DBusMessage *get_properties(DBusConnection *conn,
                                        DBusMessage *msg, void *user_data)
 {
@@ -2726,12 +2752,16 @@ static void request_input_cb (struct connman_service 
*service,
                return;
 
        if (identity != NULL)
-               __connman_service_set_identity(service, identity);
+               __connman_service_set_agent_identity(service, identity);
 
        if (passphrase != NULL)
-               __connman_service_set_passphrase(service, passphrase);
+               __connman_service_set_agent_passphrase(service, passphrase);
 
        __connman_service_connect(service);
+
+       /* Never cache agent provided credentials */
+       __connman_service_set_agent_identity(service, NULL);
+       __connman_service_set_agent_passphrase(service, NULL);
 }
 
 static DBusMessage *connect_service(DBusConnection *conn,
@@ -2996,9 +3026,11 @@ static void service_free(gpointer user_data)
        g_free(service->profile);
        g_free(service->name);
        g_free(service->passphrase);
+       g_free(service->agent_passphrase);
        g_free(service->identifier);
        g_free(service->eap);
        g_free(service->identity);
+       g_free(service->agent_identity);
        g_free(service->ca_cert_file);
        g_free(service->client_cert_file);
        g_free(service->private_key_file);
@@ -3847,7 +3879,15 @@ static int service_connect(struct connman_service 
*service)
                        if (g_str_equal(service->eap, "tls") == TRUE)
                                break;
 
-                       if (service->immutable != TRUE)
+                       /*
+                        * Return -ENOKEY if either identity or passphrase is
+                        * missing. Agent provided credentials can be used as
+                        * fallback if needed.
+                        */
+                       if ((service->identity == NULL &&
+                                       service->agent_identity == NULL) ||
+                                       (service->passphrase == NULL &&
+                                       service->agent_passphrase == NULL))
                                return -ENOKEY;
 
                        break;
-- 
1.7.0.4


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

Reply via email to