diff --git a/src/components/device-management/device-management.ts b/src/components/device-management/device-management.ts index 6d1d351..e30bd60 100644 --- a/src/components/device-management/device-management.ts +++ b/src/components/device-management/device-management.ts @@ -649,8 +649,8 @@ export class DeviceManagementComponent extends HTMLElement { if (file) { try { const text = await file.text(); - const data = JSON.parse(text); - // Use data variable + const _data = JSON.parse(text); + // Data parsed but not used yet (for future use) // Import the account data if (window.importJSON) { diff --git a/src/components/login-modal/login-modal.js b/src/components/login-modal/login-modal.js index 27f96d6..0ef06b5 100755 --- a/src/components/login-modal/login-modal.js +++ b/src/components/login-modal/login-modal.js @@ -9,5 +9,7 @@ export async function closeLoginModal() { router.closeLoginModal(); } +/* eslint-disable no-undef */ window.confirmLogin = confirmLogin; window.closeLoginModal = closeLoginModal; +/* eslint-enable no-undef */ diff --git a/src/components/secure-credentials/secure-credentials.ts b/src/components/secure-credentials/secure-credentials.ts index b0523c7..32e9c78 100644 --- a/src/components/secure-credentials/secure-credentials.ts +++ b/src/components/secure-credentials/secure-credentials.ts @@ -232,7 +232,7 @@ export class SecureCredentialsComponent { try { await this.updateUI(); this.showMessage('Credentials actualisés', 'success'); - } catch (error) { + } catch (_error) { this.showMessage('Erreur lors de l\'actualisation', 'error'); } } diff --git a/src/components/security-mode-selector/security-mode-selector.ts b/src/components/security-mode-selector/security-mode-selector.ts index b95abb2..de27363 100644 --- a/src/components/security-mode-selector/security-mode-selector.ts +++ b/src/components/security-mode-selector/security-mode-selector.ts @@ -17,12 +17,12 @@ export interface SecurityModeConfig { export class SecurityModeSelector { private container: HTMLElement; private selectedMode: SecurityMode | null = null; - private onModeSelected: (mode: SecurityMode) => void; + private onModeSelected: (_mode: SecurityMode) => void; private onCancel: () => void; constructor( container: HTMLElement, - onModeSelected: (mode: SecurityMode) => void, + onModeSelected: (_mode: SecurityMode) => void, onCancel: () => void ) { this.container = container; diff --git a/src/pages/birthday-setup/birthday-setup.ts b/src/pages/birthday-setup/birthday-setup.ts index 9247308..7c512b2 100644 --- a/src/pages/birthday-setup/birthday-setup.ts +++ b/src/pages/birthday-setup/birthday-setup.ts @@ -105,7 +105,7 @@ document.addEventListener('DOMContentLoaded', async () => { } } // Vérifier que le wallet contient bien les données attendues - if (wallet.sp_wallet && wallet.sp_wallet.birthday !== undefined) { + if (wallet.sp_wallet?.birthday !== undefined) { console.log('✅ Wallet found in database with birthday:', wallet.sp_wallet.birthday); } else { throw new Error('Wallet found but missing required data (sp_wallet or birthday)'); diff --git a/src/pages/block-sync/block-sync.ts b/src/pages/block-sync/block-sync.ts index a2631cf..b02d68e 100644 --- a/src/pages/block-sync/block-sync.ts +++ b/src/pages/block-sync/block-sync.ts @@ -141,7 +141,7 @@ document.addEventListener("DOMContentLoaded", async () => { } // Vérifier que le wallet contient bien les données attendues - if (wallet.sp_wallet && wallet.sp_wallet.birthday !== undefined) { + if (wallet.sp_wallet?.birthday !== undefined) { console.log('✅ Wallet found in database with birthday:', wallet.sp_wallet.birthday); } else { throw new Error('Wallet found but missing required data (sp_wallet or birthday)'); diff --git a/src/pages/home/home.ts b/src/pages/home/home.ts index 8f84494..59372b0 100755 --- a/src/pages/home/home.ts +++ b/src/pages/home/home.ts @@ -91,7 +91,7 @@ export async function initHomePage(): Promise { } // Vérifier que le wallet contient bien les données attendues - if (wallet.sp_wallet && wallet.sp_wallet.birthday !== undefined) { + if (wallet.sp_wallet?.birthday !== undefined) { console.log('✅ Wallet found in database with birthday:', wallet.sp_wallet.birthday); } else { throw new Error('Wallet found but missing required data (sp_wallet or birthday)'); diff --git a/src/router.ts b/src/router.ts index e02436d..1419390 100755 --- a/src/router.ts +++ b/src/router.ts @@ -49,14 +49,14 @@ export async function checkStorageStateAndNavigate(): Promise { // Vérifier si la date anniversaire est configurée (wallet avec birthday > 0) const device = await services.getDeviceFromDatabase(); - if (device && device.sp_wallet && device.sp_wallet.birthday > 0) { + if (device?.sp_wallet && device.sp_wallet.birthday > 0) { console.log('🎂 Birthday is configured, navigating to pairing'); await navigate('home'); // Pour l'instant, rediriger vers home pour le pairing return; } // Vérifier si le wallet existe (même avec birthday = 0) - if (device && device.sp_wallet) { + if (device?.sp_wallet) { console.log('💰 Wallet exists but birthday not set, navigating to birthday-setup'); await navigate('birthday-setup'); return; @@ -1255,7 +1255,7 @@ async function handleSecurityKeyManagement(): Promise { /** * ÉTAPE 5: Handshake */ -async function performHandshake(services: any): Promise { +async function performHandshake(_services: any): Promise { console.log('🤝 Performing handshake...'); try { diff --git a/src/services/credentials/encryption.service.ts b/src/services/credentials/encryption.service.ts index c514211..0ac8421 100644 --- a/src/services/credentials/encryption.service.ts +++ b/src/services/credentials/encryption.service.ts @@ -90,10 +90,9 @@ export class EncryptionService { return btoa(String.fromCharCode(...combined)); } catch (error) { - secureLogger.error('Failed to encrypt with password', { + secureLogger.error('Failed to encrypt with password', error as Error, { component: 'EncryptionService', - operation: 'encryptWithPassword', - error: error instanceof Error ? error.message : String(error) + operation: 'encryptWithPassword' }); throw error; } @@ -206,10 +205,9 @@ export class EncryptionService { return new TextDecoder().decode(decrypted); } catch (error) { - secureLogger.error('Failed to decrypt with password base64', { + secureLogger.error('Failed to decrypt with password base64', error as Error, { component: 'EncryptionService', - operation: 'decryptWithPasswordBase64', - error: error instanceof Error ? error.message : String(error) + operation: 'decryptWithPasswordBase64' }); throw error; } @@ -236,7 +234,7 @@ export class EncryptionService { const key = await crypto.subtle.deriveKey( { name: 'PBKDF2', - salt: salt, + salt: new Uint8Array(salt), iterations: iterations, hash: 'SHA-256' }, diff --git a/src/services/credentials/storage.service.ts b/src/services/credentials/storage.service.ts index d722711..2e7b488 100644 --- a/src/services/credentials/storage.service.ts +++ b/src/services/credentials/storage.service.ts @@ -103,8 +103,7 @@ export class StorageService { async hasCredentials(): Promise { try { const credentials = await this.getCredentials(); - return credentials !== null && - credentials.spendKey !== undefined && + return credentials?.spendKey !== undefined && credentials.scanKey !== undefined; } catch (error) { secureLogger.error('Failed to check credentials existence', error as Error, { diff --git a/src/services/credentials/webauthn.service.ts b/src/services/credentials/webauthn.service.ts index b04c0f8..6943893 100644 --- a/src/services/credentials/webauthn.service.ts +++ b/src/services/credentials/webauthn.service.ts @@ -59,7 +59,7 @@ export class WebAuthnService { */ async detectAvailableAuthenticators(): Promise { try { - if (!navigator.credentials || !navigator.credentials.create) { + if (!navigator.credentials?.create) { return false; } @@ -105,7 +105,7 @@ export class WebAuthnService { // Vérifier la disponibilité sans faire d'appel réel à WebAuthn // Juste vérifier que les APIs sont disponibles - if (!navigator.credentials || !navigator.credentials.create) { + if (!navigator.credentials?.create) { console.log('❌ WebAuthn credentials API not available'); return false; } diff --git a/src/services/database.service.ts b/src/services/database.service.ts index 159de61..2347177 100755 --- a/src/services/database.service.ts +++ b/src/services/database.service.ts @@ -79,7 +79,7 @@ export class Database { Object.values(this.storeDefinitions).forEach(({ name, options, indices }) => { if (!db.objectStoreNames.contains(name)) { - let store = db.createObjectStore(name, options as IDBObjectStoreParameters); + const store = db.createObjectStore(name, options as IDBObjectStoreParameters); indices.forEach(({ name, keyPath, options }) => { store.createIndex(name, keyPath, options); @@ -116,7 +116,7 @@ export class Database { } public async registerServiceWorker(path: string) { - if (!('serviceWorker' in navigator)) return; // Ensure service workers are supported + if (!('serviceWorker' in navigator)) {return;} // Ensure service workers are supported console.log('registering worker at', path); try { @@ -268,7 +268,7 @@ export class Database { private async handleDownloadList(downloadList: string[]): Promise { // Download the missing data - let requestedStateId: string[] = []; + const requestedStateId: string[] = []; const service = await Services.getInstance(); for (const hash of downloadList) { const diff = await service.getDiffByValue(hash); @@ -321,7 +321,7 @@ export class Database { } else if (data.type === 'TO_DOWNLOAD') { console.log(`Received missing data ${data}`); // Download the missing data - let requestedStateId: string[] = []; + const requestedStateId: string[] = []; for (const hash of data.data) { try { const valueBytes = await service.fetchValueFromStorage(hash); diff --git a/src/services/secure-credentials.service.ts b/src/services/secure-credentials.service.ts index 1b0ab74..b76036c 100644 --- a/src/services/secure-credentials.service.ts +++ b/src/services/secure-credentials.service.ts @@ -128,10 +128,9 @@ export class SecureCredentialsService { return false; } } catch (error) { - secureLogger.error('Failed to check PBKDF2 key existence', { + secureLogger.error('Failed to check PBKDF2 key existence', error as Error, { component: 'SecureCredentialsService', - operation: 'hasPBKDF2Key', - error: error instanceof Error ? error.message : String(error) + operation: 'hasPBKDF2Key' }); return false; } @@ -155,10 +154,9 @@ export class SecureCredentialsService { return result; } catch (error) { - secureLogger.error('Failed to retrieve PBKDF2 key from pbkdf2keys store', { + secureLogger.error('Failed to retrieve PBKDF2 key from pbkdf2keys store', error as Error, { component: 'SecureCredentialsService', - operation: 'getPBKDF2KeyFromStore', - error: error instanceof Error ? error.message : String(error) + operation: 'getPBKDF2KeyFromStore' }); return null; } @@ -186,10 +184,9 @@ export class SecureCredentialsService { securityMode }); } catch (error) { - secureLogger.error('Failed to store PBKDF2 key in pbkdf2keys store', { + secureLogger.error('Failed to store PBKDF2 key in pbkdf2keys store', error as Error, { component: 'SecureCredentialsService', - operation: 'storePBKDF2KeyInStore', - error: error instanceof Error ? error.message : String(error) + operation: 'storePBKDF2KeyInStore' }); throw error; } @@ -238,10 +235,9 @@ export class SecureCredentialsService { return null; } } catch (error) { - secureLogger.error('Failed to retrieve PBKDF2 key', { + secureLogger.error('Failed to retrieve PBKDF2 key', error as Error, { component: 'SecureCredentialsService', - operation: 'retrievePBKDF2Key', - error: error instanceof Error ? error.message : String(error) + operation: 'retrievePBKDF2Key' }); return null; } @@ -325,10 +321,9 @@ export class SecureCredentialsService { return pbkdf2Key; } catch (error) { - secureLogger.error('Failed to generate PBKDF2 key', { + secureLogger.error('Failed to generate PBKDF2 key', error as Error, { component: 'SecureCredentialsService', - operation: 'generatePBKDF2Key', - error: error instanceof Error ? error.message : String(error) + operation: 'generatePBKDF2Key' }); throw error; } @@ -492,7 +487,7 @@ export class SecureCredentialsService { * Génère des credentials en clair */ private async generatePlainCredentials( - password: string, + _password: string, _options: CredentialOptions = {} ): Promise { try { @@ -575,7 +570,7 @@ export class SecureCredentialsService { */ private async decryptWithWebAuthn( credentials: CredentialData, - password: string + _password: string ): Promise { try { const currentMode = await this.securityModeService.getCurrentMode(); @@ -647,7 +642,7 @@ export class SecureCredentialsService { /** * Stocke des credentials */ - async storeCredentials(credentials: CredentialData, password: string): Promise { + async storeCredentials(credentials: CredentialData, _password: string): Promise { try { // Import dynamique du service de stockage const { StorageService } = await import('./credentials/storage.service'); @@ -713,7 +708,7 @@ export class SecureCredentialsService { /** * Valide un code OTP */ - async validateOTPCode(secret: string, code: string): Promise { + async validateOTPCode(_secret: string, code: string): Promise { try { // Implémentation simplifiée de validation OTP // Dans une implémentation complète, on utiliserait une bibliothèque comme speakeasy @@ -950,12 +945,14 @@ QR Code URL: ${qrUrl}`); try { // Essayer de récupérer un mot de passe existant const existingCredential = await navigator.credentials.get({ + // @ts-expect-error - PasswordCredential API may not be in TypeScript definitions password: true, mediation: 'optional' - }); + } as CredentialRequestOptions); - if (existingCredential && existingCredential.type === 'password') { - const passwordCredential = existingCredential as PasswordCredential; + if (existingCredential?.type === 'password') { + // @ts-expect-error - PasswordCredential API may not be in TypeScript definitions + const passwordCredential = existingCredential as any; console.log('🔐 Retrieved existing password from browser'); return passwordCredential.password; } @@ -1035,7 +1032,9 @@ QR Code URL: ${qrUrl}`); try { // Sauvegarder le mot de passe dans le gestionnaire de mots de passe du navigateur - if (navigator.credentials && navigator.credentials.create) { + // @ts-expect-error - PasswordCredential API may not be in TypeScript definitions + if (typeof PasswordCredential !== 'undefined' && navigator.credentials && navigator.credentials.create) { + // @ts-expect-error - PasswordCredential API may not be in TypeScript definitions const credential = new PasswordCredential({ id: '4nk-pbkdf2-password', password: password, @@ -1097,10 +1096,9 @@ QR Code URL: ${qrUrl}`); const encryptionService = EncryptionService.getInstance(); return await encryptionService.decrypt(encryptedKey, password); } catch (error) { - secureLogger.error('Failed to decrypt PBKDF2 key with password', { + secureLogger.error('Failed to decrypt PBKDF2 key with password', error as Error, { component: 'SecureCredentialsService', - operation: 'decryptPBKDF2KeyWithPassword', - error: error instanceof Error ? error.message : String(error) + operation: 'decryptPBKDF2KeyWithPassword' }); return null; } @@ -1118,12 +1116,14 @@ QR Code URL: ${qrUrl}`); try { const credential = await navigator.credentials.get({ + // @ts-expect-error - PasswordCredential API may not be in TypeScript definitions password: true, mediation: 'optional' - }); + } as CredentialRequestOptions); - if (credential && credential.type === 'password') { - const passwordCredential = credential as PasswordCredential; + if (credential?.type === 'password') { + // @ts-expect-error - PasswordCredential API may not be in TypeScript definitions + const passwordCredential = credential as any; console.log('🔐 Retrieved password from browser password manager'); return passwordCredential.password; } @@ -1151,14 +1151,14 @@ QR Code URL: ${qrUrl}`); return { isValid: false, score: 0, feedback }; } - if (password.length >= 8) score += 1; - if (password.length >= 12) score += 1; - if (password.length >= 16) score += 1; + if (password.length >= 8) {score += 1;} + if (password.length >= 12) {score += 1;} + if (password.length >= 16) {score += 1;} - if (/[a-z]/.test(password)) score += 1; - if (/[A-Z]/.test(password)) score += 1; - if (/[0-9]/.test(password)) score += 1; - if (/[^a-zA-Z0-9]/.test(password)) score += 1; + if (/[a-z]/.test(password)) {score += 1;} + if (/[A-Z]/.test(password)) {score += 1;} + if (/[0-9]/.test(password)) {score += 1;} + if (/[^a-zA-Z0-9]/.test(password)) {score += 1;} // Feedback détaillé if (score < 3) { diff --git a/src/services/security-mode.service.ts b/src/services/security-mode.service.ts index 5f20d79..92784bf 100644 --- a/src/services/security-mode.service.ts +++ b/src/services/security-mode.service.ts @@ -5,6 +5,7 @@ */ import { secureLogger } from './secure-logger'; +import Database from './database.service'; export type SecurityMode = 'proton-pass' | 'os' | 'otp' | '2fa' | 'password' | 'none'; diff --git a/src/services/service.ts b/src/services/service.ts index 49c23a8..d1ae0eb 100755 --- a/src/services/service.ts +++ b/src/services/service.ts @@ -1328,7 +1328,7 @@ export default class Services { console.log(`💰 Amount after block scan: ${updatedAmount}`); // Update user with scan results - if (updatedAmount > BigInt(0)) { + if (updatedAmount > 0n) { this.updateUserStatus(`💰 Wallet updated! Found ${updatedAmount} tokens`); } else { this.updateUserStatus('⏳ Transaction processed, waiting for confirmation...'); @@ -1887,7 +1887,7 @@ export default class Services { getRequest.onerror = () => reject(getRequest.error); }); - if (walletData && walletData.encrypted_wallet) { + if (walletData?.encrypted_wallet) { encryptedWallet = walletData.encrypted_wallet; console.log('✅ encrypted_wallet preserved'); } else { @@ -1941,7 +1941,7 @@ export default class Services { await new Promise((resolveVerify, rejectVerify) => { verifyRequest.onsuccess = () => { const savedData = verifyRequest.result; - if (savedData && savedData.encrypted_device === encryptedDevice) { + if (savedData?.encrypted_device === encryptedDevice) { console.log('✅ Verified: Device correctly saved in database'); resolveVerify(); } else {