Expliquer chaque type de cle dans le formulaire de generation
Choisir entre Ed25519, trois courbes NIST et RSA n'a de sens que si l'on sait ce qu'elles impliquent. Chaque type dispose desormais d'un resume, affiche a la fois en info-bulle dans la liste deroulante et sous le formulaire, mis a jour a chaque changement de selection. Chaque resume indique la courbe (ou l'absence de courbe pour RSA), l'equivalence de robustesse avec RSA selon les recommandations du NIST (SP 800-57), la compatibilite OpenSSH, et le cas d'usage : Ed25519 par defaut, ECDSA quand une politique de conformite impose les courbes NIST, RSA pour du materiel ancien. La reserve sur l'origine jamais expliquee des parametres des courbes NIST est mentionnee, puisqu'elle motive le choix d'Ed25519 par defaut. Le champ de taille en bits, qui ne concerne que RSA, est desormais active par la meme fonction : un seul endroit gere la reaction au changement de type. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -10,7 +10,9 @@ from PySide6.QtWidgets import (
|
||||
QDialogButtonBox, QApplication, QLabel,
|
||||
)
|
||||
|
||||
from app.key_manager import KeyManager, KEY_TYPE_ED25519, KEY_TYPE_RSA, KEY_TYPE_LABELS
|
||||
from app.key_manager import (
|
||||
KeyManager, KEY_TYPE_ED25519, KEY_TYPE_RSA, KEY_TYPE_LABELS, KEY_TYPE_DESCRIPTIONS,
|
||||
)
|
||||
|
||||
|
||||
class GenerateKeyDialog(QDialog):
|
||||
@@ -22,14 +24,12 @@ class GenerateKeyDialog(QDialog):
|
||||
|
||||
self.name_edit = QLineEdit()
|
||||
self.type_combo = QComboBox()
|
||||
for key_type, label in KEY_TYPE_LABELS.items():
|
||||
for index, (key_type, label) in enumerate(KEY_TYPE_LABELS.items()):
|
||||
self.type_combo.addItem(label, key_type)
|
||||
self.type_combo.setToolTip(
|
||||
"Ed25519 : courbe elliptique moderne, courte et rapide — le choix par defaut.\n"
|
||||
"ECDSA (P-256/384/521) : egalement sur courbe elliptique, utile si une politique\n"
|
||||
"interne impose les courbes NIST.\n"
|
||||
"RSA : le plus universel, a privilegier pour un serveur tres ancien."
|
||||
)
|
||||
# info-bulle par entree : visible en survolant la liste deroulante
|
||||
self.type_combo.setItemData(
|
||||
index, KEY_TYPE_DESCRIPTIONS.get(key_type, ""), Qt.ToolTipRole
|
||||
)
|
||||
self.bits_spin = QSpinBox()
|
||||
self.bits_spin.setRange(2048, 8192)
|
||||
self.bits_spin.setSingleStep(1024)
|
||||
@@ -45,16 +45,30 @@ class GenerateKeyDialog(QDialog):
|
||||
form.addRow("Commentaire :", self.comment_edit)
|
||||
layout.addLayout(form)
|
||||
|
||||
self.type_combo.currentIndexChanged.connect(
|
||||
lambda: self.bits_spin.setEnabled(self.type_combo.currentData() == KEY_TYPE_RSA)
|
||||
)
|
||||
self.bits_spin.setEnabled(False)
|
||||
# Resume du type selectionne, toujours visible : plus utile qu'une info-bulle
|
||||
# qu'il faut penser a aller chercher.
|
||||
self.type_help = QLabel()
|
||||
self.type_help.setObjectName("statusLabel")
|
||||
self.type_help.setWordWrap(True)
|
||||
self.type_help.setTextFormat(Qt.PlainText)
|
||||
self.type_help.setMinimumHeight(90)
|
||||
self.type_help.setAlignment(Qt.AlignTop)
|
||||
layout.addWidget(self.type_help)
|
||||
|
||||
self.type_combo.currentIndexChanged.connect(self._on_type_changed)
|
||||
self._on_type_changed()
|
||||
|
||||
buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
|
||||
buttons.accepted.connect(self.accept)
|
||||
buttons.rejected.connect(self.reject)
|
||||
layout.addWidget(buttons)
|
||||
|
||||
def _on_type_changed(self) -> None:
|
||||
key_type = self.type_combo.currentData()
|
||||
self.type_help.setText(KEY_TYPE_DESCRIPTIONS.get(key_type, ""))
|
||||
# la taille en bits ne concerne que RSA
|
||||
self.bits_spin.setEnabled(key_type == KEY_TYPE_RSA)
|
||||
|
||||
def values(self) -> dict:
|
||||
return dict(
|
||||
name=self.name_edit.text().strip() or "cle_ssh",
|
||||
|
||||
Reference in New Issue
Block a user