From f52e13d316fd2e04b11873bf15c19dd7aea87bff Mon Sep 17 00:00:00 2001 From: Joseph Nuthalapati Date: Thu, 25 Oct 2018 14:23:22 -0700 Subject: [PATCH] monkeysphere: Add functional tests for import/publish keys Reviewed-by: James Valleroy --- .../features/monkeysphere.feature | 41 +++++++++++++++++ functional_tests/step_definitions/system.py | 27 +++++++++++ functional_tests/support/system.py | 46 +++++++++++++++++++ .../monkeysphere/templates/monkeysphere.html | 37 +++++++++------ 4 files changed, 137 insertions(+), 14 deletions(-) create mode 100644 functional_tests/features/monkeysphere.feature diff --git a/functional_tests/features/monkeysphere.feature b/functional_tests/features/monkeysphere.feature new file mode 100644 index 000000000..4abaca68c --- /dev/null +++ b/functional_tests/features/monkeysphere.feature @@ -0,0 +1,41 @@ +# +# This file is part of FreedomBox. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +@apps @monkeysphere +Feature: Monkeysphere + Import and publish OpenPGP keys for SSH and HTTPS keys + +Background: + Given I'm a logged in user + And the monkeysphere application is installed + And the domain name is set to mydomain.example + +Scenario: Import SSH keys + When I import SSH key for mydomain.example in monkeysphere + Then the SSH key should imported for mydomain.example in monkeysphere + +Scenario: Import HTTPS keys + When I import HTTPS key for mydomain.example in monkeysphere + Then the HTTPS key should imported for mydomain.example in monkeysphere + +Scenario: Publish SSH keys + Given the SSH key for mydomain.example is imported in monkeysphere + Then I should be able to publish SSH key for mydomain.example in monkeysphere + +Scenario: Publish HTTPS keys + Given the HTTPS key for mydomain.example is imported in monkeysphere + Then I should be able to publish HTTPS key for mydomain.example in monkeysphere diff --git a/functional_tests/step_definitions/system.py b/functional_tests/step_definitions/system.py index e74a851f9..def6eb2fb 100644 --- a/functional_tests/step_definitions/system.py +++ b/functional_tests/step_definitions/system.py @@ -295,3 +295,30 @@ def upgrades_enable_automatic(browser, enable): def upgrades_assert_automatic(browser, enabled): should_be_enabled = (enabled == 'enabled') assert system.upgrades_get_automatic(browser) == should_be_enabled + + +@given( + parsers.parse( + 'the {key_type:w} key for {domain:S} is imported in monkeysphere')) +def monkeysphere_given_import_key(browser, key_type, domain): + system.monkeysphere_import_key(browser, key_type.lower(), domain) + + +@when( + parsers.parse('I import {key_type:w} key for {domain:S} in monkeysphere')) +def monkeysphere_import_key(browser, key_type, domain): + system.monkeysphere_import_key(browser, key_type.lower(), domain) + + +@then( + parsers.parse( + 'the {key_type:w} key should imported for {domain:S} in monkeysphere')) +def monkeysphere_assert_imported_key(browser, key_type, domain): + system.monkeysphere_assert_imported_key(browser, key_type.lower(), domain) + + +@then( + parsers.parse('I should be able to publish {key_type:w} key for ' + '{domain:S} in monkeysphere')) +def monkeysphere_publish_key(browser, key_type, domain): + system.monkeysphere_publish_key(browser, key_type.lower(), domain) diff --git a/functional_tests/support/system.py b/functional_tests/support/system.py index e8b60a6d5..ba60fd265 100644 --- a/functional_tests/support/system.py +++ b/functional_tests/support/system.py @@ -17,7 +17,9 @@ from support import application, config +from . import application from .interface import default_url, nav_to_module, submit +from .service import wait_for_page_update config_page_title_language_map = { 'da': 'Generel Konfiguration', @@ -329,3 +331,47 @@ def upgrades_get_automatic(browser): """Return whether automatic software upgrades is enabled.""" nav_to_module(browser, 'upgrades') return browser.find_by_name('auto_upgrades_enabled').first.checked + + +def _monkeysphere_find_domain(browser, key_type, domain_type, domain): + """Iterate every domain of a given type which given key type.""" + keys_of_type = browser.find_by_css( + '.monkeysphere-service-{}'.format(key_type)) + for key_of_type in keys_of_type: + search_domains = key_of_type.find_by_css( + '.monkeysphere-{}-domain'.format(domain_type)) + for search_domain in search_domains: + if search_domain.text == domain: + return key_of_type, search_domain + + raise IndexError('Domain not found') + + +def monkeysphere_import_key(browser, key_type, domain): + """Import a key of specified type for given domain into monkeysphere.""" + try: + monkeysphere_assert_imported_key(browser, key_type, domain) + except IndexError: + pass + else: + return + + key, _ = _monkeysphere_find_domain(browser, key_type, 'importable', domain) + with wait_for_page_update(browser): + key.find_by_css('.button-import').click() + + +def monkeysphere_assert_imported_key(browser, key_type, domain): + """Assert that a key of specified type for given domain was imported..""" + nav_to_module(browser, 'monkeysphere') + return _monkeysphere_find_domain(browser, key_type, 'imported', domain) + + +def monkeysphere_publish_key(browser, key_type, domain): + """Publish a key of specified type for given domain from monkeysphere.""" + nav_to_module(browser, 'monkeysphere') + key, _ = _monkeysphere_find_domain(browser, key_type, 'imported', domain) + with wait_for_page_update(browser): + key.find_by_css('.button-publish').click() + + application.wait_for_config_update(browser, 'monkeysphere') diff --git a/plinth/modules/monkeysphere/templates/monkeysphere.html b/plinth/modules/monkeysphere/templates/monkeysphere.html index b230d53e8..f33442fdd 100644 --- a/plinth/modules/monkeysphere/templates/monkeysphere.html +++ b/plinth/modules/monkeysphere/templates/monkeysphere.html @@ -80,7 +80,7 @@ {% for key in status.keys.values|dictsort:"ssh_fingerprint" %} - + {% if key.service == 'ssh' %} {% trans "Secure Shell" %} @@ -93,22 +93,31 @@
    {% for domain in key.all_domains %} -
  • - {% if domain not in key.imported_domains %} + {% if domain not in key.imported_domains %} +
  • - {% elif domain not in key.available_domains %} + {{ domain }} +
  • + {% elif domain not in key.available_domains %} +
  • - {% else %} + {{ domain }} +
  • + {% else %} +
  • - {% endif %} - {{ domain }} -
  • + {{ domain }} + + {% endif %} {% endfor %}
@@ -126,29 +135,29 @@ {% if not key.openpgp_fingerprint %} -
{% csrf_token %} -
{% else %} {% if not running %} -
{% csrf_token %} -
{% endif %} {% if key.importable_domains %} -
{% csrf_token %} -
{% endif %}