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 %}
-
{% else %}
{% if not running %}
-
{% endif %}
{% if key.importable_domains %}
-
{% endif %}
|