You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
5.7 KiB
191 lines
5.7 KiB
# Copyright 2019 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 random
|
|
import string
|
|
|
|
|
|
def generate_random_guid():
|
|
"""Create a random 16 character GUID."""
|
|
return ''.join(random.choice(string.hexdigits) for _ in xrange(16))
|
|
|
|
|
|
class NetworkConfig(object):
|
|
"""
|
|
NetworkConfig is a client-side representation of a network.
|
|
|
|
Its primary purpose is to generate open network configurations.
|
|
|
|
"""
|
|
def __init__(self, ssid=None, security='None', eap=None, password=None,
|
|
identity=None, autoconnect=None, ca_cert=None,
|
|
client_cert=None):
|
|
"""
|
|
@param ssid: Service set identifier for wireless local area network.
|
|
@param security: Security of network. Options are:
|
|
'None', 'WEP-PSK', 'WEP-8021X', 'WPA-PSK', and 'WPA-EAP'.
|
|
@param eap: EAP type, required if security is 'WEP-8021X' or 'WPA-EAP'.
|
|
@param identity: Username, if the network type requires it.
|
|
@param password: Password, if the network type requires it.
|
|
@param ca_cert: CA certificate in PEM format. Required
|
|
for EAP networks.
|
|
@param client_cert: Client certificate in base64-encoded PKCS#12
|
|
format. Required for EAP-TLS networks.
|
|
@param autoconnect: True iff network policy should autoconnect.
|
|
|
|
"""
|
|
self.ssid = ssid
|
|
self.security = security
|
|
self.eap = eap
|
|
self.password = password
|
|
self.identity = identity
|
|
self.autoconnect = autoconnect
|
|
self.ca_cert = ca_cert
|
|
self.client_cert = client_cert
|
|
self.guid = generate_random_guid()
|
|
|
|
|
|
def policy(self):
|
|
"""
|
|
Generate a network configuration policy dictionary.
|
|
|
|
@returns conf: A dictionary in the format suitable to setting as a
|
|
network policy.
|
|
|
|
"""
|
|
conf = {
|
|
'NetworkConfigurations': [
|
|
{'GUID': self.guid,
|
|
'Name': self.ssid,
|
|
'Type': 'WiFi',
|
|
'WiFi': {
|
|
'SSID': self.ssid,
|
|
'Security': self.security}
|
|
}
|
|
],
|
|
}
|
|
|
|
# Generate list of certificate dictionaries.
|
|
certs = []
|
|
if self.ca_cert is not None:
|
|
certs.append(
|
|
{'GUID': 'CA_CERT',
|
|
'Type': 'Authority',
|
|
'X509': self.ca_cert}
|
|
)
|
|
|
|
if self.client_cert is not None:
|
|
certs.append(
|
|
{'GUID': 'CLIENT_CERT',
|
|
'Type': 'Client',
|
|
'PKCS12': self.client_cert}
|
|
)
|
|
|
|
if certs:
|
|
conf['Certificates'] = certs
|
|
|
|
wifi_conf = conf['NetworkConfigurations'][0]['WiFi']
|
|
|
|
if self.autoconnect is not None:
|
|
wifi_conf['AutoConnect'] = self.autoconnect
|
|
|
|
if self.security == 'WPA-PSK':
|
|
if self.password is None:
|
|
raise error.TestError(
|
|
'Password is required for WPA-PSK networks.')
|
|
wifi_conf['Passphrase'] = self.password
|
|
|
|
if self.eap is not None:
|
|
eap_conf = {
|
|
'Outer': self.eap,
|
|
'Identity': self.identity,
|
|
'ServerCARefs': ['CA_CERT']
|
|
}
|
|
|
|
if self.password is not None:
|
|
eap_conf['Password'] = self.password
|
|
|
|
if self.eap == 'EAP-TLS':
|
|
eap_conf['ClientCertType'] = 'Ref'
|
|
eap_conf['ClientCertRef'] = 'CLIENT_CERT'
|
|
eap_conf['UseSystemCAs'] = False
|
|
|
|
wifi_conf['EAP'] = eap_conf
|
|
|
|
return conf
|
|
|
|
|
|
class ProxyConfig(object):
|
|
"""
|
|
ProxyConfig is a client-side representation of a proxy network.
|
|
|
|
Its primary purpose is to generate open network configurations.
|
|
|
|
"""
|
|
def __init__(self, type=None, pac_url=None, host=None, port=None,
|
|
exclude_urls=None):
|
|
"""
|
|
@param type: Proxy type. Direct, Manual, PAC.
|
|
@param pac_url: URL of PAC file.
|
|
@param host: Host URL of proxy.
|
|
@param port: Port of proxy.
|
|
@param exclude_urls: URLs that should not be handled by the proxy.
|
|
|
|
"""
|
|
self.type = type
|
|
self.pac_url = pac_url
|
|
self.host = host
|
|
self.port = port
|
|
self.exclude_urls = exclude_urls
|
|
self.guid = generate_random_guid()
|
|
|
|
|
|
def policy(self):
|
|
"""
|
|
Generate a network configuration policy dictionary.
|
|
|
|
@returns conf: A dictionary in the format suitable to setting as a
|
|
network policy.
|
|
|
|
"""
|
|
conf = {
|
|
'NetworkConfigurations': [
|
|
{'GUID': self.guid,
|
|
'Name': 'Managed_Ethernet',
|
|
'Ethernet': {
|
|
'Authentication': 'None'},
|
|
'Type': 'Ethernet',
|
|
'ProxySettings': {
|
|
'Type': self.type}
|
|
}
|
|
]
|
|
}
|
|
|
|
proxy = conf['NetworkConfigurations'][0]['ProxySettings']
|
|
|
|
if self.pac_url is not None:
|
|
proxy['PAC'] = self.pac_url
|
|
|
|
if self.host is not None and self.port is not None:
|
|
proxy['Manual'] = {
|
|
'HTTPProxy': {
|
|
'Host': self.host,
|
|
'Port': self.port
|
|
}
|
|
}
|
|
|
|
if self.exclude_urls is not None:
|
|
proxy['ExcludeDomains'] = self.exclude_urls
|
|
|
|
return conf
|
|
|
|
|
|
def mode(self):
|
|
"""Return ProxyMode consistent with the ProxySettings policy."""
|
|
return {
|
|
'Direct': 'direct',
|
|
'Manual': 'fixed_servers',
|
|
'PAC': 'pac_script'
|
|
}[self.type]
|