# 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]