#!/usr/bin/perl ## bbs.cgi ## Created by (c) KentWeb $ver = 'IMAGE-UP BBS v1.0'; #============# # 設定項目 # #============# # ライブラリ取込 require './jcode.pl'; require './cgi-lib.pl'; # タイトル名を指定 $title = "花の相談室"; # タイトルの色 $t_color = "#666666"; # タイトルの大きさ(ポイント数:スタイルシートで有効) $t_size = '24px'; # タイトル/本文の文字フォント $face = "MS Pゴシック"; # 本文の文字大きさ(ポイント数:スタイルシートで有効) $b_size = '13px'; # 壁紙を指定する場合(http://から指定) $bg = ""; # 背景色を指定 $bc = "#FFFFFF"; # 文字色を指定 $tx = "#000000"; # リンク色を指定 $lk = "#0000FF"; # 未訪問 $vl = "#800080"; # 訪問済 $al = "#FF0000"; # 訪問中 # 戻り先のURL (index.htmlなど) $homepage = "../index.html"; # 最大記事数 (親記事もレス記事も含めた数) $max = 100; # 管理者用マスタパスワード (英数字で8文字以内) $pass = 'sbs1404'; # 返信がつくと親記事をトップへ移動 (0=no 1=yes) $topsort = 1; # 返信にも添付機能を許可する (0=no 1=yes) $res_clip = 1; # 画像と記事の位置 # 1 : 画像が左。記事は右から回り込む # 2 : 画像が下。記事は画像の上に表示。 $imgpoint = 1; # タイトルにGIF画像を使用する時 (http://から記述) $t_img = ""; $t_w = 180; # GIF画像の幅 (ピクセル) $t_h = 40; # 〃 高さ (ピクセル) # ファイルロック形式 # → 0=no 1=symlink関数 2=mkdir関数 $lockkey = 0; # ロックファイル名 $lockfile = './lock/joyful.lock'; # スクリプトURL $script = './bbs.cgi'; # ログファイルを指定 $logfile = './log.cgi'; # アップロードディレクトリ # → パスの最後は / で終わること # → フルパスだと / から記述する $ImgDir = './img/'; # アップロードディレクトリのURLパス # → パスの最後は / で終わること $ImgUrl = "http://www4.shizuokaonline.com/hana/bbs/img/"; # 添付ファイルのアップロードに失敗したとき # 0 : 添付ファイルは無視し、記事は受理する # 1 : エラー表示して処理を中断する $clip_error = 1; # 記事 [タイトル] 部の長さ (全角文字換算) $sub_len = 15; # メールアドレスの入力必須 (0=no 1=yes) $in_email = 0; # 記事の [タイトル] 部の色 $sub_color = "#008000"; # 記事表示部の下地の色 $tbl_color = "#FFFFFF"; # 同一IPアドレスからの連続投稿時間(秒数) # → 連続投稿などの荒らし対策 # → 値を 0 にするとこの機能は無効になります $wait = 120; # 1ページ当たりの記事表示数 (親記事) $p_log = 5; # 投稿があるとメール通知する (sendmail必須) # 0 : 通知しない # 1 : 通知するが、自分の投稿記事はメールしない。 # 2 : 通知する。自分の投稿記事も通知する。 $mailing = 0; # メールアドレス(メール通知する時) $mailto = 'xxx@xxx.xxx'; # sendmailパス(メール通知する時) $sendmail = '/usr/lib/sendmail'; # 他サイトから投稿排除時に指定 (http://から書く) $base_url = ""; # URLの自動リンク (0=no 1=yes) $autolink = 1; # アクセス制限(半角スペースで区切る) # → 拒否するホスト名又はIPアドレスを記述(アスタリスク可) # → 記述例 $deny = '*.anonymizer.com 211.154.120.*'; $deny = ''; # 投稿受理最大サイズ (bytes) # → 例 : 102400 = 100KB $cgi_lib'maxdata = 102400; # 画像ファイルの最大表示の大きさ(単位:ピクセル) # → これを超える画像は縮小表示します $MaxW = 300; # 横幅 $MaxH = 150; # 縦幅 # アイコン画像ファイル名 (ファイル名のみ) $icoHome = "home.gif"; $icoMail = "mail.gif"; # 投稿後の処理 # → 掲示板自身のURLを記述しておくと、投稿後リロードします # → ブラウザを再読み込みしても二重投稿されない措置。 # → Locationヘッダの使用可能なサーバのみ $location = ''; #============# # 設定完了 # #============# # メイン処理 &decode; &axs_check; if ($mode eq "howto") { &howto; } elsif ($mode eq "find") { &find; } elsif ($mode eq "usr_del") { &usr_del; } elsif ($mode eq "usr_edt") { &usr_edt; } elsif ($mode eq "regist") { ®ist; } elsif ($mode eq "res") { &res_form; } elsif ($mode eq "admin") { &admin; } &html_log; #----------------# # アクセス制限 # #----------------# sub axs_check { # ホスト名を取得 &get_host; local($flag)=0; foreach (split(/\s+/, $deny)) { s/\*/\.\*/g; if ($host =~ /$_/i) { $flag=1; last; } } if ($flag) { &error("アクセスを許可されていません"); } } #--------------# # 記事表示部 # #--------------# sub html_log { local($ipt,$wh,$i,$flag); # ヘッダを出力 &header; # タイトル部 print < しずおか花物語
コミュニティ− エンタ−テイメント インフォメ−ション
私の花風景 花のある生活 花博ニュ−ス
花の相談室 花博会場中継 花と静岡 雑学博士
浜名湖の花たち 関連情報

