Thus it is possible to accept or reject an incoming peer connection.
---
client/agent.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
plugins/wifi.c | 19 +++++++++++++++++++
2 files changed, 71 insertions(+)
diff --git a/client/agent.c b/client/agent.c
index 5a1b944..d020889 100644
--- a/client/agent.c
+++ b/client/agent.c
@@ -589,6 +589,42 @@ static DBusMessage *agent_request_input(DBusConnection
*connection,
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)
@@ -596,6 +632,8 @@ agent_request_peer_authorization(DBusConnection *connection,
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)
@@ -616,6 +654,20 @@ agent_request_peer_authorization(DBusConnection
*connection,
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);
diff --git a/plugins/wifi.c b/plugins/wifi.c
index f5af702..be58bf6 100644
--- a/plugins/wifi.c
+++ b/plugins/wifi.c
@@ -2439,6 +2439,24 @@ static void peer_changed(GSupplicantPeer *peer,
connman_peer_set_state(connman_peer, p_state);
}
+static void peer_request(GSupplicantPeer *peer)
+{
+ GSupplicantInterface *iface = g_supplicant_peer_get_interface(peer);
+ struct wifi_data *wifi = g_supplicant_interface_get_data(iface);
+ struct connman_peer *connman_peer;
+ const char *identifier;
+
+ identifier = g_supplicant_peer_get_identifier(peer);
+
+ DBG("ident: %s", identifier);
+
+ connman_peer = connman_peer_get(wifi->device, identifier);
+ if (!connman_peer)
+ return;
+
+ connman_peer_request_connection(connman_peer);
+}
+
static void debug(const char *str)
{
if (getenv("CONNMAN_SUPPLICANT_DEBUG"))
@@ -2460,6 +2478,7 @@ static const GSupplicantCallbacks callbacks = {
.peer_found = peer_found,
.peer_lost = peer_lost,
.peer_changed = peer_changed,
+ .peer_request = peer_request,
.debug = debug,
};
--
1.8.5.5
_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman