#!/usr/local/bin/perl ;# 簡易BBS -Type2- version 2.02 for Japanese ;# ;# Script written by Kazu.Y ;# Created on: 02/May/96 (Type1) ;# Created on: 28/May/98 (Type2) ;# 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.10 05/Jly/98 一部の環境で対応できるように改行処理を変更した. chop処理の変更.
;# v1.20 22/Aug/98 おしらせモードを付加 
;# v1.21 23/Aug/98 おしらせモード時の削除キーの文字数制限違反の改善
;# v1.30 06/Sep/98 改行処理を3種類用意
;# v1.31 08/Sep/98 IEで修正時に1行目の改行が無くなるトラブルを改善
;# v1.32 29/Sep/98 
が閉じないバグを修正
;# v1.33 07/Dec/98 改行有効モードでの
の出力の削除 ;# v1.34 16/Feb/99 修正処理の強化 ;# v2.00 20/Feb/99 ロック方式の大幅変更 ;# v2.01 20/Jul/99 クッキーの2000年対応 ;# v2.02 24/Aug/99 クッキーのパス設定の削除 # CGIを設置するディレクトリ # | # |--/data/ <777> # | |-- data.cgi <666> # | # |- minibbs.cgi <755> # |- jcode.pl <644> #----------------# # 初期設定 # #----------------# #◆このCGIスクリプトを設置するURL $reload = 'http://設置したURL/minibbs.cgi'; #◆画面の「終了」リンク先のURL $modoru = 'http://ホームページなどのURL/'; #◆タイトルバーに表示する名称 $title = '簡易BBS2'; #◆画面ボディー設定 $body = ''; #◆閲覧画面の上部挿入HTML $head_1 = <<'EOF';

簡易BBS2

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

簡易BBS2

EOF #◆日本語コード変換ライブラリ require './jcode.pl'; #◆内容が書き込まれる記録ファイルの名前(パスの設定ではない!) $file = 'data.cgi'; #◆マスターキーを知っている人のみ投稿可能にする(おしらせモード) 1:yes 0:no $master_post = 0; #◆参照チェックする 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_back = '#ffaaaa'; #◆記事間に挿入するタグ $separate = '
'; #◆画像URL記入欄を利用する 1:yes 0:no $image_form = 1; #◆ファイルロックを利用する場合に設定 $tmp_dir = './data/'; #テンポラリディレクトリの設定 #◆総受信データサイズ制限(bytes) 0で無制限 $max_size = 0; #◆1画面に表示する記事件数 $def = 10; #◆書き込み件数の最大登録数の設定 (この件数を超えると古いものから自動削除) # (サーバ負荷を考慮し,大きくしないことが重要) $max = 100; #◆シェルコマンド'cp'の設定 (Pathが通っていればこのままでよい:例 /usr/bin/cp ) $cp = 'cp'; #◆このスクリプトをSJISで設置する場合は'sjis'に、EUCで設置する場合は'euc'に設定 $conv = 'sjis'; #◆時刻調整 # FAQを参照のこと ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); #----------------------------------------------------------------------------------------------- @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); #記事固定番号 $ps = $$; if ($ps eq '') { $ps = $date_num; } $tmp_file = "$ps\.tmp"; $ls = "$tmp_dir\/*.*"; #コマンド取得 $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; } #マスターキーの確認 if (!open(DB,"$tmp_dir\/$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 'copyright') { ©right; } 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','コマンドが指定されていません.'); } exit; #----------------------------------------------------------------------------- sub view { print "Content-type: text/html\n\n"; print <<"EOF"; $title $body $head_1 EOF if (!open(DB,"$tmp_dir\/$file")) { &error('Error','データファイルが見つかりません.'); } $action = $reload . '?cmd=form'; print "

$separate\n"; if ($CMD{'ff'} eq '' || $CMD{'ff'} == 0) { $CMD{'ff'} = 0; print "《最新の記事から$def件》\n"; } else { print "《↑前のページあり》\n"; } if (!$master_post) { print "[投稿(修正)する]\n"; } print "[更新]\n"; print "[終了]\n"; if (!$rm) { if ($CMD{'ff'} != 0) { $qurey = "\&ff=$CMD{'ff'}"; } if (!$master_post) { print "[削除]\n"; } } print "$separate

