#!/usr/local/bin/perl ### kanri.cgi ver 2.03 (2001/08/03) # ----------------------------------------------------------- $ver="ver 2.03 (2001/08/03)"; $script = "./kanri.cgi"; # パスワード作成に使用したsalt $salt = "z8"; # 暗号化した管理パスを入れたファイル $pass_file = "./password.cgi"; # 設定ファイル名称 $SETTINGFILE="/SETTING.TXT"; $USERURL="../../"; $NOWTIME=time(); $p_dir = 0777; $p_txt = 0644; # 保存するデータキーいちらん @SAVEKEY = ( "BBS_TITLE", "BBS_TITLE_PICTURE", "BBS_TITLE_COLOR", "BBS_TITLE_LINK", "BBS_BG_COLOR", "BBS_BG_PICTURE", "BBS_NONAME_NAME", "BBS_NONAME_NAME_KA", "BBS_MAKETHREAD_COLOR", "BBS_MENU_COLOR", "BBS_THREAD_COLOR", "BBS_TEXT_COLOR", "BBS_NAME_COLOR", "BBS_LINK_COLOR", "BBS_ALINK_COLOR", "BBS_VLINK_COLOR", "BBS_THREAD_NUMBER", "BBS_CONTENTS_NUMBER", "BBS_LINE_NUMBER", "BBS_MAX_MENU_THREAD", "BBS_SUBJECT_COLOR", "BBS_PASSWORD_CHECK", "BBS_UNICODE", "BBS_DELETE_NAME", "BBS_LUNISOLAR_CALENDAR", "BBS_WORLD_CALENDAR", "BBS_DECIMAL_CALENDAR", "BBS_HIRAKATA_CHECK", "BBS_NAMECOOKIE_CHECK", "BBS_MAILCOOKIE_CHECK", "BBS_SUBJECT_COUNT", "BBS_NAME_COUNT", "BBS_MAIL_COUNT", "BBS_MESSAGE_COUNT", "BBS_NEWSUBJECT", "BBS_THREAD_TATESUGI", "BBS_AD2", "SUBBBS_CGI_ON", "NANASHI_CHECK", "timecount", "timeclose", "BBS_PROXY_CHECK", "BBS_OVERSEA_THREAD", "BBS_OVERSEA_PROXY", "BBS_RAWIP_CHECK", "BBS_SLIP", "BBS_DISP_IP", "BBS_FORCE_ID", "BBS_NO_ID", "BBS_ADMIN_ID", "BBS_ADMIN_NAME", "BBS_GZIP_CHECK", "BBS_GZIP_PATH", "BBS_LOCATION_CHECK", "BBS_WAIT_MINUTE", "BBS_MAX_RES_COUNT", "BBS_MAX_RES_SIZE" ); # 環境変数からPOSTのでーたをもらう〜 if($ENV{'REQUEST_METHOD'} eq 'POST'){ read(STDIN,$query,$ENV{'CONTENT_LENGTH'}); my (@elements, $element, $key, $value); @elements = split /&/, $query; foreach $element (@elements){ $element=~tr/+/ /; ($key,$value)=split /=/, $element; $value =~ s/%([\dA-Fa-f]{2})/pack("C",hex($1))/ge; $value =~ s/\r//; $FORM{$key} = $value; } } foreach (split(/; /,$ENV{'HTTP_COOKIE'})){ ($key, $value) = split /=/; $cookie{$key} = $value; } if($cookie{'pass'}){$check=" checked";} # 認証 $login=0; if(-e $pass_file){ open(IN,$pass_file); $pass = ; close(IN); $chk = crypt($FORM{'pass'},$salt); if ($pass eq $chk){$login=1;}else{$login_mes="パスワードが違います。";} if (!$FORM{'pass'}){$login_mes="パスワードを入れてください。";} }else{$login=1;} if(!$login){ print "Content-type: text/html; charset=shift_jis\n\n"; print <<"EOF"; 管理室入口 $login_mes

