HEX
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.4.30
System: Linux iZj6c1151k3ad370bosnmsZ 3.10.0-1160.76.1.el7.x86_64 #1 SMP Wed Aug 10 16:21:17 UTC 2022 x86_64
User: root (0)
PHP: 7.4.30
Disabled: NONE
Upload Files
File: /var/www/html/phpmyfaq/src/phpMyFAQ/Helper/RegistrationHelper.php
<?php

/**
 * Helper class for registrations
 * This Source Code Form is subject to the terms of the Mozilla Public License,
 * v. 2.0. If a copy of the MPL was not distributed with this file, You can
 * obtain one at http://mozilla.org/MPL/2.0/.
 *
 * @package   phpMyFAQ
 * @author    Thorsten Rinne <thorsten@phpmyfaq.de>
 * @author    Anatoliy Belsky <anatoliy.belsky@mayflower.de>
 * @copyright 2020-2022 phpMyFAQ Team
 * @license   http://www.mozilla.org/MPL/2.0/ Mozilla Public License Version 2.0
 * @link      https://www.phpmyfaq.de
 * @since     2020-10-28
 */

namespace phpMyFAQ\Helper;

use phpMyFAQ\Configuration;
use phpMyFAQ\Helper;
use phpMyFAQ\Mail;
use phpMyFAQ\Strings;
use phpMyFAQ\User;
use phpMyFAQ\Utils;

/**
 * Class RegistrationHelper
 *
 * @package phpMyFAQ\Helper
 */
class RegistrationHelper extends Helper
{
    /**
     * RegistrationHelper constructor.
     *
     * @param Configuration $config
     */
    public function __construct(Configuration $config)
    {
        $this->config = $config;

        $this->getTranslations();
    }

    /**
     * Creates a new user account, sends mail and returns success or
     * error message as array.
     * The password will be automatically generated and sent by email
     * as soon if admin switch user to "active"
     *
     * @param string $userName
     * @param string $fullName
     * @param string $email
     * @param bool   $isVisible
     * @return array|string[]
     */
    public function createUser(string $userName, string $fullName, string $email, bool $isVisible): array
    {
        $user = new User($this->config);

        if (!$user->createUser($userName, '')) {
            return [
                'registered' => false,
                'error' => $user->error()
            ];
        } else {
            $user->userdata->set(
                ['display_name', 'email', 'is_visible'],
                [$fullName, $email, $isVisible === 'on' ? 1 : 0]
            );
            $user->setStatus('blocked');

            if (!$this->config->get('spam.manualActivation')) {
                $isNowActive = $user->activateUser();
            } else {
                $isNowActive = false;
            }

            if ($isNowActive) {
                // @todo add translation strings
                $adminMessage = 'This user has been automatically activated, you can still' .
                    ' modify the users permissions or decline membership by visiting the admin section';
            } else {
                $adminMessage = 'To activate this user please use';
            }

            $text = sprintf(
                "New user has been registered:\n\nName: %s\nLogin name: %s\n\n" . '%s the administration at %s.',
                $fullName,
                $userName,
                $adminMessage,
                $this->config->getDefaultUrl()
            );

            $mailer = new Mail($this->config);
            $mailer->setReplyTo($email, $fullName);
            $mailer->addTo($this->config->getAdminEmail());
            $mailer->subject = Utils::resolveMarkers($this->translation['emailRegSubject'], $this->config);
            $mailer->message = $text;
            $mailer->send();
            unset($mailer);

            return [
                'registered' => true,
                'success' => trim($this->translation['successMessage']) . ' ' .
                    trim($this->translation['msgRegThankYou']),
            ];
        }
    }

    /**
     * Returns true, if hostname of the given email address is whitelisted,
     * otherwise false.
     *
     * @param string $email
     * @return bool
     */
    public function isDomainWhitelisted(string $email): bool
    {
        $whitelistedDomains = $this->config->get('security.domainWhiteListForRegistrations');

        if (Strings::strlen($whitelistedDomains) === 0) {
            return true;
        }

        $whitelistedDomainList = explode(',', $whitelistedDomains);
        $hostnameToCheck = trim(substr(strstr($email, '@'), 1));

        foreach ($whitelistedDomainList as $hostname) {
            if ($hostnameToCheck === trim($hostname)) {
                return true;
            }
        }

        return false;
    }
}