#!/usr/bin/perl # ---------------------------------------------------------------------------------- $master_name = '多重債務相談'; # 管理者の名前 $master_email = 'mail@kaikeijinkai.com'; # 管理人のメールアドレス $master_pass = 'shigeji'; # 管理人のパスワード $master_url = 'http://www.kaikeijinkai.com/hasan/'; # 管理者のURL(トップページ) # ------------------------------------------------------- # ファイル関連設定 ※必須 # ------------------------------------------------------- $jcode = './jcode.pl'; # jcode.plの位置 $cgifile = './bbs1.cgi'; # このCGIの位置 $datafile = './bbs1.dat'; # データー記録ファイル $home_gif = './home.gif'; # HP用画像の位置 $home_w = '44'; # HP用画像の横幅 $home_h = '14'; # HP用画像の縦幅 $mail_gif = './mail.gif'; # Mail用画像の位置 $mail_w = '31'; # Mail用画像の横幅 $mail_h = '16'; # Mail用画像の縦幅 $cookie_name = 'bbsusr'; # クッキーの名前(必要以外、変更不要) # ------------------------------------------------------- # その他必要に応じて設定する項目 # ------------------------------------------------------- $title = '多重債務ご意見板'; # このCGIのタイトル $max_page = '10'; # 1ページの表示記事数 $max_report = '30'; # 最大記事登録数(極端に大きくするとファイルが巨大化します) $sheet = '1'; # スタイルシートを使用する(1=する 0=しない) $stylesheetfile = './style.css'; # スタイルシートファイルのパス $back_img = ''; # 背景画像のパス(背景画像を使用しない場合は空白にする) $title_img = 'bbsty1.gif'; # タイトル画像のパス(背景画像を使用しない場合は空白にする) $table_size = '480'; # 記事テーブルの横サイズ(ピクセル数か%で指定) $lockfile = './bbs1.lock'; # ロックファイル名(必要以外変更しなくても結構です) $lock_mode = '2'; # ロックモード(symlink関数=1 open関数=2) "1"でエラーの場合は"2"にする # ---------- 各色設定部 -------------- $title_size = ''; # このCGIのタイトル文字サイズ $title_color = ''; # このCGIのタイトルの文字色 $title_bgcolor = '#000000'; # 記事テーブル、項目の背景色 $title_color = '#ffffff'; # 記事タイトル文字色 # ---------- body色設定部 ------------ $bgcolor = '#000000'; # 背景色 $text_color = '#808080'; # 通常文字色 $link_color = '#6633ff'; # LINKの文字色 $alink_color = '#ff00ff'; # ALINKの文字色 $vlink_color = '#cc0099'; # VLINKの文字色 # ********************************************************************************** # オプション設定終わり ↑ここまで # ---------------------------------------------------------------------------------- # これ以降書き換えをする場合は、個人の責任で行って下さい。 # ********************************************************************************** # [メイン処理] if (!(-r $jcode)) { &error("jcode.plが見つかりません。"); } require $jcode; @DATA = &read_file($datafile); &read_form; if ($FORM{'ac'} eq 'new') { &html_new; } elsif ($FORM{'ac'} eq 'control') { &password; } elsif ($FORM{'ac'} eq 'password') { &delete1; } elsif ($FORM{'ac'} eq 'delete') { &delete2; } elsif ($FORM{'ac'} eq 'regist') { &check_registry; } &html_view; # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [ヘッダー部分] sub html_header { print "Content-type: text/html\n\n"; print "\n"; print "\n"; print "\n"; if($sheet) { print "\n"; } print "$title\n"; print "\n"; if($back_img) { print "\n"; } else { print "\n"; } print "
\n"; print "\n"; if($title_img) { print "\n"; } else { print "$title

\n"; } print "

トップページへ\n"; print "\n"; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [フッター部分] sub html_footer { print "
\n"; print "管理者へメール  ログ管理\n"; print "\n\n"; print "\n"; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [トップ表示] sub html_view { &html_header; # 投稿部表示 &html_toukou; # 登録記事数を求める。 $max_data = @DATA; # 改ページ処理 if ($FORM{'page'} eq '') { $end_page = 0; } else { $end_page = $FORM{'page'}; } $end_list = ($end_page + $max_page); if ($end_page < 0) { $end_page = 0; } if ($end_list >= $max_data) { $end_list = $max_data; } # 記事の表示 print "