cookie使用
EOF exit; } if($FORM{'cookie'} eq 'checked'){ my $exp = 24 * 60 * 60; $exp *= 30; my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime(time + $exp); $wday = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$wday]; $mon = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mon]; $year = $year+1900;$mday = "0$mday" if ($mday < 10); $expires = "$wday, $mday-$mon-$year 00:00:00 GMT"; print "Set-Cookie: pass=$FORM{'pass'}; expires=$expires; path=/\n"; } if($FORM{'mode'} eq "setting1") { &setting1; } if($FORM{'mode'} eq 'file_edit'){&file_edit;} if($FORM{'mode'} eq 'pass_change'){&pass_change;} if($FORM{'mode'} eq 'del_cookie'){&del_cookie;} &header; #----------------------------------------------------------- if($FORM{'mode'} eq 'setting_all'){&setting_all;} if($FORM{'mode'} eq 'cap'){∩} if($FORM{'mode'} eq "setting") { &setting; } if($FORM{'mode'} eq 'make'){&make;} if($FORM{'mode'} eq 'remove'){&remove;} if($FORM{'mode'} eq 'conv1'){&conv1;} if($FORM{'mode'} eq ''){&b_list;} #----------------------------------------------------------- &footer; sub header{ print "Content-type: text/html; charset=shift_jis\n\n"; print <<"EOF"; 管理室
管理室 

