#!/usr/bin/perl #┌───────────────────────────────── #│ CLIP BOARD v1.41 (2001/12/02) #│ Copyright(C) Kent Web 2001 #│ webmaster@kent-web.com #│ http://www.kent-web.com/ #└───────────────────────────────── $ver = 'ClipBoard v1.41'; #┌───────────────────────────────── #│ [注意事項] #│ 1. このスクリプトはフリーソフトです。このスクリプトを使用した #│ いかなる損害に対して作者は一切の責任を負いません。 #│ 2. 設置に関する質問はサポート掲示板にお願いいたします。 #│ 直接メールによる質問は一切お受けいたしておりません。 #│ 3. このスクリプトは、method=POST 専用です。 #│ 4. 同梱のアイコンは再配布で著作権者は以下のとおりです。 #│ home.gif : mayuRinさん #│ clip.gif : 牛飼いとアイコンの部屋さん #└───────────────────────────────── # # [ 設置構成例 ] : かっこ内はパーミッション値 # # public_html / index.html (ホームページなど) # | # +-- clip / clip.cgi [755] # | clip.log [666] # | jcode.pl [644] # | cgi-lib.pl [644] # | # +-- img [777] / clip.gif # | home.gif # | soon.gif # | # +-- lock [777] / #============# # 設定 # #============# # ライブラリ取り込み require './jcode.pl'; require './cgi-lib.pl'; # タイトル名 $title = "制作日記"; # タイトル文字の色 $t_color = "#D8D8D8"; # タイトル文字のタイプ $t_face = "MS ゴシック"; # タイトル文字サイズ(スタイルシートで有効) $t_point = '20pt'; # 本文文字サイズ(スタイルシートで有効) $b_size = '10pt'; # 記事題名の色 $sub_color = "#FF967B"; # スクリプト名 # → 絶対パスなら http:// からのURLパス $script = './clip.cgi'; # ログファイル名 # → 絶対パスなら / から始まるパス(http://からではないので注意) #$logfile = '/home/htdocs/bbsdata/clip/boss7dat.cgi'; $logfile = '/usr/www/www.07th-expansion.net/etc/clip/boss7dat.cgi'; # 管理用パスワード $pass = '0707STROBS'; # 最大記事数(これを超える記事は古い順に削除されます) $max = 500; # 戻り先 $home = "http://07th-expansion.net/Main.htm"; $home2 = "http://07th-expansion.net/Soft/Higurasi.htm"; # bodyタグ $body = ''; # URLの自動リンク (0=no 1=yes) # → タグ許可の場合は no とすること。 $autolink = 0; # 1ページあたりの記事表示件数 $p_log = 10; # ロックファイル機構 (0=no 1=symlink関数 2=mkdir関数) $lockkey = 2; # ロックファイル名 # → 絶対パスなら / から始まるパス(http://からではないので注意) $lockfile = './lock/clip.lock'; # アップロードディレクトリ # → パスの最後は / で終わること # → フルパスだと / から記述する $ImgDir = "./Up_cg/"; # アップロードディレクトリのURLパス # → パスの最後は / で終わること #$ImgUrl = "http://www.xxx.xxx/clip/img/"; $ImgUrl = "./Up_cg/"; # 画像管理者チェック機能 (0=no 1=yes) # → アップロード「画像」は管理者がチェックしないと表示されない機能です # → チェックされるまで「画像」は「COMMING SOON」のアイコンが表示されます $ImageCheck = 0; # 投稿処理の権限 # 0: 誰でも投稿可能 # 1: 管理者のみが投稿 $PostMode = 1; # 添付ファイルのアップロードに失敗したとき # 0 : 添付ファイルは無視し、記事は受理する # 1 : エラー表示して処理を中断する $clip_err = 1; # タグ許可 (0=no 1=yes) $tagkey = 1; # メール通知機能 # 0: no # 1: yes:自分の投稿記事もメール通知する # 2: yes:自分の投稿記事はメール通知しない $mailing = 0; # sendmailのパス(メール通知する場合) $sendmail = '/usr/lib/sendmail'; # メール通知先アドレス(メール通知する場合) $mailto = 'xxx@xxx.xxx'; # タグ広告挿入オプション (FreeWebなど) # → の代わりに「広告タグ」を挿入する。 # → 広告タグ以外に、MIDIタグ や LimeCounter等のタグにも使用可能です。 $banner1 = ''; # 表示部上部に挿入 $banner2 = ''; # 表示部下部に挿入 # アクセス制限(ホスト名を記述) @deny = ( "anonymizer.com", "cache*.*.interlog.com", "", "", "", "" ); # リンク元チェック (0=no 1=yes) # → いたずら投稿防止に「リンク元」チェックを行う場合 $LinkCheck = 0; # 同一ホストからの連続投稿を制限 # → 秒数を記述するとその時間以上を経過しないと連続投稿できない # → 投稿を管理者限定にする場合 ($PostMode=1;) はこの設定は無視されます $w_regist = '60'; # タイトル画像を使う場合 (http://から画像を指定) $ImgT = ""; # タイトル画像を使う場合に「横幅」「縦幅」をそれぞれピクセル数で記述 $ImgW = 300; $ImgH = 70; # アップロードを許可するファイル形式 # 0:no 1:yes $gif = 1; # GIFファイル $jpeg = 1; # JPEGファイル $png = 1; # PNGファイル $text = 1; # TEXTファイル $lha = 1; # LHAファイル $zip = 1; # ZIPファイル $pdf = 1; # PDFファイル $midi = 1; # MIDIファイル $word = 1; # WORDファイル $excel = 1; # EXCELファイル $ppt = 1; # POWERPOINTファイル $ram = 1; # RAMファイル $rm = 1; # RMファイル $mpeg = 1; # MPEGファイル $mp3 = 1; # MP3ファイル # 投稿受理最大サイズ (bytes) # → 例 : 102400 = 300KB $cgi_lib'maxdata = '307200'; # 画像ファイルの最大表示の大きさ(単位:ピクセル) # → これを超える画像は縮小表示します $MaxW = 640; # 横幅 $MaxH = 480; # 縦幅 # アイコン画像ファイル名 (ファイル名のみ) $IconHome = "home.gif"; # ホーム $IconClip = "clip.gif"; # クリップ $IconSoon = "soon.gif"; # COMINIG SOON # サブメッセージ # → タイトルの下にサブメッセージを記述できます # → HTMLタグなどを使ってご自由にどうぞ $SubMsg = <<'_SUB_MSG_'; _SUB_MSG_ #============# # 設定完了 # #============# 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 'usrdel') { &usrdel; } elsif ($mode eq 'note') { ¬e; } elsif ($mode eq 'check') { ✓ } &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 { # レス処理 if ($mode eq 'resmsg') { open(IN,"$logfile") || &error("Open Error : $logfile"); $flag=0; while () { ($no,$date,$name,$mail,$sub,$com,$url) = split(/<>/); if ($in{'no'} eq "$no") { $flag=1; last; } } close(IN); if ($flag == 0) { &error("該当記事が見つかりません"); } $sub =~ s/^Re://g; $r_sub = "Re:[$no] $sub"; $r_com = "> $com"; $r_com =~ s/&/\&/g; $r_com =~ s/<//g; $r_com =~ s/
/\r> /ig; $r_com =~ s/(.*)<\/a>/$1/g; } &header; print "
\n"; print "$banner1

