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