EOF } sub footer{ print <<"EOF";
$ver
EOF exit; } sub setting_all { print <<"EOF";
管理パスワード変更
旧パスワード
新パスワード
確認    
EOF print <<"EOF";
スレッド作成部分右側のタグ
スレッド作成部分下のタグ
ページ中央のタグ
ページ中央のタグ2
ページ一番下のタグ
掲示板一覧
EOF } sub b_list { $file="./board.txt"; if(-e $file){ open(IN,$file); @board=; close(IN); if($board[0] !~/<>/ && @board ne 0){ print "board.txtが旧形式です。"; print "
\n"; print "\n"; print "\n"; print "
\n"; &footer; } print "\n"; foreach(@board){ chomp($_); ($path,$name,$st)=split /<>/; print <<"EOF"; EOF } print "
$name ($path)
リメイク(全部)
\n"; } } #-----------------------------------------------------------make sub make { #データがあるなら検証 if($FORM{'mode2'} eq 'make'){ print <<"EOF";
アカウント名:
掲示板タイトル:
log/を作成しない
EOF &footer;exit; }elsif($FORM{'mode2'} eq 'make2'){ #不正な文字を検証 if(!length($FORM{'bbs'})){ DispError("ERROR!","アカウント名が不正です!"); } if($FORM{'bbs'} =~ /(\.|\/)/){ DispError("ERROR!","アカウント名が不正です!"); } if($FORM{'bbs'} =~ /[^a-zA-Z0-9]/){ DispError("ERROR!","アカウント名が不正です!"); } #パスワードの長さを検証 #if(length($FORM{'PASSWORD'})<4){ # DispError("ERROR!","パスワードは4文字以上にしてください!"); #} #パスワード入力検査 #if($FORM{'PASSWORD'} ne $FORM{'PASSWORD2'}){ # DispError("入力エラー!","ERROR:確認用パスワードが違います!"); #} #アカウント検査 $pass = "../" . $FORM{'bbs'}; $FORM{'PASSWORD'} = $FORM{'bbs'}; if(-e $pass){ DispError("ERROR!","ERROR:そのアカウントは既に使用されています!"); } if($FORM{'BBS_TITLE'} eq ''){ $FORM{'BBS_TITLE'}="掲示板"; } $pass .= $SETTINGFILE; #掲示板フォルダ作成処理 $BBSURL="../" . $FORM{'bbs'}; mkdir($BBSURL,$p_dir); chmod($p_dir,$BBSURL); mkdir("$BBSURL/dat",$p_dir); chmod($p_dir,"$BBSURL/dat"); mkdir("$BBSURL/html",$p_dir); chmod($p_dir,"$BBSURL/html"); mkdir("$BBSURL/i",$p_dir); chmod($p_dir,"$BBSURL/i"); if($FORM{'nolog'} ne "checked"){ mkdir("$BBSURL/log",$p_dir); chmod($p_dir,"$BBSURL/log"); } #セッティングファイルを作成 open(IN,"<./SETTING.TXT"); @default=; close(IN); open(FILE,">$pass"); eval{flock(FILE,2);}; print FILE "$FORM{'bbs'}@" . crypt($FORM{'PASSWORD'},$FORM{'bbs'}) . "\n"; foreach(@default){ if($_=~/^BBS_TITLE=/){print FILE "BBS_TITLE=$FORM{'BBS_TITLE'}\n";next;} print FILE } eval{flock(FILE,8);}; close(FILE); $head = "../" . $FORM{'bbs'} . "/head.txt"; open(FILE,">$head"); close(FILE); open(IN,"<./index.txt"); @indext=; close(IN); $index = "../" . $FORM{'bbs'} . "/index2.html"; open(FILE,">$index"); foreach(@indext){print FILE} close(FILE); $subject = "../" . $FORM{'bbs'} . "/subject.txt"; open(FILE,">$subject"); close(FILE); open(FILE,">>./board.txt"); eval{flock(FILE,2);}; print FILE "$FORM{'bbs'}<>掲示板<>\n"; eval{flock(FILE,8);}; close(FILE); $BBSURL=$USERURL . $FORM{'bbs'} . "/"; chmod($p_txt,"$pass"); chmod($p_txt,"$head"); chmod($p_txt,"$index"); chmod($p_txt,"$subject"); chmod($p_txt,"./board.txt"); &setting; exit; } } #-----------------------------------------------------------setting sub setting { #パスワード検証 my $pass = "../" . $FORM{'bbs'} . $SETTINGFILE; #セッティングファイルを読む open(FILE,$pass); $str=; foreach $str (){ chomp($str); ($name, $value) = split(/=/, $str); $value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; $SETTING{$name} = $value; } close(FILE); $PATH = $USERURL . $FORM{"bbs"} . "/"; $PATH .= "index.html"; if(!-e $PATH){print "index.htmlがありません。\n";} #管理者メニューを表示 #print "Content-type: text/html; charset=shift_jis\n\n"; print <<"EOF";
 
 掲示板管理者メニュー:$FORM{'bbs'} リメイク
EOF }else{ print < する
しない EOF } print <
掲示板タイトル
タイトル画像
タイトル色
タイトル画像のリンク
背景色
背景画像
新規スレッド背景色
スレッド一覧背景色
スレッド背景色
サブジェクトの標準色
テキストの標準色
名前の色
リンクの標準色
選択中のリンク色
訪問済みのリンク色
gzip圧縮を使用する
(する場合チェック)
gzipのパス
Locationを使用する
(する場合チェック)
書き込みウェイトの秒数

※Location不使用の
ときのみ有効
レスの最大書き込み数
レスの最大サイズ(KB)
UNICODEチェック
EOF if($SETTING{'BBS_UNICODE'} eq "change"){ print < する
しない
連続投稿規制

回中
回以上で規制
1ページ中のスレッド数
列挙する書き込み数
メニューのスレッド数
書き込みの行数制限
サブジェクトの文字数制限
名前の文字数制限
メールの文字数制限
本文の文字数制限
スレッド立て待ち数
名前未入力時の名前
名前未入力時の名前
(かちゅ〜しゃ使用者)
削除投稿の名前
管理者のID
IDを置換する
管理者のハンドル
旧暦の表\示
qreki.plが必要)
(する場合チェック)
世界暦の表\示
(する場合チェック)
十\進暦の表\示
(する場合チェック)
ひらがな⇔カタカナ変換
(する場合チェック)
名前クッキーを発行
(する場合チェック)
メールクッキーを発行
(する場合チェック)
名無しさん投稿を排除
EOF if($SETTING{"NANASHI_CHECK"} eq 1){ print < EOF }else{ print < EOF } print <
スレッド作成画面を
別画面へ
(する場合チェック)
スレ作成確認表\示
EOF if($SETTING{"BBS_NEWSUBJECT"} eq 1){ print < EOF }else{ print < EOF } print <
クッキーをオンにしてちょ。
EOF if($SETTING{"SUBBBS_CGI_ON"} eq 1){ print < EOF }else{ print < EOF } print <
IDを使用しない
(する場合チェック)
ID強制表\示
(する場合チェック)
PROXY制限
(する場合チェック)
海外からの書き込み規制
(する場合チェック)
海外からの
スレッド立て禁止
(する場合チェック)
IPを公開する
(する場合チェック)
掲示板のヘッダ
ユーザー設定が異常です!
リモートホストを公開します。
管理人から警告します。
個別の規制(key<>host)
NGワードの設定
EOF &footer; } #-----------------------------------------------------------setting1 sub setting1 { $file = "../" . $FORM{'bbs'} . $SETTINGFILE; open(FILE,"<./board.txt"); @board = ; close(FILE); open(FILE,">./board.txt"); eval{flock(FILE,2)}; foreach(@board){ chop($_); ($path,$name,$st)=split /<>/; if($FORM{'bbs'} eq $path){$name=$FORM{'BBS_TITLE'};} print FILE "$path<>$name<>$st\n"; } eval{flock(FILE,8)}; close(FILE); #パスワード通過後 open(FILE,"<$file"); $first = ; close(FILE); open(FILE,">$file"); eval{flock(FILE,2);}; print FILE $first; foreach $str (@SAVEKEY){ print FILE "$str=" . $FORM{"$str"} . "\n"; } eval{flock(FILE,8);}; close(FILE); chmod($p_txt,"./board.txt"); chmod($p_txt,"$file"); &jump; } sub pass_change { if($FORM{'pass'} ne $FORM{'password0'}){DispError("ERROR","旧パスワードが違います!");} if($FORM{'password1'} ne $FORM{'password2'}){DispError("ERROR","新パスワードが違います!");} $chk = crypt($FORM{'password1'},$salt); open (FILE,">$pass_file"); eval{flock(FILE,2);}; print FILE $chk; eval{flock(FILE,8);}; close(FILE); chmod($p_txt,"$pass_file"); $FORM{'pass'} = $FORM{'password1'}; if($cookie{'pass'}){ my $exp = 24 * 60 * 60; $exp *= 30; my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime(time + $exp); $wday = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$wday]; $mon = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mon]; $year = $year+1900;$mday = "0$mday" if ($mday < 10); $expires = "$wday, $mday-$mon-$year 00:00:00 GMT"; print "Set-Cookie: pass=$FORM{'pass'}; expires=$expires; path=/\n"; } &header; print <<"EOF"; 変更完了。
EOF &footer; } sub file_edit { open(FILE,">$FORM{'file'}"); eval{flock(FILE,2);}; print FILE $FORM{'text'}; eval{flock(FILE,8);}; close(FILE); chmod($p_txt,$FORM{'file'}); if($FORM{'file'}=~/head.txt$/){ if ($SETTING{'BBS_LOCATION_CHECK'} eq 'checked') { print "Location: ./remake.cgi?bbs=$FORM{'bbs'}&key=0\n\n"; } else { print "Content-Type: text/html; charset=shift_jis\n\n"; print < 変更中 変更中 EOF } exit; } &header; if($FORM{'file'}=~/(uerror|chubo|keikoku|arashi|ngword)\.cgi$/){&setting;} &setting_all;&footer; exit; } sub conv1 { open(I,"./board.txt");@b=;close(I);for(@b){chop($_); open(F,"../$_/SETTING.TXT");for$s(){chop($s);($n,$v)=split/=/,$s; $T{$n}=$v}close(F);$S{$_}="$_<>$T{BBS_TITLE}<>\n"}open(F,">./board.txt"); for(@b){chomp($_);print F $S{$_}}close(F);chmod($p_txt,"./board.txt"); print <<"EOF"; 変換完了。
EOF } #-----------------------------------------------------------cap sub cap { #キャップ→帽子→偽り防止 open(IN,"../caps.cgi"); @list = ; close(IN); $fll=0; #---------------追加 if($FORM{'mode2'} eq "add"){ $fll=1; if($FORM{'name'} eq ""){ DispError("ERROR!","名前が入力されていません!") } if($FORM{'password'} eq ""){ DispError("ERROR!","パスが入力されていません!") } foreach (@list) { chomp($_); my ($id,$name,$pass) = split (/<>/); if($FORM{'name'} eq $name) { DispError ("ERROR!","その名前は既に使用されています!") } if($FORM{'password'} eq $pass) { DispError ("ERROR!","そのパスは既に使用されています!") } } open(OUT,">>../caps.cgi"); eval{flock(OUT,2);}; print OUT "$FORM{'time'}<>$FORM{'name'}<>$FORM{'password'}<>$FORM{'memo'}\n"; eval{flock(OUT,8);}; close(OUT); chmod($p_txt,"../caps.cgi"); } #---------------編集 elsif($FORM{'mode2'} eq "edit"){ $fll=1; foreach(@list){ ($id,$name,$pass) = split(/<>/,$_); if($FORM{'id'} eq $id){ $cap="$FORM{'id'}<>$FORM{'name'}<>$FORM{'password'}<>$FORM{'memo'}\n"; }else{ $cap=$_; } push(@caplist,$cap); } open(OUT,">../caps.cgi"); eval{flock(OUT,2);}; foreach (@caplist){print OUT $_;} eval{flock(OUT,8);}; close(OUT); chmod($p_txt,"../caps.cgi"); } #---------------削除1 elsif($FORM{'mode2'} eq "del"){ print <<"EOF";
EOF foreach (@list) { chomp($_); my ($id,$name,$pass,$memo) = split (/<>/); print <<"EOF" EOF } print <<"EOF";
 キャップID名前メモ