\n" if ($banner1 ne ""); # タイトル if ($ImgT) { print "\"$title\"\n"; } else { print "$title\n"; } # サブメッセージ print "
\n$SubMsg\n
\n"; # 罫線の長さを調整 if ($PostMode) { $hr = '100%'; } else { $hr = '90%'; } print <<"EOM";


[
メインページへ戻る] [ワード検索] [管理用]
EOM # 投稿フォーム if (!$PostMode) { &form; } # ページ区切り処理 $start = $in{'page'} + 1; $end = $in{'page'} + $p_log; open(IN,"$logfile") || &error("Open Error : $logfile"); $i=0; while () { $i++; if ($i < $start) { next; } if ($i > $end) { last; } ($no,$date,$name,$mail,$sub,$com,$url, $host,$pw,$tail,$W,$H,$time2,$chk) = split(/<>/); if ($mail) { $name = "$name"; } if ($url) { $url = ""; } print "[$no] $sub "; print "投稿者:$name 投稿日:$date "; # 返信のリンク if (!$PostMode) { print "[返信] "; } print "  $url
\n
\n"; # 添付ファイルが存在する場合 if (-e "$ImgDir$no$tail") { if ($tail eq ".gif" || $tail eq ".jpg" || $tail eq ".png") { if ($ImageCheck && $chk != 1) { print "\n"; } elsif ($W && $H) { print "\"$no$tail\"\n"; } else { print "\"$no$tail\"\n"; } print "$com
\n"; } else { print "$com

