]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/wpa/wpa_supplicant/dbus/dbus_old_handlers_wps.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / wpa / wpa_supplicant / dbus / dbus_old_handlers_wps.c
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 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  */
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  */
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 }