2021-07-10 19:18:17 +01:00
|
|
|
<?php
|
2021-07-17 18:29:36 -04:00
|
|
|
|
|
|
|
use JetBrains\PhpStorm\ArrayShape;
|
|
|
|
|
|
|
|
#[ArrayShape(['code' => "mixed|string", 'image_src' => "string"])]
|
|
|
|
function captcha($color, $mode, $mul, $allowed) : array {
|
2022-07-30 17:55:17 -04:00
|
|
|
$bg_path = __DIR__ . '/../public/assets/img/captcha/';
|
|
|
|
$font_path = __DIR__ . '/../public/assets/fonts/';
|
2021-07-12 09:03:02 -04:00
|
|
|
|
2021-07-10 19:18:17 +01:00
|
|
|
if ($mul == "on") {
|
|
|
|
$captcha_config = array(
|
|
|
|
'code' => '',
|
|
|
|
'min_length' => 5,
|
2021-07-15 21:20:27 +01:00
|
|
|
'max_length' => 6,
|
2021-07-10 19:18:17 +01:00
|
|
|
'backgrounds' => array(
|
|
|
|
$bg_path . 'text3.png',
|
|
|
|
$bg_path . 'text2.png',
|
|
|
|
$bg_path . 'text1.png'
|
|
|
|
),
|
|
|
|
'fonts' => array(
|
2021-07-15 21:20:27 +01:00
|
|
|
$font_path . 'LMS Pretty Pony.ttf',
|
|
|
|
$font_path . 'PonyvilleMedium0.4.ttf',
|
|
|
|
$font_path . 'PonyvilleMedium0.4.ttf'
|
2021-07-10 19:18:17 +01:00
|
|
|
),
|
|
|
|
'characters' => $allowed,
|
2021-07-15 21:20:27 +01:00
|
|
|
'min_font_size' => 20,
|
2021-07-10 19:18:17 +01:00
|
|
|
'max_font_size' => 28,
|
|
|
|
'color' => $color,
|
|
|
|
'angle_min' => 0,
|
2021-07-15 21:20:27 +01:00
|
|
|
'angle_max' => 5,
|
2021-07-10 19:18:17 +01:00
|
|
|
'shadow' => true,
|
|
|
|
'shadow_color' => '#fff',
|
2021-07-15 21:20:27 +01:00
|
|
|
'shadow_offset_x' => -2,
|
|
|
|
'shadow_offset_y' => 4
|
2021-07-10 19:18:17 +01:00
|
|
|
);
|
|
|
|
} else {
|
|
|
|
$captcha_config = array(
|
|
|
|
'code' => '',
|
|
|
|
'min_length' => 5,
|
|
|
|
'max_length' => 5,
|
|
|
|
'backgrounds' => array(
|
|
|
|
$bg_path . 'text2.png'
|
|
|
|
),
|
|
|
|
'fonts' => array(
|
|
|
|
$font_path . 'times_new_yorker.ttf'
|
|
|
|
),
|
|
|
|
'characters' => $allowed,
|
|
|
|
'min_font_size' => 28,
|
|
|
|
'max_font_size' => 28,
|
|
|
|
'color' => $color,
|
|
|
|
'angle_min' => 0,
|
|
|
|
'angle_max' => 10,
|
|
|
|
'shadow' => true,
|
|
|
|
'shadow_color' => '#fff',
|
|
|
|
'shadow_offset_x' => -1,
|
|
|
|
'shadow_offset_y' => 1
|
|
|
|
);
|
|
|
|
}
|
2021-07-12 09:03:02 -04:00
|
|
|
|
2021-07-10 19:18:17 +01:00
|
|
|
// Overwrite defaults with custom config values
|
2021-07-14 18:02:39 -04:00
|
|
|
if (!empty($config) && is_array($config)) {
|
2021-07-10 19:18:17 +01:00
|
|
|
foreach ($config as $key => $value)
|
|
|
|
$captcha_config[$key] = $value;
|
|
|
|
}
|
2021-07-12 09:03:02 -04:00
|
|
|
|
2021-07-10 19:18:17 +01:00
|
|
|
// Restrict certain values
|
|
|
|
if ($captcha_config['min_length'] < 1)
|
|
|
|
$captcha_config['min_length'] = 1;
|
|
|
|
if ($captcha_config['angle_min'] < 0)
|
|
|
|
$captcha_config['angle_min'] = 0;
|
|
|
|
if ($captcha_config['angle_max'] > 10)
|
|
|
|
$captcha_config['angle_max'] = 10;
|
|
|
|
if ($captcha_config['angle_max'] < $captcha_config['angle_min'])
|
|
|
|
$captcha_config['angle_max'] = $captcha_config['angle_min'];
|
|
|
|
if ($captcha_config['min_font_size'] < 10)
|
|
|
|
$captcha_config['min_font_size'] = 10;
|
|
|
|
if ($captcha_config['max_font_size'] < $captcha_config['min_font_size'])
|
|
|
|
$captcha_config['max_font_size'] = $captcha_config['min_font_size'];
|
2021-07-12 09:03:02 -04:00
|
|
|
|
|
|
|
|
2021-07-10 19:18:17 +01:00
|
|
|
// Generate CAPTCHA code if not set by user
|
|
|
|
if (empty($captcha_config['code'])) {
|
|
|
|
$captcha_config['code'] = '';
|
2021-07-12 09:03:02 -04:00
|
|
|
$length = rand($captcha_config['min_length'], $captcha_config['max_length']);
|
2021-07-10 19:18:17 +01:00
|
|
|
while (strlen($captcha_config['code']) < $length) {
|
|
|
|
$captcha_config['code'] .= substr($captcha_config['characters'], rand() % (strlen($captcha_config['characters'])), 1);
|
|
|
|
}
|
|
|
|
}
|
2021-07-12 09:03:02 -04:00
|
|
|
|
2021-07-10 19:18:17 +01:00
|
|
|
// Generate HTML for image src
|
2022-07-30 17:55:17 -04:00
|
|
|
$image_src = '/captcha?_CAPTCHA&_R=' . urlencode(rand());
|
2021-07-12 09:03:02 -04:00
|
|
|
|
2021-07-10 19:18:17 +01:00
|
|
|
$_SESSION['_CAPTCHA']['config'] = serialize($captcha_config);
|
2021-07-12 09:03:02 -04:00
|
|
|
|
2021-07-17 18:29:36 -04:00
|
|
|
return [
|
2021-07-10 19:18:17 +01:00
|
|
|
'code' => $captcha_config['code'],
|
|
|
|
'image_src' => $image_src
|
2021-07-17 18:29:36 -04:00
|
|
|
];
|
2021-07-10 19:18:17 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!function_exists('hex2rgb')) {
|
2021-08-22 22:05:26 -04:00
|
|
|
function hex2rgb($hex_str) : array|null {
|
2021-07-12 09:03:02 -04:00
|
|
|
$hex_str = preg_replace("/[^0-9A-Fa-f]/", '', $hex_str); // Gets a proper hex string
|
2021-08-22 21:45:26 -04:00
|
|
|
|
2021-07-10 19:18:17 +01:00
|
|
|
if (strlen($hex_str) == 6) {
|
2021-07-12 09:03:02 -04:00
|
|
|
$color_val = hexdec($hex_str);
|
2021-08-22 21:45:26 -04:00
|
|
|
return [
|
|
|
|
'r' => 0xFF & ($color_val >> 0x10),
|
|
|
|
'g' => 0xFF & ($color_val >> 0x8),
|
|
|
|
'b' => 0xFF & $color_val
|
|
|
|
];
|
2021-07-10 19:18:17 +01:00
|
|
|
} elseif (strlen($hex_str) == 3) {
|
2021-08-22 21:45:26 -04:00
|
|
|
return [
|
|
|
|
'r' => hexdec(str_repeat(substr($hex_str, 0, 1), 2)),
|
|
|
|
'g' => hexdec(str_repeat(substr($hex_str, 1, 1), 2)),
|
|
|
|
'b' => hexdec(str_repeat(substr($hex_str, 2, 1), 2))
|
|
|
|
];
|
2021-07-10 19:18:17 +01:00
|
|
|
}
|
2021-08-22 21:45:26 -04:00
|
|
|
|
|
|
|
return null;
|
2021-07-10 19:18:17 +01:00
|
|
|
}
|
|
|
|
}
|