#!/usr/local/bin/perl#---------------------------------------## PETIT BOARD v5.22 (2001/03/21) ## Copyright(C) Kent Web 1997-2001 ## webmaster@kent-web.com ## http://www.kent-web.com/ ##---------------------------------------##---------------------------------------## PETIT BOARD Next 3.6 (2001/05/15) ## 改造者:立川 よーま 2000-2001 ## webmaster@tri.site.ne.jp ## http://tri.site.ne.jp/ ##---------------------------------------##---------------------------------------## Aqua for Petit Board ## Ver2.0 (2001/06/17) ## 改造者:立川 よーま 2000-2001 ## webmaster@tri.site.ne.jp ## http://tri.site.ne.jp/ ##---------------------------------------## バージョン情報$ver = 'PETIT BOARD v5.22';$next = 'Aqua for Petit Board v2.0';#--- [注意事項] ------------------------------------------------## 1. このスクリプトはフリーソフトです。このスクリプトを使用した ## いかなる損害に対して作者は一切の責任を負いません。 ## 2. 設置に関する質問はサポート掲示板にお願いいたします。 ## 直接メールによる質問は一切お受けいたしておりません。 ##---------------------------------------------------------------##============## 設定項目 ##============## 文字コードライブラリ取込require './jcode.pl';# 初期設定ライブラリ読み込みrequire './pref.cgi';#============## 設定完了 ##============## メイン処理&decode;&axs_check;if ($mode eq "howto") {$modename = "掲示板の使い方"; &howto; }elsif ($mode eq "find") {$modename = "ワード検索"; &find; }elsif ($mode eq "usr_del") { &usr_del; }elsif ($mode eq "regist") { ®ist; }elsif ($mode eq "res") { &res_form; }elsif ($mode eq "admin") {$modename = '管理人モード'; &admin; }elsif ($mode eq "image") {$modename = 'イメージサンプル'; ℑ }elsif ($mode eq "past") {$modename = '過去ログモード'; &past; }&html_log;#--------------## 記事表示部 ##--------------#sub html_log { # クッキーを取得 &get_cookie; # フォーム長を調整 &get_agent; # ヘッダを出力 if ($ImageView == 1) { &header('ImageUp'); } else { &header; } # タイトル/カウンタ処理 if ($banner1 ne "") { print "$banner1

\n"; } &dlog_1; print "$title\n"; &dlog_2; print <<"HTML";
\"トップにもどる\"\"使い方\"\"ワード検索\"HTML # 過去ログのリンク部を表示 if ($pastkey) { print "\"過去ログ\"\n"; } print <<"EOM";管理用配布サイト


EOM # 投稿フォーム表示 ®istform; &dlog_3; # ページ区切り処理 $start = $page + 1; $end = $page + $p_log; # 記事を展開 open(IN,"$logfile") || &error("ログファイルが開けません:$logfile"); $top = ; $i=0; $flag=0; print "

\n"; # ログ書き出し処理 ▽ここから # データー形式:記事番号,レスのフラグ,投稿日,投稿者,投稿者のメール,記事のタイトル, # 記事,ホームページ,投稿者のホスト,パスワード,記事の文字色,アイコン,テーブル背景色 print "\n"; while () { $rf_flag=1; ($no,$reno,$date,$name,$mail,$sub, $comment,$url,$host,$pw,$color,$icon,$tbl_color) = split(/<>/); if ($reno eq "") { $i++; $j++;} if ($i < $start) { next; } if ($i > $end) { last; } # ナビゲーション用 $nav_next = ($j + 1); $nav_prev = ($j - 1); # ホームページのリンクの処理 if ($home_icon && $url) { $url = "HomePage"; }elsif (!$home_icon && $url) { $url = "<HOME>"; } # 親記事の時で、レスがないとき、ここでテーブルを閉じ、返信フォームを表示する if (!$reno && $flag) { &window_4; &res_form("$res_num"); $flag=1; &window_5; print "

