As there are networks that mandate the use of an anonymous
identity, we need to support it.

Reported by alin.
---
 doc/config-format.txt     |  1 +
 gsupplicant/gsupplicant.h |  1 +
 gsupplicant/supplicant.c  |  4 ++++
 plugins/wifi.c            |  3 +++
 src/config.c              | 15 +++++++++++++++
 src/connman.h             |  2 ++
 src/network.c             |  7 +++++++
 src/service.c             | 28 ++++++++++++++++++++++++++++
 8 files changed, 61 insertions(+)

diff --git a/doc/config-format.txt b/doc/config-format.txt
index b16f4e4..eae51e0 100644
--- a/doc/config-format.txt
+++ b/doc/config-format.txt
@@ -83,6 +83,7 @@ The following options are valid if Type is "wifi"
   passphrase. The PrivateKeyPassphrase field is ignored when this field is set
   to fsid.
 - Identity: Identity string for EAP.
+- AnonymousIdentity: Anonymous Identity string for EAP.
 - Phase2: Phase2 (inner authentication with TLS tunnel) authentication method.
   Prefix the value with "EAP-" to indicate the usage of an EAP-based inner
   authentication method (should only be used with EAP = TTLS).
diff --git a/gsupplicant/gsupplicant.h b/gsupplicant/gsupplicant.h
index 2a87f2f..a2a7605 100644
--- a/gsupplicant/gsupplicant.h
+++ b/gsupplicant/gsupplicant.h
@@ -142,6 +142,7 @@ struct _GSupplicantSSID {
        const char *eap;
        const char *passphrase;
        const char *identity;
+       const char *anonymous_identity;
        const char *ca_cert_path;
        const char *client_cert_path;
        const char *private_key_path;
diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c
index 0d32934..98ca94b 100644
--- a/gsupplicant/supplicant.c
+++ b/gsupplicant/supplicant.c
@@ -4385,6 +4385,10 @@ static void add_network_security_eap(DBusMessageIter 
*dict,
        supplicant_dbus_dict_append_basic(dict, "identity",
                                                DBUS_TYPE_STRING,
                                                &ssid->identity);
+       if(ssid->anonymous_identity)
+               supplicant_dbus_dict_append_basic(dict, "anonymous_identity",
+                                                    DBUS_TYPE_STRING,
+                                                    &ssid->anonymous_identity);
 
        g_free(eap_value);
 }
diff --git a/plugins/wifi.c b/plugins/wifi.c
index 176a84d..dfe849f 100644
--- a/plugins/wifi.c
+++ b/plugins/wifi.c
@@ -84,6 +84,7 @@ struct hidden_params {
        char ssid[32];
        unsigned int ssid_len;
        char *identity;
+       char *anonymous_identity;
        char *passphrase;
        char *security;
        GSupplicantScanParams *scan_params;
@@ -2027,6 +2028,8 @@ static void ssid_init(GSupplicantSSID *ssid, struct 
connman_network *network)
                ssid->identity = connman_network_get_string(network,
                                                        "WiFi.AgentIdentity");
 
+       ssid->anonymous_identity = connman_network_get_string(network,
+                                               "WiFi.AnonymousIdentity");
        ssid->ca_cert_path = connman_network_get_string(network,
                                                        "WiFi.CACertFile");
        ssid->client_cert_path = connman_network_get_string(network,
diff --git a/src/config.c b/src/config.c
index 0d7061c..88f8bd5 100644
--- a/src/config.c
+++ b/src/config.c
@@ -45,6 +45,7 @@ struct connman_config_service {
        unsigned int ssid_len;
        char *eap;
        char *identity;
+       char *anonymous_identity;
        char *ca_cert_file;
        char *client_cert_file;
        char *private_key_file;
@@ -98,6 +99,7 @@ static bool cleanup = false;
 #define SERVICE_KEY_PRV_KEY_PASS       "PrivateKeyPassphrase"
 #define SERVICE_KEY_PRV_KEY_PASS_TYPE  "PrivateKeyPassphraseType"
 #define SERVICE_KEY_IDENTITY           "Identity"
+#define SERVICE_KEY_ANONYMOUS_IDENTITY "AnonymousIdentity"
 #define SERVICE_KEY_PHASE2             "Phase2"
 #define SERVICE_KEY_PASSPHRASE         "Passphrase"
 #define SERVICE_KEY_SECURITY           "Security"
@@ -129,6 +131,7 @@ static const char *service_possible_keys[] = {
        SERVICE_KEY_PRV_KEY_PASS,
        SERVICE_KEY_PRV_KEY_PASS_TYPE,
        SERVICE_KEY_IDENTITY,
+       SERVICE_KEY_ANONYMOUS_IDENTITY,
        SERVICE_KEY_PHASE2,
        SERVICE_KEY_PASSPHRASE,
        SERVICE_KEY_SECURITY,
@@ -220,6 +223,7 @@ free_only:
        g_free(config_service->ssid);
        g_free(config_service->eap);
        g_free(config_service->identity);
+       g_free(config_service->anonymous_identity);
        g_free(config_service->ca_cert_file);
        g_free(config_service->client_cert_file);
        g_free(config_service->private_key_file);
@@ -655,6 +659,13 @@ static bool load_service(GKeyFile *keyfile, const char 
*group,
                service->identity = str;
        }
 
+       str = __connman_config_get_string(keyfile, group,
+                                       SERVICE_KEY_ANONYMOUS_IDENTITY, NULL);
+       if (str) {
+               g_free(service->anonymous_identity);
+               service->anonymous_identity = str;
+       }
+
        str = __connman_config_get_string(keyfile, group, SERVICE_KEY_PHASE2, 
NULL);
        if (str) {
                g_free(service->phase2);
@@ -1034,6 +1045,10 @@ static void provision_service_wifi(struct 
connman_config_service *config,
                __connman_service_set_string(service, "Identity",
                                                        config->identity);
 
+       if (config->anonymous_identity)
+               __connman_service_set_string(service, "AnonymousIdentity",
+                                               config->anonymous_identity);
+
        if (config->ca_cert_file)
                __connman_service_set_string(service, "CACertFile",
                                                        config->ca_cert_file);
diff --git a/src/connman.h b/src/connman.h
index 654b8fa..35eb3f5 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -771,6 +771,8 @@ 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_anonymous_identity(struct connman_service *service,
+                                       const char *anonymous_identity);
 void __connman_service_set_agent_identity(struct connman_service *service,
                                                const char *agent_identity);
 int __connman_service_set_passphrase(struct connman_service *service,
diff --git a/src/network.c b/src/network.c
index badb770..4f0d5bd 100644
--- a/src/network.c
+++ b/src/network.c
@@ -78,6 +78,7 @@ struct connman_network {
                char *passphrase;
                char *eap;
                char *identity;
+               char *anonymous_identity;
                char *agent_identity;
                char *ca_cert_path;
                char *client_cert_path;
@@ -906,6 +907,7 @@ static void network_destruct(struct connman_network 
*network)
        g_free(network->wifi.passphrase);
        g_free(network->wifi.eap);
        g_free(network->wifi.identity);
+       g_free(network->wifi.anonymous_identity);
        g_free(network->wifi.agent_identity);
        g_free(network->wifi.ca_cert_path);
        g_free(network->wifi.client_cert_path);
@@ -1816,6 +1818,9 @@ int connman_network_set_string(struct connman_network 
*network,
        } else if (g_str_equal(key, "WiFi.Identity")) {
                g_free(network->wifi.identity);
                network->wifi.identity = g_strdup(value);
+       } else if (g_str_equal(key, "WiFi.AnonymousIdentity")) {
+               g_free(network->wifi.anonymous_identity);
+               network->wifi.anonymous_identity = g_strdup(value);
        } else if (g_str_equal(key, "WiFi.AgentIdentity")) {
                g_free(network->wifi.agent_identity);
                network->wifi.agent_identity = g_strdup(value);
@@ -1872,6 +1877,8 @@ const char *connman_network_get_string(struct 
connman_network *network,
                return network->wifi.eap;
        else if (g_str_equal(key, "WiFi.Identity"))
                return network->wifi.identity;
+       else if (g_str_equal(key, "WiFi.AnonymousIdentity"))
+               return network->wifi.anonymous_identity;
        else if (g_str_equal(key, "WiFi.AgentIdentity"))
                return network->wifi.agent_identity;
        else if (g_str_equal(key, "WiFi.CACertFile"))
diff --git a/src/service.c b/src/service.c
index 8d73f22..d80dd4c 100644
--- a/src/service.c
+++ b/src/service.c
@@ -100,6 +100,7 @@ struct connman_service {
        /* 802.1x settings from the config files */
        char *eap;
        char *identity;
+       char *anonymous_identity;
        char *agent_identity;
        char *ca_cert_file;
        char *client_cert_file;
@@ -2800,6 +2801,21 @@ void __connman_service_set_identity(struct 
connman_service *service,
                                        service->identity);
 }
 
+void __connman_service_set_anonymous_identity(struct connman_service *service,
+                                               const char *anonymous_identity)
+{
+       if (service->immutable || service->hidden)
+               return;
+
+       g_free(service->anonymous_identity);
+       service->anonymous_identity = g_strdup(anonymous_identity);
+
+       if (service->network)
+               connman_network_set_string(service->network,
+                                       "WiFi.AnonymousIdentity",
+                                       service->anonymous_identity);
+}
+
 void __connman_service_set_agent_identity(struct connman_service *service,
                                                const char *agent_identity)
 {
@@ -4074,6 +4090,9 @@ bool __connman_service_remove(struct connman_service 
*service)
        g_free(service->identity);
        service->identity = NULL;
 
+       g_free(service->anonymous_identity);
+       service->anonymous_identity = NULL;
+
        g_free(service->agent_identity);
        service->agent_identity = NULL;
 
@@ -4524,6 +4543,7 @@ static void service_free(gpointer user_data)
        g_free(service->identifier);
        g_free(service->eap);
        g_free(service->identity);
+       g_free(service->anonymous_identity);
        g_free(service->agent_identity);
        g_free(service->ca_cert_file);
        g_free(service->client_cert_file);
@@ -4997,6 +5017,9 @@ void __connman_service_set_string(struct connman_service 
*service,
        } else if (g_str_equal(key, "Identity")) {
                g_free(service->identity);
                service->identity = g_strdup(value);
+       } else if (g_str_equal(key, "AnonymousIdentity")) {
+               g_free(service->anonymous_identity);
+               service->anonymous_identity = g_strdup(value);
        } else if (g_str_equal(key, "CACertFile")) {
                g_free(service->ca_cert_file);
                service->ca_cert_file = g_strdup(value);
@@ -5840,6 +5863,11 @@ static void prepare_8021x(struct connman_service 
*service)
                connman_network_set_string(service->network, "WiFi.Identity",
                                                        service->identity);
 
+       if (service->anonymous_identity)
+               connman_network_set_string(service->network,
+                                               "WiFi.AnonymousIdentity",
+                                               service->anonymous_identity);
+
        if (service->ca_cert_file)
                connman_network_set_string(service->network, "WiFi.CACertFile",
                                                        service->ca_cert_file);
-- 
2.1.0

_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman

Reply via email to