\n"; for ($i = $end_page;$i<$end_list;$i++) { @log = split(/★/,$DATA[$i]); local($number,$date,$name,$title,$mail,$hpurl,$com) = split(/☆/,$log[$_]); $name =~ s/\0/☆/g; $title =~ s/\0/☆/g; $com =~ s/\0/☆/g; print "\n\n"; print "\n"; print "
\n"; print "[$number] $title

\n"; print "投稿者:$name \n"; if ($mail ne '') { print "\"$name\"\n"; } if ($hpurl ne '') { print "\"ホームページ\"\n"; } print "投稿日:$date

\n"; print "
\n"; print "$com\n"; print "
\n"; print "


\n"; } print "


\n\n"; # 次ページ用 $next_page = $end_list; # まだデータが残っている場合は、次ページボタンを付け、 # 1ページに表示した人数を $next_page で返す。 if ($end_list ne $max_data) { print "
\n"; print "
\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; } &html_footer; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [投稿部] sub html_toukou { &read_cookie; # ブラウザによってサイズを変更する。 local($ad_width,$name_width,$com_width) = &bura_check; # 投稿部分 print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n\n"; print "\n"; print "\n\n"; print "\n"; print "\n\n"; print "\n"; print "\n\n"; print "\n"; print "\n\n"; print "
投稿者名 ハンドル・ニックネームも可
タイトル
Eメール
HP(URL)
コメント

\n\n"; print "返信希望の方はEメールを、リンク希望の方はHPを入力して下さい。
\n"; print "タグの使用は、FONT COLOR=#******〜/FONT または A HREF=***〜/A
\n"; print "程度で活用して下さい。負担のかかるタグの使用は、ご遠慮願います。
\n"; print "管理者が不適切と判断した投稿記事は削除させていただきます。
\n"; print "ネチケット(ネットマナー)を守り投稿してくださいね。^_^;


\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n\n"; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [投稿チェック] sub check_registry { if ($FORM{'name'} eq "") { &error("名前を入力してください。"); } if ($FORM{'title'} eq '') { $FORM{'title'} = "無題"; } if ($FORM{'com'} eq "") { &error("内容を入力してください。"); } else { ®istry; } } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [ファイルに記録] sub registry { # クッキー記録 &set_cookie; # 登録番号取得 $number = $DATA[0] + 1; # 現在時間の取得 $date = &time; $FORM{'name'} =~ s/☆/\0/g; $FORM{'name'} =~ s/★/\0/g; $FORM{'title'} =~ s/☆/\0/g; $FORM{'title'} =~ s/★/\0/g; $FORM{'com'} =~ s/\n//g; $FORM{'com'} =~ s/\r/
/g; $FORM{'com'} =~ s/☆/\0/g; $FORM{'com'} =~ s/★/\0/g; # 最大記録数より大きければ古い記事を削除 $i = 0; foreach $log (@DATA) { $i++; if ($i == $max_report) { last; } push(@NEW,$log); } # データを $value に代入。 $value = "$number☆$date☆$FORM{'name'}☆$FORM{'title'}☆$FORM{'mail'}☆$FORM{'hpurl'}☆$FORM{'com'}★\n"; # データをファイルの最初に記録するようにフォーマット unshift(@NEW,$value); # ロック開始 if($lock_mode == 1) { &lock1; } elsif ($lock_mode == 2) { &lock2; } # ファイルを更新 if (!open(OUT, ">$datafile")) { &error("ファイルに記録できませんでした。"); } print OUT @NEW; close (OUT); # ロック解除 &fileunlock; print "Location: $cgifile" . '?' . "\n\n"; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [記録ファイルの読み込み] sub read_file { local($data_file) = $_[0]; if (!open(IN,$data_file)) { &error("ファイルを読み込みできませんでした。"); } local(@data_files) = ; close(IN); return @data_files; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [パスワード入力画面] sub password { &html_header; print "

\n"; print "管理者用のパスワードを入力して下さい。

\n"; print "
\n"; print ""; print "\n"; print "\n"; print "
\n"; print "
\n"; &html_footer; exit; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [認証] sub pass { $flag = 0; if($FORM{'pwd'} eq $master_pass) { $flag = 1; } if(!$flag) { &error("パスワードが違います。"); } return; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [削除処理 1] sub delete1 { # パスワード認証 &pass; &html_header; print "
\n"; print "
\n"; print "削除する記事を選択して、削除してください。

\n"; print "\n"; print ""; print ""; print ""; print "\n\n"; # 記事の表示 foreach $lines (@DATA) { local($number,$date,$name,$title,$mail,$hpurl,$com) = split(/☆|★/,$lines); print ""; print ""; print ""; print "\n"; } print "
 ログNO名前タイトル
$number$name$title


\n\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n\n"; &html_footer; exit; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [削除処理 2] sub delete2 { # パスワード認証 &pass; foreach $lines (@DATA) { local($number,$date,$name,$title,$mail,$hpurl,$com) = split(/☆|★/,$lines); $del = 'up'; foreach $get (@DEL) { if ($get eq $number) { $del = 'del';} } if ($del eq 'up') { push(@NEW,$lines); } } # ロック開始 if($lock_mode == 1) { &lock1; } elsif ($lock_mode == 2) { &lock2; } if (!open(OUT, ">$datafile")) { &error("ファイルに記録できませんでした。"); } print OUT @NEW; close (OUT); # ロック解除 &fileunlock; print "Location: $cgifile" . '?' . "\n\n"; exit; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [ファイルロック(symlink)] sub lock1 { local($retry) = 5; while (!symlink(".", $lockfile)) { if(--$retry <= 0) { &error("ただ今混雑中です。しばらくしてアクセスしてください。"); } sleep(1); } } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [ファイルロック(open)] sub lock2 { foreach (1 .. 5) { if (-e $lockfile) { sleep(1); } else { open(LOCK,">$lockfile"); close(LOCK); return; } } &error("ただ今混雑中です。しばらくしてアクセスしてください。"); } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [ファイルロック解除] sub fileunlock { if (-e $lockfile) { unlink($lockfile); } } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [クッキー関連処理] # クッキー取得 sub read_cookie { local($cookies) = $ENV{'HTTP_COOKIE'}; local($pair,%DUMMY); local(@pairs) = split(/;/,$cookies); foreach $pair (@pairs) { local($name,$value) = split(/=/,$pair); $name =~ s/ //g; $DUMMY{$name} = $value; } @pairs = split(/,/,$DUMMY{$cookie_name}); foreach $pair (@pairs) { local($name,$value) = split(/#/,$pair); $COOKIE{$name} = $value; } } # クッキー記録 sub set_cookie { # クッキーの有効期限を30日にする local($csec,$cmin,$chour,$cmday,$cmon,$cyear,$cwday) = gmtime(time + 30*24*60*60); $cyear = $cyear + 1900; $cmday = sprintf("%.2d",$cmday); $chour = sprintf("%.2d",$chour); $cmin = sprintf("%.2d",$cmin); $csec = sprintf("%.2d",$csec); $cmon = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$cmon]; $cwday = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$cwday]; $date_gmt = "$cwday, $cmday\-$cmon\-$cyear $chour:$cmin:$csec GMT"; local($cook) = "name\#$FORM{'name'}\,mail\#$FORM{'mail'}\,hpurl\#$FORM{'hpurl'}"; print "Set-Cookie: $cookie_name=$cook; expires=$date_gmt\n"; } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [フォームデータを取得し、文字コード統一] sub read_form { local($pair,$form_data); if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $form_data, $ENV{'CONTENT_LENGTH'}); } else { $form_data = $ENV{'QUERY_STRING'}; } local(@pairs) = split(/&/,$form_data); foreach $pair (@pairs) { local($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'); if ($name eq 'get') { push(@DEL,$value); } else { $FORM{$name} = $value; } } } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [ブラウザチェック] sub bura_check{ $ad_width = 50; $name_width = 20; $com_width = 50; $agent = $ENV{'HTTP_USER_AGENT'}; if ($agent =~ /MSIE 3/i || $agent =~ /MSIE 4/i || $agent =~ /MSIE 5/i) { $ad_width = $ad_width * 1.2; $name_width = $name_width * 1.5; $com_width = $com_width * 1.1; } return ($ad_width,$name_width,$com_width); } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [現在時刻を取得] sub time{ $ENV{'TZ'} = "JST-9"; ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(); $year = $year + 1900; $mon = sprintf("%.2d",$mon +1); $mday = sprintf("%.2d",$mday); $hour = sprintf("%.2d",$hour); $min = sprintf("%.2d",$min); $sec = sprintf("%.2d",$sec); # 曜日を日本語化 @week = ('日','月','火','水','木','金','土'); $wday = $week[$wday]; local($date) = "$year年$mon月$mday日($wday) $hour:$min.$sec"; return ($date); } # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # [エラー関連] sub error { &html_header; print "



\n"; print "$_[0]\n"; print "



\n"; &html_footer; # ロック解除 &fileunlock; exit; }