#!/usr/local/bin/perl ;# 簡易BBS -Type2- version 1.16i for Japanese ;# ;# Script written by Kazu.Y ;# Created on: 02/May/96 (Type1) ;# Created on: 28/May/98 (Type2) ;# Last Modified on: 14/Sep/98 ;# I can be reached at: resq@rescue.ne.jp ;# Scripts Found at: http://www.rescue.ne.jp/ ;# 履歴(History) ;# v1.00 28/May/98 初期版リリース ;# v1.01 31/May/98 画像欄の有無設定,表示バグを修正 ;# v1.02 28/May/98 スペルミス修正,時差調整設定の変更,修正モードの誤動作修正,タグ補正 ;# v1.10 03/Jun/98 表示時の
利用を選択可能とした,修正番号入力時のパスワード欄のクッキー対応,管理キー2連続変更時のトラブル修正
;# v1.10i 01/Aug/98 v1.10のアイコン付きバージョン
;# v1.11i 04/Aug/98 修正機能へのアクションの不具合を修正
;# v1.11i 12/Aug/98 chop処理を変更
;# v1.12i 08/Sep/98 IEで修正時に1行目の改行が無くなるトラブルを改善
;# v1.13i 16/Feb/99 修正処理の強化
;# v1.14i 20/Feb/99 タグ系セキィリティの強化
;# v1.15i 20/Jul/99 クッキーの2000年対応
;# v1.16i 24/Aug/99 クッキーのパス設定の削除

#----------------#
#    初期設定    #
#----------------#

#◆このCGIスクリプトを設置するURL
$reload = 'http://設置するURL/minibbs.cgi';

#◆画面の「終了」リンク先のURL
$modoru = 'http://リンク先のURL';

#◆タイトルバーに表示する名称
$title = '簡易BBS2';

#◆閲覧画面の上部挿入HTML
$head_1 = <<'EOF';

	

簡易BBS2

EOF #◆投稿/修正画面の上部挿入HTML $head_2 = <<'EOF';

簡易BBS2

