adding features

This commit is contained in:
DioCrafts
2025-04-12 18:58:21 +02:00
parent 090ab07423
commit f2ecbc1a39
7 changed files with 394 additions and 61 deletions
+71 -57
View File
@@ -1,89 +1,103 @@
# Solución para el issue #45: [BUG] Admin already exists?
# Solución para el error "El usuario 'admin' ya existe"
## Descripción del problema
## Problema
Al intentar configurar un usuario administrador, algunos usuarios reciben el error:
Cuando se intenta crear un usuario administrador en una instalación nueva de OxiCloud, aparece el siguiente error:
```
2025-04-09T14:01:26.733566Z ERROR oxicloud::interfaces::api::handlers::auth_handler: Registration failed for user admin: Already Exists: El usuario 'admin' ya existe
oxicloud-1 | 2025-04-12T10:47:26.643669Z ERROR oxicloud::interfaces::api::handlers::auth_handler: Registration failed for user admin: Already Exists: El usuario 'admin' ya existe
```
## Causa raíz
Este problema ocurre debido a cómo está implementada la migración de datos inicial. En el archivo `migrations/20250408000001_default_users.sql`, el sistema intenta crear un usuario admin por defecto durante la migración inicial, pero:
1. Si luego el usuario intenta crear manualmente otro usuario con nombre "admin", el sistema detecta el conflicto.
2. La cláusula `ON CONFLICT (id) DO NOTHING` solo previene conflictos en el ID, no en el nombre de usuario.
Este error ocurre porque las migraciones de la base de datos ya crean un usuario administrador por defecto como parte del proceso de inicialización.
## Solución implementada
Hemos realizado los siguientes cambios:
Hemos mejorado el sistema para que maneje mejor el registro de usuarios administradores:
1. Modificado `migrations/20250408000001_default_users.sql` para comprobar primero si el usuario "admin" ya existe:
1. **En una instalación nueva**:
- Si registras cualquier usuario como administrador (sea cual sea su nombre), el sistema detectará que es una instalación nueva y eliminará automáticamente el usuario admin predeterminado.
- Esto te permite crear tu propio usuario administrador con el nombre que prefieras desde el principio.
```sql
-- Check if admin user already exists before creating it
DO $$$
BEGIN
IF NOT EXISTS (SELECT 1 FROM auth.users WHERE username = 'admin') THEN
-- Create admin user (password: Admin123!)
INSERT INTO auth.users (
id,
username,
...
) VALUES (...);
END IF;
END;
$$$;
```
2. **En un sistema en uso**:
- No se permite crear nuevos usuarios administradores desde la página de registro una vez que ya existe un administrador en el sistema
- Esto previene la creación no autorizada de usuarios con permisos elevados
- El sistema tampoco permite tener múltiples usuarios con el mismo nombre (incluido "admin")
2. Creado un script `scripts/reset_admin.sql` que puede ejecutarse para eliminar el usuario admin existente:
### Detalles técnicos
```sql
-- Set the correct schema
SET search_path TO auth;
La solución implementa:
-- Delete the admin user if it exists
DELETE FROM auth.users WHERE username = 'admin';
1. Detección inteligente de instalaciones nuevas basada en:
- Verificación del número total de usuarios en el sistema
- Verificación del número de usuarios administradores
2. Reconocimiento de usuarios administradores:
- Un usuario es administrador si su nombre es "admin"
- Un usuario es administrador si se proporciona un rol "admin" explícitamente
- Los administradores reciben automáticamente una cuota de 100GB
3. Eliminación segura del usuario admin predeterminado:
- Se detecta al inicio del registro si es una instalación nueva
- Se elimina el admin predeterminado antes de continuar con el registro
4. Prevención de creación de múltiples administradores:
- Una vez que existe un usuario administrador en el sistema, no se permite crear más administradores desde la página de registro
- Solo se puede crear un administrador desde la página de registro durante la instalación inicial
- Esto protege el sistema contra la creación no autorizada de usuarios con privilegios elevados
-- Output remaining users for verification
SELECT username, email, role FROM auth.users ORDER BY role, username;
```
## Cómo usar esta funcionalidad
3. Actualizado la documentación en `doc/DATABASE-MIGRATIONS.md` con instrucciones detalladas para resolver este problema.
### En una instalación nueva:
## Instrucciones para usuarios afectados
1. Inicia OxiCloud por primera vez (las migraciones crearán automáticamente un usuario admin predeterminado)
2. Ve a la pantalla de registro y crea un usuario con:
- **Nombre de usuario**: Cualquier nombre que prefieras (por ejemplo, "torrefacto")
- **Contraseña**: La que tú quieras
- **Email**: Tu correo electrónico
3. El sistema detectará automáticamente que se trata de una instalación nueva
4. Si es un usuario administrador (porque el nombre es "admin" o porque explícitamente quieres que sea admin), el sistema eliminará el admin predeterminado antes de continuar
5. Tu nuevo usuario se creará y podrás iniciar sesión con él
Si encuentras el error "Admin already exists", tienes dos opciones:
### Si necesitas restablecer el usuario administrador:
### Opción 1: Usar el script proporcionado
Si ya tienes un sistema en uso y necesitas restablecer el usuario administrador:
#### Opción 1: Usar el script proporcionado
```bash
cat scripts/reset_admin.sql | docker exec -i oxicloud-postgres-1 psql -U postgres -d oxicloud
```
### Opción 2: Hacerlo manualmente
1. Conéctate al contenedor de PostgreSQL:
#### Opción 2: Hacerlo manualmente
```bash
# Encuentra el contenedor
docker ps
# Ejemplo: oxicloud-postgres-1
docker exec -it oxicloud-postgres-1 bash
docker exec -it oxicloud-postgres-1 psql -U postgres -d oxicloud
```
2. Conéctate a la base de datos:
```bash
psql -U postgres -d oxicloud
```
3. Borra el usuario admin existente:
```sql
SET search_path TO auth;
DELETE FROM auth.users WHERE username = 'admin';
```
4. Verifica que se eliminó correctamente:
```sql
SELECT username, email, role FROM auth.users;
```
5. Sal y registra un nuevo usuario admin a través de la interfaz web.
Luego registra un nuevo usuario admin a través de la interfaz web.
## Nota técnica
El usuario administrador predeterminado se crea durante las migraciones con estos valores:
```sql
INSERT INTO auth.users (
id,
username,
email,
password_hash,
role,
storage_quota_bytes
) VALUES (
'00000000-0000-0000-0000-000000000000',
'admin',
'admin@oxicloud.local',
'$argon2id$v=19$m=65536,t=3,p=4$c2FsdHNhbHRzYWx0c2FsdA$H3VxE8LL2qPT31DM3loTg6D+O4MSc2sD7GjlQ5h7Jkw', -- Admin123!
'admin',
107374182400 -- 100GB for admin
);
```