Remove old test artifacts
This commit is contained in:
@ -1,38 +0,0 @@
|
|||||||
-----BEGIN OPENSSH PRIVATE KEY-----
|
|
||||||
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
|
|
||||||
CogUWmH6mFLCEAAAAEdGVzdAECAwQFBgc=
|
|
||||||
-----END OPENSSH PRIVATE KEY-----
|
|
||||||
@ -1 +0,0 @@
|
|||||||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC8sj5GxBabN2Dm56FIuB6p0fK4Q20DagrA0DFVq2M0oRqwlght7SOsQOPz5UWuuqjrnCX2ebPmrn+xDC5ZIy0KGXXYdP2i4+iuyxiBsFIf9OQTfPqjOOVxqoFw9V6B0XJEo3mhRsb8gWtX9xPO1f9YQow5K/SMbJE2jrbkya+unDaGQF04a27Z2QMlmNTHwxHZn+hBemQmT3TfqdlkJrEskfIqH0K3K/pl54NGa8COyCj8Af+/7njJmf0uvYj5cLS0Avgvg+SGFSd/jSKdYVMPqlz08lJK1z0xGrA/4aYMwwsT16vDJX1JuyuQLaKp5gH/yYvMroLSsir8/UAreLzaUhhLWQq8euNTQcZRLCRveVH+uyoARA0BSk1QU3tJdI8/1JMxN68g70vnpiv0agckzUXE5FxBsSxXJ8ajdBT+YtMLJ7zJnRNudEjkXYSxlQAbTB15ERaSUwAB0YSU+5jZIUpVnhU4zWNPxqF8It+apK2tkd7tijtWm0FKWZK+Kn8= test
|
|
||||||
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "test1",
|
|
||||||
"public_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCkLJeFw2U3PL35siEPrQIpDgP4KleX8A5wiKDvHFNUNgN7hzAA0IFYuzScuHGPx0ZEVSq3H4YVvE9/GJaMT1sfy64EeuGc7TEuoWataBXsTqPmrTI/jeSJ6Zpxadepazt/0ZJzb1aj0+P8Kqc9CnHPFaCwaa81GpYB7DvGM3BbK3u5n9/AGA5cm3QzGK/lxOu9T50MkR+bjutHa9nZDgTxc/4Ydm8rdAd5vVfC4yl0t56uRHvpZcdyJ+F5xYlJSbCG//bwaksnT2EEK/pPE0LHYRM8YBPWc8W/1HN4GFuRU9kzhPmNzIjXxOz4a/gEiHzFoDakZhdBKlo6egkhHcRF",
|
|
||||||
"allowed_ips": "*",
|
|
||||||
"secrets": {
|
|
||||||
"MY_FOO_VAL": "CUwIDDvZG8n9WLeJ8TKBRlBnL4MZQwXihyOD0eOWhCIL3+8Pigl0WhSzGuB+VcXffcEHmM9MIPrYY2wNEs/iDwGdD4HdABbJHOgW/ezUislghbcQ1FwxzgqeJ5388VZxa0d11bzhFklEl6mp2FCTFIpmM4SpowJ6ZmI9w5OwQVHEC74vP3rIls9BC3avZMVWUWhF1LTvoqacPxYJ7FMXeUyy4NW4Vi1A6blzLBRmDkDfaXLglUZX36BA1+zm1Gsjx5ziZQ9ObtmtR69Bwon6RuoqU1uEeAjWg/wL2h/7IovUcQeGKaSySi/mS7OZISJHpv2TLun8J+mVnl4NJNSzkQ==",
|
|
||||||
"MY_BAR_VAL": "V6M9uBELq5gjJjXZIHCIoXq0bTtSNXpfIk63BpT/DxJhNZvpmpaX6Bn1gQPYfzi00mR+CzY6nvAuH8fVd8nMcUhng1DdGl7fUhiDLEBBwuWaHZ/iprGA6z8ZoPDkO6bNRWI2733VYjqZ1IQHEWlt0NuzXGFwUOS60YKljd/gZ8AgKrIioV/Pvuz7JT8Ko1gLIOXzzwStPjaB3T07zTX8F3Tz1F8Vc8iYtC+Xd5lzk1AQJE3HvsDChFNXwE0fbbKxe6zQwg9XzIrkU3bwtzKaEjyOPg8uke+ZqGSgpVz5c98iWRf215pcalgF5iKrm5bFW8EhE4DgCkkSbWpzmWp27A=="
|
|
||||||
},
|
|
||||||
"testing_private_key": "-----BEGIN OPENSSH PRIVATE KEY-----\nb3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcnNhAAAA\nAwEAAQAAAQEApCyXhcNlNzy9+bIhD60CKQ4D+CpXl/AOcIig7xxTVDYDe4cwANCBWLs0nLhxj8dG\nRFUqtx+GFbxPfxiWjE9bH8uuBHrhnO0xLqFmrWgV7E6j5q0yP43kiemacWnXqWs7f9GSc29Wo9Pj\n/CqnPQpxzxWgsGmvNRqWAew7xjNwWyt7uZ/fwBgOXJt0Mxiv5cTrvU+dDJEfm47rR2vZ2Q4E8XP+\nGHZvK3QHeb1XwuMpdLeerkR76WXHcifhecWJSUmwhv/28GpLJ09hBCv6TxNCx2ETPGAT1nPFv9Rz\neBhbkVPZM4T5jcyI18Ts+Gv4BIh8xaA2pGYXQSpaOnoJIR3ERQAAA7gH0327B9N9uwAAAAdzc2gt\ncnNhAAABAQCkLJeFw2U3PL35siEPrQIpDgP4KleX8A5wiKDvHFNUNgN7hzAA0IFYuzScuHGPx0ZE\nVSq3H4YVvE9/GJaMT1sfy64EeuGc7TEuoWataBXsTqPmrTI/jeSJ6Zpxadepazt/0ZJzb1aj0+P8\nKqc9CnHPFaCwaa81GpYB7DvGM3BbK3u5n9/AGA5cm3QzGK/lxOu9T50MkR+bjutHa9nZDgTxc/4Y\ndm8rdAd5vVfC4yl0t56uRHvpZcdyJ+F5xYlJSbCG//bwaksnT2EEK/pPE0LHYRM8YBPWc8W/1HN4\nGFuRU9kzhPmNzIjXxOz4a/gEiHzFoDakZhdBKlo6egkhHcRFAAAAAwEAAQAAAQAO+YFFom22RNxY\nLPL+jMuMZpqelXAha/RJN/Ej9ju0i+uz5gAPJvWRXBv/qoQzNtw2KeWISAARNfizUVEUEb3wT8H6\n5yFykKECjZbBvON5BzBEf2o8qUrd+HiNnTeeXKlT7o/y5wYqUc6zBsnz06LPXnvmc3FXgOoLWVqX\naMQ4EID4y1pVKSFAE4GYstS2JKrpBtCkK22MyIBhMD5+Oxgy1FN7WPUfkVBSJiKsTLuh2nlyZCt+\nZQI9H81kaiqztvl1R+VFfi2xG9YVADLatcNb+1tuQbscAY9A2zdmHurYTAmUg++VlLGUXoMtZy2u\nPYmTBKFNm7cD+okKjr9akSCBAAAAgDsH/+xzp8ia99ZyRvfObnWBhQXt7yDJOco3E34zURTmfYEv\nNVKBfnC1NHZMofBbR05ww8BqQE5z0zV050pNdEDVLs92CJpSvXAoKO99OCbPFyNNSBWYUbZajZ8G\nmVDZ9EkbK0PkeHZAYDRSWmF3Hx1RVjp0+dvWtQCjdCONtMX+AAAAgQDh1lo8a+dm5CV2vROPfYLl\nlGrLnUsZY7JmctiFBkgU7TuRDfpgN4gRM64fCmbFKetLuoe6OG7UWTyWIk1zyfV0rm52amhZJvQL\nLyKX+R90XcTUvssa6XRPMFx31FkJ5mc97HAX1qsZQpfWB6Y9u5vgUpXOgki3Ra7q/MdFEU2jgQAA\nAIEAuhnnRv8ebM/ugRkHEXvS2Mndeh/37u77HxRhUyd6bbZnzIuH9FXw9LkMOH+jnLNJqU4CKQQD\ni5faIZwSrc+u+TsQAZqvCbmhGbvM6Pjl9cI3ucp6lj7ntI3MvrzygfR168bO0KCU8KUzGsbqqTur\n0DvUcZDqCFepbaGOEXdP8sUAAAAAAQID\n-----END OPENSSH PRIVATE KEY-----\n"
|
|
||||||
}
|
|
||||||
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "test2",
|
|
||||||
"public_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCPzsiHOLEFlTp3OiBDoYssfLfYboziOTyBXKT7O5Nd8++5JdhE0qw+4mxj3ehEhcHsmB7TU5DtwEEtbrVi4eStLD8hGTgfeGIhTHUbd7sIJhAPPPbEnW/JdJURxNZNBLiEHN5VAMYgvqVIpeYoTOk15gHHonwCpZAAmFX3X8TgkBH5sJLUW5eOx915mWcTAGm174KNhXgYAWFV0e5Q4fi6ksXv1eYXfxvGrbOQS5pgoHN21pNy7hfukF1AhTf2eAS1EXnXlt3dVzfFRI+73+vAtquifv68ECBMfeoUSkUBT7plH315Ibg4/9RCW83zJVA/JlLUnJ6Az9d7SvTCJT/R",
|
|
||||||
"allowed_ips": "*",
|
|
||||||
"secrets": {
|
|
||||||
"MY_BAR_VAL": "awE7TWONHKELcggRR24kFSkmPdsb6pANll/DEfLnB7rs5LeiPm2i8jcpvr0PZuDwvRmcZShMMJDCjqwvlh+ioCcCNNz0htH7O4Uh7ycf5+RzKzOnRWGOG5sfOBajtETjsmZf7YKGC7dd4RypZ8u0hxwY0kyCgqep8JiMjacGw8Gdz/BTDvGJ8RzWcUcwf1IjhtCBSDyC/GWPkB7uIbHqi4AUbJ6Y86T317z/NeW15sZpC/1vRW+sJeNV09lzXYMBsaya6Z1ppyUfCSEywZgCV+olp64DP570t2H8fBZkRo5Z7F2PuUpv4exWkcW5tXXv0OgH4Kwi4Zr+AHauqR/CgQ==",
|
|
||||||
"MY_FOO_VAL": "c98Jq4WYJ9gXezNipzrzCcHDFIaDsIMW+HnDE8shZxX/uELkfPIC0j6MQHPWJvxMJs2/c+unJ7yX6MWe/oSQbSfKM+5YzNhSh37fTmeJDAa1giooNg0trDEmzS3EgXuTIk5ltPkg31wCp2FDrViBERnc4QsOWXdPztKAbuJYj4/pSSU5mk4lmjnXg0fLHmK3n79wXGpMST25/LlZFUbu7n5pJZRZzth88qMu3/rvQqsDTt6JWeqBYo3A+UJnT1Me/PpDTQqvzhPKHf9IGIIN+QVYyvq+ya5kgO3fTlomIwNqznuE6Tw0nxFXP67cbc8F93+rmVyxaj2US758oX61jw=="
|
|
||||||
},
|
|
||||||
"testing_private_key": "-----BEGIN OPENSSH PRIVATE KEY-----\nb3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcnNhAAAA\nAwEAAQAAAQEAj87IhzixBZU6dzogQ6GLLHy32G6M4jk8gVyk+zuTXfPvuSXYRNKsPuJsY93oRIXB\n7Jge01OQ7cBBLW61YuHkrSw/IRk4H3hiIUx1G3e7CCYQDzz2xJ1vyXSVEcTWTQS4hBzeVQDGIL6l\nSKXmKEzpNeYBx6J8AqWQAJhV91/E4JAR+bCS1FuXjsfdeZlnEwBpte+CjYV4GAFhVdHuUOH4upLF\n79XmF38bxq2zkEuaYKBzdtaTcu4X7pBdQIU39ngEtRF515bd3Vc3xUSPu9/rwLaron7+vBAgTH3q\nFEpFAU+6ZR99eSG4OP/UQlvN8yVQPyZS1JyegM/Xe0r0wiU/0QAAA7gH0BRKB9AUSgAAAAdzc2gt\ncnNhAAABAQCPzsiHOLEFlTp3OiBDoYssfLfYboziOTyBXKT7O5Nd8++5JdhE0qw+4mxj3ehEhcHs\nmB7TU5DtwEEtbrVi4eStLD8hGTgfeGIhTHUbd7sIJhAPPPbEnW/JdJURxNZNBLiEHN5VAMYgvqVI\npeYoTOk15gHHonwCpZAAmFX3X8TgkBH5sJLUW5eOx915mWcTAGm174KNhXgYAWFV0e5Q4fi6ksXv\n1eYXfxvGrbOQS5pgoHN21pNy7hfukF1AhTf2eAS1EXnXlt3dVzfFRI+73+vAtquifv68ECBMfeoU\nSkUBT7plH315Ibg4/9RCW83zJVA/JlLUnJ6Az9d7SvTCJT/RAAAAAwEAAQAAAQAKu8Dc0t7nj0VP\nW8/HrHmCRwbDyTCLvADnmN4ZgE9V/lyAobH8JQtFIEo9w/TPlHouagY2+LBDBov206IHMNwMDtbh\nZgv50VblrFq7Q5r6lziwoni6oROUYja0HlBubDFHbw4rIwUmsYQNoZBFpsPrSXENkPOXkProCHa2\nIXhE2G9Sk1i2Gxjwpk2gZ4zqYZd0MVs1YkySj1XyDc87JDKLZN9c0KXk0O9sTNqUp8sOospk++zx\n44zN/u3AES3F86HUjqZD2gJDLXJYAwZSFKcabLRXFMaupGw9XSEhIvb9ET3rSxqdE9/79JuyG3ep\nXUUmDfPIB/SMzCYLo9NwEXQJAAAAgFthqmQkXj84I+DrKxk4PVebufruIFkgdtN4aYVSSUvLFAzP\ngYIaBCroviUruSY1EPR25wnhADkMgJxteca/irkYS/Rg84lmGzWZvnmD6ppZTvAGqjrGkflztBkG\nGv3MNi1dALckzGHNDmQX3yjMhh8qYZiCjMCVB+7Cc94sy5B+AAAAgQDA4qIzdSDKuctl5KSFNMhN\nWdNx8KQTahuXLzmB3cMKzNPT/0ZiBbX2bIn4R+HsxYmc3eBDUuRyMrG6cMyyFujECzQdNC1Gky8L\nQDH0GyMDVlD9c4lQenk9MIr9dy9P1XfFaMMQL6z3tAkpoXugPgaimgbRGoD2MzVpRM8u9GMEpQAA\nAIEAvt0V5NSaO1odjhNJIEF5MubPIvhWLsE223rKSN0uzbYXWlA6zLaZiLmp8+InzXSuyxhvZTMx\nXCx1KqzRDPHhzCDTI7kkw3o3YFWVvmZBEm/nClTloEK8PB3/MoUu1rXQhqkKmtyf5knYdf5dZ10z\nD/d+gS2nILbdt1zuR3Hc6r0AAAAAAQID\n-----END OPENSSH PRIVATE KEY-----\n"
|
|
||||||
}
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "test3",
|
|
||||||
"public_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC8sj5GxBabN2Dm56FIuB6p0fK4Q20DagrA0DFVq2M0oRqwlght7SOsQOPz5UWuuqjrnCX2ebPmrn+xDC5ZIy0KGXXYdP2i4+iuyxiBsFIf9OQTfPqjOOVxqoFw9V6B0XJEo3mhRsb8gWtX9xPO1f9YQow5K/SMbJE2jrbkya+unDaGQF04a27Z2QMlmNTHwxHZn+hBemQmT3TfqdlkJrEskfIqH0K3K/pl54NGa8COyCj8Af+/7njJmf0uvYj5cLS0Avgvg+SGFSd/jSKdYVMPqlz08lJK1z0xGrA/4aYMwwsT16vDJX1JuyuQLaKp5gH/yYvMroLSsir8/UAreLzaUhhLWQq8euNTQcZRLCRveVH+uyoARA0BSk1QU3tJdI8/1JMxN68g70vnpiv0agckzUXE5FxBsSxXJ8ajdBT+YtMLJ7zJnRNudEjkXYSxlQAbTB15ERaSUwAB0YSU+5jZIUpVnhU4zWNPxqF8It+apK2tkd7tijtWm0FKWZK+Kn8= test",
|
|
||||||
"allowed_ips": "*",
|
|
||||||
"secrets": {
|
|
||||||
"MY_FOO_VAL": "iEeVK30h9fecLimeTYdBxkur9YDY+YuImCY0vyWVnMCqcsoz/kvmFUwiq5Qx1hKp5kS0XILS7xsltR4UIGLMHngqM1nuY0d2K6KmiiYl7bCGImtxOs9rhm2GlBq/H91FOOI58lLXQrPE/N099X+E+qlM6PnH5JcRaMObZ9lnR2n1OnlxCeisCHZLjve1iCkAd/+0F09atQNIAymC2CkL/wCtuWZTep4LoKnwHNfy4zHDX06l0u1t6twilA9OFiqQNU62AGaTCNK/E48QyyNYweRONkAO4d2++yMBDjslGuQLS8lpruvGn8slOjHN/rv/gJD8MEhcKvaSCzacHLw5LdWDU78Hs7HZcrp9XZ81qFJnIsrkGDO+hLiKvHd5hisJOpu/V1jCUoh/XRlVlOqmei2ZDKyqrJEixT+VAdK2okB9Ap+rQ1NqYtjtigif+lYwYKRUjroY92wCTYStKWFORUpkjOO5adHWQ10Eeced3FOLrTukXB0kPDM5lnTJgk/+"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,416 +0,0 @@
|
|||||||
"""Tests for the Admin HTTP API"""
|
|
||||||
|
|
||||||
from ipaddress import IPv4Address
|
|
||||||
import unittest
|
|
||||||
|
|
||||||
from fastapi.testclient import TestClient
|
|
||||||
|
|
||||||
from sshecret.types import ClientSpecification
|
|
||||||
from sshecret.testing import TestClientSpec, TestContext, api_context
|
|
||||||
from sshecret.webapi.api import get_app_settings
|
|
||||||
from sshecret.webapi.router import app
|
|
||||||
from sshecret.crypto import (
|
|
||||||
generate_private_key,
|
|
||||||
generate_public_key_string,
|
|
||||||
decode_string,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class TestLockUnlock(unittest.TestCase):
|
|
||||||
"""Test lock and unlock."""
|
|
||||||
|
|
||||||
def setUp(self) -> None:
|
|
||||||
"""Set up testing."""
|
|
||||||
|
|
||||||
def test_unlock_lock(self) -> None:
|
|
||||||
"""Test unlocking."""
|
|
||||||
with api_context([]) as context:
|
|
||||||
app.dependency_overrides[get_app_settings] = context.get_settings
|
|
||||||
testclient: TestClient = TestClient(app)
|
|
||||||
response = testclient.post(
|
|
||||||
"api/v1/auth/unlock", json={"password": context.master_password}
|
|
||||||
)
|
|
||||||
body = response.json()
|
|
||||||
self.assertEqual(response.status_code, 200)
|
|
||||||
self.assertIn("session_id", body)
|
|
||||||
session_id = body["session_id"]
|
|
||||||
session_header = {"session-id": str(session_id)}
|
|
||||||
status_resp = testclient.get("/api/v1/auth/status", headers=session_header)
|
|
||||||
self.assertEqual(status_resp.status_code, 200)
|
|
||||||
status_body = status_resp.json()
|
|
||||||
self.assertIn("message", status_body)
|
|
||||||
self.assertEqual(str(status_body["message"]), "UNLOCKED")
|
|
||||||
lock_resp = testclient.post("/api/v1/auth/lock", headers=session_header)
|
|
||||||
self.assertEqual(lock_resp.status_code, 200)
|
|
||||||
lock_body = lock_resp.json()
|
|
||||||
lock_status = lock_body.get("message")
|
|
||||||
self.assertEqual(lock_status, "LOCKED")
|
|
||||||
|
|
||||||
def test_get_clients(self) -> None:
|
|
||||||
"""Test get clients."""
|
|
||||||
test_data = [
|
|
||||||
TestClientSpec(
|
|
||||||
"webserver",
|
|
||||||
{
|
|
||||||
"API_KEY": "test",
|
|
||||||
"OTHER_API_KEY": "test2",
|
|
||||||
},
|
|
||||||
),
|
|
||||||
TestClientSpec(
|
|
||||||
"db_server",
|
|
||||||
{
|
|
||||||
"DB_PASSWORD": "test",
|
|
||||||
},
|
|
||||||
),
|
|
||||||
]
|
|
||||||
with api_context(test_data) as context:
|
|
||||||
app.dependency_overrides[get_app_settings] = context.get_settings
|
|
||||||
testclient: TestClient = TestClient(app)
|
|
||||||
client_resp = testclient.get("/api/v1/clients")
|
|
||||||
clients = client_resp.json()
|
|
||||||
self.assertIsInstance(clients, list)
|
|
||||||
self.assertEqual(len(clients), 2)
|
|
||||||
|
|
||||||
for client in clients:
|
|
||||||
ClientSpecification.model_validate(client)
|
|
||||||
|
|
||||||
def test_get_client(self) -> None:
|
|
||||||
"""Test get specific client."""
|
|
||||||
test_data = [
|
|
||||||
TestClientSpec(
|
|
||||||
"webserver",
|
|
||||||
{
|
|
||||||
"API_KEY": "test",
|
|
||||||
"OTHER_API_KEY": "test2",
|
|
||||||
},
|
|
||||||
),
|
|
||||||
TestClientSpec(
|
|
||||||
"db_server",
|
|
||||||
{
|
|
||||||
"DB_PASSWORD": "test",
|
|
||||||
},
|
|
||||||
),
|
|
||||||
]
|
|
||||||
with api_context(test_data) as context:
|
|
||||||
app.dependency_overrides[get_app_settings] = context.get_settings
|
|
||||||
testclient: TestClient = TestClient(app)
|
|
||||||
client_resp = testclient.get("/api/v1/clients/webserver")
|
|
||||||
self.assertEqual(client_resp.status_code, 200)
|
|
||||||
client_dict = client_resp.json()
|
|
||||||
ClientSpecification.model_validate(client_dict)
|
|
||||||
|
|
||||||
def test_update_client(self) -> None:
|
|
||||||
"""Test update client with trivial value."""
|
|
||||||
test_data = [
|
|
||||||
TestClientSpec(
|
|
||||||
"webserver",
|
|
||||||
{
|
|
||||||
"API_KEY": "test",
|
|
||||||
"OTHER_API_KEY": "test2",
|
|
||||||
},
|
|
||||||
),
|
|
||||||
TestClientSpec(
|
|
||||||
"db_server",
|
|
||||||
{
|
|
||||||
"DB_PASSWORD": "test",
|
|
||||||
},
|
|
||||||
),
|
|
||||||
]
|
|
||||||
with api_context(test_data) as context:
|
|
||||||
app.dependency_overrides[get_app_settings] = context.get_settings
|
|
||||||
testclient: TestClient = TestClient(app)
|
|
||||||
client_resp = testclient.get("/api/v1/clients/webserver")
|
|
||||||
self.assertEqual(client_resp.status_code, 200)
|
|
||||||
client_dict = client_resp.json()
|
|
||||||
client = ClientSpecification.model_validate(client_dict)
|
|
||||||
unlock_response = testclient.post(
|
|
||||||
"/api/v1/auth/unlock", json={"password": context.master_password}
|
|
||||||
)
|
|
||||||
body = unlock_response.json()
|
|
||||||
self.assertEqual(unlock_response.status_code, 200)
|
|
||||||
self.assertIn("session_id", body)
|
|
||||||
session_id = body["session_id"]
|
|
||||||
session_header = {"session-id": str(session_id)}
|
|
||||||
serialized_client = client.model_dump(exclude_unset=True)
|
|
||||||
serialized_client["allowed_ips"] = ["192.0.2.1"]
|
|
||||||
update_response = testclient.put(
|
|
||||||
"/api/v1/clients/webserver",
|
|
||||||
json=serialized_client,
|
|
||||||
headers=session_header,
|
|
||||||
)
|
|
||||||
self.assertAlmostEqual(update_response.status_code, 200)
|
|
||||||
update_body = update_response.json()
|
|
||||||
updated_client = ClientSpecification.model_validate(update_body)
|
|
||||||
assert updated_client.allowed_ips == [IPv4Address("192.0.2.1")]
|
|
||||||
|
|
||||||
def test_update_client_sshkey(self) -> None:
|
|
||||||
"""Update client SSH key."""
|
|
||||||
test_data = [
|
|
||||||
TestClientSpec(
|
|
||||||
"webserver",
|
|
||||||
{
|
|
||||||
"API_KEY": "test",
|
|
||||||
"OTHER_API_KEY": "test2",
|
|
||||||
},
|
|
||||||
),
|
|
||||||
TestClientSpec(
|
|
||||||
"db_server",
|
|
||||||
{
|
|
||||||
"DB_PASSWORD": "test",
|
|
||||||
},
|
|
||||||
),
|
|
||||||
]
|
|
||||||
with api_context(test_data) as context:
|
|
||||||
app.dependency_overrides[get_app_settings] = context.get_settings
|
|
||||||
testclient: TestClient = TestClient(app)
|
|
||||||
new_private_key = generate_private_key()
|
|
||||||
public_key = generate_public_key_string(new_private_key.public_key())
|
|
||||||
client_resp = testclient.get("/api/v1/clients/webserver")
|
|
||||||
self.assertEqual(client_resp.status_code, 200)
|
|
||||||
client_dict = client_resp.json()
|
|
||||||
client = ClientSpecification.model_validate(client_dict)
|
|
||||||
unlock_response = testclient.post(
|
|
||||||
"/api/v1/auth/unlock", json={"password": context.master_password}
|
|
||||||
)
|
|
||||||
body = unlock_response.json()
|
|
||||||
self.assertEqual(unlock_response.status_code, 200)
|
|
||||||
self.assertIn("session_id", body)
|
|
||||||
session_id = body["session_id"]
|
|
||||||
session_header = {"session-id": str(session_id)}
|
|
||||||
|
|
||||||
serialized_client = client.model_dump(exclude_unset=True)
|
|
||||||
serialized_client["public_key"] = public_key
|
|
||||||
update_response = testclient.put(
|
|
||||||
"/api/v1/clients/webserver",
|
|
||||||
json=serialized_client,
|
|
||||||
headers=session_header,
|
|
||||||
)
|
|
||||||
self.assertAlmostEqual(update_response.status_code, 200)
|
|
||||||
update_body = update_response.json()
|
|
||||||
updated_client = ClientSpecification.model_validate(update_body)
|
|
||||||
for secret, value in updated_client.secrets.items():
|
|
||||||
old_secret = client.secrets[secret]
|
|
||||||
self.assertNotEqual(old_secret, value)
|
|
||||||
cleartext = decode_string(value, new_private_key)
|
|
||||||
self.assertTrue(cleartext.startswith("test"))
|
|
||||||
|
|
||||||
# check that the backend is properly updated.
|
|
||||||
new_client_resp = testclient.get("/api/v1/clients/webserver")
|
|
||||||
new_client_dict = new_client_resp.json()
|
|
||||||
self.assertEqual(new_client_resp.status_code, 200)
|
|
||||||
new_client = ClientSpecification.model_validate(new_client_dict)
|
|
||||||
for secret, value in new_client.secrets.items():
|
|
||||||
matching_value = updated_client.secrets[secret]
|
|
||||||
self.assertEqual(value, matching_value)
|
|
||||||
|
|
||||||
def test_delete_client(self) -> None:
|
|
||||||
"""Test the delete_client API."""
|
|
||||||
test_data = [
|
|
||||||
TestClientSpec(
|
|
||||||
"webserver",
|
|
||||||
{
|
|
||||||
"API_KEY": "test",
|
|
||||||
"OTHER_API_KEY": "test2",
|
|
||||||
},
|
|
||||||
),
|
|
||||||
TestClientSpec(
|
|
||||||
"db_server",
|
|
||||||
{
|
|
||||||
"DB_PASSWORD": "test",
|
|
||||||
},
|
|
||||||
),
|
|
||||||
]
|
|
||||||
with api_context(test_data) as context:
|
|
||||||
app.dependency_overrides[get_app_settings] = context.get_settings
|
|
||||||
testclient: TestClient = TestClient(app)
|
|
||||||
client_resp = testclient.get("/api/v1/clients/webserver")
|
|
||||||
self.assertEqual(client_resp.status_code, 200)
|
|
||||||
delete_resp = testclient.delete("/api/v1/clients/webserver")
|
|
||||||
self.assertEqual(delete_resp.status_code, 204)
|
|
||||||
get_resp = testclient.get("/api/v1/clients/webserver")
|
|
||||||
self.assertEqual(get_resp.status_code, 404)
|
|
||||||
|
|
||||||
def test_add_client(self) -> None:
|
|
||||||
"""Test the add_client API."""
|
|
||||||
test_data = [
|
|
||||||
TestClientSpec(
|
|
||||||
"webserver",
|
|
||||||
{
|
|
||||||
"API_KEY": "test",
|
|
||||||
"OTHER_API_KEY": "test2",
|
|
||||||
},
|
|
||||||
),
|
|
||||||
TestClientSpec(
|
|
||||||
"db_server",
|
|
||||||
{
|
|
||||||
"DB_PASSWORD": "test",
|
|
||||||
},
|
|
||||||
),
|
|
||||||
]
|
|
||||||
with api_context(test_data) as context:
|
|
||||||
app.dependency_overrides[get_app_settings] = context.get_settings
|
|
||||||
testclient: TestClient = TestClient(app)
|
|
||||||
private_key = generate_private_key()
|
|
||||||
public_key = generate_public_key_string(private_key.public_key())
|
|
||||||
new_client = ClientSpecification(
|
|
||||||
name="webserver2",
|
|
||||||
public_key=public_key,
|
|
||||||
)
|
|
||||||
add_resp = testclient.post(
|
|
||||||
"/api/v1/clients",
|
|
||||||
json=new_client.model_dump(exclude_unset=True, exclude_defaults=True),
|
|
||||||
)
|
|
||||||
self.assertEqual(add_resp.status_code, 201)
|
|
||||||
body = add_resp.json()
|
|
||||||
client = ClientSpecification.model_validate(body)
|
|
||||||
self.assertEqual(client.public_key, public_key)
|
|
||||||
fetched_client = self.fetch_client(testclient, "webserver2")
|
|
||||||
self.assertEqual(fetched_client, client)
|
|
||||||
|
|
||||||
def test_list_secrets(self) -> None:
|
|
||||||
"""Test the list_secrets API."""
|
|
||||||
test_data = [
|
|
||||||
TestClientSpec(
|
|
||||||
"webserver",
|
|
||||||
{
|
|
||||||
"API_KEY": "test",
|
|
||||||
"OTHER_API_KEY": "test2",
|
|
||||||
},
|
|
||||||
),
|
|
||||||
TestClientSpec(
|
|
||||||
"db_server",
|
|
||||||
{
|
|
||||||
"DB_PASSWORD": "test",
|
|
||||||
},
|
|
||||||
),
|
|
||||||
]
|
|
||||||
with api_context(test_data) as context:
|
|
||||||
app.dependency_overrides[get_app_settings] = context.get_settings
|
|
||||||
testclient: TestClient = TestClient(app)
|
|
||||||
headers = self.unlock(context, testclient)
|
|
||||||
resp = testclient.get("/api/v1/secrets", headers=headers)
|
|
||||||
self.assertEqual(resp.status_code, 200)
|
|
||||||
expected = [
|
|
||||||
{"name": "API_KEY", "assigned_clients": ["webserver"]},
|
|
||||||
{"name": "OTHER_API_KEY", "assigned_clients": ["webserver"]},
|
|
||||||
{"name": "DB_PASSWORD", "assigned_clients": ["db_server"]},
|
|
||||||
]
|
|
||||||
body = resp.json()
|
|
||||||
|
|
||||||
self.assertListEqual(body, expected)
|
|
||||||
|
|
||||||
def test_get_secret(self) -> None:
|
|
||||||
"""Test the get_secret API."""
|
|
||||||
test_data = [
|
|
||||||
TestClientSpec(
|
|
||||||
"db_server",
|
|
||||||
{
|
|
||||||
"DB_PASSWORD": "test",
|
|
||||||
},
|
|
||||||
),
|
|
||||||
]
|
|
||||||
with api_context(test_data) as context:
|
|
||||||
app.dependency_overrides[get_app_settings] = context.get_settings
|
|
||||||
testclient: TestClient = TestClient(app)
|
|
||||||
headers = self.unlock(context, testclient)
|
|
||||||
resp = testclient.get("/api/v1/secrets/DB_PASSWORD", headers=headers)
|
|
||||||
self.assertEqual(resp.status_code, 200)
|
|
||||||
expected = {"name": "DB_PASSWORD", "secret": "test"}
|
|
||||||
body = resp.json()
|
|
||||||
self.assertDictEqual(body, expected)
|
|
||||||
|
|
||||||
def test_update_secret_provided(self) -> None:
|
|
||||||
"""Test the update_secret API.
|
|
||||||
|
|
||||||
Tests updating a secret with a provided string.
|
|
||||||
"""
|
|
||||||
test_data = [
|
|
||||||
TestClientSpec(
|
|
||||||
"db_server",
|
|
||||||
{
|
|
||||||
"DB_PASSWORD": "test",
|
|
||||||
},
|
|
||||||
),
|
|
||||||
]
|
|
||||||
with api_context(test_data) as context:
|
|
||||||
app.dependency_overrides[get_app_settings] = context.get_settings
|
|
||||||
testclient: TestClient = TestClient(app)
|
|
||||||
headers = self.unlock(context, testclient)
|
|
||||||
request = {"secret": "not-so-secret"}
|
|
||||||
resp = testclient.put(
|
|
||||||
"/api/v1/secrets/DB_PASSWORD", json=request, headers=headers
|
|
||||||
)
|
|
||||||
self.assertEqual(resp.status_code, 200)
|
|
||||||
expected = {"name": "DB_PASSWORD", "secret": None}
|
|
||||||
body = resp.json()
|
|
||||||
self.assertDictEqual(body, expected)
|
|
||||||
|
|
||||||
def test_update_secret_auto(self) -> None:
|
|
||||||
"""Test the update_secret API.
|
|
||||||
|
|
||||||
Tests updating a secret with auto-generated string.
|
|
||||||
"""
|
|
||||||
test_data = [
|
|
||||||
TestClientSpec(
|
|
||||||
"db_server",
|
|
||||||
{
|
|
||||||
"DB_PASSWORD": "test",
|
|
||||||
},
|
|
||||||
),
|
|
||||||
]
|
|
||||||
with api_context(test_data) as context:
|
|
||||||
app.dependency_overrides[get_app_settings] = context.get_settings
|
|
||||||
testclient: TestClient = TestClient(app)
|
|
||||||
headers = self.unlock(context, testclient)
|
|
||||||
request = {"secret": None, "auto_generate": True}
|
|
||||||
resp = testclient.put(
|
|
||||||
"/api/v1/secrets/DB_PASSWORD", json=request, headers=headers
|
|
||||||
)
|
|
||||||
self.assertEqual(resp.status_code, 200)
|
|
||||||
body = resp.json()
|
|
||||||
secret = body.get("secret")
|
|
||||||
self.assertIsNotNone(secret)
|
|
||||||
|
|
||||||
def test_delete_secret(self) -> None:
|
|
||||||
"""Test delete_secret API."""
|
|
||||||
test_data = [
|
|
||||||
TestClientSpec(
|
|
||||||
"webserver",
|
|
||||||
{
|
|
||||||
"API_KEY": "test",
|
|
||||||
"OTHER_API_KEY": "test2",
|
|
||||||
},
|
|
||||||
),
|
|
||||||
]
|
|
||||||
with api_context(test_data) as context:
|
|
||||||
app.dependency_overrides[get_app_settings] = context.get_settings
|
|
||||||
testclient: TestClient = TestClient(app)
|
|
||||||
headers = self.unlock(context, testclient)
|
|
||||||
resp = testclient.delete("/api/v1/secrets/OTHER_API_KEY", headers=headers)
|
|
||||||
self.assertEqual(resp.status_code, 204)
|
|
||||||
get_resp = testclient.get("/api/v1/secrets/OTHER_API_KEY", headers=headers)
|
|
||||||
self.assertEqual(get_resp.status_code, 404)
|
|
||||||
|
|
||||||
def fetch_client(
|
|
||||||
self, testclient: TestClient, client_name: str
|
|
||||||
) -> ClientSpecification:
|
|
||||||
"""Fetch a client."""
|
|
||||||
client_resp = testclient.get(f"/api/v1/clients/{client_name}")
|
|
||||||
self.assertEqual(client_resp.status_code, 200)
|
|
||||||
client_dict = client_resp.json()
|
|
||||||
client = ClientSpecification.model_validate(client_dict)
|
|
||||||
return client
|
|
||||||
|
|
||||||
def unlock(self, context: TestContext, testclient: TestClient) -> dict[str, str]:
|
|
||||||
"""Unlock the session."""
|
|
||||||
response = testclient.post(
|
|
||||||
"/api/v1/auth/unlock", json={"password": context.master_password}
|
|
||||||
)
|
|
||||||
body = response.json()
|
|
||||||
session_id = body["session_id"]
|
|
||||||
session_header = {"session-id": str(session_id)}
|
|
||||||
return session_header
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
unittest.main()
|
|
||||||
@ -1,125 +0,0 @@
|
|||||||
"""Tests of client loader."""
|
|
||||||
# pyright: reportUninitializedInstanceVariable=false, reportImplicitOverride=false
|
|
||||||
|
|
||||||
import unittest
|
|
||||||
from sshecret.backends import FileTableBackend
|
|
||||||
from sshecret.utils import generate_client_object
|
|
||||||
from sshecret.testing import TestClientSpec, test_context
|
|
||||||
|
|
||||||
|
|
||||||
class TestFileTableBackend(unittest.TestCase):
|
|
||||||
"""Test the file table backend."""
|
|
||||||
|
|
||||||
def setUp(self) -> None:
|
|
||||||
"""Set up tests."""
|
|
||||||
self.test_dataset: list[TestClientSpec] = [
|
|
||||||
TestClientSpec("webserver", {"SECRET_TOKEN": "mysecrettoken"}),
|
|
||||||
TestClientSpec("dbserver", {"DB_ROOT_PASSWORD": "mysecretpassword"}),
|
|
||||||
]
|
|
||||||
|
|
||||||
def test_init(self) -> None:
|
|
||||||
"""Test instance creation."""
|
|
||||||
with test_context(self.test_dataset) as testdir:
|
|
||||||
backend = FileTableBackend(testdir)
|
|
||||||
self.assertGreater(len(backend.table), 0)
|
|
||||||
|
|
||||||
def test_lookup_name(self) -> None:
|
|
||||||
"""Test lookup name."""
|
|
||||||
with test_context(self.test_dataset) as testdir:
|
|
||||||
backend = FileTableBackend(testdir)
|
|
||||||
webserver = backend.lookup_name("webserver")
|
|
||||||
self.assertIsNotNone(webserver)
|
|
||||||
assert webserver is not None
|
|
||||||
self.assertEqual(webserver.name, "webserver")
|
|
||||||
|
|
||||||
def test_add_client(self) -> None:
|
|
||||||
"""Test whether it is possible to add a client."""
|
|
||||||
with test_context(self.test_dataset) as testdir:
|
|
||||||
backend = FileTableBackend(testdir)
|
|
||||||
new_client = generate_client_object(
|
|
||||||
"backupserver", {"BACKUP_KEY": "mysecretbackupkey"}
|
|
||||||
)
|
|
||||||
backend.add_client(new_client)
|
|
||||||
expected_file = testdir / "backupserver.json"
|
|
||||||
self.assertTrue(expected_file.exists())
|
|
||||||
result = backend.lookup_name("backupserver")
|
|
||||||
self.assertIsNotNone(result)
|
|
||||||
|
|
||||||
def test_add_secret(self) -> None:
|
|
||||||
"""Test whether it is possible to add a secret."""
|
|
||||||
with test_context(self.test_dataset) as testdir:
|
|
||||||
backend = FileTableBackend(testdir)
|
|
||||||
backend.add_secret("webserver", "OTHER_SECRET_TOKEN", "myothersecrettoken")
|
|
||||||
webserver = backend.lookup_name("webserver")
|
|
||||||
assert webserver is not None
|
|
||||||
self.assertIsNotNone(webserver.secrets.get("OTHER_SECRET_TOKEN"))
|
|
||||||
self.assertNotEqual(
|
|
||||||
webserver.secrets["OTHER_SECRET_TOKEN"], "myothersecrettoken"
|
|
||||||
)
|
|
||||||
|
|
||||||
backend.add_secret(
|
|
||||||
"dbserver", "UNENCRYPTED_THING", "thisiscleartext", encrypted=True
|
|
||||||
)
|
|
||||||
dbserver = backend.lookup_name("dbserver")
|
|
||||||
assert dbserver is not None
|
|
||||||
self.assertEqual(dbserver.secrets["UNENCRYPTED_THING"], "thisiscleartext")
|
|
||||||
|
|
||||||
def test_update_client(self) -> None:
|
|
||||||
"""Test update_client method."""
|
|
||||||
with test_context(self.test_dataset) as testdir:
|
|
||||||
backend = FileTableBackend(testdir)
|
|
||||||
webserver = backend.lookup_name("webserver")
|
|
||||||
assert webserver is not None
|
|
||||||
webserver.allowed_ips = "192.0.2.1"
|
|
||||||
backend.update_client("webserver", webserver)
|
|
||||||
new_obj = backend.lookup_name("webserver")
|
|
||||||
assert new_obj is not None
|
|
||||||
self.assertEqual(new_obj.allowed_ips, "192.0.2.1")
|
|
||||||
|
|
||||||
def test_remove_client(self) -> None:
|
|
||||||
"""Test removal of client."""
|
|
||||||
with test_context(self.test_dataset) as testdir:
|
|
||||||
backend = FileTableBackend(testdir)
|
|
||||||
backend.remove_client("webserver", persistent=False)
|
|
||||||
webserver = backend.lookup_name("webserver")
|
|
||||||
self.assertIsNone(webserver)
|
|
||||||
webserver_file = testdir / "webserver.json"
|
|
||||||
self.assertTrue(webserver_file.exists())
|
|
||||||
|
|
||||||
def test_remove_client_persistent(self) -> None:
|
|
||||||
"""Test removal of client."""
|
|
||||||
with test_context(self.test_dataset) as testdir:
|
|
||||||
backend = FileTableBackend(testdir)
|
|
||||||
backend.remove_client("webserver", persistent=True)
|
|
||||||
webserver = backend.lookup_name("webserver")
|
|
||||||
self.assertIsNone(webserver)
|
|
||||||
webserver_file = testdir / "webserver.json"
|
|
||||||
self.assertFalse(webserver_file.exists())
|
|
||||||
|
|
||||||
def test_lookup_by_secret(self) -> None:
|
|
||||||
"""Test lookup of secrets."""
|
|
||||||
dataset = [
|
|
||||||
TestClientSpec("webserver", {"SECRET_TOKEN": "mysecrettoken"}),
|
|
||||||
TestClientSpec("webserver2", {"SECRET_TOKEN": "mysecrettoken"}),
|
|
||||||
TestClientSpec("webserver3", {"SECRET_TOKEN": "mysecrettoken"}),
|
|
||||||
TestClientSpec("dbserver", {"DB_ROOT_PASSWORD": "mysecretpassword"}),
|
|
||||||
TestClientSpec("dbserver2", {"DB_ROOT_PASSWORD": "mysecretpassword"}),
|
|
||||||
TestClientSpec("appserver", {"DB_ROOT_PASSWORD": "mysecretpassword", "SECRET_TOKEN": "mysecrettoken"}),
|
|
||||||
]
|
|
||||||
with test_context(dataset) as testdir:
|
|
||||||
backend = FileTableBackend(testdir)
|
|
||||||
token_mapping = backend.lookup_by_secret("SECRET_TOKEN")
|
|
||||||
self.assertEqual(len(token_mapping), 4)
|
|
||||||
token_mapping_names = [client.name for client in token_mapping]
|
|
||||||
self.assertIn("webserver2", token_mapping_names)
|
|
||||||
self.assertIn("appserver", token_mapping_names)
|
|
||||||
db_mapping = backend.lookup_by_secret("DB_ROOT_PASSWORD")
|
|
||||||
db_mapping_names = [client.name for client in db_mapping]
|
|
||||||
self.assertEqual(len(db_mapping), 3)
|
|
||||||
self.assertNotIn("webserver", db_mapping_names)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
unittest.main()
|
|
||||||
@ -1,53 +0,0 @@
|
|||||||
"""Tests of the encryption methods."""
|
|
||||||
|
|
||||||
import os
|
|
||||||
from pathlib import Path
|
|
||||||
from typing import override
|
|
||||||
import unittest
|
|
||||||
|
|
||||||
from sshecret.crypto import (
|
|
||||||
load_public_key,
|
|
||||||
load_private_key,
|
|
||||||
encrypt_string,
|
|
||||||
decode_string,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def read_public_key() -> bytes:
|
|
||||||
"""Load public key."""
|
|
||||||
keyname = "testkey"
|
|
||||||
public_key_file = Path(os.path.dirname(__file__)) / f"{keyname}.pub"
|
|
||||||
with open(public_key_file, "rb") as f:
|
|
||||||
public_key = f.read()
|
|
||||||
|
|
||||||
return public_key
|
|
||||||
|
|
||||||
|
|
||||||
class TestBasicCrypto(unittest.TestCase):
|
|
||||||
"""Test basic crypto functionality."""
|
|
||||||
|
|
||||||
@override
|
|
||||||
def setUp(self) -> None:
|
|
||||||
"""Set up keys."""
|
|
||||||
keyname = "testkey"
|
|
||||||
self.private_key: str = os.path.join(os.path.dirname(__file__), keyname)
|
|
||||||
self.public_key: bytes = read_public_key()
|
|
||||||
|
|
||||||
def test_key_loading(self) -> None:
|
|
||||||
"""Test basic flow."""
|
|
||||||
load_public_key(self.public_key)
|
|
||||||
load_private_key(self.private_key)
|
|
||||||
self.assertEqual(True, True)
|
|
||||||
|
|
||||||
def test_encrypt_decrypt(self) -> None:
|
|
||||||
"""Test encryption and decryption."""
|
|
||||||
password = "MySecretPassword"
|
|
||||||
public_key = load_public_key(self.public_key)
|
|
||||||
encoded = encrypt_string(password, public_key)
|
|
||||||
private_key = load_private_key(self.private_key)
|
|
||||||
decoded = decode_string(encoded, private_key)
|
|
||||||
self.assertEqual(password, decoded)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
unittest.main()
|
|
||||||
@ -1,63 +0,0 @@
|
|||||||
"""Tests for the keepass password manager."""
|
|
||||||
|
|
||||||
import tempfile
|
|
||||||
import unittest
|
|
||||||
from pathlib import Path
|
|
||||||
from typing import override
|
|
||||||
from sshecret.types import BasePasswordReader, PasswordContext
|
|
||||||
from sshecret.keepass import KeepassManager
|
|
||||||
|
|
||||||
TEST_PASSWORD = "test_password"
|
|
||||||
|
|
||||||
class Rot13PasswordReader(BasePasswordReader):
|
|
||||||
"""This password reader returns the identifier backwards."""
|
|
||||||
|
|
||||||
@override
|
|
||||||
def get_password(self, identifier: str, repeated: bool = False) -> str:
|
|
||||||
"""Get password."""
|
|
||||||
return identifier[::-1]
|
|
||||||
|
|
||||||
|
|
||||||
class TestKeepass(unittest.TestCase):
|
|
||||||
"""Test the keepass password manager."""
|
|
||||||
|
|
||||||
def __init__(self, methodName: str = "runTest") -> None:
|
|
||||||
super().__init__(methodName)
|
|
||||||
self.reader_context: PasswordContext
|
|
||||||
|
|
||||||
@override
|
|
||||||
def setUp(self) -> None:
|
|
||||||
"""Set up testing."""
|
|
||||||
self.reader_context = PasswordContext(Rot13PasswordReader())
|
|
||||||
|
|
||||||
def test_db_create(self) -> None:
|
|
||||||
"""Test db creation."""
|
|
||||||
with tempfile.TemporaryDirectory() as testdir:
|
|
||||||
testdbfile = Path(testdir) / "test.kdbx"
|
|
||||||
|
|
||||||
testdb = KeepassManager.create_database(str(testdbfile.absolute()), self.reader_context)
|
|
||||||
self.assertTrue(testdbfile.exists())
|
|
||||||
|
|
||||||
# Close the file and reopen
|
|
||||||
|
|
||||||
testdb.close_database()
|
|
||||||
with self.assertRaises(RuntimeError):
|
|
||||||
testdb.keepass.version
|
|
||||||
testdb.open_database(self.reader_context)
|
|
||||||
self.assertIsNotNone(testdb.keepass)
|
|
||||||
|
|
||||||
def test_password_creation(self) -> None:
|
|
||||||
"""Test password creation."""
|
|
||||||
with tempfile.TemporaryDirectory() as testdir:
|
|
||||||
testdbfile = Path(testdir) / "test.kdbx"
|
|
||||||
|
|
||||||
testdb = KeepassManager.create_database(str(testdbfile.absolute()), self.reader_context)
|
|
||||||
password = testdb.generate_password("foobar")
|
|
||||||
testdb.close_database()
|
|
||||||
testdb.open_database(self.reader_context)
|
|
||||||
saved_password = testdb.get_password("foobar")
|
|
||||||
self.assertEqual(saved_password, password)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
unittest.main()
|
|
||||||
@ -1,40 +0,0 @@
|
|||||||
"""Test passsword readers."""
|
|
||||||
|
|
||||||
from typing import override
|
|
||||||
import unittest
|
|
||||||
from io import StringIO
|
|
||||||
from unittest.mock import patch
|
|
||||||
from dotenv import load_dotenv
|
|
||||||
|
|
||||||
|
|
||||||
from sshecret.password_readers import InputPasswordReader, EnvironmentPasswordReader
|
|
||||||
|
|
||||||
|
|
||||||
class TestInputPasswordReader(unittest.TestCase):
|
|
||||||
"""Test input password reader."""
|
|
||||||
|
|
||||||
def test_reader(self) -> None:
|
|
||||||
"""Test reader."""
|
|
||||||
input_password = "testpassword"
|
|
||||||
with patch("getpass.getpass", return_value=input_password):
|
|
||||||
received_password = InputPasswordReader().get_password("test_password")
|
|
||||||
self.assertEqual(received_password, "testpassword")
|
|
||||||
|
|
||||||
|
|
||||||
class TestEnvPasswordReader(unittest.TestCase):
|
|
||||||
"""Test environment password reader."""
|
|
||||||
|
|
||||||
@override
|
|
||||||
def setUp(self) -> None:
|
|
||||||
"""Set up environment."""
|
|
||||||
env = StringIO("SSHECRET_test=secretthing")
|
|
||||||
load_dotenv(stream=env)
|
|
||||||
|
|
||||||
def test_env_loader(self) -> None:
|
|
||||||
"""Test environment loading."""
|
|
||||||
password = EnvironmentPasswordReader().get_password("test")
|
|
||||||
self.assertEqual(password, "secretthing")
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
unittest.main()
|
|
||||||
@ -1,38 +0,0 @@
|
|||||||
-----BEGIN OPENSSH PRIVATE KEY-----
|
|
||||||
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
|
|
||||||
-----END OPENSSH PRIVATE KEY-----
|
|
||||||
@ -1 +0,0 @@
|
|||||||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDSE7JNMi1XeBFFOC+9r3Y19rWQsW5mCwPBEzBILoNoduRhEVDN7JW66ysumrdsVJGdC6bU6ETdoOSb4ryyOCyTpfwEaEcvSq0/WBIHXoNdOe7M6137GbADgy9fzl9L2iXJH4wycI6bas+bKr4qSfg/wWmgs8U+IM8Cwp2zBFV6uHV9GpU/Ei/YZ2uK6fCEPeXNMHHkU1n6LHOKMAph/XJCKimEIVAG5ZPq3zUFtx9IhmXwpzM/19fg7LLsjvLSyY6ZZghNGieZaFmibtqkQcQygTpArRhU2TNjqvUwb998qOVC57wms0PCsjxSqSd4dRTIj7X5/QtemFC1ZoI3DpNyT5A6BeV1t/A6mSYcbI2BeHYxpGcIqZ/9ChpT6AV9Pac6bKVD3LFAmKx41aGfNTOvFPmkRxZFnMJmyVfLZCXpAvn9coe9LuoFbGxaFzJoJav7RRjwTbvPVqSNSDKAfeqVZ7np3R6k/wUi7VKbp9xzNnqwdu5kgwnXoYcoJb75t+M= eising@Allans-MacBook-Air.local
|
|
||||||
Reference in New Issue
Block a user