Mesure sur le terrain : chaque runner lit son depot en SSH avec sa cle de deploiement, et la forge lui refuse les autres, alors meme que les depots sont publics. Le role ne clone plus en HTTPS que les depots publics ; les depots instance, tenant et hebergeur passent en SSH, cle d'hote epinglee, commande SSH posee dans leur config git. Avant l'armement, le controleur les apporte en git bundle. La cle d'hote de la forge est declaree au plan du site et offerte par la fiche. genome_etat et genome_pousser lisent l'API authentifies ; la sonde genome-servi compte les publics ; forge_amorcer cree prives les depots des ecosystemes et du site. make forge-etancheite mesure le tout. Les depots restent publics. 95 preuves. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
76 lines
3.1 KiB
Python
76 lines
3.1 KiB
Python
#!/usr/bin/env python3
|
|
"""Le plan de `forge_cles.py` : ajouter la cle publiee, retirer la perimee, refuser l'ecriture.
|
|
|
|
Pur : aucun appel a la forge. Ce que le script ECRIT est rendu par `plan()` ; s'il se trompe
|
|
ici, il se trompe sur la forge — c'est donc ici qu'on l'epingle.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "scripts"))
|
|
import forge_cles as fc # noqa: E402
|
|
|
|
CLE = "ssh-ed25519 AAAALECTURE"
|
|
AUTRE = "ssh-ed25519 AAAAANCIENNE"
|
|
SITE = "ssh-ed25519 AAAASITE"
|
|
|
|
|
|
def voulue(depot="ops-essai", cle=CLE):
|
|
return {"locataire": "OPS-Essai", "depot": depot, "cle": cle}
|
|
|
|
|
|
class TestPlan(unittest.TestCase):
|
|
def test_une_cle_absente_s_ajoute(self):
|
|
a, r, x = fc.plan([voulue()], {"ops-essai": []})
|
|
self.assertEqual((len(a), r, x), (1, [], []))
|
|
|
|
def test_une_cle_deja_la_ne_change_rien(self):
|
|
cles = [{"id": 1, "title": fc.titre_de("OPS-Essai"), "key": CLE + " setops@ops-01", "read_only": True}]
|
|
self.assertEqual(fc.plan([voulue()], {"ops-essai": cles}), ([], [], []))
|
|
|
|
def test_une_cle_perimee_sous_le_meme_titre_se_retire(self):
|
|
cles = [{"id": 7, "title": fc.titre_de("OPS-Essai"), "key": AUTRE, "read_only": True}]
|
|
a, r, x = fc.plan([voulue()], {"ops-essai": cles})
|
|
self.assertEqual(len(a), 1)
|
|
self.assertEqual([y["id"] for y in r], [7])
|
|
|
|
def test_la_cle_du_runner_du_site_n_est_jamais_touchee(self):
|
|
cles = [{"id": 3, "title": "runner du site — site-ops-01", "key": SITE, "read_only": False}]
|
|
a, r, x = fc.plan([voulue()], {"ops-essai": cles})
|
|
self.assertEqual(r, [], "la cle d'ecriture du site n'est pas une cle de lecture perimee")
|
|
|
|
def test_une_cle_de_lecture_en_ecriture_est_refusee(self):
|
|
cles = [{"id": 4, "title": "autre", "key": CLE, "read_only": False}]
|
|
a, r, x = fc.plan([voulue()], {"ops-essai": cles})
|
|
self.assertEqual((a, r), ([], []))
|
|
self.assertEqual(len(x), 1)
|
|
|
|
def test_une_face_sans_cle_est_refusee(self):
|
|
a, r, x = fc.plan([voulue(cle="")], {})
|
|
self.assertEqual((a, r, len(x)), ([], [], 1))
|
|
|
|
|
|
class TestClassement(unittest.TestCase):
|
|
"""`forge_etancheite` : un refus RESEAU n'est jamais lu comme une protection."""
|
|
|
|
def test_https(self):
|
|
import forge_etancheite as fe
|
|
self.assertEqual(fe.classer_https(0, ""), "lu")
|
|
self.assertEqual(fe.classer_https(128, "fatal: could not read Username for 'https://x'"),
|
|
"authentification")
|
|
self.assertEqual(fe.classer_https(128, "fatal: unable to access: Connection timed out"), "reseau")
|
|
|
|
def test_ssh(self):
|
|
import forge_etancheite as fe
|
|
self.assertEqual(fe.classer_ssh(0, ""), "lu")
|
|
self.assertEqual(fe.classer_ssh(1, "Forgejo: Deploy Key: 4 is not authorized to read genome/x"),
|
|
"refuse")
|
|
self.assertEqual(fe.classer_ssh(1, "ssh: connect to host 10.37.33.11 port 22: No route to host"),
|
|
"reseau")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main(verbosity=2)
|