diff options
Diffstat (limited to 'testing/marionette/puppeteer/firefox/firefox_puppeteer/api/security.py')
-rw-r--r-- | testing/marionette/puppeteer/firefox/firefox_puppeteer/api/security.py | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/testing/marionette/puppeteer/firefox/firefox_puppeteer/api/security.py b/testing/marionette/puppeteer/firefox/firefox_puppeteer/api/security.py new file mode 100644 index 000000000..7f6532a08 --- /dev/null +++ b/testing/marionette/puppeteer/firefox/firefox_puppeteer/api/security.py @@ -0,0 +1,68 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. + +import re + +from firefox_puppeteer.base import BaseLib +from firefox_puppeteer.errors import NoCertificateError + + +class Security(BaseLib): + """Low-level access to security (SSL, TLS) related information.""" + + # Security related helpers # + + def get_address_from_certificate(self, certificate): + """Retrieves the address of the organization from the certificate information. + + The returned address may be `None` in case of no address found, or a dictionary + with the following entries: `city`, `country`, `postal_code`, `state`, `street`. + + :param certificate: A JSON object representing the certificate, which can usually be + retrieved via the current tab: `self.browser.tabbar.selected_tab.certificate`. + + :returns: Address details as dictionary + """ + regex = re.compile('.*?L=(?P<city>.+?),ST=(?P<state>.+?),C=(?P<country>.+?)' + ',postalCode=(?P<postal_code>.+?),STREET=(?P<street>.+?)' + ',serial') + results = regex.search(certificate['subjectName']) + + return results.groupdict() if results else results + + def get_certificate_for_page(self, tab_element): + """The SSL certificate assiciated with the loaded web page in the given tab. + + :param tab_element: The inner tab DOM element. + + :returns: Certificate details as JSON object. + """ + cert = self.marionette.execute_script(""" + var securityUI = arguments[0].linkedBrowser.securityUI; + var status = securityUI.QueryInterface(Components.interfaces.nsISSLStatusProvider) + .SSLStatus; + + return status ? status.serverCert : null; + """, script_args=[tab_element]) + + uri = self.marionette.execute_script(""" + return arguments[0].linkedBrowser.currentURI.spec; + """, script_args=[tab_element]) + + if cert is None: + raise NoCertificateError('No certificate found for "{}"'.format(uri)) + + return cert + + def get_domain_from_common_name(self, common_name): + """Retrieves the domain associated with a page's security certificate from the common name. + + :param certificate: A string containing the certificate's common name, which can usually + be retrieved like so: `certificate['commonName']`. + + :returns: Domain as string + """ + return self.marionette.execute_script(""" + return Services.eTLD.getBaseDomainFromHost(arguments[0]); + """, script_args=[common_name]) |