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