\n\n"; } # 親記事のときは、一番外側のテーブルを表示 if (!$reno) { &window_1; $flag=1; } # レスの時に区切り線を表示 if ($reno && !$res_flag) { print "
\n"; $res_flag=1; } elsif (!$reno && $res_flag) { $res_flag=0; } if (!$reno) { print ""; print "[$no] $sub"; print "/$name\n"; &window_2; # 親記事の場合 $res_num = $no; print "投稿日:$date\n"; # ホストを表示 if ($showhost) { print "($host)"; } else { print "";} print "$url"; &window_3; # 親記事専用テーブルを表示 print "\n"; }else{ # 非アイコンモード時の処理 $comment = "
$comment
"; } # 記事を表示 print ""; } else { # レス記事の場合レス記事表示用テーブルを表示 print "
\n"; # アイコンモード if ($icon_mode) { # アイコンが見つからないときの処理 if (!(-e "$IconPath/$icon")){ $icon = $DefImg;} # テーブルを区切ってアイコンを表示 print "\"$icon\"$comment
\n"; # レス記事を表示 print "
"; # 投稿者(EメールがCookieにある場合は、リンクもはる) if ($mail) { print "$name"; }else{ print "$name"; } print " >$comment"; # 投稿日/記事番号を表示 print "<$date> No\.$no\n"; # ホストを表示 if ($showhost) { print " ($host)" } else{ print " "; } } print "
\n"; } close(IN); if ($rf_flag) { &window_4; &res_form("$res_num"); &window_5; print "
\n"; } # 一度に表示される親記事数をログの記事から計算 $next_page = $page + $p_log; $back_page = $page - $p_log; print "
\n"; if ($back_page >= 0) { print "\n"; } if ($next_page < $i) { print "\n"; } print "
\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "
\n"; &dlog_1; print "【記事削除フォーム】\n"; &dlog_2; print "
"; print ""; print "記事No"; print "削除キー"; print ""; print "
\n"; &dlog_3; # Eメールチェック用JavaScriptを表示 if ($emailchk){ &emailchkjs; } &footer;}#----------------------## 投稿フォーム表示部 ##----------------------#sub registform { print <<"EOM";
EOM if ($icon_mode) { # アイコンモード時 &select_icon; }else{ # アイコンを使用しない場合アイコンなしを強制選択 print "\n"; } print "\n"; print "\n"; # 文字色変更機能 print "
おなまえ
Eメール $emailchk_str
タイトル  
コメント
URL
削除キー\n"; print "(自分の記事を削除時に使用。英数字で8文字以内)
文字色\n"; # クッキーの色情報がない場合 if ($c_color eq "") { $c_color = $COLORS[0]; } print "\n"; foreach (0 .. $#COLORS) { if ($c_color eq "$COLORS[$_]") { print ""; print "$f_color_samp\n"; } else { print ""; print "$f_color_samp\n"; } } print "\n"; print "
\n";}#------------------## アイコンモード ##------------------#sub select_icon{ # アイコン無しとランダムを配列の先頭に追加 @icon1 = reverse @icon1; @icon2 = reverse @icon2; if ($randamicon){ # ランダム push (@icon1,"randam"); push (@icon2,"ランダム"); } # なし push (@icon1,"$DefImg"); push (@icon2,"なし"); @icon1 = reverse @icon1; @icon2 = reverse @icon2; # 管理者アイコンを配列に付加 if ($my_icon) { push(@icon1,"admin"); push(@icon2,"管理者用"); } print "イメージ(あなたのイメージを選択して下さい。)"; # イメージ参照のリンク if ($ImageView == 1) { print "[画像イメージ参照] \n"; } else { print "[画像イメージ参照] \n"; } print "\n";}sub footer{ # 著作権表示部 (削除改変を禁止) print "
$banner2

\n\n"; if ($input_border){ print "
\n";} print "- PetitBoard -\n"; print "
- $next - By立川 よーま
\n"; print "
\n"; if ($input_border){ print "
\n";} print "

\n"; exit;}#----------------## ログ書込処理 ##----------------#sub regist { # POST限定 if ($MethPost && !$post_flag) { &error("不正なアクセスです"); } # 他サイトからのアクセスを排除 if ($base_url) { $ref_url = $ENV{'HTTP_REFERER'}; $ref_url =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; if ($ref_url !~ /$base_url/i) { &error("不正なアクセスです"); } } # 名前とコメントは必須 if ($in{'name'} eq "") { &error("名前が入力されていません"); }elsif ($in{'name'} eq $AdminName) { if ($in{'pwd'} ne $pass ) { &error("管理人の名前を使わないで下さい!"); } } if ($in{'comment'} eq "") { &error("コメントが入力されていません"); } if ($in{'email'} && $in{'email'} !~ /(.*)\@(.*)\.(.*)/){ &error("Eメールの入力内容が正しくありません"); }elsif ($emailkey) { if ($in{'email'} eq ""){ &error("この掲示板はEメール必修入力です。");} if ($emailchk) { $use_type = "この掲示板に書き込む"; &emailchk; } } # 題名の長さ制限 if (length($in{'sub'}) > $sub_len * 2) { &error("題名の長さは全角$sub_len文字までにして下さい"); } # 禁止ワードのチェック(By よーま) foreach (0 .. $#NOWORDS){ if ($in{'name'} =~ /\Q$NOWORDS[$_]\E/) { &error("投稿された名前に不適切な語句が含まれています。:
$NOWORDS[$_]"); } if ($in{'sub'} =~ /\Q$NOWORDS[$_]\E/) { &error("投稿されたタイトルに不適切な語句が含まれています。:
$NOWORDS[$_]"); } if ($in{'comment'} =~ /\Q$NOWORDS[$_]\E/) { &error("投稿された文章に不適切な語句が含まれています。:
$NOWORDS[$_]"); } } # 時間を取得 &get_time; # クッキーを発行 &set_cookie; # ファイルロック if ($lockkey) { &lock; } # ログを開く open(IN,"$logfile") || &error("Open Error : $logfile"); @lines = ; close(IN); # 記事NO処理 $top = shift(@lines); ($no,$ip,$time2) = split(/<>/, $top); $no++; # 連続投稿チェック if ($addr eq "$ip" && $wait > $times - $time2) { &error("連続投稿はもうしばらく時間をおいて下さい"); } # 重複チェック $flag=0; foreach (@lines) { ($no2,$reno2,$date2,$name2,$mail2,$sub2,$com2) = split(/<>/); if ($in{'name'} eq "$name2" && $in{'comment'} eq "$com2") { $flag=1; last; } } if ($flag) { &error("重複投稿のため処理を中断しました"); } # 削除キーを暗号化 if ($in{'pwd'} ne "") { $ango = &encrypt($in{'pwd'}); } # URL自動リンク if ($autolink) { &auto_link($in{'comment'}); } if ($icon_mode) { # 管理アイコンのチェック if ($my_icon && $in{'icon'} eq "admin") { if ($in{'pwd'} ne "$pass") { &error("管理用アイコンは管理者専用です"); }else{ $in{'icon'} = $my_gif; } } if ($in{'icon'} eq 'randam'){ # アイコンにランダムが選択されたときの処理 srand; $randam = @icon3; $in{'icon'} = "$icon3[int(rand($randam))]"; } } # 親記事の場合 if ($in{'reno'} eq "") { $i=0; $stop=0; foreach (@lines) { ($no2,$reno2) = split(/<>/); $i++; if ($i > $max-1 && $reno2 eq "") { $stop=1; } if (!$stop) { push(@new,$_); } elsif ($stop && $pastkey) { push(@data,$_); } } unshift(@new,"$no<><>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$in{'icon'}<>$in{'tbl_color'}<>\n"); unshift(@new,"$no<>$addr<>$times<>\n"); # 過去ログ更新 if ($data[0]) { &pastlog; } # 更新 open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); } # レス記事の場合:トップソートあり elsif ($in{'reno'} && $topsort) { $match=0; @new=(); @tmp=(); foreach (@lines) { ($no2,$reno2) = split(/<>/); if ($in{'reno'} eq "$no2") { $match=1; push(@new,$_); } elsif ($in{'reno'} eq "$reno2") { push(@new,$_); } elsif ($match == 1 && $in{'reno'} ne "$reno2") { $match=2; push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$in{'icon'}<>$in{'tbl_color'}<>\n"); push(@tmp,$_); } else { push(@tmp,$_); } } if ($match == 1) { push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$in{'icon'}<>$in{'tbl_color'}<>\n"); } push(@new,@tmp); # 更新 unshift(@new,"$no<>$addr<>$times<>\n"); open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); } # レス記事の場合:トップソートなし else { $match=0; @new=(); foreach (@lines) { ($no2,$reno2) = split(/<>/); if ($match == 0 && $in{'reno'} eq "$no2") { $match=1; } elsif ($match == 1 && $in{'reno'} ne "$reno2") { $match=2; push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$in{'icon'}<>$in{'tbl_color'}<>\n"); } push(@new,$_); } if ($match == 1) { push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$in{'icon'}<>$in{'tbl_color'}<>\n"); } # 更新 unshift(@new,"$no<>$addr<>$times<>\n"); open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); } # ロック解除 if ($lockkey) { &unlock; } # メール処理 if ($mailing == 1 && $in{'email'} ne "$mailto") { &mail_to; } elsif ($mailing == 2) { &mail_to; }}#----------------## 返信フォーム ##----------------#sub res_form { $res_num = $_[0]; print <<"HTML";
名前 HTML if ( $resmode == 1 ) { #1行レスの場合 print ""; }else{ #複数行レスの場合 print ""; } print <<"HTML";
キー

HTML}#----------------## デコード処理 ##----------------#sub decode { $post_flag=0; if ($ENV{'REQUEST_METHOD'} eq "POST") { $post_flag=1; if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます"); } read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach (@pairs) { ($name,$value) = split(/=/); if ($name eq "word") { $word = $value; } $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # 文字コードをシフトJIS変換 &jcode'convert(*value, "sjis", "", "z"); # タグ処理 $value =~ s//>/g; # >の処理 # コメントタグ対策($value =~ s///g;でも問題ない?) $value =~ s//-->/g; # データ区切りに<>を使っているためここでその対策 $value =~ s/<>/<>/g; # 改行等処理 if ($name eq "comment") { # リターン処理(いったんに書き換える) $value =~ s/\r\n//g; $value =~ s/\r//g; $value =~ s/\n//g; if (!$tagkey) { # "の処理 $value =~ s/\"/"/g; # &の処理 $value =~ s/&/&/g; }else { if ($tagkey eq 1) { $value = &tag_change($value); } } # リターンを復元 $value =~ s//
/g; } else { $value =~ s/\"/"/g; $value =~ s/&/&/g; $value =~ s/\r//g; $value =~ s/\n//g; } # 一括削除用 if ($name eq "del") { push(@DEL,$value); } $in{$name} = $value; } $mode = $in{'mode'}; $page = $in{'page'}; $in{'url'} =~ s/^http\:\/\///; if ($in{'sub'} eq "") { $in{'sub'} = "無題"; }}#------------------------## 許可HTMLタグの再変換 ##------------------------#sub tag_change { # データー形式:&tag_change(再変換する文字列) # By よーま # この関数を作る上でお世話になったandiさん,WINGさん,うさぎさん,NUさんに感謝します。 local($str) = @_; $oktag =~ tr/A-Z/a-z/; if ($oktag =~ "img"){ # イメージタグの処理 $str =~ s/(.*)(<(img([!-:A-~\s\=]+))>)/$1/i; }elsif ($oktag =~ "embed") { # EMBEDタグの処理 $str =~ s/(.*)(<(embed([!-:A-~\s\=]+))>)/$1/ig; } # 許可タグを展開 $str =~ s/(.*)<($oktag)\s*(.*?)>(.*?)<\/\2>/$1<\U$2\E \L$3\E>$4<\/\U$2\E>/i; # タグを|で区切り、@tagsの配列に納める @tags = split(/\|/, $oktag); # @tagsの数だけ繰り返す。またその時の値を$tagに代入 foreach $tag (@tags){ if ($tag eq "a"){ # aタグの処理 $str =~ s/]*?href\=(?:\"|\')(.+?)(?:\"|\')[^<>]*?>(.*?)<\/A>/$2<\/a>/; $str =~ s/(.*?)<\/A>/<a $1>$2<\/a>/; }elsif ($tag eq "font"){ # FONTタグの処理 $str =~ s/]*?((?:(?:size|face|color)(?:\=(?:\"|\').*?(?:\"|\')\s*)){1,3})[^<>]*?>(.*?)<\/FONT>/$2<\/font>/; $str =~ s/(.*?)<\/FONT>/<font $1>$2<\/font>/; }else{ # 上記以外のタグは、ここで処理 $str =~ s/(.*)<$tag.*?>(.*?)<\/$tag>/$1<$tag>$2<\/$tag>/; } } return $str;}#----------------------------## 掲示板の使い方メッセージ ##----------------------------#sub howto { &header; &dlog_1; print "掲示板の利用上の注意\n"; &dlog_2; print <<"HTML";
  1. この掲示板はクッキー対応です。1度記事を投稿いただくと、おなまえ、Eメール、URL、削除キーの情報は2回目以降は自動入力されます。(ただし利用者のブラウザがクッキー対応の場合)

  2. HTML if (!$tagkey) { print "投稿内容には、タグは一切使用できません。\n"; }elsif ($tagkey == 1) { print "コメント欄には、"; $oktag =~ tr/A-Z/a-z/; @tags = split(/\|/, $oktag); foreach $tag (@tags){ print "<$tag>,"; } print "タグを使用することができます。但し、閉じ忘れのタグは無効です。\n"; if ($oktag =~ "font" ){ print "なお、<font>タグには、size,face,color属性のみ有効です。"; } }elsif ($tagkey == 2) { print "コメント欄には、タグ使用をすることができます。\n"; } print <<"HTML";
  3. 記事を投稿する上での必須入力項目は「おなまえ」「メッセージ」です。Eメール、URL、題名、削除キーは任意です。

  4. 記事には、半角カナは一切使用しないで下さい。文字化けの原因となります。

    HTML if($icon_mode){ print"

  5. この掲示板は、親記事のみアイコンが使えます。"; print"
    イメージ選択でランダムを選択すると自動的にアイコンを選びます。

    \n"; } print <<"HTML";

  6. 記事の投稿時に「削除キー」にパスワード(英数字で8文字以内)を入れておくと、その記事は次回削除キーによって削除することができます。

  7. 記事の保持件数は最大 $max件です。それを超えると古い順に自動削除されます。

  8. 既存の記事に「返信」をすることができます。各記事の上部にある「返信」ボタンを押すと返信用フォームが現れます。

  9. 過去の投稿記事から「キーワード」によって簡易検索ができます。トップメニューの「ワード検索」のリンクをクリックすると検索モードとなります。

  10. 管理者が著しく不利益と判断する記事や他人を誹謗中傷する記事は予\告なく削除することがあります。

\"掲示板にもどる\"
HTML &dlog_3; &footer; exit;}#------------------## ワード検索処理 ##------------------#sub find { &header; &dlog_1; print "ワード検索\n"; &dlog_2; print <<"EOM";

  • 検索したいキーワードを入力し、「条件」「表\示」を選択して「検索」ボタンを押して下さい。
  • キーワードは「半角スペース」で区切って複数指定することができます。

    キーワード:条件:EOM if (!$in{'cond'}) { $in{'cond'} = "AND"; } foreach ("AND", "OR") { if ($in{'cond'} eq "$_") { print "$_\n"; } else { print "$_\n"; } } print "表\示:
EOM # ワード検索の実行と結果表示 if ($in{'word'} ne ""){ # 入力内容を整理 $in{'word'} =~ s/ / /g; @pairs = split(/\s+/, $in{'word'}); # ファイルを読み込み @new=(); open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; while () { $flag=0; foreach $pair (@pairs) { if (index($_,$pair) >= 0) { $flag=1; if ($in{'cond'} eq 'OR') { last; } } else { if ($in{'cond'} eq 'AND') { $flag=0; last; } } } if ($flag) { push(@new,$_); } } close(IN); # 検索終了 $count = @new; print "検索結果:$count件\n"; if ($page eq '') { $page = 0; } $end_data = @new - 1; $page_end = $page + $in{'view'} - 1; if ($page_end >= $end_data) { $page_end = $end_data; } $next_line = $page_end + 1; $back_line = $page - $in{'view'}; if ($back_line >= 0) { print "[前の$in{'view'}件]\n"; } if ($page_end ne "$end_data") { print "[次の$in{'view'}件]\n"; } foreach ($page .. $page_end) { ($no,$reno,$date,$name,$email,$sub,$com,$url) = split(/<>/, $new[$_]); if ($email) { $name = "$name"; } if ($url) { $url = "<HOME>"; } if ($reno) { $no = "$renoへのレス"; } # 結果を表示 print "
[$no] $sub"; print " 投稿者:$name 投稿日:$date $url
\n"; print "
$com
\n"; } } print "
\"掲示板にもどる\"
\n"; &dlog_3; &footer;}#------------------## クッキーの発行 ##------------------#sub set_cookie { # クッキーは60日間有効 local($sec,$min,$hour,$mday,$mon,$year,$wday) = gmtime(time+60*24*60*60); @month=('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); $gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT", $week[$wday],$mday,$month[$mon],$year+1900,$hour,$min,$sec); $cook="name<>$in{'name'}\,email<>$in{'email'}\,url<>$in{'url'}\,pwd<>$in{'pwd'}\,icon<>$in{'icon'}\,color<>$in{'color'}"; print "Set-Cookie: A4P=$cook; expires=$gmt\n";}#------------------## クッキーを取得 ##------------------#sub get_cookie { local($key, $val); @pairs = split(/;/, $ENV{'HTTP_COOKIE'}); foreach (@pairs) { ($key,$val) = split(/=/); $key =~ s/\s//g; $GET{$key} = $val; } @pairs = split(/,/, $GET{'A4P'}); foreach (@pairs) { ($key,$val) = split(/<>/); $COOK{$key} = $val; } $c_name = $COOK{'name'}; $c_email = $COOK{'email'}; $c_url = $COOK{'url'}; $c_pwd = $COOK{'pwd'}; $c_icon = $COOK{'icon'}; $c_color = $COOK{'color'}; if ($in{'name'}) { $c_name = $in{'name'}; } if ($in{'email'}) { $c_email = $in{'email'}; } if ($in{'url'}) { $c_url = $in{'url'}; } if ($in{'pwd'}) { $c_pwd = $in{'pwd'}; } if ($in{'icon'}) { $c_icon = $in{'icon'}; } if ($in{'color'}) { $c_color = $in{'color'}; }}#--------------## 管理モード ##--------------#sub admin { if ($in{'pass'} ne "" && $in{'pass'} ne "$pass") { &error("パスワードが違います"); } &header; &dlog_1; print "管理者入室画面\n"; &dlog_2; if ($in{'pass'} eq "") { print "