Download:$no$tail $no$tail\n"; } } else { print "$com\n"; } print "


\n"; } close(IN); $next_page = $in{'page'} + $p_log; $back_page = $in{'page'} - $p_log; print "\n"; if ($back_page >= 0) { print "\n"; } if ($next_page < $i) { print "\n"; } print "
\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "
\n"; # 削除フォーム if (!$PostMode) { print "
\n"; print "
\n"; print "\n"; print "記事No\n"; print "削除キー\n"; print "\n"; print "

\n"; } # 著作権表示(削除・改変は禁止) print "
$banner2

\n"; print "- ClipBoard -\n"; print "

\n\n\n"; exit; } #----------------# # 書きこみ処理 # #----------------# sub regist { # POSTチェック if (!&MethPost()) { &error("METHOD形式が POST でありません"); } # パスワードチェック if ($PostMode && $in{'pass'} ne $pass) { &error("パスワードが認証できません"); } # リンク元チェック if ($LinkCheck) { $FullUrl = &MyFullUrl(); $ref = $ENV{'HTTP_REFERER'}; $ref =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; if ($ref !~ /$FullUrl/i) { &error("リンク元が不正のため投稿が受理できません"); } } # フォーム内容をチェック if ($in{'name'} eq "") { &error("名前が入力されていません"); } if ($in{'comment'} eq "") { &error("コメントが入力されていません"); } # ロック処理 if ($lockkey) { &lock; } open(IN,"$logfile") || &error("Open Error : $logfile"); @lines = ; close(IN); ($tno,$tdate,$tname,$tmail,$tsub,$tcom, $turl,$thost,$tpw,$ttail,$tw,$th,$ttime) = split(/<>/, $lines[0]); if ($in{'name'} eq "$tname" && $in{'comment'} eq "$tcom") { &error("二重投稿は禁止です"); } if (!$PostMode && $w_regist && $times - $ttime < $w_regist) { &error("連続投稿はもうしばらく時間を置いてからお願い致します"); } # 記事Noを採番 $no = $tno + 1; # 削除キーを暗号化 if ($in{'pwd'} ne "") { $PW = &encrypt($in{'pwd'}); } # URL自動リンク if ($autolink) { &auto_link($in{'comment'}); } # 最大記事数処理 while ($max <= @lines) { $del = pop(@lines); local($no,$date,$name,$mail,$sub,$com,$url,$host,$pw,$tail) = split(/<>/, $del); if (-e "$ImgDir$no$tail") { unlink("$ImgDir$no$tail"); } } # ファイル添付処理 if ($in{'upfile'}) { &UpFile; } # 更新 unshift(@lines,"$no<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$PW<>$tail<>$W<>$H<>$times<><>\n"); open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @lines; close(OUT); # ロック解除 if ($lockkey) { &unlock; } # クッキー格納処理 if ($in{'cook'} eq 'on') { &set_cookie; } # メール通知処理 if ($mailing == 1) { &mail_to; } elsif ($mailing == 2 && $in{'email'} ne "$mailto") { &mail_to; } # 管理者限定投稿の完了画面 if ($PostMode && $in{'action'} eq "regist") { &header; print "


\n"; print "

記事は正常に登録できました

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