しずおか花物語 TOPペ−ジへshizuokaonline.com topページへ

EOM print "
\n"; if ($t_img eq '') { print "$title

ここは花きに関することの相談コーナーです。
花きに関することなら何でもかまいません。
みなさんのコミュニケーションの場としてぜひご利用ください。
(デジカメなどで撮影した画像も投稿できます。)
\n"; } else { print "\"$title\"\n"; } # メニュー部 print "
\n"; print "[トップに戻る]\n"; print "[留意事項]\n"; print "[ワード検索]\n"; print "[管理用]\n"; print "
\n"; # 投稿フォーム &form(); print "
\n"; # 記事を展開 open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; $i=0; $flag=0; while () { ($no,$reno,$date,$name,$mail,$sub,$comment,$url,$host,$pw,$color,$tail,$w,$h,$chk) = split(/<>/); if (!$chk) { next; } if ($reno eq "") { $i++; } if ($i < $page + 1) { next; } if ($i > $page + $p_log) { next; } # 題名の長さ if (length($sub) > $sub_len*2) { $sub = substr($sub,0,$sub_len*2); $sub .= "..."; } if ($mail) { $mail = "e-mail"; } if ($url) { $url = "home"; } if (!$reno && $flag) { print "

\n"; $flag=1; } if (!$reno) { print "
\n"; $flag=1; } if ($reno) { print "
\n"; } print "\n"; if ($reno) { print ""; } print "\n"; } else { print "
\n"; } print "

$sub "; if (!$reno) { print "投稿者:$name 投稿日:$date "; } else { print "$name - $date "; } print "No\.$no   $mail $url  \n"; if (!$reno) { print "
\n"; print "\n"; print "\n"; print "
\n"; if ($reno) { print "\n"; } print "

"; if (!$reno) { print "
\n"; } # 自動リンク if ($autolink) { &auto_link($comment); } if ($imgpoint == 1) { $ipt="align=left hspace=18"; } else { $ipt=""; print "$comment"; } # 添付ファイルが存在する場合 if ($tail) { if ($w && $h) { $wh="width=$w height=$h"; } else { $wh=""; } print "

\n"; } print "$comment
" if ($imgpoint == 1); if (!$reno) { print "

\n"; } print "
\n"; } close(IN); print "
\n"; $next = $page + $p_log; $back = $page - $p_log; $p_flag=0; print "