EOF #◆日本語コード変換ライブラリ require './jcode.pl'; #◆内容が書き込まれる記録ファイルのパスを設定 $file = './dat.cgi'; #◆作業用ファイルのパスを設定 $temp = './tmp.cgi'; #◆参照チェックする 1:yes 0:no (投稿元が$reloadの値を含まない場合に投稿を許可しない) $ref_check = 1; #◆インターネットエスクプローラ利用時に表示フォントを大きくする 1:yes 0:no $IEfont = 1; #◆投稿者のリモートホスト名を表示する 1:yes 0:no $view_host = 1; #◆投稿者のブラウザ名を表示する 1:yes 0:no $view_agent = 1; #◆タイトル文字と背景の色設定 $title_text = '#ffffff'; $title_back = '#888888'; #◆記事間に挿入するタグ $separate = '
'; #◆画像URL記入欄を利用する 1:yes 0:no $image_form = 1; #◆ファイルロックを利用する 1:symlink式 2:open式 0:no $lock = 1; #◆ファイルロックを利用する場合に設定 $tmp = './tmp/'; #テンポラリディレクトリの設定 #◆総受信データサイズ制限(bytes) 0で無制限 $max_size = 3000; #◆1画面に表示する記事件数 $def = 10; #◆書き込み件数の最大登録数の設定 (この件数を超えると古いものから自動削除) # (サーバ負荷を考慮し,大きくしないことが重要) $max = 100; #◆シェルコマンド'cp'の設定 (Pathが通っていればこのままでよい:例 /usr/bin/cp ) $cp = 'cp'; #◆このスクリプトをSJISで設置する場合は'sjis'に、EUCで設置する場合は'euc'に設定 $conv = 'sjis'; #◆時刻調整 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); #----------------------------------------------------------------------------------------------- $body = ""; @wday_array = ('日','月','火','水','木','金','土'); $date_now = sprintf("%01d月%01d日(%s)%02d時%02d分",$mon +1,$mday,$wday_array[$wday],$hour,$min); $date_num = sprintf("%02d%02d%02d%02d%02d",$mon +1,$mday,$hour,$min,$sec); #記事固定番号 #コマンド取得 $CMD_buffer = $ENV{'QUERY_STRING'}; @pairs = split(/&/,$CMD_buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $CMD{$name} = $value; } #入力チェック if ($max_size && $ENV{'CONTENT_LENGTH'} > $max_size) { &error('Bad Length','内容や制御コードすべてを含む総データサイズが制限サイズ'.$max_size.'バイトを超えています.'); } read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/\t//g; #日本語処理 &jcode'convert(*value,$conv); #タグ回避処理 $value =~ s//>/g; $value =~ s/"/"/g; #改行処理 WINDOWS -> UNIX $value =~ s/\r\n/\n/g; #改行処理 MAC -> UNIX $value =~ s/\r/\n/g; #クッキーに使えない文字を削除 if ($name eq 'name' || $name eq 'email') { $value =~ s/\;//g; $value =~ s/\://g; $value =~ s/\,//g; } #記事の削除時 if ($name eq 'target') { push(@REMOVE,$value); } #フォーム変数にセット else { $FORM{$name} = $value; } } #クッキー $cookies = $ENV{'HTTP_COOKIE'}; @pairs = split(/;/,$cookies); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ s/ //g; $DUMMY{$name} = $value; } @pairs = split(/,/,$DUMMY{$reload}); foreach $pair (@pairs) { ($name, $value) = split(/:/, $pair); $COOKIE{$name} = $value; } #ロック $lockname = $reload; $lockname =~ s/\W/_/g; $lockname =~ s/\n//g; if (length($lockname) > 30) { $lockname = substr($lockname,-30,30); } $lockfile = $tmp . $lockname; if ($lock == 1) { &lock; } elsif ($lock == 2) { &lock2; } #マスターキーの確認 if (!open(DB,$file)) { &error('Error','データファイルが見つかりません.'); } $master = ; close(DB); if ($master eq "\n" || $master =~ / /) { &error('Error','データファイルが異常です.'); } chop($master); ($head,$master) = split(/\t/,$master); if ($master =~ /^\$1\$/) { $salt = 3; } else { $salt = 0; } if ($CMD{'cmd'} eq 'setmaster') { &setmaster; } if ($head ne 'masterkey') { $first = 1; &masterkey; } if ($master eq '') { &error('Error','マスターキーの記録が異常です.'); } if (crypt($FORM{'passwd'},substr($master,$salt,2)) eq $master) { $admin = 1; } else { $admin = 0; } #コマンド分岐 if ($CMD{'cmd'} eq 'cmk') { &masterkey; } elsif ($CMD{'cmd'} eq 'rm') { $rm = 1; &view; } elsif ($CMD{'cmd'} eq '') { &view; } elsif ($CMD{'cmd'} eq 'form') { &form; } elsif ($CMD{'cmd'} eq 'form2') { &form2; } elsif ($CMD{'cmd'} eq 'copyright') { ©right; } elsif ($CMD{'cmd'} eq 'dust') { &dust; } elsif ($CMD{'cmd'} eq 'background') { &background; } elsif ($CMD{'cmd'} eq 'key') { &key; } elsif ($CMD{'cmd'} eq 'reload') { &reload; } elsif ($CMD{'cmd'} eq 'new') { &new; } elsif ($CMD{'cmd'} eq 'repost') { &repost; } elsif ($CMD{'cmd'} eq 'next') { &next; } elsif ($CMD{'cmd'} eq 'end') { &end; } elsif ($CMD{'cmd'} eq 'post') { &post; } elsif ($CMD{'cmd'} eq 'home') { &home; } elsif ($CMD{'cmd'} eq 'file') { &file; } elsif ($buffer eq '' || $CMD{'cmd'} eq '') { &error('Bad Request','標準入力にデータがありません.'); } elsif ($CMD{'cmd'} eq 'regist') { ®ist; } elsif ($CMD{'cmd'} eq 'cregist') { $cregist = 1; ®ist; } elsif ($CMD{'cmd'} eq 'remove') { $rm = 1; &remove; } elsif ($CMD{'cmd'} eq 'cform') { &cform; } else { &error('Bad Request','コマンドが指定されていません.'); } if (-e $lockfile) { unlink($lockfile); } exit; #----------------------------------------------------------------------------- sub view { print "Content-type: text/html\n\n"; print <<"EOF"; $title $body $head_1

EOF if (!open(DB,$file)) { &error('Error','データファイルが見つかりません.'); } $action = $reload . '?cmd=form'; $action2 = $reload . '?cmd=form2'; print "
\"更新\""; print "\"投稿\""; print "\"修正\""; if (!$rm) { if ($CMD{'ff'} != 0) { $qurey = "\&ff=$CMD{'ff'}"; } print "\"削除\""; } print "\"終了\"


\n"; print "

"; if ($CMD{'ff'} eq '' || $CMD{'ff'} == 0) { $CMD{'ff'} = 0; print "《最新の記事から$def件》"; } else { print "《↑前のページあり》\n"; } print "

\n"; if ($IEfont) { if ($ENV{'HTTP_USER_AGENT'} =~ /MSIE/i) { $IE = 1; } else { $IE = 0; }} if ($rm) { $action = $reload . '?cmd=remove'; if ($CMD{'ff'} ne '') { $action .= "&ff=$CMD{'ff'}"; } print "

