diff --git a/virtsecrets/templates/secrets.html b/virtsecrets/templates/secrets.html index 21fb45d1..d0ffc3ab 100644 --- a/virtsecrets/templates/secrets.html +++ b/virtsecrets/templates/secrets.html @@ -96,7 +96,7 @@
- +
diff --git a/virtsecrets/tests/test_create_secret.py b/virtsecrets/tests/test_create_secret.py index 7ed716db..55256f65 100644 --- a/virtsecrets/tests/test_create_secret.py +++ b/virtsecrets/tests/test_create_secret.py @@ -26,3 +26,26 @@ class CreateSecretTests(SimpleTestCase): self.assertEqual((secret.get("ephemeral"), secret.get("private")), ("no", "yes")) self.assertEqual(secret.find("usage").get("type"), usage_type) self.assertEqual(secret.findtext(f"usage/{element}"), data) + + +class SecretValueTests(SimpleTestCase): + def secrets(self): + with patch("vrtManager.connection.connection_manager.get_connection") as get: + conn = wvmSecrets("host", "login", "pw", 1) + secret = get.return_value.secretLookupByUUIDString.return_value + return conn, secret + + def test_the_shown_value_written_back_keeps_the_secret(self): + conn, secret = self.secrets() + secret.value.return_value = b"pw\x00\xff" + shown = conn.get_secret_value("uuid") + self.assertEqual(shown, "cHcA/w==") # base64 text, what the edit dialog shows + conn.set_secret_value("uuid", shown) + secret.setValue.assert_called_once_with(b"pw\x00\xff") + + def test_a_value_that_is_not_base64_is_refused(self): + conn, secret = self.secrets() + for value in ("b'cHc='", "not base64!"): + with self.subTest(value=value), self.assertRaises(ValueError): + conn.set_secret_value("uuid", value) + secret.setValue.assert_not_called() diff --git a/vrtManager/virtsecrets.py b/vrtManager/virtsecrets.py index 1117e7e5..eda743c9 100644 --- a/vrtManager/virtsecrets.py +++ b/vrtManager/virtsecrets.py @@ -16,14 +16,14 @@ class wvmSecrets(wvmConnect): self.wvm.secretDefineXML(etree.tostring(secret, encoding="unicode")) def get_secret_value(self, uuid): + """The value as base64 text, the form set_secret_value takes.""" secrt = self.get_secret(uuid) - value = secrt.value() - return base64.b64encode(value) + return base64.b64encode(secrt.value()).decode() def set_secret_value(self, uuid, value): secrt = self.get_secret(uuid) - value = base64.b64decode(value) - secrt.setValue(value) + # validate: a value that is not base64 is refused, not decoded to other bytes + secrt.setValue(base64.b64decode(value, validate=True)) def delete_secret(self, uuid): secrt = self.get_secret(uuid)