#!/usr/local/bin/perl ;#---------------------------------------------------------------------- ;# 簡易BBSΘ Version 1.10 ;# (MiniBBS-ic) ;# ;# (c)2001 by CGI-RESCUE ;# for Perl5,UNIX ;# Free Soft ;#----------------------------------------------------------------S-JIS- # --[HISTORY]-- ( )内は更新したファイル # 27/OCT/2001 v1.00 リリース # 16/DEC/2001 v1.10 icon.cgiの配置場所がindex.htmlと異なる場合の設定変更とアイコン一覧方法の変更(bbs.cgi,icon.cgi) # ○これはフリーソフトですが、別段に定められる利用規定に従って使用してください。 # ○設置方法等に関することは、添付のREADME.txtをご参照ください。 # ○初心者の方は http://www.rescue.ne.jp/cgi/beginners/ を参照してください。 # --[初期設定]---------------------------------------------------------- # ●画面の設定(背景、文字色、リンク色などの設定) $body = ''; # ●ブラウザのタイトルバー等に表示される掲示板の名称 $title_bar = '簡易BBSΘアイコン付き画像掲示板'; # ●掲示板内にリンクする場所と名称 $bye = "http://tasamu.com/ticket"; $bye_name = 'ワールドカップチケット情報'; # ●画面上部に挿入するHTML # # ☆ワンポイントアドバイス☆ # $head_message = <<'EOF'; # <この間に記述する> .. 複数行可能です # EOF $head_message = <<'EOF';

ガセ、売買情報はやめてね

EOF # ●画面下部に挿入するHTML $end_message = <<'EOF';

使い方