\n"; } $begin = $begin2 = 0; $disp = 0; $start = 0; $line_number = 0; $count = 0; while() { $line_number++; if ($CMD{'ff'} > $line_number) { next; } s/\n//; if ($end) { if (/^boundary\t(.*)\:(.*)/) { $next_data = $line_number; $end = 0; last; } elsif (/^$/ || /^\t$/) { next; } else { $next_data = 0; $end = 0; last; } } if (/^boundary\t(.*)\:(.*)/) { $pre = 1; if ($start) { print "$separate\n"; } $disp = $start = $begin = $begin2 = 1; $number = $1; $boundary = "__$number"; next; } elsif ($begin && /^subject\t(.*)/) { $subject = $1; print "
"; if ($rm) { print "削除 "; } print "$subject
\n"; } elsif ($begin && /^name\t(.*)/) { $name = $1; print "
  • by $name "; } elsif ($begin && /^email\t(.*)/) { $email = $1; if ($email ne '') { print "\"電子メール\"$email "; } } elsif ($begin && /^date\t(.*)/) { $date = $1; print "at $date
    \n"; print "
  • Number:$number "; } elsif ($begin && /^host\t(.*)/) { $host = $1; if ($view_host) { print "Host:$host "; } else { print ""; } } elsif ($begin && /^agent\t(.*)/) { $agent = $1; if ($view_agent) { print "Agent:$agent "; } else { print ""; } } elsif ($begin && /^image\t(.*)/) { $image = $1; } elsif ($begin && /^url\t(.*)/) { $url = $1; } elsif ($begin && /^pre\t0/) { $pre = 0; } elsif ($begin && /^length\t(.*)/) { $length = $1; print "Length:$length bytes

    \n"; } elsif ($begin && /^\t$/) { $begin = 0; print "

\n"; if ($IE) { print ""; } if ($pre) { print "
\n"; }
	}

	elsif ($begin2 && /^\t(.*)/) {

		$value = $1;
		if ($pre) { print "$value\n"; } else { print "$value
\n"; } } elsif ($boundary ne '' && /^$boundary$/) { $begin2 = 0; if ($pre) { print "
\n"; } print "

\n"; if ($image) { print "

\n"; } if ($url) { print " http://$url

\n"; } if (!$cregist && $reg) { $reg = 0; $action = $reload . '?cmd=cform'; print "\n"; print "\n"; print "\n"; print "\n"; print "

\n"; } print "
\n"; if ($IE) { print ""; } $count++; if ($count == $def) { $end = 1; } } } close(DB); if (!$disp) { print "※ このページに記事はありません.

\n"; } if ($next_data) { print "

《次のページあり→》

\n"; } if ($rm) { print "$separate\n"; print "■削除したい記事をチェック(同一投稿キーの場合は複数選択可能\)し、その記事の投稿キーを入力してください.
\n"; print " 削除キー \n"; print "\n"; } $action = $reload . '?cmd=form'; $action2 = $reload . '?cmd=form2'; print "


\n"; print "\"更新\"更新 "; print "\"投稿\"投稿 "; print "\"修正\"修正 "; if (!$rm) { if ($CMD{'ff'} != 0) { $qurey = "\&ff=$CMD{'ff'}"; } print "\"削除\"削除 "; } print "\"終了\"終了 "; if ($next_data) { $action = $reload . "?ff=$next_data"; if ($rm) { $action .= "&cmd=rm"; } print "\"次\"次のページ
\n"; } print "$separate

\n"; # このスクリプトの著作権表示(かならず表示してください) print "

\"MiniBBS2

\n"; print "\n"; if (-e $lockfile) { unlink($lockfile); } exit; } #----------------------------------------------------------------------------- sub form { $action = $reload . '?cmd=regist'; print "Content-type: text/html\n\n"; print <<"EOF"; $title $body $head_2

EOF print <<"EOF";


投稿

名 前 
メール 
題 名 
内 容  記入した通りに表\示する
    
EOF if ($image_form) { print "画 像  http://
\n"; } print <<"EOF"; リンク  http://
削除キー (記事を削除する時に使う)

名前等を記憶させる(できない場合もあります)

EOF if (-e $lockfile) { unlink($lockfile); } exit; } #----------------------------------------------------------------------------- sub form2 { $action2 = $reload . '?cmd=cform'; print "Content-type: text/html\n\n"; print <<"EOF"; $title $body $head_2

EOF print <<"EOF";


内容の修正

  • 既に記録された記事の番号と投稿キーを入力してください.
  • Number 投稿キー


\"マスターキーの変更\"

EOF if (-e $lockfile) { unlink($lockfile); } exit; } #----------------------------------------------------------------------------- sub cform { if ($FORM{'number'} eq '') { &error('Bad Input','番号(Number)を入力してください.'); } if ($FORM{'passwd'} eq '') { &error('Bad Input','その記事の投稿キーを入力してください.'); } if (!open(DB,$file)) { &error('Error','データファイルが見つかりません.'); } $begin = $match = 0; while() { s/\n//; if (/^boundary\t(.*)\:(.*)/) { $pre = 'checked'; $number = $1; $passwd = $2; if ($FORM{'number'} eq $number) { $begin = 1; $boundary = "__$number"; } next; } if (!$begin) { next; } elsif (/^subject\t(.*)/) { $subject = $1; } elsif (/^name\t(.*)/) { $name = $1; } elsif (/^email\t(.*)/) { $email = $1; } elsif (/^host\t(.*)/) { $host = $1; } elsif (/^agent\t(.*)/) { $agent = $1;} elsif (/^image\t(.*)/) { $image = $1; } elsif (/^url\t(.*)/) { $url = $1; } elsif (/^pre\t0/) { $pre = ''; } elsif (/^\t(.*)/) { push(@VALUE,"$1\n"); } elsif (/^$boundary$/) { $match = 1; last; } } close(DB); if ($ENV{'HTTP_USER_AGENT'} =~ /MSIE/i) { shift(@VALUE); } if (!$match) { &error('Not Found',"記事番号$FORM{'number'}が見つかりません."); } if ($passwd eq '') { &error('Bad Data','記事に投稿キーが記録されていません.
管理者に修正を依頼してください.'); } if (!$admin && crypt($FORM{'passwd'},substr($passwd,$salt,2)) ne $passwd) { &error('Authorization Required','投稿キーが合致しません.'); } $value = join('',@VALUE); $value =~ s/\n$//; $action = $reload . '?cmd=cregist'; print "Content-type: text/html\n\n"; print <<"EOF"; $title $body $head_2

EOF if ($admin) { print "

-管理者による修正モード-

\n"; } print <<"EOF";
名 前 
メール 
題 名 
内 容  記入した通りに表\示する
    
EOF if ($image_form) { print "画 像  http://
\n"; } print <<"EOF"; リンク  http://
削除キー EOF if ($admin) { print "(修正後の削除キーは現在のマスターキーになります)

\n"; } else { print "(記事を削除する時に使う)

\n"; } print <<"EOF";


EOF if (-e $lockfile) { unlink($lockfile); } exit; } #----------------------------------------------------------------------------- sub regist { if ($FORM{'name'} eq '') { &error('Bad Input','名前を入力してください.'); } if ($FORM{'email'} ne '' && !($FORM{'email'} =~ /(.*)\@(.*)\.(.*)/)) { &error('Bad Input','メールアドレスの形式が間違っています.'); } if ($FORM{'subject'} eq '') { &error('Bad Input','題名を入力してください.'); } if ($FORM{'value'} eq '') { &error('Bad Input','内容を入力してください.'); } if ($FORM{'image'} =~ / / || $FORM{'image'} =~ m#http://#) { &error('Bad Input','画像URLはプロトコル名(http手順のみ)を省いて1個所のみ入力してください.'); } if ($FORM{'url'} =~ / / || $FORM{'url'} =~ m#http://#) { &error('Bad Input','リンクURLはプロトコル名(http手順のみ)を省いて1個所のみ入力してください.'); } if ($FORM{'passwd'} eq '' || length($FORM{'passwd'}) < 8) { &error('Bad Input','削除キーを8文字以上の半角文字で入力してください.
これは投稿された記事を削除する際に必要なパスワードです.'); } $body_length = length($FORM{'value'}); $FORM{'value'} =~ s/\n/\n\t/g; &encode($FORM{'passwd'}); if ($ref_check) { $ref = $ENV{'HTTP_REFERER'}; $ref =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; if (!($ref =~ /$reload/i)) { &error('Bad Reference','参照元が正しくありません.'); } } $agent = $ENV{'HTTP_USER_AGENT'}; $agent =~ s//>/g; #ホスト名取得----- $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; } #----------------- if (system("$cp $file $temp")) { &error('Error','外部シェルコマンドが使えないか実行できませんでした.
$cp設定等を確認してください.'); } if (!open(TMP,$temp)) { &error('Error','テンポラリーファイルが見つかりません.'); } if ($cregist) { if ($FORM{'old-passwd'} eq '') { &error('Error','旧削除キーが認証されませんでした.'); } if (!open(DB,"> $file")) { &error('Error','データファイルが見つからないか記録できません.'); } $begin = $ok = 0; while () { s/\n//; if (!$ok && /^boundary\t(.*)\:(.*)/) { $number = $1; $cpasswd = $2; if ($FORM{'boundary'} eq $number) { if ($admin || (crypt($FORM{'old-passwd'},substr($cpasswd,$salt,2)) eq $cpasswd)) { $boundary = $number; ® $begin = 1; $boundary = "__$number"; } } } if (!$begin) { print DB "$_\n"; } elsif (/^$boundary$/) { $begin = 0; $ok = 1; } } close(TMP); close(DB); $rm = 1; } else { $boundary = $date_num; $accesses = 1; while () { if (/^boundary\t(.*)\:(.*)/) { $accesses++; }} close(TMP); if (!open(TMP,$temp)) { &error('Error','テンポラリーファイルが見つかりません.'); } if (!open(DB,"> $file")) { &error('Error','データファイルが見つからないか記録できません.'); } $_ = ; print DB; print DB "\n"; ® if ($accesses > $max) { $prt = 1; while() { print DB; if (/^__/) { $prt++; } if ($prt == $max) { last; } } } else { while() { print DB;}} close(TMP); close(DB); } sub reg { if ($FORM{'pre'}) { $FORM{'pre'} = ''; } else { $FORM{'pre'} = '0'; } print DB "boundary\t$boundary\:$passwd\n"; print DB "subject\t$FORM{'subject'}\n"; print DB "name\t$FORM{'name'}\n"; print DB "email\t$FORM{'email'}\n"; print DB "date\t$date_now\n"; if ($FORM{'host'}) { print DB "host\t$FORM{'host'}\n"; } else { print DB "host\t$host\n"; } if ($FORM{'agent'}) { print DB "agent\t$FORM{'agent'}\n"; } else { print DB "agent\t$agent\n"; } print DB "image\t$FORM{'image'}\n"; print DB "url\t$FORM{'url'}\n"; print DB "pre\t$FORM{'pre'}\n"; print DB "length\t$body_length\n"; print DB "\t\n"; print DB "\t$FORM{'value'}\n"; print DB "\n"; print DB "__$boundary\n"; } if (!$cregist) { #クッキー処理 ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 30*24*60*60); $y0="Sunday"; $y1="Monday"; $y2="Tuesday"; $y3="Wednesday"; $y4="Thursday"; $y5="Friday"; $y6="Saturday"; $m0="Jan"; $m1="Feb"; $m2="Mar"; $m3="Apr"; $m4="May"; $m5="Jun"; $m6="Jul"; $m7="Aug"; $m8="Sep"; $m9="Oct"; $m10="Nov"; $m11="Dec"; @youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6); @monthg = ($m0,$m1,$m2,$m3,$m4,$m5,$m6,$m7,$m8,$m9,$m10,$m11); $date_gmt = sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT",$youbi[$wdayg],$mdayg,$monthg[$mong],$yearg +1900,$hourg,$ming,$secg); if ($FORM{'cookie'} eq 'on') { $cook="name\:$FORM{'name'}\,email\:$FORM{'email'}\,passwd\:$FORM{'passwd'}"; } else { $cook="name\:\,email\:\,passwd\:"; } print "Set-Cookie: $reload=$cook; expires=$date_gmt\n"; } $reg = 1; &view; } #----------------------------------------------------------------------------- sub remove { if ($FORM{'passwd'} eq '') { &error('Bad Input','投稿キーを入力してください.'); } if (!@REMOVE) { &error('Bad Input','削除する記事が一つもチェックされていません.'); } $target = join('|',@REMOVE); if (system("$cp $file $temp")) { &error('Error','外部シェルコマンドが使えないか実行できませんでした.
$cp設定等を確認してください.'); } if (!open(DB,"> $file")) { &error('Error','データファイルが見つからないか記録できません.'); } if (!open(TMP,$temp)) { &error('Error','テンポラリーファイルが見つかりません.'); } $_ = ; print DB; $begin = $cr = 0; while () { s/\n//; if ($skip) { $skip = 0; next; } if (/^boundary\t(.*)\:(.*)/) { $number = $1; $passwd = $2; if ($admin || (crypt($FORM{'passwd'},substr($passwd,$salt,2)) eq $passwd)) { if ($number =~ /$target/) { $boundary = "__$number"; $begin = 1; }} } if (!$begin) { print DB "$_\n"; } elsif (/^$boundary$/) { $begin = 0; $skip = 1; } } close(TMP); close(DB); &view; } #----------------------------------------------------------------------------- sub masterkey { print "Content-type: text/html\n\n"; print "$title\n"; print "$body\n"; print "

マスターキーの設定/変更

\n"; if ($first && $message eq '') { print "記事を削除するための管理パスワード(マスターキー)を登録します。

\n"; } else { print "$message

\n"; } print "

\n"; if (!$first) { print "旧マスターキー
\n"; } print "新マスターキー
\n"; print "新マスターキー (確認のためもう一度)

\n"; print "

\n"; print "\n"; if (-e $lockfile) { unlink($lockfile); } exit; } #----------------------------------------------------------------------------- sub setmaster { if ($head ne 'masterkey') { $first = 1; } if ($head eq 'masterkey') { if (crypt($FORM{'old'}, substr($master,$salt,2)) ne $master) { $message = '旧マスターキーが認証されませんでした.'; &masterkey; }} if ($FORM{'new'} =~ /\W/ || $FORM{'new'} eq '') { $message = '新マスターキーに英数字以外の文字が含まれているか空欄です.'; &masterkey; } if ($FORM{'new'} ne $FORM{'new2'}) { $message = '確認のために入力された新マスターキーが一致しません.'; &masterkey; } if (length($FORM{'new'}) < 8) { $message = 'マスターキーには8文字以上を設定してください.'; &masterkey; } &encode($FORM{'new'}); if (system("$cp $file $temp")) { &error('Error','外部シェルコマンドが使えないか実行できませんでした.
$cp設定等を確認してください.'); } if (!open(DB,"> $file")) { &error('Error','データファイルが見つからないか記録できません.'); } print DB "masterkey\t$passwd\n"; if (!open(TMP,$temp)) { &error('Error','テンポラリーファイルが見つかりません.'); } $_ = ; while () { print DB; } close(TMP); close(DB); &view; } #----------------------------------------------------------------------------- sub encode { $now = time; ($p1, $p2) = unpack("C2", $now); $wk = $now / (60*60*24*7) + $p1 + $p2 - 8; @saltset = ('a'..'z','A'..'Z','0'..'9','.','/'); $nsalt = $saltset[$wk % 64] . $saltset[$now % 64]; if (!eval '$passwd = crypt($_[0], $nsalt);') { &error('Error','暗号処理コマンドが使えませんでしたのでこの掲示板システムは利用できません.'); } } #----------------------------------------------------------------------------- sub error { if (-e $lockfile) { unlink($lockfile); } print "Content-type: text/html\n\n"; print "$title\n"; print "$body\n"; print "

$_[0]

\n"; print "

$_[1]

\n"; print "ブラウザの[戻る]ボタンを押して前の画面に移動してください.

\n"; print "\n"; exit; } #----------------------------------------------------------------------------- sub lock { local($retry) = 3; while (!symlink(".", $lockfile)) { if (--$retry <= 0) { &error('Busy','ただ今混雑しております.
時間をおいて再度実行してください.'); } sleep(2); } } #----------------------------------------------------------------------------- sub lock2 { $c = 0; while(-f "$lockfile") { $c++; if ($c >= 3) { &error('Busy','ただ今混雑しております.
時間をおいて再度実行してください.'); } sleep(2); } open(LOCK,">$lockfile"); close(LOCK); } #----------------------------------------------------------------------------- sub copyright { @array = ( "47","49","46","38","39","61","2d","00","1d","00","b3","00","00","00","00","00","40","00","00","ff", "ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff", "ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff", "ff","21","f9","04","01","00","00","00","00","2c","00","00","00","00","2d","00","1d","00","40","04", "d2","10","c8","49","ab","bd","38","67","21","42","f7","5c","20","82","21","57","76","66","b9","a5", "6c","9b","4a","ae","56","7d","02","10","82","62","7d","ab","36","49","e7","32","d8","6b","e2","32", "69","86","18","d4","0d","07","a4","f5","48","50","cf","31","b7","ab","d2","96","46","58","0e","18", "ec","7a","bf","e0","b0","17","6b","fb","f8","b8","49","74","7a","c7","d4","5d","95","6f","f5","6c", "84","5b","6e","47","66","0f","9d","5e","5b","51","e3","51","26","50","1c","4f","7b","7d","44","78", "55","89","4e","82","78","4f","57","73","7b","51","86","8d","7c","76","8e","62","99","9a","9b","9c", "5a","54","42","96","72","91","87","1b","7c","3d","4e","65","84","2d","44","59","a5","8a","80","4c", "94","98","7e","58","3b","65","81","8f","27","2b","70","7f","7f","80","56","a2","14","45","c3","c4", "45","53","92","b1","86","b7","a6","c3","16","66","8d","b5","57","be","7d","3f","24","33","79","be", "92","aa","94","cb","a8","a3","3a","54","9f","6f","29","4d","77","a4","42","bf","c0","6d","82","d0", "9f","d7","31","cd","a9","2c","f2","f3","12","11","00","00","3b"); ℑ } sub background { @array = ( "47","49","46","38","39","61","12","00","12","00","b3","00","00","84","84","84","94","94","94","9c", "9c","9c","a5","a5","a5","ad","ad","ad","b5","b5","b5","bd","bd","bd","c6","c6","c6","ce","ce","ce", "d6","d6","d6","de","de","de","e7","e7","e7","ef","ef","ef","f7","f7","f7","ff","ff","ff","ff","ff", "ff","2c","00","00","00","00","12","00","12","00","40","04","8f","b0","94","73","10","4d","c6","1a", "62","cc","31","c5","50","74","54","41","70","a0","64","08","e3","48","54","08","29","29","c7","69", "0c","9e","87","14","02","b8","71","05","cd","a6","a0","d8","19","68","20","d4","67","f2","81","25", "10","96","4a","72","f4","d9","c4","3e","1c","4b","0c","03","23","51","32","9f","28","2f","03","5e", "fe","70","29","12","f4","20","a9","46","33","31","13","61","50","61","93","33","ad","49","b2","13", "db","74","6e","1c","75","2a","50","5c","28","28","08","09","35","14","6c","4f","58","52","35","40", "4c","12","3b","4d","41","7d","04","42","20","66","7c","57","04","63","72","50","88","50","27","03", "2f","68","98","14","a1","2e","55","41","23","7f","58","03","a5","7c","11","00","00","3b"); ℑ } sub key { @array = ( "47","49","46","38","39","61","1c","00","0a","00","b3","01","00","00","00","00","ff","ff","ff","ff", "ff","ff","84","84","84","c6","c6","c6","ff","ff","00","ff","ff","ff","ff","ff","ff","ff","ff","ff", "ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff", "ff","21","f9","04","01","00","00","01","00","2c","00","00","00","00","1c","00","0a","00","40","04", "4b","30","c8","49","6b","1d","78","54","53","3a","00","96","05","14","06","57","7c","80","d9","ad", "6c","bb","82","d2","1b","ce","d3","c0","0d","c0","50","10","b0","8a","fe","c0","8f","01","27","c1", "7c","68","48","db","8a","a0","09","64","9e","d0","a8","8e","e8","3c","81","9e","c1","ac","0d","16", "90","f9","b8","b3","51","01","f7","02","19","3e","56","e4","24","1b","88","00","00","3b"); ℑ } sub reload { @array = ( "47","49","46","38","39","61","17","00","15","00","b3","00","00","00","00","00","84","84","84","c6", "c6","c6","de","de","de","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff", "ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff", "ff","2c","00","00","00","00","17","00","15","00","40","04","58","90","c8","49","ab","25","80","0c", "21","80","e7","60","08","84","41","b6","85","68","0a","96","9a","ea","92","e6","0b","8e","28","1b", "dc","78","ae","ef","b1","ec","b2","27","11","8a","06","6b","75","3c","c4","61","31","e8","ab","f5", "9a","4e","cd","60","4a","ad","5a","ab","40","68","2a","9b","42","7e","b6","3d","5a","72","16","3d", "21","5f","49","ae","6f","ac","76","8d","39","5c","af","b7","43","27","b6","b5","82","bb","b6","14", "01","00","3b"); ℑ } sub new { @array = ( "47","49","46","38","39","61","17","00","15","00","b3","00","00","00","00","00","84","84","84","c6", "c6","c6","de","de","de","ff","ff","00","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff", "ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff", "ff","2c","00","00","00","00","17","00","15","00","40","04","69","b0","c8","49","ab","2d","a0","0c", "c1","bb","17","00","01","7c","41","b6","81","97","34","92","e6","e7","be","42","a9","71","19","50", "63","2a","dd","c9","41","ef","ff","c0","60","0b","46","8c","0d","5f","ab","4e","52","76","ca","a4", "6c","ac","19","aa","76","c3","b8","98","20","5b","b2","68","d4","0c","be","e0","b0","38","8c","e5", "6e","39","e5","e2","b9","7b","82","8d","de","9e","b4","76","6e","23","88","40","e8","a1","f3","02", "df","e9","53","56","51","4d","80","6b","58","4e","74","5a","2f","69","5c","2c","11","00","00","3b"); ℑ } sub repost { @array = ( "47","49","46","38","39","61","17","00","15","00","b3","00","00","00","00","00","84","84","84","c6", "c6","c6","de","de","de","ff","ff","00","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff", "ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff", "ff","2c","00","00","00","00","17","00","15","00","40","04","6c","b0","c8","49","ab","2d","a0","0c", "21","32","c1","40","28","72","a4","10","64","5b","27","ae","63","69","a2","6e","dc","92","a7","c6", "79","58","a0","ef","3b","c0","d5","bc","a0","50","08","8b","19","5d","b5","54","29","70","0c","fd", "8a","b8","8f","14","13","4b","de","72","c3","d3","b2","78","ec","26","07","e0","b0","78","2c","b6", "76","bd","5c","a3","ef","d6","79","da","6e","4e","75","dc","0c","98","da","d7","db","77","bd","f0", "61","b1","dc","29","7b","00","59","5a","80","70","84","78","86","67","47","66","8b","55","00","11", "00","00","3b"); ℑ } sub next { @array = ( "47","49","46","38","39","61","17","00","15","00","b3","00","00","00","00","00","84","84","84","c6", "c6","c6","de","de","de","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff", "ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff", "ff","2c","00","00","00","00","17","00","15","00","40","04","53","90","c8","49","ab","25","80","0c", "c1","bb","ef","40","08","70","41","b6","7d","68","5a","6a","69","eb","ad","a7","cb","89","a3","b0", "06","78","ae","ef","bc","29","bb","b0","5f","2b","28","a0","19","8f","23","a2","4b","f4","51","0a", "5f","a6","81","74","4a","ad","52","9d","4f","92","2f","0b","65","3d","43","1d","ec","12","6c","f3", "21","cf","60","31","8a","19","de","72","b5","de","77","39","fe","2e","45","00","00","3b"); ℑ } sub dust { @array = ( "47","49","46","38","39","61","17","00","15","00","b3","00","00","00","00","00","00","84","84","00", "84","ad","84","84","84","c6","c6","c6","de","de","de","ff","ff","ff","ff","ff","ff","ff","ff","ff", "ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff", "ff","2c","00","00","00","00","17","00","15","00","40","04","8a","d0","c8","49","ab","35","c0","14", "c2","41","18","5f","08","0e","00","c7","91","9a","09","08","44","60","08","03","fb","95","26","ba", "99","2a","4c","e3","67","76","13","2b","e0","2b","08","20","e1","50","83","a4","72","c9","6c","fa", "78","d0","28","c1","d6","79","59","05","2f","02","2c","b0","a3","76","58","19","01","d1","58","7b", "7e","85","62","30","b9","97","c2","01","de","f0","77","f2","e8","2b","d8","ef","f8","3c","de","0b", "7d","4b","a7","66","40","70","2e","33","70","74","6d","71","89","89","65","6d","68","44","43","5c", "87","3f","61","8f","62","91","8c","93","43","60","90","3b","80","8d","94","9b","96","9d","7c","40", "5b","23","33","73","6c","3f","7f","51","24","11","00","00","3b"); ℑ } sub end { @array = ( "47","49","46","38","39","61","17","00","15","00","b3","00","00","00","00","00","84","84","84","c6", "c6","c6","de","de","de","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff", "ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff", "ff","2c","00","00","00","00","17","00","15","00","40","04","5e","90","c8","49","ab","25","80","0c", "c1","3b","f8","e0","d7","71","41","b6","09","e1","38","82","a4","c9","a5","ea","2b","0a","a5","16", "87","70","57","07","7c","ef","ff","40","57","6c","a8","aa","9d","64","33","e4","c8","48","cc","2d", "85","48","c0","2a","49","83","12","89","c6","81","76","cb","ed","72","99","d7","2b","d8","39","95", "56","6d","1e","56","da","dc","42","97","71","45","eb","7b","08","7e","93","eb","28","b5","52","27", "0f","3f","dd","7e","71","11","00","00","3b"); ℑ } sub post { @array = ( "47","49","46","38","39","61","0e","00","0a","00","b3","00","00","00","00","84","84","84","84","c6", "c6","c6","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff", "ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff", "ff","2c","00","00","00","00","0e","00","0a","00","40","04","2b","10","c8","49","a7","a8","58","06", "30","ae","f8","1f","10","6e","22","68","5e","c0","36","94","96","97","72","43","2c","cb","97","5a", "9e","e2","db","6d","60","3a","4a","27","93","46","10","28","1a","8f","c6","08","00","3b"); ℑ } sub home { @array = ( "47","49","46","38","39","61","12","00","10","00","b3","02","00","00","00","84","84","84","84","ff", "ff","ff","de","de","de","ff","ff","ff","ff","ff","ff","ff","80","80","80","40","40","00","80","ff", "ff","c4","c4","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff", "ff","21","f9","04","01","00","00","02","00","2c","00","00","00","00","12","00","10","00","40","04", "54","50","48","40","a7","bc","98","d2","c4","7b","a7","01","90","1d","86","01","24","40","29","62", "13","a7","69","81","1b","b0","c0","41","95","26","9b","a9","1e","aa","d2","32","84","10","10","43", "cd","66","82","97","f2","85","bc","d4","44","a9","95","ce","69","53","fd","a6","49","9e","eb","ea", "d4","f6","52","39","a7","4b","f9","09","34","4f","28","e1","b0","48","cc","74","cc","70","76","f3", "12","af","c3","25","11","00","3b"); ℑ } sub file { @array = ( "47","49","46","38","39","61","16","00","13","00","b3","04","00","00","00","00","84","84","84","ff", "ff","80","ff","ff","00","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff", "ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff","ff", "ff","21","f9","04","01","00","00","04","00","2c","00","00","00","00","16","00","13","00","40","04", "60","90","c8","49","ab","9d","41","e8","b1","c5","e0","9f","a7","05","80","14","9c","68","aa","a6", "25","91","89","21","27","ac","27","d6","c5","1d","3c","90","58","26","73","b5","8b","4d","27","2a", "82","76","ad","97","d1","73","2c","f2","5c","37","50","ee","f8","24","00","ae","d8","ac","36","5b", "59","09","2d","a7","65","f0","ab","d4","98","cf","e8","e7","ab","f9","8b","aa","a3","4b","dd","7b", "ca","ac","cb","e6","cb","98","74","96","84","b7","e5","2d","56","5b","83","5a","11","00","3b"); ℑ } sub image { print "Content-type: image/gif\n\n"; foreach (@array) { $data = pack('C*',hex($_)); print $data; } if (-e $lockfile) { unlink($lockfile); } exit; } #End_of_Script