From cedf7022268af8677a2f06dba8b50ed5e0377c98 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Fri, 4 Sep 2026 03:42:00 +0000 Subject: [PATCH] [FIX] kdbx : ouvrir le coffre sans tkinter, donc sur un serveur MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sur une machine sans tkinter — tout serveur — `get_kdbx()` rendait None en journalisant « pykeepass is not installed », alors que pykeepass était là. Les deux imports partageaient un seul `try` : l'absence de tkinter mettait aussi `PyKeePass` à None, et le coffre restait inouvrable même avec chemin et mot de passe configurés. tkinter ne sert qu'au sélecteur de fichier, quand aucun chemin n'est configuré ; deux blocs séparés le rendent à ce seul rôle. --- EN --- On a machine without tkinter — every server — `get_kdbx()` returned None while logging "pykeepass is not installed", though pykeepass was present. Both imports shared one `try`: a missing tkinter set `PyKeePass` to None as well, and the vault stayed unopenable even with path and password configured. tkinter serves only the file picker, when no path is configured; two separate blocks give it back that single role. Assisted-by: Claude Opus 5 --- script/todo/kdbx_manager.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/script/todo/kdbx_manager.py b/script/todo/kdbx_manager.py index 3b7ba59..8032165 100644 --- a/script/todo/kdbx_manager.py +++ b/script/todo/kdbx_manager.py @@ -9,22 +9,30 @@ from script.todo.todo_i18n import t _logger = logging.getLogger(__name__) +# DEUX blocs, et c'est le point : tkinter ne sert QU'au sélecteur de fichier +# quand aucun chemin n'est configuré. Réunis dans un seul `try`, l'absence de +# tkinter mettait aussi `PyKeePass` à None — et le coffre devenait impossible +# à ouvrir sur toute machine sans interface graphique, chemin et mot de passe +# configurés ou non. C'est-à-dire sur tous les serveurs. try: - import tkinter as tk - from tkinter import filedialog - from pykeepass import PyKeePass from pykeepass.exceptions import CredentialsError except ModuleNotFoundError: PyKeePass = None - tk = None - filedialog = None class CredentialsError(Exception): """Jamais levée ici : sans pykeepass, `get_kdbx` sort avant d'ouvrir quoi que ce soit. Définie pour que le `except` reste écrivable.""" +try: + import tkinter as tk + from tkinter import filedialog +except ModuleNotFoundError: + tk = None + filedialog = None + + class KdbxManager: def __init__(self, config_file) -> None: self._config_file = config_file