<?php
// локальная страница проверки через click
ignore_user_abort(true);
header('Content-Type: text/html; charset=UTF-8');
header('Expires: Thu, 18 Aug 1994 05:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: *');
header('X-Robots-Tag: noindex');

require_once(__DIR__.'/data/conf.php');
@include(__DIR__.'/data/subsalt.php');
$ab_config['salt'] = $ab_config['subsalt'].$ab_config['salt'];

require_once(__DIR__.'/code/func.php');

if ($ab_config['input_button'] == 1) die('{"error": "Input Button Disabled"}');
if ($_SERVER['REQUEST_METHOD'] != 'POST') {die('{"error": "Error NoPost"}');}

if (!function_exists('imagecreatetruecolor') AND $ab_config['buttons'] == 1) {
$ab_config['buttons'] = 0;
} elseif (!function_exists('imagecreatetruecolor') AND $ab_config['buttons'] == 2) {
$ab_config['buttons'] = 0;
}

// коннект к базе:
$antibot_db = new SQLite3(__DIR__.'/data/sqlite.db'); 
$antibot_db->busyTimeout(1500);
$antibot_db->exec("PRAGMA journal_mode = WAL;");

$ab_config['time'] = time();
$ab_config['useragent'] = isset($_SERVER['HTTP_USER_AGENT']) ? trim(strip_tags($_SERVER['HTTP_USER_AGENT'])) : '';
$_POST['ip'] = isset($_POST['ip']) ? trim(preg_replace("/[^0-9a-zA-Z\.\:]/","", $_POST['ip'])) : die('{"error": "IP not set"}');
$_POST['xxx'] = isset($_POST['xxx']) ? trim(strip_tags($_POST['xxx'])) : die('{"error": "XXX not set"}');
$_POST['date'] = isset($_POST['date']) ? (int)trim(strip_tags($_POST['date'])) : die('{"error": "DATE not set"}');
$_POST['cid'] = isset($_POST['cid']) ? trim(preg_replace("/[^0-9\.]/","", $_POST['cid'])) : die('{"error": "CID not set"}');
$_POST['country'] = isset($_POST['country']) ? trim(preg_replace("/[^A-Z]/","", $_POST['country'])) : 'XX';

$referer = isset($_SERVER['HTTP_REFERER']) ? strip_tags(trim($_SERVER['HTTP_REFERER'])) : '';
if ($referer == '') {die('{"error": "Referer not set"}');}
// домен (host) с которого вызвали скрипт:
$refhost = parse_url($referer, PHP_URL_HOST);


if ($ab_config['time'] - $_POST['date'] > 600) die('{"cookie":"000"}');

if ($ab_config['buttons'] == 1 OR $ab_config['buttons'] == 2) {
$xxx2 = explode('|', $_POST['xxx']);
if (!isset($xxx2[1])) die('{"error": "Error NoPost 1"}');
$_POST['color'] = $xxx2[0];
$_POST['color_hash'] = $xxx2[1];

if ($_POST['color_hash'] != hash('sha256', $ab_config['salt'].$_POST['color'].$_POST['date'].$ab_config['pass'].$_POST['ip'])) {
// не прошли цветные/картиночные кнопки, не даем пройти антибота:
// добавление ip в черный список:
if ($ab_config['time_ban'] > 0) {
// проверка валидности ip:
if (filter_var($_POST['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
$ab_config['ipv'] = 4;
} elseif (filter_var($_POST['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
$ab_config['ipv'] = 6;
} else {
die('{"error": "Bad IP"}');
}

// перевод времени в минуты:
$ab_config['time_ban'] = explode('.', $ab_config['time_ban']);
if (isset($ab_config['time_ban'][1])) {
// есть минуты
$ab_config['time_ban'] = $ab_config['time_ban'][0]*60+$ab_config['time_ban'][1]; // итого в минутах
} else {
// только часы
$ab_config['time_ban'] = $ab_config['time_ban'][0]*60; // итого в минутах
}
// время для бана теперь в минутах.
$sql = 'INSERT INTO ipv'.$ab_config['ipv'].'rules (priority, search, ip1, ip2, rule, comment, expires) VALUES (\'1\', \''.$_POST['ip'].'\', \''.AbIp2num($_POST['ip']).'\', \''.AbIp2num($_POST['ip']).'\', \'block\', \'Wrong Click '.$_POST['country'].'\', \''.($ab_config['time_ban']*60+$ab_config['time']).'\');';
$add = @$antibot_db->exec($sql);
if ($antibot_db->lastErrorMsg() == 'database is locked') {
file_put_contents(__DIR__.'/data/sqlerrorlog/'.date("YmdH", $ab_config['time']).floor(date("i")/10).'.txt', $sql."\n", FILE_APPEND | LOCK_EX);
}
}


// обновление лога miss:
$ok = 1;
if ($ab_config['antibot_log_tests'] == 1) {
$sql = 'UPDATE hits SET passed=\'8\' WHERE passed=\'0\' AND cid=\''.$_POST['cid'].'\';';
$update = @$antibot_db->exec($sql);
if ($antibot_db->lastErrorMsg() == 'database is locked') {
file_put_contents(__DIR__.'/data/sqlerrorlog/'.date("YmdH", $ab_config['time']).floor(date("i")/10).'.txt', $sql."\n", FILE_APPEND | LOCK_EX);
}
if ($antibot_db->changes() != 1) {
$ok = 0;
}
}
// счетчик прошедших заглушку по клику:
if ($ok == 1) {
file_put_contents(__DIR__.'/data/counters/miss_'.date('Ymd', $ab_config['time']), '1', FILE_APPEND | LOCK_EX);
}

die('{"error": "Wrong Click"}');
}
} elseif ($ab_config['buttons'] == 0) {
// единственная кнопка
}

$hash = md5($ab_config['pass'].$refhost.$ab_config['useragent'].$_POST['ip'].$_POST['date']); // код для куки

// обновление лога о проходе заглушки:
$ok = 1;
if ($ab_config['antibot_log_tests'] == 1) {
$sql = 'UPDATE hits SET passed=\'2\' WHERE passed=\'0\' AND cid=\''.$_POST['cid'].'\';';
$update = @$antibot_db->exec($sql);
if ($antibot_db->lastErrorMsg() == 'database is locked') {
file_put_contents(__DIR__.'/data/sqlerrorlog/'.date("YmdH", $ab_config['time']).floor(date("i")/10).'.txt', $sql."\n", FILE_APPEND | LOCK_EX);
}
if ($antibot_db->changes() != 1) {
$ok = 0;
}
}
// счетчик прошедших заглушку по клику:
if ($ok == 1) {
file_put_contents(__DIR__.'/data/counters/click_'.date('Ymd', $ab_config['time']), '1', FILE_APPEND | LOCK_EX);
}

echo '{"cookie":"'.$hash.'"}';
