#!/usr/bin/perl #====↑「perl」言語が使用できるパスを指定==== #================================================ # Free-MultiRes Ver2.02 # Copyright (c) K3 (BBS Box) # Web:http://k-cubic.com/cgi/ (管理人:kinako) # E-Mail:kanrinin@k-cubic.com # # 2002/01/18 「,」が表示されるバグ修正。 # 2002/01/27 エラー処理時のバグ修正。 #================================================ #====初期設定開始======================================================================================== #====必須項目==== require './jcode.pl'; #日本語コード変換モジュールの場所を指定。 $data_file = './bbs.dat'; #データファイルの場所を指定。 $bbs_pass = './free-multires.cgi'; #この掲示板のパス。(掲示板のファイル名) $cover_file = './flower-multires.html'; #カバーの指定。(相対パスで指定) #====基本項目==== $cookie_name = 'freebbs'; #クッキーネームを指定。 $url = 'http://www.geocities.co.jp/HeartLand/7037/'; #「TOP」でリンクするURL指定。 $master_pass = 'xyz'; #管理者パスワード指定。 $save_max = '100'; #記事の最大記録数を指定。 $page_max = '10'; #1ページに表示する記事の最大数を指定。 $up_flag = '1'; #返信した記事を一番上にする場合は1、しない場合は0。 $toku2_flag = '0'; #トクトク系の場合は1、それ以外は0。 $save_flag = '0'; #通常は0、link関数が使えない場合は1、ファイルロックを使わない場合は2。 $base_url = 'http://www.kazushi.jp/cgi-bin/image/'; #CGIを置くサーバと画像を置くサーバが違うorCGI呼出サーバーが違う場合(niftyやbiglobeなど)に指定。 #↑を指定する必要がある場合は、画像を置くフォルダまでのパスを指定する。 #トップページと同じフォルダにフォルダに「image」フォルダ作って画像を置く場合、 #「http://wwwxx.xxx.ne.jp/~xxx/image/」と指定する。(最後は「/」で終わること) #====E-mail&Homeのリンク設定==== $icon_link = '1'; #アイコンでリンクする場合は1、テキストでリンクする場合は2 #====アイコンリンクの場合設定==== $mail_icon = 'http://www.kazushi.jp/cgi-bin/image/mail.gif'; #メールリンク用アイコンの指定。絶対パスがオススメ。 $home_icon = 'http://www.kazushi.jp/cgi-bin/image/home.gif'; #ホームページリンク用アイコンの指定。絶対パスがオススメ。 $link_icon_width = '20'; #アイコンの幅。 $link_icon_height = '20'; #アイコンの高さ。 #====テキストリンクの場合設定==== $mail_text = '[Mail]'; #メールリンクのテキスト。 $home_text = '[Home]'; #ホームページリンクのテキスト。 #====次へ&戻るボタンの指定==== #====HTML;とHTMLの間の行に「戻る」「次へ」ボタンを作ります。 #====必要に応じて、の場所に配置されます。 $back_button = < HTML $next_button = < HTML #====色指定0==== $color0[0] = '#99cc66'; $color0[1] = '#66cc99'; $color0[2] = '#6699cc'; $color0[3] = '#9966cc'; $color0[4] = '#ff77bb'; $color0[5] = '#ffbb88'; $color0[6] = '#ff88aa'; $color0[7] = '#aaaaaa'; #====色指定1==== $color1[0] = '#66cc33'; $color1[1] = '#33cc66'; $color1[2] = '#3366cc'; $color1[3] = '#6633cc'; $color1[4] = '#dd66aa'; $color1[5] = '#eeaa66'; $color1[6] = '#ee99bb'; $color1[7] = '#666666'; #====色指定2==== $color2[0] = ''; $color2[1] = ''; $color2[2] = ''; $color2[3] = ''; $color2[4] = ''; $color2[5] = ''; $color2[6] = ''; $color2[7] = ''; #====アイコン画像URL指定==== $icon[0] = '4'; $icon[1] = '5'; $icon[2] = '6'; $icon[3] = '7'; $icon[4] = '8'; $icon[5] = '10'; #====色指定方法(ラジオボタン→checked、プルダウンメニュー→selected) $color_checked = 'checked'; #====アイコン指定方法(ラジオボタン→checked、プルダウンメニュー→selected) $icon_checked = 'selected'; #====ブロックを作るときの参考情報==== #====要素関連======================== #====全ブロック共通で使用できる要素============================= # 画像の相対URLの前に置くベースURL #=============================================================== #====トップブロックで使用できる要素============================= # 「TOP」などのリンクのURL→$urlが入る。 # 掲示板のファイル名(フォームのaction属性で使用→$bbs_passが入る) #============================================================== #====記事ブロックで使用することができる「要素」================== # 記事ナンバー # 名前 # タイトル # コメント # E-mailのアドレス # HomeのURL # E-mailのアイコンorテキストリンク # Homeのアイコンorテキストリンク # 投稿日時 # 色指定0(16進数) # 色指定1(16進数) # 色指定2(16進数) # 親記事の色指定0と同じ色 # アイコン画像のURL #============================================================== #====フットブロックで使用できる要素============================ # 「TOP」などのリンクのURL→$urlが入る。 #============================================================== #====フォーム関連================== #====トップブロックで送信に使用することができるフォームのname========= # name 名前(必須) # title タイトル # comment コメント(必須) # mail E-mailのアドレス # home HomePageのURL # pass 削除用パスワード # page_top ページ指定(必須)→「」とすること。 # res_num 返信元の記事No.指定(必須) # action アクション指定(必須)→valueは空白でOK # color 色指定 # icon アイコン # フォームタグ、送信ボタン、リセットボタン、色指定ラジオボタン・アイコン指定プルダウンメニューは以下のものを改造してください。 # 改造するときはjavascript関係に注意して下さい。タグ内の「onclick="xxx()"」の部分がjacascriptの部分です。 #
# # # "> # ↑数字部分(3ヶ所)を変更しながら、必要な数を作ること。 # # ↑数字部分(2ヶ所)を変更しながら、必要な数を作ること。 # 色指定・アイコンはラジオボタン、プルダウンメニューのどちらでもできます。 #=========================================================== #====トップブロックで使用することができるクッキー「要素」======== # 名前 # E-mailのアドレス # HomePageのURL #=============================================================== #====ボトムブロックで送信に使用することができるフォーム========= # del_num 削除したい記事のナンバー # del_pass 削除したい記事のパスワード # 削除ボタンは以下のものを改造してください。 # 改造するときはjavascript関係に注意して下さい。タグ内の「onclick="xxx()"」の部分がjacascriptの部分です。 # # 次へ・戻るボタンは以下の要素を置き換えて表示します。ボタンそのもののデザインは「次へ&戻るボタンの指定」で行います。 # # #================================================================= #====初期設定終了======================================================================================== #====ここから下は変更する必要はありません==== &form_read; #フォームデータ取得。 &file_read; #ファイルデータ取得。 &block_read; #ブロックデータ取得。 &cookie_read; #クッキーデータ取得。 $ver = '2.02'; $color_num = @color0 - 1; $icon_num = @icon - 1; $mysite = "http://k-cubic.com/cgi/"; @k_youso = ('num','name','title','comment','mail','home','mail_link','home_link','date','re_title'); @c_youso = ('name','mail','home'); $k_num = @k_youso; $c_num = @c_youso; #====書込処理==== if ($form{'action'} eq 'write') { $date_now = &time_read; #現在時刻取得。 $host = &host_read; #ホスト取得。 #====フォームデータ処理==== if ($form{'name'} eq '' || $form{'comment'} eq '') { &error_html(form); } $form{'comment'} =~ s/\r/
/g; #改行を
タグに変更。 $form{'comment'} = &link_on($form{'comment'}); #リンクをはる。 if ($form{'res_num'} > 0) { $form{'comment'} = &res_on($form{'comment'}); #返信の場合、返信No.を追加する。 if ($up_flag == 1) { &kiji_up; } #記事を上げる。 } #====データ整理・記録処理==== $line_num = @maindata; if ($line_num >= $save_max) { &over_del; } #データ数が最大を超えていれば、一つ削除。 if (&double_check eq false) { #二重投稿を確認して、記事Noを取得。 $value = "date+$date_now\,num+$num\,name+$form{'name'}\,title+$form{'title'}\,comment+$form{'comment'}\,pass+$form{'pass'}\,mail+$form{'mail'}\,home+$form{'home'}\,color+$form{'color'}\,icon+$form{'icon'}\,host+$host\,res_num+$form{'res_num'}\,last_res+$num\,k3+k3\n"; unshift(@maindata,$value); @maindata = sort(@maindata); @maindata = reverse(@maindata); if (&data_save eq false) { &error_html(file); } } #====クッキー記録処理==== $value = "name+$form{'name'}\,mail+$form{'mail'}\,home+$form{'home'}\,pass+$form{'pass'}\,color+$form{'color'}\,icon+$form{'icon'}"; $cookie{'name'} = $form{'name'}; $cookie{'mail'} = $form{'mail'}; $cookie{'home'} = $form{'home'}; $cookie{'color'} = $form{'color'}; $cookie{'icon'} = $form{'icon'}; &cookie_save; #====削除処理==== } elsif ($form{'action'} eq 'delert') { if ($form{'del_pass'} eq '' || $form{'del_num'} < 1) { &error_html(pass); } &line_delert; } #====HTML記述処理==== if ($icon_link == 1) { $mail_link = "\">"; $home_link = "\" target=\"_blank\">"; } else { $mail_link = "\">$mail_text"; $home_link = "\" target=\"_blank\">$home_text"; } $kiji_html =~ s//$base_url/ig; $res_html =~ s//$base_url/ig; &data_sort; #データ整理・並び替え。 &top_end; #ページの最初の記事、最後の記事、次のページの最初、前のページの最初を取得。 $top_html =~ s//$page_max/ig; $top_html =~ s//$base_url/ig; $top_html =~ s//$url/ig; $top_html =~ s//$bbs_pass/ig; $top_html =~ s//$page_top/ig; if ($cookie{'color'} eq '' || $cookie{'color'} > $color_num) { $cookie{'color'} = 0; } if ($cookie{'icon'} eq '' || $cookie{'icon'} > $icon_num) { $cookie{'icon'} = 0; } $top_html =~ s//$color_checked/ig; $top_html =~ s//$icon_checked/ig; foreach $num_dam (0 .. $color_num) { $top_html =~ s///ig; } foreach $num_dam (0 .. $icon_num) { $top_html =~ s///ig; } $bottom_html =~ s//$base_url/ig; $bottom_html =~ s//$url/ig; &top_write; if ($page_end >= 0) { foreach $line ($page_top .. $page_end) { ($dammy, $dammy2, $data) = split(/\,\,/,$display_data[$line]); print "$data"; } } $num = 0; if ($page_top != 0) { $num += 2; } if ($save_end > $page_end + 1) { $num++; } if ($num == 0) { $bottom_html =~ s//$base_url/ig;} #次・戻なし if ($num == 1) { $bottom_html =~ s//$base_url/ig; $bottom_html =~ s//$next_button/ig; } #次 if ($num == 2) { $bottom_html =~ s//$base_url/ig; $bottom_html =~ s//$back_button/ig; } #戻 if ($num == 3) { $bottom_html =~ s//$base_url/ig; $bottom_html =~ s//$next_button/ig; $bottom_html =~ s//$back_button/ig; } #次・戻 print "$bottom_html"; print "
Presented by K3
\n"; print "\n"; exit; #====HTMLトップ関数=============================================================================== sub top_write { print "Content-type: text/html\n\n"; #Content-type宣言。 print "\n\n\n$toku2_cookie"; foreach $num (0..$c_num) { $top_html =~ s//$cookie{$c_youso[$num]}/ig; } print "$top_html\n"; } #====フォームデータ取得関数=============================================================================== sub form_read { local($name, $value, $pair); read(STDIN, $form_data, $ENV{'CONTENT_LENGTH'}); local(@pairs) = split(/&/,$form_data); 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/\n//g; $value =~ s/\,/,/g; $value =~ s/\+/+/g; $value =~ s//>/g; &jcode'convert(*value,'sjis'); $form{$name} = $value; } } #====クッキーデータ取得関数============================================================================== sub cookie_read { local($name, $value, $pair); $cookie = $ENV{'HTTP_COOKIE'}; local(@pairs) = split(/;/,$cookie); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ s/ //g; $cookie{$name} = $value; } @pairs = split(/\,/,$cookie{$cookie_name}); foreach $pair (@pairs) { ($name, $value) = split(/\+/, $pair); $cookie{$name} = $value; } } #====クッキーデータ記録関数============================================================================== sub cookie_save { $ENV{'TZ'} = "GMT"; local(@date) = localtime(time + 60 * 86400); $date[5] += 1900; $date[3] = sprintf("%02d",$date[3]); $date[2] = sprintf("%02d",$date[2]); $date[1] = sprintf("%02d",$date[1]); $date[0] = sprintf("%02d",$date[0]); local($wday) = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday') [$date[6]]; local($month) = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec') [$date[4]]; local($gmt) = "$wday, $date[3]\-$month\-$date[5] $date[2]:$date[1]:$date[0] GMT"; print "Set-Cookie: $cookie_name=$value; expires=$gmt\n"; $toku2_cookie = ''; if ($toku2_flag == 1) { $toku2_cookie = "\n"; } } #====ファイルデータ取得関数============================================================================== sub file_read { if (!open(FILE,"$data_file")) { &error_html(file); } @maindata = ; close(FILE); } #====カバーデータ取得関数============================================================================== sub block_read { if (!open(FILE,"$cover_file")) { &error_html(html_file); } @coverdata = ; close(FILE); $top_html = $kiji_html = $res_html = $bottom_html = ''; $num = 0; foreach $line (@coverdata) { if ($line =~ //i) { $num++; } elsif ($line =~ //i) { $num++; } elsif ($line =~ //i) { $kiji_html .= ""; $num++; } elsif ($line =~ //i) { $num += 2; } if ($num == 1) { $top_html .= $line; } elsif ($num == 2) { $kiji_html .= $line; } elsif ($num == 3) { $res_html .= $line; } elsif ($num == 4) { $bottom_html .= $line; } if ($line =~ //i) { $num--; } elsif ($line =~ //i) { $num++; } } } #====現在時刻取得関数===================================================================================== sub time_read { $ENV{'TZ'} = "JST-9"; local(@date) = localtime(time); $date[5] += 1900; $date[4] = sprintf("%02d",$date[4] + 1); $date[3] = sprintf("%02d",$date[3]); $date[2] = sprintf("%02d",$date[2]); $date[1] = sprintf("%02d",$date[1]); $date[0] = sprintf("%02d",$date[0]); $date[6] = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$date[6]]; $date = "$date[5]/$date[4]/$date[3]($date[6]) $date[2]:$date[1]:$date[0]"; $date; } #====ホスト取得======================================================================================= sub host_read { local($address) = $ENV{'REMOTE_ADDR'}; local($host) = gethostbyaddr(pack("C4",split(/\./,$address)),2); if ($host eq ''){ $host = $address; } $host; } #====表示データ範囲決定関数============================================================================= sub top_end { if ($form{'page_top'} eq '' || $form{'page_top'} < 0) { $page_top = 0; } else { $page_top = $form{'page_top'}; } $save_end = @display_data; $page_next = $page_top + $page_max; $page_back = $page_top - $page_max; $page_end = $page_next - 1; if ($page_end >= $save_end) { $page_end = $save_end - 1; } } #====エラー処理関数===================================================================================== sub error_html { $error = $_[0]; if ($error eq 'file') { $msg = 'ファイルの操作に失敗しました。
'; } elsif ($error eq 'html_file') { $msg = 'HTMLファイルを読み込めませんでした。
'; } elsif ($error eq 'form') { $msg = '未入力項目があるか、送信データに異常がありました。
'; } elsif ($error eq 'pass') { $msg = 'パスワード、もしくは記事Noが送信されませんでした。
'; } else{ $msg = '原因不明のエラーが発生しました。
'; } &top_write; print "\n

