#!/usr/bin/env node /** * Script de test pour la connexion CalDAV Infomaniak * Usage: node test-infomaniak-caldav.js */ const { createClient } = require('webdav'); const email = process.argv[2] || 'a.tmiri@icmaae.foundation'; const password = process.argv[3]; if (!password) { console.error('❌ Usage: node test-infomaniak-caldav.js '); console.error(''); console.error('Example:'); console.error(' node test-infomaniak-caldav.js a.tmiri@icmaae.foundation "your-password"'); process.exit(1); } const baseUrl = 'https://sync.infomaniak.com/caldav'; console.log('🔍 Test CalDAV Infomaniak'); console.log('Email:', email); console.log('URL:', baseUrl); console.log('Password length:', password.length); console.log(''); async function testCalDAV() { try { console.log('📡 Création du client CalDAV...'); const client = createClient(baseUrl, { username: email, password: password, }); console.log('📡 Test PROPFIND sur la racine (/)...'); const items = await client.getDirectoryContents('/'); console.log('✅ SUCCESS - Connexion réussie!'); console.log(''); console.log(`📅 ${items.length} élément(s) trouvé(s):`); console.log(''); const calendars = items.filter(item => item.type === 'directory' && item.filename !== '/'); if (calendars.length === 0) { console.log('⚠️ Aucun calendrier trouvé (seulement des fichiers)'); } else { console.log('Calendriers:'); for (let i = 0; i < calendars.length; i++) { const cal = calendars[i]; console.log(` ${i + 1}. ${cal.basename || cal.filename}`); console.log(` Chemin: ${cal.filename}`); console.log(` Type: ${cal.type}`); // Essayer de récupérer les propriétés du calendrier try { const props = await client.customRequest(cal.filename, { method: 'PROPFIND', headers: { Depth: '0', 'Content-Type': 'application/xml', }, data: ` `, }); // Parser le XML pour extraire le displayname const displayNameMatch = props.data.match(/]*>([^<]+)<\/d:displayname>/i); const colorMatch = props.data.match(/]*>([^<]+)<\/c:calendar-color>/i); if (displayNameMatch) { console.log(` Nom: ${displayNameMatch[1]}`); } if (colorMatch) { console.log(` Couleur: ${colorMatch[1]}`); } } catch (propError) { console.log(` ⚠️ Impossible de récupérer les propriétés: ${propError.message}`); } console.log(''); } } console.log('=========================================='); console.log('✅ La connexion CalDAV fonctionne correctement'); console.log(' Si le code Node.js échoue, le problème est dans la bibliothèque webdav'); console.log(' ou dans la configuration du client.'); console.log('=========================================='); } catch (error) { console.error('❌ ERREUR'); console.error(''); console.error('Type:', error.constructor.name); console.error('Message:', error.message); if (error.status === 401 || error.response?.status === 401) { console.error(''); console.error('🔐 Erreur 401 - Non autorisé'); console.error(''); console.error('Causes possibles:'); console.error(' 1. Mot de passe incorrect'); console.error(' 2. 2FA activé - utilisez un mot de passe d\'application'); console.error(' 3. Compte suspendu ou désactivé'); console.error(' 4. Email incorrect'); console.error(''); console.error('Pour générer un mot de passe d\'application Infomaniak:'); console.error(' 1. Connectez-vous à https://config.infomaniak.com'); console.error(' 2. Allez dans "Mon profil" > "Mots de passe d\'application"'); console.error(' 3. Générez un nouveau mot de passe pour "CalDAV"'); console.error(' 4. Utilisez ce mot de passe dans votre compte email'); } else { console.error(''); console.error('Détails de l\'erreur:'); if (error.status) { console.error(' Status:', error.status); } if (error.statusText) { console.error(' Status Text:', error.statusText); } if (error.response) { console.error(' Response Status:', error.response.status); console.error(' Response Status Text:', error.response.statusText); } if (error.stack) { console.error(''); console.error('Stack trace:'); console.error(error.stack.split('\n').slice(0, 5).join('\n')); } } process.exit(1); } } testCalDAV();