---
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="<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`.