EOF # ●アイコン名の設定 # # アイコン名は1から順番に1.gif 2.gif … というふうにします。(拡張子は小文字) # それぞれの画像の名前をこの設定でその数字順に設定します。 # 運用後に入れ替えてしまうと誤動作を起こしますので注意してください。 @ICON = ('大入','かき氷','やかん','電灯','ペンション','鳥居','手を挙げて','ひよこ','おむすび','スイカ'); # ●選択名の設定 # # 選択させたい名称(都道府県名でも市区町村名でも住所以外の別の目的・表記でもOK)を設定します。 # 運用後に入れ替えてしまうと誤動作を起こしますので注意してください。 @PREF = ('東京','神奈川','埼玉','千葉','栃木','群馬','茨城','山梨','その他'); # ●各ライブラリの設定 # # ☆ワンポイントアドバイス☆ # require '../cgi-bin/jcode.pl'; と require 'jcode.pl'; は意味が違います。 # もしわからない場合は、このプログラムと同じ場所にjcode.plを設置して、require './jcode.pl'; を設定してください。 require './jcode.pl'; # バージョン2.0以降 require './cgi-lib217.pl'; # バージョン2.17以降 # ●メール処理プログラムの設定 $sendmail = '/usr/sbin/sendmail.org'; # ●管理者の設定 $admin_email = 'ticket@tasamu.com'; # 管理者のメールアドレス $admin_passwd = '123456789'; # 管理者用パスワード(平文) # ●1ページの表示件数 $page = 10; # ●画面の中央寄せ処理(センタリング) 1:する 0:しない $center = 1; # ●センタリングする場合の表示域の割合 (センタリングしない場合は自動的に100%となる) $frame_width = "80%"; # ●投稿者のホスト情報を画面ソース内に含めるかどうかの設定 1:表示する 0:表示しない $viewhost = 0; # ●画像投稿を許可するかどうかの設定 1:許可する 0:許可しない $useimg = 1; # ●投稿時に管理者にメール連絡するかどうかの設定 1:する 0:しない $report = 0; # ●投稿タイトル等の文字色と背景色と内容文背景色の設定 $subject_color = '#ffeedd'; # 文字色 $subject_bgcolor = '#888888'; # 背景色 $textareacolor = '#ffffff'; # 内容文背景色 # ●投稿の間に挿入するHTML # # ☆ワンポイントアドバイス☆ # 投稿タイトル等の文字色と背景色の設定によっては、配色の関係で帯を作らない場合など、投稿と投稿の # 間に仕切り線を設けたい場合などに使います。例:$HR = '
'; $HR = ''; # ●添付する1画像の上限サイズ(単位:byte) # # ☆ワンポイントアドバイス☆ # フォームから送信できる文章や添付画像や内部処理用データ等のすべてのデータの合計は、131072バイト(2の17乗)以内でなければ # なりませんので、画像についての上限を100000程度に抑えておくことが重要です。(数字にはカンマを含めないこと) $image_max = 100000; # ●1投稿に許可する上限文字数(単位:byte) ... 全角1文字は2バイトです $text_max = 10000; # ●ローテーション件数 (投稿数がこの数を超えた場合は一番古い投稿から削除されます) # この件数を既に超えている状態でこの件数を少なくしても、新たに設定した値は正しく適用されません。 $max_num = 100; # ●投稿フォームの取り扱い方法 # # 0: 投稿フォームを表示しない # 1: 常に投稿フォームを表示する # 2: 1ページ目にのみ投稿フォームを表示する $view_form = 2; # ●投稿データを記録しておく場所(データフォルダ) # # ☆ワンポイントアドバイス☆ # 以下、サーバ内部で扱うパスとWWW上で扱う仮想パス(URL等)を混同しないようにしてください。 # *_url $icon_dir はindex.htmlから見た仮想パス # *_dir *_file はbbs.cgiから見た内部パス # (※n)は、説明書の設置構成例に応じた設定例です。 $data_dir = "./data/"; # ●画像データを記録しておく場所(イメージフォルダ) $images_dir = "./images/"; # ●掲示板の最初のページを示すHTMLファイルの場所(インデックスファイル) ... これは内部パスです $index_file = "./index.html"; # ●画像データを記録しておく場所を示す仮想パス(イメージURL) ... 分からない場合、仮想パスは http:// から書くといいでしょう $images_url = "./images/"; # ●アイコンを保存しておく場所(アイコンフォルダ) 仮想パス $icon_dir = "./icon/"; # ●icon.cgiを設置した場所 .. 仮想パス http://から書いてもよい $iconcgi = "./icon.cgi"; # ●インデックスファイルにアクセスするための仮想パス(URL) $base = "http://tasamu.com/ticket/bbs/index.html"; #$base = "http://この掲示板システムのインデックスファイルを設置した場所/"; # ファイル名'index.html'が省略できるサーバであればこれでもよい # ●このプログラム'bbs.cgi'を設置した場所を示す仮想パス(URL) ... http://この部分を設定する/bbs.cgi $cgi_base = "http://tasamu.com/ticket/bbs/"; # ●時刻の取得と曜日の表記 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); @wday_array = ('日','月','火','水','木','金','土'); # ●その他の設定 $EXT = ".cgi"; # 投稿データに付ける拡張子 # --[初期設定はここまで]------------------------------------------------ # 以下のプログラムをいじった場合はバグサポートの対象外となります。 # 改造は自由ですが、著作権を放棄しません。改造物の配布については許可が必要です。 # ●システムチェック if ($jcode'version < 2) { &error('ERROR','バージョン2以降のjcode.plを設置してください.'); } if ($cgi_lib'version < 2.17) { &error('ERROR','バージョン2.17以降のcgi-lib.plを設置してください.'); } if ($] < 5) { &error('ERROR','バージョン5以降のPerlで実行してください.'); } if (!-e $index_file) { &error('ERROR','次の設定が正しくありません - $index_file'); } if (!-e $images_dir) { &error('ERROR','次の設定が正しくありません - $images_dir'); } if (!-e $data_dir) { &error('ERROR','次の設定が正しくありません - $data_dir'); } $copyright = "copyright.gif"; if (!-e "$images_dir$copyright") { &Copyright; } # 簡易BBSのロゴの生成 (この処理を省くと利用規定違反です) $reload = $cgi_base . "bbs.cgi"; if ($center) { $center1 = "
"; $center2 = "
"; $frame_width = "width=$frame_width"; } else { $frame_width = "width=100%"; } $date_now = sprintf("%01d/%01d(%s) %02d:%02d:%02d",$mon +1,$mday,$wday_array[$wday],$hour,$min,$sec); $date_num = sprintf("%04d%02d%02d%02d%02d%02d",$year +1900,$mon +1,$mday,$hour,$min,$sec); # ●ブラウザチェック(画像添付処理ができるかどうか) $HTTP_USER_AGENT = $ENV{'HTTP_USER_AGENT'}; $HTTP_USER_AGENT =~ s//\)/g; if (!$useimg) { $NO_ENC = 1; } elsif ($HTTP_USER_AGENT =~ /DreamPassport/) { $NO_ENC = 1; } # ドリームキャスト elsif ($HTTP_USER_AGENT =~ /iBOX/) { $NO_ENC = 1; } # わくわくステーション elsif ($HTTP_USER_AGENT =~ /MSIE(.*)4\.5(.*)Mac/) { $NO_ENC = 1; } # バグがあるMAC版IE elsif ($HTTP_USER_AGENT =~ /Mozilla\/(\d)\./) { $Mozilla = $1; if ($Mozilla < 3) { $NO_ENC = 1; } # 低いバージョンを念のため除外 } else { $NO_ENC = 1; } # 分からないものも念のため除外 # ●ホストチェック $REMOTE_HOST = $ENV{'REMOTE_HOST'}; $REMOTE_ADDR = $ENV{'REMOTE_ADDR'}; if ($REMOTE_HOST eq '') { $REMOTE_HOST = $REMOTE_ADDR; } if ($REMOTE_HOST eq $REMOTE_ADDR) { $REMOTE_HOST = gethostbyaddr(pack('C4',split(/\./,$REMOTE_HOST)),2) || $REMOTE_ADDR; } # ●入力 ($ret) = &ReadParse; if (!$ret) { print "Location: $base\n\n"; exit; } if ($in{'action'} ne "sendmail" && $in{'mailto'} ne "") { &mail_form; } while (($key,$val) = each %in) { # 初期処理 if ($key eq "" || $key eq ".") { undef $in{$key}; } if ($key eq "attc") { next; } # 画像データを除外 &jcode'h2z_sjis(*val); &jcode'convert(*val,'sjis'); $val =~ s/\t//g; $val =~ s/\r\n/\0/g; $val =~ s/\r/\0/g; $val =~ s/\n/\0/g; $val =~ s/&/&/g; $val =~ s/"/"/g; $val =~ s//>/g; $in{$key} = $val; } if ($in{'action'} eq "sendmail" && $in{'mailto'} ne "") { # 匿メール(転送メール) ($ret) = &getMassage("$in{'mailto'}$EXT"); if (!$ret) { &error("ERROR","投稿が削除されたか、何らかの原因でメール転送ができません."); } if ($in{'email'} !~ /\b[-\w.]+@[-\w.]+\.[-\w]+\b/) { &error("入力エラー","メールアドレスの形式が間違っているか、入力されていません.","すべて半角文字で書かれていますか?","画面を戻して修正してください."); } if ($in{'value'} eq "") { &error("本文を書いてください","画面を戻してください."); } if ($in{'uname'} eq "") { $in{'uname'} = "(未記入)"; } if ($in{'title'} eq "") { $in{'title'} = "(無題)"; } $in{'value'} =~ s/\0/\n/g; $mail_value = "次の掲示板からあなた宛にメールが届きました.\n\n"; $mail_value .= "掲示板名:$title_bar\n"; $mail_value .= "設置場所:$base\n\n"; $mail_value .= "日付:$date_now\n"; $mail_value .= "タイトル:$in{'title'}\n"; $mail_value .= "送信者:$in{'uname'}\n"; if ($in{'email'}) { $mail_value .= "メールアドレス:$in{'email'}$caution\n"; } $mail_value .= "\n\n"; $mail_value .= "---ここから-------------------------------------\n"; $mail_value .= "$in{'value'}\n"; $mail_value .= "---ここまで-------------------------------------\n\n"; &sendmail($MES{'email'},"[FORWARD] $in{'title'}",$mail_value); # &sendmail(送信先,題名,本文); &error("送信しました","必ずしも相手に確実に配信することをお約束するものではありません.","画面を閉じてください."); } # ●削除 if ($in{'action'} eq "delete") { if ($in{'passwd'} eq $admin_passwd) { $ADMIN = 1; } # 管理者チェック foreach $filename (split("\0",$in{'quote'})) { $remove_ok = 0; ($ret) = &getMassage("$filename$EXT"); if (!$ret) { push(@REMOVE_ERR,"No.$filenameは既に削除されています."); next; } unless ($ADMIN) { # 削除パスワードチェック if ($MES{'passwd'} eq "") { push(@REMOVE_ERR,"No.$filenameは削除パスワードが設定されていません."); next; } if ($in{'passwd'} eq $MES{'passwd'}) { $remove_ok = 1; } } if ($remove_ok || $ADMIN) { if (-e "$data_dir$filename$EXT") { $chk = unlink "$data_dir$filename$EXT"; if ($chk) { push(@REMOVE_ERR,"No.$filenameを削除しました."); $access = 1; } else { push(@REMOVE_ERR,"No.$filenameの削除に失敗しました."); } } foreach (split("\0",$MES{'attc_name'})) { if (!-e "$images_dir$_") { next; } $chk = unlink "$images_dir$_"; if ($chk) { push(@REMOVE_ERR,"No.$filenameの添付画像$_を削除しました."); } else { push(@REMOVE_ERR,"No.$filenameの添付画像$_の削除に失敗しました."); } } } else { push(@REMOVE_ERR,"No.$filenameはパスワードが合わないので削除できませんでした."); } } if ($access) { # 削除があればインデックスを再生成 &getList; $output = "WRITE"; if (open($output,"> $index_file")) { &putMessage; close($output); } } if (@REMOVE_ERR) { print "Content-type: text/html\n\n"; print <<"EOF"; $title_bar $body

削除処理の実行結果

EOF print "
    "; foreach $i (0 .. $#REMOVE_ERR) { print "
  • $REMOVE_ERR[$i]\n"; } print "
"; print <<"EOF";


掲示板へ戻る

EOF exit; } } # ●ファイル出力(インデックスファイルの生成) if ($in{'action'} eq "regist") { if ($in{'attc'}) { ($err_mes) = ®ist2; } ($ret) = ®ist; if (!$ret) { print "Location: $base\n\n"; exit; } &getList; $output = "WRITE"; if (open($output,"> $index_file")) { &putMessage; close($output); } # クッキーの記録 ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 30*24*60*60); # 30日後 $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 ($in{'cookie'}) { if ($in{'uname'} eq "(名前未記入)") { $in{'uname'} = ""; } print "Set-Cookie: $ENV{'SCRIPT_NAME'}=cookie:$in{'cookie'}\,uname:$in{'uname'}\,email:$in{'email'}\,tm:$in{'tm'}\,passwd:$in{'passwd'}\,icon:$in{'icon'}\,pref:$in{'pref'}; expires=$date_gmt\n"; $COOKIE{'uname'} = $in{'uname'}; $COOKIE{'email'} = $in{'email'}; $COOKIE{'passwd'} = $in{'passwd'}; $COOKIE{'tm'} = $in{'tm'}; $COOKIE{'icon'} = $in{'icon'}; $COOKIE{'pref'} = $in{'pref'}; $COOKIE{'cookie'} = $in{'cookie'}; } else { $date_gmt = "Sun, 01-Jan-1995 01:00:00 GMT"; # クッキーを完全消去するには正確な過去を設定する(ブラウザを正常に閉じたあとに実行される) print "Set-Cookie: $ENV{'SCRIPT_NAME'}=uname:\,email:\,tm:\,passwd:\,icon:\,pref:\,cookie:; expires=$date_gmt\n"; $COOKIE{'uname'} = $COOKIE{'email'} = $COOKIE{'tm'} = $COOKIE{'passwd'} = $COOKIE{'icon'} = $COOKIE{'pref'} = $COOKIE{'cookie'} = ""; } if ($err_mes) { &getList; $output = "STDOUT"; &putMessage; exit; } else { print "Location: $base\n\n"; exit; } } else { &getList; } # ●クッキー入力 @pairs = split(/;/,$ENV{'HTTP_COOKIE'}); foreach $pair (@pairs) { ($key,$val) = split(/=/,$pair,2); $key =~ s/ //g; if ($key eq $ENV{'SCRIPT_NAME'}) { @pairs = split(/,/,$val); foreach $pair (@pairs) { ($key,$val) = split(/:/,$pair,2); $COOKIE{$key} = $val; } last; } } # ●画面出力 $output = "STDOUT"; &putMessage; exit; sub getList { # ●一覧処理 $check = (eval { opendir(DIR,$data_dir); }, $@ eq ""); if (!$check) { &error("ERROR"); } $allhits = ""; @Buf = @NEW = (); @BASE = @list = (); @lists = readdir(DIR); close(DIR); foreach $file (@lists) { next if $file eq '.'; next if $file eq '..'; if ($file =~ /(\d+)$EXT$/) { push(@BASE,$1); } } @BASE = sort { $b <=> $a; } @BASE; if ($in{'vp'} == 0) { $FF = 0; $in{'vp'} = 1; } else { $FF = ($in{'vp'} - 1) * $page; } $TO = $FF + $page - 1; if ($TO > $#BASE) { $TO = $#BASE; } $hit = 0; $next_num = ''; foreach $num ($FF .. $#BASE) { $filename = $BASE[$num]; if ($in{'vp'} > 1) { $allhits = $in{'allhits'}; if ($hit == $page) { last; } else { push(@NEW,$filename); $hit++; } } else { # 最初の1ページ目の処理 if ($hit < $page) { $hit++; push(@NEW,$filename); } $allhits++; } } $in{'allhits'} = $allhits; push(@Buf,"allhits=$in{'allhits'}"); $buf = join('&',@Buf); $count_new = @NEW; } sub regist2 { # 添付画像の記録処理 if (length($in{'attc'}) > $image_max) { &error("画像ファイル容量オーバー","$image_maxバイト以内のファイルにして送信してください."); } $w = 0; foreach (@in) { ($fname) = $_ =~ /\bfilename="([^"]*)"/i; ($fname) = $_ =~ /\bfilename=([^\s:;]+)/i unless defined $fname; if ($fname eq '') { next; } ($name) = $_ =~ /\bname="([^"]+)"/i; ($name) = $_ =~ /\bname=([^\s:;]+)/i unless defined $name; ($ctype) = $_ =~ /\s*Content-type:\s*"([^"]+)"/i; ($ctype) = $_ =~ /\s*Content-Type:\s*([^\s:;]+)/i unless defined $ctype; if ($name =~ /attc/) { unless ($ctype =~ /^image/i) { return "
  • 画像かどうか確認できませんでした.\n"; } if ($ctype eq '') { return "
  • 添付されたファイルの形式が判別できませんでした.\n"; } $fname = reverse("$fname"); ($fname) = split(/\\|\/|\:/,$fname); $fname = reverse("$fname"); ($fname,$ext) = split(/\./,$fname); if ($ext =~ /jp(.*)g/i || $ext =~ /gif/i) { ; } else { return "
  • 拡張子についてJPEGまたはGIFが検出できませんでした.\n
  • ファイル名にピリオドは1つだけにしてください.\n"; } if (!open(IMAGE,"> $images_dir$date_num\.$w\.$ext")) { return "
  • 画像の記録ができませんでした.\n"; } print IMAGE $in{$name}; close(IMAGE); chmod(0666,"$images_dir$date_num\.$w\.$ext"); $in{'attc_name'} .= "\0" if (defined($in{'attc_name'})); $in{'attc_name'} .= "$date_num\.$w\.$ext"; } last; } } sub regist { # 投稿処理 if ($in{'value'} eq '' && $in{'attc_name'} eq "") { return 0; } # 本文も画像も送信されていない場合は処理しない $in{'uname'} =~ s/\;//g; # クッキーに保存できない文字の除去 $in{'uname'} =~ s/\://g; $in{'uname'} =~ s/\//g; $in{'uname'} =~ s/\,//g; $in{'uname'} =~ s/\=//g; if ($in{'uname'} eq '') { $in{'uname'} = "(名前未記入)"; } if ($in{'uname'} ne '' && length($in{'uname'}) > 30) { $in{'uname'} = substr($in{'uname'},0,30) . " "; $err_mes .= "
  • 名前を30バイト以内にカットしました.\n"; } if ($in{'email'} ne '' && $in{'email'} !~ /\b[-\w.]+@[-\w.]+\.[-\w]+\b/) { $in{'email'} = ""; $err_mes .= "
  • メールアドレスの形式に誤りがありました.\n"; } if ($in{'tm'} && !$in{'email'}) { $in{'tm'} = ""; $err_mes .= "
  • 匿メール利用の場合はメールアドレスの入力が必須です.\n"; } if ($in{'title'} eq '') { $in{'title'} = "(無題)"; } elsif (length($in{'title'}) > 50) { $in{'title'} = substr($in{'title'},0,50) . " "; $err_mes .= "
  • タイトルを50バイト以内にカットしました.\n"; } if (length($in{'value'}) > $text_max) { $in{'value'} = substr($in{'value'},0,$text_max) . " "; $err_mes .= "
  • 本文を1投稿の上限である$text_maxバイト以内にカットしました.\n"; } if ($in{'passwd'} eq "") { $err_mes .= "
  • 削除パスワードが設定されませんでしたので管理者しか削除できません.\n"; } elsif (length($in{'passwd'}) < 4 || length($in{'passwd'}) > 8) { $in{'passwd'} = ""; $err_mes .= "
  • 削除パスワードが規定文字数内でないので削除パスワードは設定しませんでした.\n"; } if (!open(DATA,"> $data_dir$date_num$EXT")) { return 0; } # データフォルダへの記録 print DATA "date\t$date_now\n"; print DATA "host\t$REMOTE_HOST\n"; $w = 0; while (($key,$val) = each %in) { if ($key eq "attc") { next; } if ($key eq "action") { next; } if ($key eq "form") { next; } foreach (split("\0",$val)) { print DATA "$key\t$_\n"; } } close(DATA); chmod(0666,"$data_dir$date_num$EXT"); if ($report) { # 管理者へのレポート $mail_value = "次の掲示板に投稿がありました.\n\n"; $mail_value .= "掲示板名:$title_bar\n"; $mail_value .= "設置場所:$base\n\n"; $mail_value .= "日付:$date_now\n"; $mail_value .= "タイトル:$in{'title'}\n"; $mail_value .= "投稿者:$in{'uname'}\n"; if ($in{'tm'}) { $caution = " (非公開)"; } else { $caution = ""; } if ($in{'email'}) { $mail_value .= "メールアドレス:$in{'email'}$caution\n"; } $mail_value .= "\n\n"; $mail_value .= "---ここから-------------------------------------\n"; foreach (split("\0",$in{'value'})) { $mail_value .= "$_\n"; } $mail_value .= "---ここまで-------------------------------------\n\n"; if ($in{'attc_name'}) { $mail_value .= "○この投稿には画像が投稿されています. ($in{'attc_name'})\n"; } &sendmail($admin_email,"[REPORT] $in{'title'}",$mail_value); # &sendmail(送信先,題名,本文); } # ローテーション $check = (eval { opendir(DIR,$data_dir); }, $@ eq ""); if (!$check) { &error("ERROR"); } @rotation2 = readdir(DIR); close(DIR); foreach $file (@rotation2) { next if $file eq '.'; next if $file eq '..'; if ($file =~ /(\d+)$EXT$/) { push(@rotation,$1); } } $now_num = @rotation; if ($now_num > $max_num) { @rotation = sort { $a <=> $b; } @rotation; # 念のため ^^; $filename = $rotation[0]; ($ret) = &getMassage("$filename$EXT"); if (!$ret) { next; } unlink "$data_dir$filename$EXT"; foreach (split("\0",$MES{'attc_name'})) { unlink "$images_dir$_"; } } return 1; } sub putMessage { # 画面(標準出力)またはインデックスファイル(静的)への出力 if ($output eq "STDOUT") { # 画面への出力(動的)へはクッキーを表示する $toku_email_checked{$COOKIE{'tm'}} = "checked"; $cookie_checked{$COOKIE{'cookie'}} = "checked"; $read_settei = ""; print "Content-type: text/html\n\n"; } else { $read_settei = " (設定の読込み)"; } print $output <<"EOF"; $title_bar $body $center1
    $head_message

    EOF if ($view_form == 1 || ($view_form == 2 && $in{'vp'} == 1) || $in{'form'}) { if (!$NO_ENC) { $ENC = ' ENCTYPE="multipart/form-data"'; } print $output <<"EOF";

    EOF if ($useimg) { print $output ""; if (!$NO_ENC) { print $output "\n"; } else { print $output "\n"; } print $output "\n"; } print $output <<"EOF";
    名前 $read_settei アイコン一覧
    タイトル
    本文
    添付画像(お使いのブラウザでは画像添付機能\をご利用いただけません)
    Eメール 公開しないでメールを受け取りたい
    削除パスワード
    (英数字4〜8文字)
    (設定しない場合は投稿者による削除はできません)
        設定を保存する

    EOF $view = 1; } print $output "
    \n"; if (!$view || !@NEW) { $toukou = " 《投稿する》\n"; } if ($err_mes && $output eq "STDOUT") { # 投稿エラーがある場合は動的処理を行い、表示をする print $output "

    ○投稿結果について

    \n"; print $output "
      \n"; print $output $err_mes; print $output "

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

    EOF if (!@NEW) { print $output "

    メッセージはありません。$toukou

    \n"; } else { $vp = 0; for ($jump = $page; $jump < $in{'allhits'} + $page; $jump += $page) { # ページジャンプ用の前処理 $vp++; $ffv = ($vp - 1) * $page; if ($vp == $in{'vp'}) { $page_now = $vp; } } $FROM = $page_now * $page - ($page - 1); $LAST = $FROM + $count_new - 1; print $output "ページ $page_now ($FROM〜$LAST) $toukou\n"; foreach $filename (@NEW) { ($ret) = &getMassage("$filename$EXT"); if (!$ret) { next; } if ($MES{'tm'}) { $NAME = "$MES{'uname'}"; } elsif ($MES{'email'} ne "") { $NAME = "$MES{'uname'}"; } else { $NAME = $MES{'uname'}; } $VALUE = $MES{'value'}; $VALUE = &tag_ok($VALUE); $VALUE =~ s/\r/
    \r/g; $VALUE =~ s/ /  /g; $VALUE =~ s/"/"/g; $VALUE =~ s/(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/$1\:$2<\/a>/ig; $VALUE =~ s/\b([-\w.]+@[-\w.]+\.[-\w.]+)\b/$1<\/a>/g; if ($viewhost) { $viewhost = ""; } else { $viewhost = ""; } if ($MES{'icon'}) { $ICON = "\"$ICON[$MES{'icon'}]\" "; } else { $ICON = ""; } if ($MES{'pref'}) { $MES{'pref'} = "@@PREF[$MES{'pref'}]"; } print $output <<"EOF"; $viewhost $HR
    $MES{'title'}
      $ICON$NAME$MES{'pref'} at $MES{'date'} No.$filename

    EOF if ($MES{'attc_name'}) { print $output "\n"; } if ($MES{'attc_name'}) { print $output "\n"; } if ($MES{'attc_name'}) { $SNL = "\"\""; print $output "\n"; } if ($MES{'attc_name'}) { print $output "\n"; } if ($MES{'attc_name'}) { print $output "
    $SNL
    "; } print $output <<"EOF"; $VALUE


    EOF } } print $output "


    \n"; if ($in{'allhits'}) { print $output "【$bye_name】\n"; print $output "全 $in{'allhits'} 件 [ "; $orikaeshi = int($in{'allhits'} / $page / 2); $n = $vp = 0; for ($jump = $page; $jump < $in{'allhits'} + $page; $jump += $page) { # 各ページへのリンク表示 $vp++; $ffv = ($vp - 1) * $page; if ($vp == $in{'vp'}) { print $output " ↑この画面"; $page_now = $vp; $n = 1; } elsif ($vp == 1) { print $output " 最初のページ\n"; } else { if ($n) { $next = "次→"; $n = 0; } else { $next = $vp; } print $output " $next\n"; } if ($orikaeshi > 20 && $orikaeshi == $vp) { print $output "
    \n"; } } print $output " ]
    \n"; print $output <<"EOF"; 削除する投稿にチェックして削除パスワードを [管理者へメール]
    EOF } print $output <<"EOF";
    $end_message

    $center1

    簡易BBSΘ
    EOF # ☆ 上記リンクを削除すると利用規定違反です。 } sub getMassage { # 投稿データの取得 local($file) = @_; $head_end = 0; undef %MES; if (open(IN,"$data_dir$file")) { while () { s/\n//g; ($key,$val) = split(/\t/); if ($key eq "value") { $MES{$key} .= "
    \n" if (defined($MES{$key})); $MES{$key} .= $val; } else { $MES{$key} .= "\0" if (defined($MES{$key})); $MES{$key} .= $val; } } close(IN); } else { return 0; } } sub tag_ok { # 一旦すべて無効にしたデータから有効にするタグだけを元に戻す処理 local($_) = $_[0]; s/\r/\f/g; s/"/"/g; 1 while s/(.*)(<(b)>(.*)<\/b>)/$1$4<\/b>/i; 1 while s/(.*)(<(i)>(.*)<\/i>)/$1$4<\/i>/i; 1 while s/(.*)(<(u)>(.*)<\/u>)/$1$4<\/u>/i; 1 while s/<font([\s\w\=\#\"\'\+\-]+)>//i; 1 while s/<\/font>/<\/font>/i; s/\f/\r/g; $_; } sub mail_form { # 転送フォーム(匿メール) ($ret) = &getMassage("$in{'mailto'}$EXT"); if (!$ret) { &error("ERROR","投稿が削除されたか、何らかの原因でメール転送ができません."); } print "Content-type: text/html\n\n"; print <<"EOF"; $title_bar メール転送 $body $center1

    "$MES{'uname'}さん"へメールを転送します

    お名前
    Eメール
    タイトル
    本文
    発信元 $REMOTE_HOST | $HTTP_USER_AGENT
     
    $center2 EOF exit; } sub sendmail { # 電子メール処理 local($mailto,$subject,$value) = @_; $value =~ s/
    /\n/gi; $value =~ s/  / /g; $value =~ s/<//g; $value =~ s/"/"/g; if (open(OUT,"| $sendmail -t")) { print OUT &jis("X-Processed: $date_now\n"); print OUT "X-HTTP_REFERER: $ENV{'HTTP_REFERER'}\n"; print OUT "X-INFO: $REMOTE_HOST | $HTTP_USER_AGENT\n"; print OUT "To: $mailto\n"; print OUT "Errors-To: $admin_email\n"; if ($in{'email'}) { print OUT "Reply-To: $in{'email'}\n"; print OUT "From: $in{'email'}\n"; } else { print OUT "Reply-To: $mailto\n"; print OUT "From: nobody\n"; } print OUT &jis("Subject: $subject\n"); print OUT "Content-Transfer-Encoding: 7bit\n"; print OUT 'Content-Type: text/plain; charset=iso-2022-jp' . "\n\n"; print OUT &jis("$value\n"); close(OUT); } } sub jis { # 電子メール用のJIS変換処理 local($msg) = @_; $msg =~ s/<//g; &jcode'convert(*msg,'jis'); return $msg; } sub Copyright { # 著作ロゴ画像の生成(最初の1回のみ実行される) @array = ( "47","49","46","38","39","61","27","00","1a","00","b3","00","00","00","00","00","ff","ff","ff","00", "00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","00", "00","00","00","00","00","00","00","00","00","00","00","00","00","00","00","92","92","92","00","00", "00","21","f9","04","01","00","00","00","00","2c","00","00","00","00","27","00","1a","00","40","04", "b6","10","c8","49","ab","bd","d8","86","e0","b6","fb","1b","d7","01","5e","08","92","60","19","5c", "62","e7","b9","9f","2b","be","e1","86","d5","38","89","87","d2","6e","67","93","d6","88","33","eb", "f1","76","41","5e","c5","c7","6c","fa","58","29","14","cc","25","f5","9d","80","ad","df","2b","75", "bd","75","7b","d3","52","2a","2b","8c","6d","57","46","22","6d","cd","e6","ca","be","94","b2","59", "7e","da","c2","e3","f2","5a","6c","2e","e5","b3","da","6f","81","6c","44","40","69","3f","86","48", "19","35","1a","59","3a","73","34","58","70","62","81","63","6a","2a","32","25","1a","61","61","8e", "6f","26","82","4b","94","67","55","55","2a","45","14","7b","97","a9","a9","00","66","7b","ac","7f", "4e","4c","88","87","7f","63","b7","82","a6","54","8a","b8","9f","be","67","b5","50","bd","64","45", "9f","77","71","75","33","c5","ca","23","28","c1","41","ad","af","c6","a9","d3","51","85","d7","d8", "19","11","00","00","3b"); if (open(OUT,"> $images_dir$copyright")) { foreach (@array) { $data = pack('C*',hex($_)); print OUT $data; } close(OUT); chmod(0666,"$images_dir$copyright"); sleep(1); } } sub error { # エラールーチン local (@msg) = @_; local ($i); print "Content-type: text/html\n\n"; print <<"EOF"; ERROR $body

    $_[0]

    EOF print "
      \n"; foreach $i (1 .. $#msg) { print "
    • $msg[$i]\n"; } print "
    \n"; print <<"EOF";
    EOF exit; } # End of Script