// WR-forum Lite v 2.2 UTF-8 // 07.01.2019 г. // WR-Script.ru
error_reporting (E_ALL); // ВРЕМЕННО - на время тестирования и отладки скрипта
//error_reporting(0); // РАЗКОМЕНТИРУЙТЕ для постоянной работы
@ini_set('register_globals','off');// Все скрипты написаны для этой настройки php
include "data/config.php";
// Определяем URL форума 11-11-2018 поддержка http / https
$url="http".(($_SERVER['SERVER_PORT']==443)?"s":"")."://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; $fu=explode('index.php', $url);$forum_url=$fu[0];
if (isset($_GET['new-tema'])) { header("HTTP/1.1 404 Moved Permanently"); header("Location: $forum_url");} // 11-11-2018
$navigate=FALSE; // TRUE; // Включить/выключить показа блока НАВИГАЦИЯ по темам. Лучше выключить для мобильных
function replacer ($text) { // ФУНКЦИЯ очистки кода
$text=str_replace(" ",' ',$text);
$text=str_replace(">",'>',$text);
$text=str_replace("<",'<',$text);
$text=str_replace("\"",'"',$text);
$text=preg_replace("/\n\n/",' [br] ',$text);
$text=preg_replace("/\n/",' [br] ',$text);
$text=preg_replace("/\\\$/",'$',$text);
$text=preg_replace("/\r/",'',$text);
$text=preg_replace("/\\\/",'\',$text);
// если magic_quotes включена - чистим везде СЛЭШи в этих случаях: одиночные (') и двойные кавычки ("), обратный слеш (\)
if (get_magic_quotes_gpc()) { $text=str_replace("\"",'"',$text); $text=str_replace("\'",'\'',$text); $text=str_replace("\\",'\',$text); }
$text=str_replace("\r\n",' [br] ',$text);
$text=str_replace("\n\n",' [br][br] ',$text);
$text=str_replace("\n",' [br] ',$text);
$text=str_replace("\t",'',$text);
$text=str_replace("\r",'',$text);
$text=str_replace(' ',' ',$text);
return $text; }
// Функция содержит ПРОДОЛЖЕНИЕ ШАПКИ. Вызывается: addtop();
function addtop() { global $wrfname,$forum_skin,$date,$time;
// ищем КУКи и выводим ИМЯ
if (isset($_COOKIE['wrfcookies'])) {$wrfc=$_COOKIE['wrfcookies']; $wrfc=replacer($wrfc); $wrfc=explode("|", $wrfc); $wrfname=$wrfc[0];} else {unset($wrfname); unset($wrfpass); $wrfpass="";}
echo'
';
if (isset($wrfname)) {print "Ваш профильВыход [$wrfname]";
$name=strtolower($wrfname);
}
if (!isset($_COOKIE['wrfcookies']) and !isset($_GET['id'])) {print "Регистрация Вход
";}
if (is_file("data/tiptop.html")) include("data/tiptop.html"); // подключаем дополнение к ВЕРХУШКе
print"Сегодня: $date - $time";
return true;}
function nospam() { global $max_key,$rand_key,$antispam2012,$antispam2012v; // Функция АНТИСПАМ (2 в одном)
if (array_key_exists("image", $_REQUEST)) { $num=replacer($_REQUEST["image"]);
for ($i=0; $i<10; $i++) {if (md5("$i+$rand_key")==$num) {imgwr($st,$i); die();}} }
$xkey=""; mt_srand(time()+(double)microtime()*1000000);
$dopkod=mktime(0,0,0,date("m"),date("d"),date("Y")); // доп.код: меняется каждые 24 часа
$stime=md5("$dopkod+$rand_key");// доп.код
echo'
Защитный код:
';
$nummax=0; for ($i=0; $i<=$max_key; $i++) {
$snum[$i]=mt_rand(0,9); $psnum=md5($snum[$i]+$rand_key+$dopkod);
$secret=mt_rand(0,1); $styles='bgcolor=#FFFFCE';
if ($nummax<3) { if ($secret==1 or $i==0) {$styles='bgcolor=#93C9FF'; $xkey=$xkey.$snum[$i]; $nummax++;}}
echo "
\n
\r\n";}
$xkey=md5("$xkey+$rand_key+$dopkod"); //число + ключ из data/config.php + код меняющийся кажые 24 часа
print"
(введите цифры, которые на синем фоне)
";
if ($antispam2012==TRUE) print"Ответ на вопрос: ($antispam2012v)";
return; }
function addmsg($qm) { // ФУНКЦИЯ добавления темы/сообщения
global $wrfname,$maxname,$can_up_file,$antispam,$max_key,$rand_key,$max_upfile_size,$showsmiles,$smiles,$valid_types,$datadir;
//Проверка ЗАПРЕТА IP-пользователя на добавление объявлений (файл ipblock.dat)
$ip=$_SERVER['REMOTE_ADDR']; // определяем IP юзера
if (is_file("$datadir/ipblock.dat")) { $lines=file("$datadir/ipblock.dat"); $i=count($lines);
$tektime=time();
if ($i>0) {do {$i--; $idt=explode("|",$lines[$i]);
if ($idt[2]==$ip and $tektime<$idt[1]) { $date=date("d.m.Y");
$idt[0]=date("d.m.Y в H:i",$idt[0]);
$idt[1]=date("d.m.Y в H:i",$idt[1]);
exit("
Администратор $idt[0] заблокировал для Вашего IP: $ip возможность добавлять что-либо по следующей
причине:
$idt[4].
До $idt[1] Вам разрешено просматривать сообщения, а вот ДОБАВЛЯТЬ ТЕМЫ/СООБЩЕНИЯ категорически ЗАПРЕЩЕНО!
* При вставке видео с Ютубе нужно указывать только 'хвостик', например: BoUUbs3CvHs
";
if ($antispam==TRUE and !isset($wrfname)) nospam(); // АНТИСПАМ !
echo'
';
return;} // КОНЕЦ функции-формы ДОБАВЛЕНИЯ ТЕМЫ/ОТВЕТА
// Выбран ВЫХОД из форума - очищаем куки
if(isset($_GET['event'])) {if ($_GET['event']=="clearcooke") {setcookie("wrfcookies","",time()); Header("Location: $forum_url"); exit;}}
// ДОБАВЛЕНИЕ ТЕМЫ или ОТВЕТА
if(isset($_GET['add_tema']) or isset($_GET['add_msg'])) {
if (isset($_GET['add_tema'])) {$add_tema=TRUE; $add_msg=FALSE;} // Если добавляем ТЕМУ
if (isset($_GET['add_msg'])) {$add_msg=TRUE; $add_tema=FALSE;} // Если добавляем СООБЩЕНИЕ
if ($forum_lock==TRUE) exit("Временно добавление тем и сообщений приостановлено!");
// ПОЛУЧАЕМ ДАННЫЕ ИЗ ФОРМЫ
if (isset($_POST['who'])) $who=$_POST['who']; else $who="";
if (isset($_POST['email'])) $email=$_POST['email']; else $email="";
if (isset($_POST['page'])) $page=$_POST['page']; else $page="";
if (isset($_POST['maxzd'])) $maxzd=$_POST['maxzd']; else $maxzd="0"; if ($maxzd==null) $maxzd="0";
if ((!ctype_digit($maxzd)) or (strlen($maxzd)>2)) exit("$back. Попытка взлома по звёздам или ошибка в файле статистики");
if (isset($_POST['name'])) $name=$_POST['name']; else $name=""; $name=trim($name);
if (isset($_POST['msg'])) $msg=$_POST['msg']; else $msg="";
if (isset($_POST['zag'])) $zag=$_POST['zag']; else $zag="";
if (isset($_GET['id'])) {$fid=$_GET['id']; $id=$fid;} else {$fid=""; $id="";}
if (strlen($fid)>3) $fid=substr($fid,0,3); if (strlen($id)==7) $id=substr($id,3,4);
if (!ctype_digit($fid) or strlen($fid)!=3 or !is_file("$datadir/$fid.dat")) exit("$back. Попытка взлома через номер рубрики. Рубрика отсутствует. Номер должен содержать только 3 цифры!");
//Проверка ЗАПРЕТА ПО IP на добавление тем/сообщений
$ip=$_SERVER['REMOTE_ADDR']; $tektime=time(); $pageadd="";
if (is_file("$datadir/ipblock.dat")) { $lines=file("$datadir/ipblock.dat"); $i=count($lines);
if ($i>0) {do {$i--; $idt=explode("|",$lines[$i]);
if ($idt[2]==$ip and $tektime<$idt[1]) exit("
Админитратор заблокировал для Вашего IP: $ip возможность добавлять что-либо по следующей причине:
$idt[4].
Вам разрешено просматривать сообщения, а вот ДОБАВЛЯТЬ ТЕМЫ/СООБЩЕНИЯ категорически ЗАПРЕЩЕНО!
");
} while($i>"1");} unset($lines);}
if ($nosssilki==TRUE and $add_msg==TRUE and preg_match("/href|http|https|www|\.ru|\.com|\.net|\.info|\.org/i",$msg) and preg_match("/\.jpg|\.gif|\.jpeg|\.png/is",$msg)<>TRUE and !isset($wrfname))
exit("
Уважаемый гость с IP $ip , если Вы хотите делиться ссылками с другими пользователями форума - пройдите регистрацию. Если Вы спаммер - выйдете вон!
");
// проходим по всем разделам и форумам и ищем запращиваемый. Если wrforum.dat пуст, то подключаем резервную копию.
$realbase=TRUE; if (is_file("$datadir/wrforum.dat")) $mainlines=file("$datadir/wrforum.dat");
if (!isset($mainlines)) $datasize=0; else $datasize=sizeof($mainlines);
if ($datasize<=0) {if (is_file("$datadir/wrf-copy.dat")) {$realbase=FALSE; $mainlines=file("$datadir/wrf-copy.dat"); $datasize=sizeof($mainlines);}}
if ($datasize<=0) exit("$back. Проблемы с Базой данных, файл данных пуст - обратитесь к администратору");
$realfid=FALSE; $fotodetali=""; $i=count($mainlines);
$lines_tema=file("$datadir/$fid.dat"); $itogotem=count($lines_tema); $j=$itogotem;
do {$i--; $dt=explode("|",$mainlines[$i]);
if ($dt[2]==$fid) { $realfid=$i+1; $i=0;
if ($dt[3]==TRUE) exit("$back. Данной ветки форума не существует (есть только раздел с таким именем!)"); // присваиваем $realfid - № п/п строки
if ($itogotem>=$dt[8]) exit("$back. Превышено ограничение на кол-во допустимых тем в данной рубрике! Не более $dt[8] тем!");
}
} while($i>0);
if ($realfid==FALSE) exit("$back. Ошибка с номером рубрики. Рубрика отсутствует в базе!");
$realfid--;
// проверка Логина/Пароля юзера. Может он хакер, тогда облом ему
// ШАГ 1
if (isset($_POST['userpass'])) $userpass=replacer($_POST['userpass']); else $userpass=""; $realname="";
if (isset($_COOKIE['wrfcookies'])) {
$wrfc=$_COOKIE['wrfcookies']; $wrfc=htmlspecialchars($wrfc,ENT_COMPAT,"UTF-8"); $wrfc=stripslashes($wrfc);
$wrfc=explode("|", $wrfc); $wrfname=$wrfc[0]; $wrfpass=$wrfc[1];
} else {$who="0"; $wrfname=null; $wrfpass=null;}
// ШАГ 2
$rn_user=FALSE; if ($who==TRUE) { $who=0;
if ($wrfname!=null & $wrfpass!=null) {
$lines=file("$datadir/user.php"); $i=count($lines);
do {$i--; $rdt=explode("|", $lines[$i]);
if (strlen($rdt[3])>1) { $realname=strtolower($rdt[2]);
if (strtolower($wrfname)===$realname & $wrfpass===$rdt[3] & $userpass===$rdt[3])
{$rn_user=$rdt[0]; $name=$wrfname; $who="1";} }
} while($i > "1");
if ($rn_user==FALSE) {setcookie("wrfcookies","",time()); exit("Ошибка при работе с КУКИ!
Вы не сможете оставить сообщение, попробуйте подать его как гость. Ваш логин и пароль не найдены
в базе данных, попробуйте зайти на форум вновь. Если ошибка повторяется - обратитесь к администратору форума.");}
}}
if ($antispam==TRUE and !isset($wrfname)) { //--А-Н-Т-И-С-П-А-М--проверка кода--
if (!isset($_POST['usernum']) or !isset($_POST['xkey']) or !isset($_POST['stime']) ) exit("данные из формы не поступили!");
$usernum=replacer($_POST['usernum']); $xkey=replacer($_POST['xkey']); $stime=replacer($_POST['stime']);
$dopkod=mktime(0,0,0,date("m"),date("d"),date("Y")); // доп.код. Меняется каждые 24 часа
$usertime=md5("$dopkod+$rand_key"); $userkey=md5("$usernum+$rand_key+$dopkod");
if (($usertime!=$stime) or ($userkey!=$xkey) or strlen($usernum)<1) exit("введён ОШИБОЧНЫЙ код!");}
// АНТИСПАМ 2!
if ($antispam2012==TRUE and !isset($wrfname)) { $ao=replacer($_POST['antispam2012o']);
if (strtolower($antispam2012o)!=strtolower($ao) or strlen($ao)<1) exit("введён ошибочный ответ на вопрос!");}
if ($add_tema==TRUE and $g_add_tema==FALSE and !isset($wrfname)) exit("$back Администратор запретил гостям создавать темы!");
if ($add_msg==TRUE and $g_add_msg==FALSE and !isset($wrfname)) exit("$back Администратор запретил гостям отвечать в темах!");
$ok=FALSE;
if ($j>0) { do {$j--; $tdt=explode("|",$lines_tema[$j]); // Если есть темы в разделе
if ($add_msg==TRUE) { // Если добавляем СООБЩЕНИЕ
if ($tdt[3]==$id) { $ok=TRUE; if ($tdt[11]==FALSE) exit("$back тема закрыта и добавление сообщений запрещено!"); }
} // $add_msg==TRUE
if ($add_tema==TRUE) { // ЕСЛИ добавляем ТЕМУ
$ok=TRUE;
// функция АНТИФЛУД: повторное добавление темы запрещено!
if ($tdt[5]==$zag) exit("$back. Тема с заголовком \"$tdt[5]\" (ссылка на тему) уже создана на форуме! Спамить на форуме запрещено!");
} // $add_tema==TRUE
} while($j>0);
} // if $j>0
// БЛОК ГЕНЕРИРУЕТ СЛЕДУЮЩИЙ ПО ПОРЯДКУ НОМЕР ТЕМЫ, начиная просмотр с 1000
if ($add_tema==TRUE) { $id=1000; $id="$fid$id";
$allid=null; $records=file("$datadir/$fid.dat"); $imax=count($records); $i=$imax;
if ($i > 0) { do {$i--; $rd=explode("|",$records[$i]);
$allid[$i]="$dt[2]$dt[3]"; } while($i>0);
do $id++; while(in_array($id,$allid) or is_file("$datadir/$id.dat"));
} else $id=$fid."1000";
if (strlen($id)!=7) exit("$back. Номер темы должен быть числом. Критическая ошибка скрипта или попытка взлома");
$id=substr($id,3,4); // Нам нужен чистый ID из 4-х символов
} // if $add_tema==TRUE
if ($add_msg==TRUE) { // Если добавляем СООБЩЕНИЕ
$temka=file("$datadir/$fid$id.dat"); $kmax=count($temka); $k=$kmax;
do {$k--; $dtt=explode("|",$temka[$k]);
if ($dtt[3]==$id) { $zag=$dtt[5];
if ($dtt[11]==FALSE) exit("$back тема закрыта и добавление сообщений запрещено!");
if ($msg==$dtt[14]) exit("$back. Такое сообщение уже размещено последним в данной теме. Спамить на форуме запрещено!");
}
} while($j>0);
} // $add_msg==TRUE
$name=wordwrap($name,30,' ',1); // разрываем длинные строки
$zag=wordwrap($zag,50,' ',1); if (strlen(ltrim($zag))<3) exit("$back ! Ошибка в вводе данных заголовка!");
$name=str_replace("|","I",$name);
$who=str_replace("|","|",$who);
$email=str_replace("|","|",$email);
$zag=str_replace("|","|",$zag);
$msg=str_replace("|","|",$msg);
$vip_tema="0"; // VIP-тема. Если указать 1, то такая тема будет показываться вверху!
$open_tema="1"; // Тема открыта для добавления сообщений? 1/0
$golos="0"; // Есть голосование в теме? 1/0
$rn="10000";
// Если добавляем ТЕМУ
if ($add_tema==TRUE) {$rn_tema="10000"; $text_tema="$rn|$rn_tema|$fid|$id|$tektime|$zag|$who|$rn_user|$name|$email|$vip_tema|$open_tema|$ip||"; $text_tema=replacer($text_tema);}
else {
if (is_file("$datadir/$fid$id.dat")) {$linesn=file("$datadir/$fid$id.dat"); $in=count($linesn)-1;}
$rn_tema=10000+($in+1)*10; } // Генерируем следующий по порядку RN с шагом в 10 единиц!
$text_msg="$rn_tema|$golos|$fid|$id|$tektime|$zag|$who|$rn_user|$name|$email|$vip_tema|$open_tema|$ip|"; // добавление сообщения!
$text_msg=replacer($text_msg); $exd=explode("|",$text_msg); $name=$exd[8]; $zag=$exd[5]; $msg=replacer($msg);
if (!isset($name) || strlen($name) > $maxname || strlen($name) <1) exit("$back Ваше Имя пустое, или превышает $maxname символов!");
if (preg_match("/[^(\\w)|(\\x7F-\\xFF)|(\\-)]/",$name)) exit("$back Ваше имя содержит запрещённые символы. Разрешены русские и английские буквы, цифры, подчёркивание и тире.");
if (strlen(ltrim($zag))<3 || strlen($zag) > $maxzag) exit("$back Слишком короткое название темы или название превышает $maxzag символов!");
if (strlen(ltrim($msg))<2 || strlen($msg) > $maxmsg) exit("$back Ваше сообщение короткое или превышает $maxmsg символов.");
if (!preg_match('/^([0-9a-zA-Z]([-.w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-w]*[0-9a-zA-Z].)+[a-zA-Z]{2,9})$/si',$email) and strlen($email)>30 and $email!="") exit("$back и введите корректный E-mail адрес!");
print"";
$text_msg=$text_msg."|$msg||"; // Добавляем в переменную $text_msg кусочек о загруженном файле!
if ($add_msg==TRUE) { //при ОТВЕТе В ТЕМЕ
$in=$in+2; $pageadd=""; $page=ceil($in/$msg_onpage); if ($page!=1) $pageadd="&page=$page";
// ЗАЩИТА ОТ ФЛУДА: проверяем, давно ли реактивировали тему
$timetek=time(); $timefile=filemtime("$datadir/$fid$id.dat"); $timer=$timetek-$timefile; // сколько секунд назад?
if ($timer<$antiflud and $timer>0) exit("$back тема была активна менее $timer секунд назад. Подождите чуть-чуть.");
// ЕСЛИ введена команда АП!, то меняем дату создания файла и тема самая первая будет
if (strtolower($msg)=="ап!") { touch("$datadir/$fid$id.dat");
print "
Спасибо, $name, тема реактивирована.
Через несколько секунд Вы будете автоматически перемещены в текущую тему $zag.
";
exit;}
} // $add_msg==TRUE
$razdelname="";
if ($realbase==TRUE) { // Если подключена рабочая база, а не копия
$lines=file("$datadir/wrforum.dat"); $max=sizeof($lines)-1;
$dt=explode("|",$lines[$realfid]); $dt[7]++; $main_id="$fid$id";
if ($add_tema==TRUE) $dt[6]++;
$txtdat="$dt[0]|$dt[1]|$dt[2]|$dt[3]|$dt[4]|$dt[5]|$dt[6]|$dt[7]|$dt[8]|$dt[9]|$dt[10]|$main_id|$tektime|$name|$zag|";
$razdelname=$dt[4];
$fp=fopen("$datadir/wrforum.dat","a+"); // запись данных на главную страницу
flock ($fp,LOCK_EX);
ftruncate ($fp,0);//УДАЛЯЕМ СОДЕРЖИМОЕ ФАЙЛА
for ($i=0;$i<=$max;$i++) {if ($i==$realfid) fputs($fp,"$txtdat\r\n"); else fputs($fp,$lines[$i]);}
fflush ($fp);
flock ($fp,LOCK_UN);
fclose($fp);
} // if ($realbase==TRUE)
$newmessfile="$datadir/news.dat";
if (is_file("$datadir/$fid.dat")) $nlines=count(file("$datadir/$fid.dat")); else $nlines=1;
if (is_file("$datadir/$fid$id.dat")) $nlines2=count(file("$datadir/$fid$id.dat"))+1; else $nlines2=1;
$newlines=file($newmessfile); $ni=count($newlines)-1; $flag=FALSE; $newlineexit="";
$ntext=$text_msg."$nlines|$nlines2|"; $ntext=str_replace("
", " ", $ntext);
// Блок проверяет, есть ли уже новое сообщение в этой теме. Если есть - отсеивает. На выходе - массив без этой строки.
if($ni>=15) {unset($newlines[0]); $ni--; $newlines=array_values($newlines); $flag=TRUE;} // Если в файле более 15 сообщений, то старое (первое) удаляем!
for ($i=0;$i<=$ni;$i++) { $ndt=explode("|",$newlines[$i]); if ("$fid$id"!="$ndt[2]$ndt[3]") $newlineexit.="$newlines[$i]"; else $flag=TRUE; }
if ($flag==TRUE) {$newlineexit.=$ntext; $fp=fopen($newmessfile,"w");} else {$newlineexit=$ntext; $fp=fopen($newmessfile,"a+");}
flock ($fp,LOCK_EX);
fputs($fp,"$newlineexit\r\n");
fflush ($fp);
flock ($fp,LOCK_UN);
fclose($fp);
if ($add_tema==TRUE) { // Добавление ТЕМЫ - запись данных
// Пишем В ТОПИК
$fp=fopen("$datadir/$fid.dat","a+");
flock ($fp,LOCK_EX);
fputs($fp,"$text_tema\r\n");
fflush ($fp);
flock ($fp,LOCK_UN);
fclose($fp);
// Пишем В ТЕМУ
$fp=fopen("$datadir/$fid$id.dat","a+");
flock ($fp,LOCK_EX);
fputs($fp,"$text_msg\r\n");
fflush ($fp);
flock ($fp,LOCK_UN);
fclose($fp);
print "
Спасибо, $name, за добавление темы!
Через несколько секунд Вы будете автоматически перемещены в созданную тему.