/** * Exemple d'utilisation du client Vault * Avec authentification par clĂ©s utilisateur et rotation automatique */ import { SecureVaultClient, createSecureVaultClient } from '../src/index'; async function basicExample() { console.log('🔐 Exemple d\'utilisation du client Vault'); console.log('=' * 60); try { // 1. CrĂ©ation du client avec ID utilisateur const client = createSecureVaultClient( 'https://vault.4nkweb.com:6666', 'demo_user_001' // ID utilisateur obligatoire ); // 2. VĂ©rification de la connectivitĂ© console.log('🔍 Test de connectivitĂ©...'); const isConnected = await client.ping(); if (!isConnected) { throw new Error('❌ Impossible de se connecter Ă  l\'API'); } console.log('✅ ConnectĂ© avec succĂšs'); // 3. RĂ©cupĂ©ration des informations API console.log('\n📋 Informations sur l\'API...'); const info = await client.info(); console.log(` Nom: ${info.name}`); console.log(` Version: ${info.version}`); console.log(` Authentification: ${info.authentication}`); console.log(` Rotation des clĂ©s: ${info.key_rotation}`); // 4. Test de santĂ© console.log('\nđŸ„ Test de santĂ©...'); const health = await client.health(); console.log(` Statut: ${health.status}`); console.log(` Service: ${health.service}`); console.log(` Chiffrement: ${health.encryption}`); // 5. RĂ©cupĂ©ration d'un fichier console.log('\n📁 RĂ©cupĂ©ration d\'un fichier...'); const file = await client.getFile('dev', 'bitcoin/bitcoin.conf'); console.log(` Fichier: ${file.filename}`); console.log(` Taille: ${file.size} caractĂšres`); console.log(` ChiffrĂ©: ${file.encrypted}`); console.log(` Algorithme: ${file.algorithm}`); console.log(` Utilisateur: ${file.user_id}`); console.log(` Version de clĂ©: ${file.key_version}`); console.log(` Timestamp: ${file.timestamp}`); console.log('\n📄 Aperçu du contenu:'); console.log(file.content.substring(0, 200) + '...'); console.log('\n✅ Exemple terminĂ© avec succĂšs!'); } catch (error) { console.error('\n❌ Erreur fatale:', error); process.exit(1); } } async function advancedExample() { console.log('\n🔐 Exemple avancĂ© avec gestion d\'erreurs'); console.log('=' * 60); try { // 1. CrĂ©ation du client avec configuration complĂšte const client = new SecureVaultClient({ baseUrl: 'https://vault.4nkweb.com:6666', userId: 'advanced_user_001', verifySsl: false, // DĂ©sactivĂ© pour les certificats auto-signĂ©s timeout: 10000, // Timeout de 10 secondes }); // 2. Gestion d'erreurs avancĂ©e console.log('\nđŸ›Ąïž Test de gestion d\'erreurs...'); try { // Test avec un fichier inexistant await client.getFile('dev', 'fichier/inexistant.conf'); } catch (error: any) { if (error.name === 'VaultApiError') { console.log(` ✅ Erreur API gĂ©rĂ©e: ${error.message}`); } else { console.log(` ❌ Erreur inattendue: ${error.message}`); } } // 3. Test d'authentification console.log('\n🔑 Test d\'authentification...'); try { const invalidClient = new SecureVaultClient({ baseUrl: 'https://vault.4nkweb.com:6666', userId: 'invalid@user' // ID invalide }); await invalidClient.health(); console.log(' ❌ Authentification invalide acceptĂ©e (ne devrait pas arriver)'); } catch (error: any) { console.log(` ✅ Authentification invalide rejetĂ©e: ${error.message}`); } // 4. RĂ©cupĂ©ration de plusieurs fichiers console.log('\n📚 RĂ©cupĂ©ration de plusieurs fichiers...'); const files = [ 'bitcoin/bitcoin.conf', 'nginx/nginx.conf', 'grafana/grafana.ini' ]; const results = await Promise.allSettled( files.map(filePath => client.getFile('dev', filePath)) ); results.forEach((result, index) => { if (result.status === 'fulfilled') { console.log(` ✅ ${files[index]}: ${result.value.size} caractĂšres`); } else { console.log(` ❌ ${files[index]}: ${result.reason.message}`); } }); // 5. Test de rotation des clĂ©s console.log('\n🔄 Test de rotation des clĂ©s...'); const file1 = await client.getFile('dev', 'bitcoin/bitcoin.conf'); // Attendre un peu pour potentiellement dĂ©clencher une rotation await new Promise(resolve => setTimeout(resolve, 1000)); const file2 = await client.getFile('dev', 'bitcoin/bitcoin.conf'); if (file1.key_version !== file2.key_version) { console.log(` ✅ Rotation dĂ©tectĂ©e: ${file1.key_version} → ${file2.key_version}`); } else { console.log(` ⚠ Aucune rotation dĂ©tectĂ©e (normal si < 1h)`); } console.log('\n✅ Exemple avancĂ© terminĂ© avec succĂšs!'); } catch (error) { console.error('\n❌ Erreur fatale:', error); process.exit(1); } } async function errorHandlingExample() { console.log('\n🔐 Exemple de gestion d\'erreurs'); console.log('=' * 60); try { const client = createSecureVaultClient( 'https://vault.4nkweb.com:6666', 'error_test_user' ); // 1. Test d'erreurs d'authentification console.log('\n🔑 Test d\'erreurs d\'authentification...'); const testCases = [ { name: 'ID utilisateur vide', userId: '', shouldFail: true }, { name: 'ID utilisateur trop court', userId: 'ab', shouldFail: true }, { name: 'ID utilisateur trop long', userId: 'a'.repeat(51), shouldFail: true }, { name: 'ID utilisateur avec caractĂšres invalides', userId: 'user@invalid', shouldFail: true }, { name: 'ID utilisateur valide', userId: 'valid_user_123', shouldFail: false } ]; for (const testCase of testCases) { try { const testClient = new SecureVaultClient({ baseUrl: 'https://vault.4nkweb.com:6666', userId: testCase.userId }); await testClient.ping(); if (testCase.shouldFail) { console.log(` ❌ ${testCase.name}: Devrait Ă©chouer mais a rĂ©ussi`); } else { console.log(` ✅ ${testCase.name}: RĂ©ussi comme attendu`); } } catch (error: any) { if (testCase.shouldFail) { console.log(` ✅ ${testCase.name}: Échec comme attendu - ${error.message}`); } else { console.log(` ❌ ${testCase.name}: Échec inattendu - ${error.message}`); } } } // 2. Test d'erreurs rĂ©seau console.log('\n🌐 Test d\'erreurs rĂ©seau...'); try { const badClient = new SecureVaultClient({ baseUrl: 'https://nonexistent-domain.com:6666', userId: 'test_user', timeout: 1000 // Timeout court pour test rapide }); await badClient.ping(); console.log(' ❌ Connexion Ă  un domaine inexistant a rĂ©ussi (ne devrait pas arriver)'); } catch (error: any) { console.log(` ✅ Erreur rĂ©seau gĂ©rĂ©e: ${error.message}`); } // 3. Test d'erreurs de dĂ©chiffrement console.log('\n🔓 Test d\'erreurs de dĂ©chiffrement...'); try { // Tentative d'accĂšs Ă  un fichier qui pourrait causer des problĂšmes de dĂ©chiffrement await client.getFile('dev', 'bitcoin/bitcoin.conf'); console.log(' ✅ DĂ©chiffrement rĂ©ussi'); } catch (error: any) { if (error.name === 'VaultDecryptionError') { console.log(` ✅ Erreur de dĂ©chiffrement gĂ©rĂ©e: ${error.message}`); } else { console.log(` ❌ Erreur inattendue: ${error.message}`); } } console.log('\n✅ Exemple de gestion d\'erreurs terminĂ© avec succĂšs!'); } catch (error) { console.error('\n❌ Erreur fatale:', error); process.exit(1); } } // Fonction principale async function main() { console.log('🚀 DĂ©monstration du client sĂ©curisĂ© Vault'); console.log('Avec authentification par clĂ©s utilisateur et rotation automatique'); console.log('=' * 80); try { await basicExample(); await advancedExample(); await errorHandlingExample(); console.log('\n🎉 Toutes les dĂ©monstrations terminĂ©es avec succĂšs!'); console.log('\n📝 Points clĂ©s du systĂšme sĂ©curisĂ©:'); console.log(' ‱ Authentification obligatoire par ID utilisateur'); console.log(' ‱ HTTPS obligatoire'); console.log(' ‱ ClĂ©s gĂ©rĂ©es cĂŽtĂ© serveur avec rotation automatique'); console.log(' ‱ Aucune clĂ© stockĂ©e dans le client'); console.log(' ‱ Chiffrement quantum-rĂ©sistant (ChaCha20-Poly1305)'); } catch (error) { console.error('\nđŸ’„ Erreur fatale dans la dĂ©monstration:', error); process.exit(1); } } // ExĂ©cution si appelĂ© directement if (require.main === module) { main().catch(console.error); } export { basicExample, advancedExample, errorHandlingExample };