class OneHostnameWorkaroundPolicy(object): def __init__(self): self._normalPolicy = BrowserLikePolicyForHTTPS() def creatorForNetloc(self, hostname, port): if hostname == b"wrong.host.badssl.com": hostname = b"badssl.com" return self._normalPolicy.creatorForNetloc(hostname, port)
class VerifyHTTPS(object): def __init__(self): # by default, handle requests like a browser would self.default_policy = BrowserLikePolicyForHTTPS() def creatorForNetloc(self, hostname, port): # check if the hostname is in the the whitelist, otherwise return the default policy if not SETTINGS['verify_https']: return ssl.CertificateOptions(verify=False) return self.default_policy.creatorForNetloc(hostname, port)
class WhitelistContextFactory(object): def __init__(self, good_domains=None): """ :param good_domains: List of domains. The URLs must be in bytes """ if not good_domains: self.good_domains = [] else: self.good_domains = good_domains # by default, handle requests like a browser would self.default_policy = BrowserLikePolicyForHTTPS() def creatorForNetloc(self, hostname, port): # check if the hostname is in the the whitelist, # otherwise return the default policy if hostname in self.good_domains: return CertificateOptions(verify=False) return self.default_policy.creatorForNetloc(hostname, port)
class MyEndpointFactory(object): """Endpoint factory that will only connect to one specific address.""" log = Logger() def __init__(self, reactor, address): """Initialize.""" self.reactor = reactor self.address = address self.context_factory = BrowserLikePolicyForHTTPS() def endpointForURI(self, uri): # noqa: N802 """Create an endpoint for URI.""" endpoint = HostnameEndpoint(self.reactor, self.address, uri.port) if uri.scheme == b'http': return endpoint elif uri.scheme == b'https': connection_creator = self.context_factory.creatorForNetloc( uri.host, uri.port) return wrapClientTLS(connection_creator, endpoint)