timeserver: Simplify timeserver IP address checking
[framework/connectivity/connman.git] / src / agent.c
index 33a11ec..581f977 100644 (file)
@@ -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);
@@ -315,6 +338,7 @@ 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 +350,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 +388,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);
@@ -427,8 +456,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 +479,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 +523,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 +546,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 +612,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 +635,7 @@ int __connman_agent_request_browser(struct connman_service *service,
 
        dbus_message_unref(message);
 
-       return -EIO;
+       return -EINPROGRESS;
 }
 
 struct report_error_data {
@@ -632,6 +664,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,
@@ -668,8 +701,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;
@@ -688,7 +722,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)