\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n\n\n"; exit; } } #--------------------# # 画像アップロード # #--------------------# sub 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 =~ 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 ($tail =~ /text\/plain/i && $text) { $tail=".txt"; $flag=1; } if ($tail =~ /lha/i && $lha) { $tail=".lzh"; $flag=1; } if ($tail =~ /zip/i && $zip) { $tail=".zip"; $flag=1; } if ($tail =~ /pdf/i && $pdf) { $tail=".pdf"; $flag=1; } if ($tail =~ /audio\/.*mid/i && $midi) { $tail=".mid"; $flag=1; } if ($tail =~ /msword/i && $word) { $tail=".doc"; $flag=1; } if ($tail =~ /ms-excel/i && $excel) { $tail=".xls"; $flag=1; } if ($tail =~ /ms-powerpoint/i && $ppt) { $tail=".ppt"; $flag=1; } if ($tail =~ /audio\/.*realaudio/i && $ram) { $tail=".ram"; $flag=1; } if ($tail =~ /application\/.*realmedia/i && $rm) { $tail=".rm"; $flag=1; } if ($tail =~ /video\/.*mpeg/i && $mpeg) { $tail=".mpg"; $flag=1; } if ($tail =~ /audio\/.*mpeg/i && $mp3) { $tail=".mp3"; $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 ($fname =~ /\.lzh$/i && $lha) { $tail=".lzh"; $flag=1; } if ($fname =~ /\.txt$/i && $text) { $tail=".txt"; $flag=1; } if ($fname =~ /\.zip$/i && $zip) { $tail=".zip"; $flag=1; } if ($fname =~ /\.pdf$/i && $pdf) { $tail=".pdf"; $flag=1; } if ($fname =~ /\.mid$/i && $midi) { $tail=".mid"; $flag=1; } if ($fname =~ /\.doc$/i && $word) { $tail=".doc"; $flag=1; } if ($fname =~ /\.xls$/i && $excel) { $tail=".xls"; $flag=1; } if ($fname =~ /\.ppt$/i && $ppt) { $tail=".ppt"; $flag=1; } if ($fname =~ /\.ram$/i && $ram) { $tail=".ram"; $flag=1; } if ($fname =~ /\.rm$/i && $rm) { $tail=".rm"; $flag=1; } if ($fname =~ /\.mpe?g$/i && $mpeg) { $tail=".mpg"; $flag=1; } if ($fname =~ /\.mp3$/i && $mp3) { $tail=".mp3"; $flag=1; } } # アップロード失敗処理 if (!$flag && !$clip_err) { return; } elsif (!$flag && $clip_err) { &error("アップロードできないファイル形式です"); } $upfile = $in{'upfile'}; # マックバイナリ対策 if ($macbin) { $length = substr($upfile,83,4); $length = unpack("%N",$length); $upfile = substr($upfile,128,$length); } # 添付データを書き込み $ImgFile = "$ImgDir$no$tail"; if (!open(OUT,"> $ImgFile")) { if ($clip_err) { &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 find { &header; print <<"EOM"; [戻る]
ワード検索
  • 検索したいキーワードを入力し「検索」ボタンを押してください。
  • キーワードは「半角スペース」で区切って複数指定することができます。
    キーワード 条件 \n
    \n
\n"; # ワード検索の実行と結果表示 if ($in{'word'} ne "") { # キーワードを配列化 $in{'word'} =~ s/ / /g; @pairs = split(/\s+/, $in{'word'}); # 検索処理 print "
\n"; open(IN,"$logfile") || &error("Open Error : $logfile"); $i=0; 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++; ($no,$date,$name,$mail,$sub,$com,$url,$host,$pw) = split(/<>/); if ($mail) { $name = "$name"; } if ($url) { $url = "http://$url"; } print "[$no] $sub "; print "投稿者:$name 投稿日:$date
\n"; print "
$com

$url


\n"; } close(IN); print "- 検索結果は $i件です -\n"; } print "\n\n"; exit; } #--------------# # 管理モード # #--------------# sub admin { if ($in{'pass'} ne "" && $in{'pass'} ne "$pass") { &error("パスワードが違います"); } if ($PostMode && $in{'action'} eq "form") { &PostForm; } &header; print "[掲示板に戻る]\n"; print "
\n"; print "管理モード\n"; print "
\n"; if ($in{'pass'} eq "") { print "

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

\n"; print "
\n"; print "\n"; if ($PostMode) { print "ログ管理\n"; print "記事投稿\n"; } print "

"; print "

