#!/usr/bin/perl
#
#強化型ゆいぼーど(list.cgi)
#を改造した亜流アンケート
require './jcodeLE.pl';
require './prei.cgi';
$| = 1;
&winit;&noaxschk;
&init;&decode;&jikan;
if (($make ne 'on') && ($delete ne 'on')){
$page = 0 if ($page < 0);
$page2 = $page*$lmax;
&html;
}else{
if($referer = ~ /$cgichk/i ){
&make;
}else{
$page = 0;$page2 = 0;
&html;
}
}
exit;
##################################################
sub init{
$rootpwd = 'master777'; #総合管理者のパスワード(重要!)
$limax=50; #1ページあたりのタイトル表示数
$brmax=10; #説明文の行最大数
$seritime = 60*60*24; #箱連続作成制限の目安時間
$sericount = 5; #箱連続作成制限個数
$seritime2 = 60*10; #箱連続作成制限の目安時間その2
$sericount2 = 1; #箱連続作成制限個数その2
$boxmakers = "./$coudir/boxlist.cgi";
}#init END
##################################################
sub html {
my($bbslink);
$bbslink = "[$bbsname]" if($bbscgi);
print "Content-type: text/html\n\n";
print <<"_HTML_";
$orititle
$metacode
$bodys
$orititle
[新規に話題を投稿する。][表\示形式の変更(${lmax}件/page)]
[インデックス]
$bbslink
新規の話題を投稿しましょう
ここでは、新規のアンケートを簡単に作成できます。(...はずです。)
あなたの質問したい内容を簡潔に分かりやすく説明するタイトルと説明を記入して、
箱を設置してください。
一定期間書き込まれなかった話題は自動的に削除します。(${sday}〜${daylimit}日後)
$original
_HTML_
}#html END
##################################################
sub listing{
my($room,$filedata,$roomtotal,$total,$count,$i,$file,$set,$title,$chkkey,$datedata,$hatusuu,$link);
my($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst);
my($d1,$d2,$hst,$pagelink);
opendir(DIR,"$logdir");
@readlist = grep(/log/, readdir(DIR));
closedir(DIR);
$roomtotal = 0;
foreach $room (@readlist) {
$room=~s/log\.(.*)\.cgi/$1/;
$filedata = -M "./$logdir/log.$room.cgi";
if($hotlist){ #更新日付がhotlist以内のものをピックアップ
push(@roomlist,$room) if ($filedata < $hotlist);
}else{
push(@roomlist,$room);
}
$ans2{$room} = $filedata;
$roomtotal++;
}#foreach
if ($sorttype eq 'new'){
@roomlist = sort { $ans2{$a} <=> $ans2{$b} } @roomlist; #更新順
}else{
@roomlist = sort { $a <=> $b; } @roomlist; #作成順
@roomlist = reverse (@roomlist);
}
print <<"_HTML_";
${date}現在の投票箱のリスト(計 ${roomtotal}箱)
括弧内が箱番号です。日付、時刻は最終書き込み時です。
先頭の◇をクリックすると新しくブラウザが開くかも。
_HTML_
$total = @roomlist;
$count = int(($total-1)/$lmax);
$pagelink = "Page:";
for($i=0;$i<=$count;$i++){
if($i eq $page){
$pagelink = "$pagelink\[$i] \n";
}else{
$pagelink = "$pagelink\[$i] \n";
}
}#for
$pagelink = "$pagelink";
print "$pagelink\n";
print "
_HTML_
}
}#listing END
##################################################
sub decode {
my($brnum);
if ($ENV{'REQUEST_METHOD'} eq "POST"){
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else{
$buffer = $ENV{'QUERY_STRING'};
}
&decodearg($buffer,$cgi_list);
$title = $FORM{'title'};&err("タイトルが長すぎます。") if(length($title) > ($titlemax*2));
$page = $FORM{'page'};$page = int($page);
$make = $FORM{'make'};
$root = $FORM{'root'};$delete = $FORM{'delete'};
$hotlist = $FORM{'h'};$hotlist = 0 if($hotlist eq '');
$sorttype = $FORM{'s'};
$lmax = $COOKIE{$c_lm}; $lmax = $FORM{'lm'} if ($FORM{'lm'} > 0);
$lmax = $limax if($lmax < 1); $lmax = int($lmax);
$oname = $FORM{'oname'}; &err("名前が長すぎます。") if(length($oname) > ($namemax*2));
$eraseword = $FORM{'eraseword'};
$chat = $FORM{'chat'};
$_ = $chat;$brnum = s/
//ig;
&err("説明の行数が多すぎます。") if($brnum >= $brmax);
}#decode END
##################################################
sub make {#新規話題ルームを設置or管理者による削除
my($dmy,$erase,$chktitle,$room,$rnum,$file,$set,$otitle,$file2,$tm);
my($hst,$tm2,$cnt,$cnt2,@boxlist);
if($delete eq 'on'){
&err("パスワードが違います。") if($root ne $rootpwd);
$buffer=~s/&//g; #余分な部分を削除
(@erase) = split(/erase=/, $buffer); #削除リストを作成
$dmy = shift( @erase);
foreach $erase(@erase){
if(-e "./$logdir/log.$erase.cgi"){
&logdel($erase);
}
}
opendir(DIR,"$logdir");
@readlist = grep(/log/, readdir(DIR));
closedir(DIR);
foreach $file (@readlist){
$file2="./$logdir/$file";
open(DB, $file2);
@lines = ;
close(DB);
$set=shift(@lines);
($otitle) = split(/:#/,$set);
$otitle = unpack("A80",$otitle);
if(($set =~ /$eraseword/) || ($otitle =~ /$eraseword/)){
$erase=$file;
$erase=~s/log\.(.*)\.cgi/$1/;
if(-e "./$logdir/log.$erase.cgi"){
&logdel($erase);
}
}
}
print "Location: $cgidir/$cgi_list?root=$root\n\n";
exit;
}
#タイトルが空だと作成されない
if( $title eq '' ){print "Location: $cgidir/$cgi_list\n\n";exit;}
$chktitle = $title;
$chktitle =~ s/ //g;$chktitle =~ s/ //g;
$room = '';
$tm = time;
$cnt = 0;
opendir(DIR,"$logdir")|| &err("ログのディレクトリが開けません。");
@readlist = grep(/log/, readdir(DIR));
closedir(DIR);
$rnum = '000';
foreach $room (@readlist) {
$room=~s/log\.(.*)\.cgi/$1/;
$rnum = $room if($room > $rnum);
$file="./$logdir/log.$room.cgi";
open(DB, $file) || next;
@lines = ;
close(DB);
$set=shift(@lines);
($otitle) = split(/:#/,$set);
$otitle =~ s/ //g;$otitle =~ s/ //g;
&err("同じタイトルの箱が既にあります。") if($chktitle eq $otitle);
}
#別ファイルのログによって箱作成制限をかける
if(open(DB,$boxmakers)){
seek(DB,0,0); @boxlist = ;
close(DB);
}else{
open(DB,">$boxmakers");
close(DB);
chmod 0600, "$boxmakers";
}
foreach $box (@boxlist) {
($tm2,$otitle,$hst) = split(/:#/,$box);
if($hst eq $host){
$cnt++ if($tm-$tm2 < $seritime);
$cnt2++ if($tm-$tm2 < $seritime2);
}
}
&err("一人連続箱作成制限にかかりました
") if(($cnt >= $sericount) || ($cnt2 >= $sericount2));
$rnum = $rnum?sprintf("%03d",++$rnum):"000";
$file = "./$logdir/log.$rnum.cgi";
$set = "$title:#$vkey:#$sday:#$oname:#$chat:#$host:#$date:#\n";
open(DB,">$file");
print DB $set;
close(DB);
chmod 0600, "$file"; #0666でないとダメかも。
#カウンタファイルを作る
$file = "./$coudir/cou.$rnum.dat";
open(DB,">$file");
print DB "0\n";
close(DB);
chmod 0600, "$file"; #0666でないとダメかも。
#箱作のホストを別ファイルに記録
$set = "$tm:#$title:#$host:#\n";
@boxlist = (@boxlist,$set);
shift(@boxlist) if(@boxlist > 200);
open(DB,">$boxmakers");
seek(DB,0,0); print DB @boxlist;
close(DB);
print "Location: $cgidir/$cgi_log?room=$rnum\n\n";
exit;
}#make END
##################################################
sub logdel {
my($lognum,$file,$acou);
$lognum = $_[0];
$file="./$logdir/log.$lognum.cgi";
if( open(DB, $file) ){
@lines = ;
close(DB);
$file="./$coudir/cou.$lognum.cgi";
open(DB,$file);
$acou = ;
close(DB);
}
else{
err("箱の削除に失敗しました:$lognum");
}
unlink "./$logdir/log.$lognum.cgi";
unlink "./$coudir/cou.$lognum.dat";
}#logdel END
__END__