#!/usr/local/bin/perl #==========================================================# # BBOARD CGI (bboard.cgi) (2001/05/26) # # 告知版 # # Copyright(C) KG works. 2002 # # info@kg-works.dip.jp # # http://kg-works.dip.jp/ # #==========================================================# # [History] # 01/12/02 # 02/07/15 最大件数、カウンタ、管理者モードでの削除機能をPOST # 02/12/24 HTMLの見直しファイル構成変更 # 02/12/27 画像再登録機能 $ver = 'BBoard v1.14'; # バージョン情報 # ライブラリ取り込み require './lib/jcode.pl'; require './lib/cgi-lib.pl'; #=== 設定項目 === # タイトル名 $title = "画像付き子犬出産情報掲示板"; # タイトルにGIF画像を使う場合 (GIFファイル名) $t_gif = "../../images/notice_title2.gif"; $t_wid = 286; # 画像の横サイズ(ピクセル) $t_hgt = 82; #  〃 縦サイズ(ピクセル) # フッタにGIF画像を使う場合 (GIFファイル名) $f_gif = "./img/mini.gif"; $f_wid = 50; # 画像の横サイズ(ピクセル) $f_hgt = 20; #  〃 縦サイズ(ピクセル) # newにGIF画像を使う場合 (GIFファイル名) $new_gif = "./img/new.gif"; $new_wid = 30; # 画像の横サイズ(ピクセル) $new_hgt = 12; #  〃 縦サイズ(ピクセル) # homeにGIF画像を使う場合 (GIFファイル名) $h_gif = "../images/ask.gif"; $h_wid = 92; # 画像の横サイズ(ピクセル) $h_hgt = 20; #  〃 縦サイズ(ピクセル) # 内容に画像を使う場合 (ファイル名) $nai_gif = ""; $n_wid = 100; # 画像の横サイズ(ピクセル) $n_hgt = 30; #  〃 縦サイズ(ピクセル) # コメントに画像を使う場合 (ファイル名) $rem_gif = ""; $r_wid = 100; # 画像の横サイズ(ピクセル) $r_hgt = 30; #  〃 縦サイズ(ピクセル) # 内容・コメントの項目名 # コメントは、使用しない場合は、""にしてください。 $w_nai = "■ 内容"; $w_rem = "■ コメント"; # 初期表示 # 新規投稿時に表示されます。使用しない場合は、""にしてください。 $i_nai = ""; $i_rem = ""; # 環境設定 $bground = "../../images/bbs_bg.gif"; # 壁紙 $bgcolor = "#ffffff"; # 背景色 $text = "#333333"; # 文字色 $link = "#0000FF"; # リンク色(未訪問) $vlink = "#800080"; # リンク色(既訪問) $alink = "#FF0000"; # リンク色(訪問中) # 本文文字サイズ(スタイルシート) $f_size = '10pt'; # 基本色 $t_color = "#FF5A4D"; # 題名の色 $sub_color = "#FF5A4D"; # 記事背景の色 $g_color = "#ffffff"; # 帯の色 $b_color = "#FF5A4D"; # 文字の色 $f_color = "#ffffff"; # スクリプト名 # 絶対パスなら http:// からのURLパス $script = "bboard.cgi"; # 戻り先 # 絶対パスなら http:// からのURLパス $home = "javascript:this.close();"; # 管理用パスワード $adminpass = 'japetbapys'; # ログファイル名 # 絶対パスなら / から始まるパス(http://からではない) $logfile = "./data/bboard.log"; # バックアップ機能 # 0 : no 1 : yes $bup = 1; $bup_f = "./data/bboard.bak"; # データ件数(これより大きくしないでね) $d_max = 1000; # 1ページあたりの記事表示件数 $p_log = 10; # NEWの表示日数 $newtime = 20; # 新着情報件数 $new = 5; # トップコメント $top_com = ""; # カウンタ機能 # カウンタの設置 # 0 : 無 1 : 有 $counter = 1; # カウンタの桁数 $cnt_keta = 5; # カウンタの線の色 $cnt_tbcolor = "#FF6600"; # カウンタの背景色 $cnt_bgcolor = "#FFFFFF"; # カウンタの文字色 $cnt_color = "#FF6600"; # カウンタファイルの名前 $cnt_file = './data/count.dat'; # カウンタのロック # 0=no 1=symlink関数 2=mkdir関数 $cnt_lockkey = 0; # カウンタのロックファイル $cnt_lock= "./data/dcnt.lock"; ### 以下 KENT WEB (http://www.kent-web.com/) より # アップロードディレクトリ # → パスの最後は / で終わること # → フルパスだと / から記述する $ImgDir = "./tmp/"; # アップロードディレクトリのURLパス # → パスの最後は / で終わること $ImgUrl = "./tmp/"; # アップロードファイル名(ファイル規則) $ImgNam = "img"; # アップロードを許可するファイル形式 # 0:no 1:yes $gif = 1; # GIFファイル $jpeg = 1; # JPEGファイル $png = 0; # PNGファイル # 投稿受理最大サイズ (bytes) # → 例 : 102400 = 100KB $cgi_lib'maxdata = '102400'; # 画像ファイルの最大表示の大きさ(単位:ピクセル) # → これを超える画像は縮小表示します $MaxW = 150; # 横幅 $MaxH = 150; # 縦幅 # ホスト名取得方式 # 0 : $ENV{'REMOTE_HOST'}で取得 # 1 : gethostbyaddr関数で取得 $gethostbyaddr = 0; # ロックファイル機構 (0=no 1=symlink関数 2=mkdir関数) $lockkey = 1; # ロックファイル名 # → 絶対パスなら / から始まるパス(http://からではないので注意) $lockfile = "./lock/bboard.lock"; # 投稿処理の権限 # 0: 誰でも投稿可能 # 1: 管理者のみが投稿 $PostMode = 1; # タグ許可 # 0 = no 1 = yes # PostMode = 1 のみ有効 $tagkey = 0; # 登録時メール通知機能 # 0: no 1: yes $mailing = 0; # sendmailのパス(メール通知する場合) $sendmail = '/usr/sbin/sendmail'; # メール通知先アドレス(メール通知する場合) $mailto = ''; # アクセス制限(ホスト名を記述) @deny = ( "anonymizer", "cache*.*.interlog.com", "", "", "", "" ); #=== 設定はここまで === if ($ImgDir !~ /\/$/) { $ImgDir .= "/"; } if ($ImgUrl !~ /\/$/) { $ImgUrl .= "/"; } &decode; &axs_check; if ($mode eq 'regist') { ®ist; } elsif ($mode eq 'find') { &find; } elsif ($mode eq 'admin') { &admin; } elsif ($mode eq 'check') { ✓ } elsif ($mode eq 'num') { &henshu; } elsif ($mode eq 'h_w') { &henwri; } elsif ($mode eq 'bma') { &bma; } elsif ($mode eq 'detail') { &detail; } elsif ($mode eq 'new') { &new;} &html; #-------------------- # アクセス制限 #-------------------- sub axs_check { # ホスト名を取得 &get_host; $flag=0; foreach (@deny) { if (!$_) { next; } $_ =~ s/\*/\.\*/g; if ($host =~ /$_/i) { $flag=1; last; } } if ($flag) { error("アクセスを許可されていません"); } } #-------------------- # 記事表示処理 #-------------------- sub html { &header; print <<"EOM";
閉じる新着情報ワード検索管理用
EOM if ($counter == 1) { &cntup; } # ページ区切り処理 if (!$page) { $page = 1; } $start = $page; $end = $page + $p_log; $match = 0; open(IN,"$logfile") || error("Open Error : $logfile"); # 件数カウント while () { $match++; } close(IN); # 01/06/07 ページ数表示 $pages = $match - 1; $pages = int($pages / $p_log); print <<"EOM";