パスワードを入力して下さい

\n"; print "
\n"; print "\n"; print "\n"; print ""; print "
\n"; } else { # 削除処理 if ($DEL[0]) { # ロック処理 if ($lockkey) { &lock; } # 削除情報をマッチングし更新 @new=(); open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; while () { $flag=0; ($no,$reno,$date) = split(/<>/); foreach $del (@DEL) { if ($no eq "$del" || $reno eq "$del") { $flag=1; last; } } if ($flag == 0) { push(@new,$_); } } close(IN); # 更新 unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); # ロック解除 if ($lockkey) { &unlock; } } # 管理を表示 if ($page eq "") { $page = 0; } print "

\n"; print "
  • 削除する記事のチェックボックスにチェックを入れ、削除ボタンを押して下さい。\n"; print "
  • 親記事を削除するとレス記事も一括して削除されます。
\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print ""; print "

\n"; print ""; print "\n"; # ページ区切り処理 $start = $page + 1; $end = $page + $p_log; open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; $i=0; while () { ($no,$reno,$date,$name,$mail,$sub,$com,$url,$host,$pw) = split(/<>/); if ($reno eq "") { $i++; } if ($i < $start) { next; } if ($i > $end) { last; } if ($mail) { $name="$name"; } ($date,$dmy) = split(/\(/, $date); if ($url) { $url = "<Home>"; } else { $url = '-'; } $com =~ s/
//ig; $com =~ s//>/g; if (length($com) > 40) { $com = substr($com,0,38); $com .= "..."; } if ($reno eq "") { print "
\n"; } # 削除チェックボックス print ""; print ""; print ""; print ""; print "\n"; } close(IN); print "\n"; print "
削除記事NO投稿日タイトル投稿者URLコメントホスト名

