From b5c92ef3e1b00bc2c49b3d12632284ac3c4ba156 Mon Sep 17 00:00:00 2001 From: Tomasz Bursztyka Date: Mon, 29 Aug 2011 18:25:06 +0300 Subject: [PATCH] agent: Added Username/Password request input logic --- src/agent.c | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- src/connman.h | 4 +- src/service.c | 2 +- 3 files changed, 135 insertions(+), 3 deletions(-) diff --git a/src/agent.c b/src/agent.c index 56217ef..1c982ed 100644 --- a/src/agent.c +++ b/src/agent.c @@ -257,7 +257,71 @@ static void request_input_append_wps(DBusMessageIter *iter, void *user_data) DBUS_TYPE_STRING, &str); } -int __connman_agent_request_input(struct connman_service *service, +static void request_input_append_password(DBusMessageIter *iter, + void *user_data) +{ + char *str = "passphrase"; + + 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_login_reply(DBusPendingCall *call, void *user_data) +{ + struct request_input_reply *username_password_reply = user_data; + char *username = NULL; + char *password = NULL; + char *key; + DBusMessageIter iter, dict; + DBusMessage *reply = dbus_pending_call_steal_reply(call); + + if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) + goto done; + + dbus_message_iter_init(reply, &iter); + dbus_message_iter_recurse(&iter, &dict); + while (dbus_message_iter_get_arg_type(&dict) == DBUS_TYPE_DICT_ENTRY) { + DBusMessageIter entry, value; + + dbus_message_iter_recurse(&dict, &entry); + if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_STRING) + break; + + dbus_message_iter_get_basic(&entry, &key); + + if (g_str_equal(key, "Username")) { + 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, &username); + + } else if (g_str_equal(key, "Password")) { + 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, &password); + } + + dbus_message_iter_next(&dict); + } + +done: + username_password_reply->callback(username_password_reply->service, + username, password, + username_password_reply->user_data); + connman_service_unref(username_password_reply->service); + dbus_message_unref(reply); + g_free(username_password_reply); +} + +int __connman_agent_request_passphrase_input(struct connman_service *service, authentication_cb_t callback, void *user_data) { DBusMessage *message; @@ -331,6 +395,72 @@ int __connman_agent_request_input(struct connman_service *service, return -EIO; } +int __connman_agent_request_login_input(struct connman_service *service, + authentication_cb_t callback, void *user_data) +{ + DBusMessage *message; + const char *path; + DBusMessageIter iter; + DBusMessageIter dict; + DBusPendingCall *call; + struct request_input_reply *username_password_reply; + + if (service == NULL || agent_path == NULL || callback == NULL) + return -ESRCH; + + message = dbus_message_new_method_call(agent_sender, agent_path, + CONNMAN_AGENT_INTERFACE, + "RequestInput"); + if (message == NULL) + return -ENOMEM; + + dbus_message_iter_init_append(message, &iter); + + path = __connman_service_get_path(service); + dbus_message_iter_append_basic(&iter, + DBUS_TYPE_OBJECT_PATH, &path); + + connman_dbus_dict_open(&iter, &dict); + + connman_dbus_dict_append_dict(&dict, "Username", + request_input_append_identity, service); + + connman_dbus_dict_append_dict(&dict, "Password", + request_input_append_password, service); + + connman_dbus_dict_close(&iter, &dict); + + username_password_reply = g_try_new0(struct request_input_reply, 1); + if (username_password_reply == NULL) { + dbus_message_unref(message); + return -ENOMEM; + } + + if (dbus_connection_send_with_reply(connection, message, + &call, -1) == FALSE) { + dbus_message_unref(message); + g_free(username_password_reply); + return -ESRCH; + } + + if (call == NULL) { + dbus_message_unref(message); + g_free(username_password_reply); + return -ESRCH; + } + + username_password_reply->service = connman_service_ref(service); + username_password_reply->callback = callback; + username_password_reply->user_data = user_data; + + dbus_pending_call_set_notify(call, request_input_login_reply, + username_password_reply, NULL); + + dbus_message_unref(message); + + return -EIO; +} + struct report_error_data { struct connman_service *service; report_error_cb_t callback; diff --git a/src/connman.h b/src/connman.h index 9b9c18e..364cdd5 100644 --- a/src/connman.h +++ b/src/connman.h @@ -87,7 +87,9 @@ typedef void (* authentication_cb_t) (struct connman_service *service, 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, +int __connman_agent_request_passphrase_input(struct connman_service *service, + authentication_cb_t callback, void *user_data); +int __connman_agent_request_login_input(struct connman_service *service, authentication_cb_t callback, void *user_data); int __connman_agent_report_error(struct connman_service *service, const char *error, diff --git a/src/service.c b/src/service.c index 841d9a3..6bfcc19 100644 --- a/src/service.c +++ b/src/service.c @@ -4489,7 +4489,7 @@ int __connman_service_connect(struct connman_service *service) if (service->userconnect == TRUE) { if (err == -ENOKEY) { - if (__connman_agent_request_input(service, + if (__connman_agent_request_passphrase_input(service, request_input_cb, NULL) == -EIO) return -EINPROGRESS; -- 2.7.4