You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
5.6 KiB
122 lines
5.6 KiB
<?php
|
|
class AIOWPSecurity_Captcha
|
|
{
|
|
|
|
function __construct()
|
|
{
|
|
//NOP
|
|
}
|
|
|
|
function display_captcha_form()
|
|
{
|
|
global $aio_wp_security;
|
|
if($aio_wp_security->configs->get_value('aiowps_enable_bp_register_captcha') == '1' && defined('BP_VERSION')){
|
|
//if buddy press feature active add action hook so buddy press can display our errors properly on bp registration form
|
|
do_action( 'bp_aiowps-captcha-answer_errors' );
|
|
}
|
|
$cap_form = '<p class="aiowps-captcha"><label for="aiowps-captcha-answer">'.__('Please enter an answer in digits:','all-in-one-wp-security-and-firewall').'</label>';
|
|
$cap_form .= '<div class="aiowps-captcha-equation"><strong>';
|
|
$maths_question_output = $this->generate_maths_question();
|
|
$cap_form .= $maths_question_output . '</strong></div></p>';
|
|
echo $cap_form;
|
|
}
|
|
|
|
function generate_maths_question()
|
|
{
|
|
global $aio_wp_security;
|
|
//For now we will only do plus, minus, multiplication
|
|
$equation_string = '';
|
|
$operator_type = array('+', '−', '×');
|
|
|
|
$operand_display = array('word', 'number');
|
|
|
|
//let's now generate an equation
|
|
$operator = $operator_type[rand(0,2)];
|
|
|
|
if($operator === '×'){
|
|
//Don't make the question too hard if multiplication
|
|
$first_digit = rand(1,5);
|
|
$second_digit = rand(1,5);
|
|
}else{
|
|
$first_digit = rand(1,20);
|
|
$second_digit = rand(1,20);
|
|
}
|
|
|
|
if($operand_display[rand(0,1)] == 'word'){
|
|
$first_operand = $this->number_word_mapping($first_digit);
|
|
}else{
|
|
$first_operand = $first_digit;
|
|
}
|
|
|
|
if($operand_display[rand(0,1)] == 'word'){
|
|
$second_operand = $this->number_word_mapping($second_digit);
|
|
}else{
|
|
$second_operand = $second_digit;
|
|
}
|
|
|
|
//Let's caluclate the result and construct the equation string
|
|
if($operator === '+')
|
|
{
|
|
//Addition
|
|
$result = $first_digit+$second_digit;
|
|
$equation_string .= $first_operand . ' ' . $operator . ' ' . $second_operand . ' = ';
|
|
}
|
|
else if($operator === '−')
|
|
{
|
|
//Subtraction
|
|
//If we are going to be negative let's swap operands around
|
|
if($first_digit < $second_digit){
|
|
$equation_string .= $second_operand . ' ' . $operator . ' ' . $first_operand . ' = ';
|
|
$result = $second_digit-$first_digit;
|
|
}else{
|
|
$equation_string .= $first_operand . ' ' . $operator . ' ' . $second_operand . ' = ';
|
|
$result = $first_digit-$second_digit;
|
|
}
|
|
}
|
|
elseif($operator === '×')
|
|
{
|
|
//Multiplication
|
|
$equation_string .= $first_operand . ' ' . $operator . ' ' . $second_operand . ' = ';
|
|
$result = $first_digit*$second_digit;
|
|
}
|
|
|
|
//Let's encode correct answer
|
|
$captcha_secret_string = $aio_wp_security->configs->get_value('aiowps_captcha_secret_key');
|
|
$current_time = time();
|
|
$enc_result = base64_encode($current_time.$captcha_secret_string.$result);
|
|
$random_str = AIOWPSecurity_Utility::generate_alpha_numeric_random_string(10);
|
|
AIOWPSecurity_Utility::is_multisite_install() ? set_site_transient('aiowps_captcha_string_info_'.$random_str, $enc_result, 30 * 60) : set_transient('aiowps_captcha_string_info_'.$random_str, $enc_result, 30 * 60);
|
|
$equation_string .= '<input type="hidden" name="aiowps-captcha-string-info" id="aiowps-captcha-string-info" value="'.$random_str.'" />';
|
|
$equation_string .= '<input type="hidden" name="aiowps-captcha-temp-string" id="aiowps-captcha-temp-string" value="'.$current_time.'" />';
|
|
$equation_string .= '<input type="text" size="2" id="aiowps-captcha-answer" name="aiowps-captcha-answer" value="" autocomplete="off" />';
|
|
return $equation_string;
|
|
}
|
|
|
|
function number_word_mapping($num)
|
|
{
|
|
$number_map = array(
|
|
1 => __('one', 'all-in-one-wp-security-and-firewall'),
|
|
2 => __('two', 'all-in-one-wp-security-and-firewall'),
|
|
3 => __('three', 'all-in-one-wp-security-and-firewall'),
|
|
4 => __('four', 'all-in-one-wp-security-and-firewall'),
|
|
5 => __('five', 'all-in-one-wp-security-and-firewall'),
|
|
6 => __('six', 'all-in-one-wp-security-and-firewall'),
|
|
7 => __('seven', 'all-in-one-wp-security-and-firewall'),
|
|
8 => __('eight', 'all-in-one-wp-security-and-firewall'),
|
|
9 => __('nine', 'all-in-one-wp-security-and-firewall'),
|
|
10 => __('ten', 'all-in-one-wp-security-and-firewall'),
|
|
11 => __('eleven', 'all-in-one-wp-security-and-firewall'),
|
|
12 => __('twelve', 'all-in-one-wp-security-and-firewall'),
|
|
13 => __('thirteen', 'all-in-one-wp-security-and-firewall'),
|
|
14 => __('fourteen', 'all-in-one-wp-security-and-firewall'),
|
|
15 => __('fifteen', 'all-in-one-wp-security-and-firewall'),
|
|
16 => __('sixteen', 'all-in-one-wp-security-and-firewall'),
|
|
17 => __('seventeen', 'all-in-one-wp-security-and-firewall'),
|
|
18 => __('eighteen', 'all-in-one-wp-security-and-firewall'),
|
|
19 => __('nineteen', 'all-in-one-wp-security-and-firewall'),
|
|
20 => __('twenty', 'all-in-one-wp-security-and-firewall'),
|
|
);
|
|
return $number_map[$num];
|
|
}
|
|
|
|
} |