connection = $connectionPool->getConnectionForTable('fe_users'); } /** * Change the password for a user based on forgot password hash. */ public function updatePasswordAndInvalidateHash(string $forgotPasswordHash, string $hashedPassword): void { $queryBuilder = $this->connection->createQueryBuilder(); $currentTimestamp = $this->context->getPropertyFromAspect('date', 'timestamp'); $query = $queryBuilder ->update('fe_users') ->set('password', $hashedPassword) ->set('felogin_forgotHash', $this->connection->quote(''), false) ->set('tstamp', $currentTimestamp) ->where($queryBuilder->expr()->eq('felogin_forgotHash', $queryBuilder->createNamedParameter($forgotPasswordHash))); $query->executeStatement(); } /** * Returns true if a user exists with hash as `felogin_forgothash`, otherwise false. */ public function existsUserWithHash(string $hash): bool { $queryBuilder = $this->connection->createQueryBuilder(); $query = $queryBuilder ->count('uid') ->from('fe_users') ->where($queryBuilder->expr()->eq('felogin_forgotHash', $queryBuilder->createNamedParameter($hash))); return (bool)$query->executeQuery()->fetchOne(); } /** * Sets forgot hash for passed user uid. */ public function updateForgotHashForUserByUid(int $uid, string $hash): void { $queryBuilder = $this->connection->createQueryBuilder(); $query = $queryBuilder ->update('fe_users') ->where($queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($uid, $this->connection::PARAM_INT))) ->set('felogin_forgotHash', $hash); $query->executeStatement(); } /** * Fetches an array with all columns (except the password) from the fe_users table for the given username or * email on the given pages. Returns null, if user was not found or if user has no email address set. */ public function findUserByUsernameOrEmailOnPages(string $usernameOrEmail, array $pages = []): ?array { if ($usernameOrEmail === '') { return null; } $queryBuilder = $this->connection->createQueryBuilder(); $query = $queryBuilder ->select('*') ->from('fe_users') ->where( $queryBuilder->expr()->or( $queryBuilder->expr()->eq('username', $queryBuilder->createNamedParameter($usernameOrEmail)), $queryBuilder->expr()->eq('email', $queryBuilder->createNamedParameter($usernameOrEmail)), ), $queryBuilder->expr()->neq('email', $this->connection->quote('')), ); if (!empty($pages)) { // respect storage pid $query->andWhere($queryBuilder->expr()->in('pid', $pages)); } $result = $query->executeQuery()->fetchAssociative() ?: null; if ($result) { unset($result['password']); } return $result; } public function findOneByForgotPasswordHash(string $hash): ?array { if ($hash === '') { return null; } $queryBuilder = $this->connection->createQueryBuilder(); $query = $queryBuilder ->select('*') ->from('fe_users') ->where($queryBuilder->expr()->eq('felogin_forgotHash', $queryBuilder->createNamedParameter($hash))) ->setMaxResults(1); $row = $query->executeQuery()->fetchAssociative(); return is_array($row) ? $row : null; } public function findRedirectIdPageByUserId(int $uid): ?int { $queryBuilder = $this->connection->createQueryBuilder(); $queryBuilder->getRestrictions()->removeAll(); $query = $queryBuilder ->select('felogin_redirectPid') ->from('fe_users') ->where( $queryBuilder->expr()->neq('felogin_redirectPid', $this->connection->quote('')), $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($uid, Connection::PARAM_INT)) ) ->setMaxResults(1); $column = $query->executeQuery()->fetchOne(); return $column === false ? null : (int)$column; } }