. * */ defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); /** * Esta clase es la encargada de realizar la autentificación de usuarios de sysPass. */ class SP_Auth { static $userName; static $userEmail; /** * @brief Autentificación de usuarios con LDAP * @param string $userLogin con el login del usuario * @param string $userPass con la clave del usuario * @return bool */ public static function authUserLDAP($userLogin, $userPass) { if (!SP_Util::ldapIsAvailable() || !SP_Util::ldapIsEnabled() || !SP_LDAP::checkLDAPParams()) { return false; } $ldapGroupAccess = false; $message['action'] = __FUNCTION__; // Conectamos al servidor realizamos la conexión con el usuario proxy try { SP_LDAP::ldapConnect(); SP_LDAP::ldapBind(); SP_LDAP::getUserDN($userLogin); } catch (Exception $e) { return false; } $userDN = SP_LDAP::$ldapSearchData[0]['dn']; // Mapeo de los atributos $attribsMap = array( 'groupMembership' => 'group', 'memberOf' => 'group', 'displayname' => 'name', 'fullname' => 'name', 'mail' => 'mail', 'lockoutTime' => 'expire'); // Realizamos la conexión con el usuario real y obtenemos los atributos try { SP_LDAP::ldapBind($userDN, $userPass); $attribs = SP_LDAP::getLDAPAttr($attribsMap); } catch (Exception $e) { return ldap_errno(SP_LDAP::getConn()); } // Comprobamos si la cuenta está bloqueada o expirada if (isset($attribs['expire']) && $attribs['expire'] > 0) { return 701; } // Comprobamos que el usuario está en el grupo indicado buscando en los atributos del usuario if (isset($attribs['group'])) { if (is_array($attribs['group'])) { foreach ($attribs['group'] as $group) { if (is_int($group)) { continue; } // Comprobamos que el usuario está en el grupo indicado if (self::checkLDAPGroup($group)) { $ldapGroupAccess = true; break; } } } else { $ldapGroupAccess = self::checkLDAPGroup($attribs['group']); } // Comprobamos que el usuario está en el grupo indicado buscando en los atributos del grupo } else { $ldapGroupAccess = SP_LDAP::searchUserInGroup($userDN); } if ($ldapGroupAccess == false) { return 702; } self::$userName = (isset($attribs['name'])) ? $attribs['name'] : $userLogin; self::$userEmail = (isset($attribs['mail'])) ? $attribs['email'] : ''; return true; } /** * @brief Comprobar si el grupo de LDAP está habilitado * @param string $group con el nombre del grupo * @return bool */ private static function checkLDAPGroup($group) { $ldapGroup = strtolower(SP_Config::getValue('ldap_group')); $groupName = array(); preg_match('/^cn=([\w\s-]+),.*/i', $group, $groupName); if (strtolower($groupName[1]) == $ldapGroup || strtolower($group) == $ldapGroup) { return true; } return false; } /** * @brief Autentificación de usuarios con MySQL * @param string $userLogin con el login del usuario * @param string $userPass con la clave del usuario * @return bool * * Esta función comprueba la clave del usuario. Si el usuario necesita ser migrado desde phpPMS, * se ejecuta el proceso para actualizar la clave. */ public static function authUserMySQL($userLogin, $userPass) { if (SP_Users::checkUserIsMigrate($userLogin)) { if (!SP_Users::migrateUser($userLogin, $userPass)) { return false; } } $query = "SELECT user_login," . "user_pass " . "FROM usrData " . "WHERE user_login = '" . DB::escape($userLogin) . "' " . "AND user_isMigrate = 0 " . "AND user_pass = SHA1(CONCAT(user_hashSalt,'" . DB::escape($userPass) . "')) LIMIT 1"; if (DB::doQuery($query, __FUNCTION__) === false) { return false; } if (count(DB::$last_result) == 0) { return false; } return true; } /** * @brief Proceso para la recuperación de clave * @param string $login con el login del usuario * @param string $email con el email del usuario * @return bool */ public static function mailPassRecover($login, $email) { if (SP_Users::checkUserMail($login, $email) && !SP_Users::checkUserIsDisabled($login) && !SP_Users::checkUserIsLDAP($login) && !SP_Users::checkPassRecoverLimit($login) ) { $hash = SP_Util::generate_random_bytes(); $message['action'] = _('Cambio de Clave'); $message['text'][] = SP_Html::strongText(_('Se ha solicitado el cambio de su clave de usuario.')); $message['text'][] = ''; $message['text'][] = _('Para completar el proceso es necesario que acceda a la siguiente URL:'); $message['text'][] = ''; $message['text'][] = SP_Html::anchorText(SP_Init::$WEBURI . '/index.php?a=passreset&h=' . $hash . '&t=' . time()); $message['text'][] = ''; $message['text'][] = _('Si no ha solicitado esta acción, ignore este mensaje.'); return (SP_Common::sendEmail($message, $email, false) && SP_Users::addPassRecover($login, $hash)); } else { return false; } } }