\n"; if ($back >= 0) { $p_flag=1; print "\n"; } if ($next < $i) { $p_flag=1; print "\n"; } # ページ移動ボタン表示 if ($p_flag) { print "\n"; } print "
\n"; print "\n"; print "
\n"; print "\n"; print "
[直接移動]\n"; $x=1; $y=0; while ($i > 0) { if ($page == $y) { print "[$x]\n"; } else { print "[$x]\n"; } $x++; $y = $y + $p_log; $i = $i - $p_log; } print "
\n"; print "
\n"; print "
\n"; print "- 以下のフォームから自分の投稿記事を修正・削除することができます -
\n"; print "処理 \n"; print "記事No \n"; print "パスワード \n"; print "
\n"; print <
ページトップへ

SBS GROUP All rights reserved by The Shizuoka Shimbun and Shizuoka Broadcasting System.
静岡新聞社・静岡放送 ShizuokaOnline.com に掲載の記事・写真および図版の無断転写を禁じます。
すべての著作権は、(株)静岡新聞社・静岡放送(株)に帰属します。
EOM print "
\n\n\n"; exit; } #----------------# # ログ書込処理 # #----------------# sub regist { # フォーム入力チェック &form_check; # 時間を取得 &get_time; # クッキーを発行 &set_cookie; # ファイルロック if ($lockkey) { &lock; } # ログを開く open(IN,"$logfile") || &error("Open Error : $logfile"); @lines = ; close(IN); # 記事NO処理 $top = shift(@lines); ($no,$ip,$time2) = split(/<>/, $top); $no++; # 連続投稿チェック if ($addr eq $ip && $wait > $times - $time2) { &error("連続投稿はもうしばらく時間をおいて下さい"); } # 削除キーを暗号化 if ($in{'pwd'} ne "") { $ango = &encrypt($in{'pwd'}); } # ファイル添付処理 if ($in{'upfile'}) { &UpFile; } # 親記事の場合 if ($in{'reno'} eq "") { $i=0; $stop=0; foreach (@lines) { ($no2,$reno2,$d,$n,$m,$s,$com,$u,$ho,$p,$c,$tail2,$w,$h,$chk) = split(/<>/); $i++; if ($i > $max-1 && $reno2 eq "") { $stop=1; } if (!$stop) { push(@new,$_); } else { # if ($pastkey) { push(@data,$_); } if (-e "$ImgDir$no2$tail2") { unlink("$ImgDir$no2$tail2"); } } } unshift(@new,"$no<><>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$tail<>$W<>$H<>0<>\n"); unshift(@new,"$no<>$addr<>$times<>\n"); # 過去ログ更新 if ($data[0]) { &pastlog; } # 更新 open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); # レス記事の場合:トップソートあり } elsif ($in{'reno'} && $topsort) { $f=0; $match=0; @new=(); @tmp=(); foreach (@lines) { ($no2,$reno2) = split(/<>/); if ($in{'reno'} eq $no2) { if ($reno2) { $f++; last; } $match=1; push(@new,$_); } elsif ($in{'reno'} eq $reno2) { push(@new,$_); } elsif ($match == 1 && $in{'reno'} ne $reno2) { $match=2; push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$tail<>$W<>$H<>0<>\n"); push(@tmp,$_); } else { push(@tmp,$_); } } if ($f) { &error("不正な返信要求です"); } if ($match == 1) { push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$tail<>$W<>$H<>0<>\n"); } push(@new,@tmp); # 更新 unshift(@new,"$no<>$addr<>$times<>\n"); open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); # レス記事の場合:トップソートなし } else { $f=0; $match=0; @new=(); foreach (@lines) { ($no2,$reno2) = split(/<>/); if ($match == 0 && $in{'reno'} eq $no2) { if ($reno2) { $f++; last; } $match=1; } elsif ($match == 1 && $in{'reno'} ne $reno2) { $match=2; push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$tail<>$W<>$H<>0<>\n"); } push(@new,$_); } if ($f) { &error("不正な返信要求です"); } if ($match == 1) { push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'color'}<>$tail<>$W<>$H<>0<>\n"); } # 更新 unshift(@new,"$no<>$addr<>$times<>\n"); open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); } # ロック解除 if ($lockkey) { &unlock; } # メール処理 if ($mailing == 1 && $in{'email'} ne "$mailto") { &mail_to; } elsif ($mailing == 2) { &mail_to; } # リロード if ($location) { if ($ENV{'PERLXS'} eq "PerlIS") { print "HTTP/1.0 302 Temporary Redirection\r\n"; print "Content-type: text/html\n"; } print "Location: $location?\n\n"; } else { &header; print "

