#!/usr/bin/perl #┌───────────────────────────────── #│ ImageAlbum #│ album.cgi - 2007/07/12 #│ Copyright (c) KentWeb #│ http://www.kent-web.com/ #└───────────────────────────────── # 外部ファイル require './init.cgi'; require $cgilib; require $jcode; &decode; if ($mode eq "detail") { &detail; } elsif ($mode eq "check") { ✓ } &list_view; #--------------------------------------- # リスト一覧 #--------------------------------------- sub list_view { local($pglog,$i,$pgbtn,$next,$back,$cel,$no,$sub,$msg,$ex,$w,$h,$res,@view); # ページ表示数 $pglog = $tbl_w * $tbl_h; # データ読み出し $i = 0; open(IN,"$datfile") || &error("Open Error: $datfile"); while () { $i++; next if ($i < $page + 1); next if ($i > $page + $pglog); push(@view,$_); } close(IN); # 繰越ページ定義 $next = $page + $pglog; $back = $page - $pglog; # 繰越ボタン if ($back >= 0 || $next < $i) { if ($back >= 0) { $pgbtn .= "\n"; } local($x,$y,$z) = (1,0,$i); while ($z > 0) { if ($page == $y) { $pgbtn .= "| $x\n"; } else { $pgbtn .= "| $x\n"; } $x++; $y += $pglog; $z -= $pglog; } $pgbtn .= "|\n"; if ($next < $i) { $pgbtn .= "\n"; } } # リスト表示 &header; print <
$title

$ttl_msg

EOM print $pgbtn if ($pgbtn); print "

\n"; # セル枠 $cel = $max_w + 20; $i = 0; foreach (@view) { s/\n//; ($no,$sub,$msg,$ex,$w,$h,$res) = split(/<>/); # サイズ ($w,$h) = &reduce($w,$h,$max_w,$max_h); $i++; if ($i % $tbl_w == 1) { print "\n"; } print "\n"; } } print "
\n"; print "
"; print "\"$no$ex\"
\n"; print "$sub\n"; print "($res)
\n" if ($res ne ""); # print "
$msg\n"; print "
\n"; if ($i % $tbl_w == 0) { print "

\n"; print $pgbtn if ($pgbtn); print <

- ImageAlbum -

EOM print &HtmlBot; exit; } #--------------------------------------- # 詳細画面 #--------------------------------------- sub detail { local($resfile,$no,$sub,$msg,$ex,$w,$h); # 汚染チェック if ($in{'no'} =~ /^(\d+)$/) { $resfile = "$datadir/$1.cgi"; } else { &error("不正なアクセスです"); } # データ読み出し $flg = 0; open(IN,"$datfile") || &error("Open Error: $datfile"); while () { ($no,$sub,$msg,$ex,$w,$h) = split(/<>/); if ($in{'no'} == $no) { $flg = 1; last; } } close(IN); if (!$flg) { &error("該当の記事は存在しません"); } # 返信書き込み if ($in{'job'} eq "reply") { &reply; } # サイズ ($w,$h) = &reduce($w,$h,$max_w2,$max_h2); &header; print <
$no$ex
$sub
$msg

   コメント

EOM $i = 0; open(IN,"$resfile"); while () { $i++; next if ($i < $page + 1); next if ($i > $page + $pagelog); local($no,$date,$name,$com,$url) = split(/<>/); if ($url) { $name = "$name"; } print "\n"; print "\n"; print "
$com
名前:$name | $date\n"; print "
\n"; } close(IN); # ページ移動ボタン表示 if ($page - $pagelog >= 0 || $page + $pagelog < $i) { print "

Page: "; local($x,$y) = (1,0); while ($i > 0) { if ($page == $y) { print "| $x\n"; } else { print "| $x\n"; } $x++; $y += $pagelog; $i -= $pagelog; } print "|
\n"; } local($c_nam, $c_url, $c_chk) = &get_cookie; if (!$c_url) { $c_url = "http://"; } if ($c_chk == 1) { $c_chk = "checked" } print <
   コメントを書く

名前:

URL:

EOM # 投稿キー if ($regist_key) { require $regkeypl; my ($str_plain,$str_crypt) = &pcp_makekey; print qq|

投稿キー:\n|; print qq|(投稿キー を入力してください)
\n|; print qq|\n|; print qq|\n|; } print < 内容:

   クッキーを記憶



