**Motivations :** - Corriger les erreurs TypeScript qui bloquaient la compilation - Corriger les erreurs ESLint pour améliorer la qualité du code - Utiliser les bons formats pour secureLogger.error **Modifications :** - Corriger les appels secureLogger.error pour passer error comme 2e paramètre - Ajouter les imports manquants (Database dans security-mode.service.ts) - Préfixer les variables non utilisées avec _ pour respecter ESLint - Corriger les comparaisons BigInt (utiliser BigInt(0) au lieu de 0n) - Ajouter @ts-expect-error pour PasswordCredential API expérimentale - Corriger le paramètre services non utilisé dans router.ts **Pages affectées :** - src/services/service.ts (comparaisons BigInt, imports) - src/services/security-mode.service.ts (import Database) - src/services/secure-credentials.service.ts (secureLogger.error, PasswordCredential) - src/services/credentials/encryption.service.ts (secureLogger.error, salt type) - src/router.ts (paramètre _services) - src/components/device-management/device-management.ts (variable _data) - src/components/secure-credentials/secure-credentials.ts (variable _error) - src/components/security-mode-selector/security-mode-selector.ts (paramètre _mode) - src/components/login-modal/login-modal.js (window globals)
145 lines
4.4 KiB
TypeScript
145 lines
4.4 KiB
TypeScript
/**
|
|
* StorageService - Gestion du stockage des credentials de pairing
|
|
* Utilisé uniquement pour stocker les credentials après le processus de pairing
|
|
*/
|
|
import { secureLogger } from '../secure-logger';
|
|
import { CredentialData } from './types';
|
|
import { DATABASE_CONFIG } from '../database-config';
|
|
|
|
export class StorageService {
|
|
private static instance: StorageService;
|
|
private dbName = DATABASE_CONFIG.name;
|
|
private storeName = DATABASE_CONFIG.stores.credentials.name; // Store pour les credentials de pairing
|
|
private dbVersion = DATABASE_CONFIG.version;
|
|
|
|
private constructor() {}
|
|
|
|
public static getInstance(): StorageService {
|
|
if (!StorageService.instance) {
|
|
StorageService.instance = new StorageService();
|
|
}
|
|
return StorageService.instance;
|
|
}
|
|
|
|
|
|
/**
|
|
* Ouvre la base de données IndexedDB
|
|
*/
|
|
private async openDatabase(): Promise<IDBDatabase> {
|
|
// Utiliser la fonction centralisée openDatabase
|
|
const { openDatabase } = await import('../database-config');
|
|
return openDatabase();
|
|
}
|
|
|
|
/**
|
|
* Stocke des credentials
|
|
*/
|
|
async storeCredentials(credentials: CredentialData): Promise<void> {
|
|
try {
|
|
const db = await this.openDatabase();
|
|
const transaction = db.transaction([this.storeName], 'readwrite');
|
|
const store = transaction.objectStore(this.storeName);
|
|
|
|
await new Promise<void>((resolve, reject) => {
|
|
const request = store.put(credentials, 'current');
|
|
request.onsuccess = () => resolve();
|
|
request.onerror = () => reject(request.error);
|
|
});
|
|
|
|
secureLogger.info('Credentials stored successfully', {
|
|
component: 'StorageService',
|
|
operation: 'storeCredentials'
|
|
});
|
|
} catch (error) {
|
|
secureLogger.error('Failed to store credentials', error as Error, {
|
|
component: 'StorageService',
|
|
operation: 'storeCredentials'
|
|
});
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Récupère des credentials
|
|
*/
|
|
async getCredentials(): Promise<CredentialData | null> {
|
|
try {
|
|
const db = await this.openDatabase();
|
|
const transaction = db.transaction([this.storeName], 'readonly');
|
|
const store = transaction.objectStore(this.storeName);
|
|
|
|
return new Promise<CredentialData | null>((resolve, reject) => {
|
|
const request = store.get('current');
|
|
request.onsuccess = () => {
|
|
const result = request.result;
|
|
if (result) {
|
|
secureLogger.info('Credentials retrieved successfully', {
|
|
component: 'StorageService',
|
|
operation: 'getCredentials'
|
|
});
|
|
resolve(result);
|
|
} else {
|
|
secureLogger.info('No credentials found', {
|
|
component: 'StorageService',
|
|
operation: 'getCredentials'
|
|
});
|
|
resolve(null);
|
|
}
|
|
};
|
|
request.onerror = () => reject(request.error);
|
|
});
|
|
} catch (error) {
|
|
secureLogger.error('Failed to get credentials', error as Error, {
|
|
component: 'StorageService',
|
|
operation: 'getCredentials'
|
|
});
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Vérifie si des credentials existent
|
|
*/
|
|
async hasCredentials(): Promise<boolean> {
|
|
try {
|
|
const credentials = await this.getCredentials();
|
|
return credentials?.spendKey !== undefined &&
|
|
credentials.scanKey !== undefined;
|
|
} catch (error) {
|
|
secureLogger.error('Failed to check credentials existence', error as Error, {
|
|
component: 'StorageService',
|
|
operation: 'hasCredentials'
|
|
});
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Supprime les credentials
|
|
*/
|
|
async clearCredentials(): Promise<void> {
|
|
try {
|
|
const db = await this.openDatabase();
|
|
const transaction = db.transaction([this.storeName], 'readwrite');
|
|
const store = transaction.objectStore(this.storeName);
|
|
|
|
await new Promise<void>((resolve, reject) => {
|
|
const request = store.delete('current');
|
|
request.onsuccess = () => resolve();
|
|
request.onerror = () => reject(request.error);
|
|
});
|
|
|
|
secureLogger.info('Credentials cleared successfully', {
|
|
component: 'StorageService',
|
|
operation: 'clearCredentials'
|
|
});
|
|
} catch (error) {
|
|
secureLogger.error('Failed to clear credentials', error as Error, {
|
|
component: 'StorageService',
|
|
operation: 'clearCredentials'
|
|
});
|
|
throw error;
|
|
}
|
|
}
|
|
}
|