13ff40c12SJohn Marino /*
23ff40c12SJohn Marino  * WPA Supplicant / dbus-based control interface (WPS)
33ff40c12SJohn Marino  * Copyright (c) 2006, Dan Williams <dcbw@redhat.com> and Red Hat, Inc.
43ff40c12SJohn Marino  * Copyright (c) 2009, Witold Sowa <witold.sowa@gmail.com>
53ff40c12SJohn Marino  *
63ff40c12SJohn Marino  * This software may be distributed under the terms of the BSD license.
73ff40c12SJohn Marino  * See README for more details.
83ff40c12SJohn Marino  */
93ff40c12SJohn Marino 
103ff40c12SJohn Marino #include "includes.h"
113ff40c12SJohn Marino 
123ff40c12SJohn Marino #include "common.h"
133ff40c12SJohn Marino #include "../config.h"
143ff40c12SJohn Marino #include "../wpa_supplicant_i.h"
153ff40c12SJohn Marino #include "../wps_supplicant.h"
163ff40c12SJohn Marino #include "../driver_i.h"
173ff40c12SJohn Marino #include "../ap.h"
183ff40c12SJohn Marino #include "dbus_new_helpers.h"
193ff40c12SJohn Marino #include "dbus_new.h"
203ff40c12SJohn Marino #include "dbus_new_handlers.h"
213ff40c12SJohn Marino #include "dbus_dict_helpers.h"
223ff40c12SJohn Marino 
233ff40c12SJohn Marino 
243ff40c12SJohn Marino struct wps_start_params {
253ff40c12SJohn Marino 	int role; /* 0 - not set, 1 - enrollee, 2 - registrar */
263ff40c12SJohn Marino 	int type; /* 0 - not set, 1 - pin,      2 - pbc       */
273ff40c12SJohn Marino 	u8 *bssid;
283ff40c12SJohn Marino 	char *pin;
293ff40c12SJohn Marino 	u8 *p2p_dev_addr;
303ff40c12SJohn Marino };
313ff40c12SJohn Marino 
323ff40c12SJohn Marino 
wpas_dbus_handler_wps_role(DBusMessage * message,DBusMessageIter * entry_iter,struct wps_start_params * params,DBusMessage ** reply)333ff40c12SJohn Marino static int wpas_dbus_handler_wps_role(DBusMessage *message,
343ff40c12SJohn Marino 				      DBusMessageIter *entry_iter,
353ff40c12SJohn Marino 				      struct wps_start_params *params,
363ff40c12SJohn Marino 				      DBusMessage **reply)
373ff40c12SJohn Marino {
383ff40c12SJohn Marino 	DBusMessageIter variant_iter;
393ff40c12SJohn Marino 	char *val;
403ff40c12SJohn Marino 
413ff40c12SJohn Marino 	dbus_message_iter_recurse(entry_iter, &variant_iter);
423ff40c12SJohn Marino 	if (dbus_message_iter_get_arg_type(&variant_iter) !=
433ff40c12SJohn Marino 	    DBUS_TYPE_STRING) {
44*a1157835SDaniel Fojt 		wpa_printf(MSG_DEBUG,
45*a1157835SDaniel Fojt 			   "dbus: WPS.Start - Wrong Role type, string required");
463ff40c12SJohn Marino 		*reply = wpas_dbus_error_invalid_args(message,
473ff40c12SJohn Marino 						      "Role must be a string");
483ff40c12SJohn Marino 		return -1;
493ff40c12SJohn Marino 	}
503ff40c12SJohn Marino 	dbus_message_iter_get_basic(&variant_iter, &val);
513ff40c12SJohn Marino 	if (os_strcmp(val, "enrollee") == 0)
523ff40c12SJohn Marino 		params->role = 1;
533ff40c12SJohn Marino 	else if (os_strcmp(val, "registrar") == 0)
543ff40c12SJohn Marino 		params->role = 2;
553ff40c12SJohn Marino 	else {
56*a1157835SDaniel Fojt 		wpa_printf(MSG_DEBUG, "dbus: WPS.Start - Unknown role %s", val);
573ff40c12SJohn Marino 		*reply = wpas_dbus_error_invalid_args(message, val);
583ff40c12SJohn Marino 		return -1;
593ff40c12SJohn Marino 	}
603ff40c12SJohn Marino 	return 0;
613ff40c12SJohn Marino }
623ff40c12SJohn Marino 
633ff40c12SJohn Marino 
wpas_dbus_handler_wps_type(DBusMessage * message,DBusMessageIter * entry_iter,struct wps_start_params * params,DBusMessage ** reply)643ff40c12SJohn Marino static int wpas_dbus_handler_wps_type(DBusMessage *message,
653ff40c12SJohn Marino 				      DBusMessageIter *entry_iter,
663ff40c12SJohn Marino 				      struct wps_start_params *params,
673ff40c12SJohn Marino 				      DBusMessage **reply)
683ff40c12SJohn Marino {
693ff40c12SJohn Marino 	DBusMessageIter variant_iter;
703ff40c12SJohn Marino 	char *val;
713ff40c12SJohn Marino 
723ff40c12SJohn Marino 	dbus_message_iter_recurse(entry_iter, &variant_iter);
73*a1157835SDaniel Fojt 	if (dbus_message_iter_get_arg_type(&variant_iter) != DBUS_TYPE_STRING) {
74*a1157835SDaniel Fojt 		wpa_printf(MSG_DEBUG,
75*a1157835SDaniel Fojt 			   "dbus: WPS.Start - Wrong Type type, string required");
763ff40c12SJohn Marino 		*reply = wpas_dbus_error_invalid_args(message,
773ff40c12SJohn Marino 						      "Type must be a string");
783ff40c12SJohn Marino 		return -1;
793ff40c12SJohn Marino 	}
803ff40c12SJohn Marino 	dbus_message_iter_get_basic(&variant_iter, &val);
813ff40c12SJohn Marino 	if (os_strcmp(val, "pin") == 0)
823ff40c12SJohn Marino 		params->type = 1;
833ff40c12SJohn Marino 	else if (os_strcmp(val, "pbc") == 0)
843ff40c12SJohn Marino 		params->type = 2;
853ff40c12SJohn Marino 	else {
863ff40c12SJohn Marino 		wpa_printf(MSG_DEBUG, "dbus: WPS.Start - Unknown type %s",
873ff40c12SJohn Marino 			   val);
883ff40c12SJohn Marino 		*reply = wpas_dbus_error_invalid_args(message, val);
893ff40c12SJohn Marino 		return -1;
903ff40c12SJohn Marino 	}
913ff40c12SJohn Marino 	return 0;
923ff40c12SJohn Marino }
933ff40c12SJohn Marino 
943ff40c12SJohn Marino 
wpas_dbus_handler_wps_bssid(DBusMessage * message,DBusMessageIter * entry_iter,struct wps_start_params * params,DBusMessage ** reply)953ff40c12SJohn Marino static int wpas_dbus_handler_wps_bssid(DBusMessage *message,
963ff40c12SJohn Marino 				       DBusMessageIter *entry_iter,
973ff40c12SJohn Marino 				       struct wps_start_params *params,
983ff40c12SJohn Marino 				       DBusMessage **reply)
993ff40c12SJohn Marino {
1003ff40c12SJohn Marino 	DBusMessageIter variant_iter, array_iter;
1013ff40c12SJohn Marino 	int len;
1023ff40c12SJohn Marino 
1033ff40c12SJohn Marino 	dbus_message_iter_recurse(entry_iter, &variant_iter);
1043ff40c12SJohn Marino 	if (dbus_message_iter_get_arg_type(&variant_iter) != DBUS_TYPE_ARRAY ||
1053ff40c12SJohn Marino 	    dbus_message_iter_get_element_type(&variant_iter) !=
1063ff40c12SJohn Marino 	    DBUS_TYPE_BYTE) {
107*a1157835SDaniel Fojt 		wpa_printf(MSG_DEBUG,
108*a1157835SDaniel Fojt 			   "dbus: WPS.Start - Wrong Bssid type, byte array required");
1093ff40c12SJohn Marino 		*reply = wpas_dbus_error_invalid_args(
1103ff40c12SJohn Marino 			message, "Bssid must be a byte array");
1113ff40c12SJohn Marino 		return -1;
1123ff40c12SJohn Marino 	}
1133ff40c12SJohn Marino 	dbus_message_iter_recurse(&variant_iter, &array_iter);
1143ff40c12SJohn Marino 	dbus_message_iter_get_fixed_array(&array_iter, &params->bssid, &len);
1153ff40c12SJohn Marino 	if (len != ETH_ALEN) {
116*a1157835SDaniel Fojt 		wpa_printf(MSG_DEBUG, "dbus: WPS.Start - Wrong Bssid length %d",
117*a1157835SDaniel Fojt 			   len);
1183ff40c12SJohn Marino 		*reply = wpas_dbus_error_invalid_args(message,
1193ff40c12SJohn Marino 						      "Bssid is wrong length");
1203ff40c12SJohn Marino 		return -1;
1213ff40c12SJohn Marino 	}
1223ff40c12SJohn Marino 	return 0;
1233ff40c12SJohn Marino }
1243ff40c12SJohn Marino 
1253ff40c12SJohn Marino 
wpas_dbus_handler_wps_pin(DBusMessage * message,DBusMessageIter * entry_iter,struct wps_start_params * params,DBusMessage ** reply)1263ff40c12SJohn Marino static int wpas_dbus_handler_wps_pin(DBusMessage *message,
1273ff40c12SJohn Marino 				     DBusMessageIter *entry_iter,
1283ff40c12SJohn Marino 				     struct wps_start_params *params,
1293ff40c12SJohn Marino 				     DBusMessage **reply)
1303ff40c12SJohn Marino {
1313ff40c12SJohn Marino 	DBusMessageIter variant_iter;
1323ff40c12SJohn Marino 
1333ff40c12SJohn Marino 	dbus_message_iter_recurse(entry_iter, &variant_iter);
134*a1157835SDaniel Fojt 	if (dbus_message_iter_get_arg_type(&variant_iter) != DBUS_TYPE_STRING) {
135*a1157835SDaniel Fojt 		wpa_printf(MSG_DEBUG,
136*a1157835SDaniel Fojt 			   "dbus: WPS.Start - Wrong Pin type, string required");
1373ff40c12SJohn Marino 		*reply = wpas_dbus_error_invalid_args(message,
1383ff40c12SJohn Marino 						      "Pin must be a string");
1393ff40c12SJohn Marino 		return -1;
1403ff40c12SJohn Marino 	}
1413ff40c12SJohn Marino 	dbus_message_iter_get_basic(&variant_iter, &params->pin);
1423ff40c12SJohn Marino 	return 0;
1433ff40c12SJohn Marino }
1443ff40c12SJohn Marino 
1453ff40c12SJohn Marino 
1463ff40c12SJohn Marino #ifdef CONFIG_P2P
wpas_dbus_handler_wps_p2p_dev_addr(DBusMessage * message,DBusMessageIter * entry_iter,struct wps_start_params * params,DBusMessage ** reply)1473ff40c12SJohn Marino static int wpas_dbus_handler_wps_p2p_dev_addr(DBusMessage *message,
1483ff40c12SJohn Marino 					      DBusMessageIter *entry_iter,
1493ff40c12SJohn Marino 					      struct wps_start_params *params,
1503ff40c12SJohn Marino 					      DBusMessage **reply)
1513ff40c12SJohn Marino {
1523ff40c12SJohn Marino 	DBusMessageIter variant_iter, array_iter;
1533ff40c12SJohn Marino 	int len;
1543ff40c12SJohn Marino 
1553ff40c12SJohn Marino 	dbus_message_iter_recurse(entry_iter, &variant_iter);
1563ff40c12SJohn Marino 	if (dbus_message_iter_get_arg_type(&variant_iter) != DBUS_TYPE_ARRAY ||
1573ff40c12SJohn Marino 	    dbus_message_iter_get_element_type(&variant_iter) !=
1583ff40c12SJohn Marino 	    DBUS_TYPE_BYTE) {
159*a1157835SDaniel Fojt 		wpa_printf(MSG_DEBUG,
160*a1157835SDaniel Fojt 			   "dbus: WPS.Start - Wrong P2PDeviceAddress type, byte array required");
1613ff40c12SJohn Marino 		*reply = wpas_dbus_error_invalid_args(
1623ff40c12SJohn Marino 			message, "P2PDeviceAddress must be a byte array");
1633ff40c12SJohn Marino 		return -1;
1643ff40c12SJohn Marino 	}
1653ff40c12SJohn Marino 	dbus_message_iter_recurse(&variant_iter, &array_iter);
1663ff40c12SJohn Marino 	dbus_message_iter_get_fixed_array(&array_iter, &params->p2p_dev_addr,
1673ff40c12SJohn Marino 					  &len);
1683ff40c12SJohn Marino 	if (len != ETH_ALEN) {
169*a1157835SDaniel Fojt 		wpa_printf(MSG_DEBUG,
170*a1157835SDaniel Fojt 			   "dbus: WPS.Start - Wrong P2PDeviceAddress length %d",
171*a1157835SDaniel Fojt 			   len);
172*a1157835SDaniel Fojt 		*reply = wpas_dbus_error_invalid_args(
173*a1157835SDaniel Fojt 			message, "P2PDeviceAddress has wrong length");
1743ff40c12SJohn Marino 		return -1;
1753ff40c12SJohn Marino 	}
1763ff40c12SJohn Marino 	return 0;
1773ff40c12SJohn Marino }
1783ff40c12SJohn Marino #endif /* CONFIG_P2P */
1793ff40c12SJohn Marino 
1803ff40c12SJohn Marino 
wpas_dbus_handler_wps_start_entry(DBusMessage * message,char * key,DBusMessageIter * entry_iter,struct wps_start_params * params,DBusMessage ** reply)1813ff40c12SJohn Marino static int wpas_dbus_handler_wps_start_entry(DBusMessage *message, char *key,
1823ff40c12SJohn Marino 					     DBusMessageIter *entry_iter,
1833ff40c12SJohn Marino 					     struct wps_start_params *params,
1843ff40c12SJohn Marino 					     DBusMessage **reply)
1853ff40c12SJohn Marino {
1863ff40c12SJohn Marino 	if (os_strcmp(key, "Role") == 0)
1873ff40c12SJohn Marino 		return wpas_dbus_handler_wps_role(message, entry_iter,
1883ff40c12SJohn Marino 						  params, reply);
1893ff40c12SJohn Marino 	else if (os_strcmp(key, "Type") == 0)
1903ff40c12SJohn Marino 		return wpas_dbus_handler_wps_type(message, entry_iter,
1913ff40c12SJohn Marino 						  params, reply);
1923ff40c12SJohn Marino 	else if (os_strcmp(key, "Bssid") == 0)
1933ff40c12SJohn Marino 		return wpas_dbus_handler_wps_bssid(message, entry_iter,
1943ff40c12SJohn Marino 						   params, reply);
1953ff40c12SJohn Marino 	else if (os_strcmp(key, "Pin") == 0)
1963ff40c12SJohn Marino 		return wpas_dbus_handler_wps_pin(message, entry_iter,
1973ff40c12SJohn Marino 						 params, reply);
1983ff40c12SJohn Marino #ifdef CONFIG_P2P
1993ff40c12SJohn Marino 	else if (os_strcmp(key, "P2PDeviceAddress") == 0)
2003ff40c12SJohn Marino 		return wpas_dbus_handler_wps_p2p_dev_addr(message, entry_iter,
2013ff40c12SJohn Marino 							  params, reply);
2023ff40c12SJohn Marino #endif /* CONFIG_P2P */
2033ff40c12SJohn Marino 
2043ff40c12SJohn Marino 	wpa_printf(MSG_DEBUG, "dbus: WPS.Start - unknown key %s", key);
2053ff40c12SJohn Marino 	*reply = wpas_dbus_error_invalid_args(message, key);
2063ff40c12SJohn Marino 	return -1;
2073ff40c12SJohn Marino }
2083ff40c12SJohn Marino 
2093ff40c12SJohn Marino 
2103ff40c12SJohn Marino /**
2113ff40c12SJohn Marino  * wpas_dbus_handler_wps_start - Start WPS configuration
2123ff40c12SJohn Marino  * @message: Pointer to incoming dbus message
2133ff40c12SJohn Marino  * @wpa_s: %wpa_supplicant data structure
2143ff40c12SJohn Marino  * Returns: DBus message dictionary on success or DBus error on failure
2153ff40c12SJohn Marino  *
2163ff40c12SJohn Marino  * Handler for "Start" method call. DBus dictionary argument contains
2173ff40c12SJohn Marino  * information about role (enrollee or registrar), authorization method
2183ff40c12SJohn Marino  * (pin or push button) and optionally pin and bssid. Returned message
2193ff40c12SJohn Marino  * has a dictionary argument which may contain newly generated pin (optional).
2203ff40c12SJohn Marino  */
wpas_dbus_handler_wps_start(DBusMessage * message,struct wpa_supplicant * wpa_s)2213ff40c12SJohn Marino DBusMessage * wpas_dbus_handler_wps_start(DBusMessage *message,
2223ff40c12SJohn Marino 					  struct wpa_supplicant *wpa_s)
2233ff40c12SJohn Marino {
2243ff40c12SJohn Marino 	DBusMessage *reply = NULL;
2253ff40c12SJohn Marino 	DBusMessageIter iter, dict_iter, entry_iter;
2263ff40c12SJohn Marino 	struct wps_start_params params;
2273ff40c12SJohn Marino 	char *key;
2283ff40c12SJohn Marino 	char npin[9] = { '\0' };
2293ff40c12SJohn Marino 	int ret;
2303ff40c12SJohn Marino 
2313ff40c12SJohn Marino 	os_memset(&params, 0, sizeof(params));
2323ff40c12SJohn Marino 	dbus_message_iter_init(message, &iter);
2333ff40c12SJohn Marino 
2343ff40c12SJohn Marino 	dbus_message_iter_recurse(&iter, &dict_iter);
2353ff40c12SJohn Marino 	while (dbus_message_iter_get_arg_type(&dict_iter) ==
2363ff40c12SJohn Marino 	       DBUS_TYPE_DICT_ENTRY) {
2373ff40c12SJohn Marino 		dbus_message_iter_recurse(&dict_iter, &entry_iter);
2383ff40c12SJohn Marino 
2393ff40c12SJohn Marino 		dbus_message_iter_get_basic(&entry_iter, &key);
2403ff40c12SJohn Marino 		dbus_message_iter_next(&entry_iter);
2413ff40c12SJohn Marino 
2423ff40c12SJohn Marino 		if (wpas_dbus_handler_wps_start_entry(message, key,
2433ff40c12SJohn Marino 						      &entry_iter,
2443ff40c12SJohn Marino 						      &params, &reply))
2453ff40c12SJohn Marino 			return reply;
2463ff40c12SJohn Marino 
2473ff40c12SJohn Marino 		dbus_message_iter_next(&dict_iter);
2483ff40c12SJohn Marino 	}
2493ff40c12SJohn Marino 
250*a1157835SDaniel Fojt #ifdef CONFIG_AP
251*a1157835SDaniel Fojt 	if (wpa_s->ap_iface && params.type == 1) {
252*a1157835SDaniel Fojt 		if (params.pin == NULL) {
253*a1157835SDaniel Fojt 			wpa_printf(MSG_DEBUG,
254*a1157835SDaniel Fojt 				   "dbus: WPS.Start - Pin required for registrar role");
2553ff40c12SJohn Marino 			return wpas_dbus_error_invalid_args(
2563ff40c12SJohn Marino 				message, "Pin required for registrar role.");
2573ff40c12SJohn Marino 		}
2583ff40c12SJohn Marino 		ret = wpa_supplicant_ap_wps_pin(wpa_s,
2593ff40c12SJohn Marino 						params.bssid,
2603ff40c12SJohn Marino 						params.pin,
2613ff40c12SJohn Marino 						npin, sizeof(npin), 0);
262*a1157835SDaniel Fojt 	} else if (wpa_s->ap_iface) {
2633ff40c12SJohn Marino 		ret = wpa_supplicant_ap_wps_pbc(wpa_s,
2643ff40c12SJohn Marino 						params.bssid,
2653ff40c12SJohn Marino 						params.p2p_dev_addr);
266*a1157835SDaniel Fojt 	} else
2673ff40c12SJohn Marino #endif /* CONFIG_AP */
268*a1157835SDaniel Fojt 	if (params.role == 0) {
269*a1157835SDaniel Fojt 		wpa_printf(MSG_DEBUG, "dbus: WPS.Start - Role not specified");
270*a1157835SDaniel Fojt 		return wpas_dbus_error_invalid_args(message,
271*a1157835SDaniel Fojt 						    "Role not specified");
272*a1157835SDaniel Fojt 	} else if (params.role == 2) {
273*a1157835SDaniel Fojt 		if (params.pin == NULL) {
274*a1157835SDaniel Fojt 			wpa_printf(MSG_DEBUG,
275*a1157835SDaniel Fojt 				   "dbus: WPS.Start - Pin required for registrar role");
276*a1157835SDaniel Fojt 			return wpas_dbus_error_invalid_args(
277*a1157835SDaniel Fojt 				message, "Pin required for registrar role.");
278*a1157835SDaniel Fojt 		}
279*a1157835SDaniel Fojt 		ret = wpas_wps_start_reg(wpa_s, params.bssid, params.pin,
280*a1157835SDaniel Fojt 					 NULL);
281*a1157835SDaniel Fojt 	} else if (params.type == 0) {
282*a1157835SDaniel Fojt 		wpa_printf(MSG_DEBUG, "dbus: WPS.Start - Type not specified");
283*a1157835SDaniel Fojt 		return wpas_dbus_error_invalid_args(message,
284*a1157835SDaniel Fojt 						    "Type not specified");
285*a1157835SDaniel Fojt 	} else if (params.type == 1) {
286*a1157835SDaniel Fojt 		ret = wpas_wps_start_pin(wpa_s, params.bssid,
287*a1157835SDaniel Fojt 					 params.pin, 0,
288*a1157835SDaniel Fojt 					 DEV_PW_DEFAULT);
289*a1157835SDaniel Fojt 		if (ret > 0) {
290*a1157835SDaniel Fojt 			ret = os_snprintf(npin, sizeof(npin), "%08d", ret);
291*a1157835SDaniel Fojt 			if (os_snprintf_error(sizeof(npin), ret))
292*a1157835SDaniel Fojt 				return wpas_dbus_error_unknown_error(
293*a1157835SDaniel Fojt 					message, "invalid PIN");
294*a1157835SDaniel Fojt 		}
295*a1157835SDaniel Fojt 	} else {
296*a1157835SDaniel Fojt 		ret = wpas_wps_start_pbc(wpa_s, params.bssid, 0, 0);
2973ff40c12SJohn Marino 	}
2983ff40c12SJohn Marino 
2993ff40c12SJohn Marino 	if (ret < 0) {
300*a1157835SDaniel Fojt 		wpa_printf(MSG_DEBUG,
301*a1157835SDaniel Fojt 			   "dbus: WPS.Start wpas_wps_failed in role %s and key %s",
3023ff40c12SJohn Marino 			   (params.role == 1 ? "enrollee" : "registrar"),
3033ff40c12SJohn Marino 			   (params.type == 0 ? "" :
3043ff40c12SJohn Marino 			    (params.type == 1 ? "pin" : "pbc")));
3053ff40c12SJohn Marino 		return wpas_dbus_error_unknown_error(message,
3063ff40c12SJohn Marino 						     "WPS start failed");
3073ff40c12SJohn Marino 	}
3083ff40c12SJohn Marino 
3093ff40c12SJohn Marino 	reply = dbus_message_new_method_return(message);
310*a1157835SDaniel Fojt 	if (!reply)
311*a1157835SDaniel Fojt 		return wpas_dbus_error_no_memory(message);
3123ff40c12SJohn Marino 
3133ff40c12SJohn Marino 	dbus_message_iter_init_append(reply, &iter);
314*a1157835SDaniel Fojt 	if (!wpa_dbus_dict_open_write(&iter, &dict_iter) ||
315*a1157835SDaniel Fojt 	    (os_strlen(npin) > 0 &&
316*a1157835SDaniel Fojt 	     !wpa_dbus_dict_append_string(&dict_iter, "Pin", npin)) ||
317*a1157835SDaniel Fojt 	    !wpa_dbus_dict_close_write(&iter, &dict_iter)) {
3183ff40c12SJohn Marino 		dbus_message_unref(reply);
319*a1157835SDaniel Fojt 		return wpas_dbus_error_no_memory(message);
3203ff40c12SJohn Marino 	}
3213ff40c12SJohn Marino 
3223ff40c12SJohn Marino 	return reply;
3233ff40c12SJohn Marino }
3243ff40c12SJohn Marino 
3253ff40c12SJohn Marino 
3263ff40c12SJohn Marino /**
327*a1157835SDaniel Fojt  * wpas_dbus_handler_wps_cancel - Cancel ongoing WPS configuration
328*a1157835SDaniel Fojt  * @message: Pointer to incoming dbus message
329*a1157835SDaniel Fojt  * @wpa_s: %wpa_supplicant data structure
330*a1157835SDaniel Fojt  * Returns: NULL on success or DBus error on failure
331*a1157835SDaniel Fojt  *
332*a1157835SDaniel Fojt  * Handler for "Cancel" method call. Returns NULL if WPS cancel successful
333*a1157835SDaniel Fojt  * or DBus error on WPS cancel failure
334*a1157835SDaniel Fojt  */
wpas_dbus_handler_wps_cancel(DBusMessage * message,struct wpa_supplicant * wpa_s)335*a1157835SDaniel Fojt DBusMessage * wpas_dbus_handler_wps_cancel(DBusMessage *message,
336*a1157835SDaniel Fojt 					   struct wpa_supplicant *wpa_s)
337*a1157835SDaniel Fojt {
338*a1157835SDaniel Fojt 	if (wpas_wps_cancel(wpa_s))
339*a1157835SDaniel Fojt 		return wpas_dbus_error_unknown_error(message,
340*a1157835SDaniel Fojt 						     "WPS cancel failed");
341*a1157835SDaniel Fojt 
342*a1157835SDaniel Fojt 	return NULL;
343*a1157835SDaniel Fojt }
344*a1157835SDaniel Fojt 
345*a1157835SDaniel Fojt 
346*a1157835SDaniel Fojt /**
3473ff40c12SJohn Marino  * wpas_dbus_getter_process_credentials - Check if credentials are processed
3483ff40c12SJohn Marino  * @message: Pointer to incoming dbus message
3493ff40c12SJohn Marino  * @wpa_s: %wpa_supplicant data structure
3503ff40c12SJohn Marino  * Returns: TRUE on success, FALSE on failure
3513ff40c12SJohn Marino  *
3523ff40c12SJohn Marino  * Getter for "ProcessCredentials" property. Returns returned boolean will be
3533ff40c12SJohn Marino  * true if wps_cred_processing configuration field is not equal to 1 or false
3543ff40c12SJohn Marino  * if otherwise.
3553ff40c12SJohn Marino  */
wpas_dbus_getter_process_credentials(const struct wpa_dbus_property_desc * property_desc,DBusMessageIter * iter,DBusError * error,void * user_data)356*a1157835SDaniel Fojt dbus_bool_t wpas_dbus_getter_process_credentials(
357*a1157835SDaniel Fojt 	const struct wpa_dbus_property_desc *property_desc,
358*a1157835SDaniel Fojt 	DBusMessageIter *iter, DBusError *error, void *user_data)
3593ff40c12SJohn Marino {
3603ff40c12SJohn Marino 	struct wpa_supplicant *wpa_s = user_data;
361*a1157835SDaniel Fojt 	dbus_bool_t process = wpa_s->conf->wps_cred_processing != 1;
362*a1157835SDaniel Fojt 
3633ff40c12SJohn Marino 	return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
3643ff40c12SJohn Marino 						&process, error);
3653ff40c12SJohn Marino }
3663ff40c12SJohn Marino 
3673ff40c12SJohn Marino 
3683ff40c12SJohn Marino /**
3693ff40c12SJohn Marino  * wpas_dbus_setter_process_credentials - Set credentials_processed conf param
3703ff40c12SJohn Marino  * @iter: Pointer to incoming dbus message iter
3713ff40c12SJohn Marino  * @error: Location to store error on failure
3723ff40c12SJohn Marino  * @user_data: Function specific data
3733ff40c12SJohn Marino  * Returns: TRUE on success, FALSE on failure
3743ff40c12SJohn Marino  *
3753ff40c12SJohn Marino  * Setter for "ProcessCredentials" property. Sets credentials_processed on 2
3763ff40c12SJohn Marino  * if boolean argument is true or on 1 if otherwise.
3773ff40c12SJohn Marino  */
wpas_dbus_setter_process_credentials(const struct wpa_dbus_property_desc * property_desc,DBusMessageIter * iter,DBusError * error,void * user_data)378*a1157835SDaniel Fojt dbus_bool_t wpas_dbus_setter_process_credentials(
379*a1157835SDaniel Fojt 	const struct wpa_dbus_property_desc *property_desc,
380*a1157835SDaniel Fojt 	DBusMessageIter *iter, DBusError *error, void *user_data)
3813ff40c12SJohn Marino {
3823ff40c12SJohn Marino 	struct wpa_supplicant *wpa_s = user_data;
3833ff40c12SJohn Marino 	dbus_bool_t process_credentials, old_pc;
3843ff40c12SJohn Marino 
385*a1157835SDaniel Fojt 	if (!wpa_s->dbus_new_path)
386*a1157835SDaniel Fojt 		return FALSE;
3873ff40c12SJohn Marino 	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
3883ff40c12SJohn Marino 					      &process_credentials))
3893ff40c12SJohn Marino 		return FALSE;
3903ff40c12SJohn Marino 
391*a1157835SDaniel Fojt 	old_pc = wpa_s->conf->wps_cred_processing != 1;
3923ff40c12SJohn Marino 	wpa_s->conf->wps_cred_processing = (process_credentials ? 2 : 1);
3933ff40c12SJohn Marino 
3943ff40c12SJohn Marino 	if ((wpa_s->conf->wps_cred_processing != 1) != old_pc)
3953ff40c12SJohn Marino 		wpa_dbus_mark_property_changed(wpa_s->global->dbus,
3963ff40c12SJohn Marino 					       wpa_s->dbus_new_path,
3973ff40c12SJohn Marino 					       WPAS_DBUS_NEW_IFACE_WPS,
3983ff40c12SJohn Marino 					       "ProcessCredentials");
3993ff40c12SJohn Marino 
4003ff40c12SJohn Marino 	return TRUE;
4013ff40c12SJohn Marino }
402*a1157835SDaniel Fojt 
403*a1157835SDaniel Fojt 
404*a1157835SDaniel Fojt /**
405*a1157835SDaniel Fojt  * wpas_dbus_getter_config_methods - Get current WPS configuration methods
406*a1157835SDaniel Fojt  * @iter: Pointer to incoming dbus message iter
407*a1157835SDaniel Fojt  * @error: Location to store error on failure
408*a1157835SDaniel Fojt  * @user_data: Function specific data
409*a1157835SDaniel Fojt  * Returns: TRUE on success, FALSE on failure
410*a1157835SDaniel Fojt  *
411*a1157835SDaniel Fojt  * Getter for "ConfigMethods" property. Returned boolean will be true if
412*a1157835SDaniel Fojt  * providing the relevant string worked, or false otherwise.
413*a1157835SDaniel Fojt  */
wpas_dbus_getter_config_methods(const struct wpa_dbus_property_desc * property_desc,DBusMessageIter * iter,DBusError * error,void * user_data)414*a1157835SDaniel Fojt dbus_bool_t wpas_dbus_getter_config_methods(
415*a1157835SDaniel Fojt 	const struct wpa_dbus_property_desc *property_desc,
416*a1157835SDaniel Fojt 	DBusMessageIter *iter, DBusError *error, void *user_data)
417*a1157835SDaniel Fojt {
418*a1157835SDaniel Fojt 	struct wpa_supplicant *wpa_s = user_data;
419*a1157835SDaniel Fojt 
420*a1157835SDaniel Fojt 	return wpas_dbus_string_property_getter(iter,
421*a1157835SDaniel Fojt 						wpa_s->conf->config_methods,
422*a1157835SDaniel Fojt 						error);
423*a1157835SDaniel Fojt }
424*a1157835SDaniel Fojt 
425*a1157835SDaniel Fojt 
426*a1157835SDaniel Fojt /**
427*a1157835SDaniel Fojt  * wpas_dbus_setter_config_methods - Set WPS configuration methods
428*a1157835SDaniel Fojt  * @iter: Pointer to incoming dbus message iter
429*a1157835SDaniel Fojt  * @error: Location to store error on failure
430*a1157835SDaniel Fojt  * @user_data: Function specific data
431*a1157835SDaniel Fojt  * Returns: TRUE on success, FALSE on failure
432*a1157835SDaniel Fojt  *
433*a1157835SDaniel Fojt  * Setter for "ConfigMethods" property. Sets the methods string, apply such
434*a1157835SDaniel Fojt  * change and returns true on success. Returns false otherwise.
435*a1157835SDaniel Fojt  */
wpas_dbus_setter_config_methods(const struct wpa_dbus_property_desc * property_desc,DBusMessageIter * iter,DBusError * error,void * user_data)436*a1157835SDaniel Fojt dbus_bool_t wpas_dbus_setter_config_methods(
437*a1157835SDaniel Fojt 	const struct wpa_dbus_property_desc *property_desc,
438*a1157835SDaniel Fojt 	DBusMessageIter *iter, DBusError *error, void *user_data)
439*a1157835SDaniel Fojt {
440*a1157835SDaniel Fojt 	struct wpa_supplicant *wpa_s = user_data;
441*a1157835SDaniel Fojt 	char *methods, *new_methods;
442*a1157835SDaniel Fojt 
443*a1157835SDaniel Fojt 	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
444*a1157835SDaniel Fojt 					      &methods))
445*a1157835SDaniel Fojt 		return FALSE;
446*a1157835SDaniel Fojt 
447*a1157835SDaniel Fojt 	new_methods = os_strdup(methods);
448*a1157835SDaniel Fojt 	if (!new_methods)
449*a1157835SDaniel Fojt 		return FALSE;
450*a1157835SDaniel Fojt 
451*a1157835SDaniel Fojt 	os_free(wpa_s->conf->config_methods);
452*a1157835SDaniel Fojt 	wpa_s->conf->config_methods = new_methods;
453*a1157835SDaniel Fojt 
454*a1157835SDaniel Fojt 	wpa_s->conf->changed_parameters |= CFG_CHANGED_CONFIG_METHODS;
455*a1157835SDaniel Fojt 	wpa_supplicant_update_config(wpa_s);
456*a1157835SDaniel Fojt 
457*a1157835SDaniel Fojt 	return TRUE;
458*a1157835SDaniel Fojt }
459*a1157835SDaniel Fojt 
460*a1157835SDaniel Fojt 
461*a1157835SDaniel Fojt /**
462*a1157835SDaniel Fojt  * wpas_dbus_getter_wps_device_name - Get current WPS device name
463*a1157835SDaniel Fojt  * @iter: Pointer to incoming dbus message iter
464*a1157835SDaniel Fojt  * @error: Location to store error on failure
465*a1157835SDaniel Fojt  * @user_data: Function specific data
466*a1157835SDaniel Fojt  * Returns: TRUE on success, FALSE on failure
467*a1157835SDaniel Fojt  *
468*a1157835SDaniel Fojt  * Getter for "DeviceName" property.
469*a1157835SDaniel Fojt  */
wpas_dbus_getter_wps_device_name(const struct wpa_dbus_property_desc * property_desc,DBusMessageIter * iter,DBusError * error,void * user_data)470*a1157835SDaniel Fojt dbus_bool_t wpas_dbus_getter_wps_device_name(
471*a1157835SDaniel Fojt 	const struct wpa_dbus_property_desc *property_desc,
472*a1157835SDaniel Fojt 	DBusMessageIter *iter, DBusError *error, void *user_data)
473*a1157835SDaniel Fojt {
474*a1157835SDaniel Fojt 	struct wpa_supplicant *wpa_s = user_data;
475*a1157835SDaniel Fojt 
476*a1157835SDaniel Fojt 	return wpas_dbus_string_property_getter(iter, wpa_s->conf->device_name,
477*a1157835SDaniel Fojt 						error);
478*a1157835SDaniel Fojt }
479*a1157835SDaniel Fojt 
480*a1157835SDaniel Fojt 
481*a1157835SDaniel Fojt /**
482*a1157835SDaniel Fojt  * wpas_dbus_setter_wps_device_name - Set current WPS device name
483*a1157835SDaniel Fojt  * @iter: Pointer to incoming dbus message iter
484*a1157835SDaniel Fojt  * @error: Location to store error on failure
485*a1157835SDaniel Fojt  * @user_data: Function specific data
486*a1157835SDaniel Fojt  * Returns: TRUE on success, FALSE on failure
487*a1157835SDaniel Fojt  *
488*a1157835SDaniel Fojt  * Setter for "DeviceName" property.
489*a1157835SDaniel Fojt  */
wpas_dbus_setter_wps_device_name(const struct wpa_dbus_property_desc * property_desc,DBusMessageIter * iter,DBusError * error,void * user_data)490*a1157835SDaniel Fojt dbus_bool_t wpas_dbus_setter_wps_device_name(
491*a1157835SDaniel Fojt 	const struct wpa_dbus_property_desc *property_desc,
492*a1157835SDaniel Fojt 	DBusMessageIter *iter, DBusError *error, void *user_data)
493*a1157835SDaniel Fojt {
494*a1157835SDaniel Fojt 	struct wpa_supplicant *wpa_s = user_data;
495*a1157835SDaniel Fojt 	char *methods, *devname;
496*a1157835SDaniel Fojt 
497*a1157835SDaniel Fojt 	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
498*a1157835SDaniel Fojt 					      &methods))
499*a1157835SDaniel Fojt 		return FALSE;
500*a1157835SDaniel Fojt 
501*a1157835SDaniel Fojt 	if (os_strlen(methods) > WPS_DEV_NAME_MAX_LEN)
502*a1157835SDaniel Fojt 		return FALSE;
503*a1157835SDaniel Fojt 
504*a1157835SDaniel Fojt 	devname = os_strdup(methods);
505*a1157835SDaniel Fojt 	if (!devname)
506*a1157835SDaniel Fojt 		return FALSE;
507*a1157835SDaniel Fojt 
508*a1157835SDaniel Fojt 	os_free(wpa_s->conf->device_name);
509*a1157835SDaniel Fojt 	wpa_s->conf->device_name = devname;
510*a1157835SDaniel Fojt 	wpa_s->conf->changed_parameters |= CFG_CHANGED_DEVICE_NAME;
511*a1157835SDaniel Fojt 	wpa_supplicant_update_config(wpa_s);
512*a1157835SDaniel Fojt 
513*a1157835SDaniel Fojt 	return TRUE;
514*a1157835SDaniel Fojt }
515*a1157835SDaniel Fojt 
516*a1157835SDaniel Fojt 
517*a1157835SDaniel Fojt /**
518*a1157835SDaniel Fojt  * wpas_dbus_getter_wps_manufacturer - Get current manufacturer name
519*a1157835SDaniel Fojt  * @iter: Pointer to incoming dbus message iter
520*a1157835SDaniel Fojt  * @error: Location to store error on failure
521*a1157835SDaniel Fojt  * @user_data: Function specific data
522*a1157835SDaniel Fojt  * Returns: TRUE on success, FALSE on failure
523*a1157835SDaniel Fojt  *
524*a1157835SDaniel Fojt  * Getter for "Manufacturer" property.
525*a1157835SDaniel Fojt  */
wpas_dbus_getter_wps_manufacturer(const struct wpa_dbus_property_desc * property_desc,DBusMessageIter * iter,DBusError * error,void * user_data)526*a1157835SDaniel Fojt dbus_bool_t wpas_dbus_getter_wps_manufacturer(
527*a1157835SDaniel Fojt 	const struct wpa_dbus_property_desc *property_desc,
528*a1157835SDaniel Fojt 	DBusMessageIter *iter, DBusError *error, void *user_data)
529*a1157835SDaniel Fojt {
530*a1157835SDaniel Fojt 	struct wpa_supplicant *wpa_s = user_data;
531*a1157835SDaniel Fojt 
532*a1157835SDaniel Fojt 	return wpas_dbus_string_property_getter(iter, wpa_s->conf->manufacturer,
533*a1157835SDaniel Fojt 						error);
534*a1157835SDaniel Fojt }
535*a1157835SDaniel Fojt 
536*a1157835SDaniel Fojt 
537*a1157835SDaniel Fojt /**
538*a1157835SDaniel Fojt  * wpas_dbus_setter_wps_manufacturer - Set current manufacturer name
539*a1157835SDaniel Fojt  * @iter: Pointer to incoming dbus message iter
540*a1157835SDaniel Fojt  * @error: Location to store error on failure
541*a1157835SDaniel Fojt  * @user_data: Function specific data
542*a1157835SDaniel Fojt  * Returns: TRUE on success, FALSE on failure
543*a1157835SDaniel Fojt  *
544*a1157835SDaniel Fojt  * Setter for "Manufacturer" property.
545*a1157835SDaniel Fojt  */
wpas_dbus_setter_wps_manufacturer(const struct wpa_dbus_property_desc * property_desc,DBusMessageIter * iter,DBusError * error,void * user_data)546*a1157835SDaniel Fojt dbus_bool_t wpas_dbus_setter_wps_manufacturer(
547*a1157835SDaniel Fojt 	const struct wpa_dbus_property_desc *property_desc,
548*a1157835SDaniel Fojt 	DBusMessageIter *iter, DBusError *error, void *user_data)
549*a1157835SDaniel Fojt {
550*a1157835SDaniel Fojt 	struct wpa_supplicant *wpa_s = user_data;
551*a1157835SDaniel Fojt 	char *methods, *manufacturer;
552*a1157835SDaniel Fojt 
553*a1157835SDaniel Fojt 	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
554*a1157835SDaniel Fojt 					      &methods))
555*a1157835SDaniel Fojt 		return FALSE;
556*a1157835SDaniel Fojt 
557*a1157835SDaniel Fojt 	if (os_strlen(methods) > WPS_MANUFACTURER_MAX_LEN)
558*a1157835SDaniel Fojt 		return FALSE;
559*a1157835SDaniel Fojt 
560*a1157835SDaniel Fojt 	manufacturer = os_strdup(methods);
561*a1157835SDaniel Fojt 	if (!manufacturer)
562*a1157835SDaniel Fojt 		return FALSE;
563*a1157835SDaniel Fojt 
564*a1157835SDaniel Fojt 	os_free(wpa_s->conf->manufacturer);
565*a1157835SDaniel Fojt 	wpa_s->conf->manufacturer = manufacturer;
566*a1157835SDaniel Fojt 	wpa_s->conf->changed_parameters |= CFG_CHANGED_WPS_STRING;
567*a1157835SDaniel Fojt 	wpa_supplicant_update_config(wpa_s);
568*a1157835SDaniel Fojt 
569*a1157835SDaniel Fojt 	return TRUE;
570*a1157835SDaniel Fojt }
571*a1157835SDaniel Fojt 
572*a1157835SDaniel Fojt 
573*a1157835SDaniel Fojt /**
574*a1157835SDaniel Fojt  * wpas_dbus_getter_wps_device_model_name - Get current device model name
575*a1157835SDaniel Fojt  * @iter: Pointer to incoming dbus message iter
576*a1157835SDaniel Fojt  * @error: Location to store error on failure
577*a1157835SDaniel Fojt  * @user_data: Function specific data
578*a1157835SDaniel Fojt  * Returns: TRUE on success, FALSE on failure
579*a1157835SDaniel Fojt  *
580*a1157835SDaniel Fojt  * Getter for "ModelName" property.
581*a1157835SDaniel Fojt  */
wpas_dbus_getter_wps_device_model_name(const struct wpa_dbus_property_desc * property_desc,DBusMessageIter * iter,DBusError * error,void * user_data)582*a1157835SDaniel Fojt dbus_bool_t wpas_dbus_getter_wps_device_model_name(
583*a1157835SDaniel Fojt 	const struct wpa_dbus_property_desc *property_desc,
584*a1157835SDaniel Fojt 	DBusMessageIter *iter, DBusError *error, void *user_data)
585*a1157835SDaniel Fojt {
586*a1157835SDaniel Fojt 	struct wpa_supplicant *wpa_s = user_data;
587*a1157835SDaniel Fojt 
588*a1157835SDaniel Fojt 	return wpas_dbus_string_property_getter(iter, wpa_s->conf->model_name,
589*a1157835SDaniel Fojt 						error);
590*a1157835SDaniel Fojt }
591*a1157835SDaniel Fojt 
592*a1157835SDaniel Fojt 
593*a1157835SDaniel Fojt /**
594*a1157835SDaniel Fojt  * wpas_dbus_setter_wps_device_model_name - Set current device model name
595*a1157835SDaniel Fojt  * @iter: Pointer to incoming dbus message iter
596*a1157835SDaniel Fojt  * @error: Location to store error on failure
597*a1157835SDaniel Fojt  * @user_data: Function specific data
598*a1157835SDaniel Fojt  * Returns: TRUE on success, FALSE on failure
599*a1157835SDaniel Fojt  *
600*a1157835SDaniel Fojt  * Setter for "ModelName" property.
601*a1157835SDaniel Fojt  */
wpas_dbus_setter_wps_device_model_name(const struct wpa_dbus_property_desc * property_desc,DBusMessageIter * iter,DBusError * error,void * user_data)602*a1157835SDaniel Fojt dbus_bool_t wpas_dbus_setter_wps_device_model_name(
603*a1157835SDaniel Fojt 	const struct wpa_dbus_property_desc *property_desc,
604*a1157835SDaniel Fojt 	DBusMessageIter *iter, DBusError *error, void *user_data)
605*a1157835SDaniel Fojt {
606*a1157835SDaniel Fojt 	struct wpa_supplicant *wpa_s = user_data;
607*a1157835SDaniel Fojt 	char *methods, *model_name;
608*a1157835SDaniel Fojt 
609*a1157835SDaniel Fojt 	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
610*a1157835SDaniel Fojt 					      &methods))
611*a1157835SDaniel Fojt 		return FALSE;
612*a1157835SDaniel Fojt 
613*a1157835SDaniel Fojt 	if (os_strlen(methods) > WPS_MODEL_NAME_MAX_LEN)
614*a1157835SDaniel Fojt 		return FALSE;
615*a1157835SDaniel Fojt 
616*a1157835SDaniel Fojt 	model_name = os_strdup(methods);
617*a1157835SDaniel Fojt 	if (!model_name)
618*a1157835SDaniel Fojt 		return FALSE;
619*a1157835SDaniel Fojt 	os_free(wpa_s->conf->model_name);
620*a1157835SDaniel Fojt 	wpa_s->conf->model_name = model_name;
621*a1157835SDaniel Fojt 	wpa_s->conf->changed_parameters |= CFG_CHANGED_WPS_STRING;
622*a1157835SDaniel Fojt 	wpa_supplicant_update_config(wpa_s);
623*a1157835SDaniel Fojt 
624*a1157835SDaniel Fojt 	return TRUE;
625*a1157835SDaniel Fojt }
626*a1157835SDaniel Fojt 
627*a1157835SDaniel Fojt 
628*a1157835SDaniel Fojt /**
629*a1157835SDaniel Fojt  * wpas_dbus_getter_wps_device_model_number - Get current device model number
630*a1157835SDaniel Fojt  * @iter: Pointer to incoming dbus message iter
631*a1157835SDaniel Fojt  * @error: Location to store error on failure
632*a1157835SDaniel Fojt  * @user_data: Function specific data
633*a1157835SDaniel Fojt  * Returns: TRUE on success, FALSE on failure
634*a1157835SDaniel Fojt  *
635*a1157835SDaniel Fojt  * Getter for "ModelNumber" property.
636*a1157835SDaniel Fojt  */
wpas_dbus_getter_wps_device_model_number(const struct wpa_dbus_property_desc * property_desc,DBusMessageIter * iter,DBusError * error,void * user_data)637*a1157835SDaniel Fojt dbus_bool_t wpas_dbus_getter_wps_device_model_number(
638*a1157835SDaniel Fojt 	const struct wpa_dbus_property_desc *property_desc,
639*a1157835SDaniel Fojt 	DBusMessageIter *iter, DBusError *error, void *user_data)
640*a1157835SDaniel Fojt {
641*a1157835SDaniel Fojt 	struct wpa_supplicant *wpa_s = user_data;
642*a1157835SDaniel Fojt 
643*a1157835SDaniel Fojt 	return wpas_dbus_string_property_getter(iter, wpa_s->conf->model_number,
644*a1157835SDaniel Fojt 						error);
645*a1157835SDaniel Fojt }
646*a1157835SDaniel Fojt 
647*a1157835SDaniel Fojt 
648*a1157835SDaniel Fojt /**
649*a1157835SDaniel Fojt  * wpas_dbus_setter_wps_device_model_number - Set current device model number
650*a1157835SDaniel Fojt  * @iter: Pointer to incoming dbus message iter
651*a1157835SDaniel Fojt  * @error: Location to store error on failure
652*a1157835SDaniel Fojt  * @user_data: Function specific data
653*a1157835SDaniel Fojt  * Returns: TRUE on success, FALSE on failure
654*a1157835SDaniel Fojt  *
655*a1157835SDaniel Fojt  * Setter for "ModelNumber" property.
656*a1157835SDaniel Fojt  */
wpas_dbus_setter_wps_device_model_number(const struct wpa_dbus_property_desc * property_desc,DBusMessageIter * iter,DBusError * error,void * user_data)657*a1157835SDaniel Fojt dbus_bool_t wpas_dbus_setter_wps_device_model_number(
658*a1157835SDaniel Fojt 	const struct wpa_dbus_property_desc *property_desc,
659*a1157835SDaniel Fojt 	DBusMessageIter *iter, DBusError *error, void *user_data)
660*a1157835SDaniel Fojt {
661*a1157835SDaniel Fojt 	struct wpa_supplicant *wpa_s = user_data;
662*a1157835SDaniel Fojt 	char *methods, *model_number;
663*a1157835SDaniel Fojt 
664*a1157835SDaniel Fojt 	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
665*a1157835SDaniel Fojt 					      &methods))
666*a1157835SDaniel Fojt 		return FALSE;
667*a1157835SDaniel Fojt 
668*a1157835SDaniel Fojt 	if (os_strlen(methods) > WPS_MODEL_NUMBER_MAX_LEN)
669*a1157835SDaniel Fojt 		return FALSE;
670*a1157835SDaniel Fojt 
671*a1157835SDaniel Fojt 	model_number = os_strdup(methods);
672*a1157835SDaniel Fojt 	if (!model_number)
673*a1157835SDaniel Fojt 		return FALSE;
674*a1157835SDaniel Fojt 
675*a1157835SDaniel Fojt 	os_free(wpa_s->conf->model_number);
676*a1157835SDaniel Fojt 	wpa_s->conf->model_number = model_number;
677*a1157835SDaniel Fojt 	wpa_s->conf->changed_parameters |= CFG_CHANGED_WPS_STRING;
678*a1157835SDaniel Fojt 	wpa_supplicant_update_config(wpa_s);
679*a1157835SDaniel Fojt 
680*a1157835SDaniel Fojt 	return TRUE;
681*a1157835SDaniel Fojt }
682*a1157835SDaniel Fojt 
683*a1157835SDaniel Fojt 
684*a1157835SDaniel Fojt /**
685*a1157835SDaniel Fojt  * wpas_dbus_getter_wps_device_serial_number - Get current device serial number
686*a1157835SDaniel Fojt  * @iter: Pointer to incoming dbus message iter
687*a1157835SDaniel Fojt  * @error: Location to store error on failure
688*a1157835SDaniel Fojt  * @user_data: Function specific data
689*a1157835SDaniel Fojt  * Returns: TRUE on success, FALSE on failure
690*a1157835SDaniel Fojt  *
691*a1157835SDaniel Fojt  * Getter for "SerialNumber" property.
692*a1157835SDaniel Fojt  */
wpas_dbus_getter_wps_device_serial_number(const struct wpa_dbus_property_desc * property_desc,DBusMessageIter * iter,DBusError * error,void * user_data)693*a1157835SDaniel Fojt dbus_bool_t wpas_dbus_getter_wps_device_serial_number(
694*a1157835SDaniel Fojt 	const struct wpa_dbus_property_desc *property_desc,
695*a1157835SDaniel Fojt 	DBusMessageIter *iter, DBusError *error, void *user_data)
696*a1157835SDaniel Fojt {
697*a1157835SDaniel Fojt 	struct wpa_supplicant *wpa_s = user_data;
698*a1157835SDaniel Fojt 
699*a1157835SDaniel Fojt 	return wpas_dbus_string_property_getter(iter,
700*a1157835SDaniel Fojt 						wpa_s->conf->serial_number,
701*a1157835SDaniel Fojt 						error);
702*a1157835SDaniel Fojt }
703*a1157835SDaniel Fojt 
704*a1157835SDaniel Fojt 
705*a1157835SDaniel Fojt /**
706*a1157835SDaniel Fojt  * wpas_dbus_setter_wps_device_serial_number - Set current device serial number
707*a1157835SDaniel Fojt  * @iter: Pointer to incoming dbus message iter
708*a1157835SDaniel Fojt  * @error: Location to store error on failure
709*a1157835SDaniel Fojt  * @user_data: Function specific data
710*a1157835SDaniel Fojt  * Returns: TRUE on success, FALSE on failure
711*a1157835SDaniel Fojt  *
712*a1157835SDaniel Fojt  * Setter for "SerialNumber" property.
713*a1157835SDaniel Fojt  */
wpas_dbus_setter_wps_device_serial_number(const struct wpa_dbus_property_desc * property_desc,DBusMessageIter * iter,DBusError * error,void * user_data)714*a1157835SDaniel Fojt dbus_bool_t wpas_dbus_setter_wps_device_serial_number(
715*a1157835SDaniel Fojt 	const struct wpa_dbus_property_desc *property_desc,
716*a1157835SDaniel Fojt 	DBusMessageIter *iter, DBusError *error, void *user_data)
717*a1157835SDaniel Fojt {
718*a1157835SDaniel Fojt 	struct wpa_supplicant *wpa_s = user_data;
719*a1157835SDaniel Fojt 	char *methods, *serial_number;
720*a1157835SDaniel Fojt 
721*a1157835SDaniel Fojt 	if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
722*a1157835SDaniel Fojt 					      &methods))
723*a1157835SDaniel Fojt 		return FALSE;
724*a1157835SDaniel Fojt 
725*a1157835SDaniel Fojt 	if (os_strlen(methods) > WPS_SERIAL_NUMBER_MAX_LEN)
726*a1157835SDaniel Fojt 		return FALSE;
727*a1157835SDaniel Fojt 
728*a1157835SDaniel Fojt 	serial_number = os_strdup(methods);
729*a1157835SDaniel Fojt 	if (!serial_number)
730*a1157835SDaniel Fojt 		return FALSE;
731*a1157835SDaniel Fojt 	os_free(wpa_s->conf->serial_number);
732*a1157835SDaniel Fojt 	wpa_s->conf->serial_number = serial_number;
733*a1157835SDaniel Fojt 	wpa_s->conf->changed_parameters |= CFG_CHANGED_WPS_STRING;
734*a1157835SDaniel Fojt 	wpa_supplicant_update_config(wpa_s);
735*a1157835SDaniel Fojt 
736*a1157835SDaniel Fojt 	return TRUE;
737*a1157835SDaniel Fojt }
738*a1157835SDaniel Fojt 
739*a1157835SDaniel Fojt 
740*a1157835SDaniel Fojt /**
741*a1157835SDaniel Fojt  * wpas_dbus_getter_wps_device_device_type - Get current device type
742*a1157835SDaniel Fojt  * @iter: Pointer to incoming dbus message iter
743*a1157835SDaniel Fojt  * @error: Location to store error on failure
744*a1157835SDaniel Fojt  * @user_data: Function specific data
745*a1157835SDaniel Fojt  * Returns: TRUE on success, FALSE on failure
746*a1157835SDaniel Fojt  *
747*a1157835SDaniel Fojt  * Getter for "DeviceType" property.
748*a1157835SDaniel Fojt  */
wpas_dbus_getter_wps_device_device_type(const struct wpa_dbus_property_desc * property_desc,DBusMessageIter * iter,DBusError * error,void * user_data)749*a1157835SDaniel Fojt dbus_bool_t wpas_dbus_getter_wps_device_device_type(
750*a1157835SDaniel Fojt 	const struct wpa_dbus_property_desc *property_desc,
751*a1157835SDaniel Fojt 	DBusMessageIter *iter, DBusError *error, void *user_data)
752*a1157835SDaniel Fojt {
753*a1157835SDaniel Fojt 	struct wpa_supplicant *wpa_s = user_data;
754*a1157835SDaniel Fojt 
755*a1157835SDaniel Fojt 	if (!wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
756*a1157835SDaniel Fojt 						    (char *)
757*a1157835SDaniel Fojt 						    wpa_s->conf->device_type,
758*a1157835SDaniel Fojt 						    WPS_DEV_TYPE_LEN, error)) {
759*a1157835SDaniel Fojt 		dbus_set_error(error, DBUS_ERROR_FAILED,
760*a1157835SDaniel Fojt 			       "%s: error constructing reply", __func__);
761*a1157835SDaniel Fojt 		return FALSE;
762*a1157835SDaniel Fojt 	}
763*a1157835SDaniel Fojt 
764*a1157835SDaniel Fojt 	return TRUE;
765*a1157835SDaniel Fojt }
766*a1157835SDaniel Fojt 
767*a1157835SDaniel Fojt 
768*a1157835SDaniel Fojt /**
769*a1157835SDaniel Fojt  * wpas_dbus_setter_wps_device_device_type - Set current device type
770*a1157835SDaniel Fojt  * @iter: Pointer to incoming dbus message iter
771*a1157835SDaniel Fojt  * @error: Location to store error on failure
772*a1157835SDaniel Fojt  * @user_data: Function specific data
773*a1157835SDaniel Fojt  * Returns: TRUE on success, FALSE on failure
774*a1157835SDaniel Fojt  *
775*a1157835SDaniel Fojt  * Setter for "DeviceType" property.
776*a1157835SDaniel Fojt  */
wpas_dbus_setter_wps_device_device_type(const struct wpa_dbus_property_desc * property_desc,DBusMessageIter * iter,DBusError * error,void * user_data)777*a1157835SDaniel Fojt dbus_bool_t wpas_dbus_setter_wps_device_device_type(
778*a1157835SDaniel Fojt 	const struct wpa_dbus_property_desc *property_desc,
779*a1157835SDaniel Fojt 	DBusMessageIter *iter, DBusError *error, void *user_data)
780*a1157835SDaniel Fojt {
781*a1157835SDaniel Fojt 	struct wpa_supplicant *wpa_s = user_data;
782*a1157835SDaniel Fojt 	u8 *dev_type;
783*a1157835SDaniel Fojt 	int dev_len;
784*a1157835SDaniel Fojt 	DBusMessageIter variant, array_iter;
785*a1157835SDaniel Fojt 
786*a1157835SDaniel Fojt 	if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_VARIANT)
787*a1157835SDaniel Fojt 		return FALSE;
788*a1157835SDaniel Fojt 
789*a1157835SDaniel Fojt 	dbus_message_iter_recurse(iter, &variant);
790*a1157835SDaniel Fojt 	if (dbus_message_iter_get_arg_type(&variant) != DBUS_TYPE_ARRAY)
791*a1157835SDaniel Fojt 		return FALSE;
792*a1157835SDaniel Fojt 
793*a1157835SDaniel Fojt 	dbus_message_iter_recurse(&variant, &array_iter);
794*a1157835SDaniel Fojt 	dbus_message_iter_get_fixed_array(&array_iter, &dev_type, &dev_len);
795*a1157835SDaniel Fojt 
796*a1157835SDaniel Fojt 	if (dev_len != WPS_DEV_TYPE_LEN)
797*a1157835SDaniel Fojt 		return FALSE;
798*a1157835SDaniel Fojt 
799*a1157835SDaniel Fojt 	os_memcpy(wpa_s->conf->device_type, dev_type, WPS_DEV_TYPE_LEN);
800*a1157835SDaniel Fojt 	wpa_s->conf->changed_parameters |= CFG_CHANGED_DEVICE_TYPE;
801*a1157835SDaniel Fojt 	wpa_supplicant_update_config(wpa_s);
802*a1157835SDaniel Fojt 
803*a1157835SDaniel Fojt 	return TRUE;
804*a1157835SDaniel Fojt }
805