#!/usr/bin/perl
###################################
#### ice guest book [FastGuestBook]
###################################
### fgb.cgi [v.1]
###################################
$start = (times)[0];# время начала генерации HTML документа
$content="Content-type: text/html; charset=windows-1251\n\n\n\n";
### загрузка файла с данными, если нет, то ошибка
$file1="./config.cgi";
$file2="./web.cgi";
if ((-e $file1) && (-e $file2)){
require $file2;
require $file1;
}else{$gerr=1;&error('не найден один или несолько конфигурационных файлов')};
###
### пути к файлам скритпа [const]
###
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time);$year+=1900;
if ($sec < 10) {$sec = "0$sec";}
if ($min < 10) {$min = "0$min";}
if ($hour < 10) {$hour = "0$hour";}
$mon=$mon+1;
if ($mon < 10) {$mon = "0$mon";}
if ($mday < 10) {$mday = "0$mday";}
$date_today=$mday."I".$wday."I".$mon."I".$year."I".$min."I".$hour;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
read(STDIN, $bufer, $ENV{'CONTENT_LENGTH'});
}
elsif ($ENV{'REQUEST_METHOD'} eq "GET")
{
$bufer=$ENV{'QUERY_STRING'};
}
$form_data = $bufer;
@pairs = split (/&/, $form_data);
foreach $pair (@pairs)
{
($name, $value) = split(/=/,$pair);
$name =~ tr/+/ /;
$name =~ s/%(..)/pack ("C", hex ($1))/eg;
$value =~ tr/+/ /;
$value =~ s/%(..)/pack ("C", hex ($1))/eg;
$value=~s/\r\n/\n/g;
$form_fields{$name}=$value;
}
###
### переменные
###
$lga=$form_fields{'lga'};
$psa=$form_fields{'psa'};
$lg=$form_fields{'lg'};
$ps=$form_fields{'ps'};
$txt=$form_fields{'TXT'};
$mail=$form_fields{'MAIL'};
$site=$form_fields{'SITE'};
$name=$form_fields{'NAME'};
$action=$form_fields{'action'};
$id=$form_fields{'id'};
$p=$form_fields{'p'};
##
## декодирование данных пользователя
$lgb=pack "H*", $lg;
$psb=pack "H*", $ps;
$enter="$site_cgi_"."/fgb.cgi?action=enter";
$crl=$login_;
$crp=crypt($password_,"icelab");
##
if ($crl ne $lgb || $crp ne $psb){$admin=0}else{
$admin=1;
$stfauf=qq~
~;
$stfauf=~s//$lg/g;
$stfauf=~s//$ps/g;
$sttauf="lg=".$lg."&ps=".$ps;
}
if ($gerr !=1){
if ($form_data eq ''){&ind}
elsif ($action eq 'enter'){&enter} ## авторизация
elsif ($action eq 'enter_ok'){&enter_ok} ## авторизация ок
elsif ($action eq 'view'){&ind} ## просмотр сообщений
elsif ($action eq 'add'){&add} ## добавление сообщений
elsif ($action eq 'edit' && $admin==1 && $id!=0){&edit} ## редактирование сообщения
elsif ($action eq 'edit_ok' && $admin==1 && $id!=0){&edit_ok} ## редактирование закончено
elsif ($action eq 'answer' && $admin==1 && $id!=0){&answer} ## ответ
elsif ($action eq 'answer_ok' && $admin==1 && $id!=0){&answer_ok} ## ответ сохранен
elsif ($action eq 'del' && $admin==1 && $id!=0){&del_message} ## стeреть сообщение
elsif ($action eq 'clear' && $admin==1){&clear} ## очистка базы
else {&error('возможно Вы ввели недопустимую команду, или произошла внутренняя ошика скрипта')}
}
sub error
{
my ($error_txt)=$_[0];
if ($gerr!=1){
$strerr='переход на сайт, на гостевую книгу';
}
$err_=qq~
error
произошла ошибка
Ваш запрос не может быть выполнен
,
$strerr
~;
$err_p=$err_;
$err_p=~s//$error_txt/g;
$err_p=~s//$site_url_/g;
$err_p=~s//$site_cgi_/g;
print $content;
print $err_p;
}
sub answer
{
$cgi=$site_cgi_."/fgb.cgi";
$fileTX="txt/".$id.".txt";
$fileDB="data/base.db";
open TX,"< $fileTX" || die;
$txt.=$sh while ($sh=);
close TX;
### просмотр текста сообщения на лету.
open FDB,"< $fileDB" || die;
@db=;
close FDB;
for ($i=0;$i<=(@db-1);$i++)
{
$buf=$db[$i];
$buf=~s/\n//g;
@md=split('::',$buf);
if ($md[0]==$id){$name=$md[2];$date_full=$md[1];$mail=$md[3];$site=$md[4];last;}
}
@date_db=split('I',$date_full);
$mday=$date_db[0];
$wday=$day[$date_db[1]];
$monthc=$date_db[2];
$montht=$month[$date_db[2]];
$year=$date_db[3];
$min=$date_db[4];
$hour=$date_db[5];
$date_formdat_buf=$date_formdat_;
$date_formdat_buf=~s//$mday/g;
$date_formdat_buf=~s//$wday/g;
$date_formdat_buf=~s//$monthc/g;
$date_formdat_buf=~s//$montht/g;
$date_formdat_buf=~s//$year/g;
$date_formdat_buf=~s//$min/g;
$date_formdat_buf=~s//$hour/g;
$answer_html=$answer_html_;
$answer_html=~s//$cgi/g;
$answer_html=~s//$id/g;
$answer_html=~s//$name/g;
$answer_html=~s//$site/g;
$answer_html=~s//$mail/g;
$answer_html=~s//$txt/g;
$answer_html=~s//$date_formdat_buf/g;
$answer_html=~s//$stfauf/g;
print $content; ##
print $answer_html;
}
sub answer_ok
{
$fileTX="txt/".$id.".txt";
open TX,"< $fileTX" || die;
$txt_file.=$sh while ($sh=);
close TX;
$add_answer=$add_answer_;
$add_answer=~s//$txt/g;
$txt_file.=$add_answer;
open TX,"> $fileTX" || die;
print TX $txt_file;
close TX;
$ado=$ado_[1];
&ind;
}
sub edit
{
$cgi=$site_cgi_."/fgb.cgi";
$fileTX="txt/".$id.".txt";
$fileDB="data/base.db";
open TX,"< $fileTX" || die;
$txt.=$sh while ($sh=);
close TX;
### просмотр текста сообщения на лету.
open FDB,"< $fileDB" || die;
@db=;
close FDB;
for ($i=0;$i<=(@db-1);$i++)
{
$buf=$db[$i];
$buf=~s/\n//g;
@md=split('::',$buf);
if ($md[0]==$id){$name=$md[2];$date_full=$md[1];$mail=$md[3];$site=$md[4];last;}
}
@date_db=split('I',$date_full);
$mday=$date_db[0];
$wday=$day[$date_db[1]];
$monthc=$date_db[2];
$montht=$month[$date_db[2]];
$year=$date_db[3];
$min=$date_db[4];
$hour=$date_db[5];
$date_formdat_buf=$date_formdat_;
$date_formdat_buf=~s//$mday/g;
$date_formdat_buf=~s//$wday/g;
$date_formdat_buf=~s//$monthc/g;
$date_formdat_buf=~s//$montht/g;
$date_formdat_buf=~s//$year/g;
$date_formdat_buf=~s//$min/g;
$date_formdat_buf=~s//$hour/g;
$edit_html=$edit_html_;
$edit_html=~s//$cgi/g;
$edit_html=~s//$id/g;
$edit_html=~s//$name/g;
$edit_html=~s//$site/g;
$edit_html=~s//$mail/g;
$edit_html=~s//$txt/g;
$edit_html=~s//$date_formdat_buf/g;
$edit_html=~s//$stfauf/g;
print $content; ##
print $edit_html;
}
sub edit_ok
{
if ($edit_v_==1){$txt.=$edit_message_;}
$fileTX="txt/".$id.".txt";
open TX,"> $fileTX" || die;
print TX $txt;
close TX;
$ado=$ado_[3];
&ind;
}
sub del_message
{
$fileTX="./txt/".$id.".txt";
$fileDB="./data/base.db";
unlink ($fileTX);
open DBF, "< $fileDB" || die;
@db=;
close DBF;
for ($i=0;$i<=(@db-1);$i++)
{
$buf=$db[$i];
$buf=~s/\n//g;
@md=split('::',$buf);
if ($md[0]==$id){next;}
$prn.="$md[0]\:\:$md[1]\:\:$md[2]\:\:$md[3]\:\:$md[4]\:\:$md[5]\n";
}
open DBF, "> $fileDB" || die;
print DBF $prn;
close DBF;
$prn='';
$ado=$ado_[2];
&ind;
}
sub not
{
use CGI qw/:standard/;
print header (-type => 'text/html; charset=windows-1251',
-status => '404 Not Found');
print qq~
page not found 404
Error 404
sorry, page not found
~;
}
sub ind
{
if ($admin==1){}
$path="$site_cgi_"."/fgb.cgi";
$fileDB="data/base.db";
open FDB, "< $fileDB" || die;
@db=;
close FDB;
if (!@db){$message='база сообщений пуста'}
else
{
$pr=1;
$lgs=$#db+1;
$algs=$#db+1;
if ($p!=0){$p=$p-1;}else{$p==0}
if ($lgs<($scc_+$p*$scc_)){$prp=$lgs-1}else{$prp=($scc_+$p*$scc_)-1}
for ($i=($p*$scc_);$i<=($prp);$i++)
{
$date_formdat_buf=$date_formdat_;
$sh_mes_buf=$sh_mes_;
$buf=$db[$i];
$buf=~s/\n//g;
@md=split('::',$buf);
$date_full=$md[1];
### обработчик формата даты
@date_db=split('I',$date_full);
$mday=$date_db[0];
$wday=$day[$date_db[1]];
$monthc=$date_db[2];
$montht=$month[$date_db[2]];
$year=$date_db[3];
$min=$date_db[4];
$hour=$date_db[5];
$date_formdat_buf=~s//$mday/g;
$date_formdat_buf=~s//$wday/g;
$date_formdat_buf=~s//$monthc/g;
$date_formdat_buf=~s//$montht/g;
$date_formdat_buf=~s//$year/g;
$date_formdat_buf=~s//$min/g;
$date_formdat_buf=~s//$hour/g;
###
$file_db="txt/".$md[0].".txt";
open FIL, "< $file_db" || die;
$text.=$sh while ($sh=);
close FIL;
if ($text ne ''){$cnt_no++}
$show_data=$text;$text='';
$mes_date=$date_formdat_buf;
$gb_html_mail=$gb_html_mail_;
$gb_html_href=$gb_html_href_;
if ($md[3] ne '-'){$gb_html_mail=~s//$md[3]/g;}else{$gb_html_mail=''}
if ($md[4] ne '-'){$gb_html_href=~s//$md[4]/g;}else{$gb_html_href=''}
### просмотр текста сообщения на лету.
$sh_mes_buf=~s//$mes_date/g;
$sh_mes_buf=~s//$show_data/g;
$sh_mes_buf=~s//$md[2]/g;
$sh_mes_buf=~s//$gb_html_mail/g;
$sh_mes_buf=~s//$gb_html_href/g;
$sh_mes_buf=~s//$md[5]/g;
if ($admin==1){
$admin_message=$admin_message_;
$aa="$site_cgi_"."/fgb.cgi?action=answer&id=$md[0]&".$sttauf;
$ae="$site_cgi_"."/fgb.cgi?action=edit&id=$md[0]&".$sttauf;
$ad="$site_cgi_"."/fgb.cgi?action=del&id=$md[0]&".$sttauf;
$admin_message=~s//$aa/g;
$admin_message=~s//$ae/g;
$admin_message=~s//$ad/g;
$sh_mes_buf=~s//$admin_message/g;
}
$message.=$sh_mes_buf;
}
}
if ($cnt_no==0 && $pr==1){¬}
else{
if ($admin==1){
$c1=$algs;
if ($c1<=$scc_){$prn_arh=''}
else{
$ci=int($c1/$scc_);
if ($ci<($c1/$scc_)){$ci++}
$a=0;
for ($i=1;$i<=($ci);$i++){
$a++;
if ($a>=$arh_cc_){$a=0;$nbs='
'}else{$nbs=''};
$arh=$arh_;
$arh_cgi=$site_cgi_."/fgb.cgi?action=view&p=$i";
if ($admin==1){$arh_cgi.="&".$sttauf}
$arh=~s//$i/g;
$arh=~s//$arh_cgi/g;
$prn_arh.=$arh.$nbs."\n";
}
}
}else{
$c1=$algs;
if ($c1<=$scc_){$prn_arh=''}
else{
$ci=int($c1/$scc_);
if ($ci<($c1/$scc_)){$ci++}
$a=0;
for ($i=1;$i<=($ci);$i++){
$a++;
if ($a>=$arh_cc_){$a=0;$nbs='
'}else{$nbs=''};
$arh=$arh_;
$arh_cgi=$site_cgi_."/fgb.cgi?action=view&p=$i";
$arh=~s//$i/g;
$arh=~s//$arh_cgi/g;
$prn_arh.=$arh.$nbs."\n";
}
}
}
### елси можно добавлять ответы
if ($gb_add_on_==1){
### авторизация
if ($admin==1){
$add_message_b=$add_message_admin_;
$add_message_b=~s//$admin_name_/g;
$add_message_b=~s//$admin_mail_/g;
$add_message_b=~s//$admin_site_/g;
$add_message_b=~s//$stfauf/g;
$add_message_b=~s//$path/g;
}
else
{
$add_message_b=$add_message_;
$add_message_b=~s//$path/g;
}
}
else
{$add_message_b=''}
if ($admin==1){
$admin_up=$admin_up_;
$admin_up=~s//$site_name_/g;
$admin_up=~s//$site_url_/g;
$cgi=$site_cgi_."/fgb.cgi?action=clear&$sttauf";
$admin_up=~s//$cgi/g;
$admin_up=~s//$ado/g;
}
print $content; ##
$sh_page=~s//$site_name_/g;
$sh_page=~s//$sh_up/g;
$sh_page=~s//$admin_up/g;
$sh_page=~s//$message/g;
$sh_page=~s//$add_message_b/g;
$sh_page=~s//$prn_arh/g;
$sh_page=~s//$sh_doun/g;
$sh_page=~s//$enter/g;
$gen_time = (times)[0]-$start;
$sh_page=~s//$gen_time/g;
print $sh_page;
}
}
sub add
{
if ("$txt" eq '' || "$name" eq ''){&error('произошла ошибка возможно вы оставили обязательное поле пустым')}else{
if ($mail eq ''){$mail='-'}
if ($site eq ''){$site='-'}
if (length($txt)>$gb_len_){$lim_ok=1}
if ($lim_ok==1){&error("превышено предельное количество в $gb_len_ символов в сообщении")}else{
$fileDB="data/base.db";
$filec2="data/cnt.cnt";
&txtcore;
open CNT2, "< $filec2" || die;
$c2=;
close CNT2;
$c2++;
open CNT2, "> $filec2" || die;
print CNT2 $c2;
close CNT2;
$fileTXT="txt/".$c2.".txt";
open TX, "> $fileTXT" || die;
print TX $txt;
close TX;
open FDB, "< $fileDB" || die;
@db=;
close FDB;
$ip=$ip_;
$string="$c2\:\:$date_today\:\:$name\:\:$mail\:\:$site\:\:$ip\n";
$ndb[0]=$string;
$rlgs=$#db+1;
if ($gb_clear_ <= 5000){$gbp=$gb_clear_}else{$gbp=5000};
if ($rlgs => $gbp){@ndb[1..$gbp-1]=@db[0..$gbp-1]}else{@ndb[1..($#db+1)]=@db[0..($#db)];}
open FDB, "> $fileDB" || die;
print FDB @ndb;
close FDB;
&ind;
if ($admin !=1 && $mail_send_==1){&submit_mail}
}
}
}
sub enter
{
$auf_html=$auf_html_;
$site_cgi=$site_cgi_;
$site_cgi.="/fgb.cgi";
$auf_html=~s//$site_cgi/g;
print $content;
print $auf_html;
}
sub enter_ok
{
if ("$lga" eq "$login_" && "$psa" eq "$password_"){
$admin=1;
$crl=$login_;
$crp=crypt($password_,"icelab");
$lg=unpack "H*", $crl;
$ps=unpack "H*", $crp;
$stfauf=qq~
~;
$stfauf=~s//$lg/g;
$stfauf=~s//$ps/g;
$sttauf="lg=".$lg."&ps=".$ps;
&ind;
}
else{&ind}
}
sub txtcore
{
if ($gb_html_on_==0){
$br_s="\n\n";
$br="\n";
$l_s="<";
$g_s=">";
$http='^http://';
$l="<";
$g=">";
$txt=~s/$l_s/$l/g;
$txt=~s/$g_s/$g/g;
$br_s="\n";
$br="
\n";
$txt=~s/$br_s/$br/g;
}
if ($site){$site=~s/$http//g;}
if ($mail){
if($mail=~/\w+\@\w+\.\w+/) {
$mail_yes=1;
}
if ($mail_yes != 1){$mail='-'}
}
}
sub submit_mail
{
$mailprog=$path_sendmail_;
$mail_admin=$admin_mail_;
$send=$name."
".$text;
$admin_mail=$admin_mail_;
if ($admin_mail eq '-'){$admin_mail_=$site_mail_}
open (MAIL_S, "|$mailprog -t");
print MAIL_S "To: $site_mail_\n";
print MAIL_S "From: $admin_mail_\n";
print MAIL_S "Subject: $subj_\n";
print MAIL_S "Content-type: text/html; charset=windows-1251\n\n";
$send=$send_;
$cgi=$site_url_.$site_cgi_."/fgb.pl?action=view";
$date=gmtime(time);
$send=~s//$date/g;
$send=~s//$cgi/g;
print MAIL_S $send;
close (MAIL_S);
}