X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fagent.c;h=e1d7332c1f331cb1a3fff39638269bed4564d5ee;hb=7c1ddffb3a7c840f63ac969be5b294971d5c7327;hp=e3433c8c8555610be9a573f5f9e0c30e13523bab;hpb=8757d58e68a6fa1132c34b0445908e1039832045;p=framework%2Fconnectivity%2Fconnman.git diff --git a/src/agent.c b/src/agent.c index e3433c8..e1d7332 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; @@ -176,10 +202,11 @@ done: passphrase_reply->callback(passphrase_reply->service, values_received, name, name_len, identity, passphrase, - wps, wpspin, + 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); } @@ -307,18 +334,39 @@ static void request_input_append_password(DBusMessageIter *iter, DBUS_TYPE_STRING, &str); } +static void request_input_append_previouspassphrase(DBusMessageIter *iter, + void *user_data) +{ + const char *passphrase = user_data; + const char *str = "informational"; + + connman_dbus_dict_append_basic(iter, "Type", + 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) { @@ -352,9 +400,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, + FALSE, NULL, error, username_password_reply->user_data); connman_service_unref(username_password_reply->service); dbus_message_unref(reply); @@ -365,7 +413,7 @@ int __connman_agent_request_passphrase_input(struct connman_service *service, authentication_cb_t callback, void *user_data) { DBusMessage *message; - const char *path; + const char *path, *passphrase; DBusMessageIter iter; DBusMessageIter dict; DBusPendingCall *call; @@ -401,8 +449,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); + passphrase = __connman_service_get_passphrase(service); + if (passphrase != NULL) + connman_dbus_dict_append_dict(&dict, "PreviousPassphrase", + request_input_append_previouspassphrase, + (void *) passphrase); + } if (__connman_service_wps_enabled(service) == TRUE) { connman_dbus_dict_append_dict(&dict, "WPS", @@ -417,8 +473,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; @@ -439,7 +496,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, @@ -483,8 +540,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; @@ -505,7 +563,7 @@ int __connman_agent_request_login_input(struct connman_service *service, dbus_message_unref(message); - return -EIO; + return -EINPROGRESS; } struct request_browser_reply_data { @@ -519,15 +577,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); @@ -568,8 +629,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; @@ -590,7 +652,7 @@ int __connman_agent_request_browser(struct connman_service *service, dbus_message_unref(message); - return -EIO; + return -EINPROGRESS; } struct report_error_data { @@ -619,6 +681,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, @@ -655,8 +718,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; @@ -675,7 +739,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)