# Security ## Authentication Token Storage Access tokens are **not** stored in the SQLite database. Instead, they are stored using platform-native secure storage: ```mermaid flowchart TB LoginSuccess["Login Success"] KeyringCheck{"System Keyring
Available?"} OSCredential["Store in OS Credential Manager
- Linux: libsecret/GNOME Keyring
- macOS: Keychain
- Windows: Credential Manager
- Android: EncryptedSharedPrefs"] EncryptedFallback["Encrypted File Fallback
(AES-256-GCM)"] LoginSuccess --> KeyringCheck KeyringCheck -->|"Yes"| OSCredential KeyringCheck -->|"No"| EncryptedFallback ``` **Key Format:** ``` jellytau::{server_id}::{user_id}::access_token ``` **Rationale:** - Tokens in SQLite would be readable if the database file is accessed - System keyrings provide OS-level encryption and access control - Fallback ensures functionality on minimal systems without a keyring daemon ## Secure Storage Module **Location**: `src-tauri/src/secure_storage/` (planned) ```rust pub trait SecureStorage: Send + Sync { fn store(&self, key: &str, value: &str) -> Result<(), SecureStorageError>; fn retrieve(&self, key: &str) -> Result, SecureStorageError>; fn delete(&self, key: &str) -> Result<(), SecureStorageError>; } // Platform implementations pub struct KeyringStorage; // Uses keyring crate pub struct EncryptedFileStorage; // AES-256-GCM fallback ``` ## Network Security | Aspect | Implementation | |--------|----------------| | Transport | HTTPS required for all Jellyfin API calls | | Certificate Validation | System CA store (configurable for self-signed) | | Token Transmission | Bearer token in `Authorization` header only | | Token Refresh | Handled by Jellyfin server (long-lived tokens) | ## Local Data Protection | Data Type | Protection | |-----------|------------| | Access Tokens | System keyring or encrypted file | | Database (SQLite) | Plaintext (metadata only, no secrets) | | Downloaded Media | Filesystem permissions only | | Cached Thumbnails | Filesystem permissions only | ## Security Considerations 1. **No Secrets in SQLite**: The database contains only non-sensitive metadata 2. **Token Isolation**: Each user/server combination has a separate token entry 3. **Logout Cleanup**: Token deletion from secure storage on logout 4. **No Token Logging**: Tokens are never written to logs or debug output 5. **IPC Security**: Tauri's IPC uses structured commands, not arbitrary code execution