\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(.*)\:(.*)/) { 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 "\n"; } } elsif ($begin && /^agent\t(.*)/) { $agent = $1; if ($view_agent) { print "Agent:$agent "; } else { print "\n"; } } elsif ($begin && /^image\t(.*)/) { $image = $1; } elsif ($begin && /^url\t(.*)/) { $url = $1; } elsif ($begin && /^pre\t(.*)/) { $pre = $1; } elsif ($begin && /^length\t(.*)/) { $length = $1; print "Length:$length bytes

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

\n"; if ($IE) { print ""; } if ($pre == 1 || $pre eq '') { $pre = 1; print "
\n"; }
	}

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

		$value = $1;
		if ($pre == -1) { print "$value
\n"; } else { print "$value\n"; } } elsif ($boundary ne '' && /^$boundary$/) { $begin2 = 0; if ($pre == 1) { 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 ($rm) { print "$separate\n"; print "■削除したい記事をチェック(同一削除キーの場合は複数選択可能\)し、その記事の削除キーを入力してください.
\n"; print " 削除キー \n"; print "\n"; } $action = $reload . '?cmd=form'; print "

$separate\[投稿/修正する"; if ($master_post) { print "(管理者のみ)"; } print "] "; print "[更新] "; print "[終了] "; if (!$rm) { if ($CMD{'ff'} != 0) { $qurey = "\&ff=$CMD{'ff'}"; } print "[削除] "; } if ($next_data) { $action = $reload . "?ff=$next_data"; if ($rm) { $action .= "&cmd=rm"; } print "[↓次のページ] "; } print "$separate

\n"; # このスクリプトの著作権表示(かならず表示してください) print "
\"MiniBBS2\"
\n"; print "\n"; 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 ($master_post) { print "マスターキー"; } else { print "削除キー"; } print <<"EOF"; (記事を削除する時に使う)

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

EOF $action = $reload . '?cmd=cform'; print <<"EOF";


内容の修正

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


[マスターキーの変更]

EOF exit; } #----------------------------------------------------------------------------- sub cform { if ($FORM{'number'} eq '') { &error('Bad Input','番号(Number)を入力してください.'); } if ($FORM{'passwd'} eq '') { &error('Bad Input','その記事の削除キーを入力してください.'); } if (!open(DB,"$tmp_dir\/$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\t\-1/) { $pre_1 = 'checked'; } elsif (/^pre\t0/) { $pre0 = 'checked'; } elsif (/^pre\t1/) { $pre1 = 'checked'; } elsif (/^pre\t/) { $pre1 = 'checked'; } 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 exit; } #----------------------------------------------------------------------------- sub regist { if ($master_post && !$admin) { &error('Error','マスターキーを知っている管理者しか投稿できません.'); } 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 '') { &error('Bad Input','削除キーを英数字で入力してください.
これは投稿された記事を削除する際に必要なパスワードです.'); } $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; } #----------------- &lock1; if (!open(TMP,"$tmp_dir\/$file")) { &error('エラー','データが読み出せません.'); } if ($cregist) { if ($FORM{'old-passwd'} eq '') { &error('Error','旧削除キーが認証されませんでした.'); } if (!open(DB,"> $tmp_dir\/$tmp_file")) { &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); &lock2; $rm = 1; } else { $boundary = $date_num; $accesses = 1; while () { if (/^boundary\t(.*)\:(.*)/) { $accesses++; }} close(TMP); if (!open(TMP,"$tmp_dir\/$file")) { &error('エラー','データが読み出せません.'); } if (!open(DB,"> $tmp_dir\/$tmp_file")) { &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); &lock2; } sub reg { 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); &lock1; if (!open(TMP,"$tmp_dir\/$file")) { &error('エラー','データが読み出せません.'); } if (!open(DB,"> $tmp_dir\/$tmp_file")) { &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); &lock2; &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"; 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'}); &lock1; if (!open(DB,"> $tmp_dir\/$tmp_file")) { &error('エラー','テンポラリーファイルが作成できません.'); } print DB "masterkey\t$passwd\n"; if (!open(TMP,"$tmp_dir\/$file")) { &error('エラー','データが読み出せません.'); } $_ = ; while () { print DB; } close(TMP); close(DB); &lock2; &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 { 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 lock1 { $list = `ls $ls` || &error("システムエラー1",''); if ($list eq '') { &error("システムエラー2",''); } @lists = split(/\s+/,$list); @lists = grep(/\.tmp/,@lists); local($retry) = 3; while (@lists) { if (--$retry <= 0) { foreach (@lists) { if (-e $_) { unlink; }} &error("Busy(1)",'ただ今混雑しております.
時間をおいて再度実行してください.'); } sleep(1); $list = `ls $ls`; @lists = split(/\s+/,$list); @lists = grep(/\.tmp/,@lists); } } sub lock2 { $list = `ls $ls`; @lists = split(/\s+/,$list); @lists = grep(/\.tmp/,@lists); @lists = grep(!/$tmp_file/,@lists); if (@lists) { if (-e "$tmp_dir\/$tmp_file") { unlink("$tmp_dir\/$tmp_file"); } &error("Busy(2)",'書き込みに失敗しました.
再度実行してください.'); } if (!rename("$tmp_dir\/$tmp_file","$tmp_dir\/$file")) { &error("Busy(3)",'書き込みに失敗しました.
再度実行してください.'); } ; chmod 0666,"$tmp_dir\/$file"; } #----------------------------------------------------------------------------- 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"); print "Content-type: image/gif\n\n"; foreach (@array) { $data = pack('C*',hex($_)); print $data; } exit; } #End_of_Script