# Autenticacion, Sesion y Permisos

## Login/logout

- Login moderno: `modules/Users/actions/Login.php`.
- Login legacy: `modules/Users/Authenticate.php` aun existe.
- Logout: `modules/Users/actions/Logout.php` regenera id, destruye sesion y registra historial.
- Login exitoso llama `session_regenerate_id(true)`, setea `AUTHUSERID`, `authenticated_user_id`, `app_unique_key`, idioma y skin.

## Sesiones

- `includes/http/Session.php` usa `HTTP_Session2`.
- Puede registrar un session handler custom por `Vtiger_Runtime_Configs`.
- `WebUI::getLogin()` valida `AUTHUSERID` contra `application_unique_key`.

## Roles, perfiles y sharing

- `Users_Privileges_Model` carga privilegios via `Vtiger_AccessControl::loadUserPrivileges($userId)`.
- Usa archivos cacheados en `user_privileges/user_privileges_<id>.php` y `sharing_privileges_<id>.php`.
- Permisos por modulo: `hasModulePermission($tabId)`.
- Permisos por accion: `hasModuleActionPermission($tabId, $action)`.
- Check general: `Users_Privileges_Model::isPermitted($module, $action, $record)`.

## Riesgos estructurales

- `user_privileges/` vive bajo webroot; debe estar protegido contra descarga/ejecucion no deseada.
- KCFinder se habilita en sesion de login y apunta a `test/upload` o `../test/upload`.
- `Authenticate.php` legacy conserva flujo antiguo con `$_REQUEST['user_password']`; revisar si sigue expuesto por rutas antiguas.
- La validacion por modulo depende de que cada handler implemente correctamente `checkPermission()`/`requiresPermission()`.