Error

\n$msg\n

"; exit; } #====リンク設定関数====================================================================================== sub link_on { local($_) = $_[0]; $_ =~ s/([^=^\"]|^)((http|ftp):[!#-9A-~]+)/$1$2<\/A>/g; $_ =~ s/([!#-9A-~\-\_]+\@[!#-9A-~\-\_\.]+)/$1<\/A>/g; $_; } #====返信No.追加関数==================================================================================== sub res_on { local($_) = $_[0]; $_ = ">No\.$form{'res_num'}
" . $_; $_; } #====返信No.削除関数==================================================================================== sub res_off { local($_) = $_[0]; $_ =~ s/(^)(>No\.[!#-9A-~]+)(
)//i; $_; } #====二重投稿防止&記事No取得関数====================================================================== sub double_check { local($pair, $end, $name, $value); local($double) = false; $num = ''; if ($line_num < 10) { $end = $line_num - 1; } else { $end = 9; } foreach $line (0..$end) { local (@pairs) = split(/\,/,$maindata[$line]); foreach $pair (@pairs) { ($name, $value) = split(/\+/,$pair); $file{$name} = $value; } if ($file{'comment'} eq $form{'comment'}) { $double = true; last; } if ($line == 0) { $num = $file{'num'} + 1; } } if ($num eq '') { $num = 1; } $double; } #====オーバー分記事削除================================================================================= sub over_del { local($end) = @maindata - 1; local($del_line) = $end; foreach $line (0..$end) { %file = (''); local (@pairs) = split(/\,/,$maindata[$line]); foreach $pair (@pairs) { ($name, $value) = split(/\+/,$pair); $file{$name} = $value; } if ($line == 0) { $del_num = $file{'num'}; } if ($file{'last_res'} eq '') { $file{'last_res'} = $file{'num'}; } if ($file{'last_res'} <= $del_num) { $del_num = $file{'last_res'}; $del_line = $line; } } splice(@maindata,$del_line,1); } #====記事アップ関数==================================================================================== sub kiji_up { local($end) = @maindata - 1; foreach $line (0..$end) { %file = (''); local (@pairs) = split(/\,/,$maindata[$line]); foreach $pair (@pairs) { ($name, $value) = split(/\+/,$pair); $file{$name} = $value; } if ($line == 0) { $num = $file{'num'} + 1; } if ($num eq '') { $num = 1; } if ($form{'res_num'} == $file{'res_num'} || $form{'res_num'} == $file{'num'}) { $maindata[$line] = "date+$file{'date'}\,num+$file{'num'}\,name+$file{'name'}\,title+$file{'title'}\,comment+$file{'comment'}\,pass+$file{'pass'}\,mail+$file{'mail'}\,home+$file{'home'}\,host+$host\,res_num+$file{'res_num'}\,color+$file{'color'}\,icon+$file{'icon'}\,last_res+$num\,k3+k3\n"; } } } #====記事削除関数======================================================================================= sub line_delert { local($del) = false; local($end) = @maindata - 1; foreach $line (0..$end) { local (@pairs) = split(/\,/,$maindata[$line]); foreach $pair (@pairs) { ($name, $value) = split(/\+/,$pair); $file{$name} = $value; } #====パスワードチェック==== if ($form{'del_num'} == $file{'num'}) { if ($form{'del_pass'} eq $file{'pass'} || $form{'del_pass'} eq $master_pass) { splice(@maindata,$line,1); $del = true; last; } } } if ($del eq true) { if (&data_save eq false) { &error_html(file); } } } #====ファイルデータ整理関数===================================================================================== sub data_sort { local ($pair, $line, $name, $value); @maindata = reverse(@maindata); foreach $line (@maindata) { %file = (''); local (@pairs) = split(/\,/,$line); foreach $pair (@pairs) { ($name, $value) = split(/\+/,$pair); $file{$name} = $value; } $mail_link_dammy = $mail_link; $home_link_dammy = $home_link; if ($file{'mail'} ne '') { $mail_link_dammy =~ s//$file{'mail'}/ig; $file{'mail_link'} = $mail_link_dammy; } if ($file{'home'} ne '') { $home_link_dammy =~ s//$file{'home'}/ig; $file{'home_link'} = $home_link_dammy; } if ($file{'title'} ne '') { $file{'re_title'} = $file{'title'}; $file{'re_title'} =~ s/\"/”/g; $file{'re_title'} =~ s/\'/’/g;} if ($file{'color'} eq '' || $file{'color'} > $color_num) { $file{'color'} = 0; } if ($file{'icon'} eq '' || $file{'icon'} > $icon_num) { $file{'icon'} = 0; } if ($file{'res_num'} eq '' || $file{'res_num'} == 0) { $kiji_html_dammy = $kiji_html; foreach $num (0..$k_num) { $kiji_html_dammy =~ s//$file{$k_youso[$num]}/ig; } $kiji_html_dammy =~ s//$color0[$file{'color'}]/ig; $kiji_html_dammy =~ s//$color1[$file{'color'}]/ig; $kiji_html_dammy =~ s//$color2[$file{'color'}]/ig; $kiji_html_dammy =~ s//$icon[$file{'icon'}]/ig; if ($file{'last_res'} eq '') { $file{'last_res'} = $file{'num'}; } $dam_num = sprintf("%06d",$file{'last_res'}); $dam_data{$file{'num'}} = "$dam_num\,\,$file{'color'}\,\,$kiji_html_dammy"; } elsif ($dam_data{$file{'res_num'}} ne '') { $file{'comment'} = &res_off($file{'comment'}); ($dammy,$kiji_color,$dammy2) = split(/\,\,/,$dam_data{$file{'res_num'}}); $res_html_dammy = $res_html; $res_html_dammy =~ s//$color0[$file{'color'}]/ig; $res_html_dammy =~ s//$color1[$file{'color'}]/ig; $res_html_dammy =~ s//$color2[$file{'color'}]/ig; $res_html_dammy =~ s//$color0[$kiji_color]/ig; $res_html_dammy =~ s//$icon[$file{'icon'}]/ig; foreach $num (0..$k_num) { $res_html_dammy =~ s//$file{$k_youso[$num]}/ig; } $dam_data{$file{'res_num'}} =~ s//$res_html_dammy\n/ig; } } foreach (keys %dam_data) { push(@display_data,$dam_data{$_}); } @display_data = sort(@display_data); @display_data = reverse(@display_data); } #====データ記録関数===================================================================================== sub data_save { if ($save_flag == 0) { $tmpfile = 'bbs.tmp'; foreach (1 .. 10) { unless (-f $tmpfile) { $tmpflag = true; last; } $tmpflag = false; sleep(1); } if ($tmpflag eq true) { $tmp_dummy = "$$\.tmp"; if (!open(TMP,">$tmp_dummy")) { &error_html(file); } close(TMP); chmod 0666,$tmp_dummy; if (!open(TMP,">$tmp_dummy")) { &error_html(file); } print TMP @maindata; close(TMP); foreach (1 .. 10) { unless (-f $tmpfile) { if (!open(TMP,">$tmpfile")) { &error_html(file); } close(TMP); rename($tmp_dummy,$data_file); unlink $tmpfile; $tmpflag = true; last; } $tmpflag = false; sleep(1); } } } elsif ($save_flag == 1) { $tmp_file = 'bbs.tmp'; $tmp_flag = 0; foreach (1 .. 10) { unless (-f $tmp_file) { if (open(TMP,">$tmp_file")) { print TMP "$data_file TMP File\n"; close(TMP); if (open(TMP, ">$data_file")) { print TMP @maindata; close(TMP); $tmp_flag = 1; unlink $tmp_file; last; } } } sleep(1); } } else { if (!open(FILE, ">$data_file")) { &error_html(file); } print FILE @maindata; close(FILE); $tmp_flag = 1; } $tmp_flag; }