\n"; } else { # 画像許可 if ($in{'chk'}) { @CHK = split(/\0/, $in{'chk'}); # ロック処理 if ($lockkey) { &lock; } # 画像情報をマッチングし更新 open(IN,"$logfile") || &error("Open Error : $logfile"); @lines = ; close(IN); @new=(); foreach (@lines) { ($no,$date,$name,$mail,$sub,$com,$url, $host,$pw,$tail,$w,$h,$time2,$chk) = split(/<>/); foreach $xx (@CHK) { if ($no eq "$xx") { $_="$no<>$date<>$name<>$mail<>$sub<>$com<>$url<>$host<>$pw<>$tail<>$w<>$h<>$time2<>1<>\n"; last; } } push(@new,$_); } open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); # ロック解除 if ($lockkey) { &unlock; } } # 削除処理 if ($in{'del'}) { @DEL = split(/\0/, $in{'del'}); # ロック処理 if ($lockkey) { &lock; } # 削除情報をマッチングし更新 open(IN,"$logfile") || &error("Open Error : $logfile"); @lines = ; close(IN); @new=(); foreach (@lines) { $flag=0; ($no,$date,$name,$mail,$sub, $com,$url,$host,$pw,$tail) = split(/<>/); foreach $del (@DEL) { if ($no eq "$del") { $flag=1; if (-e "$ImgDir$no$tail") { unlink("$ImgDir$no$tail"); } last; } } if ($flag == 0) { push(@new,$_); } } open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); # ロック解除 if ($lockkey) { &unlock; } } # 削除画面を表示 print "
\n"; print "\n"; print "\n"; print "
\n
    \n"; print "
  • 記事を削除する場合は「削除」のチェックボックスにチェックを入れ「送信する」を押して下さい。\n"; if ($ImageCheck) { print "
  • 画像許可を行なう場合は「画像許可」のチェックボックスにチェックを入れ「送信する」を押して下さい。\n"; } print "
\n
\n"; print "

\n"; print ""; print ""; if ($ImageCheck) { print ""; } print "\n"; open(IN,"$logfile") || &error("Open Error : $logfile"); while () { $img_flag=0; ($no,$date,$name,$mail,$sub,$com,$url, $host,$pw,$tail,$w,$h,$time,$chk) = split(/<>/); ($date,$dmy) = split(/\(/, $date); if ($mail) { $name="$name"; } $com =~ s/
//ig; $com =~ s//>/g; if (length($com) > 40) { $com = substr($com,0,38); $com .= ".."; } if (-e "$ImgDir$no$tail") { if ($tail eq ".gif" || $tail eq ".jpg" || $tail eq ".png") { $img_flag = 1; $File = "画像"; } else { $File = "File"; } $clip = "$File"; $size = -s "$ImgDir$no$tail"; $all += $size; } else { $clip = ""; $size = 0; } print "
"; print ""; print ""; print "\n"; # 画像許可 if ($ImageCheck) { if ($img_flag == 1 && $chk == 1) { print ""; } elsif ($img_flag == 1 && $chk != 1) { print ""; } else { print ""; } } print "\n"; } close(IN); print "
削除記事No投稿日題名投稿者コメントホスト名添付
(Bytes)
画像
許可
$no$date$sub$name$com$host$clip
($size)
OK
\n"; print "

"; print "

\n"; $all = int ($all / 1024); print "【添付データ総数 : $all KB】\n"; } print "
\n\n\n"; exit; } #------------------# # ユーザ記事削除 # #------------------# sub usrdel { if ($in{'no'} eq '' || $in{'pwd'} eq '') { &error("削除Noまたは削除キーが入力モレです"); } # ロック処理 if ($lockkey) { &lock; } open(IN,"$logfile") || &error("Open Error : $logfile"); @lines = ; close(IN); $flag=0; @new=(); foreach (@lines) { ($no,$date,$name,$mail,$sub,$com,$url,$host,$pw,$tail) = split(/<>/); if ($in{'no'} eq "$no") { $flag=1; $PWD=$pw; $upfile="$no$tail" } else { push(@new,$_); } } if ($flag == 0) { &error("該当記事が見当たりません"); } if ($PWD eq '') { &error("該当記事には削除キーが設定されていません"); } # 削除キーを照合 $match = &decrypt("$in{'pwd'}","$PWD"); if ($match ne 'yes') { &error("削除キーが違います"); } # ログを更新 open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @new; close(OUT); # 添付ファイルがあれば削除 unlink("$ImgDir$upfile") if (-e "$ImgDir$upfile"); # ロック解除 if ($lockkey) { &unlock; } } #----------------# # 投稿フォーム # #----------------# sub form { # ブラウザ/クッキー情報を取得 &get_agent; &get_cookie; print <<"EOM";
EOM if (!$PostMode) { print "\n"; print "\n"; } print <<"EOM";
おなまえ
Eメール
題  名
メッセージ
URL
添付File [留意事項]
削除キー\n"; print "(記事の削除用。英数字で8文字以内)
クッキー情報を保存