$no$date$sub$name$url$com$host

\n"; } $next_page = $page + $p_log; $back_page = $page - $p_log; print "

\n"; if ($back_page >= 0) { print "\n"; } if ($next_page < $i) { print "\n"; } print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "


\"掲示板にもどる\"
\n"; &dlog_3; &footer;}#------------------## ユーザ記事削除 ##------------------#sub usr_del { # POST限定 if ($MethPost && !$post_flag) { &error("不正なアクセスです"); } if ($in{'no'} eq '' || $in{'pwd'} eq '') { &error("記事Noまたは削除キーが入力モレです"); } # ロック処理 if ($lockkey) { &lock; } open(IN,"$logfile") || &error("Open Error : $logfile"); @lines = ; close(IN); $top = shift(@lines); $flag=0; foreach (@lines) { ($no,$reno,$dt,$name,$mail,$sub,$com,$url,$host,$pw) = split(/<>/); if ($flag == 0 && $in{'no'} eq "$no") { $PW = $pw; if ($reno eq "") { $flag=2; } else { $flag=1; } } elsif ($flag == 2 && $in{'no'} eq "$reno") { next; } else { push(@new,$_); } } if ($flag == 0) { &error("該当記事が見当たりません"); } if ($PW eq '') { &error("該当記事には削除キーが設定されていません"); } # 削除キーを照合 $match = &decrypt("$in{'pwd'}","$PW"); if ($match ne 'yes') { &error("削除キーが違います"); } # 更新 unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); # ロック解除 if ($lockkey) { &unlock; }}#--------------## 時間を取得 ##--------------#sub get_time { $ENV{'TZ'} = "JST-9"; $times = time; ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($times); @week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); # 日時のフォーマット $date = sprintf("%04d/%02d/%02d(%s) %02d:%02d", $year+1900,$mon+1,$mday,$week[$wday],$hour,$min);}#----------------## カウンタ処理 ##----------------#sub counter { # 閲覧時のみカウントアップ if ($mode eq '') { $cntup=1; } else { $cntup=0; } # カウントファイルを読みこみ open(IN,"$cntfile") || &error("Open Error : $cntfile"); eval "flock(IN, 1);"; $data = ; close(IN); # IPチェックとログ破損チェック ($cnt, $ip) = split(/:/, $data); if ($addr eq "$ip" || $cnt eq "") { $cntup=0; } # カウントアップ if ($cntup) { $cnt++; open(OUT,"+< $cntfile") || &error("Write Error : $cntfile"); eval "flock(OUT, 2);"; truncate(OUT, 0); seek(OUT, 0, 0); print OUT "$cnt\:$addr"; close(OUT); } # 桁数調整 while(length($cnt) < $mini_fig) { $cnt = '0' . $cnt; } @cnts = split(//, $cnt); # GIFカウンタ表示 if ($counter == 2) { foreach (0 .. $#cnts) { print "\"$cnts[$_]\""; } } # テキストカウンタ表示 else { print "$cnt
\n"; }}#--------------## メール送信 ##--------------#sub mail_to { # メールタイトルを定義 $MailSub = "[$title : $no] $in{'sub'}"; # 記事の改行・タグを復元 $com = $in{'comment'}; $com =~ s/
/\n/g; $com =~ s/<//g; $com =~ s/"/\"/g; $com =~ s/&/&/g; # メール本文を定義 $MailBody = <<"EOM";投稿日時:$dateホスト名:$hostブラウザ:$ENV{'HTTP_USER_AGENT'}投稿者名:$in{'name'}Eメール:$in{'email'}URL :$in{'url'}タイトル:$in{'sub'}投稿記事:$comEOM # JISコード変換 &jcode'convert(*MailSub,'jis'); &jcode'convert(*MailBody,'jis'); # メールアドレスがない場合はダミーメールに置き換え if ($in{'email'} eq "") { $email = 'nomail@xxx.xxx'; } else { $email = $in{'email'}; } if (!open(MAIL,"| $sendmail -t")) { &error("メール送信に失敗しました"); } print MAIL "To: $mailto\n"; print MAIL "From: $email\n"; print MAIL "Subject: $MailSub\n"; print MAIL "MIME-Version: 1.0\n"; print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n"; print MAIL "Content-Transfer-Encoding: 7bit\n"; print MAIL "X-Mailer: $ver\n\n"; print MAIL "--------------------------------------------------------\n"; print MAIL "$MailBody\n"; print MAIL "--------------------------------------------------------\n"; close(MAIL);}#-----------------## 自動URLリンク ##-----------------#sub auto_link { local($str) = @_; $str =~ s/([^=^\"]|^)((http|https|ftp)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/$1$2<\/a>/g; $str =~ s/([\w\+-\.]+@[\w\+-]+\.[\w\+\.-]+)/$1<\/a>/ig; return $str;}#--------------------## イメージ画像表示 ##--------------------#sub image { $list_w = (100 / $ImgListColums . '%'); &header; &dlog_1; print "イメージ画像サンプル\n"; &dlog_2; print "
- 現在登録されているイメージ画像は以下のとおりです -
\n"; print "
\n"; print "\n"; $i=0; $j=0; $stop = @icon1; foreach (0 .. $#icon1) { $i++; $j++; # 削除されたアイコンの処理 if (!(-e "$IconPath/$icon1[$_]") && $noicon){ $icon_msg="見つかりませんでした"; $icon1[$_] = $DefImg; } print "\n"; if ($i >= $ImgListColums) { print ''; $i=0; } if ($j eq "$stop") { if ($i == 0) { last; } while ($i < $ImgListColums) { print "

