#!/usr/local/bin/perl ;# ↑このパスはプロバイダによって違うので調べて設定する ;# (これはこのスクリプトの最初の1行になければならず、それより上に空行があってもいけません。) ;################################################################################################ ;#【 Type-A Artemis BBS Basic Version 3.04 】[Free Script] ;# Ver3.x Arranged by Lime on Jun/10/1999 ;# Last Modified on: Mar/12/2000 ;# arrangement copyright(C)1998-2001 ARTEMIS. ;# CGI page : http://www.artemis.ac/arrange/ ;# Main page : http://www.artemis.ac/ ;# E-mail : webmaster@artemis.ac ;# ◆ ご利用ありがとうございます。利用者は 規約に同意しているものとさせていただきます。 ;#----------------------------------------------------------------------------------- ;#【 Original MiniBBS version 8.8 】[Free Soft] ;# Script written by Kazu.Y ;# I can be reached at: rescue@ask.ne.jp ;# Scripts Found at: http://www.rescue.ne.jp/ ;#------------------------------------------------------------------------------------ # ■ Type-A V3.0から RES機能をつけてデータ形式処理方法を変更しています。 # ■ データ形式は Type-A V3.0未満 及び、オリジナルMiniBBS8.xとは異なります。 # 基本構成(初期設定はこの構成を前提に解説します) # # public_html(ホームページディレクトリ) # | # |-- cgi-bin(任意のディレクトリ) # | # |-- jcode.pl (755) # |-- type-a.cgi (755) メインスクリプト # |-- type-a.dat (666) # |-- NEW 画像 # |-- OLD 画像 # | # |※ログ機能を使わない場合は下記不要 # |-- logview.cgi (755) ログ閲覧用追加 CGI # |-- lognum.dat (666) ログファイル名管理カウントファイル # |-- log (777 dir) これはログ保存用ディレクトリです # # ・type-a.dat は中身が空(0バイト)のファイルをパソコン上で作成して転送する # ・lognum.dat は中身に 0 (半角英数)と記入し転送する # ・( )内はパーミッッション値 # ・jcode.plは中身を全くいじらずにそのままアスキー転送する # ・jcode.plはjperlでは利用できないので注意すること # ・画像ファイル以外ファイルはアスキーモードで取り扱う(転送)すること #---------------------------------------------------------------------------------------- #******************** 初期動作確認段階での最小限の設定部分 ************************** #◆Custom 01◆ このスクリプトを設置するURL $reload = 'http://zukan.net/bbs/type-a.cgi'; #◆Custom 02◆ 日本語コード変換ライブラリのパス require './jcode.pl'; #◆Custom 03◆ データファイル type-a.datのパス $file = './type-a.dat'; #******************** 必ずあなたの環境に合わせて欲しい基本設定 ************************** #◆Custom 04◆ タイトルバーに表示されるこのページのタイトル $site_title = 'あなたのBBS名'; #◆Custom 05◆ 画面に表示されるタイトル(タグごと書きます・画像なら画像タグ) $title = 'あなたのBBS名'; #◆Custom 06◆ タイトルの背景色 $t_back = '#333333'; #◆Custom 07◆ タイトルテーブルの枠線の太さ(0 〜 ピクセル) $border = '1'; #◆Custom 08◆ 最下部 HOME での戻る先を指定 $modoru = 'http://ホームページなどのURL/'; #◆Custom 09◆ 管理用キーワード(パスワード変更画面呼出用) $kanri = 'abcde'; #◆Custom 10◆ 新着未読記事お知らせマーク ON/OFF画像・文字の場合はFONTタグごと書込む $new = ''; $old = ''; #******************** 各種機能を使う場合の設定項目 ************************** #◆Custom 11◆ ROM対応クッキー発行モード 0:OFF 1:ON $rom_mode = 0; #◆Custom 12◆ RES機能を使う 0:OFF 1:ON(全員) 2:ON(管理者のみ) $res_opt = 1; #◆Custom 13◆ RES機能を2に設定した場合 #投稿・RES用に使う特別な名前(半角英数) これをクッキーに記憶させるとRESができます $webmaster = 'webmaster'; #実際に表示する名前 $mastername = "管理者"; #◆Custom 14◆ 投稿フォーム別表示 0:しない 1:する $display = 0; #◆Custom 15◆ ログ保存機能 0:使わない 1:使う $logtype = 0; #******************** ログ機能を使う場合の設定項目 ************************** #◆Custom 16◆ ログ表示用CGIのパス $logview = './logview.cgi'; #◆Custom 17◆ ログファイル名用カウンタ のパス $numfile = './lognum.dat'; #◆Custom 18◆ ログファイル保存用ディレクトリ $base_dir = './log/'; #◆Custom 19◆ ログ名用ヘッダ $loghead = 'log'; #◆Custom 20◆ ログファイルの保存数 $limit = 5; #******************** 必要に応じて設定する項目 ************************** #◆Custom 21◆ タイトル未記入の時に表示する文字列 $mes_title = 'No Subject'; #◆Custom 22◆ BODYタグ(背景画像・背景色・文字色・リンク色 等) $body = ''; #◆Custom 23◆ アンカーのスタイル(色・下線)設定 #ページの基本アンカー色 $anchor = 'A { color:#0000CB; text-decoration:none }'; #RES部分のアンカー色 $anchor_res = 'TD.ResArea A { color:#0000AA; text-decoration:none }'; #◆Custom 24◆ ページ内の基本フォントサイズ $basesize = '2'; #◆Custom 25◆ リンクの基準となるウィンドウ(デフォルトは _blank 別窓を開くです) $basetarget = '_blank'; #◆Custom 26◆ ページ内の ライン (HRやIMG) 不要なら空白 '' にする $horizon = '
'; #◆Custom 27◆ 記事タイトル(Sub)部分 の設定 # 記事タイトルの背景色 $title_back = '#444444'; # 記事タイトルの文字色 $title_color = '#FFFFFF'; # 記事タイトルの文字サイズ $title_size = '3'; #◆Custom 28◆ メッセージ(Mes)部分の設定 # メッセージの文字色 $valuecolor = '#660000'; # メッセージのフォントサイズ $valuefont = '2'; #◆Custom 29◆ RES部分の設定 (RES機能を使う場合) # RESテーブルの枠線 $res_border = 1; # RESテーブルの枠線の色(IE用) $res_bordercolor = '#CCCCCC'; # RESテーブル内の背景色 $res_back = '#EEEEEE'; # RESテーブル内の基本文字色 $res_color = '#000000'; # RESの記事(Mes)のフォントサイズ $res_valuesize = '2'; # RESの記事(Mes)の文字色 $resmes_color = '#660000'; #◆Custom 30◆ Shadowバージョン専用部分 #◆Custom 31◆ Tableバージョン専用部分 #◆Custom 32◆ 投稿内容を管理者にメール ( sendmail等が許可されている場合のみ) # メールしない場合は $mailto $sendmail を設定する必要はありません. # 投稿者がEメールを記入している場合は、返信アドレスにそのEメールが記載されます. # メールする:1 しない:0 $s_mail = 0; $mailto = 'user@mail.host'; # 送信先Eメール $sendmail = '/usr/lib/sendmail'; # 送信スクリプト(sendmail) プロバイダに聞くこと #◆Custom 33◆ 改行方法選択ラジオボタンの表示 あり:0 なし(自動改行に統一:1 表示通りに統一:2) $howselect = 0; #◆Custom 34◆ HTMLタグを使えるようにする設定 # 使える(ユーザー選択あり:1 なし:2) 使えない:0 $tag = 1; #◆Custom 35◆ HTMLタグを使える場合 拒否するタグを指定 (書式はperl文法書を参照) # $tag = 0;にした場合はここは設定不要。 @kyohi = ( '', '<(.|\/)pre(.|\n)*>', '', '', '', '', '<(.*)form(.|\n)*>', '<(.*)td(.|\n)*>', '<(.*)tr(.|\n)*>', '<(.*)table(.|\n)*>', '<(.|\n)*[\s\"\'\n]on(.*)=(.|\n)*>', '<(.|\n)*style=(.|\n)*>', '', ''); #◆Custom 36◆ タイトルのすぐ下位置に表示する文字列 $msg_top1 = ''; $msg_top2 = ''; $msg_top3 = ''; #◆Custom 37◆ 投稿フォームの下位置に表示する文字列 $msg_mid1 = '■ 投稿時、この記事を削除する時に利用する Del pwd を設定.(Cookieに保存されます)
'; $msg_mid2 = '■ このBBSには、前訪問以後の新着未読記事お知らせモードがついています
'; $msg_mid3 = '■ より詳しい使い方に関する説明はここをクリック'; #◆Custom 38◆ 最下部に表示する文字列 $msg_btm1 = '■ 記事削除は、対象記事のdelをチェックし、すぐ上のDel pwd 欄にDel pwdを入力してボタンを押します
'; $msg_btm2 = '■ 削除キーが合致しない記事は削除されません
'; $msg_btm3 = ''; #******************** 必要に応じて設定する項目(機能制限関連) ************************** #◆Custom 39◆ $reloadで設定した設置URL以外のフォームからの投稿を禁止する処置 する:1 しない:0 # 悪戯の防止用ですが、利用サーバやブラウザによっては正規投稿もできなくなる場合もあります $ref_axs = 1; #◆Custom 40◆ 投稿記事毎の最大記録サイズ(bytes) 0で無制限 (目安-日本語1文字 2bytes) $max_size = 0; #◆Custom 41◆ 1ページに表示する件数 (RES機能ON時は親の件数ですので少な目に 10件くらい) $def = 5; #◆Custom 42◆ 書き込み件数の最大登録数の設定です (お勧めレベル 60 くらい迄) # この件数を越えると、ログ機能がある場合は この件数の半数(1/2)が、過去ログファイルとして別保存されます # ログ機能を使わない場合は、越えた記事が自動削除されます。 # サーバ負荷を考慮して、あまり大きくしないことが重要です。(過去ログ機能を利用するなど) # 注意:RES機能ON時 100などにすると1件にRESが2つ付いたとして実際は300記事になります $max = '10'; #◆Custom 43◆ 海外サーバ等で時差が生じる場合は修正します # 海外時間に+9時間する場合 = localtime(time + 9*60*60); # 海外時間に−9時間する場合 = localtime(time - 9*60*60); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); #◆Custom 44◆ クッキーの消化設定 # 最終書き込みから 30日後 30*24*60*60 #           1日後 24*60*60 ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 30*24*60*60); #◆Custom 45◆ 入力形式の設定 標準入力:1(post) その他:0(get) # 投稿ボタンを押して Method not implemented.. 等というエラーが出る場合は get で試すこと # getの場合は文字制限がありますので長い文章等は途中で切れる可能性があります # さらに、getの場合は不要な悪戯を受けてしまう環境になりますので、注意してください # POST:1 GET:0 $method = 1; #◆Custom 46◆ 入力フォームの各サイズ #フォームの長さを揃えたい場合はここを調整 # $f0(名前)、$f1(メール)、$f2(題名)、$f3(内容)、$f4(リンク)、$f5(削除) #IE4.x and Above用 $f0ie = '20'; $f1ie = '40'; $f2ie = '90'; $f3ie = '64'; $f4ie = '90'; $f5ie = '10'; #Netscape4.x 用 及び 上記以外用 $f0 = '20'; $f1 = '40'; $f2 = '70'; $f3 = '69'; $f4 = '70'; $f5 = '10'; #************************************* カスタム設定終了 ************************************ # ・スクリプトの中身を書き替える場合は、perlやCGIやHTMLなどのそれなりの知識が必要です。 #******************************************************************************************* #***** ★STEP 1 ***** @wday_array = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); $date_now = sprintf("%04d.%02d.%02d %s %02d:%02d:%02d",$year +1900,$mon +1,$mday,$wday_array[$wday],$hour,$min,$sec); #---------- ID 絶対変更禁止 削除・お知らせモード・RES機能用 ----------------- $date_num = sprintf("%04d%02d%02d%02d%02d%02d",$year +1900,$mon +1,$mday,$hour,$min,$sec); $date_res = 20500000000000 - $date_num; #------------------ ブラウザ種別用処理 -------------------- $agent = $ENV{'HTTP_USER_AGENT'}; if(($agent =~ /^Mozilla/) && substr($agent,8,1) >= 4) { if($agent =~ /.*MSIE.*/) { @fsize = ("$f0ie","$f1ie","$f2ie","$f3ie","$f4ie","$f5ie"); }else{ @fsize = ("$f0","$f1","$f2","$f3","$f4","$f5"); } }else{ @fsize = ("$f0","$f1","$f2","$f3","$f4","$f5");} #------------------ 入力処理 ----------------------- if ($method eq '1' && $ENV{'QUERY_STRING'} ne '') { &error('【 クエリーエラー 】','不正利用の可能性があります。'); } if ($method eq '1') { $method = 'post'; read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); } else { $method = 'get'; $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); @pairs = (grep(/^how=/,@pairs),grep(!/^how=/,@pairs)); @pairs = (grep(/^tags=/,@pairs),grep(!/^tags=/,@pairs)); @pairs = (grep(/^action=/,@pairs),grep(!/^action=/,@pairs)); 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; if ($name =~ /Res-(\d\d\d\d\d\d\d\d\d\d\d\d\d\d)/){ $name = res_num; $value = $1; } if ($tag > 0 && $FORM{'tags'} eq '1') { foreach (@kyohi) { if (/^$/) { next; } if ($value =~ /$_/i) { &error('【 禁止タグチェック 】','記録できないタグ記述があります。'); } } }else { $value =~ s//>/g; } if ($s_mail && $name eq 'value') { $mail_value = $value; if ($mail_value =~ /\r\n/) { $mail_value =~ s/\r\n/\n/g; } if ($mail_value =~ /\r/) { $mail_value =~ s/\r/\n/g; } } if ($FORM{'action'} eq 'regist') { if ($FORM{'how'} eq '1') { if ($value =~ /\r\n/) { $value =~ s/\r\n/
/g; } if ($value =~ /\n/) { $value =~ s/\n/
/g; } if ($value =~ /\r/) { $value =~ s/\r/
/g; } }else { if (!($value =~ /\n/) && $value =~ /\r/) { $value =~ s/\r/\n/g; } $value =~ s/\n//g; } } #***** ★STEP 2 ***** if($name eq 'value'){ while($value =~ /(\s|
|[ ])$/){ $value = substr($value,0,rindex($value,"$&")); } } if ($name eq 'name' || $name eq 'email') { $value =~ s/\;//g; $value =~ s/\://g; $value =~ s/\,//g; } if ($name eq 'target') { push(@RM,$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 ($FORM{'action'} eq 'password') { &encode; } # パスワード変更の場合 if (-z $file) { $first = 1; &password; exit; } # 初期設定 if ($FORM{'inroom'} eq '' && $FORM{'action'} eq ''){ $inroom = $COOKIE{'last'}; &lastcook; }else{ $inroom = $FORM{'inroom'}; } if ($FORM{'res_num'} ne ''){ $res_mode =1; &html; exit;} #返信モード if ($FORM{'names'} eq $kanri ) { &password; exit; } #パス変更画面 if ($FORM{'action'} eq 'remove') { &remove; } #削除処理 elsif ($FORM{'action'} eq 'regist') { ®ist; } #投稿処理 elsif ($FORM{'action'} eq 'delcook') { &delcookie; } #クッキー消去処理 &html; exit; #------------------------- データを全て読込む処理 (削除・投稿)------------------------ sub Read_all { if (!open(DB,"$file")) { &error('【 ファイルオープンエラー 】',"$file が設定された場所にありません。"); } @lines = ; close(DB); $passwordline = shift(@lines); chop($passwordline); ($header,$password) = split(/:/,$passwordline); if ($password =~ /^\$1\$/) { $salt = 3; } else { $salt = 0; } if(!$first){ if($header ne 'ArtemisBBS type-A v3') { &error('【 ファイルリードエラー 】',"このデータ形式はこのARTEMIS BBSでは使えません。"); }} } sub html { #------------------------- データライン処理 ------------------------ # 管理者チェック if($res_opt eq '2'){ if($COOKIE{'name'} eq $webmaster){ $res_opt = 1; }else{ $res_opt = 0; } } # RES時 表示分データ取出し if($res_mode){ if (!open(DB,"$file")) { &error('【 ファイルオープンエラー 】',"$file が設定された場所にありません。"); } while(){ if($_ =~ /^$FORM{'res_num'}/){ push(@lines,$_); } } close(DB); }elsif($FORM{'display'} eq ''){ # 表示のみの場合 if($FORM{'page'} eq '' || $FORM{'page'} > 0){ if($FORM{'page'} eq ''){ $page = 0; }else{ $page = $FORM{'page'} } $page_end = $page + $def; if (!open(DB,"$file")) { &error('【 ファイルオープンエラー 】',"$file が設定された場所にありません。"); } $password = ; $master = 0; while(){ ($sorts,$type,$number,@temp) = split(/\"\,\"/,$_); if($type eq 'MAS'){ $master++; } if( $master >= $page+1 && $master <= $page_end){ push(@lines,$_); } if($master > $page_end){ if($inroom ne '' && $number > $inroom){ $newinfo = 1; }} } close(DB); if($master < $page_end){$page_end = $master;} chop($password); ($header,$password) = split(/:/,$password); if($header ne 'ArtemisBBS type-A v3') { &error('【 ファイルリードエラー 】',"このデータ形式はこのARTEMIS BBSでは使えません。"); } # 全データを読込んでいる場合 }elsif($FORM{'page'} eq 0){ $page = 0; $page_end = $page + $def; $master = 0; foreach(@lines){ ($sorts,$type,$number,@temp) = split(/\"\,\"/,$_); if($type eq 'MAS'){ $master++; } if( $master >= $page+1 && $master <= $page_end){ push(@templines,$_); } if($master > $page_end){ if($inroom ne '' && $number > $inroom){ $newinfo = 1; }} } @lines = @templines; if($master < $page_end){$page_end = $master;} } } #------------------------- プリントアウト------------------------ print "Content-type: text/html\n\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "$site_title\n"; print "$body\n"; #--- 入力フォーム画面 --------------------------------# if($display && $FORM{'display'} eq '' && !$res_mode){ #***** ★STEP 3a ***** print "\n"; print "\n"; print "
$title
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "
\n"; print "$msg_top1\n"; print "$msg_top2\n"; print "$msg_top3\n"; }else{ #***** ★STEP 3 ***** print "\n"; print "
$title
\n"; print "$msg_top1\n"; print "$msg_top2\n"; print "$msg_top3
\n"; print "\n"; print "
\n"; print "\n"; if($res_mode){ print "\n"; print "\n"; print "***************** RESPONSE MODE [返信投稿用モード] *****************
\n"; print "■ 投稿したメッセージは、下の記事の最後に付け足されます
\n"; print "■ Submit/Reload ボタンで通常表\示に戻ります。
"; }else{ print "\n"; } print "\n"; print "\n"; print "\n"; if(!$res_mode){ print "\n"; } print "\n"; if($howselect == 0) { print "\n"; }else{ print "\n"; } if($tag == 0){ print "\n"; }elsif($tag == 1){ print "\n"; }else{ print "\n"; } print "\n"; print "\n"; print "\n"; print "
Name
Mail
Sub
Mes
改行 自動"; print "入力通り
HTMLタグ ON "; print "OFF
Link
Del pwd (削除時使用)

\n"; print "\n\n"; print "$msg_mid1\n"; print "$msg_mid2\n"; print "$msg_mid3
\n"; if($display && !$res_mode){ print "$horizon\n";} } #------------------------------- 記録記事の出力 ----------------------------------# if($FORM{'display'} eq '' || $res_mode){ print "
\n"; print "\n"; foreach (@lines) { ($sorts,$type,$number,$pwd,$name,$email,$host,$agent,$date,$subject,$value,$url,$how,$tags,$form_opt1,$form_opt2) = split(/\"\,\"/,$_); $form_opt2 =~ s/\"\n?$//; if($rom_mode || ($COOKIE{'name'} ne '')) { if($inroom ne '' && $number > $inroom){ $mark = $new; }else{ $mark = $old; } }else{ $mark = $old; } if($type eq 'MAS'){ print "$horizon\n\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; if(!$res_mode){ print "\n"; } print "
$mark$subject\n"; print "del\n"; if($res_opt){ print " \n"; } print "
\n"; if ($email) { print "Name: $name " . "\n"; } else { print "Name: $name " . "\n"; } print "Date: $date\n"; print "
\n"; if ($how == 1) { print "$value

\n"; } else { print "

$value
\n"; } #***** ★STEP 4 ***** if ($url) { print "LINK : $url\n"; } print "
\n"; #***** ★STEP 5 ***** print "
$host ・ $agent
\n\n"; }elsif($type eq 'RES'){ print "\t\n"; print "\t
\n"; print "\t\n"; print "\t
\n"; print "\t\n"; print "\t\n"; if(!$res_mode){ print "\t\n"; } print "\t
$mark\n"; if ($email) { print "\t Name: $name " . "\n"; } else { print "\t Name: $name " . "\n"; } print "\t Date:$datedel
\n"; if ($how == 1) { print "\t$value
\n"; } else { print "\t
$value
\n"; } #***** ★STEP 4 ***** if ($url) { print "\t Link : $url\n"; } print "\t
\n"; } } print "$horizon\n\n"; if($newinfo){ print "
$new次ページ以降に未読記事が見つかりました
\n";} #--- 改ページ処理 ------------------------------------# if(!$res_mode){ $page_next = $page_end; $i = $page+1; $j = $page_end; print "\n\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; #***** ★STEP 6 ***** print "\n"; if ($#lines >= 0) { if ($page_end ne $master) { print "\n"; print ""; print "This Page $i \- $j \n"; print "\n"; print " \n"; }else{ print "This page $i \-> LAST

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

Delete pwd \n"; print "
最大記録件数 $max HOME

\n\n"; print "$msg_btm1\n"; print "$msg_btm2\n"; if($res_opt){ print "■ RESの付いた親記事は管理者のみ削除できます。(RESも全て削除されます)
\n"; } print "$msg_btm3

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

\n"; print "\n\n"; exit; } #------------------------- 投稿処理 ------------------------ sub regist { #------------------------- 投稿データチェック ------------------------ if ($FORM{'subject'} eq '' && $FORM{'value'} eq '') { $inroom = $COOKIE{'last'}; &lastcook; &html; exit; } if ($ref_axs) { $ref = $ENV{'HTTP_REFERER'}; $ref_url = $reload; $ref_url =~ s/\~/.*/g; if (!($ref =~ /$ref_url/i)) { &error('【 送信元制限 】',"「$reload」以外からの投稿は受け付けられません。"); } } if ($FORM{'names'} eq '') { &error('【 記入漏れチェック 】','投稿者を記入してください。'); } $FORM{'names'} =~ s//>/g; if ($FORM{'email'} ne '' && !($FORM{'email'} =~ /(.*)\@(.*)\.(.*)/)) { &error('【 メール形式チェック 】','メールアドレスの形式が間違っています。'); } $FORM{'email'} =~ s//>/g; if ($FORM{'pwd'} eq '' || $FORM{'pwd'} =~ /\W/ || length($FORM{'pwd'}) > 10) { &error('【 記入漏れチェック 】','ボタンの右側にある削除キー欄に10文字以内の半角英数字で記入してください.
これは記事の削除時に利用するものです。'); } #***** ★STEP 7 ***** if ($FORM{'subject'} eq '') { $FORM{'subject'} = $mes_title;} #***** ★STEP 8 ***** if ($FORM{'subject'} eq '' && $FORM{'types'} eq 'MAS') { &error('【 記入漏れチェック 】','題名を記入してください。'); } $FORM{'subject'} =~ s//>/g; if ($FORM{'value'} eq '') { &error('【 記入漏れチェック 】','内容を記入してください。'); } if ($max_size) { $value_size = length($FORM{'value'}); if ($value_size > $max_size) { &error('【 データサイズ制限 】',"最大記録サイズ$max_sizeを超えています. 現在$value_sizeサイズです。"); } } if ($FORM{'url'} ne '' && !($FORM{'url'} =~ m#(.*)tp(.*)://#)) { &error('【 URL形式チェック 】','URLを正しく記入してください。'); } if ($FORM{'url'} =~ m#^(.*)tp(.*)://$#) { $FORM{'url'} = ''; } &cookie; $cook="name\:\:$FORM{'names'}\,email\:\:$FORM{'email'}\,pwd\:\:$FORM{'pwd'}\,url\:\:$FORM{'url'}\,last\:\:$date_num"; print "Set-Cookie: $reload=$cook; expires=$date_gmt\n"; #-- リムネット専用ホスト取得ルーチンの入れ替え位置 : ここから --# $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if($host eq ''){ $host = $addr; } if($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; } #-- リムネット専用ホスト取得ルーチンの入れ替え位置 : ここまで --# &encode2($FORM{'pwd'}); &Read_all; #------------------------- 既存データ数チェック ------------------------ if($FORM{'types'} eq 'MAS'){ if($logtype){ $borderline = ($max/2);}else{ $borderline = $max-1;} $master = 0; $current =0; foreach $line (@lines){ ($sorts,$type,@temp) = split(/\"\,\"/,$line); if($type eq 'MAS'){ $master++; } if($master <= $borderline){ $current++; } } }elsif($FORM{'types'} eq 'RES'){ foreach $line (@lines){ ($sorts,$type,$number,@temp) = split(/\"\,\"/,$line); if($number eq $FORM{'master_num'}){ $parent = 1; } } if(!$parent){ &error('【 データチェック 】','親記事が既に削除されている可能性があります。');} } #------------------------- 過去ログ処理------------------------ if ($max <= $master) { if($logtype){ @loglines = @lines[$current..$#lines]; @lines = @lines[0..($current-1)]; if (!open(NM,"$numfile")) { &error('【 ファイルオープンエラー 】',"過去ログファイルの名前管理用カウンタファイル
を呼び出せません。
これ以上の書き込みができません。
パーミッションを確認してください
管理者へ連絡してください。"); } $lognum = ; $lognum++; close(NM); if(!open(NM,">$numfile")) { &error('【 ファイルライトエラー 】',"過去ログファイルの名前管理用カウンタファイル
に書込めません。
これ以上の書き込みができません。
パーミッションを確認してください
管理者へ連絡してください。"); } print NM $lognum; close(NM); if($lognum > $limit) { $delnum = $lognum-$limit; $delname = sprintf("%04d",$delnum); $delfile = $base_dir . "$loghead$delname\.dat"; if(!unlink("$delfile")) { $ ;} } $logname = sprintf("%04d",$lognum); $logname = $base_dir . "$loghead$logname\.dat"; if(!open(LOG,">>$logname")){ &error('【 メイクファイルエラー 】',"新しいログファイルの作成 又は、
書き込みができません。
書き込めるディレクトリがありません。
管理者へ連絡してください。"); } print LOG "$header\:\n"; print LOG @loglines; close(LOG); }else{ @lines = @lines[0..($current-1)];} } #------------------------- 投稿記事書き込み ------------------------ if($FORM{'names'} eq $webmaster){ $FORM{'names'} = $mastername; $ChgN=1; } if($FORM{'types'} eq 'RES'){ $master_num = $FORM{'master_num'} }else{ $master_num = $date_num; } push(@lines,"$master_num$date_res\"\,\"$FORM{'types'}\"\,\"$date_num\"\,\"$pwd\"\,\"$FORM{'names'}\"\,\"$FORM{'email'}\"\,\"$host\"\,\"$agent\"\,\"$date_now\"\,\"$FORM{'subject'}\"\,\"$FORM{'value'}\"\,\"$FORM{'url'}\"\,\"$FORM{'how'}\",\"$FORM{'tags'}\",\"$FORM{'forms1'}\"\,\"$FORM{'forms2'}\"\n"); @results = sort @lines; @lines = reverse(@results); if (!open(DB,">$file")) { &error('【 ファイルライトエラー 】',"$file へ書き込みできません。 パーミッションを確認してください。"); } print DB "$passwordline\n"; print DB @lines; close(DB); #------------------------- 表示復帰用処理------------------------ if($ChgN){ $FORM{'names'} = $webmaster; } $COOKIE{'name'} = $FORM{'names'}; $COOKIE{'email'} = $FORM{'email'}; $COOKIE{'pwd'} = $FORM{'pwd'}; $COOKIE{'url'} = $FORM{'url'}; $inroom = $date_num; if ($s_mail) { &e_mail; } $FORM{'page'} = 0; &html; exit; } #------------------------- クッキー用日付作成------------------------ sub cookie { $y0="Sunday"; $y1="Monday"; $y2="Tuesday"; $y3="Wednesday"; $y4="Thursday"; $y5="Friday"; $y6="Saturday"; @youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6); $m0="Jan"; $m1="Feb"; $m2="Mar"; $m3="Apr"; $m4="May"; $m5="Jun"; $m6="Jul"; $m7="Aug"; $m8="Sep"; $m9="Oct"; $m10="Nov"; $m11="Dec"; @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); } #------------------------- クッキー消去処理 ------------------------ sub delcookie { if($COOKIE{'last'} ne ''){ $COOKIE{'name'} = ''; $COOKIE{'email'} = ''; $COOKIE{'pwd'} = ''; $COOKIE{'url'} = ''; $COOKIE{'last'} = ''; $inroom = ''; $rom_mode = 0; &cookie; print "Set-Cookie: $reload=\n"; &html; exit; } } #------------------------- 訪問時間更新処理 ------------------------ sub lastcook{ if($rom_mode || ($COOKIE{'name'} ne '')){ &cookie; $cook="name\:\:$COOKIE{'name'}\,email\:\:$COOKIE{'email'}\,pwd\:\:$COOKIE{'pwd'}\,url\:\:$COOKIE{'url'}\,last\:\:$date_num"; print "Set-Cookie: $reload=$cook; expires=$date_gmt\n"; } } #------------------------- エラー処理 ------------------------ sub error { print "Content-type: text/html\n\n"; print "\n"; print "\n"; print "$site_title\n"; print "$body\n"; print "\n"; print "
\n"; print "$title

