dbus_new_handlers_wps.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800
  1. /*
  2. * WPA Supplicant / dbus-based control interface (WPS)
  3. * Copyright (c) 2006, Dan Williams <dcbw@redhat.com> and Red Hat, Inc.
  4. * Copyright (c) 2009, Witold Sowa <witold.sowa@gmail.com>
  5. *
  6. * This software may be distributed under the terms of the BSD license.
  7. * See README for more details.
  8. */
  9. #include "includes.h"
  10. #include "common.h"
  11. #include "../config.h"
  12. #include "../wpa_supplicant_i.h"
  13. #include "../wps_supplicant.h"
  14. #include "../driver_i.h"
  15. #include "../ap.h"
  16. #include "dbus_new_helpers.h"
  17. #include "dbus_new.h"
  18. #include "dbus_new_handlers.h"
  19. #include "dbus_dict_helpers.h"
  20. struct wps_start_params {
  21. int role; /* 0 - not set, 1 - enrollee, 2 - registrar */
  22. int type; /* 0 - not set, 1 - pin, 2 - pbc */
  23. u8 *bssid;
  24. char *pin;
  25. u8 *p2p_dev_addr;
  26. };
  27. static int wpas_dbus_handler_wps_role(DBusMessage *message,
  28. DBusMessageIter *entry_iter,
  29. struct wps_start_params *params,
  30. DBusMessage **reply)
  31. {
  32. DBusMessageIter variant_iter;
  33. char *val;
  34. dbus_message_iter_recurse(entry_iter, &variant_iter);
  35. if (dbus_message_iter_get_arg_type(&variant_iter) !=
  36. DBUS_TYPE_STRING) {
  37. wpa_printf(MSG_DEBUG,
  38. "dbus: WPS.Start - Wrong Role type, string required");
  39. *reply = wpas_dbus_error_invalid_args(message,
  40. "Role must be a string");
  41. return -1;
  42. }
  43. dbus_message_iter_get_basic(&variant_iter, &val);
  44. if (os_strcmp(val, "enrollee") == 0)
  45. params->role = 1;
  46. else if (os_strcmp(val, "registrar") == 0)
  47. params->role = 2;
  48. else {
  49. wpa_printf(MSG_DEBUG, "dbus: WPS.Start - Unknown role %s", val);
  50. *reply = wpas_dbus_error_invalid_args(message, val);
  51. return -1;
  52. }
  53. return 0;
  54. }
  55. static int wpas_dbus_handler_wps_type(DBusMessage *message,
  56. DBusMessageIter *entry_iter,
  57. struct wps_start_params *params,
  58. DBusMessage **reply)
  59. {
  60. DBusMessageIter variant_iter;
  61. char *val;
  62. dbus_message_iter_recurse(entry_iter, &variant_iter);
  63. if (dbus_message_iter_get_arg_type(&variant_iter) != DBUS_TYPE_STRING) {
  64. wpa_printf(MSG_DEBUG,
  65. "dbus: WPS.Start - Wrong Type type, string required");
  66. *reply = wpas_dbus_error_invalid_args(message,
  67. "Type must be a string");
  68. return -1;
  69. }
  70. dbus_message_iter_get_basic(&variant_iter, &val);
  71. if (os_strcmp(val, "pin") == 0)
  72. params->type = 1;
  73. else if (os_strcmp(val, "pbc") == 0)
  74. params->type = 2;
  75. else {
  76. wpa_printf(MSG_DEBUG, "dbus: WPS.Start - Unknown type %s",
  77. val);
  78. *reply = wpas_dbus_error_invalid_args(message, val);
  79. return -1;
  80. }
  81. return 0;
  82. }
  83. static int wpas_dbus_handler_wps_bssid(DBusMessage *message,
  84. DBusMessageIter *entry_iter,
  85. struct wps_start_params *params,
  86. DBusMessage **reply)
  87. {
  88. DBusMessageIter variant_iter, array_iter;
  89. int len;
  90. dbus_message_iter_recurse(entry_iter, &variant_iter);
  91. if (dbus_message_iter_get_arg_type(&variant_iter) != DBUS_TYPE_ARRAY ||
  92. dbus_message_iter_get_element_type(&variant_iter) !=
  93. DBUS_TYPE_BYTE) {
  94. wpa_printf(MSG_DEBUG,
  95. "dbus: WPS.Start - Wrong Bssid type, byte array required");
  96. *reply = wpas_dbus_error_invalid_args(
  97. message, "Bssid must be a byte array");
  98. return -1;
  99. }
  100. dbus_message_iter_recurse(&variant_iter, &array_iter);
  101. dbus_message_iter_get_fixed_array(&array_iter, &params->bssid, &len);
  102. if (len != ETH_ALEN) {
  103. wpa_printf(MSG_DEBUG, "dbus: WPS.Start - Wrong Bssid length %d",
  104. len);
  105. *reply = wpas_dbus_error_invalid_args(message,
  106. "Bssid is wrong length");
  107. return -1;
  108. }
  109. return 0;
  110. }
  111. static int wpas_dbus_handler_wps_pin(DBusMessage *message,
  112. DBusMessageIter *entry_iter,
  113. struct wps_start_params *params,
  114. DBusMessage **reply)
  115. {
  116. DBusMessageIter variant_iter;
  117. dbus_message_iter_recurse(entry_iter, &variant_iter);
  118. if (dbus_message_iter_get_arg_type(&variant_iter) != DBUS_TYPE_STRING) {
  119. wpa_printf(MSG_DEBUG,
  120. "dbus: WPS.Start - Wrong Pin type, string required");
  121. *reply = wpas_dbus_error_invalid_args(message,
  122. "Pin must be a string");
  123. return -1;
  124. }
  125. dbus_message_iter_get_basic(&variant_iter, &params->pin);
  126. return 0;
  127. }
  128. #ifdef CONFIG_P2P
  129. static int wpas_dbus_handler_wps_p2p_dev_addr(DBusMessage *message,
  130. DBusMessageIter *entry_iter,
  131. struct wps_start_params *params,
  132. DBusMessage **reply)
  133. {
  134. DBusMessageIter variant_iter, array_iter;
  135. int len;
  136. dbus_message_iter_recurse(entry_iter, &variant_iter);
  137. if (dbus_message_iter_get_arg_type(&variant_iter) != DBUS_TYPE_ARRAY ||
  138. dbus_message_iter_get_element_type(&variant_iter) !=
  139. DBUS_TYPE_BYTE) {
  140. wpa_printf(MSG_DEBUG,
  141. "dbus: WPS.Start - Wrong P2PDeviceAddress type, byte array required");
  142. *reply = wpas_dbus_error_invalid_args(
  143. message, "P2PDeviceAddress must be a byte array");
  144. return -1;
  145. }
  146. dbus_message_iter_recurse(&variant_iter, &array_iter);
  147. dbus_message_iter_get_fixed_array(&array_iter, &params->p2p_dev_addr,
  148. &len);
  149. if (len != ETH_ALEN) {
  150. wpa_printf(MSG_DEBUG,
  151. "dbus: WPS.Start - Wrong P2PDeviceAddress length %d",
  152. len);
  153. *reply = wpas_dbus_error_invalid_args(
  154. message, "P2PDeviceAddress has wrong length");
  155. return -1;
  156. }
  157. return 0;
  158. }
  159. #endif /* CONFIG_P2P */
  160. static int wpas_dbus_handler_wps_start_entry(DBusMessage *message, char *key,
  161. DBusMessageIter *entry_iter,
  162. struct wps_start_params *params,
  163. DBusMessage **reply)
  164. {
  165. if (os_strcmp(key, "Role") == 0)
  166. return wpas_dbus_handler_wps_role(message, entry_iter,
  167. params, reply);
  168. else if (os_strcmp(key, "Type") == 0)
  169. return wpas_dbus_handler_wps_type(message, entry_iter,
  170. params, reply);
  171. else if (os_strcmp(key, "Bssid") == 0)
  172. return wpas_dbus_handler_wps_bssid(message, entry_iter,
  173. params, reply);
  174. else if (os_strcmp(key, "Pin") == 0)
  175. return wpas_dbus_handler_wps_pin(message, entry_iter,
  176. params, reply);
  177. #ifdef CONFIG_P2P
  178. else if (os_strcmp(key, "P2PDeviceAddress") == 0)
  179. return wpas_dbus_handler_wps_p2p_dev_addr(message, entry_iter,
  180. params, reply);
  181. #endif /* CONFIG_P2P */
  182. wpa_printf(MSG_DEBUG, "dbus: WPS.Start - unknown key %s", key);
  183. *reply = wpas_dbus_error_invalid_args(message, key);
  184. return -1;
  185. }
  186. /**
  187. * wpas_dbus_handler_wps_start - Start WPS configuration
  188. * @message: Pointer to incoming dbus message
  189. * @wpa_s: %wpa_supplicant data structure
  190. * Returns: DBus message dictionary on success or DBus error on failure
  191. *
  192. * Handler for "Start" method call. DBus dictionary argument contains
  193. * information about role (enrollee or registrar), authorization method
  194. * (pin or push button) and optionally pin and bssid. Returned message
  195. * has a dictionary argument which may contain newly generated pin (optional).
  196. */
  197. DBusMessage * wpas_dbus_handler_wps_start(DBusMessage *message,
  198. struct wpa_supplicant *wpa_s)
  199. {
  200. DBusMessage *reply = NULL;
  201. DBusMessageIter iter, dict_iter, entry_iter;
  202. struct wps_start_params params;
  203. char *key;
  204. char npin[9] = { '\0' };
  205. int ret;
  206. os_memset(&params, 0, sizeof(params));
  207. dbus_message_iter_init(message, &iter);
  208. dbus_message_iter_recurse(&iter, &dict_iter);
  209. while (dbus_message_iter_get_arg_type(&dict_iter) ==
  210. DBUS_TYPE_DICT_ENTRY) {
  211. dbus_message_iter_recurse(&dict_iter, &entry_iter);
  212. dbus_message_iter_get_basic(&entry_iter, &key);
  213. dbus_message_iter_next(&entry_iter);
  214. if (wpas_dbus_handler_wps_start_entry(message, key,
  215. &entry_iter,
  216. &params, &reply))
  217. return reply;
  218. dbus_message_iter_next(&dict_iter);
  219. }
  220. #ifdef CONFIG_AP
  221. if (wpa_s->ap_iface && params.type == 1) {
  222. if (params.pin == NULL) {
  223. wpa_printf(MSG_DEBUG,
  224. "dbus: WPS.Start - Pin required for registrar role");
  225. return wpas_dbus_error_invalid_args(
  226. message, "Pin required for registrar role.");
  227. }
  228. ret = wpa_supplicant_ap_wps_pin(wpa_s,
  229. params.bssid,
  230. params.pin,
  231. npin, sizeof(npin), 0);
  232. } else if (wpa_s->ap_iface) {
  233. ret = wpa_supplicant_ap_wps_pbc(wpa_s,
  234. params.bssid,
  235. params.p2p_dev_addr);
  236. } else
  237. #endif /* CONFIG_AP */
  238. if (params.role == 0) {
  239. wpa_printf(MSG_DEBUG, "dbus: WPS.Start - Role not specified");
  240. return wpas_dbus_error_invalid_args(message,
  241. "Role not specified");
  242. } else if (params.role == 2) {
  243. if (params.pin == NULL) {
  244. wpa_printf(MSG_DEBUG,
  245. "dbus: WPS.Start - Pin required for registrar role");
  246. return wpas_dbus_error_invalid_args(
  247. message, "Pin required for registrar role.");
  248. }
  249. ret = wpas_wps_start_reg(wpa_s, params.bssid, params.pin,
  250. NULL);
  251. } else if (params.type == 0) {
  252. wpa_printf(MSG_DEBUG, "dbus: WPS.Start - Type not specified");
  253. return wpas_dbus_error_invalid_args(message,
  254. "Type not specified");
  255. } else if (params.type == 1) {
  256. ret = wpas_wps_start_pin(wpa_s, params.bssid,
  257. params.pin, 0,
  258. DEV_PW_DEFAULT);
  259. if (ret > 0)
  260. os_snprintf(npin, sizeof(npin), "%08d", ret);
  261. } else {
  262. ret = wpas_wps_start_pbc(wpa_s, params.bssid, 0);
  263. }
  264. if (ret < 0) {
  265. wpa_printf(MSG_DEBUG,
  266. "dbus: WPS.Start wpas_wps_failed in role %s and key %s",
  267. (params.role == 1 ? "enrollee" : "registrar"),
  268. (params.type == 0 ? "" :
  269. (params.type == 1 ? "pin" : "pbc")));
  270. return wpas_dbus_error_unknown_error(message,
  271. "WPS start failed");
  272. }
  273. reply = dbus_message_new_method_return(message);
  274. if (!reply)
  275. return wpas_dbus_error_no_memory(message);
  276. dbus_message_iter_init_append(reply, &iter);
  277. if (!wpa_dbus_dict_open_write(&iter, &dict_iter) ||
  278. (os_strlen(npin) > 0 &&
  279. !wpa_dbus_dict_append_string(&dict_iter, "Pin", npin)) ||
  280. !wpa_dbus_dict_close_write(&iter, &dict_iter)) {
  281. dbus_message_unref(reply);
  282. return wpas_dbus_error_no_memory(message);
  283. }
  284. return reply;
  285. }
  286. /**
  287. * wpas_dbus_handler_wps_cancel - Cancel ongoing WPS configuration
  288. * @message: Pointer to incoming dbus message
  289. * @wpa_s: %wpa_supplicant data structure
  290. * Returns: NULL on success or DBus error on failure
  291. *
  292. * Handler for "Cancel" method call. Returns NULL if WPS cancel successful
  293. * or DBus error on WPS cancel failure
  294. */
  295. DBusMessage * wpas_dbus_handler_wps_cancel(DBusMessage *message,
  296. struct wpa_supplicant *wpa_s)
  297. {
  298. if (wpas_wps_cancel(wpa_s))
  299. return wpas_dbus_error_unknown_error(message,
  300. "WPS cancel failed");
  301. return NULL;
  302. }
  303. /**
  304. * wpas_dbus_getter_process_credentials - Check if credentials are processed
  305. * @message: Pointer to incoming dbus message
  306. * @wpa_s: %wpa_supplicant data structure
  307. * Returns: TRUE on success, FALSE on failure
  308. *
  309. * Getter for "ProcessCredentials" property. Returns returned boolean will be
  310. * true if wps_cred_processing configuration field is not equal to 1 or false
  311. * if otherwise.
  312. */
  313. dbus_bool_t wpas_dbus_getter_process_credentials(
  314. const struct wpa_dbus_property_desc *property_desc,
  315. DBusMessageIter *iter, DBusError *error, void *user_data)
  316. {
  317. struct wpa_supplicant *wpa_s = user_data;
  318. dbus_bool_t process = wpa_s->conf->wps_cred_processing != 1;
  319. return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_BOOLEAN,
  320. &process, error);
  321. }
  322. /**
  323. * wpas_dbus_setter_process_credentials - Set credentials_processed conf param
  324. * @iter: Pointer to incoming dbus message iter
  325. * @error: Location to store error on failure
  326. * @user_data: Function specific data
  327. * Returns: TRUE on success, FALSE on failure
  328. *
  329. * Setter for "ProcessCredentials" property. Sets credentials_processed on 2
  330. * if boolean argument is true or on 1 if otherwise.
  331. */
  332. dbus_bool_t wpas_dbus_setter_process_credentials(
  333. const struct wpa_dbus_property_desc *property_desc,
  334. DBusMessageIter *iter, DBusError *error, void *user_data)
  335. {
  336. struct wpa_supplicant *wpa_s = user_data;
  337. dbus_bool_t process_credentials, old_pc;
  338. if (!wpa_s->dbus_new_path)
  339. return FALSE;
  340. if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_BOOLEAN,
  341. &process_credentials))
  342. return FALSE;
  343. old_pc = wpa_s->conf->wps_cred_processing != 1;
  344. wpa_s->conf->wps_cred_processing = (process_credentials ? 2 : 1);
  345. if ((wpa_s->conf->wps_cred_processing != 1) != old_pc)
  346. wpa_dbus_mark_property_changed(wpa_s->global->dbus,
  347. wpa_s->dbus_new_path,
  348. WPAS_DBUS_NEW_IFACE_WPS,
  349. "ProcessCredentials");
  350. return TRUE;
  351. }
  352. /**
  353. * wpas_dbus_getter_config_methods - Get current WPS configuration methods
  354. * @iter: Pointer to incoming dbus message iter
  355. * @error: Location to store error on failure
  356. * @user_data: Function specific data
  357. * Returns: TRUE on success, FALSE on failure
  358. *
  359. * Getter for "ConfigMethods" property. Returned boolean will be true if
  360. * providing the relevant string worked, or false otherwise.
  361. */
  362. dbus_bool_t wpas_dbus_getter_config_methods(
  363. const struct wpa_dbus_property_desc *property_desc,
  364. DBusMessageIter *iter, DBusError *error, void *user_data)
  365. {
  366. struct wpa_supplicant *wpa_s = user_data;
  367. return wpas_dbus_string_property_getter(iter,
  368. wpa_s->conf->config_methods,
  369. error);
  370. }
  371. /**
  372. * wpas_dbus_setter_config_methods - Set WPS configuration methods
  373. * @iter: Pointer to incoming dbus message iter
  374. * @error: Location to store error on failure
  375. * @user_data: Function specific data
  376. * Returns: TRUE on success, FALSE on failure
  377. *
  378. * Setter for "ConfigMethods" property. Sets the methods string, apply such
  379. * change and returns true on success. Returns false otherwise.
  380. */
  381. dbus_bool_t wpas_dbus_setter_config_methods(
  382. const struct wpa_dbus_property_desc *property_desc,
  383. DBusMessageIter *iter, DBusError *error, void *user_data)
  384. {
  385. struct wpa_supplicant *wpa_s = user_data;
  386. char *methods, *new_methods;
  387. if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
  388. &methods))
  389. return FALSE;
  390. new_methods = os_strdup(methods);
  391. if (!new_methods)
  392. return FALSE;
  393. os_free(wpa_s->conf->config_methods);
  394. wpa_s->conf->config_methods = new_methods;
  395. wpa_s->conf->changed_parameters |= CFG_CHANGED_CONFIG_METHODS;
  396. wpa_supplicant_update_config(wpa_s);
  397. return TRUE;
  398. }
  399. /**
  400. * wpas_dbus_getter_wps_device_name - Get current WPS device name
  401. * @iter: Pointer to incoming dbus message iter
  402. * @error: Location to store error on failure
  403. * @user_data: Function specific data
  404. * Returns: TRUE on success, FALSE on failure
  405. *
  406. * Getter for "DeviceName" property.
  407. */
  408. dbus_bool_t wpas_dbus_getter_wps_device_name(
  409. const struct wpa_dbus_property_desc *property_desc,
  410. DBusMessageIter *iter, DBusError *error, void *user_data)
  411. {
  412. struct wpa_supplicant *wpa_s = user_data;
  413. return wpas_dbus_string_property_getter(iter, wpa_s->conf->device_name,
  414. error);
  415. }
  416. /**
  417. * wpas_dbus_setter_wps_device_name - Set current WPS device name
  418. * @iter: Pointer to incoming dbus message iter
  419. * @error: Location to store error on failure
  420. * @user_data: Function specific data
  421. * Returns: TRUE on success, FALSE on failure
  422. *
  423. * Setter for "DeviceName" property.
  424. */
  425. dbus_bool_t wpas_dbus_setter_wps_device_name(
  426. const struct wpa_dbus_property_desc *property_desc,
  427. DBusMessageIter *iter, DBusError *error, void *user_data)
  428. {
  429. struct wpa_supplicant *wpa_s = user_data;
  430. char *methods, *devname;
  431. if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
  432. &methods))
  433. return FALSE;
  434. if (os_strlen(methods) > WPS_DEV_NAME_MAX_LEN)
  435. return FALSE;
  436. devname = os_strdup(methods);
  437. if (!devname)
  438. return FALSE;
  439. os_free(wpa_s->conf->device_name);
  440. wpa_s->conf->device_name = devname;
  441. wpa_s->conf->changed_parameters |= CFG_CHANGED_DEVICE_NAME;
  442. wpa_supplicant_update_config(wpa_s);
  443. return TRUE;
  444. }
  445. /**
  446. * wpas_dbus_getter_wps_manufacturer - Get current manufacturer name
  447. * @iter: Pointer to incoming dbus message iter
  448. * @error: Location to store error on failure
  449. * @user_data: Function specific data
  450. * Returns: TRUE on success, FALSE on failure
  451. *
  452. * Getter for "Manufacturer" property.
  453. */
  454. dbus_bool_t wpas_dbus_getter_wps_manufacturer(
  455. const struct wpa_dbus_property_desc *property_desc,
  456. DBusMessageIter *iter, DBusError *error, void *user_data)
  457. {
  458. struct wpa_supplicant *wpa_s = user_data;
  459. return wpas_dbus_string_property_getter(iter, wpa_s->conf->manufacturer,
  460. error);
  461. }
  462. /**
  463. * wpas_dbus_setter_wps_manufacturer - Set current manufacturer name
  464. * @iter: Pointer to incoming dbus message iter
  465. * @error: Location to store error on failure
  466. * @user_data: Function specific data
  467. * Returns: TRUE on success, FALSE on failure
  468. *
  469. * Setter for "Manufacturer" property.
  470. */
  471. dbus_bool_t wpas_dbus_setter_wps_manufacturer(
  472. const struct wpa_dbus_property_desc *property_desc,
  473. DBusMessageIter *iter, DBusError *error, void *user_data)
  474. {
  475. struct wpa_supplicant *wpa_s = user_data;
  476. char *methods, *manufacturer;
  477. if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
  478. &methods))
  479. return FALSE;
  480. if (os_strlen(methods) > WPS_MANUFACTURER_MAX_LEN)
  481. return FALSE;
  482. manufacturer = os_strdup(methods);
  483. if (!manufacturer)
  484. return FALSE;
  485. os_free(wpa_s->conf->manufacturer);
  486. wpa_s->conf->manufacturer = manufacturer;
  487. wpa_s->conf->changed_parameters |= CFG_CHANGED_WPS_STRING;
  488. wpa_supplicant_update_config(wpa_s);
  489. return TRUE;
  490. }
  491. /**
  492. * wpas_dbus_getter_wps_device_model_name - Get current device model name
  493. * @iter: Pointer to incoming dbus message iter
  494. * @error: Location to store error on failure
  495. * @user_data: Function specific data
  496. * Returns: TRUE on success, FALSE on failure
  497. *
  498. * Getter for "ModelName" property.
  499. */
  500. dbus_bool_t wpas_dbus_getter_wps_device_model_name(
  501. const struct wpa_dbus_property_desc *property_desc,
  502. DBusMessageIter *iter, DBusError *error, void *user_data)
  503. {
  504. struct wpa_supplicant *wpa_s = user_data;
  505. return wpas_dbus_string_property_getter(iter, wpa_s->conf->model_name,
  506. error);
  507. }
  508. /**
  509. * wpas_dbus_setter_wps_device_model_name - Set current device model name
  510. * @iter: Pointer to incoming dbus message iter
  511. * @error: Location to store error on failure
  512. * @user_data: Function specific data
  513. * Returns: TRUE on success, FALSE on failure
  514. *
  515. * Setter for "ModelName" property.
  516. */
  517. dbus_bool_t wpas_dbus_setter_wps_device_model_name(
  518. const struct wpa_dbus_property_desc *property_desc,
  519. DBusMessageIter *iter, DBusError *error, void *user_data)
  520. {
  521. struct wpa_supplicant *wpa_s = user_data;
  522. char *methods, *model_name;
  523. if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
  524. &methods))
  525. return FALSE;
  526. if (os_strlen(methods) > WPS_MODEL_NAME_MAX_LEN)
  527. return FALSE;
  528. model_name = os_strdup(methods);
  529. if (!model_name)
  530. return FALSE;
  531. os_free(wpa_s->conf->model_name);
  532. wpa_s->conf->model_name = model_name;
  533. wpa_s->conf->changed_parameters |= CFG_CHANGED_WPS_STRING;
  534. wpa_supplicant_update_config(wpa_s);
  535. return TRUE;
  536. }
  537. /**
  538. * wpas_dbus_getter_wps_device_model_number - Get current device model number
  539. * @iter: Pointer to incoming dbus message iter
  540. * @error: Location to store error on failure
  541. * @user_data: Function specific data
  542. * Returns: TRUE on success, FALSE on failure
  543. *
  544. * Getter for "ModelNumber" property.
  545. */
  546. dbus_bool_t wpas_dbus_getter_wps_device_model_number(
  547. const struct wpa_dbus_property_desc *property_desc,
  548. DBusMessageIter *iter, DBusError *error, void *user_data)
  549. {
  550. struct wpa_supplicant *wpa_s = user_data;
  551. return wpas_dbus_string_property_getter(iter, wpa_s->conf->model_number,
  552. error);
  553. }
  554. /**
  555. * wpas_dbus_setter_wps_device_model_number - Set current device model number
  556. * @iter: Pointer to incoming dbus message iter
  557. * @error: Location to store error on failure
  558. * @user_data: Function specific data
  559. * Returns: TRUE on success, FALSE on failure
  560. *
  561. * Setter for "ModelNumber" property.
  562. */
  563. dbus_bool_t wpas_dbus_setter_wps_device_model_number(
  564. const struct wpa_dbus_property_desc *property_desc,
  565. DBusMessageIter *iter, DBusError *error, void *user_data)
  566. {
  567. struct wpa_supplicant *wpa_s = user_data;
  568. char *methods, *model_number;
  569. if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
  570. &methods))
  571. return FALSE;
  572. if (os_strlen(methods) > WPS_MODEL_NUMBER_MAX_LEN)
  573. return FALSE;
  574. model_number = os_strdup(methods);
  575. if (!model_number)
  576. return FALSE;
  577. os_free(wpa_s->conf->model_number);
  578. wpa_s->conf->model_number = model_number;
  579. wpa_s->conf->changed_parameters |= CFG_CHANGED_WPS_STRING;
  580. wpa_supplicant_update_config(wpa_s);
  581. return TRUE;
  582. }
  583. /**
  584. * wpas_dbus_getter_wps_device_serial_number - Get current device serial number
  585. * @iter: Pointer to incoming dbus message iter
  586. * @error: Location to store error on failure
  587. * @user_data: Function specific data
  588. * Returns: TRUE on success, FALSE on failure
  589. *
  590. * Getter for "SerialNumber" property.
  591. */
  592. dbus_bool_t wpas_dbus_getter_wps_device_serial_number(
  593. const struct wpa_dbus_property_desc *property_desc,
  594. DBusMessageIter *iter, DBusError *error, void *user_data)
  595. {
  596. struct wpa_supplicant *wpa_s = user_data;
  597. return wpas_dbus_string_property_getter(iter,
  598. wpa_s->conf->serial_number,
  599. error);
  600. }
  601. /**
  602. * wpas_dbus_setter_wps_device_serial_number - Set current device serial number
  603. * @iter: Pointer to incoming dbus message iter
  604. * @error: Location to store error on failure
  605. * @user_data: Function specific data
  606. * Returns: TRUE on success, FALSE on failure
  607. *
  608. * Setter for "SerialNumber" property.
  609. */
  610. dbus_bool_t wpas_dbus_setter_wps_device_serial_number(
  611. const struct wpa_dbus_property_desc *property_desc,
  612. DBusMessageIter *iter, DBusError *error, void *user_data)
  613. {
  614. struct wpa_supplicant *wpa_s = user_data;
  615. char *methods, *serial_number;
  616. if (!wpas_dbus_simple_property_setter(iter, error, DBUS_TYPE_STRING,
  617. &methods))
  618. return FALSE;
  619. if (os_strlen(methods) > WPS_SERIAL_NUMBER_MAX_LEN)
  620. return FALSE;
  621. serial_number = os_strdup(methods);
  622. if (!serial_number)
  623. return FALSE;
  624. os_free(wpa_s->conf->serial_number);
  625. wpa_s->conf->serial_number = serial_number;
  626. wpa_s->conf->changed_parameters |= CFG_CHANGED_WPS_STRING;
  627. wpa_supplicant_update_config(wpa_s);
  628. return TRUE;
  629. }
  630. /**
  631. * wpas_dbus_getter_wps_device_device_type - Get current device type
  632. * @iter: Pointer to incoming dbus message iter
  633. * @error: Location to store error on failure
  634. * @user_data: Function specific data
  635. * Returns: TRUE on success, FALSE on failure
  636. *
  637. * Getter for "DeviceType" property.
  638. */
  639. dbus_bool_t wpas_dbus_getter_wps_device_device_type(
  640. const struct wpa_dbus_property_desc *property_desc,
  641. DBusMessageIter *iter, DBusError *error, void *user_data)
  642. {
  643. struct wpa_supplicant *wpa_s = user_data;
  644. if (!wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
  645. (char *)
  646. wpa_s->conf->device_type,
  647. WPS_DEV_TYPE_LEN, error)) {
  648. dbus_set_error(error, DBUS_ERROR_FAILED,
  649. "%s: error constructing reply", __func__);
  650. return FALSE;
  651. }
  652. return TRUE;
  653. }
  654. /**
  655. * wpas_dbus_setter_wps_device_device_type - Set current device type
  656. * @iter: Pointer to incoming dbus message iter
  657. * @error: Location to store error on failure
  658. * @user_data: Function specific data
  659. * Returns: TRUE on success, FALSE on failure
  660. *
  661. * Setter for "DeviceType" property.
  662. */
  663. dbus_bool_t wpas_dbus_setter_wps_device_device_type(
  664. const struct wpa_dbus_property_desc *property_desc,
  665. DBusMessageIter *iter, DBusError *error, void *user_data)
  666. {
  667. struct wpa_supplicant *wpa_s = user_data;
  668. u8 *dev_type;
  669. int dev_len;
  670. DBusMessageIter variant, array_iter;
  671. if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_VARIANT)
  672. return FALSE;
  673. dbus_message_iter_recurse(iter, &variant);
  674. if (dbus_message_iter_get_arg_type(&variant) != DBUS_TYPE_ARRAY)
  675. return FALSE;
  676. dbus_message_iter_recurse(&variant, &array_iter);
  677. dbus_message_iter_get_fixed_array(&array_iter, &dev_type, &dev_len);
  678. if (dev_len != WPS_DEV_TYPE_LEN)
  679. return FALSE;
  680. os_memcpy(wpa_s->conf->device_type, dev_type, WPS_DEV_TYPE_LEN);
  681. wpa_s->conf->changed_parameters |= CFG_CHANGED_DEVICE_TYPE;
  682. wpa_supplicant_update_config(wpa_s);
  683. return TRUE;
  684. }