/** * Exemple d'utilisation du client sécurisé Vault * Avec authentification par clés utilisateur et rotation automatique */ import { SecureVaultClient, createSecureVaultClient } from '../src/secure-client'; async function secureBasicExample() { console.log('🔐 Exemple d\'utilisation du client sécurisé 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 secureAdvancedExample() { 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 secureErrorHandlingExample() { console.log('\n🔐 Exemple de gestion d\'erreurs sécurisée'); 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 secureBasicExample(); await secureAdvancedExample(); await secureErrorHandlingExample(); 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 { secureBasicExample, secureAdvancedExample, secureErrorHandlingExample };