1 /*
2 * WPA Supplicant / dbus-based control interface (WPS)
3 * Copyright (c) 2006, Dan Williams <dcbw@redhat.com> and Red Hat, Inc.
4 *
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
7 */
8
9 #include "includes.h"
10 #include <dbus/dbus.h>
11
12 #include "common.h"
13 #include "../config.h"
14 #include "../wpa_supplicant_i.h"
15 #include "../wps_supplicant.h"
16 #include "dbus_old.h"
17 #include "dbus_old_handlers.h"
18
19 /**
20 * wpas_dbus_iface_wps_pbc - Request credentials using WPS PBC method
21 * @message: Pointer to incoming dbus message
22 * @wpa_s: %wpa_supplicant data structure
23 * Returns: A dbus message containing a UINT32 indicating success (1) or
24 * failure (0)
25 *
26 * Handler function for "wpsPbc" method call
27 */
wpas_dbus_iface_wps_pbc(DBusMessage * message,struct wpa_supplicant * wpa_s)28 DBusMessage * wpas_dbus_iface_wps_pbc(DBusMessage *message,
29 struct wpa_supplicant *wpa_s)
30 {
31 char *arg_bssid = NULL;
32 u8 bssid[ETH_ALEN];
33 int ret = 0;
34
35 if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg_bssid,
36 DBUS_TYPE_INVALID))
37 return wpas_dbus_new_invalid_opts_error(message, NULL);
38
39 if (!os_strcmp(arg_bssid, "any"))
40 ret = wpas_wps_start_pbc(wpa_s, NULL, 0);
41 else if (!hwaddr_aton(arg_bssid, bssid))
42 ret = wpas_wps_start_pbc(wpa_s, bssid, 0);
43 else {
44 return wpas_dbus_new_invalid_opts_error(message,
45 "Invalid BSSID");
46 }
47
48 if (ret < 0) {
49 return dbus_message_new_error(message,
50 WPAS_ERROR_WPS_PBC_ERROR,
51 "Could not start PBC "
52 "negotiation");
53 }
54
55 return wpas_dbus_new_success_reply(message);
56 }
57
58
59 /**
60 * wpas_dbus_iface_wps_pin - Establish the PIN number of the enrollee
61 * @message: Pointer to incoming dbus message
62 * @wpa_s: %wpa_supplicant data structure
63 * Returns: A dbus message containing a UINT32 indicating success (1) or
64 * failure (0)
65 *
66 * Handler function for "wpsPin" method call
67 */
wpas_dbus_iface_wps_pin(DBusMessage * message,struct wpa_supplicant * wpa_s)68 DBusMessage * wpas_dbus_iface_wps_pin(DBusMessage *message,
69 struct wpa_supplicant *wpa_s)
70 {
71 DBusMessage *reply = NULL;
72 char *arg_bssid;
73 char *pin = NULL;
74 u8 bssid[ETH_ALEN], *_bssid = NULL;
75 int ret = 0;
76
77 if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg_bssid,
78 DBUS_TYPE_STRING, &pin, DBUS_TYPE_INVALID))
79 return wpas_dbus_new_invalid_opts_error(message, NULL);
80
81 if (!os_strcmp(arg_bssid, "any"))
82 _bssid = NULL;
83 else if (!hwaddr_aton(arg_bssid, bssid))
84 _bssid = bssid;
85 else {
86 return wpas_dbus_new_invalid_opts_error(message,
87 "Invalid BSSID");
88 }
89
90 if (os_strlen(pin) > 0)
91 ret = wpas_wps_start_pin(wpa_s, _bssid, pin, 0,
92 DEV_PW_DEFAULT);
93 else
94 ret = wpas_wps_start_pin(wpa_s, _bssid, NULL, 0,
95 DEV_PW_DEFAULT);
96
97 if (ret < 0) {
98 return dbus_message_new_error(message,
99 WPAS_ERROR_WPS_PIN_ERROR,
100 "Could not init PIN");
101 }
102
103 reply = dbus_message_new_method_return(message);
104 if (reply == NULL)
105 return NULL;
106
107 if (ret == 0) {
108 dbus_message_append_args(reply, DBUS_TYPE_STRING, &pin,
109 DBUS_TYPE_INVALID);
110 } else {
111 char npin[9];
112 os_snprintf(npin, sizeof(npin), "%08d", ret);
113 dbus_message_append_args(reply, DBUS_TYPE_STRING, &npin,
114 DBUS_TYPE_INVALID);
115 }
116 return reply;
117 }
118
119
120 /**
121 * wpas_dbus_iface_wps_reg - Request credentials using the PIN of the AP
122 * @message: Pointer to incoming dbus message
123 * @wpa_s: %wpa_supplicant data structure
124 * Returns: A dbus message containing a UINT32 indicating success (1) or
125 * failure (0)
126 *
127 * Handler function for "wpsReg" method call
128 */
wpas_dbus_iface_wps_reg(DBusMessage * message,struct wpa_supplicant * wpa_s)129 DBusMessage * wpas_dbus_iface_wps_reg(DBusMessage *message,
130 struct wpa_supplicant *wpa_s)
131 {
132 char *arg_bssid;
133 char *pin = NULL;
134 u8 bssid[ETH_ALEN];
135 int ret = 0;
136
137 if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg_bssid,
138 DBUS_TYPE_STRING, &pin, DBUS_TYPE_INVALID))
139 return wpas_dbus_new_invalid_opts_error(message, NULL);
140
141 if (!os_strcmp(arg_bssid, "any"))
142 ret = wpas_wps_start_reg(wpa_s, NULL, pin, NULL);
143 else if (!hwaddr_aton(arg_bssid, bssid))
144 ret = wpas_wps_start_reg(wpa_s, bssid, pin, NULL);
145 else {
146 return wpas_dbus_new_invalid_opts_error(message,
147 "Invalid BSSID");
148 }
149
150 if (ret < 0) {
151 return dbus_message_new_error(message,
152 WPAS_ERROR_WPS_PBC_ERROR,
153 "Could not request credentials");
154 }
155
156 return wpas_dbus_new_success_reply(message);
157 }
158