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