--- name: popelis_set_password kind: function lang: py domain: infra version: "1.0.0" purity: impure signature: "def popelis_set_password(base_url: str, admin_token: str, username: str, password: str, timeout: float = 30.0) -> dict" description: "Cambia la contrasena de un usuario existente en Popelis (POST /api/admin/users/password). Devuelve 404 si el usuario no existe. Registro CERRADO: requiere cabecera X-Admin-Token." tags: [popelis, http, admin, user, password, infra] params: - name: base_url desc: "URL base del servicio sin trailing slash. Ej: https://popelis.datardos.com" - name: admin_token desc: "Token de administracion. Se envia como cabecera X-Admin-Token. No logear ni exponer." - name: username desc: "Nombre del usuario al que se le quiere cambiar la contrasena. Debe existir previamente." - name: password desc: "Nueva contrasena a establecer." - name: timeout desc: "Timeout en segundos para la peticion HTTP. Default 30.0." output: "Dict con el resultado de la operacion: {status: 'password updated'}" uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: ["json", "urllib.request", "urllib.error"] tested: false tests: [] test_file_path: "" file_path: "python/functions/infra/popelis_set_password.py" --- ## Ejemplo ```python from infra.popelis_set_password import popelis_set_password result = popelis_set_password( base_url="https://popelis.datardos.com", admin_token="", username="alice", password="n3wpass2024", ) # result == {"status": "password updated"} print(result) ``` ## Cuando usarla Cuando necesites resetear o cambiar la contrasena de un usuario ya existente en Popelis desde un script de administracion o agente. Usar DESPUES de `popelis_create_user` (el usuario debe existir). Tambien util para rotacion periodica de credenciales. ## Gotchas - **Token sensible**: `admin_token` es un secreto. Nunca logear el valor, interpolarlo en URLs ni persistirlo en texto plano. - **Registro cerrado**: el endpoint rechaza cualquier peticion sin `X-Admin-Token` valido (HTTP 401/403). - **404 si no existe**: si el `username` no esta registrado, el servidor devuelve HTTP 404 y la funcion lanza `ValueError` con mensaje explicito (`usuario 'X' no existe`). Verificar existencia previa o capturar el error. - **No afecta a Jellyfin**: este endpoint cambia solo la contrasena en Popelis. Si el usuario Jellyfin espejo tiene contrasena separada, habra que gestionarla por separado via la API de Jellyfin. - **Solo stdlib**: no requiere `requests` ni dependencias externas — usa `urllib.request`.