Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 16
CRAP
0.00% covered (danger)
0.00%
0 / 144
recaptcha
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 16
1190.00
0.00% covered (danger)
0.00%
0 / 144
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 init
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 6
 is_available
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 5
 has_config
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 3
 get_name
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 3
 get_generator_class
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 3
 acp_page
0.00% covered (danger)
0.00%
0 / 1
110.00
0.00% covered (danger)
0.00%
0 / 50
 execute_demo
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 execute
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 get_template
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 22
 get_demo_template
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 3
 get_hidden_fields
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 uninstall
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 3
 install
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 3
 validate
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 recaptcha_check_answer
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 18
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
namespace phpbb\captcha\plugins;
class recaptcha extends captcha_abstract
{
    private $response;
    /**
    * Constructor
    */
    public function __construct()
    {
    }
    function init($type)
    {
        global $user, $request;
        $user->add_lang('captcha_recaptcha');
        parent::init($type);
        $this->response = $request->variable('g-recaptcha-response', '');
    }
    public function is_available()
    {
        global $config, $user;
        $user->add_lang('captcha_recaptcha');
        return (isset($config['recaptcha_pubkey']) && !empty($config['recaptcha_pubkey']));
    }
    /**
    *  API function
    */
    function has_config()
    {
        return true;
    }
    static public function get_name()
    {
        return 'CAPTCHA_RECAPTCHA';
    }
    /**
    * This function is implemented because required by the upper class, but is never used for reCaptcha.
    */
    function get_generator_class()
    {
        throw new \Exception('No generator class given.');
    }
    function acp_page($id, $module)
    {
        global $config, $template, $user, $phpbb_log, $request;
        $captcha_vars = array(
            'recaptcha_pubkey'                => 'RECAPTCHA_PUBKEY',
            'recaptcha_privkey'                => 'RECAPTCHA_PRIVKEY',
        );
        $module->tpl_name = 'captcha_recaptcha_acp';
        $module->page_title = 'ACP_VC_SETTINGS';
        $form_key = 'acp_captcha';
        add_form_key($form_key);
        $submit = $request->variable('submit', '');
        if ($submit && check_form_key($form_key))
        {
            $captcha_vars = array_keys($captcha_vars);
            foreach ($captcha_vars as $captcha_var)
            {
                $value = $request->variable($captcha_var, '');
                if ($value)
                {
                    $config->set($captcha_var, $value);
                }
            }
            $recaptcha_domain = $request->variable('recaptcha_v2_domain', '', true);
            if (in_array($recaptcha_domain, recaptcha_v3::$supported_domains))
            {
                $config->set('recaptcha_v2_domain', $recaptcha_domain);
            }
            $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CONFIG_VISUAL');
            trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($module->u_action));
        }
        else if ($submit)
        {
            trigger_error($user->lang['FORM_INVALID'] . adm_back_link($module->u_action));
        }
        else
        {
            foreach ($captcha_vars as $captcha_var => $template_var)
            {
                $var = (isset($_REQUEST[$captcha_var])) ? $request->variable($captcha_var, '') : ((isset($config[$captcha_var])) ? $config[$captcha_var] : '');
                $template->assign_var($template_var, $var);
            }
            $template->assign_vars(array(
                'CAPTCHA_PREVIEW'        => $this->get_demo_template($id),
                'CAPTCHA_NAME'            => $this->get_service_name(),
                'RECAPTCHA_V2_DOMAIN'    => $config['recaptcha_v2_domain'] ?? recaptcha_v3::GOOGLE,
                'RECAPTCHA_V2_DOMAINS'    => recaptcha_v3::$supported_domains,
                'U_ACTION'                => $module->u_action,
            ));
        }
    }
    // not needed
    function execute_demo()
    {
    }
    // not needed
    function execute()
    {
    }
    function get_template()
    {
        global $config, $user, $template, $phpbb_root_path, $phpEx;
        if ($this->is_solved())
        {
            return false;
        }
        else
        {
            $contact_link = phpbb_get_board_contact_link($config, $phpbb_root_path, $phpEx);
            $explain = $user->lang(($this->type != CONFIRM_POST) ? 'CONFIRM_EXPLAIN' : 'POST_CONFIRM_EXPLAIN', '<a href="' . $contact_link . '">', '</a>');
            $domain = $config['recaptcha_v2_domain'] ?? recaptcha_v3::GOOGLE;
            $template->assign_vars(array(
                'RECAPTCHA_SERVER'            => sprintf('//%1$s/recaptcha/api', $domain),
                'RECAPTCHA_PUBKEY'            => isset($config['recaptcha_pubkey']) ? $config['recaptcha_pubkey'] : '',
                'S_RECAPTCHA_AVAILABLE'        => self::is_available(),
                'S_CONFIRM_CODE'            => true,
                'S_TYPE'                    => $this->type,
                'L_CONFIRM_EXPLAIN'            => $explain,
            ));
            return 'captcha_recaptcha.html';
        }
    }
    function get_demo_template($id)
    {
        return $this->get_template();
    }
    function get_hidden_fields()
    {
        $hidden_fields = array();
        // this is required for posting.php - otherwise we would forget about the captcha being already solved
        if ($this->solved)
        {
            $hidden_fields['confirm_code'] = $this->code;
        }
        $hidden_fields['confirm_id'] = $this->confirm_id;
        return $hidden_fields;
    }
    function uninstall()
    {
        $this->garbage_collect(0);
    }
    function install()
    {
        return;
    }
    function validate()
    {
        if (!parent::validate())
        {
            return false;
        }
        else
        {
            return $this->recaptcha_check_answer();
        }
    }
    /**
    * Calls an HTTP POST function to verify if the user's guess was correct
    *
    * @return bool|string Returns false on success or error string on failure.
    */
    function recaptcha_check_answer()
    {
        global $config, $user;
        //discard spam submissions
        if ($this->response == null || strlen($this->response) == 0)
        {
            return $user->lang['RECAPTCHA_INCORRECT'];
        }
        $recaptcha = new \ReCaptcha\ReCaptcha($config['recaptcha_privkey']);
        $result = $recaptcha->verify($this->response, $user->ip);
        if ($result->isSuccess())
        {
            $this->solved = true;
            return false;
        }
        else
        {
            return $user->lang['RECAPTCHA_INCORRECT'];
        }
    }
}