#!/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); }