summaryrefslogtreecommitdiff
path: root/src/agent.c
diff options
context:
space:
mode:
authorHenri Bragge <henri.bragge@ixonos.com>2011-03-31 15:49:32 +0300
committerSamuel Ortiz <sameo@linux.intel.com>2011-04-01 18:26:29 +0200
commitba8f0c64622661f6055b9a78141d0acc8d35e657 (patch)
treeb59b21200ec556ec55d22df20d8afb9f03f3997d /src/agent.c
parente42f72c763fd7f0c28362b132fb6746d2c301640 (diff)
downloadconnman-ba8f0c64622661f6055b9a78141d0acc8d35e657.tar.gz
connman-ba8f0c64622661f6055b9a78141d0acc8d35e657.tar.bz2
connman-ba8f0c64622661f6055b9a78141d0acc8d35e657.zip
agent: Implement EAP identity and passphrase query
EAP credentials will be queried whenever connecting to an 802.1X network unless EAP-TLS is used OR if service is provisioned via .config file. 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.
Diffstat (limited to 'src/agent.c')
-rw-r--r--src/agent.c47
1 files changed, 44 insertions, 3 deletions
diff --git a/src/agent.c b/src/agent.c
index 9d42ad1e..3a8674e8 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,13 +115,22 @@ static void request_input_passphrase_reply(DBusPendingCall *call, void *user_dat
break;
dbus_message_iter_get_basic(&entry, &key);
- if (g_str_equal(key, "Passphrase")) {
+
+ 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);
+
+ } else 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")) {
wps = TRUE;
@@ -154,7 +164,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 +191,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 +217,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 = "response";
+ else
+ value = "passphrase";
+
+ break;
default:
value = "string";
break;
@@ -249,6 +283,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);