- ImageAlbum -

EOM print &HtmlBot; exit; } #--------------------------------------- # 返信書き込み #--------------------------------------- sub reply { # セキュリティチェック if ($postonly && !&MethPost()) { &error("METHOD形式が POST でありません"); } if ($baseUrl) { &refCheck; } # 投稿キーチェック if ($regist_key) { require $regkeypl; if ($in{'regikey'} !~ /^\d{4}$/) { &error("投稿キーが入力不備です。

投稿フォームに戻って再読込み後、指定の数字を入力してください"); } # 投稿キーチェック # -1 : キー不一致 # 0 : 制限時間オーバー # 1 : キー一致 local($chk) = ®istkey_chk($in{'regikey'}, $in{'str_crypt'}); if ($chk == 0) { &error("投稿キーが制限時間を超過しました。

投稿フォームに戻って再読込み後、指定の数字を再入力してください"); } elsif ($chk == -1) { &error("投稿キーが不正です。

投稿フォームに戻って再読込み後、指定の数字を入力してください"); } } # 入力チェック if (!$in{'name'} || !$in{'comment'}) { &error("なまえ又はコメントが未入力です"); } if ($in{'url'} eq "http://") { $in{'url'} = ''; } # ホストチェック local($host) = &axscheck; # 時間取得 local($time) = time; local($min,$hour,$mday,$mon,$year) = (localtime($time))[1..5]; local($date) = sprintf("%04d/%02d/%02d-%02d:%02d", $year+1900,$mon+1,$mday,$hour,$min); my $newres; # 既存データあり if (-f $resfile) { open(DAT,"+< $resfile"); eval "flock(DAT, 2);"; my @data = ; # 記事No my ($no, $hos, $tim) = (split(/<>/, $data[0]))[0,5,6]; $no++; # 連続投稿チェック local($flg); if ($regCtl == 1) { if ($host eq $hos && $time - $tim < $wait) { $flg = 1; } } elsif ($regCtl == 2) { if ($time - $tim < $wait) { $flg = 1; } } if ($flg) { &error("現在投稿制限中です。もうしばらくたってから投稿をお願いします"); } $newres = @data + 1; # 記事調整 while ($log_max <= @data) { pop(@data); } unshift(@data,"$no<>$date<>$in{'name'}<>$in{'comment'}<>$in{'url'}<>$host<>$time<>\n"); # 更新 seek(DAT, 0, 0); print DAT @data; truncate(DAT, tell(DAT)); close(DAT); # 新規データ生成 } else { $newres = 1; open(DAT,"> $resfile"); print DAT "1<>$date<>$in{'name'}<>$in{'comment'}<>$in{'url'}<>$host<>$time<>\n"; close(DAT); chmod(0666, $resfile); } # indexデータ my @file; open(DAT,"+< $datfile") || &error("Open Error: $datfile"); eval "flock(DAT, 2);"; while () { my ($no,$sub,$msg,$ex,$w,$h,$res) = split(/<>/); if ($in{'no'} == $no) { $_ = "$no<>$sub<>$msg<>$ex<>$w<>$h<>$newres<>\n"; } push(@file,$_); } seek(DAT, 0, 0); print DAT @file; truncate(DAT, tell(DAT)); close(DAT); # クッキー if ($in{'cook'} == 1) { # 保存 &set_cookie($in{'name'},$in{'url'},$in{'cook'}); } else { # 消去 print "Set-Cookie: ImageAlbum=; expires=Mon, 01-Apr-1998 00:00:00 GMT\n"; } # 完了 &header; print < 記事を受理しました.

