Merge pull request #871 from PR0M3TH3AN/perf/optimize-totp-loop-8292868580025877023

⚡ Optimize TOTP derivation in GUI loop
This commit is contained in:
thePR0M3TH3AN authored and GitHub committed 2026-02-16 12:38:04 -05:00
commit c1cbab8c70
3 files changed
+44 -10

No files matched your search

+7
View File
@@ -307,6 +307,13 @@ class EntryService:
entry_id, self._manager.parent_seed
)
def get_totp_secret(self, entry_id: int) -> str:
"""Return the TOTP secret (base32) for the given entry."""
with self._lock:
return self._manager.entry_manager.get_totp_secret(
entry_id, self._manager.parent_seed
)
def add_entry(
self,
label: str,
+24 -9
View File
@@ -15,14 +15,6 @@ completely deterministic passwords from a BIP-85 seed, ensuring that passwords a
the same way every time. Salts would break this functionality and are not suitable for this software.
"""
try:
import orjson as json_lib # type: ignore
USE_ORJSON = True
except Exception: # pragma: no cover - fallback when orjson is missing
import json as json_lib
USE_ORJSON = False
import logging
import hashlib
import sys
@@ -684,6 +676,29 @@ class EntryManager:
seed_index = int(entry.get("index", index))
return derive_seed_phrase(bip85, seed_index, words)
def get_totp_secret(self, index: int, parent_seed: str | None = None) -> str:
"""Return the TOTP secret for the specified entry.
If the entry uses an imported secret, it is returned directly.
If the entry uses a derived secret, it is derived from the parent seed.
"""
entry = self.retrieve_entry(index)
etype = entry.get("type") if entry else None
kind = entry.get("kind") if entry else None
if not entry or (
etype != EntryType.TOTP.value and kind != EntryType.TOTP.value
):
raise ValueError("Entry is not a TOTP entry")
if "secret" in entry:
return entry["secret"]
if parent_seed is None:
raise ValueError("Seed required for derived TOTP")
totp_index = int(entry.get("index", 0))
return TotpManager.derive_secret(parent_seed, totp_index)
def get_totp_code(
self, index: int, parent_seed: str | None = None, timestamp: int | None = None
) -> str:
@@ -1315,7 +1330,7 @@ class EntryManager:
f.write(checksum)
logger.debug(f"Checksum updated and written to '{checksum_path}'.")
print(colored(f"[+] Checksum updated successfully.", "green"))
print(colored("[+] Checksum updated successfully.", "green"))
except Exception as e:
logger.error(f"Failed to update checksum: {e}", exc_info=True)
+13 -1
View File
@@ -381,6 +381,7 @@ class TotpViewerWindow(toga.Window):
box.add(self.table)
self.content = box
self._secret_cache: dict[int, str] = {}
self._running = True
self.controller.loop.create_task(self._update_loop())
self.refresh_codes()
@@ -396,7 +397,18 @@ class TotpViewerWindow(toga.Window):
filter_kind=EntryType.TOTP.value
):
entry = self.entries.retrieve_entry(idx)
code = self.entries.get_totp_code(idx)
if idx in self._secret_cache:
secret = self._secret_cache[idx]
else:
try:
secret = self.entries.get_totp_secret(idx)
self._secret_cache[idx] = secret
except Exception:
# Skip entries where secret cannot be derived (e.g. no seed)
continue
code = TotpManager.current_code_from_secret(secret)
period = int(entry.get("period", 30)) if entry else 30
remaining = TotpManager.time_remaining(period)
self.table.data.append((label, code, remaining))