$icon2[$_]

"; $i++; } } } print "

\n"; print "
\n"; &dlog_3; &footer;}#----------------## 過去ログ生成 ##----------------#sub pastlog { local($past_flag)=0; # 過去NOを開く open(NO,"$nofile") || &error("過去ログカウントファイルが見つかりません:$nofile"); $count = ; close(NO); # 過去ログのファイル名を定義 $pastfile = "$pastdir$count\.dat"; # 過去ログを開く open(IN,"$pastfile") || &error("過去ログのデーターが見つかりません:$pastfile"); @past = ; close(IN); # 規定の行数をオーバーすると次ファイルを自動生成 if ($#past > $log_line) { $past_flag=1; # カウントファイル更新 $count++; open(NO,">$nofile") || &error("過去ログカウントファイルに書き込めません:$nofile"); print NO $count; close(NO); $pastfile = "$pastdir$count\.dat"; @past=(); } @temp=(); foreach (@data) { ($pno,$preno,$pdate,$pname,$pmail,$psub,$pcom,$purl,$pho) = split(/<>/); if ($pmail) { $pname = "$pname"; } if ($purl) { $purl = "<HOME>"; } if ($preno) { $pno = "$prenoへのレス"; } # 保存記事をフォーマット push(@temp,"
[$pno] $psub 投稿者:$pname 投稿日:$pdate $purl
\n
$pcom
\n"); } # 過去ログを更新 unshift(@past,@temp); open(OUT,">$pastfile") || &error("過去ログファイルを更新できませんでした:$pastfile"); print OUT @past; close(OUT); if ($past_flag) { chmod(0666,$pastfile); }}#------------## 過去ログ ##------------#sub past { open(IN,"$nofile") || &error("Open Error : $nofile"); $pastno = ; close(IN); if (!$in{'pastlog'}) { $in{'pastlog'} = $pastno; } &header; &dlog_1; print "過去ログ[$in{'pastlog'}]"; &dlog_2;print <<"EOM"; \n"; print "
過去ログ:\n
\n"; print "
\n"; print "\n"; print "\n"; print "ワード検索:
\n"; print "条件:"; if (!$in{'cond'}) { $in{'cond'} = "AND"; } foreach ("AND", "OR") { if ($in{'cond'} eq "$_") { print "$_\n"; } else { print "$_\n"; } } print "\n"; print " 表\示:\n
\n"; print "
\n"; # 表示ログを定義 $in{'pastlog'} =~ s/\D//g; $file = "$pastdir$in{'pastlog'}\.dat"; # ワード検索処理 if ($in{'word'} ne "") { $in{'word'} =~ s/ / /g; @pairs = split(/\s+/, $in{'word'}); @new=(); open(IN,"$file") || &error("過去ログが開けません:$file"); while () { $flag=0; foreach $pair (@pairs) { if (index($_,$pair) >= 0) { $flag=1; if ($in{'cond'} eq 'OR') { last; } } else { if ($in{'cond'} eq 'AND') { $flag=0; last; } } } if ($flag) { push(@new,$_); } } close(IN); $count = @new; print "検索結果:$count件\n"; if ($page eq '') { $page = 0; } $end_data = @new - 1; $page_end = $page + $in{'view'} - 1; if ($page_end >= $end_data) { $page_end = $end_data; } $next_line = $page_end + 1; $back_line = $page - $in{'view'}; if ($back_line >= 0) { print "[前の$in{'view'}件]\n"; } if ($page_end ne "$end_data") { print "[次の$in{'view'}件]\n"; } print "[検索やり直し]\n"; # 表示開始 foreach ($page .. $page_end) { print $new[$_]; } print "\n"; print "
\"掲示板にもどる\"
\n"; &dlog_3; &footer; } # ページ区切り処理 $start = $page + 1; $end = $page + $p_log; $i=0; open(IN,"$file") || &error("Open Error : $file"); while () { $flag=0; if ($_ =~ /^\\[\d+\]/) { $flag=1; $i++; } if ($i < $start) { next; } if ($i > $end) { last; } if ($flag) { print $_; } else { $_ =~ s/
//ig; print "
$_
\n"; } } close(IN); print "
\n"; $next_page = $page + $p_log; $back_page = $page - $p_log; print "\n"; if ($back_page >= 0) { print "\n"; } if ($next_page < $i) { print "\n"; } print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
\"掲示板にもどる\"
\n"; &dlog_3; &footer;}##### Aqua風描画エンジン(By よーま)############################################################################## CSS設定sub css_set { print <<"HTML";BODY {margin-top:0;margin-left:0;margin-right:0;margin-bottom:0 ; font-family:"MS Pゴシック","Osaka" ;font-size: 9pt }p,table,tr,td,th,input,textarea,select { font-family:"MS Pゴシック","Osaka" ;font-size: 9pt }a { color:#0000FF ; text-decoration:none; }a:visited { color:#800080 }a:active { color:#FF0000 }a:hover { color:#FF0000 ; text-decoration:none; }HTML}# メニューバーsub menubar { print <<"HTML";


HTML}# ダイアログ描画# 1は、ダイアログのタイトルの書き始めまでsub dlog_1 { print <<"HTML";
HTML}# 2は、タイトルから内容までsub dlog_2 { print <<"HTML";
HTML}# 3は、内容からウィンドウの影までsub dlog_3 { print <<"HTML";
HTML}# ウィンドウ描画# 1は、タイトルまでsub window_1 { print <<"HTML";
HTML}# 2は、タイトルから日付までsub window_2 { print <<"HTML";
HTML}# 3は、日付から内容までsub window_3 { print <<"HTML";
HTML}# 4は、内容からレス入力までsub window_4 { print <<"HTML";    
HTML}# 5は、レス入力からウィンドウの影までsub window_5 { print <<"HTML";
HTML}