#!/usr/bin/perl # ---------------------------------------------------------------------------- # $CGI_VER = 'かんたん・てーま掲示板 ver 1.02 by 川原 千種' ; # 書替えないこと # ---------------------------------------------------------------------------- # # 定数ファイル require 'const.pl'; # 日付を取得 ここは定型処理 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); if ($year > 50) {$year += 1900 ;} else{$year += 2000 ;} @wday_array = ('日','月','火','水','木','金','土'); $date_now = sprintf("%04d年%02d月%02d日(%s)%02d時%02d分%02d秒",$year,$mon +1,$mday,$wday_array[$wday],$hour,$min,$sec); $date_num = sprintf("%04d%02d%02d%02d%02d%02d",$year,$mon +1,$mday,$hour,$min,$sec); # リモートホストを取得 $addr = $ENV{'REMOTE_ADDR'}; $host = $ENV{'REMOTE_HOST'}; if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; } # ブラウザ取得 $browser = $ENV{'HTTP_USER_AGENT'}; $browser =~ s//>/g; # 区切り文字の”,”があれば”,”に変換 $value =~ s/\,/,/g; # 改行コードを
に変換(上からWin、Mac、Unix用の処理) $value =~ s/\r\n/
/g; $value =~ s/\r/
/g; $value =~ s/\n/
/g; # 連想配列に格納 $FORM{$name} = $value; } # /////////////////////////////////////////////////////////////////////////////// # # メインルーチン 処理の振り分け # /////////////////////////////////////////////////////////////////////////////// # # 「登録ボタン」を押したとき if ($FORM{'action'} eq 'regist') { &load_file ; &error_ck; ®ister; # リロード &out_main ; &out_fetter ; } # 「表示」ボタンを押したとき elsif ($FORM{'action'} eq 'view') { if ($FORM{'sel_theme'} eq '全項目') { &out_alldata ; } else { &out_main ; } &out_fetter ; } # 「次のページ」ボタンを押したとき elsif ($FORM{'action'} eq 'page') { if ($FORM{'sel_theme'} eq '全項目') { &out_alldata ; } else { &out_main ; } &out_fetter ; } # はじめの呼び出しなど通常表示 else { &out_selectform ; &out_fetter ; } # /////////////////////////////////////////////////////////////////////////////// # # 書込みファイルの読み込み # /////////////////////////////////////////////////////////////////////////////// # sub load_file { open (IN,"$data_file") || &error('オープンエラー','指定された書込みファイルが開けません。'); @LINES = ; close (IN); } # /////////////////////////////////////////////////////////////////////////////// # # HTMLの出力処理 # /////////////////////////////////////////////////////////////////////////////// # # 初期表示=表示するデータの選択 sub out_selectform { open (IN,"$theme_file") || &error('オープンエラー','指定されたテーマファイルが開けません。'); @THEME = ; close (IN); print "Content-type: text/html\n\n"; print "$main_title\n"; print "$body\n"; print "
\n"; print "$main_title\n"; print "

\n"; print "$mes_top1\n"; print "$mes_top2\n"; print "$mes_top3\n"; print "
\n"; # 選択ボタンを表示 print "テーマを選択してください
\n" ; print "\n" ; print "\n"; print "\n" ; print "
\n"; print "
\n"; print "

\n" ; } # メイン画面表示。 sub out_main { &load_file ; print "Content-type: text/html\n\n"; print "$main_title\n"; print "$body\n"; print "

\n"; print "$main_title
\n"; print "$FORM{'sel_theme'}\n"; print "

\n"; print "$mes_top1\n"; print "$mes_top2\n"; print "$mes_top3\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"; print "

\n"; print "
\n"; print "
\n"; print "
\n"; print "

\n" ; # --- データ表示 ------------------------------------# if ($FORM{'line_num'} eq '') { $line_num = 0; } else { $line_num = $FORM{'line_num'}; } if ($FORM{'page'} eq '') { $page = 0; } else { $page = $FORM{'page'}; } $line_now = 0; while ($line_now <= $def-1 && $line_num <= $#LINES) { ($out_date_num,$out_theme,$out_date_now,$out_name,$out_email,$out_title,$out_comment,$out_host,$out_browser) = split(/,/, $LINES[$line_num]); $line_num ++ ; if ($out_theme eq $FORM{'sel_theme'}) { &out_onedata ; $line_now++ ; } } print "\n" ; # --- 改ページ処理 ------------------------------------# $i = $page * $def + 1 ; $j = ($page + 1) * $def ; $page++ ; print "


\n"; # $#LINES >= 0ではない、0件処理をしたほうが良い? if ($#LINES >= 0) { if ($line_num-1 != $#LINES) { print "\n"; print "\n"; print "\n"; print "\n" ; print "\n"; print "\n"; print "\n"; } else { print "\n"; } } print "
新着順 $i \- $j
新着順 $i \-> 最後

\n\n"; } # 全項目表示 sub out_alldata { &load_file ; print "Content-type: text/html\n\n"; print "$main_title\n"; print "$body\n"; print "