EOM } #------------------------# # 管理者用投稿フォーム # #------------------------# sub PostForm { &header; print "[戻る]\n"; print "
\n"; print "管理者用投稿フォーム
\n"; &form; print "\n\n"; exit; } #----------------# # デコード処理 # #----------------# sub decode { &ReadParse; while (($key,$val) = each %in) { if ($key ne "upfile") { # シフトJISコードに変換 &jcode'convert(*val, "sjis", "", "z"); # タグ処理 if ($tagkey) { $val =~ s/<>/<>/g; } else { $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'}; $in{'url'} =~ s/^http\:\/\///; if ($in{'sub'} eq "") { $in{'sub'} = "無題"; } # 日時の取得 $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); } #--------------# # HTMLヘッダ # #--------------# sub header { $head_flag = 1; print "Content-type: text/html\n\n"; print <<"EOM"; $title $body EOM } #----------------------# # ブラウザ情報を取得 # #----------------------# sub get_agent { $agent = $ENV{'HTTP_USER_AGENT'}; if ($agent =~ /MSIE 4/i || $agent =~ /MSIE 5/i) { $f_name = 28; $f_sub = 35; $f_url = 63; $f_cols = 54; } else { $f_name = 20; $f_sub = 25; $f_url = 45; $f_cols = 55; } } #--------------# # エラー処理 # #--------------# sub error { if ($lockflag) { &unlock; } &header if (!$head_flag); print "

ERROR !

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