\n"; print "

投稿を受け付けました。

\n\n"; print "

花を愛するみなさまに有意義な掲示板をお楽しみいただくために、

\n"; print "

投稿いただいたメッセージは、

\n\n"; print "

弊社にて内容を確認した後、掲載されます。

\n\n"; print "

掲示板の健全運営にご理解とご協力をお願いいたします。

\n\n"; print "
\n"; print "
\n"; print "
\n\n"; } exit; } #--------------------# # 画像アップロード # #--------------------# sub UpFile { local($macbin,$fname,$flag,$upfile); # 画像処理 $macbin=0; foreach (@in) { if (/(.*)Content-type:(.*)/i) { $tail=$2; } if (/(.*)filename=(.*)/i) { $fname=$2; } if (/application\/x-macbinary/i) { $macbin=1; } } $tail =~ s/\r//g; $tail =~ s/\n//g; $fname =~ tr/\"\x0D\x0A//d; # ファイル形式を認識 $flag=0; if ($tail =~ /image\/gif/i) { $tail=".gif"; $flag=1; } if ($tail =~ /image\/jpeg/i) { $tail=".jpg"; $flag=1; } if ($tail =~ /image\/x-png/i) { $tail=".png"; $flag=1; } if (!$flag) { if ($fname =~ /\.gif$/i) { $tail=".gif"; $flag=1; } if ($fname =~ /\.jpe?g$/i) { $tail=".jpg"; $flag=1; } if ($fname =~ /\.png$/i) { $tail=".png"; $flag=1; } } # アップロード失敗処理 if (!$flag && !$clip_error) { return; } elsif (!$flag && $clip_error) { &error("アップロードできないファイル形式です"); } $upfile = $in{'upfile'}; # マックバイナリ対策 if ($macbin) { $length = substr($upfile,83,4); $length = unpack("%N",$length); $upfile = substr($upfile,128,$length); } # 添付データを書き込み $ImgFile = "$ImgDir$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); } # 画像表示縮小 if ($W > $MaxW || $H > $MaxH) { $W2 = $MaxW / $W; $H2 = $MaxH / $H; if ($W2 < $H2) { $key = $W2; } else { $key = $H2; } $W = int ($W * $key) || 1; $H = int ($H * $key) || 1; } } #----------------# # 返信フォーム # #----------------# sub res_form { local($f,$no,$reno,$date,$name,$mail,$sub,$com,$url); # ヘッダを出力 &header; # ログを読み込み $f=0; open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; # 関連記事出力 print "[戻る]

\n"; print "- 以下は、記事NO. $in{'no'} に関する 返信フォーム です -


\n"; $flag=0; while () { ($no,$reno,$date,$name,$mail,$sub,$com,$url) = split(/<>/); if (!$reno) { $com = "
$com
"; } if ($in{'no'} == $no && $reno) { $f++; } if ($in{'no'} == $no || $in{'no'} == $reno) { if ($in{'no'} == $no) { $resub = $sub; } if ($url) { $url = "<HOME>"; } if ($reno && !$flag) { print "
\n"; $flag=1; } print "$sub 投稿者:$name 投稿日:$date $url No\.$no
$com

\n"; } } close(IN); if ($f) { &error("不正な返信要求です"); } if ($flag) { print "

