#!/usr/local/bin/perl
#-------- 基本データ所得 ---------------
require 'jcode.pl'; # jcode.plのパス 644
$usrdir = 'userdata/'; # ユーザデータを格納するフォルダ
$dat = 'dat'; # ユーザーデータの拡張子(通常dat)
$admpas = 'bbs0000'; # 管理者パスワード
$recordcgi = 'record.cgi'; # このファイルのファイル名(755|705)
$bbsdat = 'bbs.cgi'; # 掲示板ログファイル名 (666|606)
$bbsbak = 'bbsbak.cgi'; # 掲示板過去ログファイル名
$htitle = 'BBS / myrecord : SoS II'; # ヘッダタイトル
$tblwth = '100%'; # テーブルの横幅
$fntsze = '12'; # フォントサイズ
$bgcolor = '#33CC66'; # テーブル背景色
#-------- コメントデコレーション -------
@deckey = (':S:',':I:'); # ←を入力すると↓に変換する
@decwrd = ('SALE!','告知!');
#-------- LOCK FILE --------------------
$lockkey = 1; # ファイルのロック(Mkdir = 1,Symlink=2,No = 0)
$lockfile = './sos.lock'; # ロックファイル名&パス
$method = 'POST'; # アクションメソッド (POST Only)
#-------- メイン動作実行 ---------------
&decode;
&header;
&lock;
if ($Fm{'mode'} eq 'my_record') { &my_record; }
elsif ($Fm{'mode'} eq 'BBS') { &bbs; }
elsif ($Fm{'mode'} eq 'write') { &write; }
else { &bbslogin; }
&unlock;
&footer;
exit;
#=======《 Sub My Record 》===============================================#
sub my_record {
@rcdlines = &get_user("$Fm{'id'}");
if ($ps ne $Fm{'ps'}) { &error("パスワードが違います"); }
if (!@rcdlines) { print qq|あなたの記録は白紙です
\n|; }
else { print qq|$nmの記録
\n|; }
foreach $line (@rcdlines) { print qq|$line
\n|; }
$ct = 0;
&userout;
}
#=======《 Sub BBS login 》===============================================#
sub bbslogin {
&cookie_get;
print qq|
|;
}
#=======《 Sub BBS 》=====================================================#
sub bbs {
if (!$Fm{'page'}) { $Fm{'page'} = 1 }
if ($Fm{'mode'} ne 'write') {
if ($Fm{'id'} ne 'ADMIN' || $Fm{'ps'} ne $admpas) {
@rcdlines = &get_user("$Fm{'id'}");
} else {
$nm = '管理者'; $id = $Fm{'id'}; $ps = $Fm{'ps'};
}
open(IN,"$bbsdat") || &error("$bbsdat 読みこみエラー");
@bbslines = ;
close(IN);
}
($no_lt) = $bbslines[0] =~ /No.(\d+):/;
($no_st) = $bbslines[$Fm{'page'}-1] =~ /No.(\d+):/;
$no_ed = $no_st - 14;
if ($no_ed < 1) { $no_ed = 1; }
print qq|
|;
if (!@bbslines) { print qq|
掲示板の記録は白紙です | }
foreach $count ($Fm{'page'} - 1 .. $Fm{'page'} + 12) {
if (!$bbslines[$count + 1]) { $temp = $count; last; }
$temp = $count + 1;
$bbs = $bbslines[$count];
foreach (0 .. $#deckey) { $bbs =~ s/$deckey[$_]/$decwrd[$_]/g }
($date,$log) = split(/<>/,$bbs,2);
$date = "$date";
print qq|$date$log | }
$bbs = $bbslines[$temp];
($date,$log) = split(/<>/,$bbs,2);
$date = "$date";
print qq|$date$log
|
|
|;
}
#=======《 Sub BBS Write 》===============================================#
sub write {
# if ($l) { require $logcgi; &log('BBS'); }
if ($Fm{'id'} ne 'ADMIN' || $Fm{'ps'} ne $admpas) {
@rcdlines = &get_user("$Fm{'id'}");
} else {
$nm = '管理者'; $id = $Fm{'id'}; $ps = $Fm{'ps'};
}
open(IN,"$bbsdat") || &error("$bbsdat 読みこみエラー");
@bbslines = ;
close(IN);
if ($Fm{'write'} =~ /:#(\w\w\w\w\w\w):/i) {
$set = $Fm{'write'} =~ s/:(#\w\w\w\w\w\w)://g;
foreach (1 .. $set) {
$Fm{'write'} .= '';
}
}
($no) = $bbslines[0] =~ /No.(\d+):/;
$no++;
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time);
@week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
$mon++;
$year -= 100;
$date = sprintf("%02d/%02d/%02d(%s) %02d:%02d:%02d",$year,$mon,$mday,$week[$wday],$hour,$min,$sec);
$temp = substr($date,0,17);
if ($Fm{'id'} ne 'ADMIN' || $Fm{'ps'} ne $admpas) {
if ($bbslines[0] =~ /$temp/ && $bbslines[0] =~ /\[$id:$nm\]/)
{ print qq|連続投稿は出来ません。10分程度間隔を空けて下さい
|; return }
$temp = unshift(@bbslines,"No.$no:$date \[$id:$nm\]<>: $Fm{'write'}\n");
}
else {
$temp = unshift(@bbslines,"No.$no:$date \[$id:$nm\]<>: $Fm{'write'}\n"); }
if ($temp > 100) {
$temp = pop @bbslines;
open(OUT,">>$bbsbak") || &error("$bbsbak 書き込みエラー");
print OUT $temp;
close(OUT); }
open(OUT,">$bbsdat") || &error("$bbsdat 書き込みエラー");
print OUT @bbslines;
close(OUT);
&bbs;
}
#=======《 Sub Get User 》================================================#
sub get_user {
open(IN,"$usrdir$_[0]\.$dat") || &error("ID $_[0]は存在しません");
@_ = ;
close(IN);
if (!@_) { &error("読みこみエラー") }
($id,$nm,$ps,$jb,$ig,$sp,$bp,$bn,$ak,$dd,$hp,$xp,$ab,$db,$av,$wn,$lz,$dt
,$mn,$bg,$xi,$tm,$lf,$fe,$cm,$is,$ht,$fg,$rw,$kl,$dr,$rt,$cr,$ft,$lv,$ex
,$sl,$jf,$js,$re,$ct,$co,$tw,$hm,$pt,$cd,$ci) = split(/<>/,$_[0]);
&error("パスワードが違います") if $Fm{'ps'} ne $ps && $Fm{'ps'} !~ /$admpas/;
$userline = shift(@_);
return @_;
}
#=======《 Sub User Out 》================================================#
sub userout {
$line = join('<>',$id,$nm,$ps,$jb,$ig,$sp,$bp,$bn,$ak,$dd,$hp,$xp,$ab
,$db,$av,$wn,$lz,$dt,$mn,$bg,$xi,$tm,$lf,$fe,$cm,$is,$ht,$fg,$rw,$kl
,$dr,$rt,$cr,$ft,$lv,$ex,$sl,$jf,$js,$re,$ct,$co,$tw,$hm,$pt,$cd,$ci,"\n");
unshift (@rcdlines,$line);
open(OUT,">$usrdir$id\.$dat") || &error("Write Error : $id\.cgi");
print OUT @rcdlines;
close(OUT);
}
#=======《 Sub Lock 》====================================================#
sub lock {
return if !$lockkey;
local($flag) = 3;
if ($lockkey == 1) {
rmdir($lockfile) if (time - (stat($lockfile))[9] > 60);
while (!mkdir($lockfile,0755)) {
--$flag or &error('現在、サーバが混み合っています',1);
sleep(3);
}
}
elsif ($lockkey == 2) {
unlink($lockfile) if (time - (stat($lockfile))[9] > 60);
while (!symlink(".",$lockfile)) {
--$flag or &error('現在、サーバが混み合っています',1);
sleep(3);
}
}
}
#=======《 Sub Unlock 》==================================================#
sub unlock {
if ($lockkey == 1) { rmdir($lockfile) }
elsif ($lockkey == 2) { unlink($lockfile) }
}
#=======《 Sub Decode 》==================================================#
sub decode {
if ($ENV{'REQUEST_METHOD'} eq "POST") {
$post = 1;
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
} else { @pairs = split(/&/, $ENV{'QUERY_STRING'}); }
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
&jcode'convert(*value,'sjis');
$value =~ s/</g;
$value =~ s/>/>/g;
$value =~ s/"/"/g;
$value =~ s/\,/,/g;
$value =~ s/△/▲/g;
$value =~ s/\r\n/
/g;
$value =~ s/\r/
/g;
$value =~ s/\n/
/g;
$Fm{$name} = $value;
}
}
#=======《 Sub Header 》==================================================#
sub header {
print << "END_of_HD";
Content-type: text/html
$htitle
$body
END_of_HD
}
#=======《 Sub Footer 》==================================================#
sub footer {
print << "END_of_CP";
SoS II ©
MISSINGLINK
&
Fayreal
BBS & myrecord for Script of SAGA II
SION
/
SION jam
END_of_CP
foreach (@editor) { print qq|
$_|; }
print qq|\n\n