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"))
     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(message,
     50 					      WPAS_ERROR_WPS_PBC_ERROR,
     51 					      "Could not start PBC "
     52 					      "negotiation");
     53 	}
     54 
     55 	return wpas_dbus_new_success_reply(message);
     56 }
     57 
     58 
     59 /**
     60  * wpas_dbus_iface_wps_pin - Establish the PIN number of the enrollee
     61  * @message: Pointer to incoming dbus message
     62  * @wpa_s: %wpa_supplicant data structure
     63  * Returns: A dbus message containing a UINT32 indicating success (1) or
     64  *          failure (0)
     65  *
     66  * Handler function for "wpsPin" method call
     67  */
     68 DBusMessage * wpas_dbus_iface_wps_pin(DBusMessage *message,
     69 				      struct wpa_supplicant *wpa_s)
     70 {
     71 	DBusMessage *reply = NULL;
     72 	char *arg_bssid;
     73 	char *pin = NULL;
     74 	u8 bssid[ETH_ALEN], *_bssid = NULL;
     75 	int ret = 0;
     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"))
     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 		dbus_message_append_args(reply, DBUS_TYPE_STRING, &pin,
    109 					 DBUS_TYPE_INVALID);
    110 	} else {
    111 		char npin[9];
    112 		os_snprintf(npin, sizeof(npin), "%08d", ret);
    113 		dbus_message_append_args(reply, DBUS_TYPE_STRING, &npin,
    114 					 DBUS_TYPE_INVALID);
    115 	}
    116 	return reply;
    117 }
    118 
    119 
    120 /**
    121  * wpas_dbus_iface_wps_reg - Request credentials using the PIN of the AP
    122  * @message: Pointer to incoming dbus message
    123  * @wpa_s: %wpa_supplicant data structure
    124  * Returns: A dbus message containing a UINT32 indicating success (1) or
    125  *          failure (0)
    126  *
    127  * Handler function for "wpsReg" method call
    128  */
    129 DBusMessage * wpas_dbus_iface_wps_reg(DBusMessage *message,
    130 				      struct wpa_supplicant *wpa_s)
    131 {
    132 	char *arg_bssid;
    133 	char *pin = NULL;
    134 	u8 bssid[ETH_ALEN];
    135 	int ret = 0;
    136 
    137 	if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg_bssid,
    138 				   DBUS_TYPE_STRING, &pin, DBUS_TYPE_INVALID))
    139 		return wpas_dbus_new_invalid_opts_error(message, NULL);
    140 
    141 	if (!os_strcmp(arg_bssid, "any"))
    142 		ret = wpas_wps_start_reg(wpa_s, NULL, pin, NULL);
    143 	else if (!hwaddr_aton(arg_bssid, bssid))
    144 		ret = wpas_wps_start_reg(wpa_s, bssid, pin, NULL);
    145 	else {
    146 		return wpas_dbus_new_invalid_opts_error(message,
    147 							"Invalid BSSID");
    148 	}
    149 
    150 	if (ret < 0) {
    151 		return dbus_message_new_error(message,
    152 					      WPAS_ERROR_WPS_PBC_ERROR,
    153 					      "Could not request credentials");
    154 	}
    155 
    156 	return wpas_dbus_new_success_reply(message);
    157 }
    158