2099fed400
This verifies that Certification signals include the expected information on peer certificates and that dNSName constraint can be configured based on that and is working both in matching and not matching cases. Signed-off-by: Jouni Malinen <j@w1.fi>
4172 lines
171 KiB
Python
4172 lines
171 KiB
Python
# wpa_supplicant D-Bus interface tests
|
|
# Copyright (c) 2014-2015, Jouni Malinen <j@w1.fi>
|
|
#
|
|
# This software may be distributed under the terms of the BSD license.
|
|
# See README for more details.
|
|
|
|
import binascii
|
|
import gobject
|
|
import logging
|
|
logger = logging.getLogger()
|
|
import subprocess
|
|
import time
|
|
|
|
try:
|
|
import dbus
|
|
dbus_imported = True
|
|
except ImportError:
|
|
dbus_imported = False
|
|
|
|
import hostapd
|
|
from wpasupplicant import WpaSupplicant
|
|
from utils import HwsimSkip, alloc_fail
|
|
from test_ap_tdls import connect_2sta_open
|
|
|
|
WPAS_DBUS_SERVICE = "fi.w1.wpa_supplicant1"
|
|
WPAS_DBUS_PATH = "/fi/w1/wpa_supplicant1"
|
|
WPAS_DBUS_IFACE = "fi.w1.wpa_supplicant1.Interface"
|
|
WPAS_DBUS_IFACE_WPS = WPAS_DBUS_IFACE + ".WPS"
|
|
WPAS_DBUS_NETWORK = "fi.w1.wpa_supplicant1.Network"
|
|
WPAS_DBUS_BSS = "fi.w1.wpa_supplicant1.BSS"
|
|
WPAS_DBUS_IFACE_P2PDEVICE = WPAS_DBUS_IFACE + ".P2PDevice"
|
|
WPAS_DBUS_P2P_PEER = "fi.w1.wpa_supplicant1.Peer"
|
|
WPAS_DBUS_GROUP = "fi.w1.wpa_supplicant1.Group"
|
|
WPAS_DBUS_PERSISTENT_GROUP = "fi.w1.wpa_supplicant1.PersistentGroup"
|
|
|
|
def prepare_dbus(dev):
|
|
if not dbus_imported:
|
|
logger.info("No dbus module available")
|
|
raise HwsimSkip("No dbus module available")
|
|
try:
|
|
from dbus.mainloop.glib import DBusGMainLoop
|
|
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
|
|
bus = dbus.SystemBus()
|
|
wpas_obj = bus.get_object(WPAS_DBUS_SERVICE, WPAS_DBUS_PATH)
|
|
wpas = dbus.Interface(wpas_obj, WPAS_DBUS_SERVICE)
|
|
path = wpas.GetInterface(dev.ifname)
|
|
if_obj = bus.get_object(WPAS_DBUS_SERVICE, path)
|
|
return (bus,wpas_obj,path,if_obj)
|
|
except Exception, e:
|
|
raise HwsimSkip("Could not connect to D-Bus: %s" % e)
|
|
|
|
class TestDbus(object):
|
|
def __init__(self, bus):
|
|
self.loop = gobject.MainLoop()
|
|
self.signals = []
|
|
self.bus = bus
|
|
|
|
def __exit__(self, type, value, traceback):
|
|
for s in self.signals:
|
|
s.remove()
|
|
|
|
def add_signal(self, handler, interface, name, byte_arrays=False):
|
|
s = self.bus.add_signal_receiver(handler, dbus_interface=interface,
|
|
signal_name=name,
|
|
byte_arrays=byte_arrays)
|
|
self.signals.append(s)
|
|
|
|
def timeout(self, *args):
|
|
logger.debug("timeout")
|
|
self.loop.quit()
|
|
return False
|
|
|
|
class alloc_fail_dbus(object):
|
|
def __init__(self, dev, count, funcs, operation="Operation",
|
|
expected="NoMemory"):
|
|
self._dev = dev
|
|
self._count = count
|
|
self._funcs = funcs
|
|
self._operation = operation
|
|
self._expected = expected
|
|
def __enter__(self):
|
|
cmd = "TEST_ALLOC_FAIL %d:%s" % (self._count, self._funcs)
|
|
if "OK" not in self._dev.request(cmd):
|
|
raise HwsimSkip("TEST_ALLOC_FAIL not supported")
|
|
def __exit__(self, type, value, traceback):
|
|
if type is None:
|
|
raise Exception("%s succeeded during out-of-memory" % self._operation)
|
|
if type == dbus.exceptions.DBusException and self._expected in str(value):
|
|
return True
|
|
if self._dev.request("GET_ALLOC_FAIL") != "0:%s" % self._funcs:
|
|
raise Exception("%s did not trigger allocation failure" % self._operation)
|
|
return False
|
|
|
|
def start_ap(ap):
|
|
ssid = "test-wps"
|
|
params = { "ssid": ssid, "eap_server": "1", "wps_state": "2",
|
|
"wpa_passphrase": "12345678", "wpa": "2",
|
|
"wpa_key_mgmt": "WPA-PSK", "rsn_pairwise": "CCMP",
|
|
"ap_pin": "12345670"}
|
|
return hostapd.add_ap(ap['ifname'], params)
|
|
|
|
def test_dbus_getall(dev, apdev):
|
|
"""D-Bus GetAll"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
|
|
props = wpas_obj.GetAll(WPAS_DBUS_SERVICE,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
logger.debug("GetAll(fi.w1.wpa.supplicant1, /fi/w1/wpa_supplicant1) ==> " + str(props))
|
|
|
|
props = if_obj.GetAll(WPAS_DBUS_IFACE,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
logger.debug("GetAll(%s, %s): %s" % (WPAS_DBUS_IFACE, path, str(props)))
|
|
|
|
props = if_obj.GetAll(WPAS_DBUS_IFACE_WPS,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
logger.debug("GetAll(%s, %s): %s" % (WPAS_DBUS_IFACE_WPS, path, str(props)))
|
|
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, 'BSSs',
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if len(res) != 0:
|
|
raise Exception("Unexpected BSSs entry: " + str(res))
|
|
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, 'Networks',
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if len(res) != 0:
|
|
raise Exception("Unexpected Networks entry: " + str(res))
|
|
|
|
hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "open" })
|
|
bssid = apdev[0]['bssid']
|
|
dev[0].scan_for_bss(bssid, freq=2412)
|
|
id = dev[0].add_network()
|
|
dev[0].set_network(id, "disabled", "0")
|
|
dev[0].set_network_quoted(id, "ssid", "test")
|
|
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, 'BSSs',
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if len(res) != 1:
|
|
raise Exception("Missing BSSs entry: " + str(res))
|
|
bss_obj = bus.get_object(WPAS_DBUS_SERVICE, res[0])
|
|
props = bss_obj.GetAll(WPAS_DBUS_BSS, dbus_interface=dbus.PROPERTIES_IFACE)
|
|
logger.debug("GetAll(%s, %s): %s" % (WPAS_DBUS_BSS, res[0], str(props)))
|
|
bssid_str = ''
|
|
for item in props['BSSID']:
|
|
if len(bssid_str) > 0:
|
|
bssid_str += ':'
|
|
bssid_str += '%02x' % item
|
|
if bssid_str != bssid:
|
|
raise Exception("Unexpected BSSID in BSSs entry")
|
|
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, 'Networks',
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if len(res) != 1:
|
|
raise Exception("Missing Networks entry: " + str(res))
|
|
net_obj = bus.get_object(WPAS_DBUS_SERVICE, res[0])
|
|
props = net_obj.GetAll(WPAS_DBUS_NETWORK,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
logger.debug("GetAll(%s, %s): %s" % (WPAS_DBUS_NETWORK, res[0], str(props)))
|
|
ssid = props['Properties']['ssid']
|
|
if ssid != '"test"':
|
|
raise Exception("Unexpected SSID in network entry")
|
|
|
|
def dbus_get(dbus, wpas_obj, prop, expect=None, byte_arrays=False):
|
|
val = wpas_obj.Get(WPAS_DBUS_SERVICE, prop,
|
|
dbus_interface=dbus.PROPERTIES_IFACE,
|
|
byte_arrays=byte_arrays)
|
|
if expect is not None and val != expect:
|
|
raise Exception("Unexpected %s: %s (expected: %s)" %
|
|
(prop, str(val), str(expect)))
|
|
return val
|
|
|
|
def dbus_set(dbus, wpas_obj, prop, val):
|
|
wpas_obj.Set(WPAS_DBUS_SERVICE, prop, val,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
|
|
def test_dbus_properties(dev, apdev):
|
|
"""D-Bus Get/Set fi.w1.wpa_supplicant1 properties"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
|
|
dbus_get(dbus, wpas_obj, "DebugLevel", expect="msgdump")
|
|
dbus_set(dbus, wpas_obj, "DebugLevel", "debug")
|
|
dbus_get(dbus, wpas_obj, "DebugLevel", expect="debug")
|
|
for (val,err) in [ (3, "Error.Failed: wrong property type"),
|
|
("foo", "Error.Failed: wrong debug level value") ]:
|
|
try:
|
|
dbus_set(dbus, wpas_obj, "DebugLevel", val)
|
|
raise Exception("Invalid DebugLevel value accepted: " + str(val))
|
|
except dbus.exceptions.DBusException, e:
|
|
if err not in str(e):
|
|
raise Exception("Unexpected error message: " + str(e))
|
|
dbus_set(dbus, wpas_obj, "DebugLevel", "msgdump")
|
|
dbus_get(dbus, wpas_obj, "DebugLevel", expect="msgdump")
|
|
|
|
dbus_get(dbus, wpas_obj, "DebugTimestamp", expect=True)
|
|
dbus_set(dbus, wpas_obj, "DebugTimestamp", False)
|
|
dbus_get(dbus, wpas_obj, "DebugTimestamp", expect=False)
|
|
try:
|
|
dbus_set(dbus, wpas_obj, "DebugTimestamp", "foo")
|
|
raise Exception("Invalid DebugTimestamp value accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: wrong property type" not in str(e):
|
|
raise Exception("Unexpected error message: " + str(e))
|
|
dbus_set(dbus, wpas_obj, "DebugTimestamp", True)
|
|
dbus_get(dbus, wpas_obj, "DebugTimestamp", expect=True)
|
|
|
|
dbus_get(dbus, wpas_obj, "DebugShowKeys", expect=True)
|
|
dbus_set(dbus, wpas_obj, "DebugShowKeys", False)
|
|
dbus_get(dbus, wpas_obj, "DebugShowKeys", expect=False)
|
|
try:
|
|
dbus_set(dbus, wpas_obj, "DebugShowKeys", "foo")
|
|
raise Exception("Invalid DebugShowKeys value accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: wrong property type" not in str(e):
|
|
raise Exception("Unexpected error message: " + str(e))
|
|
dbus_set(dbus, wpas_obj, "DebugShowKeys", True)
|
|
dbus_get(dbus, wpas_obj, "DebugShowKeys", expect=True)
|
|
|
|
res = dbus_get(dbus, wpas_obj, "Interfaces")
|
|
if len(res) != 1:
|
|
raise Exception("Unexpected Interfaces value: " + str(res))
|
|
|
|
res = dbus_get(dbus, wpas_obj, "EapMethods")
|
|
if len(res) < 5 or "TTLS" not in res:
|
|
raise Exception("Unexpected EapMethods value: " + str(res))
|
|
|
|
res = dbus_get(dbus, wpas_obj, "Capabilities")
|
|
if len(res) < 2 or "p2p" not in res:
|
|
raise Exception("Unexpected Capabilities value: " + str(res))
|
|
|
|
dbus_get(dbus, wpas_obj, "WFDIEs", byte_arrays=True)
|
|
val = binascii.unhexlify("010006020304050608")
|
|
dbus_set(dbus, wpas_obj, "WFDIEs", dbus.ByteArray(val))
|
|
res = dbus_get(dbus, wpas_obj, "WFDIEs", byte_arrays=True)
|
|
if val != res:
|
|
raise Exception("WFDIEs value changed")
|
|
try:
|
|
dbus_set(dbus, wpas_obj, "WFDIEs", dbus.ByteArray('\x00'))
|
|
raise Exception("Invalid WFDIEs value accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message: " + str(e))
|
|
dbus_set(dbus, wpas_obj, "WFDIEs", dbus.ByteArray(''))
|
|
dbus_set(dbus, wpas_obj, "WFDIEs", dbus.ByteArray(val))
|
|
dbus_set(dbus, wpas_obj, "WFDIEs", dbus.ByteArray(''))
|
|
res = dbus_get(dbus, wpas_obj, "WFDIEs", byte_arrays=True)
|
|
if len(res) != 0:
|
|
raise Exception("WFDIEs not cleared properly")
|
|
|
|
res = dbus_get(dbus, wpas_obj, "EapMethods")
|
|
try:
|
|
dbus_set(dbus, wpas_obj, "EapMethods", res)
|
|
raise Exception("Invalid Set accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs: Property is read-only" not in str(e):
|
|
raise Exception("Unexpected error message: " + str(e))
|
|
|
|
try:
|
|
wpas_obj.SetFoo(WPAS_DBUS_SERVICE, "DebugShowKeys", True,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Unknown method accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "UnknownMethod" not in str(e):
|
|
raise Exception("Unexpected error message: " + str(e))
|
|
|
|
try:
|
|
wpas_obj.Get("foo", "DebugShowKeys",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Get accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs: No such property" not in str(e):
|
|
raise Exception("Unexpected error message: " + str(e))
|
|
|
|
test_obj = bus.get_object(WPAS_DBUS_SERVICE, WPAS_DBUS_PATH,
|
|
introspect=False)
|
|
try:
|
|
test_obj.Get(123, "DebugShowKeys",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Get accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs: Invalid arguments" not in str(e):
|
|
raise Exception("Unexpected error message: " + str(e))
|
|
try:
|
|
test_obj.Get(WPAS_DBUS_SERVICE, 123,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Get accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs: Invalid arguments" not in str(e):
|
|
raise Exception("Unexpected error message: " + str(e))
|
|
|
|
try:
|
|
wpas_obj.Set(WPAS_DBUS_SERVICE, "WFDIEs",
|
|
dbus.ByteArray('', variant_level=2),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Set accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs: invalid message format" not in str(e):
|
|
raise Exception("Unexpected error message: " + str(e))
|
|
|
|
def test_dbus_invalid_method(dev, apdev):
|
|
"""D-Bus invalid method"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
wps = dbus.Interface(if_obj, WPAS_DBUS_IFACE_WPS)
|
|
|
|
try:
|
|
wps.Foo()
|
|
raise Exception("Unknown method accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "UnknownMethod" not in str(e):
|
|
raise Exception("Unexpected error message: " + str(e))
|
|
|
|
test_obj = bus.get_object(WPAS_DBUS_SERVICE, path, introspect=False)
|
|
test_wps = dbus.Interface(test_obj, WPAS_DBUS_IFACE_WPS)
|
|
try:
|
|
test_wps.Start(123)
|
|
raise Exception("WPS.Start with incorrect signature accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs: Invalid arg" not in str(e):
|
|
raise Exception("Unexpected error message: " + str(e))
|
|
|
|
def test_dbus_get_set_wps(dev, apdev):
|
|
"""D-Bus Get/Set for WPS properties"""
|
|
try:
|
|
_test_dbus_get_set_wps(dev, apdev)
|
|
finally:
|
|
dev[0].request("SET wps_cred_processing 0")
|
|
dev[0].request("SET config_methods display keypad virtual_display nfc_interface")
|
|
|
|
def _test_dbus_get_set_wps(dev, apdev):
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
|
|
if_obj.Get(WPAS_DBUS_IFACE_WPS, "ConfigMethods",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
|
|
val = "display keypad virtual_display nfc_interface"
|
|
dev[0].request("SET config_methods " + val)
|
|
|
|
config = if_obj.Get(WPAS_DBUS_IFACE_WPS, "ConfigMethods",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if config != val:
|
|
raise Exception("Unexpected Get(ConfigMethods) result: " + config)
|
|
|
|
val2 = "push_button display"
|
|
if_obj.Set(WPAS_DBUS_IFACE_WPS, "ConfigMethods", val2,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
config = if_obj.Get(WPAS_DBUS_IFACE_WPS, "ConfigMethods",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if config != val2:
|
|
raise Exception("Unexpected Get(ConfigMethods) result after Set: " + config)
|
|
|
|
dev[0].request("SET config_methods " + val)
|
|
|
|
for i in range(3):
|
|
dev[0].request("SET wps_cred_processing " + str(i))
|
|
val = if_obj.Get(WPAS_DBUS_IFACE_WPS, "ProcessCredentials",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
expected_val = False if i == 1 else True
|
|
if val != expected_val:
|
|
raise Exception("Unexpected Get(ProcessCredentials) result({}): {}".format(i, val))
|
|
|
|
class TestDbusGetSet(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.signal_received = False
|
|
self.signal_received_deprecated = False
|
|
self.sets_done = False
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_sets)
|
|
gobject.timeout_add(1000, self.timeout)
|
|
self.add_signal(self.propertiesChanged, WPAS_DBUS_IFACE_WPS,
|
|
"PropertiesChanged")
|
|
self.add_signal(self.propertiesChanged2, dbus.PROPERTIES_IFACE,
|
|
"PropertiesChanged")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def propertiesChanged(self, properties):
|
|
logger.debug("PropertiesChanged: " + str(properties))
|
|
if properties.has_key("ProcessCredentials"):
|
|
self.signal_received_deprecated = True
|
|
if self.sets_done and self.signal_received:
|
|
self.loop.quit()
|
|
|
|
def propertiesChanged2(self, interface_name, changed_properties,
|
|
invalidated_properties):
|
|
logger.debug("propertiesChanged2: interface_name=%s changed_properties=%s invalidated_properties=%s" % (interface_name, str(changed_properties), str(invalidated_properties)))
|
|
if interface_name != WPAS_DBUS_IFACE_WPS:
|
|
return
|
|
if changed_properties.has_key("ProcessCredentials"):
|
|
self.signal_received = True
|
|
if self.sets_done and self.signal_received_deprecated:
|
|
self.loop.quit()
|
|
|
|
def run_sets(self, *args):
|
|
logger.debug("run_sets")
|
|
if_obj.Set(WPAS_DBUS_IFACE_WPS, "ProcessCredentials",
|
|
dbus.Boolean(1),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if if_obj.Get(WPAS_DBUS_IFACE_WPS, "ProcessCredentials",
|
|
dbus_interface=dbus.PROPERTIES_IFACE) != True:
|
|
raise Exception("Unexpected Get(ProcessCredentials) result after Set");
|
|
if_obj.Set(WPAS_DBUS_IFACE_WPS, "ProcessCredentials",
|
|
dbus.Boolean(0),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if if_obj.Get(WPAS_DBUS_IFACE_WPS, "ProcessCredentials",
|
|
dbus_interface=dbus.PROPERTIES_IFACE) != False:
|
|
raise Exception("Unexpected Get(ProcessCredentials) result after Set");
|
|
|
|
self.dbus_sets_done = True
|
|
return False
|
|
|
|
def success(self):
|
|
return self.signal_received and self.signal_received_deprecated
|
|
|
|
with TestDbusGetSet(bus) as t:
|
|
if not t.success():
|
|
raise Exception("No signal received for ProcessCredentials change")
|
|
|
|
def test_dbus_wps_invalid(dev, apdev):
|
|
"""D-Bus invaldi WPS operation"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
wps = dbus.Interface(if_obj, WPAS_DBUS_IFACE_WPS)
|
|
|
|
failures = [ {'Role': 'foo', 'Type': 'pbc'},
|
|
{'Role': 123, 'Type': 'pbc'},
|
|
{'Type': 'pbc'},
|
|
{'Role': 'enrollee'},
|
|
{'Role': 'registrar'},
|
|
{'Role': 'enrollee', 'Type': 123},
|
|
{'Role': 'enrollee', 'Type': 'foo'},
|
|
{'Role': 'enrollee', 'Type': 'pbc',
|
|
'Bssid': '02:33:44:55:66:77'},
|
|
{'Role': 'enrollee', 'Type': 'pin', 'Pin': 123},
|
|
{'Role': 'enrollee', 'Type': 'pbc',
|
|
'Bssid': dbus.ByteArray('12345')},
|
|
{'Role': 'enrollee', 'Type': 'pbc',
|
|
'P2PDeviceAddress': 12345},
|
|
{'Role': 'enrollee', 'Type': 'pbc',
|
|
'P2PDeviceAddress': dbus.ByteArray('12345')},
|
|
{'Role': 'enrollee', 'Type': 'pbc', 'Foo': 'bar'} ]
|
|
for args in failures:
|
|
try:
|
|
wps.Start(args)
|
|
raise Exception("Invalid WPS.Start() arguments accepted: " + str(args))
|
|
except dbus.exceptions.DBusException, e:
|
|
if not str(e).startswith("fi.w1.wpa_supplicant1.InvalidArgs"):
|
|
raise Exception("Unexpected error message: " + str(e))
|
|
|
|
def test_dbus_wps_oom(dev, apdev):
|
|
"""D-Bus WPS operation (OOM)"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
wps = dbus.Interface(if_obj, WPAS_DBUS_IFACE_WPS)
|
|
|
|
with alloc_fail_dbus(dev[0], 1, "=wpas_dbus_getter_state", "Get"):
|
|
if_obj.Get(WPAS_DBUS_IFACE, "State",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
|
|
hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "open" })
|
|
bssid = apdev[0]['bssid']
|
|
dev[0].scan_for_bss(bssid, freq=2412)
|
|
|
|
for i in range(1, 3):
|
|
with alloc_fail_dbus(dev[0], i, "=wpas_dbus_getter_bsss", "Get"):
|
|
if_obj.Get(WPAS_DBUS_IFACE, "BSSs",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, 'BSSs',
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
bss_obj = bus.get_object(WPAS_DBUS_SERVICE, res[0])
|
|
with alloc_fail_dbus(dev[0], 1, "=wpas_dbus_getter_bss_rates", "Get"):
|
|
bss_obj.Get(WPAS_DBUS_BSS, "Rates",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
|
|
id = dev[0].add_network()
|
|
dev[0].set_network(id, "disabled", "0")
|
|
dev[0].set_network_quoted(id, "ssid", "test")
|
|
|
|
for i in range(1, 3):
|
|
with alloc_fail_dbus(dev[0], i, "=wpas_dbus_getter_networks", "Get"):
|
|
if_obj.Get(WPAS_DBUS_IFACE, "Networks",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
|
|
with alloc_fail_dbus(dev[0], 1, "wpas_dbus_getter_interfaces", "Get"):
|
|
dbus_get(dbus, wpas_obj, "Interfaces")
|
|
|
|
for i in range(1, 6):
|
|
with alloc_fail_dbus(dev[0], i, "=eap_get_names_as_string_array;wpas_dbus_getter_eap_methods", "Get"):
|
|
dbus_get(dbus, wpas_obj, "EapMethods")
|
|
|
|
with alloc_fail_dbus(dev[0], 1, "wpas_dbus_setter_config_methods", "Set",
|
|
expected="Error.Failed: Failed to set property"):
|
|
val2 = "push_button display"
|
|
if_obj.Set(WPAS_DBUS_IFACE_WPS, "ConfigMethods", val2,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
|
|
with alloc_fail_dbus(dev[0], 1, "=wpa_config_add_network;wpas_dbus_handler_wps_start",
|
|
"WPS.Start",
|
|
expected="UnknownError: WPS start failed"):
|
|
wps.Start({'Role': 'enrollee', 'Type': 'pin', 'Pin': '12345670'})
|
|
|
|
def test_dbus_wps_pbc(dev, apdev):
|
|
"""D-Bus WPS/PBC operation and signals"""
|
|
try:
|
|
_test_dbus_wps_pbc(dev, apdev)
|
|
finally:
|
|
dev[0].request("SET wps_cred_processing 0")
|
|
|
|
def _test_dbus_wps_pbc(dev, apdev):
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
wps = dbus.Interface(if_obj, WPAS_DBUS_IFACE_WPS)
|
|
|
|
hapd = start_ap(apdev[0])
|
|
hapd.request("WPS_PBC")
|
|
bssid = apdev[0]['bssid']
|
|
dev[0].scan_for_bss(bssid, freq="2412")
|
|
dev[0].request("SET wps_cred_processing 2")
|
|
|
|
class TestDbusWps(TestDbus):
|
|
def __init__(self, bus, wps):
|
|
TestDbus.__init__(self, bus)
|
|
self.success_seen = False
|
|
self.credentials_received = False
|
|
self.wps = wps
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.start_pbc)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.wpsEvent, WPAS_DBUS_IFACE_WPS, "Event")
|
|
self.add_signal(self.credentials, WPAS_DBUS_IFACE_WPS,
|
|
"Credentials")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def wpsEvent(self, name, args):
|
|
logger.debug("wpsEvent: %s args='%s'" % (name, str(args)))
|
|
if name == "success":
|
|
self.success_seen = True
|
|
if self.credentials_received:
|
|
self.loop.quit()
|
|
|
|
def credentials(self, args):
|
|
logger.debug("credentials: " + str(args))
|
|
self.credentials_received = True
|
|
if self.success_seen:
|
|
self.loop.quit()
|
|
|
|
def start_pbc(self, *args):
|
|
logger.debug("start_pbc")
|
|
self.wps.Start({'Role': 'enrollee', 'Type': 'pbc'})
|
|
return False
|
|
|
|
def success(self):
|
|
return self.success_seen and self.credentials_received
|
|
|
|
with TestDbusWps(bus, wps) as t:
|
|
if not t.success():
|
|
raise Exception("Failure in D-Bus operations")
|
|
|
|
dev[0].wait_connected(timeout=10)
|
|
dev[0].request("DISCONNECT")
|
|
hapd.disable()
|
|
dev[0].flush_scan_cache()
|
|
|
|
def test_dbus_wps_pin(dev, apdev):
|
|
"""D-Bus WPS/PIN operation and signals"""
|
|
try:
|
|
_test_dbus_wps_pin(dev, apdev)
|
|
finally:
|
|
dev[0].request("SET wps_cred_processing 0")
|
|
|
|
def _test_dbus_wps_pin(dev, apdev):
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
wps = dbus.Interface(if_obj, WPAS_DBUS_IFACE_WPS)
|
|
|
|
hapd = start_ap(apdev[0])
|
|
hapd.request("WPS_PIN any 12345670")
|
|
bssid = apdev[0]['bssid']
|
|
dev[0].scan_for_bss(bssid, freq="2412")
|
|
dev[0].request("SET wps_cred_processing 2")
|
|
|
|
class TestDbusWps(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.success_seen = False
|
|
self.credentials_received = False
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.start_pin)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.wpsEvent, WPAS_DBUS_IFACE_WPS, "Event")
|
|
self.add_signal(self.credentials, WPAS_DBUS_IFACE_WPS,
|
|
"Credentials")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def wpsEvent(self, name, args):
|
|
logger.debug("wpsEvent: %s args='%s'" % (name, str(args)))
|
|
if name == "success":
|
|
self.success_seen = True
|
|
if self.credentials_received:
|
|
self.loop.quit()
|
|
|
|
def credentials(self, args):
|
|
logger.debug("credentials: " + str(args))
|
|
self.credentials_received = True
|
|
if self.success_seen:
|
|
self.loop.quit()
|
|
|
|
def start_pin(self, *args):
|
|
logger.debug("start_pin")
|
|
bssid_ay = dbus.ByteArray(bssid.replace(':','').decode('hex'))
|
|
wps.Start({'Role': 'enrollee', 'Type': 'pin', 'Pin': '12345670',
|
|
'Bssid': bssid_ay})
|
|
return False
|
|
|
|
def success(self):
|
|
return self.success_seen and self.credentials_received
|
|
|
|
with TestDbusWps(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Failure in D-Bus operations")
|
|
|
|
dev[0].wait_connected(timeout=10)
|
|
|
|
def test_dbus_wps_pin2(dev, apdev):
|
|
"""D-Bus WPS/PIN operation and signals (PIN from wpa_supplicant)"""
|
|
try:
|
|
_test_dbus_wps_pin2(dev, apdev)
|
|
finally:
|
|
dev[0].request("SET wps_cred_processing 0")
|
|
|
|
def _test_dbus_wps_pin2(dev, apdev):
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
wps = dbus.Interface(if_obj, WPAS_DBUS_IFACE_WPS)
|
|
|
|
hapd = start_ap(apdev[0])
|
|
bssid = apdev[0]['bssid']
|
|
dev[0].scan_for_bss(bssid, freq="2412")
|
|
dev[0].request("SET wps_cred_processing 2")
|
|
|
|
class TestDbusWps(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.success_seen = False
|
|
self.failed = False
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.start_pin)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.wpsEvent, WPAS_DBUS_IFACE_WPS, "Event")
|
|
self.add_signal(self.credentials, WPAS_DBUS_IFACE_WPS,
|
|
"Credentials")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def wpsEvent(self, name, args):
|
|
logger.debug("wpsEvent: %s args='%s'" % (name, str(args)))
|
|
if name == "success":
|
|
self.success_seen = True
|
|
if self.credentials_received:
|
|
self.loop.quit()
|
|
|
|
def credentials(self, args):
|
|
logger.debug("credentials: " + str(args))
|
|
self.credentials_received = True
|
|
if self.success_seen:
|
|
self.loop.quit()
|
|
|
|
def start_pin(self, *args):
|
|
logger.debug("start_pin")
|
|
bssid_ay = dbus.ByteArray(bssid.replace(':','').decode('hex'))
|
|
res = wps.Start({'Role': 'enrollee', 'Type': 'pin',
|
|
'Bssid': bssid_ay})
|
|
pin = res['Pin']
|
|
h = hostapd.Hostapd(apdev[0]['ifname'])
|
|
h.request("WPS_PIN any " + pin)
|
|
return False
|
|
|
|
def success(self):
|
|
return self.success_seen and self.credentials_received
|
|
|
|
with TestDbusWps(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Failure in D-Bus operations")
|
|
|
|
dev[0].wait_connected(timeout=10)
|
|
|
|
def test_dbus_wps_pin_m2d(dev, apdev):
|
|
"""D-Bus WPS/PIN operation and signals with M2D"""
|
|
try:
|
|
_test_dbus_wps_pin_m2d(dev, apdev)
|
|
finally:
|
|
dev[0].request("SET wps_cred_processing 0")
|
|
|
|
def _test_dbus_wps_pin_m2d(dev, apdev):
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
wps = dbus.Interface(if_obj, WPAS_DBUS_IFACE_WPS)
|
|
|
|
hapd = start_ap(apdev[0])
|
|
bssid = apdev[0]['bssid']
|
|
dev[0].scan_for_bss(bssid, freq="2412")
|
|
dev[0].request("SET wps_cred_processing 2")
|
|
|
|
class TestDbusWps(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.success_seen = False
|
|
self.credentials_received = False
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.start_pin)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.wpsEvent, WPAS_DBUS_IFACE_WPS, "Event")
|
|
self.add_signal(self.credentials, WPAS_DBUS_IFACE_WPS,
|
|
"Credentials")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def wpsEvent(self, name, args):
|
|
logger.debug("wpsEvent: %s args='%s'" % (name, str(args)))
|
|
if name == "success":
|
|
self.success_seen = True
|
|
if self.credentials_received:
|
|
self.loop.quit()
|
|
elif name == "m2d":
|
|
h = hostapd.Hostapd(apdev[0]['ifname'])
|
|
h.request("WPS_PIN any 12345670")
|
|
|
|
def credentials(self, args):
|
|
logger.debug("credentials: " + str(args))
|
|
self.credentials_received = True
|
|
if self.success_seen:
|
|
self.loop.quit()
|
|
|
|
def start_pin(self, *args):
|
|
logger.debug("start_pin")
|
|
bssid_ay = dbus.ByteArray(bssid.replace(':','').decode('hex'))
|
|
wps.Start({'Role': 'enrollee', 'Type': 'pin', 'Pin': '12345670',
|
|
'Bssid': bssid_ay})
|
|
return False
|
|
|
|
def success(self):
|
|
return self.success_seen and self.credentials_received
|
|
|
|
with TestDbusWps(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Failure in D-Bus operations")
|
|
|
|
dev[0].wait_connected(timeout=10)
|
|
|
|
def test_dbus_wps_reg(dev, apdev):
|
|
"""D-Bus WPS/Registrar operation and signals"""
|
|
try:
|
|
_test_dbus_wps_reg(dev, apdev)
|
|
finally:
|
|
dev[0].request("SET wps_cred_processing 0")
|
|
|
|
def _test_dbus_wps_reg(dev, apdev):
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
wps = dbus.Interface(if_obj, WPAS_DBUS_IFACE_WPS)
|
|
|
|
hapd = start_ap(apdev[0])
|
|
hapd.request("WPS_PIN any 12345670")
|
|
bssid = apdev[0]['bssid']
|
|
dev[0].scan_for_bss(bssid, freq="2412")
|
|
dev[0].request("SET wps_cred_processing 2")
|
|
|
|
class TestDbusWps(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.credentials_received = False
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(100, self.start_reg)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.wpsEvent, WPAS_DBUS_IFACE_WPS, "Event")
|
|
self.add_signal(self.credentials, WPAS_DBUS_IFACE_WPS,
|
|
"Credentials")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def wpsEvent(self, name, args):
|
|
logger.debug("wpsEvent: %s args='%s'" % (name, str(args)))
|
|
|
|
def credentials(self, args):
|
|
logger.debug("credentials: " + str(args))
|
|
self.credentials_received = True
|
|
self.loop.quit()
|
|
|
|
def start_reg(self, *args):
|
|
logger.debug("start_reg")
|
|
bssid_ay = dbus.ByteArray(bssid.replace(':','').decode('hex'))
|
|
wps.Start({'Role': 'registrar', 'Type': 'pin',
|
|
'Pin': '12345670', 'Bssid': bssid_ay})
|
|
return False
|
|
|
|
def success(self):
|
|
return self.credentials_received
|
|
|
|
with TestDbusWps(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Failure in D-Bus operations")
|
|
|
|
dev[0].wait_connected(timeout=10)
|
|
|
|
def test_dbus_scan_invalid(dev, apdev):
|
|
"""D-Bus invalid scan method"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
iface = dbus.Interface(if_obj, WPAS_DBUS_IFACE)
|
|
|
|
tests = [ ({}, "InvalidArgs"),
|
|
({'Type': 123}, "InvalidArgs"),
|
|
({'Type': 'foo'}, "InvalidArgs"),
|
|
({'Type': 'active', 'Foo': 'bar'}, "InvalidArgs"),
|
|
({'Type': 'active', 'SSIDs': 'foo'}, "InvalidArgs"),
|
|
({'Type': 'active', 'SSIDs': ['foo']}, "InvalidArgs"),
|
|
({'Type': 'active',
|
|
'SSIDs': [ dbus.ByteArray("1"), dbus.ByteArray("2"),
|
|
dbus.ByteArray("3"), dbus.ByteArray("4"),
|
|
dbus.ByteArray("5"), dbus.ByteArray("6"),
|
|
dbus.ByteArray("7"), dbus.ByteArray("8"),
|
|
dbus.ByteArray("9"), dbus.ByteArray("10"),
|
|
dbus.ByteArray("11"), dbus.ByteArray("12"),
|
|
dbus.ByteArray("13"), dbus.ByteArray("14"),
|
|
dbus.ByteArray("15"), dbus.ByteArray("16"),
|
|
dbus.ByteArray("17") ]},
|
|
"InvalidArgs"),
|
|
({'Type': 'active',
|
|
'SSIDs': [ dbus.ByteArray("1234567890abcdef1234567890abcdef1") ]},
|
|
"InvalidArgs"),
|
|
({'Type': 'active', 'IEs': 'foo'}, "InvalidArgs"),
|
|
({'Type': 'active', 'IEs': ['foo']}, "InvalidArgs"),
|
|
({'Type': 'active', 'Channels': 2412 }, "InvalidArgs"),
|
|
({'Type': 'active', 'Channels': [ 2412 ] }, "InvalidArgs"),
|
|
({'Type': 'active',
|
|
'Channels': [ (dbus.Int32(2412), dbus.UInt32(20)) ] },
|
|
"InvalidArgs"),
|
|
({'Type': 'active',
|
|
'Channels': [ (dbus.UInt32(2412), dbus.Int32(20)) ] },
|
|
"InvalidArgs"),
|
|
({'Type': 'active', 'AllowRoam': "yes" }, "InvalidArgs"),
|
|
({'Type': 'passive', 'IEs': [ dbus.ByteArray("\xdd\x00") ]},
|
|
"InvalidArgs"),
|
|
({'Type': 'passive', 'SSIDs': [ dbus.ByteArray("foo") ]},
|
|
"InvalidArgs")]
|
|
for (t,err) in tests:
|
|
try:
|
|
iface.Scan(t)
|
|
raise Exception("Invalid Scan() arguments accepted: " + str(t))
|
|
except dbus.exceptions.DBusException, e:
|
|
if err not in str(e):
|
|
raise Exception("Unexpected error message for invalid Scan(%s): %s" % (str(t), str(e)))
|
|
|
|
def test_dbus_scan_oom(dev, apdev):
|
|
"""D-Bus scan method and OOM"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
iface = dbus.Interface(if_obj, WPAS_DBUS_IFACE)
|
|
|
|
with alloc_fail_dbus(dev[0], 1,
|
|
"wpa_scan_clone_params;wpas_dbus_handler_scan",
|
|
"Scan", expected="ScanError: Scan request rejected"):
|
|
iface.Scan({ 'Type': 'passive',
|
|
'Channels': [ (dbus.UInt32(2412), dbus.UInt32(20)) ] })
|
|
|
|
with alloc_fail_dbus(dev[0], 1,
|
|
"=wpas_dbus_get_scan_channels;wpas_dbus_handler_scan",
|
|
"Scan"):
|
|
iface.Scan({ 'Type': 'passive',
|
|
'Channels': [ (dbus.UInt32(2412), dbus.UInt32(20)) ] })
|
|
|
|
with alloc_fail_dbus(dev[0], 1,
|
|
"=wpas_dbus_get_scan_ies;wpas_dbus_handler_scan",
|
|
"Scan"):
|
|
iface.Scan({ 'Type': 'active',
|
|
'IEs': [ dbus.ByteArray("\xdd\x00") ],
|
|
'Channels': [ (dbus.UInt32(2412), dbus.UInt32(20)) ] })
|
|
|
|
with alloc_fail_dbus(dev[0], 1,
|
|
"=wpas_dbus_get_scan_ssids;wpas_dbus_handler_scan",
|
|
"Scan"):
|
|
iface.Scan({ 'Type': 'active',
|
|
'SSIDs': [ dbus.ByteArray("open"),
|
|
dbus.ByteArray() ],
|
|
'Channels': [ (dbus.UInt32(2412), dbus.UInt32(20)) ] })
|
|
|
|
def test_dbus_scan(dev, apdev):
|
|
"""D-Bus scan and related signals"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
iface = dbus.Interface(if_obj, WPAS_DBUS_IFACE)
|
|
|
|
hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "open" })
|
|
|
|
class TestDbusScan(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.scan_completed = 0
|
|
self.bss_added = False
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_scan)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.scanDone, WPAS_DBUS_IFACE, "ScanDone")
|
|
self.add_signal(self.bssAdded, WPAS_DBUS_IFACE, "BSSAdded")
|
|
self.add_signal(self.bssRemoved, WPAS_DBUS_IFACE, "BSSRemoved")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def scanDone(self, success):
|
|
logger.debug("scanDone: success=%s" % success)
|
|
self.scan_completed += 1
|
|
if self.scan_completed == 1:
|
|
iface.Scan({'Type': 'passive',
|
|
'AllowRoam': True,
|
|
'Channels': [(dbus.UInt32(2412), dbus.UInt32(20))]})
|
|
elif self.scan_completed == 2:
|
|
iface.Scan({'Type': 'passive',
|
|
'AllowRoam': False})
|
|
elif self.bss_added and self.scan_completed == 3:
|
|
self.loop.quit()
|
|
|
|
def bssAdded(self, bss, properties):
|
|
logger.debug("bssAdded: %s" % bss)
|
|
logger.debug(str(properties))
|
|
self.bss_added = True
|
|
if self.scan_completed == 3:
|
|
self.loop.quit()
|
|
|
|
def bssRemoved(self, bss):
|
|
logger.debug("bssRemoved: %s" % bss)
|
|
|
|
def run_scan(self, *args):
|
|
logger.debug("run_scan")
|
|
iface.Scan({'Type': 'active',
|
|
'SSIDs': [ dbus.ByteArray("open"),
|
|
dbus.ByteArray() ],
|
|
'IEs': [ dbus.ByteArray("\xdd\x00"),
|
|
dbus.ByteArray() ],
|
|
'AllowRoam': False,
|
|
'Channels': [(dbus.UInt32(2412), dbus.UInt32(20))]})
|
|
return False
|
|
|
|
def success(self):
|
|
return self.scan_completed == 3 and self.bss_added
|
|
|
|
with TestDbusScan(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Expected signals not seen")
|
|
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, "BSSs",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if len(res) < 1:
|
|
raise Exception("Scan result not in BSSs property")
|
|
iface.FlushBSS(0)
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, "BSSs",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if len(res) != 0:
|
|
raise Exception("FlushBSS() did not remove scan results from BSSs property")
|
|
iface.FlushBSS(1)
|
|
|
|
def test_dbus_scan_busy(dev, apdev):
|
|
"""D-Bus scan trigger rejection when busy with previous scan"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
iface = dbus.Interface(if_obj, WPAS_DBUS_IFACE)
|
|
|
|
if "OK" not in dev[0].request("SCAN freq=2412-2462"):
|
|
raise Exception("Failed to start scan")
|
|
ev = dev[0].wait_event(["CTRL-EVENT-SCAN-STARTED"], 15)
|
|
if ev is None:
|
|
raise Exception("Scan start timed out")
|
|
|
|
try:
|
|
iface.Scan({'Type': 'active', 'AllowRoam': False})
|
|
raise Exception("Scan() accepted when busy")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "ScanError: Scan request reject" not in str(e):
|
|
raise Exception("Unexpected error message: " + str(e))
|
|
|
|
ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], 15)
|
|
if ev is None:
|
|
raise Exception("Scan timed out")
|
|
|
|
def test_dbus_connect(dev, apdev):
|
|
"""D-Bus AddNetwork and connect"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
iface = dbus.Interface(if_obj, WPAS_DBUS_IFACE)
|
|
|
|
ssid = "test-wpa2-psk"
|
|
passphrase = 'qwertyuiop'
|
|
params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
|
|
hapd = hostapd.add_ap(apdev[0]['ifname'], params)
|
|
|
|
class TestDbusConnect(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.network_added = False
|
|
self.network_selected = False
|
|
self.network_removed = False
|
|
self.state = 0
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_connect)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.networkAdded, WPAS_DBUS_IFACE, "NetworkAdded")
|
|
self.add_signal(self.networkRemoved, WPAS_DBUS_IFACE,
|
|
"NetworkRemoved")
|
|
self.add_signal(self.networkSelected, WPAS_DBUS_IFACE,
|
|
"NetworkSelected")
|
|
self.add_signal(self.propertiesChanged, WPAS_DBUS_IFACE,
|
|
"PropertiesChanged")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def networkAdded(self, network, properties):
|
|
logger.debug("networkAdded: %s" % str(network))
|
|
logger.debug(str(properties))
|
|
self.network_added = True
|
|
|
|
def networkRemoved(self, network):
|
|
logger.debug("networkRemoved: %s" % str(network))
|
|
self.network_removed = True
|
|
|
|
def networkSelected(self, network):
|
|
logger.debug("networkSelected: %s" % str(network))
|
|
self.network_selected = True
|
|
|
|
def propertiesChanged(self, properties):
|
|
logger.debug("propertiesChanged: %s" % str(properties))
|
|
if 'State' in properties and properties['State'] == "completed":
|
|
if self.state == 0:
|
|
self.state = 1
|
|
iface.Disconnect()
|
|
elif self.state == 2:
|
|
self.state = 3
|
|
iface.Disconnect()
|
|
elif self.state == 4:
|
|
self.state = 5
|
|
iface.Reattach()
|
|
elif self.state == 5:
|
|
self.state = 6
|
|
res = iface.SignalPoll()
|
|
logger.debug("SignalPoll: " + str(res))
|
|
if 'frequency' not in res or res['frequency'] != 2412:
|
|
self.state = -1
|
|
logger.info("Unexpected SignalPoll result")
|
|
iface.RemoveNetwork(self.netw)
|
|
if 'State' in properties and properties['State'] == "disconnected":
|
|
if self.state == 1:
|
|
self.state = 2
|
|
iface.SelectNetwork(self.netw)
|
|
elif self.state == 3:
|
|
self.state = 4
|
|
iface.Reassociate()
|
|
elif self.state == 6:
|
|
self.state = 7
|
|
self.loop.quit()
|
|
|
|
def run_connect(self, *args):
|
|
logger.debug("run_connect")
|
|
args = dbus.Dictionary({ 'ssid': ssid,
|
|
'key_mgmt': 'WPA-PSK',
|
|
'psk': passphrase,
|
|
'scan_freq': 2412 },
|
|
signature='sv')
|
|
self.netw = iface.AddNetwork(args)
|
|
iface.SelectNetwork(self.netw)
|
|
return False
|
|
|
|
def success(self):
|
|
if not self.network_added or \
|
|
not self.network_removed or \
|
|
not self.network_selected:
|
|
return False
|
|
return self.state == 7
|
|
|
|
with TestDbusConnect(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Expected signals not seen")
|
|
|
|
def test_dbus_connect_oom(dev, apdev):
|
|
"""D-Bus AddNetwork and connect when out-of-memory"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
iface = dbus.Interface(if_obj, WPAS_DBUS_IFACE)
|
|
|
|
if "OK" not in dev[0].request("TEST_ALLOC_FAIL 0:"):
|
|
raise HwsimSkip("TEST_ALLOC_FAIL not supported in the build")
|
|
|
|
ssid = "test-wpa2-psk"
|
|
passphrase = 'qwertyuiop'
|
|
params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
|
|
hapd = hostapd.add_ap(apdev[0]['ifname'], params)
|
|
|
|
class TestDbusConnect(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.network_added = False
|
|
self.network_selected = False
|
|
self.network_removed = False
|
|
self.state = 0
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_connect)
|
|
gobject.timeout_add(1500, self.timeout)
|
|
self.add_signal(self.networkAdded, WPAS_DBUS_IFACE, "NetworkAdded")
|
|
self.add_signal(self.networkRemoved, WPAS_DBUS_IFACE,
|
|
"NetworkRemoved")
|
|
self.add_signal(self.networkSelected, WPAS_DBUS_IFACE,
|
|
"NetworkSelected")
|
|
self.add_signal(self.propertiesChanged, WPAS_DBUS_IFACE,
|
|
"PropertiesChanged")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def networkAdded(self, network, properties):
|
|
logger.debug("networkAdded: %s" % str(network))
|
|
logger.debug(str(properties))
|
|
self.network_added = True
|
|
|
|
def networkRemoved(self, network):
|
|
logger.debug("networkRemoved: %s" % str(network))
|
|
self.network_removed = True
|
|
|
|
def networkSelected(self, network):
|
|
logger.debug("networkSelected: %s" % str(network))
|
|
self.network_selected = True
|
|
|
|
def propertiesChanged(self, properties):
|
|
logger.debug("propertiesChanged: %s" % str(properties))
|
|
if 'State' in properties and properties['State'] == "completed":
|
|
if self.state == 0:
|
|
self.state = 1
|
|
iface.Disconnect()
|
|
elif self.state == 2:
|
|
self.state = 3
|
|
iface.Disconnect()
|
|
elif self.state == 4:
|
|
self.state = 5
|
|
iface.Reattach()
|
|
elif self.state == 5:
|
|
self.state = 6
|
|
res = iface.SignalPoll()
|
|
logger.debug("SignalPoll: " + str(res))
|
|
if 'frequency' not in res or res['frequency'] != 2412:
|
|
self.state = -1
|
|
logger.info("Unexpected SignalPoll result")
|
|
iface.RemoveNetwork(self.netw)
|
|
if 'State' in properties and properties['State'] == "disconnected":
|
|
if self.state == 1:
|
|
self.state = 2
|
|
iface.SelectNetwork(self.netw)
|
|
elif self.state == 3:
|
|
self.state = 4
|
|
iface.Reassociate()
|
|
elif self.state == 6:
|
|
self.state = 7
|
|
self.loop.quit()
|
|
|
|
def run_connect(self, *args):
|
|
logger.debug("run_connect")
|
|
args = dbus.Dictionary({ 'ssid': ssid,
|
|
'key_mgmt': 'WPA-PSK',
|
|
'psk': passphrase,
|
|
'scan_freq': 2412 },
|
|
signature='sv')
|
|
try:
|
|
self.netw = iface.AddNetwork(args)
|
|
except Exception, e:
|
|
logger.info("Exception on AddNetwork: " + str(e))
|
|
self.loop.quit()
|
|
return False
|
|
try:
|
|
iface.SelectNetwork(self.netw)
|
|
except Exception, e:
|
|
logger.info("Exception on SelectNetwork: " + str(e))
|
|
self.loop.quit()
|
|
|
|
return False
|
|
|
|
def success(self):
|
|
if not self.network_added or \
|
|
not self.network_removed or \
|
|
not self.network_selected:
|
|
return False
|
|
return self.state == 7
|
|
|
|
count = 0
|
|
for i in range(1, 1000):
|
|
for j in range(3):
|
|
dev[j].dump_monitor()
|
|
dev[0].request("TEST_ALLOC_FAIL %d:main" % i)
|
|
try:
|
|
with TestDbusConnect(bus) as t:
|
|
if not t.success():
|
|
logger.info("Iteration %d - Expected signals not seen" % i)
|
|
else:
|
|
logger.info("Iteration %d - success" % i)
|
|
|
|
state = dev[0].request('GET_ALLOC_FAIL')
|
|
logger.info("GET_ALLOC_FAIL: " + state)
|
|
dev[0].dump_monitor()
|
|
dev[0].request("TEST_ALLOC_FAIL 0:")
|
|
if i < 3:
|
|
raise Exception("Connection succeeded during out-of-memory")
|
|
if not state.startswith('0:'):
|
|
count += 1
|
|
if count == 5:
|
|
break
|
|
except:
|
|
pass
|
|
|
|
def test_dbus_while_not_connected(dev, apdev):
|
|
"""D-Bus invalid operations while not connected"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
iface = dbus.Interface(if_obj, WPAS_DBUS_IFACE)
|
|
|
|
try:
|
|
iface.Disconnect()
|
|
raise Exception("Disconnect() accepted when not connected")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "NotConnected" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Disconnect: " + str(e))
|
|
|
|
try:
|
|
iface.Reattach()
|
|
raise Exception("Reattach() accepted when not connected")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "NotConnected" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Reattach: " + str(e))
|
|
|
|
def test_dbus_connect_eap(dev, apdev):
|
|
"""D-Bus AddNetwork and connect to EAP network"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
iface = dbus.Interface(if_obj, WPAS_DBUS_IFACE)
|
|
|
|
ssid = "ieee8021x-open"
|
|
params = hostapd.radius_params()
|
|
params["ssid"] = ssid
|
|
params["ieee8021x"] = "1"
|
|
hapd = hostapd.add_ap(apdev[0]['ifname'], params)
|
|
|
|
class TestDbusConnect(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.certification_received = False
|
|
self.eap_status = False
|
|
self.state = 0
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_connect)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.propertiesChanged, WPAS_DBUS_IFACE,
|
|
"PropertiesChanged")
|
|
self.add_signal(self.certification, WPAS_DBUS_IFACE,
|
|
"Certification", byte_arrays=True)
|
|
self.add_signal(self.networkRequest, WPAS_DBUS_IFACE,
|
|
"NetworkRequest")
|
|
self.add_signal(self.eap, WPAS_DBUS_IFACE, "EAP")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def propertiesChanged(self, properties):
|
|
logger.debug("propertiesChanged: %s" % str(properties))
|
|
if 'State' in properties and properties['State'] == "completed":
|
|
if self.state == 0:
|
|
self.state = 1
|
|
iface.EAPLogoff()
|
|
logger.info("Set dNSName constraint")
|
|
net_obj = bus.get_object(WPAS_DBUS_SERVICE, self.netw)
|
|
args = dbus.Dictionary({ 'altsubject_match':
|
|
self.server_dnsname },
|
|
signature='sv')
|
|
net_obj.Set(WPAS_DBUS_NETWORK, "Properties", args,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
elif self.state == 2:
|
|
self.state = 3
|
|
iface.Disconnect()
|
|
logger.info("Set non-matching dNSName constraint")
|
|
net_obj = bus.get_object(WPAS_DBUS_SERVICE, self.netw)
|
|
args = dbus.Dictionary({ 'altsubject_match':
|
|
self.server_dnsname + "FOO" },
|
|
signature='sv')
|
|
net_obj.Set(WPAS_DBUS_NETWORK, "Properties", args,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if 'State' in properties and properties['State'] == "disconnected":
|
|
if self.state == 1:
|
|
self.state = 2
|
|
iface.EAPLogon()
|
|
iface.SelectNetwork(self.netw)
|
|
if self.state == 3:
|
|
self.state = 4
|
|
iface.SelectNetwork(self.netw)
|
|
|
|
def certification(self, args):
|
|
logger.debug("certification: %s" % str(args))
|
|
self.certification_received = True
|
|
if args['depth'] == 0:
|
|
# The test server certificate is supposed to have dNSName
|
|
if len(args['altsubject']) < 1:
|
|
raise Exception("Missing dNSName")
|
|
dnsname = args['altsubject'][0]
|
|
if not dnsname.startswith("DNS:"):
|
|
raise Exception("Expected dNSName not found: " + dnsname)
|
|
logger.info("altsubject: " + dnsname)
|
|
self.server_dnsname = dnsname
|
|
|
|
def eap(self, status, parameter):
|
|
logger.debug("EAP: status=%s parameter=%s" % (status, parameter))
|
|
if status == 'completion' and parameter == 'success':
|
|
self.eap_status = True
|
|
if self.state == 4 and status == 'remote certificate verification' and parameter == 'AltSubject mismatch':
|
|
self.state = 5
|
|
self.loop.quit()
|
|
|
|
def networkRequest(self, path, field, txt):
|
|
logger.debug("networkRequest: %s %s %s" % (path, field, txt))
|
|
if field == "PASSWORD":
|
|
iface.NetworkReply(path, field, "password")
|
|
|
|
def run_connect(self, *args):
|
|
logger.debug("run_connect")
|
|
args = dbus.Dictionary({ 'ssid': ssid,
|
|
'key_mgmt': 'IEEE8021X',
|
|
'eapol_flags': 0,
|
|
'eap': 'TTLS',
|
|
'anonymous_identity': 'ttls',
|
|
'identity': 'pap user',
|
|
'ca_cert': 'auth_serv/ca.pem',
|
|
'phase2': 'auth=PAP',
|
|
'scan_freq': 2412 },
|
|
signature='sv')
|
|
self.netw = iface.AddNetwork(args)
|
|
iface.SelectNetwork(self.netw)
|
|
return False
|
|
|
|
def success(self):
|
|
if not self.eap_status or not self.certification_received:
|
|
return False
|
|
return self.state == 5
|
|
|
|
with TestDbusConnect(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Expected signals not seen")
|
|
|
|
def test_dbus_network(dev, apdev):
|
|
"""D-Bus AddNetwork/RemoveNetwork parameters and error cases"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
iface = dbus.Interface(if_obj, WPAS_DBUS_IFACE)
|
|
|
|
args = dbus.Dictionary({ 'ssid': "foo",
|
|
'key_mgmt': 'WPA-PSK',
|
|
'psk': "12345678",
|
|
'identity': dbus.ByteArray([ 1, 2 ]),
|
|
'priority': dbus.Int32(0),
|
|
'scan_freq': dbus.UInt32(2412) },
|
|
signature='sv')
|
|
netw = iface.AddNetwork(args)
|
|
iface.RemoveNetwork(netw)
|
|
try:
|
|
iface.RemoveNetwork(netw)
|
|
raise Exception("Invalid RemoveNetwork() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "NetworkUnknown" not in str(e):
|
|
raise Exception("Unexpected error message for invalid RemoveNetwork: " + str(e))
|
|
try:
|
|
iface.SelectNetwork(netw)
|
|
raise Exception("Invalid SelectNetwork() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "NetworkUnknown" not in str(e):
|
|
raise Exception("Unexpected error message for invalid RemoveNetwork: " + str(e))
|
|
|
|
args = dbus.Dictionary({ 'ssid': "foo1", 'key_mgmt': 'NONE',
|
|
'identity': "testuser", 'scan_freq': '2412' },
|
|
signature='sv')
|
|
netw1 = iface.AddNetwork(args)
|
|
args = dbus.Dictionary({ 'ssid': "foo2", 'key_mgmt': 'NONE' },
|
|
signature='sv')
|
|
netw2 = iface.AddNetwork(args)
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, "Networks",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if len(res) != 2:
|
|
raise Exception("Unexpected number of networks")
|
|
|
|
net_obj = bus.get_object(WPAS_DBUS_SERVICE, netw1)
|
|
res = net_obj.Get(WPAS_DBUS_NETWORK, "Enabled",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if res != False:
|
|
raise Exception("Added network was unexpectedly enabled by default")
|
|
net_obj.Set(WPAS_DBUS_NETWORK, "Enabled", dbus.Boolean(True),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
res = net_obj.Get(WPAS_DBUS_NETWORK, "Enabled",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if res != True:
|
|
raise Exception("Set(Enabled,True) did not seem to change property value")
|
|
net_obj.Set(WPAS_DBUS_NETWORK, "Enabled", dbus.Boolean(False),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
res = net_obj.Get(WPAS_DBUS_NETWORK, "Enabled",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if res != False:
|
|
raise Exception("Set(Enabled,False) did not seem to change property value")
|
|
try:
|
|
net_obj.Set(WPAS_DBUS_NETWORK, "Enabled", dbus.UInt32(1),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Set(Enabled,1) accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: wrong property type" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Set(Enabled,1): " + str(e))
|
|
|
|
args = dbus.Dictionary({ 'ssid': "foo1new" }, signature='sv')
|
|
net_obj.Set(WPAS_DBUS_NETWORK, "Properties", args,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
res = net_obj.Get(WPAS_DBUS_NETWORK, "Properties",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if res['ssid'] != '"foo1new"':
|
|
raise Exception("Set(Properties) failed to update ssid")
|
|
if res['identity'] != '"testuser"':
|
|
raise Exception("Set(Properties) unexpectedly changed unrelated parameter")
|
|
|
|
iface.RemoveAllNetworks()
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, "Networks",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if len(res) != 0:
|
|
raise Exception("Unexpected number of networks")
|
|
iface.RemoveAllNetworks()
|
|
|
|
tests = [ dbus.Dictionary({ 'psk': "1234567" }, signature='sv'),
|
|
dbus.Dictionary({ 'identity': dbus.ByteArray() },
|
|
signature='sv'),
|
|
dbus.Dictionary({ 'identity': dbus.Byte(1) }, signature='sv'),
|
|
dbus.Dictionary({ 'identity': "" }, signature='sv') ]
|
|
for args in tests:
|
|
try:
|
|
iface.AddNetwork(args)
|
|
raise Exception("Invalid AddNetwork args accepted: " + str(args))
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid AddNetwork: " + str(e))
|
|
|
|
def test_dbus_network_oom(dev, apdev):
|
|
"""D-Bus AddNetwork/RemoveNetwork parameters and OOM error cases"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
iface = dbus.Interface(if_obj, WPAS_DBUS_IFACE)
|
|
|
|
args = dbus.Dictionary({ 'ssid': "foo1", 'key_mgmt': 'NONE',
|
|
'identity': "testuser", 'scan_freq': '2412' },
|
|
signature='sv')
|
|
netw1 = iface.AddNetwork(args)
|
|
net_obj = bus.get_object(WPAS_DBUS_SERVICE, netw1)
|
|
|
|
with alloc_fail_dbus(dev[0], 1,
|
|
"wpa_config_get_all;wpas_dbus_getter_network_properties",
|
|
"Get"):
|
|
net_obj.Get(WPAS_DBUS_NETWORK, "Properties",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
|
|
iface.RemoveAllNetworks()
|
|
|
|
with alloc_fail_dbus(dev[0], 1,
|
|
"wpas_dbus_new_decompose_object_path;wpas_dbus_handler_remove_network",
|
|
"RemoveNetwork", "InvalidArgs"):
|
|
iface.RemoveNetwork(dbus.ObjectPath("/fi/w1/wpa_supplicant1/Interfaces/1234/Networks/1234"))
|
|
|
|
with alloc_fail(dev[0], 1, "wpa_dbus_register_object_per_iface;wpas_dbus_register_network"):
|
|
args = dbus.Dictionary({ 'ssid': "foo2", 'key_mgmt': 'NONE' },
|
|
signature='sv')
|
|
try:
|
|
netw = iface.AddNetwork(args)
|
|
# Currently, AddNetwork() succeeds even if os_strdup() for path
|
|
# fails, so remove the network if that occurs.
|
|
iface.RemoveNetwork(netw)
|
|
except dbus.exceptions.DBusException, e:
|
|
pass
|
|
|
|
for i in range(1, 3):
|
|
with alloc_fail(dev[0], i, "=wpas_dbus_register_network"):
|
|
try:
|
|
netw = iface.AddNetwork(args)
|
|
# Currently, AddNetwork() succeeds even if network registration
|
|
# fails, so remove the network if that occurs.
|
|
iface.RemoveNetwork(netw)
|
|
except dbus.exceptions.DBusException, e:
|
|
pass
|
|
|
|
with alloc_fail_dbus(dev[0], 1,
|
|
"=wpa_config_add_network;wpas_dbus_handler_add_network",
|
|
"AddNetwork",
|
|
"UnknownError: wpa_supplicant could not add a network"):
|
|
args = dbus.Dictionary({ 'ssid': "foo2", 'key_mgmt': 'NONE' },
|
|
signature='sv')
|
|
netw = iface.AddNetwork(args)
|
|
|
|
tests = [ (1,
|
|
'wpa_dbus_dict_get_entry;set_network_properties;wpas_dbus_handler_add_network',
|
|
dbus.Dictionary({ 'ssid': dbus.ByteArray(' ') },
|
|
signature='sv')),
|
|
(1, '=set_network_properties;wpas_dbus_handler_add_network',
|
|
dbus.Dictionary({ 'ssid': 'foo' }, signature='sv')),
|
|
(1, '=set_network_properties;wpas_dbus_handler_add_network',
|
|
dbus.Dictionary({ 'eap': 'foo' }, signature='sv')),
|
|
(1, '=set_network_properties;wpas_dbus_handler_add_network',
|
|
dbus.Dictionary({ 'priority': dbus.UInt32(1) },
|
|
signature='sv')),
|
|
(1, '=set_network_properties;wpas_dbus_handler_add_network',
|
|
dbus.Dictionary({ 'priority': dbus.Int32(1) },
|
|
signature='sv')),
|
|
(1, '=set_network_properties;wpas_dbus_handler_add_network',
|
|
dbus.Dictionary({ 'ssid': dbus.ByteArray(' ') },
|
|
signature='sv')) ]
|
|
for (count,funcs,args) in tests:
|
|
with alloc_fail_dbus(dev[0], count, funcs, "AddNetwork", "InvalidArgs"):
|
|
netw = iface.AddNetwork(args)
|
|
|
|
if len(if_obj.Get(WPAS_DBUS_IFACE, 'Networks',
|
|
dbus_interface=dbus.PROPERTIES_IFACE)) > 0:
|
|
raise Exception("Unexpected network block added")
|
|
if len(dev[0].list_networks()) > 0:
|
|
raise Exception("Unexpected network block visible")
|
|
|
|
def test_dbus_interface(dev, apdev):
|
|
"""D-Bus CreateInterface/GetInterface/RemoveInterface parameters and error cases"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
wpas = dbus.Interface(wpas_obj, WPAS_DBUS_SERVICE)
|
|
|
|
params = dbus.Dictionary({ 'Ifname': 'lo', 'Driver': 'none' },
|
|
signature='sv')
|
|
path = wpas.CreateInterface(params)
|
|
logger.debug("New interface path: " + str(path))
|
|
path2 = wpas.GetInterface("lo")
|
|
if path != path2:
|
|
raise Exception("Interface object mismatch")
|
|
|
|
params = dbus.Dictionary({ 'Ifname': 'lo',
|
|
'Driver': 'none',
|
|
'ConfigFile': 'foo',
|
|
'BridgeIfname': 'foo', },
|
|
signature='sv')
|
|
try:
|
|
wpas.CreateInterface(params)
|
|
raise Exception("Invalid CreateInterface() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InterfaceExists" not in str(e):
|
|
raise Exception("Unexpected error message for invalid CreateInterface: " + str(e))
|
|
|
|
wpas.RemoveInterface(path)
|
|
try:
|
|
wpas.RemoveInterface(path)
|
|
raise Exception("Invalid RemoveInterface() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InterfaceUnknown" not in str(e):
|
|
raise Exception("Unexpected error message for invalid RemoveInterface: " + str(e))
|
|
|
|
params = dbus.Dictionary({ 'Ifname': 'lo', 'Driver': 'none',
|
|
'Foo': 123 },
|
|
signature='sv')
|
|
try:
|
|
wpas.CreateInterface(params)
|
|
raise Exception("Invalid CreateInterface() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid CreateInterface: " + str(e))
|
|
|
|
params = dbus.Dictionary({ 'Driver': 'none' }, signature='sv')
|
|
try:
|
|
wpas.CreateInterface(params)
|
|
raise Exception("Invalid CreateInterface() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid CreateInterface: " + str(e))
|
|
|
|
try:
|
|
wpas.GetInterface("lo")
|
|
raise Exception("Invalid GetInterface() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InterfaceUnknown" not in str(e):
|
|
raise Exception("Unexpected error message for invalid RemoveInterface: " + str(e))
|
|
|
|
def test_dbus_interface_oom(dev, apdev):
|
|
"""D-Bus CreateInterface/GetInterface/RemoveInterface OOM error cases"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
wpas = dbus.Interface(wpas_obj, WPAS_DBUS_SERVICE)
|
|
|
|
with alloc_fail_dbus(dev[0], 1, "wpa_dbus_dict_get_entry;wpas_dbus_handler_create_interface", "CreateInterface", "InvalidArgs"):
|
|
params = dbus.Dictionary({ 'Ifname': 'lo', 'Driver': 'none' },
|
|
signature='sv')
|
|
wpas.CreateInterface(params)
|
|
|
|
for i in range(1, 1000):
|
|
dev[0].request("TEST_ALLOC_FAIL %d:wpa_supplicant_add_iface;wpas_dbus_handler_create_interface" % i)
|
|
params = dbus.Dictionary({ 'Ifname': 'lo', 'Driver': 'none' },
|
|
signature='sv')
|
|
try:
|
|
npath = wpas.CreateInterface(params)
|
|
wpas.RemoveInterface(npath)
|
|
logger.info("CreateInterface succeeds after %d allocation failures" % i)
|
|
state = dev[0].request('GET_ALLOC_FAIL')
|
|
logger.info("GET_ALLOC_FAIL: " + state)
|
|
dev[0].dump_monitor()
|
|
dev[0].request("TEST_ALLOC_FAIL 0:")
|
|
if i < 5:
|
|
raise Exception("CreateInterface succeeded during out-of-memory")
|
|
if not state.startswith('0:'):
|
|
break
|
|
except dbus.exceptions.DBusException, e:
|
|
pass
|
|
|
|
for arg in [ 'Driver', 'Ifname', 'ConfigFile', 'BridgeIfname' ]:
|
|
with alloc_fail_dbus(dev[0], 1, "=wpas_dbus_handler_create_interface",
|
|
"CreateInterface"):
|
|
params = dbus.Dictionary({ arg: 'foo' }, signature='sv')
|
|
wpas.CreateInterface(params)
|
|
|
|
def test_dbus_blob(dev, apdev):
|
|
"""D-Bus AddNetwork/RemoveNetwork parameters and error cases"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
iface = dbus.Interface(if_obj, WPAS_DBUS_IFACE)
|
|
|
|
blob = dbus.ByteArray("\x01\x02\x03")
|
|
iface.AddBlob('blob1', blob)
|
|
try:
|
|
iface.AddBlob('blob1', dbus.ByteArray("\x01\x02\x04"))
|
|
raise Exception("Invalid AddBlob() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "BlobExists" not in str(e):
|
|
raise Exception("Unexpected error message for invalid AddBlob: " + str(e))
|
|
res = iface.GetBlob('blob1')
|
|
if len(res) != len(blob):
|
|
raise Exception("Unexpected blob data length")
|
|
for i in range(len(res)):
|
|
if res[i] != dbus.Byte(blob[i]):
|
|
raise Exception("Unexpected blob data")
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, "Blobs",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if 'blob1' not in res:
|
|
raise Exception("Added blob missing from Blobs property")
|
|
iface.RemoveBlob('blob1')
|
|
try:
|
|
iface.RemoveBlob('blob1')
|
|
raise Exception("Invalid RemoveBlob() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "BlobUnknown" not in str(e):
|
|
raise Exception("Unexpected error message for invalid RemoveBlob: " + str(e))
|
|
try:
|
|
iface.GetBlob('blob1')
|
|
raise Exception("Invalid GetBlob() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "BlobUnknown" not in str(e):
|
|
raise Exception("Unexpected error message for invalid GetBlob: " + str(e))
|
|
|
|
class TestDbusBlob(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.blob_added = False
|
|
self.blob_removed = False
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_blob)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.blobAdded, WPAS_DBUS_IFACE, "BlobAdded")
|
|
self.add_signal(self.blobRemoved, WPAS_DBUS_IFACE, "BlobRemoved")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def blobAdded(self, blobName):
|
|
logger.debug("blobAdded: %s" % blobName)
|
|
if blobName == 'blob2':
|
|
self.blob_added = True
|
|
|
|
def blobRemoved(self, blobName):
|
|
logger.debug("blobRemoved: %s" % blobName)
|
|
if blobName == 'blob2':
|
|
self.blob_removed = True
|
|
self.loop.quit()
|
|
|
|
def run_blob(self, *args):
|
|
logger.debug("run_blob")
|
|
iface.AddBlob('blob2', dbus.ByteArray("\x01\x02\x04"))
|
|
iface.RemoveBlob('blob2')
|
|
return False
|
|
|
|
def success(self):
|
|
return self.blob_added and self.blob_removed
|
|
|
|
with TestDbusBlob(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Expected signals not seen")
|
|
|
|
def test_dbus_blob_oom(dev, apdev):
|
|
"""D-Bus AddNetwork/RemoveNetwork OOM error cases"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
iface = dbus.Interface(if_obj, WPAS_DBUS_IFACE)
|
|
|
|
for i in range(1, 4):
|
|
with alloc_fail_dbus(dev[0], i, "wpas_dbus_handler_add_blob",
|
|
"AddBlob"):
|
|
iface.AddBlob('blob_no_mem', dbus.ByteArray("\x01\x02\x03\x04"))
|
|
|
|
def test_dbus_autoscan(dev, apdev):
|
|
"""D-Bus Autoscan()"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
iface = dbus.Interface(if_obj, WPAS_DBUS_IFACE)
|
|
|
|
iface.AutoScan("foo")
|
|
iface.AutoScan("periodic:1")
|
|
iface.AutoScan("")
|
|
dev[0].request("AUTOSCAN ")
|
|
|
|
def test_dbus_autoscan_oom(dev, apdev):
|
|
"""D-Bus Autoscan() OOM"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
iface = dbus.Interface(if_obj, WPAS_DBUS_IFACE)
|
|
|
|
with alloc_fail_dbus(dev[0], 1, "wpas_dbus_handler_autoscan", "AutoScan"):
|
|
iface.AutoScan("foo")
|
|
dev[0].request("AUTOSCAN ")
|
|
|
|
def test_dbus_tdls_invalid(dev, apdev):
|
|
"""D-Bus invalid TDLS operations"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
iface = dbus.Interface(if_obj, WPAS_DBUS_IFACE)
|
|
|
|
hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "test-open" })
|
|
connect_2sta_open(dev, hapd)
|
|
addr1 = dev[1].p2p_interface_addr()
|
|
|
|
try:
|
|
iface.TDLSDiscover("foo")
|
|
raise Exception("Invalid TDLSDiscover() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid TDLSDiscover: " + str(e))
|
|
|
|
try:
|
|
iface.TDLSStatus("foo")
|
|
raise Exception("Invalid TDLSStatus() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid TDLSStatus: " + str(e))
|
|
|
|
res = iface.TDLSStatus(addr1)
|
|
if res != "peer does not exist":
|
|
raise Exception("Unexpected TDLSStatus response")
|
|
|
|
try:
|
|
iface.TDLSSetup("foo")
|
|
raise Exception("Invalid TDLSSetup() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid TDLSSetup: " + str(e))
|
|
|
|
try:
|
|
iface.TDLSTeardown("foo")
|
|
raise Exception("Invalid TDLSTeardown() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid TDLSTeardown: " + str(e))
|
|
|
|
try:
|
|
iface.TDLSTeardown("00:11:22:33:44:55")
|
|
raise Exception("TDLSTeardown accepted for unknown peer")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "UnknownError: error performing TDLS teardown" not in str(e):
|
|
raise Exception("Unexpected error message: " + str(e))
|
|
|
|
def test_dbus_tdls_oom(dev, apdev):
|
|
"""D-Bus TDLS operations during OOM"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
iface = dbus.Interface(if_obj, WPAS_DBUS_IFACE)
|
|
|
|
with alloc_fail_dbus(dev[0], 1, "wpa_tdls_add_peer", "TDLSSetup",
|
|
"UnknownError: error performing TDLS setup"):
|
|
iface.TDLSSetup("00:11:22:33:44:55")
|
|
|
|
def test_dbus_tdls(dev, apdev):
|
|
"""D-Bus TDLS"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
iface = dbus.Interface(if_obj, WPAS_DBUS_IFACE)
|
|
|
|
hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "test-open" })
|
|
connect_2sta_open(dev, hapd)
|
|
|
|
addr1 = dev[1].p2p_interface_addr()
|
|
|
|
class TestDbusTdls(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.tdls_setup = False
|
|
self.tdls_teardown = False
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_tdls)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.propertiesChanged, WPAS_DBUS_IFACE,
|
|
"PropertiesChanged")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def propertiesChanged(self, properties):
|
|
logger.debug("propertiesChanged: %s" % str(properties))
|
|
|
|
def run_tdls(self, *args):
|
|
logger.debug("run_tdls")
|
|
iface.TDLSDiscover(addr1)
|
|
gobject.timeout_add(100, self.run_tdls2)
|
|
return False
|
|
|
|
def run_tdls2(self, *args):
|
|
logger.debug("run_tdls2")
|
|
iface.TDLSSetup(addr1)
|
|
gobject.timeout_add(500, self.run_tdls3)
|
|
return False
|
|
|
|
def run_tdls3(self, *args):
|
|
logger.debug("run_tdls3")
|
|
res = iface.TDLSStatus(addr1)
|
|
if res == "connected":
|
|
self.tdls_setup = True
|
|
else:
|
|
logger.info("Unexpected TDLSStatus: " + res)
|
|
iface.TDLSTeardown(addr1)
|
|
gobject.timeout_add(200, self.run_tdls4)
|
|
return False
|
|
|
|
def run_tdls4(self, *args):
|
|
logger.debug("run_tdls4")
|
|
res = iface.TDLSStatus(addr1)
|
|
if res == "peer does not exist":
|
|
self.tdls_teardown = True
|
|
else:
|
|
logger.info("Unexpected TDLSStatus: " + res)
|
|
self.loop.quit()
|
|
return False
|
|
|
|
def success(self):
|
|
return self.tdls_setup and self.tdls_teardown
|
|
|
|
with TestDbusTdls(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Expected signals not seen")
|
|
|
|
def test_dbus_pkcs11(dev, apdev):
|
|
"""D-Bus SetPKCS11EngineAndModulePath()"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
iface = dbus.Interface(if_obj, WPAS_DBUS_IFACE)
|
|
|
|
try:
|
|
iface.SetPKCS11EngineAndModulePath("foo", "bar")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: Reinit of the EAPOL" not in str(e):
|
|
raise Exception("Unexpected error message for invalid SetPKCS11EngineAndModulePath: " + str(e))
|
|
|
|
try:
|
|
iface.SetPKCS11EngineAndModulePath("foo", "")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: Reinit of the EAPOL" not in str(e):
|
|
raise Exception("Unexpected error message for invalid SetPKCS11EngineAndModulePath: " + str(e))
|
|
|
|
iface.SetPKCS11EngineAndModulePath("", "bar")
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, "PKCS11EnginePath",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if res != "":
|
|
raise Exception("Unexpected PKCS11EnginePath value: " + res)
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, "PKCS11ModulePath",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if res != "bar":
|
|
raise Exception("Unexpected PKCS11ModulePath value: " + res)
|
|
|
|
iface.SetPKCS11EngineAndModulePath("", "")
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, "PKCS11EnginePath",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if res != "":
|
|
raise Exception("Unexpected PKCS11EnginePath value: " + res)
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, "PKCS11ModulePath",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if res != "":
|
|
raise Exception("Unexpected PKCS11ModulePath value: " + res)
|
|
|
|
def test_dbus_apscan(dev, apdev):
|
|
"""D-Bus Get/Set ApScan"""
|
|
try:
|
|
_test_dbus_apscan(dev, apdev)
|
|
finally:
|
|
dev[0].request("AP_SCAN 1")
|
|
|
|
def _test_dbus_apscan(dev, apdev):
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, "ApScan",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if res != 1:
|
|
raise Exception("Unexpected initial ApScan value: %d" % res)
|
|
|
|
for i in range(3):
|
|
if_obj.Set(WPAS_DBUS_IFACE, "ApScan", dbus.UInt32(i),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, "ApScan",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if res != i:
|
|
raise Exception("Unexpected ApScan value %d (expected %d)" % (res, i))
|
|
|
|
try:
|
|
if_obj.Set(WPAS_DBUS_IFACE, "ApScan", dbus.Int16(-1),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Set(ApScan,-1) accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: wrong property type" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Set(ApScan,-1): " + str(e))
|
|
|
|
try:
|
|
if_obj.Set(WPAS_DBUS_IFACE, "ApScan", dbus.UInt32(123),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Set(ApScan,123) accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: ap_scan must be 0, 1, or 2" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Set(ApScan,123): " + str(e))
|
|
|
|
if_obj.Set(WPAS_DBUS_IFACE, "ApScan", dbus.UInt32(1),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
|
|
def test_dbus_fastreauth(dev, apdev):
|
|
"""D-Bus Get/Set FastReauth"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, "FastReauth",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if res != True:
|
|
raise Exception("Unexpected initial FastReauth value: " + str(res))
|
|
|
|
for i in [ False, True ]:
|
|
if_obj.Set(WPAS_DBUS_IFACE, "FastReauth", dbus.Boolean(i),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, "FastReauth",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if res != i:
|
|
raise Exception("Unexpected FastReauth value %d (expected %d)" % (res, i))
|
|
|
|
try:
|
|
if_obj.Set(WPAS_DBUS_IFACE, "FastReauth", dbus.Int16(-1),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Set(FastReauth,-1) accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: wrong property type" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Set(ApScan,-1): " + str(e))
|
|
|
|
if_obj.Set(WPAS_DBUS_IFACE, "FastReauth", dbus.Boolean(True),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
|
|
def test_dbus_bss_expire(dev, apdev):
|
|
"""D-Bus Get/Set BSSExpireAge and BSSExpireCount"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
|
|
if_obj.Set(WPAS_DBUS_IFACE, "BSSExpireAge", dbus.UInt32(179),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, "BSSExpireAge",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if res != 179:
|
|
raise Exception("Unexpected BSSExpireAge value %d (expected %d)" % (res, i))
|
|
|
|
if_obj.Set(WPAS_DBUS_IFACE, "BSSExpireCount", dbus.UInt32(3),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, "BSSExpireCount",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if res != 3:
|
|
raise Exception("Unexpected BSSExpireCount value %d (expected %d)" % (res, i))
|
|
|
|
try:
|
|
if_obj.Set(WPAS_DBUS_IFACE, "BSSExpireAge", dbus.Int16(-1),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Set(BSSExpireAge,-1) accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: wrong property type" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Set(BSSExpireAge,-1): " + str(e))
|
|
|
|
try:
|
|
if_obj.Set(WPAS_DBUS_IFACE, "BSSExpireAge", dbus.UInt32(9),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Set(BSSExpireAge,9) accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: BSSExpireAge must be >= 10" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Set(BSSExpireAge,9): " + str(e))
|
|
|
|
try:
|
|
if_obj.Set(WPAS_DBUS_IFACE, "BSSExpireCount", dbus.Int16(-1),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Set(BSSExpireCount,-1) accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: wrong property type" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Set(BSSExpireCount,-1): " + str(e))
|
|
|
|
try:
|
|
if_obj.Set(WPAS_DBUS_IFACE, "BSSExpireCount", dbus.UInt32(0),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Set(BSSExpireCount,0) accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: BSSExpireCount must be > 0" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Set(BSSExpireCount,0): " + str(e))
|
|
|
|
if_obj.Set(WPAS_DBUS_IFACE, "BSSExpireAge", dbus.UInt32(180),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if_obj.Set(WPAS_DBUS_IFACE, "BSSExpireCount", dbus.UInt32(2),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
|
|
def test_dbus_country(dev, apdev):
|
|
"""D-Bus Get/Set Country"""
|
|
try:
|
|
_test_dbus_country(dev, apdev)
|
|
finally:
|
|
dev[0].request("SET country 00")
|
|
subprocess.call(['iw', 'reg', 'set', '00'])
|
|
|
|
def _test_dbus_country(dev, apdev):
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
|
|
# work around issues with possible pending regdom event from the end of
|
|
# the previous test case
|
|
time.sleep(0.2)
|
|
dev[0].dump_monitor()
|
|
|
|
if_obj.Set(WPAS_DBUS_IFACE, "Country", "FI",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, "Country",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if res != "FI":
|
|
raise Exception("Unexpected Country value %s (expected FI)" % res)
|
|
|
|
ev = dev[0].wait_event(["CTRL-EVENT-REGDOM-CHANGE"])
|
|
if ev is None:
|
|
raise Exception("regdom change event not seen")
|
|
if "init=USER type=COUNTRY alpha2=FI" not in ev:
|
|
raise Exception("Unexpected event contents: " + ev)
|
|
|
|
try:
|
|
if_obj.Set(WPAS_DBUS_IFACE, "Country", dbus.Int16(-1),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Set(Country,-1) accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: wrong property type" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Set(Country,-1): " + str(e))
|
|
|
|
try:
|
|
if_obj.Set(WPAS_DBUS_IFACE, "Country", "F",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Set(Country,F) accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: invalid country code" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Set(Country,F): " + str(e))
|
|
|
|
if_obj.Set(WPAS_DBUS_IFACE, "Country", "00",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
|
|
ev = dev[0].wait_event(["CTRL-EVENT-REGDOM-CHANGE"])
|
|
if ev is None:
|
|
raise Exception("regdom change event not seen")
|
|
if "init=CORE type=WORLD" not in ev:
|
|
raise Exception("Unexpected event contents: " + ev)
|
|
|
|
def test_dbus_scan_interval(dev, apdev):
|
|
"""D-Bus Get/Set ScanInterval"""
|
|
try:
|
|
_test_dbus_scan_interval(dev, apdev)
|
|
finally:
|
|
dev[0].request("SCAN_INTERVAL 5")
|
|
|
|
def _test_dbus_scan_interval(dev, apdev):
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
|
|
if_obj.Set(WPAS_DBUS_IFACE, "ScanInterval", dbus.Int32(3),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
res = if_obj.Get(WPAS_DBUS_IFACE, "ScanInterval",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if res != 3:
|
|
raise Exception("Unexpected ScanInterval value %d (expected %d)" % (res, i))
|
|
|
|
try:
|
|
if_obj.Set(WPAS_DBUS_IFACE, "ScanInterval", dbus.UInt16(100),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Set(ScanInterval,100) accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: wrong property type" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Set(ScanInterval,100): " + str(e))
|
|
|
|
try:
|
|
if_obj.Set(WPAS_DBUS_IFACE, "ScanInterval", dbus.Int32(-1),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Set(ScanInterval,-1) accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: scan_interval must be >= 0" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Set(ScanInterval,-1): " + str(e))
|
|
|
|
if_obj.Set(WPAS_DBUS_IFACE, "ScanInterval", dbus.Int32(5),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
|
|
def test_dbus_probe_req_reporting(dev, apdev):
|
|
"""D-Bus Probe Request reporting"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
iface = dbus.Interface(if_obj, WPAS_DBUS_IFACE)
|
|
|
|
dev[0].p2p_start_go(freq=2412)
|
|
dev[1].p2p_find(social=True)
|
|
|
|
class TestDbusProbe(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.reported = False
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_test)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.probeRequest, WPAS_DBUS_IFACE, "ProbeRequest",
|
|
byte_arrays=True)
|
|
iface.SubscribeProbeReq()
|
|
self.loop.run()
|
|
return self
|
|
|
|
def probeRequest(self, args):
|
|
logger.debug("probeRequest: args=%s" % str(args))
|
|
self.reported = True
|
|
self.loop.quit()
|
|
|
|
def run_test(self, *args):
|
|
logger.debug("run_test")
|
|
return False
|
|
|
|
def success(self):
|
|
return self.reported
|
|
|
|
with TestDbusProbe(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Expected signals not seen")
|
|
iface.UnsubscribeProbeReq()
|
|
|
|
try:
|
|
iface.UnsubscribeProbeReq()
|
|
raise Exception("Invalid UnsubscribeProbeReq() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "NoSubscription" not in str(e):
|
|
raise Exception("Unexpected error message for invalid UnsubscribeProbeReq(): " + str(e))
|
|
|
|
with TestDbusProbe(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Expected signals not seen")
|
|
# On purpose, leave ProbeReq subscription in place to test automatic
|
|
# cleanup.
|
|
|
|
dev[1].p2p_stop_find()
|
|
dev[0].remove_group()
|
|
|
|
def test_dbus_probe_req_reporting_oom(dev, apdev):
|
|
"""D-Bus Probe Request reporting (OOM)"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
iface = dbus.Interface(if_obj, WPAS_DBUS_IFACE)
|
|
|
|
with alloc_fail_dbus(dev[0], 1, "wpas_dbus_handler_subscribe_preq",
|
|
"SubscribeProbeReq"):
|
|
iface.SubscribeProbeReq()
|
|
|
|
def test_dbus_p2p_invalid(dev, apdev):
|
|
"""D-Bus invalid P2P operations"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
p2p = dbus.Interface(if_obj, WPAS_DBUS_IFACE_P2PDEVICE)
|
|
|
|
try:
|
|
p2p.RejectPeer(path + "/Peers/00112233445566")
|
|
raise Exception("Invalid RejectPeer accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "UnknownError: Failed to call wpas_p2p_reject" not in str(e):
|
|
raise Exception("Unexpected error message for invalid RejectPeer(): " + str(e))
|
|
|
|
try:
|
|
p2p.RejectPeer("/foo")
|
|
raise Exception("Invalid RejectPeer accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid RejectPeer(): " + str(e))
|
|
|
|
tests = [ {'DiscoveryType': 'foo'},
|
|
{'RequestedDeviceTypes': 'foo'},
|
|
{'RequestedDeviceTypes': ['foo']},
|
|
{'RequestedDeviceTypes': ['1','2','3','4','5','6','7','8','9',
|
|
'10','11','12','13','14','15','16',
|
|
'17']},
|
|
{'RequestedDeviceTypes': dbus.Array([], signature="s")},
|
|
{'RequestedDeviceTypes': dbus.Array([['foo']], signature="as")},
|
|
{'RequestedDeviceTypes': dbus.Array([], signature="i")},
|
|
{'RequestedDeviceTypes': [dbus.ByteArray('12345678'),
|
|
dbus.ByteArray('1234567')]},
|
|
{'Foo': dbus.Int16(1)},
|
|
{'Foo': dbus.UInt16(1)},
|
|
{'Foo': dbus.Int64(1)},
|
|
{'Foo': dbus.UInt64(1)},
|
|
{'Foo': dbus.Double(1.23)},
|
|
{'Foo': dbus.Signature('s')},
|
|
{'Foo': 'bar'}]
|
|
for t in tests:
|
|
try:
|
|
p2p.Find(dbus.Dictionary(t))
|
|
raise Exception("Invalid Find accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Find(): " + str(e))
|
|
|
|
for p in [ "/foo",
|
|
"/fi/w1/wpa_supplicant1/Interfaces/1234",
|
|
"/fi/w1/wpa_supplicant1/Interfaces/1234/Networks/1234" ]:
|
|
try:
|
|
p2p.RemovePersistentGroup(dbus.ObjectPath(p))
|
|
raise Exception("Invalid RemovePersistentGroup accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid RemovePersistentGroup: " + str(e))
|
|
|
|
try:
|
|
dev[0].request("P2P_SET disabled 1")
|
|
p2p.Listen(5)
|
|
raise Exception("Invalid Listen accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "UnknownError: Could not start P2P listen" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Listen: " + str(e))
|
|
finally:
|
|
dev[0].request("P2P_SET disabled 0")
|
|
|
|
test_obj = bus.get_object(WPAS_DBUS_SERVICE, path, introspect=False)
|
|
test_p2p = dbus.Interface(test_obj, WPAS_DBUS_IFACE_P2PDEVICE)
|
|
try:
|
|
test_p2p.Listen("foo")
|
|
raise Exception("Invalid Listen accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Listen: " + str(e))
|
|
|
|
try:
|
|
dev[0].request("P2P_SET disabled 1")
|
|
p2p.ExtendedListen(dbus.Dictionary({}))
|
|
raise Exception("Invalid ExtendedListen accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "UnknownError: failed to initiate a p2p_ext_listen" not in str(e):
|
|
raise Exception("Unexpected error message for invalid ExtendedListen: " + str(e))
|
|
finally:
|
|
dev[0].request("P2P_SET disabled 0")
|
|
|
|
try:
|
|
dev[0].request("P2P_SET disabled 1")
|
|
args = { 'duration1': 30000, 'interval1': 102400,
|
|
'duration2': 20000, 'interval2': 102400 }
|
|
p2p.PresenceRequest(args)
|
|
raise Exception("Invalid PresenceRequest accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "UnknownError: Failed to invoke presence request" not in str(e):
|
|
raise Exception("Unexpected error message for invalid PresenceRequest: " + str(e))
|
|
finally:
|
|
dev[0].request("P2P_SET disabled 0")
|
|
|
|
try:
|
|
params = dbus.Dictionary({'frequency': dbus.Int32(-1)})
|
|
p2p.GroupAdd(params)
|
|
raise Exception("Invalid GroupAdd accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid GroupAdd: " + str(e))
|
|
|
|
try:
|
|
params = dbus.Dictionary({'persistent_group_object':
|
|
dbus.ObjectPath(path),
|
|
'frequency': 2412})
|
|
p2p.GroupAdd(params)
|
|
raise Exception("Invalid GroupAdd accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid GroupAdd: " + str(e))
|
|
|
|
try:
|
|
p2p.Disconnect()
|
|
raise Exception("Invalid Disconnect accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "UnknownError: failed to disconnect" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Disconnect: " + str(e))
|
|
|
|
try:
|
|
dev[0].request("P2P_SET disabled 1")
|
|
p2p.Flush()
|
|
raise Exception("Invalid Flush accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: P2P is not available for this interface" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Flush: " + str(e))
|
|
finally:
|
|
dev[0].request("P2P_SET disabled 0")
|
|
|
|
try:
|
|
dev[0].request("P2P_SET disabled 1")
|
|
args = { 'peer': path,
|
|
'join': True,
|
|
'wps_method': 'pbc',
|
|
'frequency': 2412 }
|
|
pin = p2p.Connect(args)
|
|
raise Exception("Invalid Connect accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: P2P is not available for this interface" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Connect: " + str(e))
|
|
finally:
|
|
dev[0].request("P2P_SET disabled 0")
|
|
|
|
tests = [ { 'frequency': dbus.Int32(-1) },
|
|
{ 'wps_method': 'pbc' },
|
|
{ 'wps_method': 'foo' } ]
|
|
for args in tests:
|
|
try:
|
|
pin = p2p.Connect(args)
|
|
raise Exception("Invalid Connect accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Connect: " + str(e))
|
|
|
|
try:
|
|
dev[0].request("P2P_SET disabled 1")
|
|
args = { 'peer': path }
|
|
pin = p2p.Invite(args)
|
|
raise Exception("Invalid Invite accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: P2P is not available for this interface" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Invite: " + str(e))
|
|
finally:
|
|
dev[0].request("P2P_SET disabled 0")
|
|
|
|
try:
|
|
args = { 'foo': 'bar' }
|
|
pin = p2p.Invite(args)
|
|
raise Exception("Invalid Invite accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Connect: " + str(e))
|
|
|
|
tests = [ (path, 'display', "InvalidArgs"),
|
|
(dbus.ObjectPath(path + "/Peers/00112233445566"),
|
|
'display',
|
|
"UnknownError: Failed to send provision discovery request"),
|
|
(dbus.ObjectPath(path + "/Peers/00112233445566"),
|
|
'keypad',
|
|
"UnknownError: Failed to send provision discovery request"),
|
|
(dbus.ObjectPath(path + "/Peers/00112233445566"),
|
|
'pbc',
|
|
"UnknownError: Failed to send provision discovery request"),
|
|
(dbus.ObjectPath(path + "/Peers/00112233445566"),
|
|
'pushbutton',
|
|
"UnknownError: Failed to send provision discovery request"),
|
|
(dbus.ObjectPath(path + "/Peers/00112233445566"),
|
|
'foo', "InvalidArgs") ]
|
|
for (p,method,err) in tests:
|
|
try:
|
|
p2p.ProvisionDiscoveryRequest(p, method)
|
|
raise Exception("Invalid ProvisionDiscoveryRequest accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if err not in str(e):
|
|
raise Exception("Unexpected error message for invalid ProvisionDiscoveryRequest: " + str(e))
|
|
|
|
try:
|
|
dev[0].request("P2P_SET disabled 1")
|
|
if_obj.Get(WPAS_DBUS_IFACE_P2PDEVICE, "Peers",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Get(Peers) accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: P2P is not available for this interface" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Get(Peers): " + str(e))
|
|
finally:
|
|
dev[0].request("P2P_SET disabled 0")
|
|
|
|
def test_dbus_p2p_oom(dev, apdev):
|
|
"""D-Bus P2P operations and OOM"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
p2p = dbus.Interface(if_obj, WPAS_DBUS_IFACE_P2PDEVICE)
|
|
|
|
with alloc_fail_dbus(dev[0], 1, "_wpa_dbus_dict_entry_get_string_array",
|
|
"Find", "InvalidArgs"):
|
|
p2p.Find(dbus.Dictionary({ 'Foo': [ 'bar' ] }))
|
|
|
|
with alloc_fail_dbus(dev[0], 2, "_wpa_dbus_dict_entry_get_string_array",
|
|
"Find", "InvalidArgs"):
|
|
p2p.Find(dbus.Dictionary({ 'Foo': [ 'bar' ] }))
|
|
|
|
with alloc_fail_dbus(dev[0], 10, "_wpa_dbus_dict_entry_get_string_array",
|
|
"Find", "InvalidArgs"):
|
|
p2p.Find(dbus.Dictionary({ 'Foo': [ '1','2','3','4','5','6','7','8','9' ] }))
|
|
|
|
with alloc_fail_dbus(dev[0], 1, ":=_wpa_dbus_dict_entry_get_binarray",
|
|
"Find", "InvalidArgs"):
|
|
p2p.Find(dbus.Dictionary({ 'Foo': [ dbus.ByteArray('123') ] }))
|
|
|
|
with alloc_fail_dbus(dev[0], 1, "_wpa_dbus_dict_entry_get_byte_array;_wpa_dbus_dict_entry_get_binarray",
|
|
"Find", "InvalidArgs"):
|
|
p2p.Find(dbus.Dictionary({ 'Foo': [ dbus.ByteArray('123') ] }))
|
|
|
|
with alloc_fail_dbus(dev[0], 2, "=_wpa_dbus_dict_entry_get_binarray",
|
|
"Find", "InvalidArgs"):
|
|
p2p.Find(dbus.Dictionary({ 'Foo': [ dbus.ByteArray('123'),
|
|
dbus.ByteArray('123'),
|
|
dbus.ByteArray('123'),
|
|
dbus.ByteArray('123'),
|
|
dbus.ByteArray('123'),
|
|
dbus.ByteArray('123'),
|
|
dbus.ByteArray('123'),
|
|
dbus.ByteArray('123'),
|
|
dbus.ByteArray('123'),
|
|
dbus.ByteArray('123'),
|
|
dbus.ByteArray('123') ] }))
|
|
|
|
with alloc_fail_dbus(dev[0], 1, "wpabuf_alloc_ext_data;_wpa_dbus_dict_entry_get_binarray",
|
|
"Find", "InvalidArgs"):
|
|
p2p.Find(dbus.Dictionary({ 'Foo': [ dbus.ByteArray('123') ] }))
|
|
|
|
with alloc_fail_dbus(dev[0], 1, "_wpa_dbus_dict_fill_value_from_variant;wpas_dbus_handler_p2p_find",
|
|
"Find", "InvalidArgs"):
|
|
p2p.Find(dbus.Dictionary({ 'Foo': path }))
|
|
|
|
with alloc_fail_dbus(dev[0], 1, "_wpa_dbus_dict_entry_get_byte_array",
|
|
"AddService", "InvalidArgs"):
|
|
args = { 'service_type': 'bonjour',
|
|
'response': dbus.ByteArray(500*'b') }
|
|
p2p.AddService(args)
|
|
|
|
with alloc_fail_dbus(dev[0], 2, "_wpa_dbus_dict_entry_get_byte_array",
|
|
"AddService", "InvalidArgs"):
|
|
p2p.AddService(args)
|
|
|
|
def test_dbus_p2p_discovery(dev, apdev):
|
|
"""D-Bus P2P discovery"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
p2p = dbus.Interface(if_obj, WPAS_DBUS_IFACE_P2PDEVICE)
|
|
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
|
|
dev[1].request("SET sec_device_type 1-0050F204-2")
|
|
dev[1].request("VENDOR_ELEM_ADD 1 dd0c0050f2041049000411223344")
|
|
dev[1].p2p_listen()
|
|
addr1 = dev[1].p2p_dev_addr()
|
|
a1 = binascii.unhexlify(addr1.replace(':',''))
|
|
|
|
wfd_devinfo = "00001c440028"
|
|
dev[2].request("SET wifi_display 1")
|
|
dev[2].request("WFD_SUBELEM_SET 0 0006" + wfd_devinfo)
|
|
wfd = binascii.unhexlify('000006' + wfd_devinfo)
|
|
dev[2].p2p_listen()
|
|
addr2 = dev[2].p2p_dev_addr()
|
|
a2 = binascii.unhexlify(addr2.replace(':',''))
|
|
|
|
res = if_obj.GetAll(WPAS_DBUS_IFACE_P2PDEVICE,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if 'Peers' not in res:
|
|
raise Exception("GetAll result missing Peers")
|
|
if len(res['Peers']) != 0:
|
|
raise Exception("Unexpected peer(s) in the list")
|
|
|
|
args = {'DiscoveryType': 'social',
|
|
'RequestedDeviceTypes': [dbus.ByteArray('12345678')],
|
|
'Timeout': dbus.Int32(1) }
|
|
p2p.Find(dbus.Dictionary(args))
|
|
p2p.StopFind()
|
|
|
|
class TestDbusP2p(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.found = False
|
|
self.found2 = False
|
|
self.lost = False
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_test)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.deviceFound, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"DeviceFound")
|
|
self.add_signal(self.deviceLost, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"DeviceLost")
|
|
self.add_signal(self.provisionDiscoveryResponseEnterPin,
|
|
WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"ProvisionDiscoveryResponseEnterPin")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def deviceFound(self, path):
|
|
logger.debug("deviceFound: path=%s" % path)
|
|
res = if_obj.Get(WPAS_DBUS_IFACE_P2PDEVICE, "Peers",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if len(res) < 1:
|
|
raise Exception("Unexpected number of peers")
|
|
if path not in res:
|
|
raise Exception("Mismatch in peer object path")
|
|
peer_obj = bus.get_object(WPAS_DBUS_SERVICE, path)
|
|
res = peer_obj.GetAll(WPAS_DBUS_P2P_PEER,
|
|
dbus_interface=dbus.PROPERTIES_IFACE,
|
|
byte_arrays=True)
|
|
logger.debug("peer properties: " + str(res))
|
|
|
|
if res['DeviceAddress'] == a1:
|
|
if 'SecondaryDeviceTypes' not in res:
|
|
raise Exception("Missing SecondaryDeviceTypes")
|
|
sec = res['SecondaryDeviceTypes']
|
|
if len(sec) < 1:
|
|
raise Exception("Secondary device type missing")
|
|
if "\x00\x01\x00\x50\xF2\x04\x00\x02" not in sec:
|
|
raise Exception("Secondary device type mismatch")
|
|
|
|
if 'VendorExtension' not in res:
|
|
raise Exception("Missing VendorExtension")
|
|
vendor = res['VendorExtension']
|
|
if len(vendor) < 1:
|
|
raise Exception("Vendor extension missing")
|
|
if "\x11\x22\x33\x44" not in vendor:
|
|
raise Exception("Secondary device type mismatch")
|
|
|
|
self.found = True
|
|
elif res['DeviceAddress'] == a2:
|
|
if 'IEs' not in res:
|
|
raise Exception("IEs missing")
|
|
if res['IEs'] != wfd:
|
|
raise Exception("IEs mismatch")
|
|
self.found2 = True
|
|
else:
|
|
raise Exception("Unexpected peer device address")
|
|
|
|
if self.found and self.found2:
|
|
p2p.StopFind()
|
|
p2p.RejectPeer(path)
|
|
p2p.ProvisionDiscoveryRequest(path, 'display')
|
|
|
|
def deviceLost(self, path):
|
|
logger.debug("deviceLost: path=%s" % path)
|
|
self.lost = True
|
|
try:
|
|
p2p.RejectPeer(path)
|
|
raise Exception("Invalid RejectPeer accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "UnknownError: Failed to call wpas_p2p_reject" not in str(e):
|
|
raise Exception("Unexpected error message for invalid RejectPeer(): " + str(e))
|
|
self.loop.quit()
|
|
|
|
def provisionDiscoveryResponseEnterPin(self, peer_object):
|
|
logger.debug("provisionDiscoveryResponseEnterPin - peer=%s" % peer_object)
|
|
p2p.Flush()
|
|
|
|
def run_test(self, *args):
|
|
logger.debug("run_test")
|
|
p2p.Find(dbus.Dictionary({'DiscoveryType': 'social',
|
|
'Timeout': dbus.Int32(10)}))
|
|
return False
|
|
|
|
def success(self):
|
|
return self.found and self.lost and self.found2
|
|
|
|
with TestDbusP2p(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Expected signals not seen")
|
|
|
|
dev[1].request("VENDOR_ELEM_REMOVE 1 *")
|
|
dev[1].p2p_stop_find()
|
|
|
|
p2p.Listen(1)
|
|
dev[2].p2p_stop_find()
|
|
dev[2].request("P2P_FLUSH")
|
|
if not dev[2].discover_peer(addr0):
|
|
raise Exception("Peer not found")
|
|
p2p.StopFind()
|
|
dev[2].p2p_stop_find()
|
|
|
|
try:
|
|
p2p.ExtendedListen(dbus.Dictionary({'foo': 100}))
|
|
raise Exception("Invalid ExtendedListen accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid ExtendedListen(): " + str(e))
|
|
|
|
p2p.ExtendedListen(dbus.Dictionary({'period': 100, 'interval': 1000}))
|
|
p2p.ExtendedListen(dbus.Dictionary({}))
|
|
dev[0].global_request("P2P_EXT_LISTEN")
|
|
|
|
def test_dbus_p2p_service_discovery(dev, apdev):
|
|
"""D-Bus P2P service discovery"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
p2p = dbus.Interface(if_obj, WPAS_DBUS_IFACE_P2PDEVICE)
|
|
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
addr1 = dev[1].p2p_dev_addr()
|
|
|
|
bonjour_query = dbus.ByteArray(binascii.unhexlify('0b5f6166706f766572746370c00c000c01'))
|
|
bonjour_response = dbus.ByteArray(binascii.unhexlify('074578616d706c65c027'))
|
|
|
|
args = { 'service_type': 'bonjour',
|
|
'query': bonjour_query,
|
|
'response': bonjour_response }
|
|
p2p.AddService(args)
|
|
p2p.FlushService()
|
|
p2p.AddService(args)
|
|
|
|
try:
|
|
p2p.DeleteService(args)
|
|
raise Exception("Invalid DeleteService() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid DeleteService(): " + str(e))
|
|
|
|
args = { 'service_type': 'bonjour',
|
|
'query': bonjour_query }
|
|
p2p.DeleteService(args)
|
|
try:
|
|
p2p.DeleteService(args)
|
|
raise Exception("Invalid DeleteService() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid DeleteService(): " + str(e))
|
|
|
|
args = { 'service_type': 'upnp',
|
|
'version': 0x10,
|
|
'service': 'uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice' }
|
|
p2p.AddService(args)
|
|
p2p.DeleteService(args)
|
|
try:
|
|
p2p.DeleteService(args)
|
|
raise Exception("Invalid DeleteService() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid DeleteService(): " + str(e))
|
|
|
|
tests = [ { 'service_type': 'foo' },
|
|
{ 'service_type': 'foo', 'query': bonjour_query },
|
|
{ 'service_type': 'upnp' },
|
|
{ 'service_type': 'upnp', 'version': 0x10 },
|
|
{ 'service_type': 'upnp',
|
|
'service': 'uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice' },
|
|
{ 'version': 0x10,
|
|
'service': 'uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice' },
|
|
{ 'service_type': 'upnp', 'foo': 'bar' },
|
|
{ 'service_type': 'bonjour' },
|
|
{ 'service_type': 'bonjour', 'query': 'foo' },
|
|
{ 'service_type': 'bonjour', 'foo': 'bar' } ]
|
|
for args in tests:
|
|
try:
|
|
p2p.DeleteService(args)
|
|
raise Exception("Invalid DeleteService() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid DeleteService(): " + str(e))
|
|
|
|
tests = [ { 'service_type': 'foo' },
|
|
{ 'service_type': 'upnp' },
|
|
{ 'service_type': 'upnp', 'version': 0x10 },
|
|
{ 'service_type': 'upnp',
|
|
'service': 'uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice' },
|
|
{ 'version': 0x10,
|
|
'service': 'uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice' },
|
|
{ 'service_type': 'upnp', 'foo': 'bar' },
|
|
{ 'service_type': 'bonjour' },
|
|
{ 'service_type': 'bonjour', 'query': 'foo' },
|
|
{ 'service_type': 'bonjour', 'response': 'foo' },
|
|
{ 'service_type': 'bonjour', 'query': bonjour_query },
|
|
{ 'service_type': 'bonjour', 'response': bonjour_response },
|
|
{ 'service_type': 'bonjour', 'query': dbus.ByteArray(500*'a') },
|
|
{ 'service_type': 'bonjour', 'foo': 'bar' } ]
|
|
for args in tests:
|
|
try:
|
|
p2p.AddService(args)
|
|
raise Exception("Invalid AddService() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid AddService(): " + str(e))
|
|
|
|
args = { 'tlv': dbus.ByteArray("\x02\x00\x00\x01") }
|
|
ref = p2p.ServiceDiscoveryRequest(args)
|
|
p2p.ServiceDiscoveryCancelRequest(ref)
|
|
try:
|
|
p2p.ServiceDiscoveryCancelRequest(ref)
|
|
raise Exception("Invalid ServiceDiscoveryCancelRequest() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid AddService(): " + str(e))
|
|
try:
|
|
p2p.ServiceDiscoveryCancelRequest(dbus.UInt64(0))
|
|
raise Exception("Invalid ServiceDiscoveryCancelRequest() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid AddService(): " + str(e))
|
|
|
|
args = { 'service_type': 'upnp',
|
|
'version': 0x10,
|
|
'service': 'ssdp:foo' }
|
|
ref = p2p.ServiceDiscoveryRequest(args)
|
|
p2p.ServiceDiscoveryCancelRequest(ref)
|
|
|
|
tests = [ { 'service_type': 'foo' },
|
|
{ 'foo': 'bar' },
|
|
{ 'tlv': 'foo' },
|
|
{ },
|
|
{ 'version': 0 },
|
|
{ 'service_type': 'upnp',
|
|
'service': 'ssdp:foo' },
|
|
{ 'service_type': 'upnp',
|
|
'version': 0x10 },
|
|
{ 'service_type': 'upnp',
|
|
'version': 0x10,
|
|
'service': 'ssdp:foo',
|
|
'peer_object': dbus.ObjectPath(path + "/Peers") },
|
|
{ 'service_type': 'upnp',
|
|
'version': 0x10,
|
|
'service': 'ssdp:foo',
|
|
'peer_object': path + "/Peers" },
|
|
{ 'service_type': 'upnp',
|
|
'version': 0x10,
|
|
'service': 'ssdp:foo',
|
|
'peer_object': dbus.ObjectPath(path + "/Peers/00112233445566") } ]
|
|
for args in tests:
|
|
try:
|
|
p2p.ServiceDiscoveryRequest(args)
|
|
raise Exception("Invalid ServiceDiscoveryRequest accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid ServiceDiscoveryRequest(): " + str(e))
|
|
|
|
args = { 'foo': 'bar' }
|
|
try:
|
|
p2p.ServiceDiscoveryResponse(dbus.Dictionary(args, signature='sv'))
|
|
raise Exception("Invalid ServiceDiscoveryResponse accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid ServiceDiscoveryResponse(): " + str(e))
|
|
|
|
def test_dbus_p2p_service_discovery_query(dev, apdev):
|
|
"""D-Bus P2P service discovery query"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
p2p = dbus.Interface(if_obj, WPAS_DBUS_IFACE_P2PDEVICE)
|
|
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
dev[1].request("P2P_SERVICE_ADD bonjour 0b5f6166706f766572746370c00c000c01 074578616d706c65c027")
|
|
dev[1].p2p_listen()
|
|
addr1 = dev[1].p2p_dev_addr()
|
|
|
|
class TestDbusP2p(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.done = False
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_test)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.deviceFound, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"DeviceFound")
|
|
self.add_signal(self.serviceDiscoveryResponse,
|
|
WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"ServiceDiscoveryResponse", byte_arrays=True)
|
|
self.loop.run()
|
|
return self
|
|
|
|
def deviceFound(self, path):
|
|
logger.debug("deviceFound: path=%s" % path)
|
|
args = { 'peer_object': path,
|
|
'tlv': dbus.ByteArray("\x02\x00\x00\x01") }
|
|
p2p.ServiceDiscoveryRequest(args)
|
|
|
|
def serviceDiscoveryResponse(self, sd_request):
|
|
logger.debug("serviceDiscoveryResponse: sd_request=%s" % str(sd_request))
|
|
self.done = True
|
|
self.loop.quit()
|
|
|
|
def run_test(self, *args):
|
|
logger.debug("run_test")
|
|
p2p.Find(dbus.Dictionary({'DiscoveryType': 'social',
|
|
'Timeout': dbus.Int32(10)}))
|
|
return False
|
|
|
|
def success(self):
|
|
return self.done
|
|
|
|
with TestDbusP2p(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Expected signals not seen")
|
|
|
|
dev[1].p2p_stop_find()
|
|
|
|
def test_dbus_p2p_service_discovery_external(dev, apdev):
|
|
"""D-Bus P2P service discovery with external response"""
|
|
try:
|
|
_test_dbus_p2p_service_discovery_external(dev, apdev)
|
|
finally:
|
|
dev[0].request("P2P_SERV_DISC_EXTERNAL 0")
|
|
|
|
def _test_dbus_p2p_service_discovery_external(dev, apdev):
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
p2p = dbus.Interface(if_obj, WPAS_DBUS_IFACE_P2PDEVICE)
|
|
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
addr1 = dev[1].p2p_dev_addr()
|
|
resp = "0300000101"
|
|
|
|
dev[1].request("P2P_FLUSH")
|
|
dev[1].request("P2P_SERV_DISC_REQ " + addr0 + " 02000001")
|
|
dev[1].p2p_find(social=True)
|
|
|
|
class TestDbusP2p(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.sd = False
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_test)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.deviceFound, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"DeviceFound")
|
|
self.add_signal(self.serviceDiscoveryRequest,
|
|
WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"ServiceDiscoveryRequest")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def deviceFound(self, path):
|
|
logger.debug("deviceFound: path=%s" % path)
|
|
|
|
def serviceDiscoveryRequest(self, sd_request):
|
|
logger.debug("serviceDiscoveryRequest: sd_request=%s" % str(sd_request))
|
|
self.sd = True
|
|
args = { 'peer_object': sd_request['peer_object'],
|
|
'frequency': sd_request['frequency'],
|
|
'dialog_token': sd_request['dialog_token'],
|
|
'tlvs': dbus.ByteArray(binascii.unhexlify(resp)) }
|
|
p2p.ServiceDiscoveryResponse(dbus.Dictionary(args, signature='sv'))
|
|
self.loop.quit()
|
|
|
|
def run_test(self, *args):
|
|
logger.debug("run_test")
|
|
p2p.ServiceDiscoveryExternal(1)
|
|
p2p.ServiceUpdate()
|
|
p2p.Listen(15)
|
|
return False
|
|
|
|
def success(self):
|
|
return self.sd
|
|
|
|
with TestDbusP2p(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Expected signals not seen")
|
|
|
|
ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=5)
|
|
if ev is None:
|
|
raise Exception("Service discovery timed out")
|
|
if addr0 not in ev:
|
|
raise Exception("Unexpected address in SD Response: " + ev)
|
|
if ev.split(' ')[4] != resp:
|
|
raise Exception("Unexpected response data SD Response: " + ev)
|
|
dev[1].p2p_stop_find()
|
|
|
|
p2p.StopFind()
|
|
p2p.ServiceDiscoveryExternal(0)
|
|
|
|
def test_dbus_p2p_autogo(dev, apdev):
|
|
"""D-Bus P2P autonomous GO"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
p2p = dbus.Interface(if_obj, WPAS_DBUS_IFACE_P2PDEVICE)
|
|
wps = dbus.Interface(if_obj, WPAS_DBUS_IFACE_WPS)
|
|
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
|
|
class TestDbusP2p(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.first = True
|
|
self.waiting_end = False
|
|
self.done = False
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_test)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.deviceFound, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"DeviceFound")
|
|
self.add_signal(self.groupStarted, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GroupStarted")
|
|
self.add_signal(self.groupFinished, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GroupFinished")
|
|
self.add_signal(self.persistentGroupAdded,
|
|
WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"PersistentGroupAdded")
|
|
self.add_signal(self.persistentGroupRemoved,
|
|
WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"PersistentGroupRemoved")
|
|
self.add_signal(self.provisionDiscoveryRequestDisplayPin,
|
|
WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"ProvisionDiscoveryRequestDisplayPin")
|
|
self.add_signal(self.staAuthorized, WPAS_DBUS_IFACE,
|
|
"StaAuthorized")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def groupStarted(self, properties):
|
|
logger.debug("groupStarted: " + str(properties))
|
|
self.group = properties['group_object']
|
|
role = if_obj.Get(WPAS_DBUS_IFACE_P2PDEVICE, "Role",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if role != "GO":
|
|
raise Exception("Unexpected role reported: " + role)
|
|
group = if_obj.Get(WPAS_DBUS_IFACE_P2PDEVICE, "Group",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if group != properties['group_object']:
|
|
raise Exception("Unexpected Group reported: " + str(group))
|
|
go = if_obj.Get(WPAS_DBUS_IFACE_P2PDEVICE, "PeerGO",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if go != '/':
|
|
raise Exception("Unexpected PeerGO value: " + str(go))
|
|
if self.first:
|
|
self.first = False
|
|
logger.info("Remove persistent group instance")
|
|
p2p.Disconnect()
|
|
else:
|
|
dev1 = WpaSupplicant('wlan1', '/tmp/wpas-wlan1')
|
|
dev1.global_request("P2P_CONNECT " + addr0 + " 12345670 join")
|
|
|
|
def groupFinished(self, properties):
|
|
logger.debug("groupFinished: " + str(properties))
|
|
if self.waiting_end:
|
|
logger.info("Remove persistent group")
|
|
p2p.RemovePersistentGroup(self.persistent)
|
|
else:
|
|
logger.info("Re-start persistent group")
|
|
params = dbus.Dictionary({'persistent_group_object':
|
|
self.persistent,
|
|
'frequency': 2412})
|
|
p2p.GroupAdd(params)
|
|
|
|
def persistentGroupAdded(self, path, properties):
|
|
logger.debug("persistentGroupAdded: %s %s" % (path, str(properties)))
|
|
self.persistent = path
|
|
|
|
def persistentGroupRemoved(self, path):
|
|
logger.debug("persistentGroupRemoved: %s" % path)
|
|
self.done = True
|
|
self.loop.quit()
|
|
|
|
def deviceFound(self, path):
|
|
logger.debug("deviceFound: path=%s" % path)
|
|
peer_obj = bus.get_object(WPAS_DBUS_SERVICE, path)
|
|
self.peer = peer_obj.GetAll(WPAS_DBUS_P2P_PEER,
|
|
dbus_interface=dbus.PROPERTIES_IFACE,
|
|
byte_arrays=True)
|
|
logger.debug('peer properties: ' + str(self.peer))
|
|
|
|
def provisionDiscoveryRequestDisplayPin(self, peer_object, pin):
|
|
logger.debug("provisionDiscoveryRequestDisplayPin - peer=%s pin=%s" % (peer_object, pin))
|
|
self.peer_path = peer_object
|
|
peer = binascii.unhexlify(peer_object.split('/')[-1])
|
|
addr = ""
|
|
for p in peer:
|
|
if len(addr) > 0:
|
|
addr += ':'
|
|
addr += '%02x' % ord(p)
|
|
|
|
params = { 'Role': 'registrar',
|
|
'P2PDeviceAddress': self.peer['DeviceAddress'],
|
|
'Bssid': self.peer['DeviceAddress'],
|
|
'Type': 'pin' }
|
|
try:
|
|
wps.Start(params)
|
|
raise Exception("Invalid WPS.Start() accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message: " + str(e))
|
|
params = { 'Role': 'registrar',
|
|
'P2PDeviceAddress': self.peer['DeviceAddress'],
|
|
'Bssid': self.peer['DeviceAddress'],
|
|
'Type': 'pin',
|
|
'Pin': '12345670' }
|
|
logger.info("Authorize peer to connect to the group")
|
|
wps.Start(params)
|
|
|
|
def staAuthorized(self, name):
|
|
logger.debug("staAuthorized: " + name)
|
|
peer_obj = bus.get_object(WPAS_DBUS_SERVICE, self.peer_path)
|
|
res = peer_obj.GetAll(WPAS_DBUS_P2P_PEER,
|
|
dbus_interface=dbus.PROPERTIES_IFACE,
|
|
byte_arrays=True)
|
|
if 'Groups' not in res or len(res['Groups']) != 1:
|
|
raise Exception("Unexpected number of peer Groups entries")
|
|
if res['Groups'][0] != self.group:
|
|
raise Exception("Unexpected peer Groups[0] value")
|
|
|
|
g_obj = bus.get_object(WPAS_DBUS_SERVICE, self.group)
|
|
res = g_obj.GetAll(WPAS_DBUS_GROUP,
|
|
dbus_interface=dbus.PROPERTIES_IFACE,
|
|
byte_arrays=True)
|
|
logger.debug("Group properties: " + str(res))
|
|
if 'Members' not in res or len(res['Members']) != 1:
|
|
raise Exception("Unexpected number of group members")
|
|
|
|
ext = dbus.ByteArray("\x11\x22\x33\x44")
|
|
# Earlier implementation of this interface was a bit strange. The
|
|
# property is defined to have aay signature and that is what the
|
|
# getter returned. However, the setter expected there to be a
|
|
# dictionary with 'WPSVendorExtensions' as the key surrounding these
|
|
# values.. The current implementations maintains support for that
|
|
# for backwards compability reasons. Verify that encoding first.
|
|
vals = dbus.Dictionary({ 'WPSVendorExtensions': [ ext ]},
|
|
signature='sv')
|
|
g_obj.Set(WPAS_DBUS_GROUP, 'WPSVendorExtensions', vals,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
res = g_obj.Get(WPAS_DBUS_GROUP, 'WPSVendorExtensions',
|
|
dbus_interface=dbus.PROPERTIES_IFACE,
|
|
byte_arrays=True)
|
|
if len(res) != 1:
|
|
raise Exception("Unexpected number of vendor extensions")
|
|
if res[0] != ext:
|
|
raise Exception("Vendor extension value changed")
|
|
|
|
# And now verify that the more appropriate encoding is accepted as
|
|
# well.
|
|
res.append(dbus.ByteArray('\xaa\xbb\xcc\xdd\xee\xff'))
|
|
g_obj.Set(WPAS_DBUS_GROUP, 'WPSVendorExtensions', res,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
res2 = g_obj.Get(WPAS_DBUS_GROUP, 'WPSVendorExtensions',
|
|
dbus_interface=dbus.PROPERTIES_IFACE,
|
|
byte_arrays=True)
|
|
if len(res) != 2:
|
|
raise Exception("Unexpected number of vendor extensions")
|
|
if res[0] != res2[0] or res[1] != res2[1]:
|
|
raise Exception("Vendor extension value changed")
|
|
|
|
for i in range(10):
|
|
res.append(dbus.ByteArray('\xaa\xbb'))
|
|
try:
|
|
g_obj.Set(WPAS_DBUS_GROUP, 'WPSVendorExtensions', res,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Set(WPSVendorExtensions) accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Set(WPSVendorExtensions): " + str(e))
|
|
|
|
vals = dbus.Dictionary({ 'Foo': [ ext ]}, signature='sv')
|
|
try:
|
|
g_obj.Set(WPAS_DBUS_GROUP, 'WPSVendorExtensions', vals,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Set(WPSVendorExtensions) accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Set(WPSVendorExtensions): " + str(e))
|
|
|
|
vals = [ "foo" ]
|
|
try:
|
|
g_obj.Set(WPAS_DBUS_GROUP, 'WPSVendorExtensions', vals,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Set(WPSVendorExtensions) accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Set(WPSVendorExtensions): " + str(e))
|
|
|
|
vals = [ [ "foo" ] ]
|
|
try:
|
|
g_obj.Set(WPAS_DBUS_GROUP, 'WPSVendorExtensions', vals,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Set(WPSVendorExtensions) accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Set(WPSVendorExtensions): " + str(e))
|
|
|
|
self.waiting_end = True
|
|
p2p.Disconnect()
|
|
|
|
def run_test(self, *args):
|
|
logger.debug("run_test")
|
|
params = dbus.Dictionary({'persistent': True,
|
|
'frequency': 2412})
|
|
logger.info("Add a persistent group")
|
|
p2p.GroupAdd(params)
|
|
return False
|
|
|
|
def success(self):
|
|
return self.done
|
|
|
|
with TestDbusP2p(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Expected signals not seen")
|
|
|
|
dev[1].wait_go_ending_session()
|
|
|
|
def test_dbus_p2p_autogo_pbc(dev, apdev):
|
|
"""D-Bus P2P autonomous GO and PBC"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
p2p = dbus.Interface(if_obj, WPAS_DBUS_IFACE_P2PDEVICE)
|
|
wps = dbus.Interface(if_obj, WPAS_DBUS_IFACE_WPS)
|
|
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
|
|
class TestDbusP2p(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.first = True
|
|
self.waiting_end = False
|
|
self.done = False
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_test)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.deviceFound, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"DeviceFound")
|
|
self.add_signal(self.groupStarted, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GroupStarted")
|
|
self.add_signal(self.groupFinished, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GroupFinished")
|
|
self.add_signal(self.provisionDiscoveryPBCRequest,
|
|
WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"ProvisionDiscoveryPBCRequest")
|
|
self.add_signal(self.staAuthorized, WPAS_DBUS_IFACE,
|
|
"StaAuthorized")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def groupStarted(self, properties):
|
|
logger.debug("groupStarted: " + str(properties))
|
|
self.group = properties['group_object']
|
|
dev1 = WpaSupplicant('wlan1', '/tmp/wpas-wlan1')
|
|
dev1.global_request("P2P_CONNECT " + addr0 + " pbc join")
|
|
|
|
def groupFinished(self, properties):
|
|
logger.debug("groupFinished: " + str(properties))
|
|
self.done = True
|
|
self.loop.quit()
|
|
|
|
def deviceFound(self, path):
|
|
logger.debug("deviceFound: path=%s" % path)
|
|
peer_obj = bus.get_object(WPAS_DBUS_SERVICE, path)
|
|
self.peer = peer_obj.GetAll(WPAS_DBUS_P2P_PEER,
|
|
dbus_interface=dbus.PROPERTIES_IFACE,
|
|
byte_arrays=True)
|
|
logger.debug('peer properties: ' + str(self.peer))
|
|
|
|
def provisionDiscoveryPBCRequest(self, peer_object):
|
|
logger.debug("provisionDiscoveryPBCRequest - peer=%s" % peer_object)
|
|
self.peer_path = peer_object
|
|
peer = binascii.unhexlify(peer_object.split('/')[-1])
|
|
addr = ""
|
|
for p in peer:
|
|
if len(addr) > 0:
|
|
addr += ':'
|
|
addr += '%02x' % ord(p)
|
|
params = { 'Role': 'registrar',
|
|
'P2PDeviceAddress': self.peer['DeviceAddress'],
|
|
'Bssid': self.peer['DeviceAddress'],
|
|
'Type': 'pbc' }
|
|
logger.info("Authorize peer to connect to the group")
|
|
wps.Start(params)
|
|
|
|
def staAuthorized(self, name):
|
|
logger.debug("staAuthorized: " + name)
|
|
p2p.Disconnect()
|
|
|
|
def run_test(self, *args):
|
|
logger.debug("run_test")
|
|
params = dbus.Dictionary({'frequency': 2412})
|
|
p2p.GroupAdd(params)
|
|
return False
|
|
|
|
def success(self):
|
|
return self.done
|
|
|
|
with TestDbusP2p(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Expected signals not seen")
|
|
|
|
dev[1].wait_go_ending_session()
|
|
dev[1].flush_scan_cache()
|
|
|
|
def test_dbus_p2p_autogo_legacy(dev, apdev):
|
|
"""D-Bus P2P autonomous GO and legacy STA"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
p2p = dbus.Interface(if_obj, WPAS_DBUS_IFACE_P2PDEVICE)
|
|
wps = dbus.Interface(if_obj, WPAS_DBUS_IFACE_WPS)
|
|
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
|
|
class TestDbusP2p(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.done = False
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_test)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.groupStarted, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GroupStarted")
|
|
self.add_signal(self.groupFinished, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GroupFinished")
|
|
self.add_signal(self.staAuthorized, WPAS_DBUS_IFACE,
|
|
"StaAuthorized")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def groupStarted(self, properties):
|
|
logger.debug("groupStarted: " + str(properties))
|
|
pin = '12345670'
|
|
params = { 'Role': 'enrollee',
|
|
'Type': 'pin',
|
|
'Pin': pin }
|
|
wps.Start(params)
|
|
dev1 = WpaSupplicant('wlan1', '/tmp/wpas-wlan1')
|
|
dev1.scan_for_bss(addr0, freq=2412)
|
|
dev1.request("WPS_PIN " + addr0 + " " + pin)
|
|
|
|
def groupFinished(self, properties):
|
|
logger.debug("groupFinished: " + str(properties))
|
|
self.done = True
|
|
self.loop.quit()
|
|
|
|
def staAuthorized(self, name):
|
|
logger.debug("staAuthorized: " + name)
|
|
dev1 = WpaSupplicant('wlan1', '/tmp/wpas-wlan1')
|
|
dev1.request("DISCONNECT")
|
|
p2p.Disconnect()
|
|
|
|
def run_test(self, *args):
|
|
logger.debug("run_test")
|
|
params = dbus.Dictionary({'frequency': 2412})
|
|
p2p.GroupAdd(params)
|
|
return False
|
|
|
|
def success(self):
|
|
return self.done
|
|
|
|
with TestDbusP2p(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Expected signals not seen")
|
|
|
|
def test_dbus_p2p_join(dev, apdev):
|
|
"""D-Bus P2P join an autonomous GO"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
p2p = dbus.Interface(if_obj, WPAS_DBUS_IFACE_P2PDEVICE)
|
|
|
|
addr1 = dev[1].p2p_dev_addr()
|
|
addr2 = dev[2].p2p_dev_addr()
|
|
dev[1].p2p_start_go(freq=2412)
|
|
dev[2].p2p_listen()
|
|
|
|
class TestDbusP2p(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.done = False
|
|
self.peer = None
|
|
self.go = None
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_test)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.deviceFound, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"DeviceFound")
|
|
self.add_signal(self.groupStarted, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GroupStarted")
|
|
self.add_signal(self.groupFinished, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GroupFinished")
|
|
self.add_signal(self.invitationResult, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"InvitationResult")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def deviceFound(self, path):
|
|
logger.debug("deviceFound: path=%s" % path)
|
|
peer_obj = bus.get_object(WPAS_DBUS_SERVICE, path)
|
|
res = peer_obj.GetAll(WPAS_DBUS_P2P_PEER,
|
|
dbus_interface=dbus.PROPERTIES_IFACE,
|
|
byte_arrays=True)
|
|
logger.debug('peer properties: ' + str(res))
|
|
if addr2.replace(':','') in path:
|
|
self.peer = path
|
|
elif addr1.replace(':','') in path:
|
|
self.go = path
|
|
if self.peer and self.go:
|
|
logger.info("Join the group")
|
|
p2p.StopFind()
|
|
args = { 'peer': self.go,
|
|
'join': True,
|
|
'wps_method': 'pin',
|
|
'frequency': 2412 }
|
|
pin = p2p.Connect(args)
|
|
|
|
dev1 = WpaSupplicant('wlan1', '/tmp/wpas-wlan1')
|
|
dev1.request("WPS_PIN any " + pin)
|
|
|
|
def groupStarted(self, properties):
|
|
logger.debug("groupStarted: " + str(properties))
|
|
role = if_obj.Get(WPAS_DBUS_IFACE_P2PDEVICE, "Role",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if role != "client":
|
|
raise Exception("Unexpected role reported: " + role)
|
|
group = if_obj.Get(WPAS_DBUS_IFACE_P2PDEVICE, "Group",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if group != properties['group_object']:
|
|
raise Exception("Unexpected Group reported: " + str(group))
|
|
go = if_obj.Get(WPAS_DBUS_IFACE_P2PDEVICE, "PeerGO",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if go != self.go:
|
|
raise Exception("Unexpected PeerGO value: " + str(go))
|
|
|
|
g_obj = bus.get_object(WPAS_DBUS_SERVICE,
|
|
properties['group_object'])
|
|
res = g_obj.GetAll(WPAS_DBUS_GROUP,
|
|
dbus_interface=dbus.PROPERTIES_IFACE,
|
|
byte_arrays=True)
|
|
logger.debug("Group properties: " + str(res))
|
|
|
|
ext = dbus.ByteArray("\x11\x22\x33\x44")
|
|
try:
|
|
# Set(WPSVendorExtensions) not allowed for P2P Client
|
|
g_obj.Set(WPAS_DBUS_GROUP, 'WPSVendorExtensions', res,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Set(WPSVendorExtensions) accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: Failed to set property" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Set(WPSVendorExtensions): " + str(e))
|
|
|
|
args = { 'duration1': 30000, 'interval1': 102400,
|
|
'duration2': 20000, 'interval2': 102400 }
|
|
p2p.PresenceRequest(args)
|
|
|
|
args = { 'peer': self.peer }
|
|
p2p.Invite(args)
|
|
|
|
def groupFinished(self, properties):
|
|
logger.debug("groupFinished: " + str(properties))
|
|
self.done = True
|
|
self.loop.quit()
|
|
|
|
def invitationResult(self, result):
|
|
logger.debug("invitationResult: " + str(result))
|
|
if result['status'] != 1:
|
|
raise Exception("Unexpected invitation result: " + str(result))
|
|
dev1 = WpaSupplicant('wlan1', '/tmp/wpas-wlan1')
|
|
dev1.remove_group()
|
|
|
|
def run_test(self, *args):
|
|
logger.debug("run_test")
|
|
p2p.Find(dbus.Dictionary({'DiscoveryType': 'social'}))
|
|
return False
|
|
|
|
def success(self):
|
|
return self.done
|
|
|
|
with TestDbusP2p(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Expected signals not seen")
|
|
|
|
dev[2].p2p_stop_find()
|
|
|
|
def test_dbus_p2p_config(dev, apdev):
|
|
"""D-Bus Get/Set P2PDeviceConfig"""
|
|
try:
|
|
_test_dbus_p2p_config(dev, apdev)
|
|
finally:
|
|
dev[0].request("P2P_SET ssid_postfix ")
|
|
|
|
def _test_dbus_p2p_config(dev, apdev):
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
p2p = dbus.Interface(if_obj, WPAS_DBUS_IFACE_P2PDEVICE)
|
|
|
|
res = if_obj.Get(WPAS_DBUS_IFACE_P2PDEVICE, "P2PDeviceConfig",
|
|
dbus_interface=dbus.PROPERTIES_IFACE,
|
|
byte_arrays=True)
|
|
if_obj.Set(WPAS_DBUS_IFACE_P2PDEVICE, "P2PDeviceConfig", res,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
res2 = if_obj.Get(WPAS_DBUS_IFACE_P2PDEVICE, "P2PDeviceConfig",
|
|
dbus_interface=dbus.PROPERTIES_IFACE,
|
|
byte_arrays=True)
|
|
|
|
if len(res) != len(res2):
|
|
raise Exception("Different number of parameters")
|
|
for k in res:
|
|
if res[k] != res2[k]:
|
|
raise Exception("Parameter %s value changes" % k)
|
|
|
|
changes = { 'SsidPostfix': 'foo',
|
|
'VendorExtension': [ dbus.ByteArray('\x11\x22\x33\x44') ],
|
|
'SecondaryDeviceTypes': [ dbus.ByteArray('\x11\x22\x33\x44\x55\x66\x77\x88') ]}
|
|
if_obj.Set(WPAS_DBUS_IFACE_P2PDEVICE, "P2PDeviceConfig",
|
|
dbus.Dictionary(changes, signature='sv'),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
|
|
res2 = if_obj.Get(WPAS_DBUS_IFACE_P2PDEVICE, "P2PDeviceConfig",
|
|
dbus_interface=dbus.PROPERTIES_IFACE,
|
|
byte_arrays=True)
|
|
logger.debug("P2PDeviceConfig: " + str(res2))
|
|
if 'VendorExtension' not in res2 or len(res2['VendorExtension']) != 1:
|
|
raise Exception("VendorExtension does not match")
|
|
if 'SecondaryDeviceTypes' not in res2 or len(res2['SecondaryDeviceTypes']) != 1:
|
|
raise Exception("SecondaryDeviceType does not match")
|
|
|
|
changes = { 'SsidPostfix': '',
|
|
'VendorExtension': dbus.Array([], signature="ay"),
|
|
'SecondaryDeviceTypes': dbus.Array([], signature="ay") }
|
|
if_obj.Set(WPAS_DBUS_IFACE_P2PDEVICE, "P2PDeviceConfig",
|
|
dbus.Dictionary(changes, signature='sv'),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
|
|
res3 = if_obj.Get(WPAS_DBUS_IFACE_P2PDEVICE, "P2PDeviceConfig",
|
|
dbus_interface=dbus.PROPERTIES_IFACE,
|
|
byte_arrays=True)
|
|
logger.debug("P2PDeviceConfig: " + str(res3))
|
|
if 'VendorExtension' in res3:
|
|
raise Exception("VendorExtension not removed")
|
|
if 'SecondaryDeviceTypes' in res3:
|
|
raise Exception("SecondaryDeviceType not removed")
|
|
|
|
try:
|
|
dev[0].request("P2P_SET disabled 1")
|
|
if_obj.Get(WPAS_DBUS_IFACE_P2PDEVICE, "P2PDeviceConfig",
|
|
dbus_interface=dbus.PROPERTIES_IFACE,
|
|
byte_arrays=True)
|
|
raise Exception("Invalid Get(P2PDeviceConfig) accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: P2P is not available for this interface" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Invite: " + str(e))
|
|
finally:
|
|
dev[0].request("P2P_SET disabled 0")
|
|
|
|
try:
|
|
dev[0].request("P2P_SET disabled 1")
|
|
changes = { 'SsidPostfix': 'foo' }
|
|
if_obj.Set(WPAS_DBUS_IFACE_P2PDEVICE, "P2PDeviceConfig",
|
|
dbus.Dictionary(changes, signature='sv'),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Set(P2PDeviceConfig) accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "Error.Failed: P2P is not available for this interface" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Invite: " + str(e))
|
|
finally:
|
|
dev[0].request("P2P_SET disabled 0")
|
|
|
|
tests = [ { 'DeviceName': 123 },
|
|
{ 'SsidPostfix': 123 },
|
|
{ 'Foo': 'Bar' } ]
|
|
for changes in tests:
|
|
try:
|
|
if_obj.Set(WPAS_DBUS_IFACE_P2PDEVICE, "P2PDeviceConfig",
|
|
dbus.Dictionary(changes, signature='sv'),
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
raise Exception("Invalid Set(P2PDeviceConfig) accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Invite: " + str(e))
|
|
|
|
def test_dbus_p2p_persistent(dev, apdev):
|
|
"""D-Bus P2P persistent group"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
p2p = dbus.Interface(if_obj, WPAS_DBUS_IFACE_P2PDEVICE)
|
|
|
|
class TestDbusP2p(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_test)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.groupStarted, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GroupStarted")
|
|
self.add_signal(self.groupFinished, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GroupFinished")
|
|
self.add_signal(self.persistentGroupAdded,
|
|
WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"PersistentGroupAdded")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def groupStarted(self, properties):
|
|
logger.debug("groupStarted: " + str(properties))
|
|
p2p.Disconnect()
|
|
|
|
def groupFinished(self, properties):
|
|
logger.debug("groupFinished: " + str(properties))
|
|
self.loop.quit()
|
|
|
|
def persistentGroupAdded(self, path, properties):
|
|
logger.debug("persistentGroupAdded: %s %s" % (path, str(properties)))
|
|
self.persistent = path
|
|
|
|
def run_test(self, *args):
|
|
logger.debug("run_test")
|
|
params = dbus.Dictionary({'persistent': True,
|
|
'frequency': 2412})
|
|
logger.info("Add a persistent group")
|
|
p2p.GroupAdd(params)
|
|
return False
|
|
|
|
def success(self):
|
|
return True
|
|
|
|
with TestDbusP2p(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Expected signals not seen")
|
|
persistent = t.persistent
|
|
|
|
p_obj = bus.get_object(WPAS_DBUS_SERVICE, persistent)
|
|
res = p_obj.Get(WPAS_DBUS_PERSISTENT_GROUP, "Properties",
|
|
dbus_interface=dbus.PROPERTIES_IFACE, byte_arrays=True)
|
|
logger.info("Persistent group Properties: " + str(res))
|
|
vals = dbus.Dictionary({ 'ssid': 'DIRECT-foo' }, signature='sv')
|
|
p_obj.Set(WPAS_DBUS_PERSISTENT_GROUP, "Properties", vals,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
res2 = p_obj.Get(WPAS_DBUS_PERSISTENT_GROUP, "Properties",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if len(res) != len(res2):
|
|
raise Exception("Different number of parameters")
|
|
for k in res:
|
|
if k != 'ssid' and res[k] != res2[k]:
|
|
raise Exception("Parameter %s value changes" % k)
|
|
if res2['ssid'] != '"DIRECT-foo"':
|
|
raise Exception("Unexpected ssid")
|
|
|
|
args = dbus.Dictionary({ 'ssid': 'DIRECT-testing',
|
|
'psk': '1234567890' }, signature='sv')
|
|
group = p2p.AddPersistentGroup(args)
|
|
|
|
groups = if_obj.Get(WPAS_DBUS_IFACE_P2PDEVICE, "PersistentGroups",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if len(groups) != 2:
|
|
raise Exception("Unexpected number of persistent groups: " + str(groups))
|
|
|
|
p2p.RemoveAllPersistentGroups()
|
|
|
|
groups = if_obj.Get(WPAS_DBUS_IFACE_P2PDEVICE, "PersistentGroups",
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
if len(groups) != 0:
|
|
raise Exception("Unexpected number of persistent groups: " + str(groups))
|
|
|
|
try:
|
|
p2p.RemovePersistentGroup(persistent)
|
|
raise Exception("Invalid RemovePersistentGroup accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "NetworkUnknown: There is no such persistent group" not in str(e):
|
|
raise Exception("Unexpected error message for invalid RemovePersistentGroup: " + str(e))
|
|
|
|
def test_dbus_p2p_reinvoke_persistent(dev, apdev):
|
|
"""D-Bus P2P reinvoke persistent group"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
p2p = dbus.Interface(if_obj, WPAS_DBUS_IFACE_P2PDEVICE)
|
|
wps = dbus.Interface(if_obj, WPAS_DBUS_IFACE_WPS)
|
|
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
|
|
class TestDbusP2p(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.first = True
|
|
self.waiting_end = False
|
|
self.done = False
|
|
self.invited = False
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_test)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.deviceFound, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"DeviceFound")
|
|
self.add_signal(self.groupStarted, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GroupStarted")
|
|
self.add_signal(self.groupFinished, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GroupFinished")
|
|
self.add_signal(self.persistentGroupAdded,
|
|
WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"PersistentGroupAdded")
|
|
self.add_signal(self.provisionDiscoveryRequestDisplayPin,
|
|
WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"ProvisionDiscoveryRequestDisplayPin")
|
|
self.add_signal(self.staAuthorized, WPAS_DBUS_IFACE,
|
|
"StaAuthorized")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def groupStarted(self, properties):
|
|
logger.debug("groupStarted: " + str(properties))
|
|
if not self.invited:
|
|
dev1 = WpaSupplicant('wlan1', '/tmp/wpas-wlan1')
|
|
dev1.scan_for_bss(addr0, freq=2412)
|
|
dev1.global_request("P2P_CONNECT " + addr0 + " 12345670 join")
|
|
|
|
def groupFinished(self, properties):
|
|
logger.debug("groupFinished: " + str(properties))
|
|
if self.invited:
|
|
self.done = True
|
|
self.loop.quit()
|
|
else:
|
|
dev1 = WpaSupplicant('wlan1', '/tmp/wpas-wlan1')
|
|
dev1.request("SET persistent_reconnect 1")
|
|
dev1.p2p_listen()
|
|
|
|
args = { 'persistent_group_object': dbus.ObjectPath(path),
|
|
'peer': self.peer_path }
|
|
try:
|
|
pin = p2p.Invite(args)
|
|
raise Exception("Invalid Invite accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Invite: " + str(e))
|
|
|
|
args = { 'persistent_group_object': self.persistent,
|
|
'peer': self.peer_path }
|
|
pin = p2p.Invite(args)
|
|
self.invited = True
|
|
|
|
def persistentGroupAdded(self, path, properties):
|
|
logger.debug("persistentGroupAdded: %s %s" % (path, str(properties)))
|
|
self.persistent = path
|
|
|
|
def deviceFound(self, path):
|
|
logger.debug("deviceFound: path=%s" % path)
|
|
peer_obj = bus.get_object(WPAS_DBUS_SERVICE, path)
|
|
self.peer = peer_obj.GetAll(WPAS_DBUS_P2P_PEER,
|
|
dbus_interface=dbus.PROPERTIES_IFACE,
|
|
byte_arrays=True)
|
|
|
|
def provisionDiscoveryRequestDisplayPin(self, peer_object, pin):
|
|
logger.debug("provisionDiscoveryRequestDisplayPin - peer=%s pin=%s" % (peer_object, pin))
|
|
self.peer_path = peer_object
|
|
peer = binascii.unhexlify(peer_object.split('/')[-1])
|
|
addr = ""
|
|
for p in peer:
|
|
if len(addr) > 0:
|
|
addr += ':'
|
|
addr += '%02x' % ord(p)
|
|
params = { 'Role': 'registrar',
|
|
'P2PDeviceAddress': self.peer['DeviceAddress'],
|
|
'Bssid': self.peer['DeviceAddress'],
|
|
'Type': 'pin',
|
|
'Pin': '12345670' }
|
|
logger.info("Authorize peer to connect to the group")
|
|
wps.Start(params)
|
|
|
|
def staAuthorized(self, name):
|
|
logger.debug("staAuthorized: " + name)
|
|
dev1 = WpaSupplicant('wlan1', '/tmp/wpas-wlan1')
|
|
dev1.remove_group()
|
|
ev = dev1.wait_event(["P2P-GROUP-REMOVED"], timeout=10)
|
|
if ev is None:
|
|
raise Exception("Group removal timed out")
|
|
p2p.Disconnect()
|
|
|
|
def run_test(self, *args):
|
|
logger.debug("run_test")
|
|
params = dbus.Dictionary({'persistent': True,
|
|
'frequency': 2412})
|
|
logger.info("Add a persistent group")
|
|
p2p.GroupAdd(params)
|
|
return False
|
|
|
|
def success(self):
|
|
return self.done
|
|
|
|
with TestDbusP2p(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Expected signals not seen")
|
|
|
|
def test_dbus_p2p_go_neg_rx(dev, apdev):
|
|
"""D-Bus P2P GO Negotiation receive"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
p2p = dbus.Interface(if_obj, WPAS_DBUS_IFACE_P2PDEVICE)
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
|
|
class TestDbusP2p(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.done = False
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_test)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.deviceFound, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"DeviceFound")
|
|
self.add_signal(self.goNegotiationRequest,
|
|
WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GONegotiationRequest",
|
|
byte_arrays=True)
|
|
self.add_signal(self.goNegotiationSuccess,
|
|
WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GONegotiationSuccess",
|
|
byte_arrays=True)
|
|
self.add_signal(self.groupStarted, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GroupStarted")
|
|
self.add_signal(self.groupFinished, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GroupFinished")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def deviceFound(self, path):
|
|
logger.debug("deviceFound: path=%s" % path)
|
|
|
|
def goNegotiationRequest(self, path, dev_passwd_id):
|
|
logger.debug("goNegotiationRequest: path=%s dev_passwd_id=%d" % (path, dev_passwd_id))
|
|
if dev_passwd_id != 1:
|
|
raise Exception("Unexpected dev_passwd_id=%d" % dev_passwd_id)
|
|
args = { 'peer': path, 'wps_method': 'display', 'pin': '12345670',
|
|
'go_intent': 15, 'persistent': False, 'frequency': 5175 }
|
|
try:
|
|
p2p.Connect(args)
|
|
raise Exception("Invalid Connect accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "ConnectChannelUnsupported" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Connect: " + str(e))
|
|
|
|
args = { 'peer': path, 'wps_method': 'display', 'pin': '12345670',
|
|
'go_intent': 15, 'persistent': False }
|
|
p2p.Connect(args)
|
|
|
|
def goNegotiationSuccess(self, properties):
|
|
logger.debug("goNegotiationSuccess: properties=%s" % str(properties))
|
|
|
|
def groupStarted(self, properties):
|
|
logger.debug("groupStarted: " + str(properties))
|
|
p2p.Disconnect()
|
|
|
|
def groupFinished(self, properties):
|
|
logger.debug("groupFinished: " + str(properties))
|
|
self.done = True
|
|
self.loop.quit()
|
|
|
|
def run_test(self, *args):
|
|
logger.debug("run_test")
|
|
p2p.Listen(10)
|
|
dev1 = WpaSupplicant('wlan1', '/tmp/wpas-wlan1')
|
|
if not dev1.discover_peer(addr0):
|
|
raise Exception("Peer not found")
|
|
dev1.global_request("P2P_CONNECT " + addr0 + " 12345670 enter")
|
|
return False
|
|
|
|
def success(self):
|
|
return self.done
|
|
|
|
with TestDbusP2p(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Expected signals not seen")
|
|
|
|
def test_dbus_p2p_go_neg_auth(dev, apdev):
|
|
"""D-Bus P2P GO Negotiation authorized"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
p2p = dbus.Interface(if_obj, WPAS_DBUS_IFACE_P2PDEVICE)
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
dev[1].p2p_listen()
|
|
|
|
class TestDbusP2p(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.done = False
|
|
self.peer_joined = False
|
|
self.peer_disconnected = False
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_test)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.deviceFound, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"DeviceFound")
|
|
self.add_signal(self.goNegotiationSuccess,
|
|
WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GONegotiationSuccess",
|
|
byte_arrays=True)
|
|
self.add_signal(self.groupStarted, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GroupStarted")
|
|
self.add_signal(self.groupFinished, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GroupFinished")
|
|
self.add_signal(self.staDeauthorized, WPAS_DBUS_IFACE,
|
|
"StaDeauthorized")
|
|
self.add_signal(self.peerJoined, WPAS_DBUS_GROUP,
|
|
"PeerJoined")
|
|
self.add_signal(self.peerDisconnected, WPAS_DBUS_GROUP,
|
|
"PeerDisconnected")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def deviceFound(self, path):
|
|
logger.debug("deviceFound: path=%s" % path)
|
|
args = { 'peer': path, 'wps_method': 'keypad',
|
|
'go_intent': 15, 'authorize_only': True }
|
|
try:
|
|
p2p.Connect(args)
|
|
raise Exception("Invalid Connect accepted")
|
|
except dbus.exceptions.DBusException, e:
|
|
if "InvalidArgs" not in str(e):
|
|
raise Exception("Unexpected error message for invalid Connect: " + str(e))
|
|
|
|
args = { 'peer': path, 'wps_method': 'keypad', 'pin': '12345670',
|
|
'go_intent': 15, 'authorize_only': True }
|
|
p2p.Connect(args)
|
|
p2p.Listen(10)
|
|
dev1 = WpaSupplicant('wlan1', '/tmp/wpas-wlan1')
|
|
if not dev1.discover_peer(addr0):
|
|
raise Exception("Peer not found")
|
|
dev1.global_request("P2P_CONNECT " + addr0 + " 12345670 display go_intent=0")
|
|
ev = dev1.wait_global_event(["P2P-GROUP-STARTED"], timeout=15);
|
|
if ev is None:
|
|
raise Exception("Group formation timed out")
|
|
|
|
def goNegotiationSuccess(self, properties):
|
|
logger.debug("goNegotiationSuccess: properties=%s" % str(properties))
|
|
|
|
def groupStarted(self, properties):
|
|
logger.debug("groupStarted: " + str(properties))
|
|
dev1 = WpaSupplicant('wlan1', '/tmp/wpas-wlan1')
|
|
dev1.remove_group()
|
|
|
|
def staDeauthorized(self, name):
|
|
logger.debug("staDeuthorized: " + name)
|
|
p2p.Disconnect()
|
|
|
|
def peerJoined(self, peer):
|
|
logger.debug("peerJoined: " + peer)
|
|
self.peer_joined = True
|
|
|
|
def peerDisconnected(self, peer):
|
|
logger.debug("peerDisconnected: " + peer)
|
|
self.peer_disconnected = True
|
|
|
|
def groupFinished(self, properties):
|
|
logger.debug("groupFinished: " + str(properties))
|
|
self.done = True
|
|
self.loop.quit()
|
|
|
|
def run_test(self, *args):
|
|
logger.debug("run_test")
|
|
p2p.Find(dbus.Dictionary({'DiscoveryType': 'social'}))
|
|
return False
|
|
|
|
def success(self):
|
|
return self.done and self.peer_joined and self.peer_disconnected
|
|
|
|
with TestDbusP2p(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Expected signals not seen")
|
|
|
|
def test_dbus_p2p_go_neg_init(dev, apdev):
|
|
"""D-Bus P2P GO Negotiation initiation"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
p2p = dbus.Interface(if_obj, WPAS_DBUS_IFACE_P2PDEVICE)
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
dev[1].p2p_listen()
|
|
|
|
class TestDbusP2p(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.done = False
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_test)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.deviceFound, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"DeviceFound")
|
|
self.add_signal(self.goNegotiationSuccess,
|
|
WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GONegotiationSuccess",
|
|
byte_arrays=True)
|
|
self.add_signal(self.groupStarted, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GroupStarted")
|
|
self.add_signal(self.groupFinished, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GroupFinished")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def deviceFound(self, path):
|
|
logger.debug("deviceFound: path=%s" % path)
|
|
dev1 = WpaSupplicant('wlan1', '/tmp/wpas-wlan1')
|
|
args = { 'peer': path, 'wps_method': 'keypad', 'pin': '12345670',
|
|
'go_intent': 0 }
|
|
p2p.Connect(args)
|
|
|
|
ev = dev1.wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=15)
|
|
if ev is None:
|
|
raise Exception("Timeout while waiting for GO Neg Request")
|
|
dev1.global_request("P2P_CONNECT " + addr0 + " 12345670 display go_intent=15")
|
|
ev = dev1.wait_global_event(["P2P-GROUP-STARTED"], timeout=15);
|
|
if ev is None:
|
|
raise Exception("Group formation timed out")
|
|
|
|
def goNegotiationSuccess(self, properties):
|
|
logger.debug("goNegotiationSuccess: properties=%s" % str(properties))
|
|
|
|
def groupStarted(self, properties):
|
|
logger.debug("groupStarted: " + str(properties))
|
|
p2p.Disconnect()
|
|
dev1 = WpaSupplicant('wlan1', '/tmp/wpas-wlan1')
|
|
dev1.remove_group()
|
|
|
|
def groupFinished(self, properties):
|
|
logger.debug("groupFinished: " + str(properties))
|
|
self.done = True
|
|
self.loop.quit()
|
|
|
|
def run_test(self, *args):
|
|
logger.debug("run_test")
|
|
p2p.Find(dbus.Dictionary({'DiscoveryType': 'social'}))
|
|
return False
|
|
|
|
def success(self):
|
|
return self.done
|
|
|
|
with TestDbusP2p(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Expected signals not seen")
|
|
|
|
def test_dbus_p2p_wps_failure(dev, apdev):
|
|
"""D-Bus P2P WPS failure"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
p2p = dbus.Interface(if_obj, WPAS_DBUS_IFACE_P2PDEVICE)
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
|
|
class TestDbusP2p(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.done = False
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_test)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.goNegotiationRequest,
|
|
WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GONegotiationRequest",
|
|
byte_arrays=True)
|
|
self.add_signal(self.goNegotiationSuccess,
|
|
WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GONegotiationSuccess",
|
|
byte_arrays=True)
|
|
self.add_signal(self.groupStarted, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GroupStarted")
|
|
self.add_signal(self.wpsFailed, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"WpsFailed")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def goNegotiationRequest(self, path, dev_passwd_id):
|
|
logger.debug("goNegotiationRequest: path=%s dev_passwd_id=%d" % (path, dev_passwd_id))
|
|
if dev_passwd_id != 1:
|
|
raise Exception("Unexpected dev_passwd_id=%d" % dev_passwd_id)
|
|
args = { 'peer': path, 'wps_method': 'display', 'pin': '12345670',
|
|
'go_intent': 15 }
|
|
p2p.Connect(args)
|
|
|
|
def goNegotiationSuccess(self, properties):
|
|
logger.debug("goNegotiationSuccess: properties=%s" % str(properties))
|
|
|
|
def groupStarted(self, properties):
|
|
logger.debug("groupStarted: " + str(properties))
|
|
raise Exception("Unexpected GroupStarted")
|
|
|
|
def wpsFailed(self, name, args):
|
|
logger.debug("wpsFailed - name=%s args=%s" % (name, str(args)))
|
|
self.done = True
|
|
self.loop.quit()
|
|
|
|
def run_test(self, *args):
|
|
logger.debug("run_test")
|
|
p2p.Listen(10)
|
|
dev1 = WpaSupplicant('wlan1', '/tmp/wpas-wlan1')
|
|
if not dev1.discover_peer(addr0):
|
|
raise Exception("Peer not found")
|
|
dev1.global_request("P2P_CONNECT " + addr0 + " 87654321 enter")
|
|
return False
|
|
|
|
def success(self):
|
|
return self.done
|
|
|
|
with TestDbusP2p(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Expected signals not seen")
|
|
|
|
def test_dbus_p2p_two_groups(dev, apdev):
|
|
"""D-Bus P2P with two concurrent groups"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
p2p = dbus.Interface(if_obj, WPAS_DBUS_IFACE_P2PDEVICE)
|
|
|
|
dev[0].request("SET p2p_no_group_iface 0")
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
addr1 = dev[1].p2p_dev_addr()
|
|
addr2 = dev[2].p2p_dev_addr()
|
|
dev[1].p2p_start_go(freq=2412)
|
|
|
|
class TestDbusP2p(TestDbus):
|
|
def __init__(self, bus):
|
|
TestDbus.__init__(self, bus)
|
|
self.done = False
|
|
self.peer = None
|
|
self.go = None
|
|
self.group1 = None
|
|
self.group2 = None
|
|
|
|
def __enter__(self):
|
|
gobject.timeout_add(1, self.run_test)
|
|
gobject.timeout_add(15000, self.timeout)
|
|
self.add_signal(self.propertiesChanged, dbus.PROPERTIES_IFACE,
|
|
"PropertiesChanged", byte_arrays=True)
|
|
self.add_signal(self.deviceFound, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"DeviceFound")
|
|
self.add_signal(self.groupStarted, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GroupStarted")
|
|
self.add_signal(self.groupFinished, WPAS_DBUS_IFACE_P2PDEVICE,
|
|
"GroupFinished")
|
|
self.add_signal(self.peerJoined, WPAS_DBUS_GROUP,
|
|
"PeerJoined")
|
|
self.loop.run()
|
|
return self
|
|
|
|
def propertiesChanged(self, interface_name, changed_properties,
|
|
invalidated_properties):
|
|
logger.debug("propertiesChanged: interface_name=%s changed_properties=%s invalidated_properties=%s" % (interface_name, str(changed_properties), str(invalidated_properties)))
|
|
|
|
def deviceFound(self, path):
|
|
logger.debug("deviceFound: path=%s" % path)
|
|
if addr2.replace(':','') in path:
|
|
self.peer = path
|
|
elif addr1.replace(':','') in path:
|
|
self.go = path
|
|
if self.go and not self.group1:
|
|
logger.info("Join the group")
|
|
p2p.StopFind()
|
|
pin = '12345670'
|
|
dev1 = WpaSupplicant('wlan1', '/tmp/wpas-wlan1')
|
|
dev1.request("WPS_PIN any " + pin)
|
|
args = { 'peer': self.go,
|
|
'join': True,
|
|
'wps_method': 'pin',
|
|
'pin': pin,
|
|
'frequency': 2412 }
|
|
p2p.Connect(args)
|
|
|
|
def groupStarted(self, properties):
|
|
logger.debug("groupStarted: " + str(properties))
|
|
prop = if_obj.GetAll(WPAS_DBUS_IFACE_P2PDEVICE,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
logger.debug("p2pdevice properties: " + str(prop))
|
|
|
|
g_obj = bus.get_object(WPAS_DBUS_SERVICE,
|
|
properties['group_object'])
|
|
res = g_obj.GetAll(WPAS_DBUS_GROUP,
|
|
dbus_interface=dbus.PROPERTIES_IFACE,
|
|
byte_arrays=True)
|
|
logger.debug("Group properties: " + str(res))
|
|
|
|
if not self.group1:
|
|
self.group1 = properties['group_object']
|
|
self.group1iface = properties['interface_object']
|
|
self.g1_if_obj = bus.get_object(WPAS_DBUS_SERVICE,
|
|
self.group1iface)
|
|
|
|
logger.info("Start autonomous GO")
|
|
params = dbus.Dictionary({ 'frequency': 2412 })
|
|
p2p.GroupAdd(params)
|
|
elif not self.group2:
|
|
self.group2 = properties['group_object']
|
|
self.group2iface = properties['interface_object']
|
|
self.g2_if_obj = bus.get_object(WPAS_DBUS_SERVICE,
|
|
self.group2iface)
|
|
self.g2_bssid = res['BSSID']
|
|
|
|
if self.group1 and self.group2:
|
|
logger.info("Authorize peer to join the group")
|
|
a2 = binascii.unhexlify(addr2.replace(':',''))
|
|
params = { 'Role': 'enrollee',
|
|
'P2PDeviceAddress': dbus.ByteArray(a2),
|
|
'Bssid': dbus.ByteArray(a2),
|
|
'Type': 'pin',
|
|
'Pin': '12345670' }
|
|
g_wps = dbus.Interface(self.g2_if_obj, WPAS_DBUS_IFACE_WPS)
|
|
g_wps.Start(params)
|
|
|
|
bssid = ':'.join([binascii.hexlify(l) for l in self.g2_bssid])
|
|
dev2 = WpaSupplicant('wlan2', '/tmp/wpas-wlan2')
|
|
dev2.scan_for_bss(bssid, freq=2412)
|
|
dev2.global_request("P2P_CONNECT " + bssid + " 12345670 join freq=2412")
|
|
|
|
def groupFinished(self, properties):
|
|
logger.debug("groupFinished: " + str(properties))
|
|
|
|
if self.group1 == properties['group_object']:
|
|
self.group1 = None
|
|
elif self.group2 == properties['group_object']:
|
|
self.group2 = None
|
|
|
|
if not self.group1 and not self.group2:
|
|
self.done = True
|
|
self.loop.quit()
|
|
|
|
def peerJoined(self, peer):
|
|
logger.debug("peerJoined: " + peer)
|
|
self.check_results()
|
|
|
|
dev2 = WpaSupplicant('wlan2', '/tmp/wpas-wlan2')
|
|
dev2.remove_group()
|
|
|
|
logger.info("Disconnect group2")
|
|
group_p2p = dbus.Interface(self.g2_if_obj,
|
|
WPAS_DBUS_IFACE_P2PDEVICE)
|
|
group_p2p.Disconnect()
|
|
|
|
logger.info("Disconnect group1")
|
|
group_p2p = dbus.Interface(self.g1_if_obj,
|
|
WPAS_DBUS_IFACE_P2PDEVICE)
|
|
group_p2p.Disconnect()
|
|
|
|
def check_results(self):
|
|
logger.info("Check results with two concurrent groups in operation")
|
|
|
|
g1_obj = bus.get_object(WPAS_DBUS_SERVICE, self.group1)
|
|
res1 = g1_obj.GetAll(WPAS_DBUS_GROUP,
|
|
dbus_interface=dbus.PROPERTIES_IFACE,
|
|
byte_arrays=True)
|
|
|
|
g2_obj = bus.get_object(WPAS_DBUS_SERVICE, self.group2)
|
|
res2 = g2_obj.GetAll(WPAS_DBUS_GROUP,
|
|
dbus_interface=dbus.PROPERTIES_IFACE,
|
|
byte_arrays=True)
|
|
|
|
logger.info("group1 = " + self.group1)
|
|
logger.debug("Group properties: " + str(res1))
|
|
|
|
logger.info("group2 = " + self.group2)
|
|
logger.debug("Group properties: " + str(res2))
|
|
|
|
prop = if_obj.GetAll(WPAS_DBUS_IFACE_P2PDEVICE,
|
|
dbus_interface=dbus.PROPERTIES_IFACE)
|
|
logger.debug("p2pdevice properties: " + str(prop))
|
|
|
|
if res1['Role'] != 'client':
|
|
raise Exception("Group1 role reported incorrectly: " + res1['Role'])
|
|
if res2['Role'] != 'GO':
|
|
raise Exception("Group2 role reported incorrectly: " + res2['Role'])
|
|
if prop['Role'] != 'device':
|
|
raise Exception("p2pdevice role reported incorrectly: " + prop['Role'])
|
|
|
|
if len(res2['Members']) != 1:
|
|
raise Exception("Unexpected Members value for group 2")
|
|
|
|
def run_test(self, *args):
|
|
logger.debug("run_test")
|
|
p2p.Find(dbus.Dictionary({'DiscoveryType': 'social'}))
|
|
return False
|
|
|
|
def success(self):
|
|
return self.done
|
|
|
|
with TestDbusP2p(bus) as t:
|
|
if not t.success():
|
|
raise Exception("Expected signals not seen")
|
|
|
|
dev[1].remove_group()
|
|
|
|
def test_dbus_introspect(dev, apdev):
|
|
"""D-Bus introspection"""
|
|
(bus,wpas_obj,path,if_obj) = prepare_dbus(dev[0])
|
|
|
|
res = if_obj.Introspect(WPAS_DBUS_IFACE,
|
|
dbus_interface=dbus.INTROSPECTABLE_IFACE)
|
|
logger.info("Initial Introspect: " + str(res))
|
|
if res is None or "Introspectable" not in res or "GroupStarted" not in res:
|
|
raise Exception("Unexpected initial Introspect response: " + str(res))
|
|
|
|
with alloc_fail(dev[0], 1, "wpa_dbus_introspect"):
|
|
res2 = if_obj.Introspect(WPAS_DBUS_IFACE,
|
|
dbus_interface=dbus.INTROSPECTABLE_IFACE)
|
|
logger.info("Introspect: " + str(res2))
|
|
if res2 is not None:
|
|
raise Exception("Unexpected Introspect response")
|
|
|
|
with alloc_fail(dev[0], 1, "=add_interface;wpa_dbus_introspect"):
|
|
res2 = if_obj.Introspect(WPAS_DBUS_IFACE,
|
|
dbus_interface=dbus.INTROSPECTABLE_IFACE)
|
|
logger.info("Introspect: " + str(res2))
|
|
if res2 is None:
|
|
raise Exception("No Introspect response")
|
|
if len(res2) >= len(res):
|
|
raise Exception("Unexpected Introspect response")
|
|
|
|
with alloc_fail(dev[0], 1, "wpabuf_alloc;add_interface;wpa_dbus_introspect"):
|
|
res2 = if_obj.Introspect(WPAS_DBUS_IFACE,
|
|
dbus_interface=dbus.INTROSPECTABLE_IFACE)
|
|
logger.info("Introspect: " + str(res2))
|
|
if res2 is None:
|
|
raise Exception("No Introspect response")
|
|
if len(res2) >= len(res):
|
|
raise Exception("Unexpected Introspect response")
|
|
|
|
with alloc_fail(dev[0], 2, "=add_interface;wpa_dbus_introspect"):
|
|
res2 = if_obj.Introspect(WPAS_DBUS_IFACE,
|
|
dbus_interface=dbus.INTROSPECTABLE_IFACE)
|
|
logger.info("Introspect: " + str(res2))
|
|
if res2 is None:
|
|
raise Exception("No Introspect response")
|
|
if len(res2) >= len(res):
|
|
raise Exception("Unexpected Introspect response")
|