#!/usr/bin/perl
## V1.01m Pic not in self cell. News modified
$siteurl='http://www.v-world.dn.ua/';
$url=$siteurl.'cgi-bin/news.cgi';
#$url='http://news/cgi-bin/news.cgi';
#$siteurl='http://news/cgi-bin/news.cgi';
$data='../dat';
use Time::Local;
use lib qw/./;
use parse;
require 'func.pl';
require 'pass.pl';
&ReadConfig;
#$FORM{'pass'}='';
#$FORM{'id'}=0;
&parse_form;
if ($FORM{'a'} eq 'view') { &view }
elsif ($FORM{'a'} eq 'add') { &add }
elsif ($FORM{'a'} eq 'delete') { &delete }
elsif ($FORM{'a'} eq 'login') { &login }
elsif ($FORM{'a'} eq 'admin') { &admin }
elsif ($FORM{'a'} eq 'change') { &change }
elsif ($FORM{'a'} eq 'full') { &fullview }
else {
require 'vote.pl';
&view;
#print "Error";
}
sub BeginHTML {
print "Content-type: text/html\n\n";
# print join '
', map ("$_ = $FORM{$_}", keys %FORM);
}
sub EndHTML {
$html =~ s//$out_htm/;
print $html;
}
sub fullview {
my $HTML=local *HTML;
&flop ($HTML, "$data/news2.htm");
my @html = <$HTML>;
&flcl ($HTML, "$data/news2.htm");
$html = join '', @html;
$tnews = &GetTmpl('News', $html);
&BeginHTML;
my $GDB=local *GDB;
&flop ($GDB, "$data/news.dat");
$cid=0;
while (($s=<$GDB>)&&($cid<$FORM{'id'}+$CFG{'news'})) {
chomp $s;
my ($time, $author, $email, $news, @pics)=split /\|/, $s;
&get_date($time);
#unless ($spic) {$spic='';}
if ($cid>=$FORM{'id'}) {
$news =~ s/{br}/
/g;
$news =~ s/{p}/
/g;
$news =~ s/{bold (.*?) bold}/$1<\/b>/g;
$news =~ s/{italic (.*?) italic}/$1<\/i>/g;
$news =~ s/{uline (.*?) uline}/$1<\/u>/g;
$news =~ s/({)([^}]*)(==)([^}]*)(})/$2<\/a>/g;
$url = $4;
$url =~ s/\&/\&/g;
$news =~ s///g;
$htmout=&Place('Date', $date, $tnews);
if ($pics[0]) {
unless ($pics[1]) {
$htmout=&Place('Pic', qq~~, $htmout);
} else {
$htmout=&Place('Pic', qq~~, $htmout);
}
} else {
#$htmout=&Place('Pic', qq~~, $htmout);
}
for (my $n=2; $n<=$#pics; $n+=2) {
$htmout=&Insert('OPics', qq~~, $htmout);
}
$htmout=&Place('News', $news, $htmout);
# if ($cid+1 <= $FORM{'id'}+$CFG{'news'}) {
# $htmout=&Place2('NextNews', '#'.($cid+1), $htmout);
# } else {
# $htmout=&Place2('NextNews', '#'.($cid), $htmout);
# }
# if ($cid == $FORM{'id'}) {
# $htmout=&Place2('PrevNews', '#top', $htmout);
# } else {
# $htmout=&Place2('PrevNews', '#'.($cid-1), $htmout);
# }
$htmout=&Place('Anchor', "", $htmout);
if ($CFG{'author'}) {
if ($email) {
$htmout=&Place('Author', qq~$author~, $htmout);
} else {
$htmout=&Place('Author', $author, $htmout);
}
}
$html=&Insert('IN', $htmout, $html);
}
$cid++;
}
if ($s ne '') {
#print "Предыдущие новости";
$htmout=&Place2('cid', $cid, $tnext);
$htmout=&Place2('mode', 'view', $htmout);
$html=&Place('NewsIN', $htmout, $html);
}
&flcl ($GDB, "$data/news.dat");
&EndHTML;
}
#############################################################################
#############################################################################
sub view {
&BeginHTML;
my $GDB=local *GDB;
&flop ($GDB, "$data/news.dat");
$cid=0;
# $html = $shell;
$html=Insert('IN', $shell, $html);
while (($s=<$GDB>)&&($cid<$FORM{'id'}+$CFG{'news'})) {
chomp $s;
my ($time, $author, $email, $news, @pics)=split /\|/, $s;
&get_date($time);
#unless ($spic) {$spic='';}
if ($cid>=$FORM{'id'}) {
if ($CFG{'words'} >0) {
$news =~ /^((((\{[^}]+\})|([^ \t\n<]))+\s*){0,${CFG{'words'}}})/;
if ($news ne $1) {$news = $1.qq~.... (Читать полностью...)~}
}
$news =~ s/{br}/
/g;
$news =~ s/{p}/
/g;
$news =~ s/{bold (.*?) bold}/$1<\/b>/g;
$news =~ s/{italic (.*?) italic}/$1<\/i>/g;
$news =~ s/{uline (.*?) uline}/$1<\/u>/g;
$news =~ s/({)([^}]*)(==)([^}]*)(})/$2<\/a>/g;
$url = $4;
$url =~ s/\&/\&/g;
$news =~ s///g;
$htmout=&Place('Date', $date, $tnews);
if ($pics[0]) {
unless ($pics[1]) {
$htmout=&Place('Pic', qq~~, $htmout);
} else {
$htmout=&Place('Pic', qq~~, $htmout);
}
} else {
#$htmout=&Place('Pic', qq~~, $htmout);
}
for (my $n=2; $n<=$#pics; $n+=2) {
$htmout=&Insert('OPics', qq~~, $htmout);
}
$htmout=&Place('News', $news, $htmout);
$htmout=&Place('Anchor', "", $htmout);
if ($CFG{'author'}) {
if ($email) {
$htmout=&Place('Author', qq~$author~, $htmout);
} else {
$htmout=&Place('Author', $author, $htmout);
}
}
$html=&Insert('NewsIN', $htmout, $html);
}
$cid++;
}
if ($s ne '') {
#print "Предыдущие новости";
$htmout=&Place2('cid', $cid, $tnext);
$htmout=&Place2('mode', 'view', $htmout);
$html=&Place('NewsIN', $htmout, $html);
}
&flcl ($GDB, "$data/news.dat");
&EndHTML;
}
#############################################################################
#############################################################################
# sub (template, list_template)
sub pics {
my ($tmp, $list)=@_;
my $max=$FORM{'max'};
my ($m, $n, $st);
for ($m=$n=0; $n<$max; $n++) {
$FORM{"bname$n"} =~ s/${data}\/(space\.gif)?//;
$FORM{"sname$n"} =~ s/${data}\///;
unless ($FORM{"Delete$n"}) {
my $row = Place2('pid', $m, $list);
if ($FORM{"bname$n"} ne '') {
$row = Place2('bpic', $data.'/'.$FORM{"bname$n"}, $row);
} else {$row = Place2('bpic', $data.'/space.gif', $row);}
$row = Place2('spic', $data.'/'.$FORM{"sname$n"}, $row);
$tmp=Insert('PIn', $row, $tmp);
$m++;
$st.='|'.$FORM{"sname$n"}.'|'.$FORM{"bname$n"};
} else {
unlink qq~$data/$FORM{"sname$n"}~;
if ($FORM{"bname$n"} ne '') {unlink qq~$data/$FORM{"bname$n"}~;}
}
}
if (($FORM{'FSmall'}->{'filename'} =~ /([\w-]+ \. (?: gif | jpe?g? ))$/ix) &&
(($FORM{'FBig'}->{'filename'} =~ /([\w-]+ \. (?: gif | jpe?g? ))$/ix)||($max==0))) {
if ($FORM{'FSmall'}->{'filename'} !~ /([\w-]+ \. (?: gif | jpe?g? ))$/ix) #только имя,путь выкидывается
{ $spic = $bpic = ''; }
else {
my $fid='';
while (-e "$data/$fid$1" && $fid<99) {
$fid++;
}
open (FILE, ">$data/$fid$1") or post_error ("Hе могу создать $data/$1: $!");
$spic=$fid.$1;
binmode FILE;
print FILE $FORM{'FSmall'}->{'Contents'};
#print FILE while (<$foto>);
close FILE;
if ($FORM{'FBig'}->{'filename'} !~ /([\w-]+ \. (?: gif | jpe?g? ))$/ix) #только имя,путь выкидывается
{ $bpic=''; }
else {
$fid='';
while (-e "$data/$fid$1" && $fid<99) {
$fid++;
}
open (FILE, ">$data/$fid$1") or post_error ("Hе могу создать $data/$1: $!");
$bpic=$fid.$1;
binmode FILE;
print FILE $FORM{'FBig'}->{'Contents'};
#print FILE while (<$foto>);
close FILE;
}
}
}
if ($spic) {
$row = Place2('pid', $n, $list);
$row = Place2('spic', $data.'/'.$spic, $row);
$bpic=$data.'/'.$bpic if $bpic;
$row = Place2('bpic', $bpic, $row);
$tmp = Insert('PIn', $row, $tmp);
$tmp = Place2('max', $m+1, $tmp);
$st.='|'.$spic.'|'.$bpic;
} else {$tmp = Place2('max', $m, $tmp);}
# $html=Insert('IN', $htmout, $html);
# $html=Insert('IN', $FORM{Done}, $html);
return ($tmp, $st);
}
#############################################################################
#############################################################################
sub add {
unless ($FORM{'Show'}) {&login;}
elsif (!&CheckHash($FORM{'pass'})) {
&BeginHTML;
$html=&Insert('IN',$FORM{'pass'}.'В доступе отказано.' , $html);
&EndHTML;
}
else {
if (($FORM{'day'}>0)&&($FORM{'day'}<32)&&($FORM{'year'})) {
&post_error("Необходимое поле 'Новости' не заполнено.") unless($FORM{'news'});
my $GDB=local *GDB;
&flop($GDB, "$data/news.dat");
@BAK=<$GDB>;
&flcl($GDB, "$data/news.dat");
&flop($GDB, ">$data/news.dat");
$time=timelocal(0, 0, 0, $FORM{'day'}, $FORM{'mon'}, $FORM{'year'});
my $nn=$FORM{'news'};
$nn =~ s/\x96/\'/g;
$nn =~ s/\&/\&/g;
$nn =~ s/\"/\"/g;
#$nn =~ s/ / \ /g;
$nn =~ s/</g;
$nn =~ s/>/>/g;
$nn =~ s/\t/ \ \ \ /g;
$nn =~ s/\n\n/{p}/g;
$nn =~ s/\n/{br}/g;
$nn =~ s/\x0D//g;
$pics='';
for (my $n=0; $n<$FORM{'max'}; $n++) {
$pics.='|'.$FORM{"sname$n"}.'|'.$FORM{"bname$n"};
}
print $GDB "$time\|$FORM{'author'}\|$FORM{'email'}\|$nn$pics\n";
print $GDB @BAK;
&flcl($GDB, "$data/news.dat");
#print "Location: $url?a=view\n\n";
print "Location: $siteurl\n\n";
} else {
&BeginHTML;
$aaa='';
$aaa .= join '
', map ("$_ = $FORM{$_}", keys %FORM);
$html=&Insert('IN',"Неверная дата. $aaa" , $html);
&EndHTML;
}
}
}
#############################################################################
#############################################################################
sub change {
if (!&CheckHash($FORM{'pass'})) {
&BeginHTML;
$html=&Insert('IN','В доступе отказано.' , $html);
&EndHTML;
}
else {
if ($FORM{'maxrec'}) {
$CFG{'news'}=$FORM{'maxrec'};
save_cfg("$data/news.cf", %CFG);
}
&view;
}
}
#############################################################################
#############################################################################
sub login {
unless (CheckPass($FORM{'pass'}) || CheckHash($FORM{'pass'})) {
&BeginHTML;
$html=&Insert('IN','В доступе отказано.' , $html);
&EndHTML;
}
else {
&BeginHTML;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year+=1900;
@selected=();
$mon=$FORM{'mon'} if ($FORM{'mon'});
$selected[$mon]=' selected ';
$mday=$FORM{'day'} if ($FORM{'day'});
$year=$FORM{'year'} if ($FORM{'year'});
my($tmp, $st) = pics ($tadd, $taddp);
#$htmout = &Place2 ('MaxRecords', $CFG{news}, $tadd);
$htmout = &Place2 ('MaxRecords', $CFG{news}, $tmp);
$htmout = &Place2 ('Pass', $pass, $htmout);
$htmout = &Place2 ('Day', $mday, $htmout);
for ($n=0; $n<12; $n++)
{
$msel=&Place2('IDMon', $n, $tmsel);
$msel=&Place2('Month', $months[$n], $msel);
$msel=&Place2('Sel', $selected[$n], $msel);
$htmout=&Insert('MIn', $msel, $htmout);
}
$htmout=&Place2('Year', $year, $htmout);
$htmout=&Place2('news', $FORM{'news'}, $htmout);
#$htmout=&Place2('max', $FORM{'max'}, $htmout);
#for (my $n=0; $n<$FORM{'max'}; $n++) {
# my $row = Place2('id', $n, $taddp);
# $row = Place2('bpic', $FORM{"bname$n"}, $row);
# $row = Place2('spic', $FORM{"sname$n"}, $row);
# $htmout=Insert('APin', $row, $htmout);
#}
$html=&Insert('IN', $htmout, $html);
&EndHTML;
##&delete;
}
}
#############################################################################
#############################################################################
sub admin {
&BeginHTML;
$html=&Place('IN', $tlogin, $html);
&EndHTML;
}
#############################################################################
#############################################################################
sub delete {
&BeginHTML;
# print join '
', map ("$_ = $FORM{$_}", keys %FORM);
if (!&CheckHash($FORM{'pass'})) {
$html=&Insert('IN','В доступе отказано.' , $html);
&EndHTML;
exit;
}
# print join '
', map ("$_ = $FORM{$_}", keys %FORM);
my $GDB=local *GDB;
#####=======================================================
my $sk=join (';',keys(%FORM));
#if ($sk=~/(;cb\d+)(;|$)/) {
if ($FORM{'ChangeNews'} || $FORM{'DeleteNews'} ||
$FORM{'DeleteNews'} || $FORM{'AddPic'} || $sk =~ /Delete\d+/) {############3
######################################################################
###################33333
##########################33
#######################
flop($GDB, "$data/news.dat");
my @allnews=<$GDB>;
flcl($GDB, "$data/news.dat");
$cid=0;
my ($tmp, $st)=pics($tdelnews, $tdelplist);
&flop($GDB, ">$data/news.dat");
#print join ' |+| ', keys %FORM;
foreach $s (@allnews) {
chomp $s;
if ($FORM{'id'}==$cid) {
unless ($FORM{'DeleteNews'}) {
#(my $time, my $pic, my $news)=split /\|/, $s;
my ($time, $author, $email, $news, @pics)=split /\|/, $s;
$nn = $FORM{'news'};
$nn =~ s/\x96/\'/g;
$nn =~ s/\&/\&/g;
$nn =~ s/\"/\"/g;
$nn =~ s/</g;
$nn =~ s/>/>/g;
$nn =~ s/\t/ \ \ \ /g;
$nn =~ s/\n\n/{p}/g;
$nn =~ s/\n/{br}/g;
$nn =~ s/\x0D//g;
print $GDB qq~$time\|$FORM{'author'}\|$FORM{'email'}\|$nn$st\n~;
}
} else {print $GDB "$s\n";}
$cid++;
}
&flcl($GDB, "$data/news.dat");
}
####======================================================
# print "\n\n
pass"; # exit; &flop($GDB, "$data/news.dat"); $cid=0; $htmout=$tdel; while (($s=<$GDB>)&&($cid<$FORM{'id'}+$CFG{'news'})) { chomp $s; if ($cid>=$FORM{'id'}) { #($time, $pic, $news)=split /\|/, $s; ($time, $author, $email, $news, @pics)=split /\|/, $s; &get_date($time); $news =~ s/{br}/\n/g; $news =~ s/{p}/\n\n/g; if ($tmp) { $htmnews = &Place ('Date', $date, $tmp); } else { $htmnews = &Place ('Date', $date, $tdelnews); } $htmnews = &Place2 ('Pass', $pass, $htmnews); $htmnews = &Place2 ('cid', $cid, $htmnews); $htmnews = &Place2 ('News', $news, $htmnews); if ($CFG{'author'}) { $htmnews = &Place2 ('Author', $author, $htmnews); $htmnews = &Place2 ('Email', $email, $htmnews); } #if ($spic) { # $htmnews=&Place('SPic', qq~~, $htmnews); # if ($bpic) { # $htmnews=&Place('BPic', qq~~, $htmnews); # } # $htmnews=&Insert('DIn', $tdelD, $htmnews); #} #if ($#pics>0) {$htmnews=&Insert('DIn', $tdelOP, $htmnews);} for (my $n=$m=0; $n<@pics; $n+=2, $m++) { my $row = &Place2('pid', $m, $tdelplist); if ($pics[$n+1] ne '') { $row = Place2('bpic', $data.'/'.$pics[$n+1], $row); } else {$row = Place2('bpic', $data.'/space.gif', $row);} #$row = Place2('bpic', $data.'/'.$pics[$n+1], $row); $row = Place2('spic', $data.'/'.$pics[$n], $row); $htmnews=Insert('PIn', $row, $htmnews); } $htmnews = Place2('max', $m, $htmnews); $htmout=&Insert('InD', $htmnews, $htmout); } $cid++; } $html=&Insert('IN', $htmout, $html); if ($s ne '') { $htmout=&Place2('cid', $cid, $tdnext); $htmout=&Place2('mode', 'delete', $htmout); $htmout = &Place2 ('Pass', $pass, $htmout); $html=&Place('InD2', $htmout, $html); } &flcl($GDB, "$data/news.dat"); #------------------------------------------------------- &EndHTML; } ############################################################################# ############################################################################# sub post_error { my($e) = @_; &BeginHTML; $html=&Place('IN', &Place('ErrorIn', $e, $terr), $html); &EndHTML; exit; } ############################################# ## # ## Config # ## # sub ReadConfig { @months = ('января','февраля','марта','апреля','мая','июня','июля', 'августа','сентября','октября','ноября','декабря'); %CFG=&parse_cfg("$data/news.cf"); $pass = &GetHash; my $HTML=local *HTML; &flop ($HTML, "$data/news.htm"); my @html = <$HTML>; &flcl ($HTML, "$data/news.htm"); $html = join '', @html; $shell = &GetTmpl('NewsShell', $html); $tnews = &GetTmpl('News', $shell); $tadd = &GetTmpl('AddNews', $html); $taddp = &GetTmpl('List', $tadd); $tmsel = &GetTmpl('MSel', $tadd); $tlogin = &GetTmpl('LoginNews', $html); $tdel = &GetTmpl('DeleteNews', $html); $tdelnews = &GetTmpl('DelNews', $tdel); $tdelplist = &GetTmpl('List', $tdelnews); $tnext = &GetTmpl('NextNews', $html); $tdnext = &GetTmpl('NDN', $html); $terr = &GetTmpl('ErrorNews', $html); } ##################################################################### ### # ### GET DATE (date) # ### # ############### # sub get_date { my $tm=$_[0]; unless ($tm ) { $date=''; return; } @days = ('Вс','Пн','Вт','Ср','Чт','Пт','Сб'); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($tm); if ($hour < 10) { $hour = "0$hour"; } if ($min < 10) { $min = "0$min"; } if ($mon < 10) { $smon = "0$mon"; } else { $smon = $mon;} if ($sec < 10) { $sec = "0$sec"; } $year+=1900; $CFG{'dt'} =~ /(.)(.)/; if ($1 == 1) { $date = "$mday-$mon-$year"; } elsif ($1 == 2) { $months[$mon] =~ /^(.{3})/; $date = "$days[$wday], $mday-$1-$year"; } else { $date = "$days[$wday], $mday $months[$mon] $year г."; } if ($2 == 1) { $date .= ", в $hour:$min"; } elsif ($2 == 2) { $date .= ", в $hour:$min:$sec"; } ##$date="$days[$wday], $mday-$mon-".(1900+$year); }