X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=client%2Fagent.c;h=d0208892b878c2a7f39e589e843aa7a79ab10564;hb=9395e7a086359069486e002c02b5777ca0c0df26;hp=ce7e19427069924bb1d5741e3272c11e645f0222;hpb=1ac86108dfc3d8e350bda9daf42496fabaa5a3d6;p=platform%2Fupstream%2Fconnman.git diff --git a/client/agent.c b/client/agent.c old mode 100644 new mode 100755 index ce7e194..d020889 --- a/client/agent.c +++ b/client/agent.c @@ -41,7 +41,17 @@ #define AGENT_INTERFACE "net.connman.Agent" #define VPN_AGENT_INTERFACE "net.connman.vpn.Agent" +static DBusConnection *agent_connection; + +struct agent_input_data { + const char *attribute; + bool requested; + char *prompt; + connmanctl_input_func_t func; +}; + struct agent_data { + struct agent_input_data *input; char *interface; bool registered; DBusMessage *message; @@ -51,24 +61,60 @@ struct agent_data { GDBusMethodFunction pending_function; }; -static DBusConnection *agent_connection; +static void request_input_ssid_return(char *input, void *user_data); +static void request_input_passphrase_return(char *input, void *user_data); +static void request_input_string_return(char *input, void *user_data); + +enum requestinput { + SSID = 0, + IDENTITY = 1, + PASSPHRASE = 2, + WPS = 3, + WISPR_USERNAME = 4, + WISPR_PASSPHRASE = 5, + REQUEST_INPUT_MAX = 6, +}; + +static struct agent_input_data agent_input_handler[] = { + { "Name", false, "Hidden SSID name? ", request_input_ssid_return }, + { "Identity", false, "EAP username? ", request_input_string_return }, + { "Passphrase", false, "Passphrase? ", + request_input_passphrase_return }, + { "WPS", false, "WPS PIN (empty line for pushbutton)? " , + request_input_string_return }, + { "Username", false, "WISPr username? ", request_input_string_return }, + { "Password", false, "WISPr password? ", request_input_string_return }, + { }, +}; static struct agent_data agent_request = { + agent_input_handler, AGENT_INTERFACE, }; + +static struct agent_input_data vpnagent_input_handler[] = { + { "OpenConnect.Cookie", false, "OpenConnect Cookie? ", + request_input_string_return }, + { "OpenConnect.ServerCert", false, + "OpenConnect server certificate hash? ", + request_input_string_return }, + { "OpenConnect.VPNHost", false, "OpenConnect VPN server? ", + request_input_string_return }, + { "Username", false, "VPN username? ", request_input_string_return }, + { "Password", false, "VPN password? ", request_input_string_return }, + { }, +}; + static struct agent_data vpn_agent_request = { + vpnagent_input_handler, VPN_AGENT_INTERFACE, }; -static void request_input_ssid_return(char *input, void *user_data); -static void request_input_passphrase_return(char *input, void *user_data); -static void request_input_string_return(char *input, void *user_data); - static int confirm_input(char *input) { int i; - if (input == NULL) + if (!input) return -1; for (i = 0; input[i] != '\0'; i++) @@ -89,7 +135,7 @@ static int confirm_input(char *input) static char *strip_path(char *path) { char *name = strrchr(path, '/'); - if (name != NULL) + if (name) name++; else name = path; @@ -101,7 +147,7 @@ static char *agent_path(void) { static char *path = NULL; - if (path == NULL) + if (!path) path = g_strdup_printf("/net/connman/connmanctl%d", getpid()); return path; @@ -109,12 +155,12 @@ static char *agent_path(void) static void pending_message_remove(struct agent_data *request) { - if (request->message != NULL) { + if (request->message) { dbus_message_unref(request->message); request->message = NULL; } - if (request->reply != NULL) { + if (request->reply) { dbus_message_unref(request->reply); request->reply = NULL; } @@ -137,12 +183,12 @@ static void pending_command_complete(char *message) else __connmanctl_agent_mode("", NULL, NULL); - if (agent_request.message != NULL) + if (agent_request.message) next_request = &agent_request; - else if (vpn_agent_request.message != NULL) + else if (vpn_agent_request.message) next_request = &vpn_agent_request; - if (next_request == NULL) + if (!next_request) return; pending_message = next_request->message; @@ -158,8 +204,8 @@ static void pending_command_complete(char *message) static bool handle_message(DBusMessage *message, struct agent_data *request, GDBusMethodFunction function) { - if (agent_request.pending_function == NULL && - vpn_agent_request.pending_function == NULL) + if (!agent_request.pending_function && + !vpn_agent_request.pending_function) return true; request->message = dbus_message_ref(message); @@ -322,44 +368,48 @@ static DBusMessage *agent_report_error(DBusConnection *connection, return NULL; } -enum requestinput { - SSID = 0, - IDENTITY = 1, - PASSPHRASE = 2, - WPS = 3, - WISPR_USERNAME = 4, - WISPR_PASSPHRASE = 5, - REQUEST_INPUT_MAX = 6, -}; +static DBusMessage *agent_report_peer_error(DBusConnection *connection, + DBusMessage *message, void *user_data) +{ + struct agent_data *request = user_data; + char *path, *peer, *error; + DBusMessageIter iter; -static struct { - const char *attribute; - bool requested; - char *prompt; - connmanctl_input_func_t func; -} agent_input[] = { - { "Name", false, "Hidden SSID name? ", request_input_ssid_return }, - { "Identity", false, "EAP username? ", request_input_string_return }, - { "Passphrase", false, "Passphrase? ", - request_input_passphrase_return }, - { "WPS", false, "WPS PIN (empty line for pushbutton)? " , - request_input_string_return }, - { "Username", false, "WISPr username? ", request_input_string_return }, - { "Password", false, "WISPr password? ", request_input_string_return }, - { }, -}; + if (handle_message(message, request, + agent_report_peer_error) == false) + return NULL; + + dbus_message_iter_init(message, &iter); + + dbus_message_iter_get_basic(&iter, &path); + peer = strip_path(path); + + dbus_message_iter_next(&iter); + dbus_message_iter_get_basic(&iter, &error); + + __connmanctl_save_rl(); + fprintf(stdout, "Agent ReportPeerError %s\n", peer); + fprintf(stdout, " %s\n", error); + __connmanctl_redraw_rl(); + + request->message = dbus_message_ref(message); + __connmanctl_agent_mode("Retry (yes/no)? ", + report_error_return, request); + return NULL; +} static void request_input_next(struct agent_data *request) { int i; - for (i = 0; agent_input[i].attribute != NULL; i++) { - if (agent_input[i].requested == true) { - if(agent_input[i].func != NULL) - __connmanctl_agent_mode(agent_input[i].prompt, - agent_input[i].func, request); + for (i = 0; request->input[i].attribute; i++) { + if (request->input[i].requested == true) { + if (request->input[i].func) + __connmanctl_agent_mode(request->input[i].prompt, + request->input[i].func, + request); else - agent_input[i].requested = false; + request->input[i].requested = false; return; } } @@ -388,12 +438,12 @@ static void request_input_ssid_return(char *input, struct agent_data *request = user_data; int len = 0; - if (input != NULL) + if (input) len = strlen(input); if (len > 0 && len <= 32) { - agent_input[SSID].requested = false; - request_input_append(request, agent_input[SSID].attribute, + request->input[SSID].requested = false; + request_input_append(request, request->input[SSID].attribute, input); request_input_next(request); @@ -403,18 +453,26 @@ static void request_input_ssid_return(char *input, static void request_input_passphrase_return(char *input, void *user_data) { struct agent_data *request = user_data; + int len = 0; /* TBD passphrase length checking */ - if (input != NULL && strlen(input) > 0) { - agent_input[PASSPHRASE].requested = false; - request_input_append(request, - agent_input[PASSPHRASE].attribute, input); + if (input) + len = strlen(input); - agent_input[WPS].requested = false; + if (len == 0 && request->input[WPS].requested == false) + return; - request_input_next(request); + request->input[PASSPHRASE].requested = false; + + if (len > 0) { + request_input_append(request, + request->input[PASSPHRASE].attribute, input); + + request->input[WPS].requested = false; } + + request_input_next(request); } static void request_input_string_return(char *input, void *user_data) @@ -422,11 +480,11 @@ static void request_input_string_return(char *input, void *user_data) struct agent_data *request = user_data; int i; - for (i = 0; agent_input[i].attribute != NULL; i++) { - if (agent_input[i].requested == true) { - request_input_append(request, agent_input[i].attribute, - input); - agent_input[i].requested = false; + for (i = 0; request->input[i].attribute; i++) { + if (request->input[i].requested == true) { + request_input_append(request, + request->input[i].attribute, input); + request->input[i].requested = false; break; } } @@ -434,34 +492,16 @@ static void request_input_string_return(char *input, void *user_data) request_input_next(request); } -static DBusMessage *agent_request_input(DBusConnection *connection, - DBusMessage *message, void *user_data) +static void parse_agent_request(struct agent_data *request, + DBusMessageIter *iter) { - struct agent_data *request = user_data; - DBusMessageIter iter, dict, entry, variant; - char *service, *str, *field; - DBusMessageIter dict_entry, field_entry, field_value; - char *argument, *value, *attr_type; - + DBusMessageIter dict, entry, variant, dict_entry; + DBusMessageIter field_entry, field_value; + char *field, *argument, *value; + char *attr_type = NULL; int i; - if (handle_message(message, request, agent_request_input) == false) - return NULL; - - dbus_message_iter_init(message, &iter); - - dbus_message_iter_get_basic(&iter, &str); - service = strip_path(str); - - dbus_message_iter_next(&iter); - dbus_message_iter_recurse(&iter, &dict); - - __connmanctl_save_rl(); - fprintf(stdout, "Agent RequestInput %s\n", service); - __connmanctl_dbus_print(&dict, " ", " = ", "\n"); - fprintf(stdout, "\n"); - - dbus_message_iter_recurse(&iter, &dict); + dbus_message_iter_recurse(iter, &dict); while (dbus_message_iter_get_arg_type(&dict) == DBUS_TYPE_DICT_ENTRY) { @@ -493,9 +533,9 @@ static DBusMessage *agent_request_input(DBusConnection *connection, dbus_message_iter_next(&dict_entry); } - for (i = 0; agent_input[i].attribute != NULL; i++) { - if (strcmp(field, agent_input[i].attribute) == 0) { - agent_input[i].requested = true; + for (i = 0; request->input[i].attribute; i++) { + if (strcmp(field, request->input[i].attribute) == 0) { + request->input[i].requested = true; break; } } @@ -505,6 +545,128 @@ static DBusMessage *agent_request_input(DBusConnection *connection, dbus_message_iter_next(&dict); } +} + +static DBusMessage *agent_request_input(DBusConnection *connection, + DBusMessage *message, void *user_data) +{ + struct agent_data *request = user_data; + DBusMessageIter iter, dict; + char *service, *str; + + if (handle_message(message, request, agent_request_input) == false) + return NULL; + + dbus_message_iter_init(message, &iter); + + dbus_message_iter_get_basic(&iter, &str); + service = strip_path(str); + + dbus_message_iter_next(&iter); + dbus_message_iter_recurse(&iter, &dict); + + __connmanctl_save_rl(); + if (strcmp(request->interface, AGENT_INTERFACE) == 0) + fprintf(stdout, "Agent RequestInput %s\n", service); + else + fprintf(stdout, "VPN Agent RequestInput %s\n", service); + __connmanctl_dbus_print(&dict, " ", " = ", "\n"); + fprintf(stdout, "\n"); + + parse_agent_request(request, &iter); + + request->reply = dbus_message_new_method_return(message); + dbus_message_iter_init_append(request->reply, &request->iter); + + dbus_message_iter_open_container(&request->iter, DBUS_TYPE_ARRAY, + DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING + DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING + DBUS_DICT_ENTRY_END_CHAR_AS_STRING, + &request->dict); + + request_input_next(request); + + return NULL; +} + +static void request_authorization_return(char *input, void *user_data) +{ + struct agent_data *request = user_data; + + switch (confirm_input(input)) { + case 1: + request->reply = dbus_message_new_method_return( + request->message); + dbus_message_iter_init_append(request->reply, &request->iter); + + dbus_message_iter_open_container(&request->iter, + DBUS_TYPE_ARRAY, + DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING + DBUS_TYPE_STRING_AS_STRING + DBUS_TYPE_VARIANT_AS_STRING + DBUS_DICT_ENTRY_END_CHAR_AS_STRING, + &request->dict); + dbus_message_iter_close_container(&request->iter, + &request->dict); + g_dbus_send_message(agent_connection, request->reply); + request->reply = NULL; + break; + case 0: + g_dbus_send_error(agent_connection, request->message, + "net.connman.Agent.Error.Rejected", NULL); + break; + default: + g_dbus_send_error(agent_connection, request->message, + "net.connman.Agent.Error.Canceled", NULL); + break; + } + + pending_message_remove(request); + pending_command_complete(""); +} + +static DBusMessage * +agent_request_peer_authorization(DBusConnection *connection, + DBusMessage *message, void *user_data) +{ + struct agent_data *request = user_data; + DBusMessageIter iter, dict; + char *peer, *str; + bool input; + int i; + + if (handle_message(message, request, agent_request_peer_authorization) + == false) + return NULL; + + dbus_message_iter_init(message, &iter); + + dbus_message_iter_get_basic(&iter, &str); + peer = strip_path(str); + + dbus_message_iter_next(&iter); + dbus_message_iter_recurse(&iter, &dict); + + __connmanctl_save_rl(); + fprintf(stdout, "Agent RequestPeerAuthorization %s\n", peer); + __connmanctl_dbus_print(&dict, " ", " = ", "\n"); + fprintf(stdout, "\n"); + + parse_agent_request(request, &iter); + + for (input = false, i = 0; request->input[i].attribute; i++) { + if (request->input[i].requested == true) { + input = true; + break; + } + } + + if (!input) { + request->message = dbus_message_ref(message); + __connmanctl_agent_mode("Accept connection (yes/no)? ", + request_authorization_return, request); + return NULL; + } request->reply = dbus_message_new_method_return(message); dbus_message_iter_init_append(request->reply, &request->iter); @@ -531,11 +693,20 @@ static const GDBusMethodTable agent_methods[] = { GDBUS_ARGS({ "service", "o" }, { "error", "s" }), NULL, agent_report_error) }, + { GDBUS_ASYNC_METHOD("ReportPeerError", + GDBUS_ARGS({ "peer", "o" }, + { "error", "s" }), + NULL, agent_report_peer_error) }, { GDBUS_ASYNC_METHOD("RequestInput", GDBUS_ARGS({ "service", "o" }, { "fields", "a{sv}" }), GDBUS_ARGS({ "fields", "a{sv}" }), agent_request_input) }, + { GDBUS_ASYNC_METHOD("RequestPeerAuthorization", + GDBUS_ARGS({ "peer", "o" }, + { "fields", "a{sv}" }), + GDBUS_ARGS({ "fields", "a{sv}" }), + agent_request_peer_authorization) }, { }, }; @@ -544,7 +715,7 @@ static int agent_register_return(DBusMessageIter *iter, const char *error, { DBusConnection *connection = user_data; - if (error != NULL) { + if (error) { g_dbus_unregister_interface(connection, agent_path(), AGENT_INTERFACE); fprintf(stderr, "Error registering Agent: %s\n", error); @@ -557,6 +728,13 @@ static int agent_register_return(DBusMessageIter *iter, const char *error, return -EINPROGRESS; } +static void append_path(DBusMessageIter *iter, void *user_data) +{ + const char *path = user_data; + + dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH, &path); +} + int __connmanctl_agent_register(DBusConnection *connection) { char *path = agent_path(); @@ -569,18 +747,16 @@ int __connmanctl_agent_register(DBusConnection *connection) agent_connection = connection; - if (g_dbus_register_interface(connection, path, + if (!g_dbus_register_interface(connection, path, AGENT_INTERFACE, agent_methods, - NULL, NULL, &agent_request, - NULL) == FALSE) { + NULL, NULL, &agent_request, NULL)) { fprintf(stderr, "Error: Failed to register Agent callbacks\n"); return 0; } result = __connmanctl_dbus_method_call(connection, CONNMAN_SERVICE, CONNMAN_PATH, "net.connman.Manager", "RegisterAgent", - agent_register_return, connection, - DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID); + agent_register_return, connection, append_path, path); if (result != -EINPROGRESS) { g_dbus_unregister_interface(connection, agent_path(), @@ -595,7 +771,7 @@ int __connmanctl_agent_register(DBusConnection *connection) static int agent_unregister_return(DBusMessageIter *iter, const char *error, void *user_data) { - if (error != NULL) { + if (error) { fprintf(stderr, "Error unregistering Agent: %s\n", error); return 0; } @@ -620,8 +796,7 @@ int __connmanctl_agent_unregister(DBusConnection *connection) result = __connmanctl_dbus_method_call(connection, CONNMAN_SERVICE, CONNMAN_PATH, "net.connman.Manager", "UnregisterAgent", - agent_unregister_return, NULL, - DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID); + agent_unregister_return, NULL, append_path, path); if (result != -EINPROGRESS) fprintf(stderr, "Error: Failed to unregister Agent\n"); @@ -636,6 +811,11 @@ static const GDBusMethodTable vpn_agent_methods[] = { GDBUS_ARGS({ "service", "o" }, { "error", "s" }), NULL, agent_report_error) }, + { GDBUS_ASYNC_METHOD("RequestInput", + GDBUS_ARGS({ "service", "o" }, + { "fields", "a{sv}" }), + GDBUS_ARGS({ "fields", "a{sv}" }), + agent_request_input) }, { }, }; @@ -644,7 +824,7 @@ static int vpn_agent_register_return(DBusMessageIter *iter, const char *error, { DBusConnection *connection = user_data; - if (error != NULL) { + if (error) { g_dbus_unregister_interface(connection, agent_path(), VPN_AGENT_INTERFACE); fprintf(stderr, "Error registering VPN Agent: %s\n", error); @@ -669,10 +849,9 @@ int __connmanctl_vpn_agent_register(DBusConnection *connection) agent_connection = connection; - if (g_dbus_register_interface(connection, path, - VPN_AGENT_INTERFACE, vpn_agent_methods, - NULL, NULL, &vpn_agent_request, - NULL) == FALSE) { + if (!g_dbus_register_interface(connection, path, + VPN_AGENT_INTERFACE, vpn_agent_methods, + NULL, NULL, &vpn_agent_request, NULL)) { fprintf(stderr, "Error: Failed to register VPN Agent " "callbacks\n"); return 0; @@ -680,8 +859,8 @@ int __connmanctl_vpn_agent_register(DBusConnection *connection) result = __connmanctl_dbus_method_call(connection, VPN_SERVICE, VPN_PATH, "net.connman.vpn.Manager", "RegisterAgent", - vpn_agent_register_return, connection, - DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID); + vpn_agent_register_return, connection, append_path, + path); if (result != -EINPROGRESS) { g_dbus_unregister_interface(connection, agent_path(), @@ -696,7 +875,7 @@ int __connmanctl_vpn_agent_register(DBusConnection *connection) static int vpn_agent_unregister_return(DBusMessageIter *iter, const char *error, void *user_data) { - if (error != NULL) { + if (error) { fprintf(stderr, "Error unregistering VPN Agent: %s\n", error); return 0; } @@ -722,8 +901,7 @@ int __connmanctl_vpn_agent_unregister(DBusConnection *connection) result = __connmanctl_dbus_method_call(connection, VPN_SERVICE, VPN_PATH, "net.connman.vpn.Manager", "UnregisterAgent", - vpn_agent_unregister_return, NULL, - DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID); + vpn_agent_unregister_return, NULL, append_path, path); if (result != -EINPROGRESS) fprintf(stderr, "Error: Failed to unregister VPN Agent\n");