X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fagent.c;h=7aaf304f202245b8ae56470703b5d908de295e00;hb=57156cc5738cfbf60e1b0ddf444ad6eec5964a0d;hp=d0b3ecd53f45d3d13bf92e061150625540e9180f;hpb=26be4f3e78aea1bb6df7f77bcdb429a7e2b0329b;p=framework%2Fconnectivity%2Fconnman.git diff --git a/src/agent.c b/src/agent.c index d0b3ecd..7aaf304 100644 --- a/src/agent.c +++ b/src/agent.c @@ -2,7 +2,7 @@ * * Connection Manager * - * Copyright (C) 2007-2010 Intel Corporation. All rights reserved. + * Copyright (C) 2007-2012 Intel Corporation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -85,6 +85,26 @@ int __connman_agent_unregister(const char *sender, const char *path) return 0; } +static connman_bool_t check_reply_has_dict(DBusMessage *reply) +{ + const char *signature = DBUS_TYPE_ARRAY_AS_STRING + DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING + DBUS_TYPE_STRING_AS_STRING + DBUS_TYPE_VARIANT_AS_STRING + DBUS_DICT_ENTRY_END_CHAR_AS_STRING; + + if (dbus_message_has_signature(reply, signature) == TRUE) + return TRUE; + + connman_warn("Reply %s to %s from %s has wrong signature %s", + signature, + dbus_message_get_interface(reply), + dbus_message_get_sender(reply), + dbus_message_get_signature(reply)); + + return FALSE; +} + struct request_input_reply { struct connman_service *service; authentication_cb_t callback; @@ -96,6 +116,7 @@ static void request_input_passphrase_reply(DBusPendingCall *call, void *user_dat struct request_input_reply *passphrase_reply = user_data; connman_bool_t values_received = FALSE; connman_bool_t wps = FALSE; + const char *error = NULL; char *identity = NULL; char *passphrase = NULL; char *wpspin = NULL; @@ -105,7 +126,12 @@ static void request_input_passphrase_reply(DBusPendingCall *call, void *user_dat DBusMessageIter iter, dict; DBusMessage *reply = dbus_pending_call_steal_reply(call); - if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) + if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) { + error = dbus_message_get_error_name(reply); + goto done; + } + + if (check_reply_has_dict(reply) == FALSE) goto done; values_received = TRUE; @@ -172,31 +198,15 @@ static void request_input_passphrase_reply(DBusPendingCall *call, void *user_dat dbus_message_iter_next(&dict); } - if (wps == TRUE) { - struct connman_network *network; - - network = __connman_service_get_network( - passphrase_reply->service); - if (network == NULL) - goto done; - - connman_network_set_bool(network, "WiFi.UseWPS", wps); - - if (wpspin != NULL && strlen(wpspin) > 0) - connman_network_set_string(network, - "WiFi.PinWPS", wpspin); - else - connman_network_set_string(network, - "WiFi.PinWPS", NULL); - } - done: passphrase_reply->callback(passphrase_reply->service, values_received, name, name_len, identity, passphrase, + wps, wpspin, error, passphrase_reply->user_data); connman_service_unref(passphrase_reply->service); dbus_message_unref(reply); + dbus_pending_call_unref(call); g_free(passphrase_reply); } @@ -324,18 +334,62 @@ static void request_input_append_password(DBusMessageIter *iter, DBUS_TYPE_STRING, &str); } +static void request_input_append_previouspassphrase(DBusMessageIter *iter, + void *user_data) +{ + struct connman_service *service = user_data; + enum connman_service_security security; + const char *passphrase, *str = NULL; + + passphrase = __connman_service_get_passphrase(service); + + security = __connman_service_get_security(service); + switch (security) { + case CONNMAN_SERVICE_SECURITY_WEP: + str = "wep"; + break; + case CONNMAN_SERVICE_SECURITY_PSK: + str = "psk"; + break; + /* + * This should never happen: no passphrase is set if security is not + * one of the above.*/ + default: + break; + } + + connman_dbus_dict_append_basic(iter, "Type", + DBUS_TYPE_STRING, &str); + + str = "informational"; + connman_dbus_dict_append_basic(iter, "Requirement", + DBUS_TYPE_STRING, &str); + + connman_dbus_dict_append_basic(iter, "Value", + DBUS_TYPE_STRING, &passphrase); +} + static void request_input_login_reply(DBusPendingCall *call, void *user_data) { struct request_input_reply *username_password_reply = user_data; + const char *error = NULL; + connman_bool_t values_received = FALSE; 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) + if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) { + error = dbus_message_get_error_name(reply); + goto done; + } + + if (check_reply_has_dict(reply) == FALSE) goto done; + values_received = TRUE; + dbus_message_iter_init(reply, &iter); dbus_message_iter_recurse(&iter, &dict); while (dbus_message_iter_get_arg_type(&dict) == DBUS_TYPE_DICT_ENTRY) { @@ -369,8 +423,9 @@ static void request_input_login_reply(DBusPendingCall *call, void *user_data) done: username_password_reply->callback(username_password_reply->service, - TRUE, NULL, 0, + values_received, NULL, 0, username, password, + FALSE, NULL, error, username_password_reply->user_data); connman_service_unref(username_password_reply->service); dbus_message_unref(reply); @@ -417,8 +472,16 @@ int __connman_agent_request_passphrase_input(struct connman_service *service, request_input_append_identity, service); } - connman_dbus_dict_append_dict(&dict, "Passphrase", - request_input_append_passphrase, service); + if (__connman_service_get_security(service) != + CONNMAN_SERVICE_SECURITY_NONE) { + connman_dbus_dict_append_dict(&dict, "Passphrase", + request_input_append_passphrase, service); + + if (__connman_service_get_passphrase(service) != NULL) + connman_dbus_dict_append_dict(&dict, "PreviousPassphrase", + request_input_append_previouspassphrase, + service); + } if (__connman_service_wps_enabled(service) == TRUE) { connman_dbus_dict_append_dict(&dict, "WPS", @@ -433,8 +496,9 @@ int __connman_agent_request_passphrase_input(struct connman_service *service, return -ENOMEM; } - if (dbus_connection_send_with_reply(connection, message, - &call, -1) == FALSE) { + if (dbus_connection_send_with_reply(connection, message, &call, + connman_timeout_input_request()) + == FALSE) { dbus_message_unref(message); g_free(passphrase_reply); return -ESRCH; @@ -455,7 +519,7 @@ int __connman_agent_request_passphrase_input(struct connman_service *service, dbus_message_unref(message); - return -EIO; + return -EINPROGRESS; } int __connman_agent_request_login_input(struct connman_service *service, @@ -499,8 +563,9 @@ int __connman_agent_request_login_input(struct connman_service *service, return -ENOMEM; } - if (dbus_connection_send_with_reply(connection, message, - &call, -1) == FALSE) { + if (dbus_connection_send_with_reply(connection, message, &call, + connman_timeout_input_request()) + == FALSE) { dbus_message_unref(message); g_free(username_password_reply); return -ESRCH; @@ -521,7 +586,7 @@ int __connman_agent_request_login_input(struct connman_service *service, dbus_message_unref(message); - return -EIO; + return -EINPROGRESS; } struct request_browser_reply_data { @@ -535,15 +600,18 @@ static void request_browser_reply(DBusPendingCall *call, void *user_data) struct request_browser_reply_data *browser_reply_data = user_data; DBusMessage *reply = dbus_pending_call_steal_reply(call); connman_bool_t result = FALSE; + const char *error = NULL; - if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) + if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) { + error = dbus_message_get_error_name(reply); goto done; + } result = TRUE; done: - browser_reply_data->callback(browser_reply_data->service, - result, browser_reply_data->user_data); + browser_reply_data->callback(browser_reply_data->service, result, + error, browser_reply_data->user_data); connman_service_unref(browser_reply_data->service); dbus_message_unref(reply); g_free(browser_reply_data); @@ -584,8 +652,9 @@ int __connman_agent_request_browser(struct connman_service *service, return -ENOMEM; } - if (dbus_connection_send_with_reply(connection, message, - &call, -1) == FALSE) { + if (dbus_connection_send_with_reply(connection, message, &call, + connman_timeout_browser_launch()) + == FALSE) { dbus_message_unref(message); g_free(browser_reply_data); return -ESRCH; @@ -606,7 +675,7 @@ int __connman_agent_request_browser(struct connman_service *service, dbus_message_unref(message); - return -EIO; + return -EINPROGRESS; } struct report_error_data { @@ -635,6 +704,7 @@ static void report_error_reply(DBusPendingCall *call, void *user_data) connman_service_unref(report_error->service); g_free(report_error); dbus_message_unref(reply); + dbus_pending_call_unref(call); } int __connman_agent_report_error(struct connman_service *service, @@ -671,8 +741,9 @@ int __connman_agent_report_error(struct connman_service *service, return -ENOMEM; } - if (dbus_connection_send_with_reply(connection, message, - &call, -1) == FALSE) { + if (dbus_connection_send_with_reply(connection, message, &call, + connman_timeout_input_request()) + == FALSE) { dbus_message_unref(message); g_free(report_error); return -ESRCH; @@ -691,7 +762,7 @@ int __connman_agent_report_error(struct connman_service *service, report_error, NULL); dbus_message_unref(message); - return -EIO; + return -EINPROGRESS; } int __connman_agent_init(void)