Kaptcha::validate_kaptcha()   A
last analyzed

Complexity

Conditions 4
Paths 3

Size

Total Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 0
Metric Value
cc 4
nc 3
nop 2
dl 0
loc 11
ccs 0
cts 10
cp 0
crap 20
rs 9.9
c 0
b 0
f 0
1
<?php
2
namespace Rocket\UI\Forms\Fields;
3
4
/**
5
 * Captcha form field
6
 *
7
 * @author Stéphane Goetz
8
 */
9
10
/**
11
 * A Math Captcha Library that displays a number captcha similar to the drupal captcha.
12
 *
13
 * INSTRUCTIONS
14
 *
15
 * Place this class into you application/library directory and name it kaptcha.php
16
 *
17
 * create MY_Form_validation.php, add this code and save it in the application/libraries folder.
18
 *
19
 *   public function kaptcha($value) {
20
 *       $answer = $this->CI->input->post('kaptcha_answer');
21
 *       if ($this->CI->kaptcha->validate_kaptcha($value, $answer)) {
22
 *           return true;
23
 *       }
24
 *       return false;
25
 *   }
26
 *
27
 *
28
 * Add this to your controller form validation rules
29
 * $this->form_validation->set_rules('kaptcha', 'Math Question', 'required|is_numeric|kaptcha');
30
 *
31
 * You can either add this to your form using a single line <?php $this->kaptcha->display_kaptcha(); ?>
32
 * or call it as an array <?php $kaptcha = $this->kaptcha->create_kaptcha() ;?> which  will give you three items
33
 * First Number, Second Number and an encrypted answer which needs to be put in a hidden  input value with the
34
 * name and id set to kaptcha_answer.
35
 *
36
 * The CSS is you bit!
37
 */
38
class Kaptcha extends Field
39
{
40
    protected function getDefaults()
41
    {
42
        return parent::getDefaults() + [
43
            'kaptcha' => [
44
                'tip' => t(
45
                    'Resolvez ce calcul et entrez le resultat. Par exemple 1+3 = 4.' .
46
                    'Il s\'agit de définir que vous êtes bien humain et pour éviter les spams'
47
                ),
48
                'title' => 'Calcul : !first + !second =',
49
                'hidden_field' => 'kaptcha_answer',
50
            ],
51
        ];
52
    }
53
54
    protected $kaptcha;
55
56
    public function __construct($name, $data = [])
57
    {
58
        parent::__construct($name, $data);
59
60
        $this->kaptcha = [
61
            'first' => rand(1, 10),
62
            'second' => rand(1, 10),
63
        ];
64
65
        $this->kaptcha['answer'] = \Crypt::encrypt($this->kaptcha['first'] + $this->kaptcha['second']);
66
67
        $this->params['tip'] = $this->params['kaptcha']['tip'];
68
        $this->params['title'] = t(
69
            $this->params['kaptcha']['title'],
70
            ['!first' => $this->kaptcha['first'], '!second' => $this->kaptcha['second']]
71
        );
72
    }
73
74
    /**
75
     * Render the inner field
76
     */
77
    protected function renderInner()
78
    {
79
        parent::renderInner();
80
81
        $this->result .= "<input type=hidden name='{$this->params['kaptcha']['hidden_field']}' value='{$this->kaptcha['answer']}' />";
82
    }
83
84
    /**
85
     * Function that validates the user answer against the encrypted answer
86
     * @param  string $kaptcha
87
     * @param  string $answer
88
     * @return bool
89
     */
90
    public static function validate_kaptcha($kaptcha = null, $answer = null)
91
    {
92
        if ($kaptcha && $answer) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $kaptcha of type string|null is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
Bug Best Practice introduced by
The expression $answer of type string|null is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
93
            $value = \Crypt::decrypt($answer);
94
            if ($kaptcha == $value) {
95
                return true;
96
            }
97
        }
98
99
        return false;
100
    }
101
}
102