Home | History | Annotate | Download | only in dbus
      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