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
[email protected]
http://lists.connman.net/listinfo/connman