"""Gestionnaire des hotes SSH connus (fichier known_hosts local).""" from __future__ import annotations from PySide6.QtCore import Qt from PySide6.QtWidgets import ( QDialog, QVBoxLayout, QHBoxLayout, QTreeWidget, QTreeWidgetItem, QPushButton, QMessageBox, QLabel, QAbstractItemView, ) from app.known_hosts_manager import KnownHostsStore class KnownHostsDialog(QDialog): def __init__(self, parent=None): super().__init__(parent) self.store = KnownHostsStore() self.setWindowTitle("Gestionnaire des hotes connus") self.setMinimumSize(560, 380) layout = QVBoxLayout(self) info = QLabel( "Cles des serveurs approuvees lors d'une premiere connexion. Si un serveur change " "d'adresse (ex. reattribution DHCP), l'application vous proposera automatiquement de " "remplacer son entree au moment de la connexion. Vous pouvez aussi nettoyer manuellement ici." ) info.setWordWrap(True) layout.addWidget(info) self.tree = QTreeWidget() self.tree.setHeaderLabels(["Hote", "Type de cle", "Empreinte"]) self.tree.setRootIsDecorated(False) self.tree.setSelectionMode(QAbstractItemView.ExtendedSelection) self.tree.setColumnWidth(0, 200) self.tree.setColumnWidth(1, 110) layout.addWidget(self.tree) self.count_label = QLabel("") self.count_label.setStyleSheet("color: #93a4c2;") layout.addWidget(self.count_label) btn_row = QHBoxLayout() self.refresh_btn = QPushButton("Actualiser") self.remove_btn = QPushButton("Supprimer la selection") self.clear_btn = QPushButton("Tout effacer") btn_row.addWidget(self.refresh_btn) btn_row.addWidget(self.remove_btn) btn_row.addWidget(self.clear_btn) btn_row.addStretch() close_btn = QPushButton("Fermer") close_btn.clicked.connect(self.accept) btn_row.addWidget(close_btn) layout.addLayout(btn_row) self.refresh_btn.clicked.connect(self.refresh) self.remove_btn.clicked.connect(self.remove_selected) self.clear_btn.clicked.connect(self.clear_all) self.refresh() def refresh(self) -> None: self.tree.clear() entries = self.store.list_entries() for entry in entries: item = QTreeWidgetItem([entry.hostname, entry.key_type, entry.fingerprint]) item.setData(0, Qt.UserRole, entry.hostname) self.tree.addTopLevelItem(item) self.count_label.setText(f"{len(entries)} hote(s) enregistre(s).") self.remove_btn.setEnabled(bool(entries)) self.clear_btn.setEnabled(bool(entries)) def remove_selected(self) -> None: items = self.tree.selectedItems() if not items: return hostnames = {item.data(0, Qt.UserRole) for item in items} if QMessageBox.question( self, "Supprimer", f"Retirer {len(hostnames)} hote(s) du fichier known_hosts ?\n" "Une confirmation d'empreinte sera redemandee a la prochaine connexion.", ) != QMessageBox.Yes: return for hostname in hostnames: self.store.remove_host(hostname) self.refresh() def clear_all(self) -> None: if QMessageBox.question( self, "Tout effacer", "Vider entierement le fichier known_hosts ?\n" "Toutes les connexions redemanderont une confirmation d'empreinte.", ) != QMessageBox.Yes: return self.store.clear_all() self.refresh()