$top_com

※気になる仔犬がいましたら、お問い合わせください。クリック
お急ぎの方はお電話ください。受付時間 10:00〜23:00年中無休
◆電話03-3865-4504    
子犬の価格には消費税込み・送料・ワクチン別途かかります。
ベイピーズにて購入の子犬には生後半年までの生命保証・健康保証
ジャペット生体保証制度』が付いております。
チワワはこちら / その他の犬種はこちら
・新規に登録された情報は $newtime日間 New !が表\示されます。
写真をクリックすると大きな画像が表\示されます。
EOM if ($pages > 0) { $si = $page; $ei = $si + $p_log; $ei = $ei - 1; if ($ei > $match) { $ei = $match; } print <<"EOM"; EOM print " \n"; print <<"EOM";
($match 件中 $si 〜 $ei 件目を表\示)
"; for ($h = 0 ; $h <= $pages ; $h++) { $page_line = $h * $p_log + 1; $hh ++; if ($page_line == $page) { print "[ $hh ] "; } else { print "[ $hh ]"; } } print "
EOM } $i=0; open(IN,"$logfile") || error("Open Error : $logfile"); while () { $i++; if ($i < $start) { next; } if ($i >= $end) { last; } &stok; print <<"EOM";
EOM print " \n"; print <<"EOM";
Vol.$no $name "; if ($times - $nowDate < $newtime*24*60*60) { if ($new_gif) { print ""; } else { print "New !"; } } print "
EOM print " \n"; print " \n"; print " \n"; urllink($naiyo); if ($img) { print <<"EOM"; EOM if ($W > $MaxW) { $H = $H * $MaxW / $W; $W = $MaxW; } print <<"EOM"; EOM } else { print <<"EOM"; EOM } if ($rem) { print <<"EOM"; EOM } print <<"EOM";
"; if ($user) { print "■ 投稿者:$user"; } if ($email) { print " $email"; } print "
"; if ($url) { if ($h_gif) { print ""; } else { print "http://$url"; } } print " $datev
$naiyo $name
$naiyo
[ 詳細 ]

EOM } close(IN); $next_page = $page + $p_log; $back_page = $page - $p_log; print "\n \n"; if ($back_page >= 0) { print <<"EOM"; EOM } if ($next_page <= $i) { print <<"EOM"; EOM } print " \n
\n"; # 投稿フォーム if (!$PostMode) { &form; } &footer; } #-------------------- # 記事表示処理 #-------------------- sub detail { &header; print <<"EOM";
一覧に戻る