\n"; print "$main_title
\n"; print "$FORM{'sel_theme'}\n"; print "

\n"; print "$mes_top1\n"; print "$mes_top2\n"; print "$mes_top3\n"; print "
\n"; print "

\n"; print "全項目は閲覧のみです。\n"; print "


\n"; print "

\n" ; # --- データ表示 ------------------------------------# if ($FORM{'page'} eq '') { $page = 0; } else { $page = $FORM{'page'}; } $page_end = $page + $def - 1; if ($page_end > $#LINES) { $page_end = $#LINES; } foreach ($page .. $page_end) { ($out_date_num,$out_theme,$out_date_now,$out_name,$out_email,$out_title,$out_comment,$out_host,$out_browser) = split(/,/, $LINES[$_]); &out_onedata ; } print "\n" ; # --- 改ページ処理 ------------------------------------# $page_next = $page_end + 1; $i = $page + 1; $j = $page_end + 1; print "


\n"; if ($#LINES >= 0) { if ($page_end != $#LINES) { print "\n"; print "\n"; print "\n"; print "\n" ; print "\n"; print "\n"; } else { print "\n"; } } print "
新着順 $i \- $j
新着順 $i \-> 最後

\n\n"; } # 一つの書込み単体を表示。 sub out_onedata { # 内容の中の自動リンク $out_comment =~ s/(https?|ftp|gopher|telnet|whois|news):\/\/([\w|\!\#\$\%\&\'\(\)\=\-\^\`\\\|\@\~\[\{\]\}\;\+\:\*\,\.\?\/]+)/$1:\/\/$2<\/a>/g; $out_comment =~ s/([\w|\!\#\$\%\'\=\-\^\`\\\|\~\[\{\]\}\+\*\.\?\/]+)\@([\w|\!\#\$\%\'\(\)\=\-\^\`\\\|\~\[\{\]\}\+\*\.\?\/]+)/$1\@$2<\/a>/g; print "
\n"; print "$out_title" ; # メールアドレスが記録されているデータにはリンクを付けて表示 if ($out_email ne '') { print " お名前:$out_name ■MAIL"; } else { print " お名前:$out_name"; } print " 投稿日:$out_date_now"; print "$out_theme
\n" ; print "

\n"; print "

$out_comment\n"; # ホスト・ブラウザ情報を表示しない場合はこの一行を消去 print "

$out_host($out_browser)

\n" ; print "

\n"; } # フッターを表示。 sub out_fetter { print "
\n"; print "\n"; print "\n"; print "
\n"; print "

\n


\n"; print "
終了\n"; print "
\n"; if ($admin_url ne '') { print "管理モード\n"; print "

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

\n"; print "\n"; } # /////////////////////////////////////////////////////////////////////////////// # # エラーチェック # /////////////////////////////////////////////////////////////////////////////// # sub error_ck { # 空白チェック if ($FORM{'title'} eq "") { push(@ERROR,"●タイトル"); } if ($FORM{'comment'} eq "") { push(@ERROR,"●内容") ; } if ($FORM{'name'} eq "") { push(@ERROR,"●名前"); } if (@ERROR) { push(@ERROR,"が入力されてません。"); &error('空白エラー',@ERROR); } # メールアドレス形式チェック if ($FORM{'emai'} ne "" && !($FORM{'email'} =~ /(.*)\@(.*)\.(.*)/)) { &error('メールアドレスエラー',"メールアドレスが正しく記入されていません。"); } ($out_date_num,$out_theme,$out_date_now,$out_name,$out_email,$out_title,$out_comment,$out_host) = split(/,/, $LINES[0]); if ($FORM{'name'} eq $out_name && $FORM{'title'} eq $out_title && $FORM{'comment'} eq $out_comment) { &error('same_write'); } } # /////////////////////////////////////////////////////////////////////////////// # # 書込み処理 # /////////////////////////////////////////////////////////////////////////////// # sub register { $new_line = "$date_num,$FORM{'sel_theme'},$date_now,$FORM{'name'},$FORM{'email'},$FORM{'title'},$FORM{'comment'},$host,$browser\n"; unshift(@LINES,$new_line); # 辞書ファイルに書きこみ(ロック処理あり) $tmp_dummy = "$$\.tmp"; open(TMP,">$tmp_dummy") || die "Can't create tmp file.\n"; close(TMP); chmod 0666,$tmp_dummy; open(TMP,">$tmp_dummy") || die "Can't open tmp file.\n"; print TMP (@LINES); close(TMP); rename($tmp_dummy,$data_file); } # /////////////////////////////////////////////////////////////////////////////// # # エラー処理 # /////////////////////////////////////////////////////////////////////////////// # sub error { ($error,@error_fields) = @_; # 同一内容の連続書込みの場合はリロードとして扱う if ($error eq 'same_write') { &out_main ; &out_fetter ; exit; } print "Content-type: text/html\n\n"; print "$title\n"; print "$body\n"; print "

$error

\n"; print "

@error_fields

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

\n"; print "\n"; exit; }