fix(windows): suppression de sc.exe, bouton de configuration des permissions
- Supprime tous les appels à sc.exe (remplacés par PowerShell Get-Service + wireguard.exe) - wireguard.exe appelé via run_command() sous Windows (UAC gérée par son manifeste) - Supprime le double appel à uninstalltunnelservice (évite l'erreur 'service inexistant') - Ajoute un bouton dans l'onglet Élévation pour configurer les ACLs du service WireGuard (permet à un utilisateur standard de gérer ses tunnels sans UAC après configuration admin) - Incrémente la version à 0.7.2 Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
+99
-4
@@ -15,7 +15,7 @@ from app.core import dns as dns_util
|
||||
from app.core import mfa as mfa_core
|
||||
from app.ui import theme
|
||||
from app.ui.worker import ValueWorker
|
||||
from app.utils.platform_utils import is_windows
|
||||
from app.utils.platform_utils import is_windows, run_command, run_privileged
|
||||
|
||||
class AdminWindow(QDialog):
|
||||
def __init__(self, config: Config, parent=None):
|
||||
@@ -669,6 +669,21 @@ class AdminWindow(QDialog):
|
||||
"UAC à chaque connexion."
|
||||
))
|
||||
btn = QPushButton("🛡️ Vérifier l'élévation")
|
||||
btn.setStyleSheet(theme.primary_button_style())
|
||||
btn.clicked.connect(self._check_privileges)
|
||||
g.addWidget(btn)
|
||||
|
||||
# Bouton pour configurer les permissions de l'utilisateur actuel
|
||||
self._btn_grant_permissions = QPushButton(
|
||||
"🔧 Autoriser l'utilisateur à gérer ses tunnels"
|
||||
)
|
||||
self._btn_grant_permissions.setStyleSheet(theme.secondary_button_style())
|
||||
self._btn_grant_permissions.clicked.connect(self._grant_wireguard_permissions)
|
||||
self._btn_grant_permissions.setToolTip(
|
||||
"Configure les permissions pour permettre à l'utilisateur actuel de "
|
||||
"créer et supprimer des tunnels WireGuard sans UAC. Nécessite des droits admin."
|
||||
)
|
||||
g.addWidget(self._btn_grant_permissions)
|
||||
else:
|
||||
grp = QGroupBox("🔐 Droits d'exécution (sudo)")
|
||||
g = QVBoxLayout(grp)
|
||||
@@ -678,9 +693,10 @@ class AdminWindow(QDialog):
|
||||
))
|
||||
btn = QPushButton("🔐 Vérifier les droits")
|
||||
|
||||
btn.setStyleSheet(theme.primary_button_style())
|
||||
btn.clicked.connect(self._check_privileges)
|
||||
g.addWidget(btn)
|
||||
if not is_windows():
|
||||
btn.setStyleSheet(theme.primary_button_style())
|
||||
btn.clicked.connect(self._check_privileges)
|
||||
g.addWidget(btn)
|
||||
|
||||
self._priv_result = QTextEdit()
|
||||
self._priv_result.setReadOnly(True)
|
||||
@@ -1632,3 +1648,82 @@ class AdminWindow(QDialog):
|
||||
self._admin_pw2.clear()
|
||||
msg = "Mot de passe supprimé." if not p1 else "Mot de passe administrateur mis à jour."
|
||||
QMessageBox.information(self, "Succès", msg)
|
||||
|
||||
def _grant_wireguard_permissions(self):
|
||||
"""Configure les ACLs du service WireGuard pour permettre à l'utilisateur actuel
|
||||
de gérer ses propres tunnels sans UAC.
|
||||
|
||||
Nécessite des droits administrateur.
|
||||
"""
|
||||
if not is_windows():
|
||||
return
|
||||
|
||||
msg_box = QMessageBox(self)
|
||||
msg_box.setIcon(QMessageBox.Icon.Question)
|
||||
msg_box.setWindowTitle("Confirmer l'opération administrative")
|
||||
msg_box.setText(
|
||||
"Cette opération va configurer les permissions du service WireGuard "
|
||||
"pour permettre à l'utilisateur actuel de créer et supprimer des tunnels "
|
||||
"sans invite UAC.\n\n"
|
||||
"⚠️ Nécessite des droits administrateur et redémarre le service WireGuard."
|
||||
)
|
||||
msg_box.setStandardButtons(
|
||||
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No
|
||||
)
|
||||
msg_box.setDefaultButton(QMessageBox.StandardButton.No)
|
||||
|
||||
if msg_box.exec() != QMessageBox.StandardButton.Yes:
|
||||
return
|
||||
|
||||
# Commande PowerShell pour modifier les ACLs du service WireGuard
|
||||
# Ajoute à l'utilisateur actuel les droits de créer/supprimer des services WireGuardTunnel*
|
||||
ps_script = '''
|
||||
$serviceName = "WireGuard"
|
||||
$currentUserSid = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value
|
||||
|
||||
# Récupérer la SDDL actuelle
|
||||
$currentSddl = (Get-WmiObject -Class Win32_Service -Filter "Name='$serviceName'").GetSecurityDescriptor().Descriptor.DACL.ToString()
|
||||
|
||||
# Ajouter l'utilisateur actuel avec les permissions nécessaires
|
||||
# CC = Create Child (créer des services enfants)
|
||||
# LC = List Child (lister les services enfants)
|
||||
# SW = Self Write (modifier ses propres services)
|
||||
# LO = List Object (lister)
|
||||
# CR = Control (contrôle)
|
||||
$newAcl = "D:(A;;CCLCSWLOCRRC;;;$currentUserSid)"
|
||||
|
||||
# Appliquer la nouvelle SDDL (en ajoutant aux ACLs existantes)
|
||||
$fullSddl = $currentSddl + $newAcl
|
||||
sc sdset $serviceName $fullSddl
|
||||
|
||||
# Redémarrer le service pour appliquer les changements
|
||||
Restart-Service -Name $serviceName -Force -ErrorAction SilentlyContinue
|
||||
|
||||
Write-Output "Permissions configurées pour l'utilisateur $currentUserSid"
|
||||
'''
|
||||
|
||||
self._btn_grant_permissions.setEnabled(False)
|
||||
self._priv_result.setPlainText("Configuration des permissions en cours…")
|
||||
|
||||
# Exécuter avec élévation (nécessite admin)
|
||||
code, out, err = run_privileged(
|
||||
["powershell", "-NoProfile", "-NonInteractive", "-Command", ps_script],
|
||||
timeout=30
|
||||
)
|
||||
|
||||
self._btn_grant_permissions.setEnabled(True)
|
||||
|
||||
if code == 0:
|
||||
self._priv_result.setPlainText(
|
||||
f"✅ Permissions configurées avec succès !\n\n"
|
||||
f"L'utilisateur actuel peut désormais gérer ses tunnels WireGuard "
|
||||
f"sans invite UAC (si le service WireGuard est démarré).\n\n"
|
||||
f"Détails : {out.strip()}"
|
||||
)
|
||||
self._priv_result.setStyleSheet(theme.result_view_style("ok"))
|
||||
else:
|
||||
error_msg = err.strip() or out.strip() or "Erreur inconnue"
|
||||
self._priv_result.setPlainText(
|
||||
f"❌ Échec de la configuration des permissions:\n\n{error_msg}"
|
||||
)
|
||||
self._priv_result.setStyleSheet(theme.result_view_style("fail"))
|
||||
|
||||
Reference in New Issue
Block a user