EOM open(IN,"$logfile") || error("Open Error : $logfile"); while () { &stok; if ($no eq $kiji) { &shoshiki; last; } } close(IN); &footer; } ## --- 詳細書式 sub shoshiki { print <<"EOM";
$datev
EOM print " \n"; print <<"EOM";
Vol.$no $name "; if ($times - $nowDate < $newtime*24*60*60) { if ($new_gif) { print ""; } else { print " New !"; } } print "
EOM print " \n"; print " \n"; print " \n"; urllink($naiyo); if ($nai_gif) { print <<"EOM"; EOM } else { print <<"EOM"; EOM } print " \n"; if ($img) { print <<"EOM"; EOM } else { print <<"EOM"; EOM } print <<"EOM";
■ 投稿者:$user"; if ($email) { print " $email"; } print ""; if ($url) { if ($h_gif) { print ""; } else { print "http://$url"; } } print "
$w_nai
$naiyo $name$naiyo

EOM if ($rem) { print <<"EOM";
EOM if ($w_rem) { print " \n"; urllink($rem); if ($rem_gif) { print <<"EOM"; EOM } else { print <<"EOM"; EOM } print <<"EOM"; EOM } print <<"EOM";
$w_rem
$rem
EOM } } ## --- 自動リンク sub urllink { $_[0]=~ s/([^=^\"]|^)((http|ftp)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1$2<\/A>/g; } ## --- 新着情報表示 sub new { &header; print <<"EOM";
一覧に戻る
新着情報