$id $name$memo
EOF &footer; } #---------------削除2 elsif($FORM{'mode2'} eq "del2"){ $fll=1; foreach(@list){ ($id,$name,$pass) = split(/<>/,$_); if($FORM{$id} ne "1"){push(@caplist,$_);} } open(OUT,">../caps.cgi"); eval{flock(OUT,2);}; foreach (@caplist){print OUT $_;} eval{flock(OUT,8);}; close(OUT); chmod($p_txt,"../caps.cgi"); } #---------------それ以外 if($fll eq 1){ chmod($p_txt,"../caps.cgi"); print <<"EOF"; 処理完了
EOF &footer; } #########キャップ管理メニュー print <<"EOF";

新規キャップ 名前: パス: メモ:

EOF foreach (@list) { chomp($_); my ($id,$name,$pass,$memo) = split (/<>/); print <<"EOF" EOF } print <<"EOF";
キャップID名前・パスメモ
$id
名前: パス:
メモ:
EOF &footer; } sub del_cookie { print "Set-Cookie: pass=; expires=0; path=/\n"; &header; print <<"EOF"; 完了。
EOF &footer; } #-----------------------------------------------------------remove sub remove { if($FORM{'mode2'} eq 'remove'){ print <
掲示板$FORM{'bbs'}を削除します。よろしいですか?(最終確認)
EOF &footer; exit; }elsif($FORM{'mode2'} eq 'remove2'){ $ENV{'SCRIPT_NAME'} =~ /\/([^\/]+)\/kanri.cgi$/; if (!-e "../$FORM{'bbs'}/" || $FORM{'bbs'} eq "" || $FORM{'bbs'} eq "test" || $FORM{'bbs'} eq "$1" || $FORM{'bbs'} =~ /\//){ DispError("(゚Д゚)ハァ?","(゚Д゚)ハァ?"); } if (-e "../$FORM{'bbs'}"){ &deltree("../$FORM{'bbs'}"); open(IN,"./board.txt"); @list=; close(IN); foreach (@list){ chomp($_); ($path,$name,$st)=split /<>/; if($FORM{'bbs'} ne $path){push(@bbslist,$_);} open (OUT,">./board.txt"); eval{flock(OUT,2);}; foreach (@bbslist){print OUT "$_\n";} eval{flock(OUT,8);}; close(OUT); chmod($p_txt,"../caps.cgi"); } } print "
完了
"; } } sub deltree { (-e $dir."/test/") && die; my $dir=$_[0];opendir(DIR,"$dir");foreach(grep !/^\.\.?$/,readdir DIR) {if(-e "$dir/$_/."){deltree("$dir/$_");}unlink("$dir/$_");}closedir (DIR); rmdir("$dir"); } #----------------------------------------------------------- sub jump { if ($SETTING{'BBS_LOCATION_CHECK'} eq 'checked') { print "Location: ./remake.cgi?bbs=$FORM{'bbs'}&key=0\n\n"; } else { print "Content-Type: text/html; charset=shift_jis\n\n"; print < 変更中 変更中 EOF } exit; } #エラー画面(エラー処理) #DispError(TITLE,TOPIC); sub DispError{ my $title=$_[0]; my $topic=$_[1]; # print "Content-type: text/html; charset=shift_jis\n\n"; #----------------------------------------------------------------------- print < $title
$topic
EOF #----------------------------------------------------------------------- exit; }