EOM print &HtmlBot; exit; } #--------------------------------------- # サイズ縮小 #--------------------------------------- sub reduce { local($w,$h,$max_w,$max_h) = @_; local($w2,$h2,$key); # 画像表示縮小 if ($w > $max_w || $h > $max_h) { $w2 = $max_w / $w; $h2 = $max_h / $h; if ($w2 < $h2) { $key = $w2; } else { $key = $h2; } $w = int ($w * $key) || 1; $h = int ($h * $key) || 1; } return ($w,$h); } #------------------------------------------------- # アクセス制限 #------------------------------------------------- sub axscheck { local($flg,$host,$addr); # IP&ホスト取得 $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($gethostbyaddr && ($host eq "" || $host eq $addr)) { $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2); } if ($host eq "") { $host = $addr; } # アクセスチェック foreach ( split(/\s+/, $denyhost) ) { if (index($host,$_) >= 0) { $flg = 1; last; } if (index($addr,$_) >= 0) { $flg = 1; last; } } if ($flg) { &error("アクセスを許可されていません"); } $host; } #--------------------------------------- # クッキー発行 #--------------------------------------- sub set_cookie { local(@cook) = @_; local($gmt, $cook, @t, @m, @w); @t = gmtime(time + 60*24*60*60); @m = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); @w = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); # 国際標準時を定義 $gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT", $w[$t[6]], $t[3], $m[$t[4]], $t[5]+1900, $t[2], $t[1], $t[0]); # URLエンコード foreach (@cook) { s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $cook .= "$_<>"; } # 格納 print "Set-Cookie: ImageAlbum=$cook; expires=$gmt\n"; } #--------------------------------------- # クッキー取得 #--------------------------------------- sub get_cookie { local($key, $val, *cook); # クッキーを取得 $cook = $ENV{'HTTP_COOKIE'}; # 該当IDを取り出す foreach ( split(/;/, $cook) ) { ($key, $val) = split(/=/); $key =~ s/\s//g; $cook{$key} = $val; } # データをURLデコードして復元 foreach ( split(/<>/, $cook{'ImageAlbum'}) ) { s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1)/eg; push(@cook,$_); } return (@cook); } #--------------------------------------- # チェックモード #--------------------------------------- sub check { &header; print <チェックモード
    EOM # ロックディレクトリ print "
  • ロック形式:"; if ($lockkey == 0) { print "LOCK設定なし\n"; } else { if ($lockkey == 1) { print "symlink\n"; } else { print "mkdir\n"; } local($lockdir) = $lockfile =~ /(.*)[\\\/].*$/; print "
  • ロックディレクトリ:$lockdir\n"; if (-d $lockdir) { print "
  • ロックディレクトリパス:OK\n"; if (-r $lockdir && -w $lockdir && -x $lockdir) { print "
  • ロックディレクトリパーミッション:OK\n"; } else { print "
  • ロックディレクトリパーミッション:NG → $lockdir\n"; } } else { print "
  • ロックディレクトリパス:NG → $lockdir\n"; } } # ディレクトリ local(%dir) = ($datadir => "データディレクトリ", $upldir => "画像ディレクトリ"); foreach ( $datadir, $upldir ) { if (-d $_) { print "
  • $dir{$_}パス: OK!\n"; # パーミッション if (-r $_ && -w $_ && -x $_) { print "
  • $dir{$_}パーミッション: OK!\n"; } else { print "
  • $dir{$_}パーミッション: NG → $upldir\n"; } } else { print "
  • $dir{$_}: NG → $upldir\n"; } } local(%file) = ( $datfile, 'ログファイル', $numfile, '記事NOファイル' ); foreach ( $datfile, $numfile ) { # パス if (-e $_) { print "
  • $file{$_}: OK!\n"; # パーミッション if (-r $_ && -w $_) { print "
  • $file{$_}パーミッション: OK!\n"; } else { print "
  • $file{$_}パーミッション: NG → $_\n"; } } else { print "
  • $file{$_}: NG → $_\n"; } } print <バージョン: $ver
EOM exit; } #--------------------------------------- # REFチェック #--------------------------------------- sub refCheck { local($ref) = $ENV{'HTTP_REFERER'}; $ref =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; $baseUrl =~ s/(\W)/\\$1/g; if ($ref && $ref !~ /$baseUrl/i) { &error("不正なアクセスです"); } }