・新着情報を $new件 表\示しています。 EOM $cnt = 0; open(IN,"$logfile") || error("Open Error : $logfile"); while () { &stok; if ($cnt < $new) { &shoshiki; } else { last; } $cnt++; } close(IN); &footer; } #-------------------- # 書きこみ処理 #-------------------- sub regist { # POSTチェック if (!&MethPost()) { error("METHOD形式が POST でありません"); } # パスワードチェック if ($PostMode && $in{'pass'} ne $adminpass) { error("パスワードが認証できません"); } # フォーム内容をチェック if (!$in{'name'}) { error("タイトルが入力されていません"); } if (!$in{'naiyo'}) { error("$w_naiが入力されていません"); } # if ($in{'user'} eq "") { error("名前が入力されていません"); } &set_cookie; # ロック処理 if ($lockkey) { &lock; } if($bup){&backup;} $i = 0; $no = 1; open(IN,"$logfile") || error("Open Error : $logfile"); while () { $i++; @val = split(/<>/); # 記事Noを採番 if ($i == 1) { $no = $val[0] + 1; } last; } close(IN); # ファイル添付処理 if ($in{'upfile'}) { &UpFile; $img = "$ImgNam$no$tail"; $in{'img'} = $img; $in{'W'} = $W; $in{'H'} = $H; } ### KENT WEB (http://www.kent-web.com/) より # テンポラリーファイルを定義 $temp = "$$"; if (!$temp) { srand; $temp = 1000000000000000 * rand; } $tmpfile = "./tmp/$temp\.tmp"; open(IN,"$logfile") || error("Open Error : $logfile"); open(OUT,">$tmpfile") || error("Open Error : $tmpfile"); # 更新 print OUT "$no<>$in{'name'}<>$in{'naiyo'}<>$in{'rem'}<>$img<>$W<>$H<>$in{'user'}<>$in{'email'}<>$url<>$times<>$date\n"; $cnti = 1; if ($i > 0) { while () { if ($cnti < $d_max) { $cnti++; print OUT $_; } } } close(OUT); close(IN); rename ($tmpfile,$logfile) || error("Rename Error : $tmpfile --> $logfile"); chmod (0666,$logfile); if (-e $tmpfile) { unlink($tmpfile); } # ロック解除 if ($lockkey) { &unlock; } # メール通知処理 if ($mailing) { &mail_to; } # 管理者限定投稿の完了画面 if ($PostMode && $in{'action'} eq "regist") { &header; print <<"EOM";


正常に登録できました


EOM &footer; } } #-------------------- # 画像アップロード ### KENT WEB (http://www.kent-web.com/) より #-------------------- sub UpFile { # 画像処理 $macbin=0; foreach (@in) { if ($_ =~ /(.*)Content-type:(.*)/i) { $tail=$3; } if ($_ =~ /(.*)filename=(.*)/i) { $fname=$2; } if ($_ =~ /application\/x-macbinary/i) { $macbin=1; } } $tail =~ s/\r//g; $tail =~ s/\n//g; #$fname =~ s/\"//g; $fname =~ tr/\"\x0D\x0A//d; # ファイル形式を認識 $flag=0; if ($tail =~ /image\/gif/i && $gif) { $tail=".gif"; $flag=1; } if ($tail =~ /image\/jpeg/i && $jpeg) { $tail=".jpg"; $flag=1; } if ($tail =~ /image\/x-png/i && $png) { $tail=".png"; $flag=1; } if (!$flag) { if ($fname =~ /\.gif$/i && $gif) { $tail=".gif"; $flag=1; } if (($fname =~ /\.jpe?g$/i && $jpeg)) { $tail=".jpg"; $flag=1; } if ($fname =~ /\.png$/i && $png) { $tail=".png"; $flag=1; } } if (!$flag) { error("アップロードできないファイル形式です"); } $upfile = $in{'upfile'}; # マックバイナリ対策 if ($macbin) { $length = substr($upfile,83,4); $length = unpack("%N",$length); $upfile = substr($upfile,128,$length); } # 添付データを書き込み $ImgFile = "$ImgDir$ImgNam$no$tail"; open(OUT,"> $ImgFile") || error("画像のアップロードに失敗しました"); binmode(OUT); binmode(STDOUT); print OUT $upfile; close(OUT); chmod (0666,$ImgFile); # 画像サイズ取得 if ($tail eq ".jpg") { ($W, $H) = &JpegSize($ImgFile); } elsif ($tail eq ".gif") { ($W, $H) = &GifSize($ImgFile); } elsif ($tail eq ".png") { ($W, $H) = &PngSize($ImgFile); } } #-------------------- # ワード検索 #-------------------- sub find { &header; print <<"EOM";
一覧に戻る
ワード検索
キーワード:
検索条件: AND OR
 
