# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import dbus

from autotest_lib.client.bin import test
from autotest_lib.client.cros import shill_temporary_profile
from autotest_lib.client.common_lib import error

# pylint: disable=W0611
from autotest_lib.client.cros import flimflam_test_path
# pylint: enable=W0611
import wifi_proxy

class network_WiFiInvalidParameters(test.test):
    """Test that shill will reject invalid WiFi service configurations.

    In particular, this test checks shill's behavior with invalid SSIDs,
    WEP keys, and WPA passphrases.

    """
    version = 1
    unique_counter = 1


    SSID_TOO_LONG = ('MaxLengthSSID' * 8)[:33]
    SSID_TOO_SHORT = ''

    WPA_PASSPHRASE_TOO_LONG = ('x123456789' * 8)[:64]
    WPA_PASSPHRASE_TOO_SHORT= 'x123456'
    WPA_PMK_TOO_LONG = ('0123456789' * 8)[:65]


    @staticmethod
    def get_ssid():
        """@return string a unique SSID."""
        reserved_value = network_WiFiInvalidParameters.unique_counter
        network_WiFiInvalidParameters.unique_counter += 1
        return 'an ssid%d' % reserved_value


    def check_bad_ssids(self, shill):
        """Assert that shill will reject attempts connect to invalid SSIDs.

        @param shill ShillProxy object representing shill.

        """
        bad_ssids = [self.SSID_TOO_LONG, self.SSID_TOO_SHORT]
        for ssid in bad_ssids:
            config_params = {shill.SERVICE_PROPERTY_TYPE: 'wifi',
                             shill.SERVICE_PROPERTY_SSID: ssid,
                             shill.SERVICE_PROPERTY_SECURITY: 'none'}
            try:
                accepted = True
                shill.manager.ConfigureService(config_params)
            except dbus.exceptions.DBusException, e:
                accepted = False
                if (e.get_dbus_name() !=
                        'org.chromium.flimflam.Error.InvalidNetworkName'):
                    raise error.TestFail('Got an unexpected exception from '
                                         'shill: %s: %s.' %
                                         (e.get_dbus_name(),
                                          e.get_dbus_message()))
            if accepted:
                raise error.TestFail('Expected shill to stop us, but it let us '
                                     'configure a bad SSID "%r"' % ssid)


    def check_bad_wep_keys(self, shill):
        """Assert that shill will reject attempts to use invalid WEP keys.

        @param shill ShillProxy object representing shill.

        """
        LONG_HEX_STRING = '0123456789abcdef' * 8
        BAD_PREFIXES = ('4', '001', '-22', 'a', )
        bad_keys = []
        # Generate a bunch of hex keys.  Some of these are good ASCII keys, but
        # we'll fix this in a moment.
        for index in range(4):
            for length in range(0, 10) + range(11, 26) + range(27, 30):
                bad_keys.append('%d:%s' % (index, LONG_HEX_STRING[:length]))
                bad_keys.append('%d:0x%s' % (index, LONG_HEX_STRING[:length]))
        # |bad_keys| contains all bad hex keys, but some of those hex keys
        # could be interpretted as valid ASCII keys.  Lets take those out.
        good_keys = []
        for key in bad_keys:
            # 5 and 13 length keys are just ASCII keys.  7 and 15 are ASCII keys
            # with the key index prefix.
            if len(key) in (5, 7, 13, 15):
                good_keys.append(key)
        map(bad_keys.remove, good_keys)
        # Now add some keys that are bad because the prefix is no good.
        for valid_key in (LONG_HEX_STRING[:10], LONG_HEX_STRING[:26]):
            for prefix in BAD_PREFIXES:
                bad_keys.append('%s:%s' % (prefix, valid_key))
                bad_keys.append('%s:0x%s' % (prefix, valid_key))
        for valid_key in ('wep40', 'wep104is13len'):
            for prefix in BAD_PREFIXES:
                bad_keys.append('%s:%s' % (prefix, valid_key))
        for key in bad_keys:
            config_params = {shill.SERVICE_PROPERTY_TYPE: 'wifi',
                             shill.SERVICE_PROPERTY_SSID: self.get_ssid(),
                             shill.SERVICE_PROPERTY_PASSPHRASE: key,
                             shill.SERVICE_PROPERTY_SECURITY: 'wep'}
            try:
                accepted = True
                shill.manager.ConfigureService(config_params)
            except dbus.exceptions.DBusException, e:
                accepted = False
                if (e.get_dbus_name() !=
                        'org.chromium.flimflam.Error.InvalidPassphrase'):
                    raise error.TestFail('Got an unexpected exception from '
                                         'shill: %s: %s.' %
                                         (e.get_dbus_name(),
                                          e.get_dbus_message()))

            if accepted:
                raise error.TestFail('Expected shill to stop us, but it let us '
                                     'configure a bad WEP key: %s' % key)

        for key in good_keys:
            config_params = {shill.SERVICE_PROPERTY_TYPE: 'wifi',
                             shill.SERVICE_PROPERTY_SSID: self.get_ssid(),
                             shill.SERVICE_PROPERTY_PASSPHRASE: key,
                             shill.SERVICE_PROPERTY_SECURITY: 'wep'}
            try:
                shill.manager.ConfigureService(config_params)
            except _, e:
                logging.error('%r', e)
                raise error.TestFail('shill should let us use a WEP key '
                                     'like: %s' % key)


    def check_bad_wpa_passphrases(self, shill):
        """Assert that shill will reject invalid WPA passphrases.

        @param shill ShillProxy object representing shill.

        """
        bad_passphrases = [self.WPA_PASSPHRASE_TOO_LONG,
                           self.WPA_PASSPHRASE_TOO_SHORT,
                           self.WPA_PMK_TOO_LONG]
        for psk in bad_passphrases:
            for security in ('rsn', 'wpa', 'psk'):
                config_params = {shill.SERVICE_PROPERTY_TYPE: 'wifi',
                                 shill.SERVICE_PROPERTY_SSID: self.get_ssid(),
                                 shill.SERVICE_PROPERTY_PASSPHRASE: psk,
                                 shill.SERVICE_PROPERTY_SECURITY: security}
                try:
                    accepted = True
                    shill.manager.ConfigureService(config_params)
                except dbus.exceptions.DBusException, e:
                    accepted = False
                    if (e.get_dbus_name() !=
                            'org.chromium.flimflam.Error.InvalidPassphrase'):
                        raise error.TestFail('Got an unexpected exception from '
                                             'shill: %s: %s.' %
                                             (e.get_dbus_name(),
                                              e.get_dbus_message()))
                if accepted:
                    raise error.TestFail('Expected shill to stop us, but it '
                                         'let us configure a bad passphrase: '
                                         '%s' % psk)


    def run_once(self):
        """Test body."""
        shill = wifi_proxy.WifiProxy.get_proxy()
        with shill_temporary_profile.ShillTemporaryProfile(shill.manager):
            self.check_bad_ssids(shill)
            self.check_bad_wep_keys(shill)
            self.check_bad_wpa_passphrases(shill)
