X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fagent.c;h=e1d7332c1f331cb1a3fff39638269bed4564d5ee;hb=091f5fa9229897a52424cd442b325f97d361dbc3;hp=feeb48e9600470178a6c11ed7249594fe0684872;hpb=65af499cc67950a3c40626f704025e4f371bc2b7;p=framework%2Fconnectivity%2Fconnman.git diff --git a/src/agent.c b/src/agent.c index feeb48e..e1d7332 100644 --- a/src/agent.c +++ b/src/agent.c @@ -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; @@ -111,6 +131,9 @@ static void request_input_passphrase_reply(DBusPendingCall *call, void *user_dat goto done; } + if (check_reply_has_dict(reply) == FALSE) + goto done; + values_received = TRUE; dbus_message_iter_init(reply, &iter); @@ -311,10 +334,23 @@ 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; @@ -326,6 +362,11 @@ static void request_input_login_reply(DBusPendingCall *call, void *user_data) 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) { @@ -359,7 +400,7 @@ 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); @@ -372,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; @@ -412,6 +453,11 @@ int __connman_agent_request_passphrase_input(struct connman_service *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) { @@ -427,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; @@ -449,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, @@ -493,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; @@ -515,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 { @@ -581,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; @@ -603,7 +652,7 @@ int __connman_agent_request_browser(struct connman_service *service, dbus_message_unref(message); - return -EIO; + return -EINPROGRESS; } struct report_error_data { @@ -669,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; @@ -689,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)