\n"; } print "
\n"; # タイトル名 if ($resub !~ /^Re\:/) { $resub = "Re\: $resub"; } print "\n"; &form("res","","","","","",$resub,"","","","",""); print "\n\n"; exit; } #----------------# # デコード処理 # #----------------# sub decode { &ReadParse; while (($key,$val) = each %in) { if ($key ne "upfile") { # シフトJISコードに変換 &jcode'convert(*val, "sjis", "", "z"); # タグ処理 $val =~ s/&/&/g; $val =~ s/"/"/g; $val =~ s//>/g; # 改行処理 if ($key eq "comment") { $val =~ s/\r\n/
/g; $val =~ s/\r/
/g; $val =~ s/\n/
/g; } else { $val =~ s/\r//g; $val =~ s/\n//g; } } $in{$key} = $val; } $mode = $in{'mode'}; $page = $in{'page'}; $in{'url'} =~ s/^http\:\/\///; if ($in{'sub'} eq "") { $in{'sub'} = "無題"; } } #------------# # 留意事項 # #------------# sub howto { my $maxkb = int ($cgi_lib'maxdata / 1024); &header; print <
  1. この掲示板はクッキー対応です。1度記事を投稿いただくと、お名前、Eメール、参照先、暗証キーの情報は次回以降は自動入力されます。
  2. 記事と一緒に画像ファイルをアップロードすることが可能\です。
    • 最大投稿データ量 : $maxkb KB
    • 横$MaxWピクセル、縦$MaxHピクセルを超えると縮小表\示されます。
  3. 投稿内容には、HTMLタグは一切使用できません。
  4. 記事には、半角カナは使用しないで下さい。文字化けの原因となります。
  5. 記事の投稿時に「暗証キー」にパスワード(英数字で8文字以内)を入れておくと、その記事は次回暗証キーによって削除することができます。
  6. 既存の記事に「返信」をすることができます。各記事の上部にある「返信」ボタンを押すと返信用フォームが現れます。
  7. 管理者が著しく不利益と判断する記事や他人を誹謗中傷する記事は予\告なく削除することがあります。

EOM exit; } #--------------# # ワード検索 # #--------------# sub find { &header; print <<"EOM";

  • 検索する記事に対し、キーワードを入力し、「条件」「表\示」を選択して「検索」ボタンを押して下さい。
  • キーワードはスペースで区切って複数指定することができます。

    \n"; print "
    キーワード
    検索条件
    表\示件数
EOM # ワード検索の実行と結果表示 if ($in{'word'} ne "") { # 入力内容を整理 $in{'word'} =~ s/ / /g; @pairs = split(/\s+/, $in{'word'}); # ファイルを読み込み @new=(); open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; 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) { push(@new,$_); } } close(IN); # 検索終了 $count = @new; print "検索結果:$count件\n"; if ($page eq '') { $page = 0; } $end_data = @new - 1; $page_end = $page + $in{'view'} - 1; if ($page_end >= $end_data) { $page_end = $end_data; } $next_line = $page_end + 1; $back_line = $page - $in{'view'}; $enwd = &url_enc($in{'word'}); if ($back_line >= 0) { print "[前の$in{'view'}件]\n"; } if ($page_end ne "$end_data") { print "[次の$in{'view'}件]\n"; } # print "[検索やり直し]\n"; foreach ($page .. $page_end) { ($no,$reno,$date,$name,$email,$sub,$com,$url) = split(/<>/, $new[$_]); if ($email) { $name = "$name"; } if ($url) { $url = "<HOME>"; } if ($reno) { $no = "$renoへのレス"; } # 結果を表示 print "
[$no] $sub"; print " 投稿者:$name 投稿日:$date $url
\n"; print "
$com
\n"; } print "
\n"; } print "\n"; exit; } #------------------# # クッキーの発行 # #------------------# sub set_cookie { 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]); $cook="$in{'name'}<>$in{'email'}<>$in{'url'}<>$in{'pwd'}<>$in{'icon'}<>$in{'color'}"; print "Set-Cookie: Joyful_Note=$cook; expires=$gmt\n"; } #------------------# # クッキーを取得 # #------------------# sub get_cookie { local($key, $val, *ck); $ck = $ENV{'HTTP_COOKIE'}; foreach (split(/;/, $ck)) { ($key, $val) = split(/=/); $key =~ s/\s//g; $ck{$key} = $val; } @ck = split(/<>/, $ck{'Joyful_Note'}); return (@ck); } #--------------# # エラー処理 # #--------------# sub error { &unlock if ($lockflag); &header if (!$head_flag); print "

ERROR !

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


\n"; print "\n"; exit; } #--------------# # 管理モード # #--------------# sub admin { if ($in{'pass'} eq "") { &header; print "

パスワードを入力して下さい