・検索したいキーワードを入力し、検索条件を選択して「検索ボタン」を押してください。
・キーワードは「半角スペース」で区切って複数指定することもできます。
EOM # ワード検索の実行と結果表示 if ($in{'word'}) { # キーワードを配列化 $in{'word'} =~ s/ / /g; @pairs = split(/\s+/, $in{'word'}); # 検索処理 print "
\n"; open(IN,"$logfile") || error("Open Error : $logfile"); $i=0; print <<"EOM";
EOM 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 == 0) { next; } # 結果を表示 $i++; &stok; print <<"EOM"; \n"; print <<"EOM"; EOM } close(IN); print <<"EOM";
No タ イ ト ル Update
$no EOM print " $name"; if ($times - $nowDate < $newtime*24*60*60) { if ($new_gif) { print ""; } else { print " New !"; } } print "$datev

- 検索結果は $i件です - EOM } &footer; } #-------------------- # 管理モード #-------------------- sub admin { if ($in{'pass'} && $in{'pass'} ne $adminpass) { error("パスワードが違います"); } if ($PostMode && $in{'action'} eq "form") { &PostForm; } &header; print <<"EOM";
一覧に戻る管理メニュー
管理モード
EOM if (!$in{'pass'}) { # クッキー情報を取得 &get_cookie; print <<"EOM";
EOM if ($PostMode) { print <<"EOM"; 修正・削除 新規登録 EOM } print <<"EOM";
 ・処理を選択し、パスワードを入力して下さい。
EOM } else { # 削除処理 if ($in{'del'}) { # ロック処理 if ($lockkey) { &lock; } # 削除情報をマッチングし更新 open(IN,"$logfile") || error("Open Error : $logfile"); @lines = ; close(IN); @new=(); foreach (@lines) { $flag=0; &stok; if ($no eq $in{'del'}) { $flag=1; if (-e "$ImgDir$img") { unlink("$ImgDir$img"); } } if ($flag == 0) { push(@new,$_); } } open(OUT,">$logfile") || error("Write Error : $logfile"); print OUT @new; close(OUT); # ロック解除 if ($lockkey) { &unlock; } } # ページ区切り処理 if ($page eq '') { $page = 1; } $start = $page; $end = $page + $p_log; $match = 0; open(IN,"$logfile") || error("Open Error : $logfile"); # 件数カウント while () { $match++; } close(IN); $pages = $match - 1; $pages = int($pages / $p_log); if ($pages > 0) { $si = $page; $ei = $si + $p_log; $ei = $ei - 1; if ($ei > $match) { $ei = $match; } print <<"EOM"; EOM print " \n"; print <<"EOM";
($match 件中 $si 〜 $ei 件目を表\示)
"; for ($h = 0 ; $h <= $pages ; $h++) { $page_line = $h * $p_log + 1; $hh ++; if ($page_line == $page) { print "[ $hh ] "; } else { print "[ $hh ]"; } } print "
EOM } # 削除画面を表示 print <<"EOM";
  • 【編集】:「編集」を押して下さい。
  • 【削除】:「削除」を押して下さい。
NO:
EOM open(IN,"$logfile") || error("Open Error : $logfile"); while () { $i++; if ($i < $start) { next; } if ($i >= $end) { last; } &stok; print <<"EOM"; EOM } print <<"EOM";
No タ イ ト ル 修正・削除
$no $name
EOM close(IN); # 改頁処理 $next_line = $page + $p_log; $back_line = $page - $p_log; print <<"EOM"; \n"; # 次頁処理 print "
EOM # 前頁処理 if ($back_line > 0) { print <<"EOM";
EOM } print "
\n"; if ($next_line <= $i) { print <<"EOM";
EOM } print <<"EOM";
EOM if ($bup) { if (-e $bup_f) { $bl = int(-M $bup_f); $bs = -s $bup_f; $bc = "$bs バイト、$bl 日前のバックアップあり。"; print <<"EOM";
$bc
EOM } else { $bc = "バックアップはありません。"; print <<"EOM"; $bc EOM } } } &footer; } #-------------------- # 投稿フォーム #-------------------- sub form { # クッキー情報を取得 &get_cookie; print <<"EOM";
* は、入力必須です
EOM if ($w_rem) { print <<"EOM"; EOM } print <<"EOM";
* タイトル *
* $w_nai * URLを記述すると自動リンクされます
$w_rem URLを記述すると自動リンクされます
添付File
NAME
E-Mail
URL

 

