#! /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通常これが多いEE/p>

#! /usr/local/bin/perl


###InfoWeb��E場合、��E頭のE行を以下��Eように書き換えてください

#! /bin/perl


###mesh,BIGLOBEの場合��E頭のE行を以下��Eように書き換えてください

#! /usr/mesh/bin/perl

#-------------------------------



#-----下記��Eわかる人だけ書き換えてくださいEちめE��と勉強してねEEspan 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 $nameEE/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書き込みフォームEE/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;

}