#include "connman.h"
+#define REQUEST_TIMEOUT (120 * 1000) /* 120 seconds */
+
static DBusConnection *connection = NULL;
static guint agent_watch = 0;
static gchar *agent_path = NULL;
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;
goto done;
}
+ if (check_reply_has_dict(reply) == FALSE)
+ goto done;
+
values_received = TRUE;
dbus_message_iter_init(reply, &iter);
{
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;
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) {
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);
return -ENOMEM;
}
- if (dbus_connection_send_with_reply(connection, message,
- &call, -1) == FALSE) {
+ if (dbus_connection_send_with_reply(connection, message, &call,
+ REQUEST_TIMEOUT) == FALSE) {
dbus_message_unref(message);
g_free(passphrase_reply);
return -ESRCH;
dbus_message_unref(message);
- return -EIO;
+ return -EINPROGRESS;
}
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,
+ REQUEST_TIMEOUT) == FALSE) {
dbus_message_unref(message);
g_free(username_password_reply);
return -ESRCH;
dbus_message_unref(message);
- return -EIO;
+ return -EINPROGRESS;
}
struct request_browser_reply_data {
return -ENOMEM;
}
- if (dbus_connection_send_with_reply(connection, message,
- &call, -1) == FALSE) {
+ if (dbus_connection_send_with_reply(connection, message, &call,
+ REQUEST_TIMEOUT) == FALSE) {
dbus_message_unref(message);
g_free(browser_reply_data);
return -ESRCH;
dbus_message_unref(message);
- return -EIO;
+ return -EINPROGRESS;
}
struct report_error_data {
return -ENOMEM;
}
- if (dbus_connection_send_with_reply(connection, message,
- &call, -1) == FALSE) {
+ if (dbus_connection_send_with_reply(connection, message, &call,
+ REQUEST_TIMEOUT) == FALSE) {
dbus_message_unref(message);
g_free(report_error);
return -ESRCH;
report_error, NULL);
dbus_message_unref(message);
- return -EIO;
+ return -EINPROGRESS;
}
int __connman_agent_init(void)