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, ¶ms->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, ¶ms->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, ¶ms->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(¶ms, 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 ¶ms, &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