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