・投稿時にファイルを添付する事ができます(ブラウザによっては正常に添付できない事があります)
EOM

	$MaxData = int ($cgi_lib'maxdata / 1024);

	if ($gif)  { $FILE .= "GIF, "; }
	if ($jpeg) { $FILE .= "JPEG, "; }
	if ($png)  { $FILE .= "PNG, "; }

	$FILE =~ s/\, $//;
	print <<"EOM";
・添付可能\ファイル : $FILE
・最大投稿データ量は $MaxData KB までです。
・画像は横 $MaxWピクセルを超えると縮小表\示されます。
EOM } #-------------------- # 管理者用投稿フォーム #-------------------- sub PostForm { # パスワードチェック if ($PostMode && $in{'pass'} ne $adminpass) { error("パスワードが認証できません"); } &header; print <<"EOM";
一覧に戻る管理メニュー
管理者用投稿フォーム
EOM &form; &footer; } #-------------------- # 記事編集ページ #-------------------- sub henshu { # パスワードチェック if ($in{'pass'} ne $adminpass) { error("パスワードが認証できません"); } &header; open(IN,"$logfile") || error("Open Error : $logfile"); while () { &stok; if ($no eq $kiji) { $naiyo =~ s/
/\n/ig; $rem =~ s/
/\n/ig; if ($tagkey) { $naiyo =~ s//>/g; $rem =~ s//>/g; } print <<"EOM";
一覧に戻る管理モード
ナンバー[$no] の編集
EOM if ($w_rem) { print <<"EOM"; EOM } print <<"EOM";
タイトル
$w_nai
$w_rem
ファイル名 旧ファイル画像を削除 する しない

新しいファイルを選択してください。(旧ファイルは削除されます。)
NAME
E-Mail
URL

 
EOM last; } } close(IN); &footer; } #-------------------- # 編集記事を書きかえる #-------------------- sub henwri { # パスワードチェック if ($in{'pass'} ne $adminpass) { error("パスワードが認証できません"); } # ロック処理 if ($lockkey) { &lock; } open(IN,"$logfile") || error("Open Error : $logfile"); @lines = ; close(IN); # ファイル添付処理 if ($in{'upfile'}) { $no = $kiji; &UpFile; $img = "$ImgNam$no$tail"; $in{'img'} = $img; $in{'W'} = $W; $in{'H'} = $H; } else { if ($in{'pic_del'}) { unlink("$ImgDir$in{'img'}"); $in{'img'} = ""; $in{'W'} = ""; $in{'H'} = ""; } } @new = (); $flag = 0; foreach $line (@lines) { $line =~ s/\n//g; @val = split(/<>/,$line); if ($val[0] eq $kiji) { $line = "$val[0]<>$in{'name'}<>$in{'naiyo'}<>$in{'rem'}<>$in{'img'}<>$in{'W'}<>$in{'H'}<>$in{'user'}<>$in{'email'}<>$url<>$times<>$date"; $flag = 1; } push(@new,"$line\n"); } close(IN); if ($flag == 1) { open (OUT,">$logfile") || error("Write Error : $logfile"); print OUT @new; close(OUT); } else { error("編集ナンバーが不正です。"); } # ロック解除 if ($lockkey) { &unlock; } &header; print <<"EOM";


編集は正常に終了しました


