fix(crypto): correct cipher type indices to match Bitwarden API

This commit is contained in:
2026-08-26 14:47:23 +02:00
parent ea7f126e73
commit a3e9f9ab0e
3 changed files with 21 additions and 7 deletions
+1 -1
View File
@@ -383,7 +383,7 @@ class BitwardenClient:
# Decrypt ciphers # Decrypt ciphers
decrypted_ciphers = [] decrypted_ciphers = []
for cipher in ciphers: for cipher in ciphers:
if cipher.get("type") in [1, 2, 3, 4]: # Login, Note, Card, Identity if cipher.get("type") in [0, 1, 2, 3]: # Login, Note, Card, Identity
decrypted = self.crypto.decrypt_cipher( decrypted = self.crypto.decrypt_cipher(
cipher, enc_key, mac_key cipher, enc_key, mac_key
) )
+6 -6
View File
@@ -233,7 +233,7 @@ class BitwardenCrypto:
cipher_type = cipher_data.get("type") cipher_type = cipher_data.get("type")
if cipher_type == 1: # Login if cipher_type == 0: # Login
login = cipher_data.get("login", {}) login = cipher_data.get("login", {})
result["login"] = { result["login"] = {
"username": self._decrypt_field( "username": self._decrypt_field(
@@ -255,11 +255,11 @@ class BitwardenCrypto:
for u in login.get("uris", []) for u in login.get("uris", [])
], ],
} }
elif cipher_type == 2: # Secure Note elif cipher_type == 1: # Secure Note
result["notes"] = self._decrypt_field( result["notes"] = self._decrypt_field(
cipher_data.get("notes"), enc_key, mac_key cipher_data.get("notes"), enc_key, mac_key
) )
elif cipher_type == 3: # Card elif cipher_type == 2: # Card
card = cipher_data.get("card", {}) card = cipher_data.get("card", {})
result["card"] = { result["card"] = {
"cardholderName": self._decrypt_field( "cardholderName": self._decrypt_field(
@@ -278,7 +278,7 @@ class BitwardenCrypto:
card.get("expYear"), enc_key, mac_key card.get("expYear"), enc_key, mac_key
), ),
} }
elif cipher_type == 4: # Identity elif cipher_type == 3: # Identity
identity = cipher_data.get("identity", {}) identity = cipher_data.get("identity", {})
result["identity"] = { result["identity"] = {
"firstName": self._decrypt_field( "firstName": self._decrypt_field(
@@ -310,8 +310,8 @@ class BitwardenCrypto:
}) })
result["fields"] = fields result["fields"] = fields
# Decrypt notes # Decrypt notes (only for non-Note types, Notes already handled above)
if cipher_data.get("notes") and cipher_type != 2: if cipher_data.get("notes") and cipher_type != 1:
result["notes"] = self._decrypt_field( result["notes"] = self._decrypt_field(
cipher_data.get("notes"), enc_key, mac_key cipher_data.get("notes"), enc_key, mac_key
) )
+14
View File
@@ -108,6 +108,20 @@ class Plugin:
"email": email, "email": email,
"kdf_info": self.client.get_kdf_info(), "kdf_info": self.client.get_kdf_info(),
}) })
# Sync and decrypt vault immediately if we have keys
if self._enc_key and self._mac_key:
try:
sync_data = await self.client.sync_vault()
self._vault_data = sync_data
self._decrypted_vault = self.client.decrypt_vault(
sync_data, self._enc_key, self._mac_key
)
return {"success": True, "needs_unlock": False}
except Exception as e:
decky_plugin.logger.error(f"Vault sync/decrypt failed: {e}")
return {"success": True, "needs_unlock": False}
return {"success": True, "needs_unlock": result.get("enc_key") is None} return {"success": True, "needs_unlock": result.get("enc_key") is None}
return {"success": False, "error": "Login failed"} return {"success": False, "error": "Login failed"}