Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Captcha/SolveMedia.php
<?php

namespace XF\Captcha;

use
XF\Template\Templater;

class
SolveMedia extends AbstractCaptcha
{
   
/**
     * Challenge key
     *
     * @var null|string
     */
   
protected $cKey = null;

   
/**
     * Verification key
     *
     * @var null|string
     */
   
protected $vKey = null;

    public function
__construct(\XF\App $app)
    {
       
parent::__construct($app);
       
$extraKeys = $app->options()->extraCaptchaKeys;
        if (!empty(
$extraKeys['solveMediaCKey']) && !empty($extraKeys['solveMediaVKey']))
        {
           
$this->cKey = $extraKeys['solveMediaCKey'];
           
$this->vKey = $extraKeys['solveMediaVKey'];
        }
    }

    public function
renderInternal(Templater $templater)
    {
        if (!
$this->cKey)
        {
            return
'';
        }

        return
$templater->renderTemplate('public:captcha_solve_media', [
           
'cKey' => $this->cKey
       
]);
    }

    public function
isValid()
    {
        if (!
$this->cKey || !$this->vKey)
        {
            return
true; // if not configured, always pass
       
}

       
$request = $this->app->request();

       
$challenge = substr($request->filter('adcopy_challenge', 'str'), 0, 2000);
       
$captchaResponse = substr($request->filter('adcopy_response', 'str'), 0, 2000);
        if (!
$challenge || !$captchaResponse)
        {
            return
false;
        }

        try
        {
           
$client = $this->app->http()->client();

           
$params = [
               
'form_params' => [
                   
'privatekey' => $this->vKey,
                   
'challenge' => $challenge,
                   
'response' => $captchaResponse,
                   
'remoteip' => $request->getIp()
                ]
            ];
           
$response = $client->post('http://verify.solvemedia.com/papi/verify', $params);
           
$contents = trim($response->getBody()->getContents());
           
$parts = explode("\n", $contents);
           
$result = trim($parts[0]);
           
$error = isset($parts[1]) ? trim($parts[1]) : null;

           
$this->setResponse($parts);

            if (
$result == 'true')
            {
                return
true;
            }

            switch (
$error)
            {
                case
'wrong answer':
                case
'invalid remoteip':
                   
// generally end user mistakes
                   
return false;

                case
'invalid challenge':
                   
// actually indicates the challenge key has been tampered with
                    // these should definitely not pass
                   
return false;

                default:
                   
// this is likely a configuration error, log and let it through
                   
$this->app->error()->logError("Solve Media CAPTCHA error: $error");
                    return
true;
            }
        }
        catch(\
GuzzleHttp\Exception\RequestException $e)
        {
           
// this is an exception with the underlying request, so let it go through
           
\XF::logException($e, false, 'Solve Media connection error: ');
            return
true;
        }
    }
}