\n"; print "
\n"; print "\n"; print "\n"; print "
\n"; print "
\n\n"; exit; } if ($in{'pass'} ne $pass) { &error("パスワードが違います"); } # 画像許可 if ($in{'job'} eq "img" && $in{'no'}) { my @chk = split(/\0/, $in{'no'}); # ロック処理 if ($lockkey) { &lock; } # 許可情報をマッチングし更新 my @new=(); open(IN,"$logfile") || &error("Open Error: $logfile"); $top = ; while () { ($no,$reno,$d,$n,$m,$s,$com,$u,$ho,$p,$c,$t,$w,$h,$chk) = split(/<>/); foreach $ck (@chk) { if ($no == $ck) { $_ = "$no<>$reno<>$d<>$n<>$m<>$s<>$com<>$u<>$ho<>$p<>$c<>$t<>$w<>$h<>1<>\n"; last; } } push(@new,$_); } close(IN); # 更新 unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error: $logfile"); print OUT @new; close(OUT); # ロック解除 if ($lockkey) { &unlock; } } # 削除処理 if ($in{'job'} eq "del" && $in{'no'}) { my @DEL = split(/\0/, $in{'del'}); # ロック処理 if ($lockkey) { &lock; } # 削除情報をマッチングし更新 my @new=(); open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; while () { $flag=0; ($no,$reno,$d,$n,$m,$s,$com,$u,$ho,$p,$c,$tail,$w,$h,$chk) = split(/<>/); foreach $del (@DEL) { if ($no == $del || $reno == $del) { if (-e "$ImgDir$no$tail") { unlink("$ImgDir$no$tail"); } $flag=1; last; } } if ($flag == 0) { push(@new,$_); } } close(IN); # 更新 unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); # ロック解除 if ($lockkey) { &unlock; } } # 管理を表示 if ($page eq "") { $page = 0; } &header; print <
  • 処理を選択した上で、該当記事にチェックし送信ボタンを押してください。
処理:

EOM open(IN,"$logfile") || &error("Open Error: $logfile"); $top = ; $i=0; while () { $img_flag=0; ($no,$reno,$date,$name,$mail,$sub,$com,$url,$host,$pw,$color,$tail,$w,$h,$chk) = split(/<>/); if ($mail) { $name="$name"; } ($date) = split(/\(/, $date); if ($url) { $url = "<Home>"; } else { $url = '-'; } $com =~ s/
//ig; $com =~ s//>/g; if (length($com) > 40) { $com = substr($com,0,38); $com .= "..."; } if ($reno eq "") { print "
\n"; } # チェックボックス print ""; if ($chk) { print ''; } else { print ''; } print ""; print ""; print ""; print "\n"; } close(IN); print "\n"; print "
チェック許可記事NO投稿日 タイトル投稿者URLコメント ホスト名画像容量

$no$date$sub$name$url$com$host"; if ($tail) { print "[画像]"; $size = -s "$ImgDir$no$tail"; $all += $size; print $size; } else { print "
0"; } print "

\n"; $all = int ($all / 1024); print "【添付データ総数 : $all KB】\n"; print "\n"; exit; } #------------------# # ユーザ記事削除 # #------------------# sub usr_del { if ($in{'no'} eq '' || $in{'pwd'} eq '') { &error("記事Noまたは削除キーが入力モレです"); } # ロック処理 if ($lockkey) { &lock; } open(IN,"$logfile") || &error("Open Error : $logfile"); @lines = ; close(IN); $top = shift(@lines); $flag=0; foreach (@lines) { ($no,$reno,$date,$name,$mail,$sub,$com, $url,$host,$pw,$color,$tail,$w,$h,$chk) = split(/<>/); if ($flag == 0 && $in{'no'} eq "$no") { if ($pw eq '') { &error("該当記事には削除キーが設定されていません"); } # 削除キーを照合 $match = &decrypt("$in{'pwd'}","$pw"); if ($match ne 'yes') { &error("削除キーが違います"); } # 添付ファイル削除 if (-e "$ImgDir$no$tail") { unlink("$ImgDir$no$tail"); } if ($reno eq "") { $flag=2; } else { $flag=1; } } elsif ($flag == 2 && $in{'no'} eq $reno) { if (-e "$ImgDir$no$tail") { unlink("$ImgDir$no$tail"); } next; } else { push(@new,$_); } } if ($flag == 0) { &error("該当記事が見当たりません"); } # 更新 unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); # ロック解除 if ($lockkey) { &unlock; } } #----------------# # 記事修正処理 # #----------------# sub usr_edt { if ($in{'no'} eq '' || $in{'pwd'} eq '') { &error("記事Noまたはパスワードが入力モレです"); } if ($in{'action'} eq "edit") { # フォーム入力チェック &form_check; # ロック処理 &lock if ($lockkey); } $flag=0; open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; while () { ($no,$reno,$date,$name,$mail,$sub,$com,$url,$host,$pw,$color,$tail,$w,$h,$chk) = split(/<>/); if ($in{'no'} == $no) { $pw2 = $pw; $flag=1; if ($in{'action'} ne "edit") { last; } else { $_ = "$no<>$reno<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$pw<>$in{'color'}<>$tail<>$w<>$h<>$chk<>\n"; } } if ($in{'action'} eq "edit") { push(@new,$_); } } close(IN); if (!$flag) { &error("該当の記事が見当たりません"); } if ($pw2 eq "") { &error("パスワードが設定されていません"); } $check = &decrypt($in{'pwd'}, $pw2); if ($check ne "yes") { &error("パスワードが違います"); } if ($in{'action'} eq "edit") { unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); &unlock if ($lockkey); &set_cookie; if ($in{'url'}) { $in{'url'} = "http://$in{'url'}"; } if ($in{'email'}) { $in{'email'} = "$in{'email'}"; } &header; print "

- 以下のとおり修正が完了しました -

\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
名前$in{'name'}
e-mail: $in{'email'}
題名$in{'sub'}
URL: $in{'url'}
\n"; print "
$in{'comment'}\n"; print "
\n"; print "
\n"; print "
\n"; print "\n\n"; exit; } $com =~ s/
/\r/g; &header; print "[戻る]\n"; print "

- 変更する部分のみ修正して送信ボタンを押して下さい -
\n"; &form("edit",$no,$reno,$date,$name,$mail,$sub,$com,$url,$host,$pw,$color); print "\n\n"; exit; } #------------------------# # フォーム入力チェック # #------------------------# sub form_check { # 他サイトからのアクセスを排除 if ($base_url) { $ref = $ENV{'HTTP_REFERER'}; $ref =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; if ($ref && $ref !~ /$base_url/i) { &error("不正なアクセスです"); } } # 入力項目のチェック if ($in{'name'} eq "") { &error("名前が入力されていません"); } if ($in{'comment'} eq "") { &error("コメントが入力されていません"); } if ($in_email) { if ($in{'email'} eq "") { &error("Eメールが入力されていません"); } elsif ($in{'email'} !~ /[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,5}$/) { &error("Eメールの入力内容が不正です"); } } } #--------------# # 時間を取得 # #--------------# sub get_time { $ENV{'TZ'} = "JST-9"; $times = time; ($min,$hour,$mday,$mon,$year,$wday) = (localtime($times))[1..6]; @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 lock { # 1分以上古いロックは削除する if (-e $lockfile) { local($mtime) = (stat($lockfile))[9]; if ($mtime < time - 60) { &unlock; } } local($retry) = 5; # symlink関数式ロック if ($lockkey == 1) { while (!symlink(".", $lockfile)) { if (--$retry <= 0) { &error('LOCK is BUSY'); } sleep(1); } # mkdir関数式ロック } elsif ($lockkey == 2) { while (!mkdir($lockfile, 0755)) { if (--$retry <= 0) { &error('LOCK is BUSY'); } sleep(1); } } $lockflag=1; } #--------------# # ロック解除 # #--------------# sub unlock { if ($lockkey == 1) { unlink($lockfile); } elsif ($lockkey == 2) { rmdir($lockfile); } $lockflag=0; } #--------------# # メール送信 # #--------------# sub mail_to { local($com, $hp, $mail_sub, $mail_body); # メールタイトルを定義 $mail_sub = "[$title : $no] $in{'sub'}"; # 記事の改行を復元 $com = $in{'comment'}; $com =~ s/
/\n/g; # URL情報 if ($in{'url'}) { $hp = "http://$in{'url'}"; } else { $hp = ""; } # メール本文を定義 $mail_body = <<"EOM"; 投稿日時:$date ホスト名:$host ブラウザ:$ENV{'HTTP_USER_AGENT'} 投稿者名:$in{'name'} Eメール:$in{'email'} URL :$hp タイトル:$in{'sub'} 投稿記事: $com EOM # JISコード変換 &jcode'convert(*mail_sub,'jis'); &jcode'convert(*mail_body,'jis'); # メールアドレスがない場合は管理者メールに置き換え if ($in{'email'} eq "") { $email = $mailto; } else { $email = $in{'email'}; } open(MAIL,"| $sendmail -t"); print MAIL "To: $mailto\n"; print MAIL "From: $email\n"; print MAIL "Subject: $mail_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 "$mail_body\n"; print MAIL "--------------------------------------------------------\n"; close(MAIL); } #------------------# # パスワード暗号 # #------------------# sub encrypt { local($inpw) = $_[0]; local(@SALT, $salt, $encrypt); @SALT = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/'); srand; $salt = $SALT[int(rand(@SALT))] . $SALT[int(rand(@SALT))]; $encrypt = crypt($inpw, $salt) || crypt ($inpw, '$1$' . $salt); return $encrypt; } #------------------# # パスワード照合 # #------------------# sub decrypt { local($inpw, $logpw) = @_; local($salt, $check); $salt = $logpw =~ /^\$1\$(.*)\$/ && $1 || substr($logpw, 0, 2); $check = "no"; if (crypt($inpw, $salt) eq $logpw || crypt($inpw, '$1$' . $salt) eq $logpw) { $check = "yes"; } return $check; } #----------------# # HTMLヘッダー # #----------------# sub header { $head_flag=1; print "Content-type: text/html\n\n"; print < しずおか花物語 花の相談室 EOM if ($bg) { print "\n"; } else { print "\n"; } } #-----------------# # 自動URLリンク # #-----------------# sub auto_link { $_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/$1$2<\/a>/g; } #----------------# # ホスト名取得 # #----------------# sub get_host { $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($host eq "" || $host eq $addr) { $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2) || $addr; } } #------------------# # 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サイズ認識 # #-----------------# sub PngSize { local($png) = @_; local($data); open(PNG, "$png") || return (0,0); binmode(PNG); read(PNG, $data, 24); close(PNG); $W = unpack("N", substr($data, 16, 20)); $H = unpack("N", substr($data, 20, 24)); return ($W, $H); } #-----------------# # URLエンコード # #-----------------# sub url_enc { local($_) = @_; s/(\W)/'%' . unpack('H2', $1)/eg; s/\s/+/g; $_; } #----------------# # 投稿フォーム # #----------------# sub form { local($type,$no,$reno,$date,$name,$mail,$sub,$com,$url,$host,$pw,$color) = @_; local($cnam,$ceml,$curl,$cpwd,$cico,$ccol); # 修正 if ($type eq "edit") { print "

\n"; print "\n"; print "\n"; print "\n"; print "\n"; $cnam = $name; $ceml = $mail; $curl = $url; $ccol = $color; # 返信 } elsif ($type eq "res") { if ($res_clip) { print "\n"; } else { print "\n"; } print "\n"; print "\n"; ($cnam,$ceml,$curl,$cpwd,$cico,$ccol) = &get_cookie; # 新規 } else { print "\n"; print "\n"; ($cnam,$ceml,$curl,$cpwd,$cico,$ccol) = &get_cookie; } print <<"EOM"; EOM # 添付フォーム if ($type eq "" || ($type eq "res" && $res_clip)) { print ""; print "\n"; } # パスワード欄 if ($type ne "edit") { print "\n"; } print "
お名前 :
Eメール :
題名 :  
コメント :
参照先 :
添付画像 :
暗証キー : (英数字で8文字以内)
\n"; }