EOM &footer; } #-------------------- # デコード処理 #-------------------- sub decode { &ReadParse; while (($key,$val) = each %in) { if ($key ne "upfile") { # シフトJISコードに変換 &jcode'convert(*val, "sjis", "", "z"); $val =~ s/\,/,/g; $val =~ s///g; # SSI 禁止 # タグ処理 if ($PostMode && $tagkey) { $val =~ s/<>/<>/g; } else { $val =~ s/\"/"/g; $val =~ s//>/g; } # 改行処理 if ($key ne "name") { $val =~ s/\r\n/
/g; $val =~ s/\r/
/g; $val =~ s/\n/
/g; } else { $val =~ s/\r\n//g; $val =~ s/\r//g; $val =~ s/\n//g; } } $in{$key} = $val; } $mode = $in{'mode'}; $kiji = $in{'kiji'}; $no = $in{'no'}; $page = $in{'page'}; $url = $in{'url'}; $url=~ s/^http\:\/\///; if ($in{'new'} ne "") { $new = $in{'new'}; } # 日時の取得 $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 stok { ($no,$name,$naiyo,$rem,$img,$W,$H,$user,$email,$url,$nowDate,$datev) = split(/<>/); } ## --- カウンタ処理 sub cntup { open(IN,"$cnt_file") || error("Open Error : $cnt_file"); $cnt = ; close(IN); if (!$mode) { # ロック処理 if ($cnt_lockkey) { &clock; } $cnt++; open(OUT,">$cnt_file") || error("Write Error : $cnt_file"); print OUT $cnt; close(OUT); # ロック解除 if ($cnt_lockkey) { &cunlock; } while(length($cnt) < $cnt_keta){ $cnt = 0 . $cnt; } print <<"EOM";
$cnt
EOM } } #-------------------- # HTMLヘッダ #-------------------- sub header { $head_flag = 1; # ヘッダ表示フラグ print "Content-type: text/html\n\n"; print <<"EOM"; $title EOM if ($bground) { print "\n"; } else { print "\n"; } print <<"EOM";
EOM if ($t_gif) { print "\n"; } else { print "

$title

\n"; } } #-------------------- # フッタ表示 #-------------------- sub footer { # 著作権表示(削除・改変は禁止) print <<"EOM";

EOM if ($f_gif) { print <<"EOM";
EOM } print <<"EOM"; - $ver -
EOM exit; } #-------------------- # エラー処理 #-------------------- sub error { # ロック解除 if ($lockkey) { &unlock; } &header if (!$head_flag); print <<"EOM";

ERROR !


$_[0]