\n\n\n"; exit; } #------------------# # クッキーの発行 # #------------------# sub set_cookie { ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg) = gmtime(time + 60*24*60*60); @mons = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); $date_g = sprintf("%s\, %02d-%s-%04d %02d:%02d:%02d GMT", $week[$wdayg],$mdayg,$mons[$mong],$yearg+1900,$hourg,$ming,$secg); $cook="name<>$in{'name'}\,email<>$in{'email'}\,url<>$in{'url'}\,pwd<>$in{'pwd'}"; print "Set-Cookie: IMGBBS=$cook; expires=$date_g\n"; } #------------------# # クッキーを取得 # #------------------# sub get_cookie { $ck = $ENV{'HTTP_COOKIE'}; @ck = split(/; /, $ck); foreach (@ck) { if ($_ =~ /IMGBBS=(.*)/) { $cookdata=$1; last; } } @pairs = split(/,/, $cookdata); foreach (@pairs) { local($key,$val) = split(/<>/); $COOKIE{$key} = $val; } $c_name = $COOKIE{'name'}; $c_email = $COOKIE{'email'}; $c_url = $COOKIE{'url'}; $c_pwd = $COOKIE{'pwd'}; if ($in{'cook'} eq 'on') { if ($in{'name'}) { $c_name = $in{'name'}; } if ($in{'email'}) { $c_email = $in{'email'}; } if ($in{'url'}) { $c_url = $in{'url'}; } if ($in{'pwd'}) { $c_pwd = $in{'pwd'}; } } } #----------------# # ホスト名取得 # #----------------# 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; } } #----------------------# # パスワード暗号処理 # #----------------------# 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, $key, $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; } #--------------# # ロック処理 # #--------------# 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 { $m_sub = "[$title : $no] $in{'sub'}"; $m_ttl = $in{'sub'}; $m_name = $in{'name'}; $m_com = $in{'comment'}; $m_com =~ s/
/\n/ig; $m_com =~ s/<//g; &jcode'convert(*m_sub,'jis'); &jcode'convert(*m_ttl,'jis'); &jcode'convert(*m_name,'jis'); &jcode'convert(*m_com,'jis'); if (!open(MAIL,"| $sendmail -t")) { &error("メール送信に失敗しました"); } print MAIL "To: $mailto\n"; print MAIL "Errors-To: $mailto\n"; # メールアドレスがない場合はダミーメールに置き換え if ($in{'email'} eq "") { $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 "CLIP : $no$tail\n" if ($in{'upfile'}); print MAIL "NAME : $m_name\n"; print MAIL "EMAIL: $in{'email'}\n"; print MAIL "URL : http://$in{'url'}\n" if ($in{'url'}); print MAIL "TITLE: $m_ttl\n\n"; print MAIL "$m_com\n"; print MAIL "--------------------------------------------------------\n"; close(MAIL); } #--------------# # 自動リンク # #--------------# sub auto_link { $_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+)/$1$2<\/a>/g; } #------------------# # 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 note { &header; print <<"EOM"; ファイル添付時の留意事項
    EOM $MaxData = int ($cgi_lib'maxdata / 1024); if ($gif) { $FILE .= "GIF, "; } if ($jpeg) { $FILE .= "JPEG, "; } if ($png) { $FILE .= "PNG, "; } if ($text) { $FILE .= "TEXT, "; } if ($lha) { $FILE .= "LHA, "; } if ($zip) { $FILE .= "ZIP, "; } if ($pdf) { $FILE .= "PDF, "; } if ($midi) { $FILE .= "MIDI, "; } if ($word) { $FILE .= "WORD, "; } if ($excel) { $FILE .= "EXCEL, "; } if ($ppt) { $FILE .= "POWERPOINT, "; } if ($rm) { $FILE .= "RM, "; } if ($ram) { $FILE .= "RAM, "; } if ($mpeg) { $FILE .= "MPEG, "; } if ($mp3) { $FILE .= "MP3, "; } $FILE =~ s/\, $//; print "
  1. 投稿時にファイルを添付する事ができます。

    \n"; print "
  2. ただし、ブラウザはインターネットエクスプローラ4 またはネットスケープ4 以上である必要があります。

    \n"; print "
  3. 添付可能\ファイル → $FILE

    \n"; print "
  4. 最大投稿データ量は $MaxData KB までです。

    \n"; print "
  5. 画像は横 $MaxWピクセル、縦 $MaxHピクセルを超えると縮小表\示されます。

    \n"; if ($ImageCheck) { print "
  6. 画像に限り管理者が許可するまで「COMING SOON」が仮表\示されます。\n"; } print "
\n
\n"; print "\n\n"; exit; } #------------------# # チェックモード # #------------------# sub check { &header; print "

Check Mode

\n"; print "
    \n"; # ログファイル if (-e $logfile) { print "
  • ログファイル:パスOK!\n"; } else { print "
  • ログファイルのパスが不正です: $logfile\n"; } if (-r $logfile && -w $logfile) { print "
  • ログパーミッション:OK!\n"; } else { print "
  • ログパーミッションが不正です。\n"; } # 画像ディレクトリ if (-d $ImgDir) { print "
  • アップロードディレクトリ:パスOK!\n"; } else { print "
  • アップロードディレクトリのパスが不正です: $ImgDir\n"; } if (-r $ImgDir && -w $ImgDir && -x $ImgDir) { print "
  • アップロードディレクトリのパーミッション:OK!\n"; } else { print "
  • アップロードディレクトリのパーミッションが不正です。\n"; } # ロックディレクトリ print "
  • ロック形式:"; if ($lockkey == 0) { print "ロック設定なし\n"; } else { if ($lockkey == 1) { print "symlink\n"; } else { print "mkdir\n"; } ($lockdir) = $lockfile =~ /(.*)[\\\/].*$/; print "
  • ロックディレクトリ:$lockdir\n"; if (-d $lockdir) { print "
  • ロックディレクトリのパス:OK\n"; } else { print "
  • ロックディレクトリのパス:NG → $lockdir\n"; } if (-r $lockdir && -w $lockdir && -x $lockdir) { print "
  • ロックディレクトリのパーミッション:OK\n"; } else { print "
  • ロックディレクトリのパーミッション:NG → $lockdir\n"; } } print "
\n\n\n"; exit; }