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