#! /usr/local/bin/perl
###########################################
### infoBBS Ver.1.3 1998.11.22 by Kaz ###
###########################################
$VERSION = "infobbs Ver.1.3";
#-------------------------------
###RIMNET,DOLPHIN等��E場合、��E頭の�E�行を以下��Eように書き換えてください�E�通常これが多い�E�E/p>
#! /usr/local/bin/perl
###InfoWeb等��E場合、��E頭の�E�行を以下��Eように書き換えてください
#! /bin/perl
###mesh,BIGLOBEの場合��E頭の�E�行を以下��Eように書き換えてください
#! /usr/mesh/bin/perl
#-------------------------------
#-----下記��Eわかる人だけ書き換えてください�E�ちめE��と勉強してね�E�Espan class="s2">-----
#アクセスログ (0=記録しなぁEspan class="s2"> 1=記録する)
$ACCESS_LOG = 1;
#メール送信機��E (0=使わなぁEspan class="s2"> 1=使ぁEspan class="s2">) ↁEspan class="s2">RIMNETでは使えません
$ADMIN_MAIL = 1;
$SENDMAIL = "/usr/local/sbin/sendmail -t";
$NKF = "/usr/local/bin/nkf";
$MAIL = "sky\@tomsawyer.gr.jp";
#クチE��ーをあげる (0=使わなぁEspan class="s2"> 1=使ぁEspan class="s2">)
$COOKIE = 1;
$COOKIE_EXPIRES = "Sun, 31-DEC-2010 23:59:59 GMT";
$COOKIE_DOMAIN = “sf.airnet.ne.jp";
$COOKIE_PATH = Etakeshi/infobbs/";
#-----ここまで---------------------------------
$PERMISSION = 0646;
$LOCK_FILE = "./log/LOCK";
#========== メインルーチン ==========
if($ENV{'REQUEST_METHOD'} =~/GET/) {
$buffer = $ENV{'QUERY_STRING'};
} else {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
#$value =~ tr/+/ /g;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$data{$name} = $value;
}
if($data{'type'} =~ /^write$/) {
print "Set-Cookie: handle $data{'handle'} ; Expires=$COOKIE_EXPIRES; path=$COOKIE_PATH; domain=$COOKIE_DOMAIN;\n";
} else {
$handle="GUEST";
if($COOKIE) {
($code,$handle)=split(" ",$ENV{'HTTP_COOKIE'});
if($handle=~/^$/) {
$handle="GUEST";
print "Set-Cookie: handle $handle ; Expires=$COOKIE_EXPIRES; path=$COOKIE_PATH; domain=$COOKIE_DOMAIN;\n";
}
}
}
print "Content-Type: text/html\n\n\n";
#-$ENV{'HTTP_COOKIE'},$data{'type'},$data{'handle'}-
if($ARGV[1]=~/-m/) {
#MAIL POST
} else {
if($ACCESS_LOG) {
&access_log();
}
if($data{'type'} =~ /^title$/) {
$deleteflag=0;
&title_view();
} elsif($data{'type'} =~ /^read$/) {
&read_view();
} elsif($data{'type'} =~ /^write$/) {
&write();
} elsif($data{'type'} =~ /^reply$/) {
&reply();
} elsif($data{'type'} =~ /^reply_move$/) {
&reply();
} elsif($data{'type'} =~ /^delete$/) {
&delete();
} elsif($data{'type'} =~ /^title_del$/) {
$deleteflag=1;
&title_view();
} else {
print "<h1>KEY WORD ERROR!!</h1>\n\n";
}
}
exit(0);
#========== タイトル一覧の表示 ==========
sub title_view {
$room=$data{'room'};
$permission=$data{'mode'};
open(RD, "./title.html");
while(<RD>) {
if(/^%num/) {
printf "%d\n",$room;
next;
}
if(/^%wri/) {
if($deleteflag) {
print "<INPUT TYPE=submit VALUE=\"削除する\">\n";
} else {
print "<INPUT TYPE=submit VALUE=\"発言を読む\">\n";
if($permission =~ /w/) {
print " <a href=\"./infobbs.cgi?type=reply&room=$room&mode=$permission&mes=0000\" target=\"view\">\n";
print "新規に書き込みをすめE/span></a>\n";
}
}
next;
}
if(/^%form/) {
if($deleteflag) {
printf "<FORM ACTION=\"./infobbs_admin.cgi\" METHOD=GET target=title>\n";
printf "<INPUT TYPE=hidden NAME=type VALUE=delete>\n";
} else{
printf "<FORM ACTION=\"./infobbs.cgi\" METHOD=GET target=view>\n";
printf "<INPUT TYPE=hidden NAME=type VALUE=read>\n";
}
printf "<INPUT TYPE=hidden NAME=room VALUE=%04d>\n",$room;
printf "<INPUT TYPE=hidden NAME=mode VALUE=$permission>\n";
next;
}
if(/^%sel/) {
$file=sprintf("log/list.%03d",$room);
$sum=0;
open(TL, $file);
while(<TL>) {
if(/^#/) {
next;
}
chop;
$code[$sum]=$_;
$sum=$sum+1;
}
close(TL);
$flag=0;
for($i=$sum-1 ; $i>-1 ; $i=$i-1) {
($num,$date,$time,$name,$subject) = split(" ",$code[$i]);
if($flag==0) {
printf "<option value=%03d selected>",$num;
$flag=1;
} else {
printf "<option value=%03d>",$num;
}
$name =~ s/\+/ /g;
$subject =~ s/\+/ /g;
printf "%04s $date $time $name�E�E/span>$subject\n",$num;
}
next;
}
print;
}
close(RD);
return 0;
}
#========== メチE��ージの表示 ==========
sub read_view {
$room=$data{'room'};
$permission=$data{'mode'};
@pairs = split(/&/, $buffer);
$i=0;
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
if($name=~/mes/) {
$mes[$i]=$value;
$i=$i+1;
}
}
$max=$i;
open(RD,"./view.html");
while(<RD>) {
if(/^%mes/) {
last;
}
print;
}
for($i=0 ; $i<$max ; $i=$i+1) {
$file=sprintf("log.%03d.%04d",$room,$mes[$i]);
open(MES,"./log/$file");
$_=<MES>;
($num,$date,$time,$name,$title)=split(" ");
$name =~ s/\+/ /g;
$title =~ s/\+/ /g;
printf "<table border=1 cellpadding=2><tr>\n";
printf "<td bgcolor=#cdcdcd><font color=yellow size=4><b>%04d</b></td>\n",$num;
printf "<td bgcolor=#cdcdcd><font color=cornsilk size=3>%s</td>\n",$date;
printf "<td bgcolor=#cdcdcd><font color=cornsilk size=3>%s</td>\n",$time;
printf "<td bgcolor=#cdcdcd width=80><font color=hotpink size=4><b>%s</b></td>\n",$name;
printf "<td bgcolor=#cdcdcd width=280><font color=cornsilk size=3>%s</td>\n",$title;
printf "</tr><tr><td colspan=5 bgcolor=#cdcdcd>\n";
$remote=<MES>;
chop($remote);
print "<!-- $remote -->\n";
print "<pre>\n";
while(<MES>) {
#chop;
#$_.="<br>\n";
print;
}
close(MES);
print "</pre>\n";
printf "</td></tr><tr>\n";
if($permission =~ /w/) {
printf "<td colspan=5 bgcolor=#cdcdcd align=center >\n";
$url=sprintf("./infobbs.cgi?type=reply&room=%03d&mes=%04d&mode=w",$room,$num);
printf "<a href=\"%s\" target=view>こ��EメチE��ージの返事を書ぁE/span></a>\n",$url;
}
printf "</td></tr></table><br>\n";
}
while(<RD>) {
print;
}
close(RD);
return 0;
}
#========== 書き込み ==========
sub write {
$room=$data{'room'};
$handle2=$data{'handle'};
$title2=$data{'title'};
$message=$data{'message'};
$permission=$data{'mode'};
$title=pack("A40",$title2);
$handle=pack("A10",$handle2);
&deny_message();
if($title=~/^$/) {
$title="(untitled)";
}
$_=$message;
tr/+/ /;
s/\r//g;
@val3cr = split("\n");
if(&lock_on()) {
print "<h2>ただぁE��他��E方が書き込みをしてぁE��す、E/span><br>もう一度書き込みボタンを押してください、E/span></h2>\n";
exit(0);
}
$mes=0;
$file=sprintf("seq.%03d",$room);
open(RD,"./log/$file");
$mes=<RD>;
close(RD);
chop($mes);
$mes=$mes+1;
open(SEQ,"> ./log/$file");
printf SEQ "%04d\n",$mes;
close(SEQ);
chmod($PERMISSION,"./log/$file");
@tm = localtime(time);
$tm[5]+=1900;
$tm[4]++;
$header=sprintf("%04d %04d/%02d/%02d %02d:%02d %s %s ",$mes,$tm[5],$tm[4],$tm[3],$tm[2],$tm[1],$handle,$title);
$file=sprintf("list.%03d",$room);
open(WD,">> ./log/$file");
print WD "$header\n";
close(WD);
chmod($PERMISSION,"./log/$file");
if($ADMIN_MAIL) {
open(MAIL, "| $NKF | $SENDMAIL");
print MAIL "To: $MAIL\n";
printf MAIL "Subject: [InfoBBS:%03d/%04d] $title\n",$room,$mes;
print MAIL "From: \"$handle\" <$MAIL>\n\n";
printf MAIL "%03d $header\n$address\n",$room;
}
$file=sprintf("log.%03d.%04d",$room,$mes);
open(WD,"> ./log/$file");
print WD "$header\n$address\n";
foreach $tmp (@val3cr) {
print WD "$tmp\n";
if($ADMIN_MAIL) {
print MAIL "$tmp\n";
}
}
close(WD);
chmod($PERMISSION,"./log/$file");
if($ADMIN_MAIL) {
close(MAIL);
}
&lock_off();
$data{'mode'}=$permission;
&title_view();
return 0;
}
#========== 返信�E�書き込みフォーム�E�E/span> ==========
sub reply {
$room=$data{'room'};
$mes=$data{'mes'};
$permission=$data{'mode'};
$fpflug=0;
open(RD, "./write.html");
if($data{'type'} =~ /^reply_move$/) {
$adminmode=1;
} else {
$adminmode=0;
}
while(<RD>) {
if(/^%sys/) {
printf "<font size=5>■%d■ 書き込みをすめE/span></font><p>",$room;
if($adminmode) {
printf "<INPUT TYPE=text NAME=room VALUE=%03d SIZE=3 MAXLENGTH=3>\n",$room;
} else {
printf "<INPUT TYPE=hidden NAME=room VALUE=%03d>\n",$room;
}
printf "<INPUT TYPE=hidden NAME=mode VALUE=$permission>\n";
next;
}
if(/^%tit/) {
unless($mes==0) {
$file=sprintf("log.%03d.%04d",$room,$mes);
open(MES,"./log/$file");
$fpflug=1;
$_=<MES>;
($num,$date,$time,$name,$title)=split(" ");
#$title2=pack("a37",$title2=);
$title2=$title;
if(($title2=~/^Re:/)||($adminmode)) {
printf "<INPUT TYPE=text NAME=title SIZE=40 MAXLENGTH=40 value=\"%s\">",$title2;
} else {
printf "<INPUT TYPE=text NAME=title SIZE=40 MAXLENGTH=40 value=\"Re:%s\">",$title2;
}
next;
} else {
printf "<INPUT TYPE=text NAME=title SIZE=40 MAXLENGTH=40>";
next;
}
}
if(/^%txt/) {
unless($mes==0) {
if($fpflug==0) {
$file=sprintf("log.%03d.%04d",$room,$mes);
open(MES,"./log/$file");
$fpflug=1;
$_=<MES>;
($num,$date,$time,$name,$title)=split(" ");
}
$remote=<MES>;
printf "--At [%04d] $name wrote:--\n",$num;
while(<MES>) {
s/^/>/;
print;
}
}
next;
}
if(/^%hdl/) {
if($handle=~/^$/) {
$handle="GUEST";
}
printf "<INPUT TYPE=text NAME=handle VALUE=\"%s\" SIZE=10 MAXLENGTH=10>",$handle;
next;
}
print;
}
if($fpflug==1) {
close(MES);
}
close(RD);
return 0;
}
#========== メチE��ージの削除 ==========
sub delete {
unless($ENV{'SCRIPT_NAME'}=~/infobbs_admin.cgi$/) {
print "<h2>Security Error!!</h2>\n";
exit(0);
}
$room=$data{'room'};
$permission=$data{'mode'};
@pairs = split(/&/, $buffer);
$i=0;
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
if($name=~/mes/) {
$mes[$i]=$value;
$i=$i+1;
}
}
$max=$i;
if(&lock_on()) {
print "<h2>ただぁE��他��E方が書き込みをしてぁE��す、E/span><br>もう一度削除ボタンを押してください、E/span></h2>\n";
exit(0);
}
for($i=0 ; $i<$max ; $i=$i+1) {
$file1=sprintf("./log/list.%03d",$room);
$file2=sprintf("./log/list.%03d.tmp",$room);
open(RD,$file1);
open(WD,"> $file2");
while(<RD>) {
($num,$date,$time,$name,$subject) = split(" ");
if($num==$mes[$i]) {
print WD "#$_";
} else {
print WD;
}
}
close(WD);
close(RD);
unlink($file1);
rename($file2,$file1);
chmod($PERMISSION,$file1);
$file1=sprintf("./log/log.%03d.%04d",$room,$mes[$i]);
$file2=sprintf("./log/bak.%03d.%04d",$room,$mes[$i]);
rename($file1,$file2);
}
&lock_off();
$deleteflag=1;
$data{'mode'}=$permission;
&title_view();
return 0;
}
#========== ファイルロチE�� ==========
sub lock_on {
;$lockfile=sprintf("%s%03d",$LOCK_FILE,$room);
$lockfile=$LOCK_FILE;
if(-e $lockfile) {
for($i=0 ; $i<10 ; $i=$i+1) {
sleep 1;
unless(-e $lockfile) { last; }
}
if($i==10) {
$lockflug=1;
} else {
$lockflug=0;
}
} else {
$lockflug=0;
open(LOCK, ">$lockfile");
close(LOCK);
}
return $lockflug;
}
sub lock_off {
;$lockfile=sprintf("%s%03d",$LOCK_FILE,$room);
$lockfile=$LOCK_FILE;
unlink($lockfile);
return 0;
}
#========== アクセスログ ==========
sub access_log {
$type=$data{'type'};
$room=$data{'room'};
$address=$ENV{'REMOTE_HOST'};
@tm = localtime(time);
$tm[5]+=1900;
$tm[4]++;
open(LOG, ">> ./log/log");
printf LOG "%02d/%02d/%02d %02d:%02d %-6s %03d %s\n",$tm[5],$tm[4],$tm[3],$tm[2],$tm[1],$type,$room,$address;
close(LOG);
return 0;
}
#========== 書き込み禁止発言チェチE�� ==========
sub deny_message {
$message =~ s/#[Ee][Xx][Ee][Cc]/Security Error!!/g;
#if($message=~/www.bekkoame.or.jp\/i/) {
# print "<html><head><title>BLACK LIST HIT!</title></head><body><h2><br><br><br><br>\n";
# print "あなた��E書き込みは許可されておりません、E/span></h2></body></html>\n";
# exit 0;
#}
return 0;
}