Вход Регистрация
Файл: contao-3.5.8/system/modules/core/forms/FormCaptcha.php
Строк: 151
<?php

/**
 * Contao Open Source CMS
 *
 * Copyright (c) 2005-2016 Leo Feyer
 *
 * @license LGPL-3.0+
 */

namespace Contao;


/**
 * Class FormCaptcha
 *
 * @property string $name
 * @property string $question
 * @property string $placeholder
 * @property string $rowClass
 *
 * @author Leo Feyer <https://github.com/leofeyer>
 */
class FormCaptcha extends Widget
{

    
/**
     * Template
     *
     * @var string
     */
    
protected $strTemplate 'form_captcha';

    
/**
     * Captcha key
     *
     * @var string
     */
    
protected $strCaptchaKey;

    
/**
     * Security questions
     *
     * @var string
     */
    
protected $strQuestion;

    
/**
     * The CSS class prefix
     *
     * @var string
     */
    
protected $strPrefix 'widget widget-captcha mandatory';


    
/**
     * Initialize the object
     *
     * @param array $arrAttributes An optional attributes array
     */
    
public function __construct($arrAttributes=null)
    {
        
parent::__construct($arrAttributes);

        
$this->arrAttributes['maxlength'] = 2;
        
$this->strCaptchaKey 'c' md5(uniqid(mt_rand(), true));
        
$this->arrAttributes['required'] = true;
        
$this->arrConfiguration['mandatory'] = true;
    }


    
/**
     * Add specific attributes
     *
     * @param string $strKey   The attribute name
     * @param mixed  $varValue The attribute value
     */
    
public function __set($strKey$varValue)
    {
        switch (
$strKey)
        {
            case 
'placeholder':
                
$this->arrAttributes['placeholder'] = $varValue;
                break;

            case 
'required':
            case 
'mandatory':
            case 
'minlength':
            case 
'maxlength':
                
// Ignore
                
break;

            default:
                
parent::__set($strKey$varValue);
                break;
        }
    }


    
/**
     * Return a parameter
     *
     * @param string $strKey The parameter key
     *
     * @return mixed The parameter value
     */
    
public function __get($strKey)
    {
        switch (
$strKey)
        {
            case 
'name':
                return 
$this->strCaptchaKey;
                break;

            case 
'question':
                return 
$this->strQuestion;
                break;

            default:
                return 
parent::__get($strKey);
                break;
        }
    }


    
/**
     * Validate the input and set the value
     */
    
public function validate()
    {
        
$arrCaptcha $this->Session->get('captcha_' $this->strId);

        if (!
is_array($arrCaptcha) || !strlen($arrCaptcha['key']) || !strlen($arrCaptcha['sum']) || Input::post($arrCaptcha['key']) != $arrCaptcha['sum'] || $arrCaptcha['time'] > (time() - 3))
        {
            
$this->class 'error';
            
$this->addError($GLOBALS['TL_LANG']['ERR']['captcha']);
        }

        
$this->Session->set('captcha_' $this->strId'');
    }


    
/**
     * Generate the captcha question
     *
     * @return string The question string
     */
    
protected function getQuestion()
    {
        
$int1 rand(19);
        
$int2 rand(19);

        
$question $GLOBALS['TL_LANG']['SEC']['question' rand(13)];
        
$question sprintf($question$int1$int2);

        
$this->Session->set('captcha_' $this->strId, array
        (
            
'sum' => $int1 $int2,
            
'key' => $this->strCaptchaKey,
            
'time' => time()
        ));

        
$strEncoded '';
        
$arrCharacters utf8_str_split($question);

        foreach (
$arrCharacters as $strCharacter)
        {
            
$strEncoded .= sprintf('&#%s;'utf8_ord($strCharacter));
        }

        return 
$strEncoded;
    }


    
/**
     * Generate the label and return it as string
     *
     * @return string The label markup
     */
    
public function generateLabel()
    {
        if (
$this->strLabel == '')
        {
            return 
'';
        }

        return 
sprintf('<label for="ctrl_%s" class="mandatory%s"><span class="invisible">%s </span>%s<span class="mandatory">*</span><span class="invisible"> %s</span></label>',
                        
$this->strId,
                        ((
$this->strClass != '') ? ' ' $this->strClass ''),
                        
$GLOBALS['TL_LANG']['MSC']['mandatory'],
                        
$this->strLabel,
                        
$this->getQuestion());
    }


    
/**
     * Generate the widget and return it as string
     *
     * @return string The widget markup
     */
    
public function generate()
    {
        return 
sprintf('<input type="text" name="%s" id="ctrl_%s" class="captcha mandatory%s" value=""%s%s',
                        
$this->strCaptchaKey,
                        
$this->strId,
                        ((
$this->strClass != '') ? ' ' $this->strClass ''),
                        
$this->getAttributes(),
                        
$this->strTagEnding) . $this->addSubmit();
    }


    
/**
     * Return the captcha question as string
     *
     * @return string The question markup
     */
    
public function generateQuestion()
    {
        return 
sprintf('<span class="captcha_text%s">%s</span>',
                        ((
$this->strClass != '') ? ' ' $this->strClass ''),
                        
$this->getQuestion());
    }
}
Онлайн: 0
Реклама