Skip to content
Extraits de code Groupes Projets
Valider 2b0f4e26 rédigé par Théo - Le Filament's avatar Théo - Le Filament
Parcourir les fichiers

refactor: simplify storage locking and unlocking

parent a1310197
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -23,10 +23,6 @@ class Tray: ...@@ -23,10 +23,6 @@ class Tray:
Manage password database openning. Manage password database openning.
storage : Storage storage : Storage
Manipulate encrypted storage. Manipulate encrypted storage.
storage_is_locked : bool
If encrypted storage if locked.
menu_storage : str
Label of storage item menu.
passwords_visible : list passwords_visible : list
List of setted passwords. List of setted passwords.
passwords_slot_names : list passwords_slot_names : list
...@@ -54,12 +50,10 @@ class Tray: ...@@ -54,12 +50,10 @@ class Tray:
Ask user to enter a PIN. Ask user to enter a PIN.
open_keepass() open_keepass()
Open KeePass database. Open KeePass database.
get_storage_label()
Get storage label according to state.
storage_action() storage_action()
Perform lock or unlock of encrypted storage depend of state. Perform lock or unlock of encrypted storage depend of state.
unlock_storage()
Unlock encrypted storage.
lock_storage()
Lock encrypted storage.
quit() quit()
Exit tray. Exit tray.
...@@ -69,18 +63,13 @@ class Tray: ...@@ -69,18 +63,13 @@ class Tray:
self.nk = nitrokey self.nk = nitrokey
self.keepass = keepass self.keepass = keepass
self.storage = storage self.storage = storage
self.storage_is_locked = self.storage.is_locked()
self.menu_storage = "🔓 Unlock storage"
if not self.storage_is_locked:
self.menu_storage = "🔒 Lock storage"
self.passwords_visible = [False] * 8 self.passwords_visible = [False] * 8
self.passwords_slot_names = [""] * 8 self.passwords_slot_names = [""] * 8
menu = Menu( menu = Menu(
MenuItem("🔑 Open KeePassXC", self.open_keepass), MenuItem("🔑 Open KeePassXC", self.open_keepass),
MenuItem(lambda text: self.menu_storage, self.storage_action), MenuItem(lambda text: self.get_storage_label(), self.storage_action),
MenuItem("😺 Get password entries", self.get_password_entries), MenuItem("😺 Get password entries", self.get_password_entries),
MenuItem( MenuItem(
"📋 Static password", "📋 Static password",
...@@ -294,38 +283,24 @@ class Tray: ...@@ -294,38 +283,24 @@ class Tray:
except Exception as message: except Exception as message:
print_err(message) print_err(message)
def storage_action(self) -> None: def get_storage_label(self) -> str:
"""Perform lock or unlock of encrypted storage depend of state. """Get storage label according to state.
"""
if self.storage_is_locked:
self.unlock_storage()
else:
self.lock_storage()
def unlock_storage(self) -> None: Returns
"""Unlock encrypted storage. -------
str
Storage label.
""" """
print_info("ui: request to unlock storage") if self.storage.is_locked:
if self.storage.unlock(): return "🔓 Unlock storage"
self.storage_is_locked = False return "🔒 Lock storage"
self.menu_storage = "🔒 Lock storage"
print_info("ui: unlocking storage success")
else:
print_err("ui: fail to unlock storage")
def lock_storage(self) -> None: def storage_action(self) -> None:
"""Lock encrypted storage. """Perform lock or unlock of encrypted storage according to state.
""" """
print_info("ui: request to lock storage") self.storage.toggle()
if self.storage.lock():
self.storage_is_locked = True
self.menu_storage = "🔓 Unlock storage"
print_info("ui: locking storage success")
else:
print_err("ui: fail to lock storage")
def quit(self) -> None: def quit(self) -> None:
"""Exit tray. """Exit tray.
...@@ -637,6 +612,8 @@ class Storage: ...@@ -637,6 +612,8 @@ class Storage:
Path to directory where plain filesystem is mounted. Path to directory where plain filesystem is mounted.
keyfile : Path keyfile : Path
Path of the keyfile to decrypt filesystem. Path of the keyfile to decrypt filesystem.
is_locked : bool
Whether storage is locked.
Methods Methods
------- -------
...@@ -646,6 +623,7 @@ class Storage: ...@@ -646,6 +623,7 @@ class Storage:
Request to mount encrypted storage. Request to mount encrypted storage.
lock() lock()
Unmount encrypted storage. Unmount encrypted storage.
toggle()
""" """
def __init__(self, cipher_dir, plain_dir, keyfile): def __init__(self, cipher_dir, plain_dir, keyfile):
...@@ -660,7 +638,9 @@ class Storage: ...@@ -660,7 +638,9 @@ class Storage:
if not self.keyfile.is_file(): if not self.keyfile.is_file():
raise Exception(f"bad keyfile: {keyfile}") raise Exception(f"bad keyfile: {keyfile}")
def is_locked(self) -> bool: self.is_locked = self.lock_check()
def lock_check(self) -> bool:
"""Check if encrypted storage is unmounted. """Check if encrypted storage is unmounted.
Returns Returns
...@@ -693,7 +673,7 @@ class Storage: ...@@ -693,7 +673,7 @@ class Storage:
`True` if unlock succeed. `True` if unlock succeed.
""" """
if not self.is_locked(): if not self.lock_check():
print_info("ui: storage is already unlocked") print_info("ui: storage is already unlocked")
return True return True
...@@ -719,7 +699,7 @@ class Storage: ...@@ -719,7 +699,7 @@ class Storage:
`True` if lock succeed. `True` if lock succeed.
""" """
if self.is_locked(): if self.lock_check():
print_info("ui: storage is already locked") print_info("ui: storage is already locked")
return True return True
...@@ -733,6 +713,29 @@ class Storage: ...@@ -733,6 +713,29 @@ class Storage:
return gocryptfs.wait() == 0 return gocryptfs.wait() == 0
def toggle(self) -> bool:
"""Mount or Unmount encrypted storage according to lock state.
Attribute `is_locked` is also updated.
Returns
-------
bool
`True` if locked, `False` if unlocked.
See Also
--------
unlock, lock
"""
if self.is_locked:
res = self.unlock()
else:
res = self.lock()
# Good optimisation. ;)
self.is_locked ^= res
return self.is_locked
class Config: class Config:
"""Config container and parser. """Config container and parser.
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter