# Calendario de Contactos - CalDAV/CardDAV

Sistema completo de calendario y contactos usando Radicale e InfCloud con Docker.

## 🚀 Configuración Rápida

1. **Configurar variables de entorno:**
   ```bash
   make setup
   # Edita el archivo .env con tus credenciales
   ```

2. **Iniciar servicios:**
   ```bash
   make start
   ```

3. **Acceder a la aplicación:**
   - InfCloud: http://localhost:8090/ (o http://localhost:8090/infcloud/)
   - Radicale: http://localhost:5232/

## 📁 Estructura del Proyecto

```
calendario_contactos/
├── .env                     # Variables de entorno (no incluir en git)
├── .env.example            # Plantilla de variables de entorno
├── docker-compose.yml      # Configuración de servicios
├── Makefile               # Comandos de gestión
├── config/                # Configuración de Radicale
│   ├── config            # Configuración principal de Radicale
│   └── users             # Usuarios y contraseñas (bcrypt)
├── data/                 # Datos persistentes de Radicale
└── infcloud_config/      # Configuración de InfCloud
    ├── config.js         # Configuración generada (no editar)
    ├── config.js.template # Plantilla de configuración
    └── nginx-infcloud.conf # Configuración nginx
```

## 🛠️ Comandos Disponibles

```bash
make help              # Mostrar ayuda
make setup             # Configuración inicial (copia .env.example)
make start             # Generar config e iniciar servicios
make stop              # Detener servicios
make restart           # Reiniciar servicios
make config            # Regenerar config.js desde .env
make status            # Mostrar estado de servicios
make test-connection   # Probar conexión con Radicale
make logs              # Mostrar logs de todos los servicios
make logs-infcloud     # Mostrar logs solo de InfCloud
make logs-radicale     # Mostrar logs solo de Radicale
make clean             # Limpiar configuración generada
```

## ⚙️ Variables de Entorno

Configura estas variables en tu archivo `.env`:

```env
# Configuración de Radicale
RADICALE_USERNAME=admin
RADICALE_PASSWORD=tu_contraseña_segura_aqui

# Configuración de Red
RADICALE_PORT=5232
INFCLOUD_PORT=8090

# Configuración de Zona Horaria
TZ=Europe/Madrid

# URLs base
RADICALE_BASE_URL=http://localhost:5232
INFCLOUD_BASE_URL=http://localhost:8090
```

## 🔧 Servicios

### Radicale (CalDAV/CardDAV Server)
- **Puerto:** 5232
- **Función:** Servidor CalDAV/CardDAV que almacena calendarios y contactos
- **Configuración:** `/config/config`
- **Datos:** `/data/collections`

### InfCloud (Web Client)
- **Puerto:** 8090
- **Función:** Cliente web para calendarios y contactos
- **URL:** http://localhost:8090/ (también disponible en /infcloud/)
- **Configuración:** Generada automáticamente desde `.env`

### PHP-FPM
- **Función:** Soporte PHP para InfCloud (si es necesario)

## 🔐 Gestión de Usuarios

### Agregar un nuevo usuario:
```bash
# Generar hash de contraseña para cualquier usuario
python3 -c "import crypt; print('nombre_usuario:' + crypt.crypt('contraseña', crypt.mksalt(crypt.METHOD_BLOWFISH)))" >> config/users

# Ejemplo para crear usuario 'juan':
python3 -c "import crypt; print('juan:' + crypt.crypt('mi_password', crypt.mksalt(crypt.METHOD_BLOWFISH)))" >> config/users

# Reiniciar Radicale
docker compose restart radicale
```

### Usuarios de ejemplo:
- **admin:** kIKTu4rI5MBBJjTqujbCp61ZFN30Y8adI
- **user1:** password123

### Cambiar contraseña:
1. Edita `config/users` con el nuevo hash bcrypt
2. Actualiza `.env` con la nueva contraseña
3. Regenera configuración: `make config`
4. Reinicia servicios: `make restart`

## 📱 Acceso desde Dispositivos

