Téléverser les fichiers vers "workstation-setup/src"

This commit is contained in:
2026-08-19 11:40:12 +02:00
parent 4c55001722
commit c7e98d14a4
3 changed files with 42 additions and 55 deletions
+10 -23
View File
@@ -15,7 +15,7 @@ Kirigami.ApplicationWindow {
property var steps: [ property var steps: [
{ "title": "Bienvenue", "subtitle": "Présentation" }, { "title": "Bienvenue", "subtitle": "Présentation" },
{ "title": "Mot de passe", "subtitle": "Accès de secours" }, { "title": "Mot de passe", "subtitle": "Accès de secours" },
{ "title": "YubiKey", "subtitle": "PIN personnel" }, { "title": "YubiKey", "subtitle": "Création du PIN" },
{ "title": "Terminé", "subtitle": "Poste prêt" } { "title": "Terminé", "subtitle": "Poste prêt" }
] ]
@@ -26,7 +26,6 @@ Kirigami.ApplicationWindow {
newPassword.text === confirmPassword.text newPassword.text === confirmPassword.text
property bool pinStepValid: property bool pinStepValid:
currentPin.text.length >= 4 &&
newPin.text.length >= 4 && newPin.text.length >= 4 &&
confirmPin.text.length >= 4 && confirmPin.text.length >= 4 &&
newPin.text === confirmPin.text newPin.text === confirmPin.text
@@ -664,7 +663,7 @@ Kirigami.ApplicationWindow {
Repeater { Repeater {
model: [ model: [
{ "icon": "🔑", "title": "Mot de passe", "text": "Définir votre accès local de secours" }, { "icon": "🔑", "title": "Mot de passe", "text": "Définir votre accès local de secours" },
{ "icon": "🔐", "title": "YubiKey", "text": "Personnaliser votre PIN FIDO2" } { "icon": "🔐", "title": "YubiKey", "text": "Créer votre PIN FIDO2" }
] ]
Rectangle { Rectangle {
@@ -1033,7 +1032,7 @@ Kirigami.ApplicationWindow {
Controls.Label { Controls.Label {
Layout.fillWidth: true Layout.fillWidth: true
text: "Remplacez le PIN temporaire de préparation par un PIN personnel que vous serez seul à connaître." text: "Votre YubiKey doit être vierge : aucun PIN FIDO2 nest configuré. Choisissez maintenant votre PIN personnel."
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
color: "#64748b" color: "#64748b"
font.pixelSize: 15 font.pixelSize: 15
@@ -1062,7 +1061,7 @@ Kirigami.ApplicationWindow {
Controls.Label { Controls.Label {
Layout.fillWidth: true Layout.fillWidth: true
text: "Vérifiez Verr Num avant d'utiliser le pavé numérique. En cas de doute, utilisez les chiffres situés au-dessus des lettres." text: "La YubiKey ne doit avoir aucun PIN FIDO2 existant. Le setup crée le premier PIN sans PIN temporaire ni mapping U2F."
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
color: "#92400e" color: "#92400e"
font.pixelSize: 13 font.pixelSize: 13
@@ -1070,16 +1069,6 @@ Kirigami.ApplicationWindow {
} }
} }
FieldLabel {
iconName: "dialog-password"
labelText: "PIN temporaire actuel"
}
SecretField {
id: currentPin
placeholderText: "PIN temporaire"
}
FieldLabel { FieldLabel {
iconName: "security-high" iconName: "security-high"
labelText: "Nouveau PIN" labelText: "Nouveau PIN"
@@ -1092,17 +1081,17 @@ Kirigami.ApplicationWindow {
FieldLabel { FieldLabel {
iconName: "dialog-ok-apply" iconName: "dialog-ok-apply"
labelText: "Confirmation du nouveau PIN" labelText: "Confirmation du PIN"
} }
SecretField { SecretField {
id: confirmPin id: confirmPin
placeholderText: "Confirmez le nouveau PIN" placeholderText: "Confirmez le PIN"
} }
Controls.Label { Controls.Label {
visible: confirmPin.text.length > 0 && newPin.text !== confirmPin.text visible: confirmPin.text.length > 0 && newPin.text !== confirmPin.text
text: "Les deux nouveaux PIN ne correspondent pas." text: "Les deux PIN ne correspondent pas."
color: "#dc2626" color: "#dc2626"
font.pixelSize: 12 font.pixelSize: 12
} }
@@ -1159,13 +1148,11 @@ Kirigami.ApplicationWindow {
opacity: enabled ? 1.0 : 0.45 opacity: enabled ? 1.0 : 0.45
onClicked: { onClicked: {
root.operationError = "" root.operationError = ""
var oldValue = currentPin.text
var newValue = newPin.text var newValue = newPin.text
var confirmationValue = confirmPin.text var confirmationValue = confirmPin.text
provisioning.changePin(oldValue, newValue, confirmationValue) provisioning.initializePin(newValue, confirmationValue)
currentPin.text = ""
newPin.text = "" newPin.text = ""
confirmPin.text = "" confirmPin.text = ""
} }
@@ -1214,7 +1201,7 @@ Kirigami.ApplicationWindow {
Controls.Label { Controls.Label {
Layout.maximumWidth: 680 Layout.maximumWidth: 680
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
text: "Votre mot de passe local de secours et le PIN personnel de votre YubiKey ont été configurés avec succès. Vos nouveaux secrets restent personnels et ne sont pas enregistrés dans Git." text: "Votre mot de passe local de secours et le PIN FIDO2 de votre YubiKey ont été configurés avec succès. Vos nouveaux secrets restent personnels et ne sont pas enregistrés dans Git."
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
color: "#64748b" color: "#64748b"
font.pixelSize: 15 font.pixelSize: 15
@@ -1231,7 +1218,7 @@ Kirigami.ApplicationWindow {
Repeater { Repeater {
model: [ model: [
{ "icon": "dialog-password", "title": "Mot de passe", "text": "Accès local configuré" }, { "icon": "dialog-password", "title": "Mot de passe", "text": "Accès local configuré" },
{ "icon": "security-high", "title": "YubiKey", "text": "PIN personnel configuré" }, { "icon": "security-high", "title": "YubiKey", "text": "PIN FIDO2 initialisé" },
{ "icon": "computer-laptop", "title": "Poste", "text": "Configuration finalisée" } { "icon": "computer-laptop", "title": "Poste", "text": "Configuration finalisée" }
] ]
+30 -29
View File
@@ -106,7 +106,7 @@ QString ProvisioningBackend::passwordMarker() const
QString ProvisioningBackend::pinMarker() const QString ProvisioningBackend::pinMarker() const
{ {
return stateDirectory() + QStringLiteral("/yubikey-pin-initialized"); return stateDirectory() + QStringLiteral("/yubikey-pin-created");
} }
void ProvisioningBackend::refreshState() void ProvisioningBackend::refreshState()
@@ -290,9 +290,8 @@ void ProvisioningBackend::changePassword(const QString &currentPassword,
confirmation); confirmation);
} }
void ProvisioningBackend::changePin(const QString &currentPin, void ProvisioningBackend::initializePin(const QString &newPin,
const QString &newPin, const QString &confirmation)
const QString &confirmation)
{ {
if (!authorizedUser()) { if (!authorizedUser()) {
appendLog(QStringLiteral("PIN refused: unauthorized user")); appendLog(QStringLiteral("PIN refused: unauthorized user"));
@@ -309,30 +308,29 @@ void ProvisioningBackend::changePin(const QString &currentPin,
if (!m_passwordDone) { if (!m_passwordDone) {
emit pinChangeFinished(false, emit pinChangeFinished(false,
QStringLiteral("Le mot de passe doit être personnalisé avant le PIN YubiKey.")); QStringLiteral("Le mot de passe doit être personnalisé avant d'initialiser la YubiKey."));
return; return;
} }
if (m_pinDone) { if (m_pinDone) {
emit pinChangeFinished(true, emit pinChangeFinished(true,
QStringLiteral("Le PIN YubiKey a déjà été personnalisé.")); QStringLiteral("Le PIN FIDO2 de la YubiKey a déjà été initialisé."));
return; return;
} }
if (currentPin.size() < 4 || newPin.size() < 4 || confirmation.size() < 4) { if (newPin.size() < 4 || confirmation.size() < 4) {
emit pinChangeFinished(false, emit pinChangeFinished(false,
QStringLiteral("Les PIN doivent contenir au moins 4 caractères.")); QStringLiteral("Le PIN doit contenir au moins 4 caractères."));
return; return;
} }
if (newPin != confirmation) { if (newPin != confirmation) {
emit pinChangeFinished(false, emit pinChangeFinished(false,
QStringLiteral("Les deux nouveaux PIN ne correspondent pas.")); QStringLiteral("Les deux PIN ne correspondent pas."));
return; return;
} }
if (containsLineBreak(currentPin) || containsLineBreak(newPin) if (containsLineBreak(newPin) || containsLineBreak(confirmation)) {
|| containsLineBreak(confirmation)) {
emit pinChangeFinished(false, emit pinChangeFinished(false,
QStringLiteral("Le PIN contient un caractère non pris en charge.")); QStringLiteral("Le PIN contient un caractère non pris en charge."));
return; return;
@@ -345,11 +343,13 @@ void ProvisioningBackend::changePin(const QString &currentPin,
return; return;
} }
// Le helper Étape 1 lit uniquement les deux premières lignes :
// nouveau PIN puis confirmation. Aucun ancien PIN n'est transmis.
startHelper(Operation::Pin, startHelper(Operation::Pin,
QString::fromUtf8(NIXOS_WORKSTATIONS_PIN_HELPER_PATH), QString::fromUtf8(NIXOS_WORKSTATIONS_PIN_HELPER_PATH),
currentPin,
newPin, newPin,
confirmation); confirmation,
QString());
} }
void ProvisioningBackend::startHelper(Operation operation, void ProvisioningBackend::startHelper(Operation operation,
@@ -495,8 +495,8 @@ void ProvisioningBackend::startHelper(Operation operation,
} else { } else {
markerCreated = createMarker(pinMarker()); markerCreated = createMarker(pinMarker());
message = markerCreated message = markerCreated
? QStringLiteral("Le PIN personnel de votre YubiKey est maintenant actif.") ? QStringLiteral("Le PIN FIDO2 de votre YubiKey est maintenant initialisé.")
: QStringLiteral("Le PIN a été modifié, mais l'état local n'a pas pu être enregistré. Contactez le service informatique avant de fermer la session."); : QStringLiteral("Le PIN a été initialisé, mais l'état local n'a pas pu être enregistré. Contactez le service informatique avant de fermer la session.");
} }
} else { } else {
message = safeMessageForFailure(operation, exitCode, combinedOutput, timedOut); message = safeMessageForFailure(operation, exitCode, combinedOutput, timedOut);
@@ -580,36 +580,37 @@ QString ProvisioningBackend::safeMessageForFailure(Operation operation,
return QStringLiteral("Le mot de passe n'a pas été modifié. Vérifiez le mot de passe actuel puis réessayez."); return QStringLiteral("Le mot de passe n'a pas été modifié. Vérifiez le mot de passe actuel puis réessayez.");
} }
if (output.contains(QStringLiteral("pin_not_configured"))) { if (output.contains(QStringLiteral("pin_already_configured"))) {
return QStringLiteral("Aucun PIN FIDO2 actuel n'a été détecté sur la YubiKey. Contactez le service informatique pour initialiser la clé."); return QStringLiteral("Cette YubiKey possède déjà un PIN FIDO2. Pour l’étape 1, utilisez une clé vierge ou initialisée ; aucune tentative de PIN na été effectuée.");
} }
if (output.contains(QStringLiteral("pin_auth_blocked"))) { if (output.contains(QStringLiteral("pin_auth_blocked"))) {
return QStringLiteral("Les tentatives de PIN sont temporairement bloquées. Débranchez puis rebranchez la YubiKey avant de réessayer avec le bon PIN."); return QStringLiteral("Les opérations PIN sont temporairement bloquées. Débranchez puis rebranchez la YubiKey avant toute nouvelle opération.");
} }
if (output.contains(QStringLiteral("pin_blocked"))) { if (output.contains(QStringLiteral("pin_blocked"))) {
return QStringLiteral("Le PIN FIDO2 de la YubiKey est bloqué. Contactez le service informatique ; ne réinitialisez pas la clé."); return QStringLiteral("Le PIN FIDO2 de la YubiKey est bloqué. Cette clé nest pas vierge et ne peut pas être initialisée par l’étape 1.");
}
if (output.contains(QStringLiteral("wrong_pin"))) {
return QStringLiteral("Le PIN temporaire est incorrect. N'essayez pas au hasard : le nombre de tentatives FIDO2 est limité.");
} }
if (output.contains(QStringLiteral("multiple_yubikey"))) { if (output.contains(QStringLiteral("multiple_yubikey"))) {
return QStringLiteral("Plusieurs clés FIDO2 sont détectées. Ne laissez branchée que la YubiKey à configurer puis réessayez."); return QStringLiteral("Plusieurs clés FIDO2 sont détectées. Ne laissez branchée que la YubiKey à initialiser puis réessayez.");
} }
if (output.contains(QStringLiteral("no_fido2"))) { if (output.contains(QStringLiteral("no_fido2"))) {
return QStringLiteral("La clé détectée ne fournit pas l'interface FIDO2 nécessaire au changement de PIN."); return QStringLiteral("La clé détectée ne fournit pas linterface FIDO2 nécessaire.");
} }
if (output.contains(QStringLiteral("no_yubikey"))) { if (output.contains(QStringLiteral("no_yubikey"))) {
return QStringLiteral("Aucune YubiKey compatible n'a été détectée ou le système n'a pas les droits d'accès nécessaires."); return QStringLiteral("Aucune YubiKey FIDO2 compatible na été détectée ou le système na pas les droits daccès nécessaires.");
} }
if (output.contains(QStringLiteral("pin_policy"))) { if (output.contains(QStringLiteral("pin_policy"))) {
return QStringLiteral("Le nouveau PIN ne respecte pas la politique configurée sur cette YubiKey."); return QStringLiteral("Le PIN choisi ne respecte pas la politique FIDO2 de cette YubiKey.");
}
if (output.contains(QStringLiteral("pin_state_not_updated"))
|| output.contains(QStringLiteral("pin_state_error"))) {
return QStringLiteral("La commande FIDO2 a été envoyée, mais l’état PIN retourné par la clé est incohérent. Ne réessayez pas avant vérification avec ykman fido info.");
} }
if (output.contains(QStringLiteral("input_error"))) { if (output.contains(QStringLiteral("input_error"))) {
return QStringLiteral("Le composant de configuration de la YubiKey n'a pas reçu les données attendues."); return QStringLiteral("Le composant dinitialisation de la YubiKey na pas reçu les données attendues.");
} }
if (output.contains(QStringLiteral("pin_helper_error"))) { if (output.contains(QStringLiteral("pin_helper_error"))) {
return QStringLiteral("Le composant FIDO2 a rencontré une erreur interne sans modifier le PIN."); return QStringLiteral("Le composant FIDO2 a rencontré une erreur interne sans pouvoir confirmer linitialisation du PIN.");
} }
return QStringLiteral("Le PIN YubiKey n'a pas été modifié. Vérifiez que la clé est branchée et que le PIN actuel est correct."); return QStringLiteral("Le PIN FIDO2 na pas pu être initialisé. Vérifiez que la YubiKey est vierge, connectée et compatible FIDO2.");
} }
+2 -3
View File
@@ -40,9 +40,8 @@ public:
const QString &newPassword, const QString &newPassword,
const QString &confirmation); const QString &confirmation);
Q_INVOKABLE void changePin(const QString &currentPin, Q_INVOKABLE void initializePin(const QString &newPin,
const QString &newPin, const QString &confirmation);
const QString &confirmation);
signals: signals:
void busyChanged(); void busyChanged();