EOM &footer; } #-------------------- # ホスト名取得 #-------------------- sub get_host { $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($gethostbyaddr) { if (!$host || $host eq "$addr") { $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2); } } if (!$host) { $host = $addr; } } ## --- クッキーの発行 sub set_cookie { $ENV{'TZ'} = "GMT"; # 国際標準時を取得 ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg)=localtime(time+30*24*60*60); $yearg += 1900; if ($secg < 10) { $secg = "0$secg"; } if ($ming < 10) { $ming = "0$ming"; } if ($hourg < 10) { $hourg = "0$hourg"; } if ($mdayg < 10) { $mdayg = "0$mdayg"; } $month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mong]; $youbi = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat')[$wdayg]; $ENV{'TZ'} = "Japan"; $date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT"; $cook="user\:$in{'user'}\,email\:$in{'email'},url\:$url,pass\:$in{'pass'}"; print "Set-Cookie: BBOARD=$cook; expires=$date_gmt\n"; } ## --- クッキーを取得 sub get_cookie { $cookies = $ENV{'HTTP_COOKIE'}; @pairs = split(/;/, $cookies); foreach $pair (@pairs) { local($name, $value) = split(/=/, $pair); $name =~ s/ //g; $DUMMY{$name} = $value; } @pairs = split(/,/, $DUMMY{'BBOARD'}); foreach $pair (@pairs) { local($name, $value) = split(/:/, $pair); $COOKIE{$name} = $value; } $c_user = $COOKIE{'user'}; $c_email = $COOKIE{'email'}; $c_url = $COOKIE{'url'}; $c_pass = $COOKIE{'pass'}; } #-------------------- # ロック処理 #-------------------- sub lock { local($retry)=5; # 1分以上古いロックは削除する if (-e $lockfile) { local($mtime) = (stat($lockfile))[9]; if ($mtime && $mtime < time - 60) { &unlock; } } # symlink関数式ロック if ($lockkey == 1) { while (!symlink(".", $lockfile)) { if (--$retry <= 0) { error("LOCK Error"); } sleep(1); } # mkdir関数式ロック } elsif ($lockkey == 2) { while (!mkdir($lockfile, 0755)) { if (--$retry <= 0) { error("LOCK Error"); } sleep(1); } } $lockflag=1; } #-------------------- # ロック解除 #-------------------- sub unlock { if ($lockkey == 1) { unlink($lockfile); } elsif ($lockkey == 2) { rmdir($lockfile); } $lockflag=0; } #-------------------- # メール送信 #-------------------- sub mail_to { $m_sub = "[$title : $no]投稿お知らせ"; $m_name = $in{'name'}; $m_naiyo = $in{'naiyo'}; $m_rem = $in{'rem'}; $m_user = $in{'user'}; $url = $in{'url'}; $m_naiyo =~ s/<//g; $m_naiyo =~ s/
/\015\012/ig; $m_rem =~ s/<//g; $m_rem =~ s/
/\015\012/ig; &jcode'convert(*m_sub,'jis'); &jcode'convert(*m_name,'jis'); &jcode'convert(*m_naiyo,'jis'); &jcode'convert(*m_rem,'jis'); &jcode'convert(*m_user,'jis'); if (!open(MAIL,"| $sendmail -t")) { error("メール送信に失敗しました"); } print MAIL "To: $mailto\n"; # メールアドレスがない場合はダミーメールに置き換え if (!$in{'email'}) { $email = 'nomail@xxx.xxx'; } else { $email = $in{'email'}; } print MAIL "From: $email\n"; print MAIL "Subject: $m_sub\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 "TIME : $date\n"; print MAIL "HOST : $host\n"; print MAIL "NO : $no\n"; print MAIL "NAME : $m_user\n"; print MAIL "MAIL : $email\n"; print MAIL "URL : $url\n"; print MAIL "TITLE : $m_name\n"; print MAIL "NAIYO : $m_naiyo\n"; print MAIL "REM : $m_rem\n"; print MAIL "--------------------------------------------------------\n"; close(MAIL); } #-------------------- # JPEGサイズ認識 #-------------------- sub JpegSize { local($jpeg) = @_; local($t, $m, $c, $l, $W, $H); open(JPEG, "$jpeg") || return (0,0); binmode JPEG; read(JPEG, $t, 2); while (1) { read(JPEG, $t, 4); ($m, $c, $l) = unpack("a a n", $t); if ($m ne "\xFF") { $W = $H = 0; last; } elsif ((ord($c) >= 0xC0) && (ord($c) <= 0xC3)) { read(JPEG, $t, 5); ($H, $W) = unpack("xnn", $t); last; } else { read(JPEG, $t, ($l - 2)); } } close(JPEG); return ($W, $H); } #-------------------- # GIFサイズ認識 #-------------------- sub GifSize { local($gif) = @_; local($data); open(GIF,"$gif") || return (0,0); binmode(GIF); sysread(GIF,$data,10); close(GIF); if ($data =~ /^GIF/) { $data = substr($data,-4); } $W = unpack("v",substr($data,0,2)); $H = unpack("v",substr($data,2,2)); return ($W, $H); } #-------------------- # PNGサイズ認識 # WWWis (http://www.bloodyeck.com/wwwis/) より引用 #-------------------- sub PngSize { local($PNG) = @_; local($head, $a, $b, $c, $d, $e, $f, $g, $h); open(PNG,"$PNG") || return (0,0); binmode(PNG); if (defined(PNG) && read(PNG, $head, 8) == 8 && $head eq "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a" && read(PNG, $head, 4) == 4 && read(PNG, $head, 4) == 4 && $head eq "IHDR" && read(PNG, $head, 8) == 8) { ($a,$b,$c,$d,$e,$f,$g,$h) = unpack("C"x8, $head); } else { return (0,0); } close(PNG); return ($a<<24|$b<<16|$c<<8|$d, $e<<24|$f<<16|$g<<8|$h); } #-------------------- # バックアップ処理 #-------------------- sub backup{ open(IN,"$logfile") || error("Open Error : $logfile"); open(OUT,">$bup_f") || error("Write Error : $bup_f"); while () { print OUT $_; } close(OUT); close(IN); } #-------------------- # 修復処理 #-------------------- sub bma { # ロック処理 if ($lockkey) { &lock; } rename ($bup_f,$logfile) || error("Rename Error : $bup_f >> $logfile"); # ロック解除 if ($lockkey) { &unlock; } &header; print <<"EOM";


修復は正常に終了しました


EOM &footer; }