Line data Source code
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 : */
28 5 : DBusMessage * wpas_dbus_iface_wps_pbc(DBusMessage *message,
29 : struct wpa_supplicant *wpa_s)
30 : {
31 5 : char *arg_bssid = NULL;
32 : u8 bssid[ETH_ALEN];
33 5 : int ret = 0;
34 :
35 5 : if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg_bssid,
36 : DBUS_TYPE_INVALID))
37 1 : return wpas_dbus_new_invalid_opts_error(message, NULL);
38 :
39 4 : if (os_strcmp(arg_bssid, "any") == 0)
40 2 : ret = wpas_wps_start_pbc(wpa_s, NULL, 0);
41 2 : else if (!hwaddr_aton(arg_bssid, bssid))
42 1 : ret = wpas_wps_start_pbc(wpa_s, bssid, 0);
43 : else {
44 1 : return wpas_dbus_new_invalid_opts_error(message,
45 : "Invalid BSSID");
46 : }
47 :
48 3 : if (ret < 0) {
49 1 : return dbus_message_new_error(
50 : message, WPAS_ERROR_WPS_PBC_ERROR,
51 : "Could not start PBC negotiation");
52 : }
53 :
54 2 : return wpas_dbus_new_success_reply(message);
55 : }
56 :
57 :
58 : /**
59 : * wpas_dbus_iface_wps_pin - Establish the PIN number of the enrollee
60 : * @message: Pointer to incoming dbus message
61 : * @wpa_s: %wpa_supplicant data structure
62 : * Returns: A dbus message containing a UINT32 indicating success (1) or
63 : * failure (0)
64 : *
65 : * Handler function for "wpsPin" method call
66 : */
67 5 : DBusMessage * wpas_dbus_iface_wps_pin(DBusMessage *message,
68 : struct wpa_supplicant *wpa_s)
69 : {
70 5 : DBusMessage *reply = NULL;
71 : char *arg_bssid;
72 5 : char *pin = NULL;
73 5 : u8 bssid[ETH_ALEN], *_bssid = NULL;
74 5 : int ret = 0;
75 : char npin[9];
76 :
77 5 : if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg_bssid,
78 : DBUS_TYPE_STRING, &pin, DBUS_TYPE_INVALID))
79 1 : return wpas_dbus_new_invalid_opts_error(message, NULL);
80 :
81 4 : if (os_strcmp(arg_bssid, "any") == 0)
82 2 : _bssid = NULL;
83 2 : else if (!hwaddr_aton(arg_bssid, bssid))
84 1 : _bssid = bssid;
85 : else {
86 1 : return wpas_dbus_new_invalid_opts_error(message,
87 : "Invalid BSSID");
88 : }
89 :
90 3 : if (os_strlen(pin) > 0)
91 1 : ret = wpas_wps_start_pin(wpa_s, _bssid, pin, 0,
92 : DEV_PW_DEFAULT);
93 : else
94 2 : ret = wpas_wps_start_pin(wpa_s, _bssid, NULL, 0,
95 : DEV_PW_DEFAULT);
96 :
97 3 : if (ret < 0) {
98 1 : return dbus_message_new_error(message,
99 : WPAS_ERROR_WPS_PIN_ERROR,
100 : "Could not init PIN");
101 : }
102 :
103 2 : reply = dbus_message_new_method_return(message);
104 2 : if (reply == NULL)
105 0 : return NULL;
106 :
107 2 : if (ret > 0) {
108 1 : os_snprintf(npin, sizeof(npin), "%08d", ret);
109 1 : pin = npin;
110 : }
111 2 : dbus_message_append_args(reply, DBUS_TYPE_STRING, &pin,
112 : DBUS_TYPE_INVALID);
113 2 : return reply;
114 : }
115 :
116 :
117 : /**
118 : * wpas_dbus_iface_wps_reg - Request credentials using the PIN of the AP
119 : * @message: Pointer to incoming dbus message
120 : * @wpa_s: %wpa_supplicant data structure
121 : * Returns: A dbus message containing a UINT32 indicating success (1) or
122 : * failure (0)
123 : *
124 : * Handler function for "wpsReg" method call
125 : */
126 4 : DBusMessage * wpas_dbus_iface_wps_reg(DBusMessage *message,
127 : struct wpa_supplicant *wpa_s)
128 : {
129 : char *arg_bssid;
130 4 : char *pin = NULL;
131 : u8 bssid[ETH_ALEN];
132 4 : int ret = 0;
133 :
134 4 : if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg_bssid,
135 : DBUS_TYPE_STRING, &pin, DBUS_TYPE_INVALID))
136 1 : return wpas_dbus_new_invalid_opts_error(message, NULL);
137 :
138 3 : if (!hwaddr_aton(arg_bssid, bssid))
139 2 : ret = wpas_wps_start_reg(wpa_s, bssid, pin, NULL);
140 : else {
141 1 : return wpas_dbus_new_invalid_opts_error(message,
142 : "Invalid BSSID");
143 : }
144 :
145 2 : if (ret < 0) {
146 1 : return dbus_message_new_error(message,
147 : WPAS_ERROR_WPS_REG_ERROR,
148 : "Could not request credentials");
149 : }
150 :
151 1 : return wpas_dbus_new_success_reply(message);
152 : }
|