blob: efbaa41f78e4f862d3a492559c18716e73b3c385 [file] [log] [blame]
# 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]