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

feat: display and refresh password slot names

parent 29603fde
Branches
Étiquettes v0.2.0
Aucune requête de fusion associée trouvée
Package: nitropy
Version: 0.1.0-1
Version: 0.2.0-1
Depends: gir1.2-appindicator3-0.1,
gpg,
libnitrokey3,
......
#!/bin/sh
echo '[Unit]
Description=NitroPy
[Service]
Type=simple
StandardOutput=journal
ExecStart=/usr/bin/nitropy
[Install]
WantedBy=default.target' > /usr/lib/systemd/user/nitropy.service
#!/bin/sh
echo '[Unit]
[Unit]
Description=NitroPy
[Service]
......@@ -9,4 +7,4 @@ StandardOutput=journal
ExecStart=/usr/bin/nitropy
[Install]
WantedBy=default.target' > /usr/lib/systemd/user/nitropy.service
WantedBy=default.target
......@@ -26,18 +26,42 @@ class Tray:
if not self.storage_is_locked:
self.menu_storage = "🔒 Lock storage"
self.passwords_visible = [False] * 8
self.passwords_slot_names = [""] * 8
self.menu = Menu(
MenuItem(lambda text: self.menu_keepass, self.open_keepass),
MenuItem(lambda text: self.menu_storage, self.storage_action),
MenuItem("😺 Get password slots", self.get_password_slots),
MenuItem(
"📋 Static password",
Menu(
MenuItem("password 1", lambda: self.password_to_clipboard(0)),
MenuItem("password 2", lambda: self.password_to_clipboard(1)),
MenuItem("password 3", lambda: self.password_to_clipboard(2)),
MenuItem("password 4", lambda: self.password_to_clipboard(3)),
MenuItem("password 5", lambda: self.password_to_clipboard(4))
)
MenuItem(lambda text: self.passwords_slot_names[0],
lambda: self.password_to_clipboard(0),
visible=lambda enabled: self.passwords_visible[0]),
MenuItem(lambda text: self.passwords_slot_names[1],
lambda: self.password_to_clipboard(1),
visible=lambda enabled: self.passwords_visible[1]),
MenuItem(lambda text: self.passwords_slot_names[2],
lambda: self.password_to_clipboard(2),
visible=lambda enabled: self.passwords_visible[2]),
MenuItem(lambda text: self.passwords_slot_names[3],
lambda: self.password_to_clipboard(3),
visible=lambda enabled: self.passwords_visible[3]),
MenuItem(lambda text: self.passwords_slot_names[4],
lambda: self.password_to_clipboard(4),
visible=lambda enabled: self.passwords_visible[4]),
MenuItem(lambda text: self.passwords_slot_names[5],
lambda: self.password_to_clipboard(5),
visible=lambda enabled: self.passwords_visible[5]),
MenuItem(lambda text: self.passwords_slot_names[6],
lambda: self.password_to_clipboard(6),
visible=lambda enabled: self.passwords_visible[6]),
MenuItem(lambda text: self.passwords_slot_names[7],
lambda: self.password_to_clipboard(7),
visible=lambda enabled: self.passwords_visible[7]),
),
visible=lambda visible: self.any_password()
),
MenuItem("❌ Quit", self.quit)
)
......@@ -47,15 +71,37 @@ class Tray:
print_info("ui: tray running")
self.tray.run()
def get_password_slots(self):
pin = self.get_pin()
self.refresh_password_slots(pin)
def refresh_password_slots(self, pin):
self.nk.connect_device()
self.nk.enable_password_safe(pin.encode())
status = self.nk.get_all_password_slot_status()
twin_slot_status = [status[2*i] and status[2*i+1] for i in range(8)]
passwords_slot_names = [f"password {i}" for i in range(1, 9)]
for i in range(8):
if twin_slot_status[i]:
passwords_slot_names[i] = self.nk.get_password_slot_name(2*i) + self.nk.get_password_slot_name(2*i+1)
self.nk.lock_device()
self.nk.logout()
self.passwords_visible = twin_slot_status
self.passwords_slot_names = passwords_slot_names
def any_password(self):
return True in self.passwords_visible
def password_to_clipboard(self, index) -> None:
print_info("ui: password to clipboard request")
password = self.get_password(index)
pin = self.get_pin()
password = self.get_password(pin, index)
self.copy_to_clipboard(password)
print_info("ui: password successfully copied to clipboard")
def get_password(self, index) -> str:
def get_password(self, pin, index) -> str:
self.nk.connect_device()
pin = self.get_pin()
self.nk.enable_password_safe(pin.encode())
part_one = self.nk.get_password(2 * index)
part_two = self.nk.get_password(2 * index + 1)
......@@ -73,7 +119,9 @@ class Tray:
def get_pin(self) -> str or None:
print_info("ui: pin request")
self.nk.connect_device()
user_attempts = self.nk.get_user_attempts()
self.nk.logout()
pinentry = subprocess.Popen(
['/usr/bin/pinentry'],
......@@ -103,7 +151,9 @@ class Tray:
def open_keepass(self) -> None:
print_info("ui: request to open KeePass database")
password = self.get_password(0)
pin = self.get_pin()
self.refresh_password_slots(pin)
password = self.get_password(pin, 0)
try:
self.keepass.open(password)
except Exception as message:
......@@ -143,6 +193,7 @@ class Nitrokey:
self.ffi = cffi.FFI()
self.lib = self.get_library()
self.lib.NK_set_debug(False)
self.password_slot_status = [False] * 16
def get_library(self):
get_string = self.ffi.string
......@@ -197,9 +248,20 @@ class Nitrokey:
def enable_password_safe(self, user_pin):
return self.lib.NK_enable_password_safe(user_pin)
def get_password(self, i):
password = self.lib.NK_get_password_safe_slot_password(i)
return self.ffi.string(password).decode('ascii')
def get_all_password_slot_status(self):
all_status = self.lib.NK_get_password_safe_slot_status()
self.password_slot_status = [bool(all_status[i]) for i in range(16)]
return self.password_slot_status
def get_password_slot_name(self, index):
if not self.password_slot_status[index]: return None
name = self.lib.NK_get_password_safe_slot_name(index)
return self.ffi.string(name).decode('utf8')
def get_password(self, index):
if not self.password_slot_status[index]: return None
password = self.lib.NK_get_password_safe_slot_password(index)
return self.ffi.string(password).decode('utf8')
def connect_device(self):
device_connected = self.lib.NK_login_auto()
......
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