diff --git a/__pycache__/api_server.cpython-313.pyc b/__pycache__/api_server.cpython-313.pyc new file mode 100644 index 0000000..e92ca22 Binary files /dev/null and b/__pycache__/api_server.cpython-313.pyc differ diff --git a/sdk-client/dist/examples/usage.d.ts b/sdk-client/dist/examples/usage.d.ts new file mode 100644 index 0000000..030d365 --- /dev/null +++ b/sdk-client/dist/examples/usage.d.ts @@ -0,0 +1,27 @@ +/** + * Exemple d'utilisation du client Vault + * Scénario complet : Initialisation → Routes → Parcours → Déchiffrement + */ +import { SecureVaultClient } from '../src/index'; +/** + * ÉTAPE 1: Initialisation + Gestion des erreurs + */ +declare function step1_Initialization(): Promise; +/** + * ÉTAPE 2: Récupération de toutes les routes + Gestion des erreurs + */ +declare function step2_GetRoutes(client: SecureVaultClient): Promise; +/** + * ÉTAPE 3: Parcours de toutes les routes pour récupération du contenu + Gestion des erreurs + */ +declare function step3_ParseRoutes(routes: any, client: SecureVaultClient): Promise; +/** + * ÉTAPE 4: Synchronisation locale des fichiers déchiffrés + Gestion des erreurs + */ +declare function step4_SyncLocalFiles(client: SecureVaultClient): Promise; +/** + * ÉTAPE 5: Déchiffrement des contenus récupérés (non stocké) + Gestion des erreurs + */ +declare function step5_DecryptContents(results: any[]): Promise; +export { step1_Initialization, step2_GetRoutes, step3_ParseRoutes, step4_SyncLocalFiles, step5_DecryptContents }; +//# sourceMappingURL=usage.d.ts.map \ No newline at end of file diff --git a/sdk-client/dist/examples/usage.d.ts.map b/sdk-client/dist/examples/usage.d.ts.map new file mode 100644 index 0000000..ca5a1e1 --- /dev/null +++ b/sdk-client/dist/examples/usage.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../examples/usage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAiE,MAAM,cAAc,CAAC;AAEhH;;GAEG;AACH,iBAAe,oBAAoB,+BA+DlC;AAED;;GAEG;AACH,iBAAe,eAAe,CAAC,MAAM,EAAE,iBAAiB,+CAuDvD;AAED;;GAEG;AACH,iBAAe,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,iBAAiB,kBA0GtE;AAED;;GAEG;AACH,iBAAe,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,iBAiD5D;AAED;;GAEG;AACH,iBAAe,qBAAqB,CAAC,OAAO,EAAE,GAAG,EAAE,iBA+ElD;AAgDD,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACtB,CAAC"} \ No newline at end of file diff --git a/sdk-client/dist/examples/usage.js b/sdk-client/dist/examples/usage.js new file mode 100644 index 0000000..3ce707d --- /dev/null +++ b/sdk-client/dist/examples/usage.js @@ -0,0 +1,388 @@ +"use strict"; +/** + * Exemple d'utilisation du client Vault + * Scénario complet : Initialisation → Routes → Parcours → Déchiffrement + */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.step1_Initialization = step1_Initialization; +exports.step2_GetRoutes = step2_GetRoutes; +exports.step3_ParseRoutes = step3_ParseRoutes; +exports.step4_SyncLocalFiles = step4_SyncLocalFiles; +exports.step5_DecryptContents = step5_DecryptContents; +const index_1 = require("../src/index"); +/** + * ÉTAPE 1: Initialisation + Gestion des erreurs + */ +async function step1_Initialization() { + console.log('🚀 ÉTAPE 1: Initialisation du client + Gestion des erreurs'); + console.log('='.repeat(70)); + try { + // Test avec différents IDs utilisateur + const testUserIds = [ + 'demo_user_001', // ID existant + 'invalid@user', // ID invalide (caractères interdits) + 'ab', // ID trop court + 'a'.repeat(129), // ID trop long + '3506ea43d9207038eea58caca84d51e4ccc01c496b6572bbf4dfda7fa03085b8' // Votre clé + ]; + let validClient = null; + for (const userId of testUserIds) { + try { + console.log(`\n🔍 Test avec l'ID: ${userId.substring(0, 20)}${userId.length > 20 ? '...' : ''}`); + // Utiliser le constructeur avec chargement automatique des clés .env + // Pour le test avec les vraies clés, utiliser le constructeur sans paramètres + const client = userId === 'demo_user_001' ? new index_1.SecureVaultClient() : new index_1.SecureVaultClient({ + baseUrl: 'https://vault.4nkweb.com:6666', + userId: userId, + timeout: 30000, + verifySsl: false + }); + // Test de connectivité + const isConnected = await client.ping(); + if (isConnected) { + console.log(` ✅ ID valide et connecté: ${userId}`); + if (!validClient) { + validClient = client; + } + } + else { + console.log(` ❌ ID valide mais non connecté: ${userId}`); + } + } + catch (error) { + if (error instanceof index_1.VaultAuthenticationError) { + console.log(` 🔑 Erreur d'authentification: ${error.message}`); + } + else if (error.message.includes('ID utilisateur requis') || error.message.includes('invalide')) { + console.log(` ⚠️ ID invalide: ${error.message}`); + } + else { + console.log(` ❌ Erreur inattendue: ${error.message}`); + } + } + } + if (!validClient) { + throw new Error('Aucun client valide trouvé - impossible de continuer'); + } + console.log('\n✅ ÉTAPE 1 TERMINÉE: Client initialisé avec succès'); + return validClient; + } + catch (error) { + console.error('\n❌ ÉTAPE 1 ÉCHOUÉE:', error); + throw error; + } +} +/** + * ÉTAPE 2: Récupération de toutes les routes + Gestion des erreurs + */ +async function step2_GetRoutes(client) { + console.log('\n🛣️ ÉTAPE 2: Récupération de toutes les routes + Gestion des erreurs'); + console.log('='.repeat(70)); + try { + // Test de récupération des routes + console.log('\n📋 Récupération des routes disponibles...'); + const routes = await client.getRoutes(); + console.log(` ✅ Total des routes: ${routes.total_routes}`); + console.log(` ✅ Utilisateur: ${routes.user_id}`); + console.log(` ✅ Type d'authentification: ${routes.authentication.type}`); + console.log('\n📝 Routes disponibles:'); + routes.routes.forEach((route, index) => { + console.log(` ${index + 1}. ${route.method} ${route.path}`); + console.log(` → ${route.description}`); + console.log(` → Authentification: ${route.authentication}`); + console.log(` → Type de réponse: ${route.response_type}`); + if (route.parameters) { + console.log(` → Paramètres:`); + Object.entries(route.parameters).forEach(([key, value]) => { + console.log(` • ${key}: ${value}`); + }); + } + if (route.examples && route.examples.length > 0) { + console.log(` → Exemples:`); + route.examples.forEach(example => { + console.log(` • ${example}`); + }); + } + console.log(''); + }); + console.log('✅ ÉTAPE 2 TERMINÉE: Routes récupérées avec succès'); + return routes; + } + catch (error) { + console.error('\n❌ ÉTAPE 2 ÉCHOUÉE:'); + if (error instanceof index_1.VaultApiError) { + console.error(` Erreur API: ${error.message}`); + console.error(` Code HTTP: ${error.statusCode}`); + console.error(` Code d'erreur: ${error.code}`); + } + else if (error instanceof index_1.VaultAuthenticationError) { + console.error(` Erreur d'authentification: ${error.message}`); + console.error(` Code HTTP: ${error.statusCode}`); + } + else { + console.error(` Erreur inattendue: ${error.message}`); + } + throw error; + } +} +/** + * ÉTAPE 3: Parcours de toutes les routes pour récupération du contenu + Gestion des erreurs + */ +async function step3_ParseRoutes(routes, client) { + console.log('\n📁 ÉTAPE 3: Parcours des routes pour récupération du contenu + Gestion des erreurs'); + console.log('='.repeat(70)); + const results = []; + try { + for (const route of routes.routes) { + console.log(`\n🔍 Test de la route: ${route.method} ${route.path}`); + try { + let result = null; + switch (route.path) { + case '/health': + result = await client.health(); + console.log(` ✅ Health: ${result.status} - ${result.service}`); + break; + case '/info': + result = await client.info(); + console.log(` ✅ Info: ${result.name} v${result.version}`); + break; + case '/routes': + result = await client.getRoutes(); + console.log(` ✅ Routes: ${result.total_routes} routes disponibles`); + break; + default: + // Route dynamique // + if (route.path.includes('') && route.path.includes('')) { + console.log(` 📂 Test des fichiers de configuration...`); + // Tester quelques fichiers de configuration connus + const testFiles = [ + 'bitcoin/bitcoin.conf', + 'nginx/nginx.conf', + 'grafana/grafana.ini' + ]; + for (const filePath of testFiles) { + try { + const fileResult = await client.getFile('dev', filePath); + console.log(` ✅ ${filePath}: ${fileResult.size} caractères`); + results.push({ + route: `${route.method} /dev/${filePath}`, + success: true, + data: fileResult + }); + } + catch (fileError) { + console.log(` ❌ ${filePath}: ${fileError.message}`); + results.push({ + route: `${route.method} /dev/${filePath}`, + success: false, + error: fileError.message + }); + } + } + } + break; + } + if (result) { + results.push({ + route: `${route.method} ${route.path}`, + success: true, + data: result + }); + } + } + catch (error) { + console.log(` ❌ Erreur: ${error.message}`); + if (error instanceof index_1.VaultApiError) { + console.log(` → Code HTTP: ${error.statusCode}`); + console.log(` → Code d'erreur: ${error.code}`); + } + else if (error instanceof index_1.VaultAuthenticationError) { + console.log(` → Erreur d'authentification`); + } + else if (error instanceof index_1.VaultDecryptionError) { + console.log(` → Erreur de déchiffrement`); + } + results.push({ + route: `${route.method} ${route.path}`, + success: false, + error: error.message, + errorType: error.name + }); + } + } + console.log(`\n📊 Résumé des tests:`); + const successCount = results.filter(r => r.success).length; + const errorCount = results.filter(r => !r.success).length; + console.log(` ✅ Succès: ${successCount}/${results.length}`); + console.log(` ❌ Erreurs: ${errorCount}/${results.length}`); + console.log('\n✅ ÉTAPE 3 TERMINÉE: Parcours des routes terminé'); + return results; + } + catch (error) { + console.error('\n❌ ÉTAPE 3 ÉCHOUÉE:', error); + throw error; + } +} +/** + * ÉTAPE 4: Synchronisation locale des fichiers déchiffrés + Gestion des erreurs + */ +async function step4_SyncLocalFiles(client) { + console.log('\n💾 ÉTAPE 4: Synchronisation locale des fichiers déchiffrés + Gestion des erreurs'); + console.log('='.repeat(70)); + try { + console.log('\n🔄 Synchronisation des fichiers vers le dossier local...'); + console.log(' Utilise VAULT_CONFS_DIR depuis le fichier .env'); + // Synchronisation avec options détaillées + // Ne pas spécifier localDir pour utiliser VAULT_CONFS_DIR du .env + const syncResult = await client.syncLocalFiles({ + environment: 'dev', + verbose: true + }); + console.log(`\n📊 Résultats de synchronisation:`); + console.log(` ✅ Fichiers synchronisés: ${syncResult.synced}`); + console.log(` ⏭️ Fichiers ignorés: ${syncResult.skipped}`); + console.log(` ❌ Erreurs: ${syncResult.errors}`); + // Affichage détaillé des résultats + if (syncResult.details.length > 0) { + console.log('\n📋 Détails par fichier:'); + syncResult.details.forEach(detail => { + const icon = detail.status === 'synced' ? '✅' : + detail.status === 'skipped' ? '⏭️' : '❌'; + console.log(` ${icon} ${detail.file}: ${detail.status}`); + if (detail.message) { + console.log(` → ${detail.message}`); + } + }); + } + console.log('\n✅ ÉTAPE 4 TERMINÉE: Synchronisation locale terminée'); + } + catch (error) { + console.error('\n❌ ÉTAPE 4 ÉCHOUÉE:'); + if (error instanceof index_1.VaultApiError) { + console.error(` Erreur API: ${error.message}`); + console.error(` Code HTTP: ${error.statusCode}`); + } + else if (error.message.includes('synchronisation')) { + console.error(` Erreur de synchronisation: ${error.message}`); + } + else { + console.error(` Erreur inattendue: ${error.message}`); + } + throw error; + } +} +/** + * ÉTAPE 5: Déchiffrement des contenus récupérés (non stocké) + Gestion des erreurs + */ +async function step5_DecryptContents(results) { + console.log('\n🔓 ÉTAPE 5: Déchiffrement des contenus récupérés + Gestion des erreurs'); + console.log('='.repeat(70)); + try { + const fileResults = results.filter(r => r.success && r.data && r.data.content); + if (fileResults.length === 0) { + console.log(' ⚠️ Aucun fichier récupéré pour déchiffrement'); + return; + } + console.log(`\n🔍 Déchiffrement de ${fileResults.length} fichier(s)...`); + for (const fileResult of fileResults) { + console.log(`\n📄 Fichier: ${fileResult.route}`); + try { + const content = fileResult.data.content; + // Vérifier si le contenu est chiffré (format de démonstration) + if (content.includes('[CONTENU CHIFFRÉ - DÉCHIFFREMENT NÉCESSAIRE]')) { + console.log(' 🔐 Contenu chiffré détecté (format de démonstration)'); + // Extraire les métadonnées du format de démonstration + const lines = content.split('\n'); + const metadata = {}; + lines.forEach((line) => { + if (line.includes('Utilisateur:')) { + metadata.user = line.split('Utilisateur:')[1]?.trim() || ''; + } + else if (line.includes('Version de clé:')) { + metadata.keyVersion = line.split('Version de clé:')[1]?.trim() || ''; + } + else if (line.includes('Algorithme:')) { + metadata.algorithm = line.split('Algorithme:')[1]?.trim() || ''; + } + else if (line.includes('Rotation:')) { + metadata.rotation = line.split('Rotation:')[1]?.trim() || ''; + } + else if (line.includes('Taille chiffrée:')) { + metadata.encryptedSize = line.split('Taille chiffrée:')[1]?.trim() || ''; + } + }); + console.log(` 📋 Métadonnées extraites:`); + console.log(` → Utilisateur: ${metadata.user}`); + console.log(` → Version de clé: ${metadata.keyVersion}`); + console.log(` → Algorithme: ${metadata.algorithm}`); + console.log(` → Rotation: ${metadata.rotation}`); + console.log(` → Taille chiffrée: ${metadata.encryptedSize}`); + // Dans un vrai déchiffrement, on utiliserait la clé utilisateur + console.log(` 🔑 Déchiffrement simulé: Contenu accessible avec la clé utilisateur`); + } + else { + console.log(' 📝 Contenu non chiffré détecté'); + console.log(` 📄 Aperçu: ${content.substring(0, 100)}${content.length > 100 ? '...' : ''}`); + } + console.log(` ✅ Déchiffrement traité avec succès`); + } + catch (error) { + console.log(` ❌ Erreur de déchiffrement: ${error.message}`); + if (error instanceof index_1.VaultDecryptionError) { + console.log(` → Erreur de déchiffrement spécifique`); + console.log(` → Code: ${error.code}`); + } + else if (error.message.includes('déchiffrement')) { + console.log(` → Erreur de traitement du contenu`); + } + else { + console.log(` → Erreur inattendue lors du déchiffrement`); + } + } + } + console.log('\n✅ ÉTAPE 5 TERMINÉE: Déchiffrement des contenus terminé'); + } + catch (error) { + console.error('\n❌ ÉTAPE 5 ÉCHOUÉE:', error); + throw error; + } +} +/** + * Fonction principale - Exécute le scénario complet + */ +async function main() { + console.log('🚀 DÉMONSTRATION COMPLÈTE DU CLIENT VAULT'); + console.log('Scénario: Initialisation → Routes → Parcours → Synchronisation → Déchiffrement'); + console.log('='.repeat(80)); + try { + // ÉTAPE 1: Initialisation + const client = await step1_Initialization(); + // ÉTAPE 2: Récupération des routes + const routes = await step2_GetRoutes(client); + // ÉTAPE 3: Parcours des routes + const results = await step3_ParseRoutes(routes, client); + // ÉTAPE 4: Synchronisation locale + await step4_SyncLocalFiles(client); + // ÉTAPE 5: Déchiffrement + await step5_DecryptContents(results); + console.log('\n🎉 SCÉNARIO COMPLET TERMINÉ AVEC SUCCÈS!'); + console.log('\n📝 Résumé du système sécurisé:'); + console.log(' • ✅ Authentification par ID utilisateur validée'); + console.log(' • ✅ Récupération des routes API fonctionnelle'); + console.log(' • ✅ Parcours de toutes les routes testé'); + console.log(' • ✅ Synchronisation locale des fichiers déchiffrés'); + console.log(' • ✅ Déchiffrement des contenus géré'); + console.log(' • ✅ Gestion d\'erreurs complète à chaque étape'); + console.log(' • ✅ Rotation automatique des clés active'); + console.log(' • ✅ Chiffrement quantum-résistant (ChaCha20-Poly1305)'); + } + catch (error) { + console.error('\n💥 ÉCHEC DU SCÉNARIO:', error); + process.exit(1); + } +} +// Exécution si appelé directement +if (require.main === module) { + main().catch(console.error); +} +//# sourceMappingURL=usage.js.map \ No newline at end of file diff --git a/sdk-client/dist/examples/usage.js.map b/sdk-client/dist/examples/usage.js.map new file mode 100644 index 0000000..d886f18 --- /dev/null +++ b/sdk-client/dist/examples/usage.js.map @@ -0,0 +1 @@ +{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../examples/usage.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/sdk-client/dist/src/__tests__/setup.d.ts b/sdk-client/dist/src/__tests__/setup.d.ts new file mode 100644 index 0000000..11bd3f1 --- /dev/null +++ b/sdk-client/dist/src/__tests__/setup.d.ts @@ -0,0 +1,4 @@ +/** + * Configuration des tests pour le SDK Vault Client + */ +//# sourceMappingURL=setup.d.ts.map \ No newline at end of file diff --git a/sdk-client/dist/src/__tests__/setup.d.ts.map b/sdk-client/dist/src/__tests__/setup.d.ts.map new file mode 100644 index 0000000..f336d49 --- /dev/null +++ b/sdk-client/dist/src/__tests__/setup.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/__tests__/setup.ts"],"names":[],"mappings":"AAAA;;GAEG"} \ No newline at end of file diff --git a/sdk-client/dist/src/__tests__/setup.js b/sdk-client/dist/src/__tests__/setup.js new file mode 100644 index 0000000..d500466 --- /dev/null +++ b/sdk-client/dist/src/__tests__/setup.js @@ -0,0 +1,26 @@ +"use strict"; +/** + * Configuration des tests pour le SDK Vault Client + */ +// Configuration globale pour les tests +beforeAll(() => { + // Configuration des timeouts pour les tests + jest.setTimeout(30000); +}); +beforeEach(() => { + // Reset des mocks avant chaque test + jest.clearAllMocks(); +}); +afterEach(() => { + // Nettoyage après chaque test + jest.restoreAllMocks(); +}); +// Mock des modules Node.js si nécessaire +jest.mock('crypto', () => ({ + ...jest.requireActual('crypto'), + createDecipher: jest.fn(), +})); +// Variables d'environnement pour les tests +process.env['NODE_ENV'] = 'test'; +process.env['TZ'] = 'UTC'; +//# sourceMappingURL=setup.js.map \ No newline at end of file diff --git a/sdk-client/dist/src/__tests__/setup.js.map b/sdk-client/dist/src/__tests__/setup.js.map new file mode 100644 index 0000000..8c12c72 --- /dev/null +++ b/sdk-client/dist/src/__tests__/setup.js.map @@ -0,0 +1 @@ +{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/__tests__/setup.ts"],"names":[],"mappings":";AAAA;;GAEG;AAEH,uCAAuC;AACvC,SAAS,CAAC,GAAG,EAAE;IACb,4CAA4C;IAC5C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC,CAAC,CAAC;AAEH,UAAU,CAAC,GAAG,EAAE;IACd,oCAAoC;IACpC,IAAI,CAAC,aAAa,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,8BAA8B;IAC9B,IAAI,CAAC,eAAe,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC;AAEH,yCAAyC;AACzC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IACzB,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;IAC/B,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE;CAC1B,CAAC,CAAC,CAAC;AAEJ,2CAA2C;AAC3C,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;AACjC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC"} \ No newline at end of file diff --git a/sdk-client/dist/src/index.d.ts b/sdk-client/dist/src/index.d.ts new file mode 100644 index 0000000..6b92382 --- /dev/null +++ b/sdk-client/dist/src/index.d.ts @@ -0,0 +1,167 @@ +export interface VaultConfig { + baseUrl: string; + verifySsl?: boolean; + timeout?: number; + userId: string; +} +export interface VaultFile { + content: string; + filename: string; + size: number; + encrypted: boolean; + algorithm?: string | undefined; + user_id?: string | undefined; + key_version?: string | undefined; + timestamp?: string | undefined; +} +export interface VaultHealth { + status: string; + service: string; + encryption: string; + algorithm: string; + authentication?: string; + key_rotation?: string; + timestamp?: string; +} +export interface VaultInfo { + name: string; + version: string; + domain: string; + port: number; + protocol: string; + encryption: string; + authentication?: string; + key_rotation?: string; + endpoints?: Record; +} +export interface VaultRoute { + method: string; + path: string; + description: string; + authentication: string; + headers_required: string[]; + response_type: string; + parameters?: Record; + examples?: string[]; +} +export interface VaultRoutes { + routes: VaultRoute[]; + total_routes: number; + authentication: { + type: string; + header: string; + description: string; + }; + user_id: string; + timestamp: string; +} +export interface SyncOptions { + environment: string; + localDir?: string; + verbose?: boolean; +} +export interface SyncResult { + synced: number; + skipped: number; + errors: number; + details: Array<{ + file: string; + status: 'synced' | 'skipped' | 'error'; + message?: string; + }>; +} +export interface VaultError { + message: string; + code?: string | undefined; + statusCode?: number | undefined; +} +export declare class VaultApiError extends Error implements VaultError { + readonly code?: string | undefined; + readonly statusCode?: number | undefined; + constructor(message: string, code?: string, statusCode?: number); +} +export declare class VaultDecryptionError extends Error implements VaultError { + readonly code?: string | undefined; + constructor(message: string, code?: string); +} +export declare class VaultAuthenticationError extends Error implements VaultError { + readonly code?: string | undefined; + readonly statusCode?: number | undefined; + constructor(message: string, code?: string, statusCode?: number); +} +/** + * Client sécurisé pour l'API Vault avec authentification par clés utilisateur + * Les clés sont gérées côté serveur avec rotation automatique + */ +export declare class SecureVaultClient { + private config; + private vaultKey; + constructor(config?: VaultConfig); + /** + * Récupère un fichier depuis l'API Vault + */ + getFile(env: string, filePath: string): Promise; + /** + * Récupère plusieurs fichiers en parallèle + */ + getFiles(env: string, filePaths: string[]): Promise; + /** + * Recherche des fichiers correspondant à un pattern + */ + searchFiles(_env: string, _pattern: string): Promise; + /** + * Vérifie l'état de santé de l'API + */ + health(): Promise; + /** + * Récupère les informations sur l'API + */ + info(): Promise; + /** + * Test de connectivité simple + */ + ping(): Promise; + /** + * Récupère toutes les routes disponibles de l'API + */ + getRoutes(): Promise; + /** + * Synchronise les fichiers déchiffrés localement + * Route vault /// -> ../confs// + * Les fichiers existants dans confs/ sont toujours écrasés pour avoir le contenu le plus récent + */ + syncLocalFiles(options: SyncOptions): Promise; + /** + * Déchiffre le contenu avec les métadonnées utilisateur et gère la prochaine clé + */ + private decryptContent; + /** + * Met à jour la prochaine clé pour les requêtes suivantes et le fichier .env + */ + private updateNextKey; + /** + * Retourne le répertoire du fichier .env trouvé + */ + private _getEnvFileDirectory; + /** + * Charge les variables d'environnement depuis plusieurs emplacements possibles + */ + private _loadEnvironmentVariables; + /** + * Met à jour le fichier .env avec la nouvelle clé + */ + private updateEnvFile; + /** + * Effectue une requête vers l'API avec authentification + */ + private _fetchApi; +} +/** + * Fonction utilitaire pour créer un client sécurisé + */ +export declare function createSecureVaultClient(baseUrl: string, userId: string): SecureVaultClient; +/** + * Fonction utilitaire pour créer un client sécurisé avec configuration complète + */ +export declare function createSecureVaultClientWithConfig(config: VaultConfig): SecureVaultClient; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/sdk-client/dist/src/index.d.ts.map b/sdk-client/dist/src/index.d.ts.map new file mode 100644 index 0000000..c9fd594 --- /dev/null +++ b/sdk-client/dist/src/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/sdk-client/dist/src/index.js b/sdk-client/dist/src/index.js new file mode 100644 index 0000000..d561201 --- /dev/null +++ b/sdk-client/dist/src/index.js @@ -0,0 +1,559 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SecureVaultClient = exports.VaultAuthenticationError = exports.VaultDecryptionError = exports.VaultApiError = void 0; +exports.createSecureVaultClient = createSecureVaultClient; +exports.createSecureVaultClientWithConfig = createSecureVaultClientWithConfig; +const node_fetch_1 = __importDefault(require("node-fetch")); +const https_1 = __importDefault(require("https")); +const dotenv_1 = __importDefault(require("dotenv")); +const { chacha20poly1305 } = require('@noble/ciphers/chacha.js'); +const fs_1 = __importDefault(require("fs")); +const path_1 = __importDefault(require("path")); +class VaultApiError extends Error { + constructor(message, code, statusCode) { + super(message); + this.name = 'VaultApiError'; + this.code = code; + this.statusCode = statusCode; + } +} +exports.VaultApiError = VaultApiError; +class VaultDecryptionError extends Error { + constructor(message, code) { + super(message); + this.name = 'VaultDecryptionError'; + this.code = code; + } +} +exports.VaultDecryptionError = VaultDecryptionError; +class VaultAuthenticationError extends Error { + constructor(message, code, statusCode) { + super(message); + this.name = 'VaultAuthenticationError'; + this.code = code; + this.statusCode = statusCode; + } +} +exports.VaultAuthenticationError = VaultAuthenticationError; +/** + * Client sécurisé pour l'API Vault avec authentification par clés utilisateur + * Les clés sont gérées côté serveur avec rotation automatique + */ +class SecureVaultClient { + constructor(config) { + this.vaultKey = null; + // Charger les variables d'environnement depuis .env + // Essayer plusieurs emplacements pour le fichier .env + this._loadEnvironmentVariables(); + // Si pas de config fournie, utiliser les variables d'environnement + if (!config) { + const envUser = process.env['VAULT_USER']; + const envKey = process.env['VAULT_KEY']; + const envEnv = process.env['VAULT_ENV']; + if (!envUser || !envKey || !envEnv) { + throw new Error('Variables d\'environnement requises: VAULT_USER, VAULT_KEY, VAULT_ENV'); + } + config = { + baseUrl: 'https://vault.4nkweb.com:6666', + userId: envUser, + timeout: 30000, + verifySsl: false + }; + this.vaultKey = envKey; + } + this.config = { + verifySsl: false, + timeout: 30000, + ...config, + }; + // Validation de l'ID utilisateur + if (!this.config.userId || this.config.userId.length < 3 || this.config.userId.length > 128) { + throw new Error('ID utilisateur requis (3-128 caractères)'); + } + if (!/^[a-zA-Z0-9_-]+$/.test(this.config.userId)) { + throw new Error('ID utilisateur invalide - caractères autorisés: a-z, A-Z, 0-9, _, -'); + } + } + /** + * Récupère un fichier depuis l'API Vault + */ + async getFile(env, filePath) { + const url = `${this.config.baseUrl}/${env}/${filePath}`; + try { + const response = await this._fetchApi(url); + if (!response.ok) { + if (response.status === 401) { + throw new VaultAuthenticationError('Authentification échouée - vérifiez votre ID utilisateur', 'AUTH_FAILED', response.status); + } + if (response.status === 403) { + throw new VaultApiError('Accès non autorisé à ce fichier', 'ACCESS_DENIED', response.status); + } + throw new VaultApiError(`Erreur API: ${response.status} ${response.statusText}`, 'API_ERROR', response.status); + } + const encryptedData = await response.arrayBuffer(); + // Extraction des métadonnées depuis les headers + const user_id = response.headers.get('X-User-ID') || undefined; + const keyRotation = response.headers.get('X-Key-Rotation') || undefined; + const algorithm = response.headers.get('X-Algorithm') || undefined; + // Déchiffrement du contenu avec les headers pour la prochaine clé + const decryptedContent = this.decryptContent(Buffer.from(encryptedData), response.headers); + return { + content: decryptedContent, + filename: filePath.split('/').pop() || filePath, + size: decryptedContent.length, + encrypted: true, + algorithm, + user_id, + key_version: keyRotation, + timestamp: new Date().toISOString() + }; + } + catch (error) { + if (error instanceof VaultApiError || error instanceof VaultAuthenticationError) { + throw error; + } + throw new VaultApiError(`Erreur lors de la récupération du fichier: ${error instanceof Error ? error.message : 'Inconnue'}`); + } + } + /** + * Récupère plusieurs fichiers en parallèle + */ + async getFiles(env, filePaths) { + const promises = filePaths.map(filePath => this.getFile(env, filePath)); + return Promise.all(promises); + } + /** + * Recherche des fichiers correspondant à un pattern + */ + async searchFiles(_env, _pattern) { + // Cette fonctionnalité nécessiterait une implémentation côté serveur + // Pour l'instant, retour d'une erreur explicative + throw new VaultApiError('Recherche de fichiers non implémentée - contactez l\'administrateur', 'NOT_IMPLEMENTED'); + } + /** + * Vérifie l'état de santé de l'API + */ + async health() { + const url = `${this.config.baseUrl}/health`; + try { + const response = await this._fetchApi(url); + if (!response.ok) { + throw new VaultApiError(`Erreur de santé API: ${response.status}`, 'HEALTH_CHECK_FAILED', response.status); + } + return await response.json(); + } + catch (error) { + if (error instanceof VaultApiError) { + throw error; + } + throw new VaultApiError(`Erreur lors du contrôle de santé: ${error instanceof Error ? error.message : 'Inconnue'}`); + } + } + /** + * Récupère les informations sur l'API + */ + async info() { + const url = `${this.config.baseUrl}/info`; + try { + const response = await this._fetchApi(url); + if (!response.ok) { + throw new VaultApiError(`Erreur info API: ${response.status}`, 'INFO_ERROR', response.status); + } + return await response.json(); + } + catch (error) { + if (error instanceof VaultApiError) { + throw error; + } + throw new VaultApiError(`Erreur lors de la récupération des informations: ${error instanceof Error ? error.message : 'Inconnue'}`); + } + } + /** + * Test de connectivité simple + */ + async ping() { + try { + await this.health(); + return true; + } + catch (error) { + return false; + } + } + /** + * Récupère toutes les routes disponibles de l'API + */ + async getRoutes() { + const url = `${this.config.baseUrl}/routes`; + try { + const response = await this._fetchApi(url); + if (!response.ok) { + if (response.status === 401) { + throw new VaultAuthenticationError('Authentification échouée - vérifiez votre ID utilisateur', 'AUTH_FAILED', response.status); + } + throw new VaultApiError(`Erreur API routes: ${response.status} ${response.statusText}`, 'ROUTES_API_ERROR', response.status); + } + return await response.json(); + } + catch (error) { + if (error instanceof VaultApiError || error instanceof VaultAuthenticationError) { + throw error; + } + throw new VaultApiError(`Erreur lors de la récupération des routes: ${error instanceof Error ? error.message : 'Inconnue'}`); + } + } + /** + * Synchronise les fichiers déchiffrés localement + * Route vault /// -> ../confs// + * Les fichiers existants dans confs/ sont toujours écrasés pour avoir le contenu le plus récent + */ + async syncLocalFiles(options) { + // Recharger les variables d'environnement au cas où elles auraient changé + this._loadEnvironmentVariables(); + // Récupérer le dossier de destination depuis les variables d'environnement + const defaultConfsDir = process.env['VAULT_CONFS_DIR'] || '../confs'; + const { environment, localDir = defaultConfsDir, verbose = false } = options; + const result = { + synced: 0, + skipped: 0, + errors: 0, + details: [] + }; + try { + // 1. Créer le dossier de destination s'il n'existe pas + // Résoudre le chemin par rapport au répertoire du fichier .env + let targetDir; + if (path_1.default.isAbsolute(localDir)) { + targetDir = localDir; + } + else { + // Pour les chemins relatifs, partir du répertoire du fichier .env + const envFileDir = this._getEnvFileDirectory(); + targetDir = path_1.default.resolve(envFileDir, localDir); + } + if (!fs_1.default.existsSync(targetDir)) { + fs_1.default.mkdirSync(targetDir, { recursive: true }); + if (verbose) { + console.log(`📁 Dossier créé: ${targetDir}`); + } + } + // 2. Récupérer la liste des routes pour identifier les fichiers + const routes = await this.getRoutes(); + // 3. Extraire les fichiers disponibles depuis les exemples de routes + const fileRoute = routes.routes.find(route => route.path.includes('') && route.path.includes('')); + if (!fileRoute || !fileRoute.examples) { + throw new VaultApiError('Impossible de déterminer les fichiers disponibles'); + } + // 4. Parser les exemples pour extraire les projets et fichiers + const filesToSync = []; + for (const example of fileRoute.examples) { + // Format: /dev/bitcoin/bitcoin.conf -> project: bitcoin, fileName: bitcoin.conf + const pathParts = example.split('/').filter(part => part && part !== environment); + if (pathParts.length >= 2) { + const project = pathParts[0] || 'unknown'; + const fileName = pathParts[pathParts.length - 1] || 'unknown'; + const vaultPath = pathParts.join('/'); + filesToSync.push({ + project, + fileName, + vaultPath + }); + } + } + // 5. Synchroniser chaque fichier + for (const file of filesToSync) { + try { + const localProjectDir = path_1.default.join(targetDir, file.project); + const localFilePath = path_1.default.join(localProjectDir, file.fileName); + // Créer le dossier du projet s'il n'existe pas + if (!fs_1.default.existsSync(localProjectDir)) { + fs_1.default.mkdirSync(localProjectDir, { recursive: true }); + if (verbose) { + console.log(`📁 Dossier projet créé: ${localProjectDir}`); + } + } + // Toujours écraser les fichiers dans confs/ pour avoir le contenu le plus récent + // La vérification d'existence est conservée pour le logging uniquement + const fileExists = fs_1.default.existsSync(localFilePath); + if (fileExists && verbose) { + console.log(`🔄 Écrasement du fichier existant: ${file.vaultPath}`); + } + // Récupérer le fichier depuis le vault + const vaultFile = await this.getFile(environment, file.vaultPath); + // Extraire le contenu déchiffré (simulation pour le format de démonstration) + let content = vaultFile.content; + // Le contenu est maintenant déchiffré automatiquement par decryptContent + // Pas besoin de récupérer depuis le storage, le contenu vient de l'API déchiffrée + // Écrire le fichier local + fs_1.default.writeFileSync(localFilePath, content, 'utf8'); + result.synced++; + result.details.push({ + file: file.vaultPath, + status: 'synced', + message: `Synchronisé vers ${localFilePath}` + }); + if (verbose) { + console.log(`✅ Synchronisé: ${file.vaultPath} -> ${localFilePath}`); + } + } + catch (error) { + result.errors++; + const errorMessage = error instanceof Error ? error.message : 'Erreur inconnue'; + result.details.push({ + file: file.vaultPath, + status: 'error', + message: errorMessage + }); + if (verbose) { + console.log(`❌ Erreur: ${file.vaultPath} - ${errorMessage}`); + } + } + } + if (verbose) { + console.log(`\n📊 Résumé de synchronisation:`); + console.log(` ✅ Synchronisés: ${result.synced}`); + console.log(` ⏭️ Ignorés: ${result.skipped}`); + console.log(` ❌ Erreurs: ${result.errors}`); + } + return result; + } + catch (error) { + throw new VaultApiError(`Erreur lors de la synchronisation: ${error instanceof Error ? error.message : 'Inconnue'}`); + } + } + /** + * Déchiffre le contenu avec les métadonnées utilisateur et gère la prochaine clé + */ + decryptContent(encryptedData, responseHeaders) { + try { + // Décoder le base64 + const decoded = Buffer.from(encryptedData.toString(), 'base64'); + // Nouveau format: nonce (12 bytes) + taille_métadonnées (4 bytes) + métadonnées + contenu chiffré + if (decoded.length < 16) { + throw new Error('Données chiffrées invalides - format incorrect'); + } + const nonce = decoded.subarray(0, 12); + const metadataSize = decoded.readUInt32BE(12); + const metadataJson = decoded.subarray(16, 16 + metadataSize); + const ciphertext = decoded.subarray(16 + metadataSize); + // Parse des métadonnées + const metadata = JSON.parse(metadataJson.toString('utf-8')); + // Vérification de l'utilisateur + if (metadata.user_id !== this.config.userId) { + throw new VaultAuthenticationError('Métadonnées utilisateur ne correspondent pas', 'USER_MISMATCH'); + } + // Récupération de la prochaine clé depuis les headers ou les métadonnées + const nextKey = responseHeaders?.get('X-Next-Key') || metadata.next_key; + // Pour le déchiffrement, utiliser la clé courante d'abord + const keyToUse = this.vaultKey; + if (!keyToUse) { + throw new VaultDecryptionError('Clé de déchiffrement non disponible'); + } + console.log(`🔑 Utilisation de la clé courante pour déchiffrement: ${keyToUse.substring(0, 20)}...`); + // Ne pas mettre à jour la clé immédiatement, attendre un déchiffrement réussi + try { + // Convertir la clé base64 en Uint8Array + const key = Buffer.from(keyToUse, 'base64'); + // Déchiffrement ChaCha20-Poly1305 avec @noble/ciphers + const cipher = chacha20poly1305(key, nonce); + const decrypted = cipher.decrypt(ciphertext); + // Déchiffrement réussi, mettre à jour la clé pour la prochaine requête + if (nextKey) { + this.updateNextKey(nextKey); + } + // Retourner le contenu déchiffré + return Buffer.from(decrypted).toString('utf-8'); + } + catch (decryptError) { + // Si le déchiffrement échoue, essayer avec la prochaine clé si elle est différente + if (nextKey && nextKey !== keyToUse) { + console.log(`🔄 Tentative de déchiffrement avec la prochaine clé...`); + try { + const nextKeyBuffer = Buffer.from(nextKey, 'base64'); + const cipherNext = chacha20poly1305(nextKeyBuffer, nonce); + const decryptedNext = cipherNext.decrypt(ciphertext); + console.log(`✅ Déchiffrement réussi avec la prochaine clé !`); + // Déchiffrement réussi avec la prochaine clé, mettre à jour + this.updateNextKey(nextKey); + return Buffer.from(decryptedNext).toString('utf-8'); + } + catch (nextDecryptError) { + console.warn(`⚠️ Déchiffrement avec la prochaine clé échoué: ${nextDecryptError instanceof Error ? nextDecryptError.message : 'Erreur inconnue'}`); + } + } + throw new VaultDecryptionError(`Erreur de déchiffrement ChaCha20-Poly1305: ${decryptError instanceof Error ? decryptError.message : 'Inconnue'}`); + } + } + catch (error) { + if (error instanceof VaultAuthenticationError || error instanceof VaultDecryptionError) { + throw error; + } + throw new VaultDecryptionError(`Erreur de déchiffrement: ${error instanceof Error ? error.message : 'Inconnue'}`); + } + } + /** + * Met à jour la prochaine clé pour les requêtes suivantes et le fichier .env + */ + updateNextKey(nextKey) { + if (nextKey) { + this.vaultKey = nextKey; // Mettre à jour la clé courante + // Mettre à jour le fichier .env avec la nouvelle clé + this.updateEnvFile(nextKey); + console.log(`🔑 Prochaine clé mise à jour: ${nextKey.substring(0, 20)}...`); + } + } + /** + * Retourne le répertoire du fichier .env trouvé + */ + _getEnvFileDirectory() { + // Chercher le fichier .env dans l'ordre de priorité + const possibleEnvPaths = [ + path_1.default.join(__dirname, '.env'), // Répertoire du SDK (priorité 1) + path_1.default.join(process.cwd(), '.env'), // Répertoire de travail (priorité 2) + '.env', // Répertoire courant (priorité 3) + '../.env', // Répertoire parent (priorité 4) + '../../.env', // Répertoire grand-parent (priorité 5) + path_1.default.join(__dirname, '../.env'), // Parent du SDK (priorité 6) + path_1.default.join(__dirname, '../../.env'), // Grand-parent du SDK (priorité 7) + ]; + for (const envPath of possibleEnvPaths) { + try { + if (fs_1.default.existsSync(envPath)) { + // Retourner le répertoire du fichier .env + const envDir = path_1.default.dirname(path_1.default.resolve(envPath)); + return envDir; + } + } + catch (error) { + // Ignorer les erreurs et continuer avec le chemin suivant + continue; + } + } + // Fallback vers le répertoire du SDK si aucun .env n'est trouvé + return __dirname; + } + /** + * Charge les variables d'environnement depuis plusieurs emplacements possibles + */ + _loadEnvironmentVariables() { + const possibleEnvPaths = [ + '.env', // Répertoire courant + '../.env', // Répertoire parent + '../../.env', // Répertoire grand-parent + path_1.default.join(__dirname, '.env'), // Répertoire du SDK + path_1.default.join(__dirname, '../.env'), // Parent du SDK + path_1.default.join(__dirname, '../../.env'), // Grand-parent du SDK + path_1.default.join(process.cwd(), '.env'), // Répertoire de travail + ]; + let envLoaded = false; + for (const envPath of possibleEnvPaths) { + try { + if (fs_1.default.existsSync(envPath)) { + const result = dotenv_1.default.config({ path: envPath }); + if (!result.error) { + console.log(`📄 Variables d'environnement chargées depuis: ${envPath}`); + envLoaded = true; + break; + } + } + } + catch (error) { + // Ignorer les erreurs et continuer avec le chemin suivant + continue; + } + } + // Si aucun fichier .env n'a été trouvé, essayer le chargement par défaut + if (!envLoaded) { + try { + dotenv_1.default.config(); + console.log('📄 Variables d\'environnement chargées depuis .env par défaut'); + } + catch (error) { + console.log('⚠️ Aucun fichier .env trouvé, utilisation des variables système uniquement'); + } + } + } + /** + * Met à jour le fichier .env avec la nouvelle clé + */ + updateEnvFile(newKey) { + try { + const envPath = path_1.default.join(__dirname, '../../.env'); + // Lire le fichier .env actuel + let envContent = ''; + if (fs_1.default.existsSync(envPath)) { + envContent = fs_1.default.readFileSync(envPath, 'utf8'); + } + // Mettre à jour ou ajouter la clé VAULT_KEY + const keyRegex = /^VAULT_KEY=.*$/m; + if (keyRegex.test(envContent)) { + envContent = envContent.replace(keyRegex, `VAULT_KEY="${newKey}"`); + } + else { + envContent += `\nVAULT_KEY="${newKey}"\n`; + } + // Écrire le fichier .env mis à jour + fs_1.default.writeFileSync(envPath, envContent, 'utf8'); + console.log(`📝 Fichier .env mis à jour avec la nouvelle clé`); + } + catch (error) { + console.warn(`⚠️ Impossible de mettre à jour le fichier .env: ${error instanceof Error ? error.message : 'Erreur inconnue'}`); + } + } + /** + * Effectue une requête vers l'API avec authentification + */ + async _fetchApi(url) { + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), this.config.timeout); + try { + const mergedOptions = { + method: 'GET', + headers: { + 'User-Agent': 'SecureVaultClient/2.0.0', + 'X-User-ID': this.config.userId, + 'Accept': 'application/octet-stream' + }, + signal: controller.signal + }; + // Configuration SSL pour les certificats auto-signés + if (this.config.verifySsl === false) { + mergedOptions.agent = new https_1.default.Agent({ + rejectUnauthorized: false + }); + } + const response = await (0, node_fetch_1.default)(url, mergedOptions); + clearTimeout(timeoutId); + return response; + } + catch (error) { + clearTimeout(timeoutId); + if (error instanceof Error && error.name === 'AbortError') { + throw new VaultApiError(`Timeout de la requête (${this.config.timeout}ms)`, 'TIMEOUT'); + } + throw new VaultApiError(`Erreur de connexion: ${error instanceof Error ? error.message : 'Inconnue'}`); + } + } +} +exports.SecureVaultClient = SecureVaultClient; +/** + * Fonction utilitaire pour créer un client sécurisé + */ +function createSecureVaultClient(baseUrl, userId) { + return new SecureVaultClient({ + baseUrl, + userId, + verifySsl: false, // Pour les certificats auto-signés en développement + timeout: 15000 + }); +} +/** + * Fonction utilitaire pour créer un client sécurisé avec configuration complète + */ +function createSecureVaultClientWithConfig(config) { + return new SecureVaultClient(config); +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/sdk-client/dist/src/index.js.map b/sdk-client/dist/src/index.js.map new file mode 100644 index 0000000..df1748f --- /dev/null +++ b/sdk-client/dist/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/storage/dev/4NK_miner/.gitkeep b/storage/dev/4NK_miner/.gitkeep new file mode 100644 index 0000000..6a04314 --- /dev/null +++ b/storage/dev/4NK_miner/.gitkeep @@ -0,0 +1 @@ +./ \ No newline at end of file