\n"; print "$_[0]

\n"; print "$_[1]

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

\n"; print "\n\n"; exit; } #------------------------- 削除処理 ------------------------ sub remove { &Read_all; $target = join('|',@RM); if($target){ if (crypt($FORM{'pwd'}, substr($password,$salt,2)) eq $password) { $admin = 1; } foreach $line (@lines) { ($sorts,$type,$number,$pwd,@others) = split(/\"\,\"/,$line); #------------ 子持ち・管理者確認 ------------ if($templine ne ''){ if($sorts !~ /^$tempnum/){ $templine = ''; } elsif(!$admin){ push(@NEW,$templine); $templine = '';} elsif($admin){ $number = $tempnum; } } if ($number =~ /$target/) { if (!$admin && crypt($FORM{'pwd'}, substr($pwd,$salt,2)) ne $pwd) { push(@NEW,$line);} elsif($type eq 'MAS'){ $templine = $line; $tempnum = $number;} }else { push(@NEW,$line); } } if (!open(DB,">$file")) { &error('【 ファイルライトエラー 】',"$file へ書き込みできません。 パーミッションを確認してください。"); } print DB "ArtemisBBS type-A v3\:$password\n"; print DB @NEW; close(DB); @lines = @NEW; } $FORM{'page'} = 0; &html; } #------------------------- パスワード処理画面 ------------------------ sub password { print "Content-type: text/html\n\n"; print "\n"; print "\n"; print "\n"; print "$site_title\n"; print "$body\n"; print ""; print "\n"; print "
\n"; print "$title
\n"; print "

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

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