### Android (DAVx5)
- **URL CalDAV:** http://tu-servidor:5232/usuario/
- **URL CardDAV:** http://tu-servidor:5232/usuario/
- **Usuario:** tu_usuario
- **Contraseña:** tu_contraseña

### iOS (Configuración nativa)
- **Servidor:** tu-servidor
- **Puerto:** 5232
- **Ruta principal:** /usuario/
- **SSL:** No (para desarrollo local)

## 🐛 Resolución de Problemas

### Error 405 PROPFIND
✅ **Solucionado:** Configuración nginx con proxy y rewrite rules

### Error 401 Unauthorized
- Verifica credenciales en `.env`
- Regenera config: `make config`
- Verifica usuario en `config/users`

### Error de conexión
```bash
make status          # Verificar estado de servicios
make logs           # Ver logs para errores
make test-connection # Probar conexión directa
```

### Regenerar todo
```bash
make clean          # Limpiar configuración
make config         # Regenerar config.js
make restart        # Reiniciar servicios
```

## 📋 Verificación Post-instalación

1. **Servicios ejecutándose:**
   ```bash
   make status
   ```

2. **Conexión a Radicale:**
   ```bash
   make test-connection
   ```

3. **Acceso a InfCloud:**
   - Navegar a http://localhost:8090/
   - **Login dinámico:** Cualquier usuario puede iniciar sesión
   - Usuarios disponibles: admin, user1, o cualquier usuario que agregues

4. **Verificar que no hay errores 405:**
   ```bash
   curl -u usuario:contraseña -X PROPFIND http://localhost:8090/caldav.php/usuario/ -H "Depth: 0" -v 2>&1 | grep "HTTP"
   # Debe devolver: HTTP/1.1 207 Multi-Status
   ```

## 🔒 Seguridad

- ❌ **NO** hardcodear contraseñas en archivos de configuración
- ✅ Usar variables de entorno (`.env`)
- ✅ Mantener `.env` fuera del control de versiones
- ✅ Usar contraseñas seguras y únicas
- ✅ Configurar HTTPS en producción

## 📚 Referencias

- [Radicale Documentation](https://radicale.org/v3.html)
- [InfCloud Documentation](https://www.inf-it.com/open-source/clients/infcloud/)
- [CalDAV RFC](https://tools.ietf.org/html/rfc4791)
- [CardDAV RFC](https://tools.ietf.org/html/rfc6352)

## 🎯 Problemas Resueltos

### ✅ Error PROPFIND 405 Method Not Allowed
**Problema:** InfCloud enviaba peticiones PROPFIND a `/caldav.php/` que devolvían error 405.

**Solución:**
1. Configuración nginx con proxy que redirige peticiones CalDAV a Radicale
2. Rewrite rules para traducir rutas `/caldav.php/` y `/radicale/` a rutas nativas de Radicale
3. Headers CORS completos para WebDAV
4. Sistema de variables de entorno para configuración segura

### ✅ Configuración de Credenciales Segura
**Problema:** Contraseñas hardcodeadas en archivos de configuración.

**Solución:**
1. Sistema de variables de entorno con `.env` y `.env.example`
2. Generación automática de `config.js` desde template
3. Makefile para automatizar tareas comunes
4. Hash bcrypt para almacenamiento seguro de contraseñas

### ✅ Soporte Multi-Usuario Dinámico
**Funcionalidad:** InfCloud ahora soporta múltiples usuarios con login dinámico.

**Características:**
1. **Login dinámico:** Los usuarios ingresan sus credenciales en la pantalla de login
2. **Múltiples usuarios:** Soporte para admin, user1, user2, etc.
3. **Nginx universal:** Maneja rutas para cualquier usuario (`/usuario/`)
4. **Configuración automática:** InfCloud detecta usuarios automáticamente

**Pruebas realizadas:**
- ✅ admin: HTTP 207 Multi-Status
- ✅ user1: HTTP 207 Multi-Status
- ✅ Cualquier usuario nuevo funciona automáticamente