. */ namespace SP\Auth; use SP\Auth\Browser\Browser; use SP\Auth\Browser\BrowserAuthData; use SP\Auth\Database\Database; use SP\Auth\Database\DatabaseAuthData; use SP\Auth\Ldap\LdapAuthData; use SP\Auth\Ldap\LdapMsAds; use SP\Auth\Ldap\LdapStd; use SP\Bootstrap; use SP\Config\Config; use SP\Config\ConfigData; use SP\Core\Exceptions\SPException; use SP\Core\Traits\InjectableTrait; use SP\DataModel\UserLoginData; use SP\Util\Checks; defined('APP_ROOT') || die(); /** * Class Auth * * Esta clase es la encargada de realizar la autentificación de usuarios de sysPass. * * @package SP\Auth */ class Auth { use InjectableTrait; /** * @var array */ protected $auths = []; /** * @var UserLoginData */ protected $UserData; /** * @var Config */ protected $Config; /** * @var ConfigData */ protected $ConfigData; /** * Auth constructor. * * @param UserLoginData $UserData * @throws \SP\Core\Exceptions\SPException */ public function __construct(UserLoginData $UserData) { $this->injectDependencies(); $this->UserData = $UserData; if ($this->ConfigData->isAuthBasicEnabled()) { $this->registerAuth('authBrowser'); } if ($this->ConfigData->isLdapEnabled()) { $this->registerAuth('authLdap'); } $this->registerAuth('authDatabase'); } /** * @param Config $config */ public function inject(Config $config) { $this->Config = $config; $this->ConfigData = $config->getConfigData(); } /** * Registrar un método de autentificación primarios * * @param string $auth Función de autentificación * @throws SPException */ protected function registerAuth($auth) { if (array_key_exists($auth, $this->auths)) { throw new SPException(SPException::SP_ERROR, __('Método ya inicializado', false), __FUNCTION__); } if (!method_exists($this, $auth)) { throw new SPException(SPException::SP_ERROR, __('Método no disponible', false), __FUNCTION__); } $this->auths[$auth] = $auth; } /** * Probar los métodos de autentificación * * @return bool|array */ public function doAuth() { $auths = []; /** @var AuthDataBase $pAuth */ foreach ($this->auths as $pAuth) { $pResult = $this->$pAuth(); if ($pResult !== false) { $auths[] = new AuthResult($pAuth, $pResult); } } return (count($auths) > 0) ? $auths : false; } /** * Autentificación de usuarios con LDAP. * * @return bool|LdapAuthData */ public function authLdap() { /** @var ConfigData $ConfigData */ $ConfigData = Bootstrap::getDic()['configData']; $Ldap = $ConfigData->isLdapAds() ? new LdapMsAds() : new LdapStd(); $LdapAuthData = $Ldap->getLdapAuthData(); if (!$Ldap->authenticate($this->UserData)) { return $LdapAuthData->getAuthenticated() === 1 ? $LdapAuthData : false; } // Comprobamos si la cuenta está bloqueada o expirada if ($LdapAuthData->getExpire() > 0) { $LdapAuthData->setStatusCode(701); } elseif (!$LdapAuthData->isInGroup()) { $LdapAuthData->setStatusCode(702); } $LdapAuthData->setAuthenticated(1); return $LdapAuthData; } /** * Autentificación de usuarios con base de datos * * Esta función comprueba la clave del usuario. Si el usuario necesita ser migrado, * se ejecuta el proceso para actualizar la clave. * * @return DatabaseAuthData * @throws \phpmailer\phpmailerException * @throws \SP\Core\Exceptions\SPException */ public function authDatabase() { $AuthDatabase = new Database(); return $AuthDatabase->authenticate($this->UserData); } /** * Autentificación de usuario con credenciales del navegador * * @return BrowserAuthData */ public function authBrowser() { $AuthBrowser = new Browser(); return $AuthBrowser->authenticate($this->UserData); } }