\n"; } else { print "$message

\n"; } print "

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

\n"; print "

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


\n"; print "この管理者用パスワードは、全ての記事を削除する事ができるパスワードです。
\n"; print "初回設定以後にこのパスワードを変更する場合は、スクリプト内の\$kanriに設定した
\n"; print "キーワード($kanri)を 投稿 名前\欄 に入れて、Submitを押します。
\n"; print "この画面が呼び出されますので、新パスワードを設定してください。

\n"; print "設定解説を読んでもわからない事などは ARTEMIS SupportBBSへどうぞ。
\n"; print "SupportBBSご利用の際は
1.どのスクリプトのどのバージョン & タイプ か? (例:Type-A V3.0 table)
\n"; print "2.初期動作確認はしているか?
3.何をどうしたいのか?
を詳しく書いてください。

"; } # このスクリプトの著作権表示(かならず表示してください) print "\n"; print "\n\n"; } #------------------------- パスワード 確認------------------------ sub encode { if (-z $file) { $first = 1; } &Read_all; if (!$first && crypt($FORM{'password_old'}, substr($password,$salt,2)) ne $password) { $message = '旧パスワードが認証されませんでした。'; &password; exit; } if ($FORM{'pwd'} =~ /\W/ || $FORM{'pwd'} eq '') { $message = '新パスワードに英数字以外の文字が含まれているか空欄です。'; &password; exit; } if ($FORM{'pwd'} ne $FORM{'pwd2'}) { $message = '確認のために入力された新パスワードが一致しません。'; &password; exit; } &encode2($FORM{'pwd'}); if (!open(DB,">$file")) { &error('【 ファイルライトエラー 】',"$file へ書き込みできません。 パーミッションを確認してください。"); } print DB "ArtemisBBS type-A v3\:$pwd\n"; if(!$first){ print DB @lines; } close(DB); $FORM{'page'} = 0; &html; } #------------------------- 暗号化処理 ------------------------ sub encode2 { $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 '$pwd = crypt($_[0], $nsalt);') { &error('【 サーバ不適合 】','暗号処理コマンドが使えませんので設置できません。'); } } #------------------------- メール処理 ------------------------ sub e_mail { if (!open(OUT,"| $sendmail $mailto")) { return; } print OUT "To: $mailto\n"; if ($FORM{'email'} ne '') { print OUT "From: $FORM{'email'}\n"; } else { print OUT "From: $mailto\n"; } $subject = "[$site_title] 新着情報"; &jis("Subject: $subject"); print OUT "$msg\n"; print OUT "Content-Transfer-Encoding: 7bit\n"; print OUT 'Content-Type: text/plain; charset=iso-2022-jp' . "\n\n\n"; &jis("投稿者: $FORM{'names'}"); print OUT "$msg\n"; &jis("Eメール: $FORM{'email'}"); print OUT "$msg\n"; &jis("題名: $FORM{'subject'}"); print OUT "$msg\n"; &jis("\n$mail_value"); print OUT "$msg\n\n"; &jis("URL記入欄: $FORM{'url'}"); print OUT "$msg\n"; close(OUT); } sub jis { $msg = $_[0]; &jcode'convert(*msg, 'jis'); } __END__