#!/usr/bin/perl # 余裕派掲示板 ver.2.62, (C)Copyright 2000-2001 OGATA TETSUJI $masterkey = 'oopmahs'; # ↑管理用パスワード(半角英数)を''の間に書いてください。 $thisfile = ''; # ↑掲示板が動かないときは''の間にhttp://から始まるURLを入力してみてください。 # 例 $thisfile = 'http://specters.net/cgipon/yyh.cgi'; #-------------------------------------------------------------------------- # # 掲示板のカスタマイズはブラウザ上からできますので、 # これ以降は書き換える必要はありません。 # まずはそのまま設置して動作確認を取るようにしてください。 # #-------------------------------------------------------------------------- #========================================================================== # [ Note ] #========================================================================== $scriptname = '余裕派掲示板'; # 書き換え不可 $version = 'ver.2.62'; # 書き換え不可 $copyright = '緒方哲治'; # 書き換え不可 #-------------------------------------------------------------------------- # [ 著作権・使用上の注意 ] # # このソフトウェア(以下「余裕派掲示板」と記述)は緒方哲治が作成しました。 # 著作権は緒方哲治に属します。(jcode.plを除く) # 著作者の許可なく配布・販売することを禁止します。 # # 余裕派掲示板はフリーソフトです。 # 余裕派掲示板を使用して発生したいかなる損害に対しても作者は責任を負いません。 # 改造は自由ですが、スクリプト内および表示されるHTML内にある著作者情報は削除・ # 変更しないでください。 # またCGIぽんへのリンク(以下)部分も削除・変更しないでください。 # http://specters.net/cgipon/ # http://specters.net/cgipon/yoyuuha/info/ # http://specters.net/cgipon/yoyuuha/how2/ # # perlはversion5以上を使用してください。 # データファイルは何らかの事故により破壊されることがありますので常にバックアッ # プを取るよう心がけてください。 # # CGIぽん http://specters.net/cgipon/ 緒方哲治 cgipon@specters.net #========================================================================== # [ 環境設定 ] #========================================================================== $jcode = './jcode.pl'; $logfile = './logs/yoyuuha.log'; $datfile = './logs/yoyuuha.dat'; @vnm = ('5','10','15','20','25','30','50','100','500'); $cookiename = 'yoyuuha'; $infourl = 'http://specters.net/cgipon/yoyuuha/info/'; $how2url = 'http://specters.net/cgipon/yoyuuha/how2/'; #========================================================================== # [ 更新チェック用 ] #========================================================================== if ($ENV{'REQUEST_METHOD'} eq 'HEAD'){ $fname = $logfile; $ftime = gmtime((stat $fname)[9]); @tm = split(/ +/, $ftime); $lm = "$tm[0], $tm[2] $tm[1] $tm[4] $tm[3] GMT"; $size = -s $fname; print "Content-type: text/html\r\n"; print "Last-Modified: $lm\r\n"; print "Accept-Ranges: bytes\r\n"; print "Content-Length: $size\r\n\r\n"; exit; } #========================================================================== # [ 開始 ] #========================================================================== $date = &GET_DATE(); &CHECK_CODE; &READ_FORM; &READ_OPTION; &CHECK_BROWSER; &CHECK_URL; if (!$in{ade}) { &GET_COOKIE; ($cnam,$ckey,$cmal,$curl,$cico,$vnm) = @cookies; } if ($in{edt}) { ($cnam,$cmal,$curl,$cico) = (); } &CHECK_DATA; if (!$use && !$pas && !$ivw && !$bak) { &IO; } if (!$ade && !$edt) { &PUT_COOKIE($cnam,$ckey,$cmal,$curl,$cico,$vnm); } if ($mobile) { &MOBILE; } elsif ($bak) { &BACKUP; } elsif ($ivw) { &ICONLIST; } &HTML_HEADER; if ($use) { &HTML_HOW2; } elsif ($enm) { &HTML_FORM; } elsif ($pas) { if ($pky eq $masterkey) { &HTML_OPTION; } else { &HTML_PASS; } } else { &HTML_SET; &HTML_LIST; &HTML_FORM; } &HTML_FOOTER; exit; #========================================================================== # [ HTML表示 ] #========================================================================== #-------------------------------------------------------------------------- # [ HTMLヘッダ ] sub HTML_HEADER { if ($msg) { $msg =~ s/
$//; } if ($backurl) { $lnk .= "[トップページ] "; } if ($use || $pas) { $lnk .= "["; $lnk .= "$bbstitleへ戻る]"; } else { $lnk .= "["; $lnk .= "$bbstitleの使い方]"; } $msg = "
$lnk
$msg"; print<<"_END_OF_HTML_"; Content-type: text/html $bbstitle
_END_OF_HTML_ if ($imgtit) { print "\n"; } else { print "

$bbstitle

\n"; } if ($headmsg) { print "
\n\n$headmsg\n\n\n"; } print<<"_END_OF_HTML_";
$msg
_END_OF_HTML_ } #-------------------------------------------------------------------------- # [ HTMLページのセット ] sub HTML_SET { print "
\n"; print "\n\n\n\n
\n\n"; print "\n"; print "件ずつ表\示\n"; print "ページ目\n"; print " 検索"; print "\n"; print "\n"; print "\n
\n\n"; print "
\n"; print "\n\n"; } #-------------------------------------------------------------------------- # [ HTMLリスト ] sub HTML_LIST { if ($colmbg) { $colmbg = " bgcolor=$colmbg"; } if ($next) { print "\n"; print "["; print "次の$vnm件>\n"; print "\n"; print "\n\n"; } foreach (@print) { chomp; ($num,$key,$nam,$mal,$url,$ico, $tit,$mes,$adm,$tim,$ipa,$rmh) = split(/,/,$_); foreach ($nam,$tit,$mes,$adm) { if ($ecut) { $_ = &CUT_EMOJI($_); } if(!$enm && $swrd) { s/($swrd)/$1<\/B><\/FONT>/go; } } foreach ($mes,$adm) { &jcode::convert(\$_,'euc'); s/(http:\/\/[\w\.\~\-\/\?\&\+\=\:\@\%\;\,]+) /$1<\/A>/giox; s/(ftp:\/\/[\w\.\~\-\/]+)/$1<\/A>/giox; s/([\w\.\-\_]+)\@([\w\.\-\_]+) /$1\@$2<\/A>/giox; s/\[(\d+)\] /\[$1\]<\/A>/giox; s/([^>])( )([^( )])/$1 $3/g; foreach $chtxt (@chtxt) { my($btxt,$atxt) = split(/=>/,$chtxt); s/(?:$btxt)/$atxt/g; } &jcode::convert(\$_,$ccode); } $num = "" . "[$num]"; if ($mal) { $nam = "" . "$nam"; } else { $nam = "$nam"; } if ($tit) { $tit = "$tit"; } $tim = &GET_DATE($dateformat,$tim); $tim = "$tim"; if ($url) { if ($imglnk) { $tmp = "" . ""; } elsif ($lnktxt) { $tmp = "[" . "$lnktxt]"; } else { $tmp = "[" . "http://$url]"; } $url = "$tmp"; } if ($icons[0]) { if ($ico eq '&d') { $ico = $ico_d; } elsif ($ico =~ /&e/) { $ico = $ico_e; } elsif ($ico eq '&h') { $ico = $ico_h; } elsif ($ico eq '&i') { $ico = $ico_i; } elsif ($ico eq '&j') { $ico = $ico_j; } $ico ||= $icons[0]; $ico = ""; } else { $ico = ''; } $mes = "$mes

"; if($adm) { $tmp = ''; if ($ico_a) { $tmp = ""; } $tmp = "" . "
$tmp$adm
" . "[from $adminname]
"; $adm = $tmp; } print<<"_END_OF_HTML_";
$num $tit $nam $tim $url
$ico $mes $adm

_END_OF_HTML_ } print "\n\n"; if ($prev) { print "\n"; print "<"; print "前の$vnm件]\n"; print "\n"; print "\n\n"; } } #-------------------------------------------------------------------------- # [ HTMLフォーム ] sub HTML_FORM { if ($enm) { chomp $print[0]; ($cnum,$ckey,$cnam,$cmal,$curl,$cico,$ctit,$cmes,$cadm,$ctim,$cipa,$crmh) = split(/,/,$print[0]); ($num,$key,$nam,$mal,$url,$ico, $tit,$mes,$adm,$tim,$ipa,$rmh) = split(/,/,$print[0]); $num = "[戻る]"; $num = "$num"; if ($tit) { $tit = "$tit"; } if ($mal) { $nam = "$nam"; } $nam = "$nam"; $tim = &GET_DATE($dateformat,$tim); $tim = "$tim"; if($url){ $tmp = "["; $tmp .= "http://$url]"; $url = $tmp; } $cmes =~ s/
/\n/g; $cadm =~ s/
/\n/g; if ($ade) { $rmh &&= "($rmh)"; $ipa = "[$ipa$rmh]"; } else { $ipa = ''; } print<<"_END_OF_HTML_";
$num $tit $nam $tim $ipa $url
_END_OF_HTML_ } if ($edt) { ($cnam,$ckey,$cmal,$curl,$cico,$vnm) = @cookies; } else { $cookies[10] = "$in{edt}"; } foreach ($cnam,$ctit,$cmes,$cadm) { s/<//g; s/ / /g; s/&/&/g; } print "\n"; print "
\n"; print "\n"; print ""; print ""; print "\n"; print ""; print ""; print "\n"; print ""; print ""; print "\n"; if ($icons[0]) { if ($cico eq '&d') { $cico = $ico_d; } elsif ($cico =~ /&e/) { $cico = $ico_e; } elsif ($cico eq '&h') { $cico = $ico_h; } elsif ($cico eq '&i') { $cico = $ico_i; } elsif ($cico eq '&j') { $cico = $ico_j; } $cico ||= $icons[0]; print "\n"; if (!$icons[1]) { print " \n"; } elsif (%iconam) { print " \n"; print " \n"; print " \n\n"; } else { print "\n"; } print ""; print "\n"; print "\n"; if ($ade) { print ""; print "\n\n"; print "\n"; } elsif($enm) { print "\n"; print "\n"; } print "\n"; if (!$enm) { print ""; } print "
名 前"; print ""; print "
メール"; print ""; print "
URL"; print ""; print "
$iconname\n"; print " \n"; print " "; print "一覧\n"; } else { print " $iconname\n"; print " \n \n"; foreach (@icons) { print " \n"; } if (!$checked) { print "\n"; } print " \n
"; print "
"; print "
"; print ""; print "
"; print "
\n"; } print "
内 容"; print ""; print "
"; print ""; print "
管理人\nパスワード"; print "\n"; print "削除する\n"; print "
"; print ""; print "
"; print ""; print "削除する\n
\n"; if ($enm) { print "\n"; print "\n"; print "\n"; print "\n"; print " "; print ""; } else { print " "; print " "; print "\n"; } print "
\n
    \n\n"; foreach (@footmsg) { print "
  • $_\n"; } print "\n
\n
\n"; print "
\n
\n\n"; print "\n\n" } #-------------------------------------------------------------------------- # [ HTMLフッタ ] sub HTML_FOOTER { $ft1 = "[$date] $bbstitle "; $tmp = "管理人"; if ($enm && !$ade) { $ft1 .= ""; $ft1 .= "$tmp "; } elsif ($use) { $ft1 .= "$tmp "; } elsif ($pas || $set || $ade) { $ft1 .= "管理人 "; } else { $ft1 .= "$tmp "; } $ft1 .= "$adminname"; $ft2 = "$scriptname "; $ft2 .= "$version"; print<<"_END_OF_HTML_"; $ft1
$ft2
_END_OF_HTML_ exit; } #-------------------------------------------------------------------------- # [ パスワード入力 ] sub HTML_PASS { print "\n\n"; print "
\n"; print "
\n"; print "管理人用パスワード\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n\n\n"; } #-------------------------------------------------------------------------- # [ オプション設定ページ ] sub HTML_OPTION { foreach (@icons) { $pre{icons} .= ""; } if ($ico_d) { $pre{ico_d} = ""; } if ($ico_e) { $pre{ico_e} = ""; } if ($ico_h) { $pre{ico_h} = ""; } if ($ico_i) { $pre{ico_i} = ""; } if ($ico_j) { $pre{ico_j} = ""; } if ($ico_a) { $pre{ico_a} = ""; } if ($def{ico_d}) { $def{ico_d} = ""; } if ($def{ico_e}) { $def{ico_e} = ""; } if ($def{ico_h}) { $def{ico_h} = ""; } if ($def{ico_i}) { $def{ico_i} = ""; } if ($def{ico_j}) { $def{ico_j} = ""; } if ($def{ico_a}) { $def{ico_a} = ""; } $ilebel[$ilebel] = ' checked'; $olebel[$olebel] = ' checked'; $ecut[$ecut] = ' checked'; $tsize[$tsize] = ' checked'; $def{headmsg} =~ s/,/
/g; $def{footmsg} =~ s/,/
/g; $def{chtxt} =~ s/,/
/g; $txt{headmsg} = $headmsg; $txt{footmsg} = $footmsg; $txt{icons} = $icons; $txt{chtxt} = $chtxt; $txt{headmsg} =~ s/
/\n/g; $txt{footmsg} =~ s/
/\n/g; $txt{icons} =~ s/,/\n/g; $txt{chtxt} =~ s/,/\n/g; $hissu = ' 必須項目'; print<<"_END_OF_HTML_";
基本設定
設定名 初期設定 現在の設定 変更欄
掲示板の名前 $def{bbstitle}  $bbstitle 
管理人の名前$hissu $def{adminname}  $adminname 
管理人のメールアドレス$hissu $def{adminmail}  $adminmail 
ログファイルの最大サイズ
負の値 -> 無制限
$def{logmax}  $logmax  KB
URL設定 絶対パス・相対パス共に可
設定名 初期設定 現在の設定 変更欄
トップページのURL $def{backurl}  $backurl 
ドットi用トップページのURL $def{back_d}  $back_d 
EZweb用トップページのURL $def{back_e}  $back_e 
-H"用トップページのURL $def{back_h}  $back_h 
i-mode用トップページのURL $def{back_i}  $back_i 
J-SKY用トップページのURL $def{back_j}  $back_j 
デザイン全般設定
設定名 初期設定 現在の設定 変更欄
画像のあるフォルダ
絶対パス・相対パス共に可
$def{imgfolder}  $imgfolder 
タイトル画像ファイル名 $def{imgtit}  $imgtit 
背景画像ファイル名 $def{imgbak}  $imgbak 
URLリンク用画像ファイル名 $def{imglnk}  $imglnk 
URLリンク文字
上の画像があれば無効。
$def{lnktxt}  $lnktxt 
フォームに表\示するアイコンたちの名前 $def{iconname}  $iconname 
アイコン画像ファイル名
ファイル名ごとに改行してください
ケータイ用アイコンはここに書く必要はありません
「i_yeah.gif=イエーイ」のようにアイコン名を指定すると、
アイコンリストがプルダウン表\示されるようになります。
初期設定
$def{icons}
 
現在の設定
$pre{icons}
 
管理人用アイコン画像ファイル名 $def{ico_a}  $pre{ico_a} 
ドットi用アイコン画像ファイル名 $def{ico_d}  $pre{ico_d} 
EZweb用アイコン画像ファイル名 $def{ico_e}  $pre{ico_e} 
-H"用アイコン画像ファイル名 $def{ico_h}  $pre{ico_h} 
i-mode用アイコン画像ファイル名 $def{ico_i}  $pre{ico_i} 
J-SKY用アイコン画像ファイル名 $def{ico_j}  $pre{ico_j} 
投稿時刻表\示書式
yyyy -> 西暦年(4ケタ表\示)
yy -> 西暦年(2ケタ表\示)
MM -> 月(2ケタ表\示)
M -> 月(1ケタ表\示)
dd -> 日(2ケタ表\示)
d -> 日(1ケタ表\示)
DDD -> 曜日
HH -> 時(24時間2ケタ表\示)
H -> 時(24時間1ケタ表\示)
hh -> 時(12時間2ケタ表\示)
h -> 時(12時間1ケタ表\示)
mm -> 分(2ケタ表\示)
m -> 分(1ケタ表\示)
ss -> 秒(2ケタ表\示)
s -> 秒(1ケタ表\示)
t -> 午前 or 午後
$def{dateformat}  $dateformat 
メッセージテーブル枠線の幅 $def{tabborder}  $tabborder 
ページの横幅 $def{pwidth}  $pwidth 
文字サイズ 大     
色設定
設定名 初期設定 現在の設定 変更欄
ページ背景色 $def{colbak}  $colbak 
ページタイトル色
タイトル画像がないときに有効
$def{colptt}  $colptt 
一般文字色 $def{coldef}  $coldef 
アンカー(リンク)の色 $def{colanc}  $colanc 
アンカーにカーソ\ルを乗せたときの色 $def{colhov}  $colhov 
メッセージタイトル背景色 $def{coltbg}  $coltbg 
メッセージタイトルの色 $def{coltit}  $coltit 
メッセージ番号の色 $def{colnum}  $colnum 
投稿者名の色 $def{colnam}  $colnam 
投稿日時の色 $def{coltim}  $coltim 
メッセージ背景色 $def{colmbg}  $colmbg 
管理人メッセージの色 $def{coladm}  $coladm 
検索語の色 $def{colsch}  $colsch 
sendmail設定
設定名 初期設定 現在の設定 変更欄
sendmailのパス
掲示板更新メールが必要なら記入
$def{mailpath}  $mailpath 
送信先メールアドレス
指定しなければ管理人のメールアドレスに届きます
$def{to}  $to 
その他の設定
設定名 初期設定 現在の設定 変更欄
ケータイ入力レベル レベル0(名前・タイトル・メッセージ)
レベル1(+メールアドレス)
ケータイ出力レベル レベル0(投稿者メールアドレスのリンク)
レベル1(+本文中のメールアドレス・URLのオートリンク)
絵文字をカットするタイミング
出力時にカットすると処理が重たくなります
投稿時 推奨(絵文字は削除され、ログにも残りません)
出力時(i-mode、ドットiでは絵文字が表\示され、他の環境では表\示されません)
修正可能\時間 $def{limit}  $limit 
タイトル下部メッセージ
HTMLタグ使用可。閉じ忘れに注意。
初期設定
$def{headmsg}
 
現在の設定
$headmsg
 
ドットi用タイトル下部メッセージ $def{hmsg_d}  $hmsg_d 
EZweb用タイトル下部メッセージ $def{hmsg_e}  $hmsg_e 
H"用タイトル下部メッセージ $def{hmsg_h}  $hmsg_h 
i-mode用タイトル下部メッセージ $def{hmsg_i}  $hmsg_i 
J-SKY用タイトル下部メッセージ $def{hmsg_j}  $hmsg_j 
フォーム下部メッセージ
HTMLタグ使用可。閉じ忘れに注意。
初期設定
$def{footmsg}
 
現在の設定
$footmsg
 
文字変換
「変換前=>変換後」のように
=>を使って書いてください。
初期設定
$def{chtxt}
 
現在の設定
$chtxt
 
_END_OF_HTML_ print "\n\n\n"; } #-------------------------------------------------------------------------- # [ 使い方 ] sub HTML_HOW2 { if ($ecut) { $msg = "絵文字はi-mode、ドットiでのみ表\示されます。"; } else { $msg = "i-mode、ドットiの絵文字は投稿できません。"; } if ($colmbg) { $colmbg = " bgcolor=$colmbg"; } print<<"_END_OF_HTML_"; 書き込みルール
  • HTMLタグは使えません。
  • URL、メールアドレスは自動的にリンクされます。
  • [ ](四角カッコ)に半角数字を書くと、その番号以前の記事へリンクされます。
検索方法
  • 過去の記事の検索ができます。
  • [ ](四角カッコ)に半角数字を入れて送信すれば、その番号以前の記事が読めます。
  • 半角数字と/(スラッシュ)で日付を指定すれば、その日付以前のの記事が読めます。
  • 1バイト(半角一文字)では検索できません。
修正方法
  • 一度書き込んだメッセージを修正することができます。
  • 記事の番号をクリックすると修正画面になります。
  • 直したい部分を訂正して送信すれば修正できます。
  • 修正できるのは本人の(クッキーを受け取った)パソ\コンのみです。
  • 修正は$limit分以内、一度に限り可能\です。
  • さらに修正したい場合は管理人にお問い合せください。
モバイルアクセス
  • i-mode、H"、J-SKY、EZweb、ドットiに対応しています。 次のURLでアクセスしてください。
    $thisfile
  • $msg
さらに詳しく知りたい方は こちら をご覧ください。
_END_OF_HTML_ } #-------------------------------------------------------------------------- # [ モバイル表示 ] sub MOBILE { # ヘッダ if ($mobile eq 'e') { print "Content-type: text/x-hdml;charset=Shift_JIS\n\n"; print "\n"; print "\n"; print "\n"; print "
$bbstitle
\n"; if ($hmsg) { $hmsg =~ s/\$/&dol;/g; print "$hmsg
\n"; } } elsif ($mobile eq 'h') { $thisfile =~ s/http://; $backurl =~ s/http://; $infourl =~ s/http://; $coldef =~ s/\#//; $colbak =~ s/\#//; $coladm =~ s/\#//; $bbstitle =~ s/"/"/g; print "Content-Type: text/plain\n\n"; print "From: $thisfile\n"; print "Subject: $bbstitle\n"; print "Content-Type: Text/X-PmailDX\n\n"; if ($prev) { print "\n"; } if ($next) { print "\n"; } if ($ilebel) { print "\n"; } else { print "\n"; } if ($backurl) { print "\n"; } print "\n"; print "\n"; print ""; print "$bbstitle\n"; if ($hmsg) { $hmsg =~ s/</</g; $hmsg =~ s/"/"/g; print "$hmsg\n"; } $msg =~ s/
/\n/g; } else { print "Content-type: text/html\n\n"; print ""; unless (($mobile eq 'j') && ($mob{ver} <= 2)) { print "$bbstitle"; } print ""; print "\n
$bbstitle
\n"; if ($hmsg) { print "$hmsg
\n"; } } # リスト開始 if ($msg) { print "$msg$br\n"; } if ($next) { if ($mobile eq 'h') { print "$key[3]次の$vnm件\n"; } else { print "$key[3]次の$vnm件"; print "
\n"; } } # リスト foreach (@print) { chomp; ($num,$key,$nam,$mal,$url,$ico,$tit,$mes,$adm,$tim,$ipa,$rmh) = split(/,/,$_); $mes =~ s/
/$br/g; $adm =~ s/
/$br/g; $tim = &GET_DATE('MM/dd HH:mm',$tim); print "$hr\n"; if ($mobile eq 'e') { # ez処理 foreach ($tit,$nam,$mes,$adm) { s/,/,/g; s/&/&/g; s/( )+/ /g; s/\$/&dol;/g; if ($ecut) { $_ = &CUT_EMOJI($_); } if (@chtxt) { &jcode::convert(\$_,'euc'); foreach $chtxt (@chtxt) { my($btxt,$atxt) = split(/=>/,$chtxt); s/(?:$btxt)/$atxt/g; } &jcode::convert(\$_,$ccode); } } if ($olebel) { foreach ($mes,$adm) { &jcode::convert(\$_,'euc'); s/(http:\/\/[\w\.\~\-\/\?\&\+\=\:\@\%\;\,]+) /$1<\/A>/giox; s/([\w\.\-\_]+)\@([\w\.\-\_]+) /$1\@$2<\/A>/giox; &jcode::convert(\$_,$ccode); } } if ($tit) { print "$tit/\n"; } if ($mal) { print "$nam
\n"; } else { print "$nam
\n"; } print "$tim
\n"; print "$mes
\n"; if ($adm) { print "[$adminname]$adm
\n"; } } elsif ($mobile eq 'h') { # ONC処理 foreach ($tit,$nam,$mes,$adm) { s/</</g; s/"/"/g; s/,/,/g; s/( )+/ /g; s/&/&/g; if ($ecut) { $_ = &CUT_EMOJI($_); } if (@chtxt) { &jcode::convert(\$_,'euc'); foreach $chtxt (@chtxt) { my($btxt,$atxt) = split(/=>/,$chtxt); s/(?:$btxt)/$atxt/g; } &jcode::convert(\$_,$ccode); } } if ($tit) { print "$tit/\n"; } if ($olebel) { $mal &&= "($mal)"; } else { $mal = ''; } print "$nam$mal\n$tim\n$mes\n"; if ($adm) { print "[$adminname]$adm\n"; } } else { # C-HTML処理 foreach ($tit,$nam,$mes,$adm) { s/,/,/g; s/"/"/g; s/&/&/g; if ($ecut) { if ($mobile =~ /[di]/) { $_ = &REP_EMOJI($_); } else { $_ = &CUT_EMOJI($_); } } if (@chtxt) { &jcode::convert(\$_,'euc'); foreach $chtxt (@chtxt) { my($btxt,$atxt) = split(/=>/,$chtxt); s/(?:$btxt)/$atxt/g; } &jcode::convert(\$_,$ccode); } } if ($olebel) { foreach ($mes,$adm) { &jcode::convert(\$_,'euc'); s/(http:\/\/[\w\.\~\-\/\?\&\+\=\:\@\%\;\,]+) /$1<\/A>/giox; s/([\w\.\-\_]+)\@([\w\.\-\_]+) /$1\@$2<\/A>/giox; &jcode::convert(\$_,$ccode); } } if ($tit) { print "$tit/\n"; } if ($mal) { print ""; print "$nam
\n"; } else { print "$nam
\n"; } print "$tim
\n"; print "$mes
\n"; if ($adm) { print "[$adminname]\n$adm\n
\n"; } } } # リスト終了 print "$hr\n"; if ($prev) { if ($mobile eq 'h') { print "$key[1]前の$vnm件\n"; } else { print "$key[1]前の$vnm件"; print "
\n"; } print "$hr\n"; } # フォームとフッタ if ($mobile eq 'e') { # ez処理 $thisfile = "$thisfile?t=" . time(); if ($backurl) { print "$key[7]戻る
\n"; } print "$key[9]cgipon info\n"; print "\n"; print "\n"; if ($ilebel) { print "\n"; print "名前(必須)\n"; print "\n"; if ($ilebel) { 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"; } elsif ($mobile eq 'h') { # ONC処理 print "$key[5]投稿する\n"; print "ネチケット遵守\n"; print "$hr\n"; if ($backurl) { print "$key[7]戻る\n$hr\n"; } print "$key[9]cgipon info\n"; print "S 終了\n"; } else { # C-HTML処理 print "$key[5]投稿欄====
\n"; if (($mobile eq 'j') && ($mob{ver} <= 2)) { print "
\n"; } else { print "\n"; } print "名前
"; print "
\n"; if ($ilebel) { print "メールアドレス
"; print "
\n"; } print "タイトル
"; print "
\n"; print "内容
"; print "\n"; print "
"; print "ネチケット遵守
\n"; print "
\n"; print "
\n"; print "$hr"; if ($backurl) { print "$key[7]戻る
\n$hr\n"; } print "$key[9]cgipon info
\n"; print ""; print ""; } exit; } #-------------------------------------------------------------------------- # [ アイコンリストの表示 ] sub ICONLIST { if ($colmbg) { $colmbg = " bgcolor=$colmbg"; } print "Content-type: text/html\n\n"; print "$bbstitle"; print ""; print "\n"; foreach (@icons) { print " "; print ""; } print "
$iconam{$_}
\n"; print ""; exit; } #-------------------------------------------------------------------------- # [ バックアップファイルの吐き出し ] sub BACKUP { &LOCK_FILE("$logfile.1.txt"); &LOCK_FILE("$logfile.2.txt"); open (LOG,"<$logfile") or &DIE("ログファイルが開けません。"); print "Content-type: text/plain\n\n"; while ($log = ) { print "$log"; } close (LOG); &UNLOCK_FILE("$logfile.1.txt"); &UNLOCK_FILE("$logfile.2.txt"); exit; } #========================================================================== # [ サブルーチン ] #========================================================================== #-------------------------------------------------------------------------- # [ コードのチェック ] sub CHECK_CODE { -r $jcode or &DIE("jcode.plがありません。"); require $jcode; if (ord($copyright)%5 == 3) { $ccode = 'sjis'; $charset = 'Shift_JIS'; } elsif (ord($copyright)%5 == 4) { $ccode = 'euc'; $charset = 'euc-jp'; } elsif (ord($copyright)%5 == 2) { $ccode = 'jis'; $charset = 'iso-2022-jp'; } else { &DIE("文字コードが認識できません。"); } } #-------------------------------------------------------------------------- # [ フォームの読み込み ] sub READ_FORM { read(STDIN, my($post), $ENV{'CONTENT_LENGTH'}); my($get) = $ENV{'QUERY_STRING'}; if ($post && $get) { $in = join('&',$post,$get); } else { $in = "$post$get"; } my(@pairs) = split(/&/,$in); foreach (@pairs) { my($name,$value) = split(/=/,$_,2); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $in{$name} = &CHANGE_CODE($value); } if ($in{pky} eq $masterkey) { $master = 1; } } #-------------------------------------------------------------------------- # [ 設定の読み込み ] sub READ_OPTION { $def{backurl} = ''; $def{back_d} = ''; $def{back_e} = ''; $def{back_h} = ''; $def{back_i} = ''; $def{back_j} = ''; $def{imgfolder} = './img'; $def{iconname} = 'アイコン'; $def{icons} = ''; $def{ico_d} = 'i_doti.gif'; $def{ico_e} = 'i_ez.gif'; $def{ico_h} = 'i_h.gif'; $def{ico_i} = 'i_i.gif'; $def{ico_j} = 'i_j.gif'; $def{ico_a} = ''; $def{limit} = 10; $def{logmax} = 500; $def{colanc} = '#333399'; $def{colhov} = '#ff3333'; $def{coltbg} = '#efefef'; $def{colnum} = '#3366cc'; $def{coltit} = '#003366'; $def{colnam} = '#339900'; $def{coltim} = '#996633'; $def{coladm} = '#0000cc'; $def{colsch} = '#cc0000'; $def{coldef} = '#000000'; $def{colbak} = '#e0e0e0'; $def{colptt} = '#000000'; $def{colmbg} = ''; $def{imgbak} = ''; $def{imglnk} = ''; $def{imgtit} = ''; $def{lnktxt} = ''; $def{dateformat} = 'yyyy/MM/dd(DDD)HH:mm'; $def{bbstitle} = '余裕派掲示板'; $def{adminname} = ''; $def{adminmail} = ''; $def{ilebel} = 0; $def{olebel} = 0; $def{ecut} = 0; $def{tabborder} = '0'; $def{pwidth} = '100%'; $def{tsize} = '0'; $def{hmsg_d} = ''; $def{hmsg_e} = ''; $def{hmsg_h} = ''; $def{hmsg_i} = ''; $def{hmsg_j} = ''; $def{headmsg} = ''; $def{footmsg} = 'お名前と内容は必須です(省略することはできません)。,'; $def{footmsg} .= '電話番号や住所などの個人情報は書きこまないでください。,'; $def{footmsg} .= 'タグは使えません(URL等は自動的にリンクされます)。,'; $def{mailpath} = ''; $def{chtxt} = ''; foreach ($in{headmsg},$in{footmsg},$in{icons},$in{chtxt}) { s/\r//g; s/\n\n[\n]+/\n\n\n/g; s/^\n+//g; s/[\n| | ]+$//g; } $in{to} =~ s/,/,/g; $in{to} =~ s/ / /g; if ($in{set} && $master) { @option = ( "backurl<>$in{backurl}", "back_d<>$in{back_d}", "back_e<>$in{back_e}", "back_h<>$in{back_h}", "back_i<>$in{back_i}", "back_j<>$in{back_j}", "imgfolder<>$in{imgfolder}", "iconname<>$in{iconname}", "icons<>$in{icons}", "ico_d<>$in{ico_d}", "ico_e<>$in{ico_e}", "ico_h<>$in{ico_h}", "ico_i<>$in{ico_i}", "ico_j<>$in{ico_j}", "ico_a<>$in{ico_a}", "limit<>$in{limit}", "logmax<>$in{logmax}", "colanc<>$in{colanc}", "colhov<>$in{colhov}", "coltbg<>$in{coltbg}", "colnum<>$in{colnum}", "coltit<>$in{coltit}", "colnam<>$in{colnam}", "coltim<>$in{coltim}", "coladm<>$in{coladm}", "colsch<>$in{colsch}", "coldef<>$in{coldef}", "colbak<>$in{colbak}", "colptt<>$in{colptt}", "colmbg<>$in{colmbg}", "imgbak<>$in{imgbak}", "imglnk<>$in{imglnk}", "imgtit<>$in{imgtit}", "lnktxt<>$in{lnktxt}", "dateformat<>$in{dateformat}", "bbstitle<>$in{bbstitle}", "adminname<>$in{adminname}", "adminmail<>$in{adminmail}", "mailpath<>$in{mailpath}", "to<>$in{to}", "ilebel<>$in{ilebel}", "olebel<>$in{olebel}", "ecut<>$in{ecut}", "tabborder<>$in{tabborder}", "pwidth<>$in{pwidth}", "tsize<>$in{tsize}", "hmsg_d<>$in{hmsg_d}", "hmsg_e<>$in{hmsg_e}", "hmsg_h<>$in{hmsg_h}", "hmsg_i<>$in{hmsg_i}", "hmsg_j<>$in{hmsg_j}", "headmsg<>$in{headmsg}", "footmsg<>$in{footmsg}", "chtxt<>$in{chtxt}" ); &LOCK_FILE("$datfile.1.txt"); &LOCK_FILE("$datfile.2.txt"); open (OPT,">$datfile") or $msg .= "設定ファイルが開けません。
"; foreach (@option) { s/\n+$//; s/\n+/,/g; print OPT "$_\n"; } close (OPT); &UNLOCK_FILE("$datfile.1.txt"); &UNLOCK_FILE("$datfile.2.txt"); } &LOCK_FILE("$datfile.1.txt"); &LOCK_FILE("$datfile.2.txt"); open (OPT,"<$datfile") or $msg .= "設定ファイルが開けません。
"; @option = ; &UNLOCK_FILE("$datfile.1.txt"); &UNLOCK_FILE("$datfile.2.txt"); foreach (@option) { chomp; if (/<>/) { ($optname,$optvalue) = split(/<>/,$_); } else { ($optname,$optvalue) = split(/&/,$_); } $opt{$optname} = $optvalue; } @option = (); $opt{ico_e} ||= $opt{ico_ez}; $opt{back_e} ||= $opt{back_ez}; foreach ( 'backurl', 'back_d', 'back_e', 'back_h', 'back_i', 'back_j', 'imgfolder', 'iconname', 'icons', 'ico_d', 'ico_e', 'ico_h', 'ico_i', 'ico_j', 'ico_a', 'limit', 'logmax', 'colanc', 'colhov', 'coltbg', 'colnum', 'coltit', 'colnam', 'coltim', 'coladm', 'colsch', 'coldef', 'colbak', 'colptt', 'colmbg', 'imgbak', 'imglnk', 'imgtit', 'lnktxt', 'dateformat', 'bbstitle', 'adminname', 'adminmail', 'mailpath', 'to', 'tabborder', 'pwidth', 'tsize', 'ilebel', 'olebel', 'ecut', 'hmsg_d', 'hmsg_e', 'hmsg_h', 'hmsg_i', 'hmsg_j', 'headmsg', 'footmsg', 'chtxt' ) { $opt{$_} ||= $def{$_}; } $backurl = $opt{backurl}; $back_d = $opt{back_d}; $back_e = $opt{back_e}; $back_h = $opt{back_h}; $back_i = $opt{back_i}; $back_j = $opt{back_j}; $imgfolder = $opt{imgfolder}; $iconname = $opt{iconname}; $icons = $opt{icons}; $ico_d = $opt{ico_d}; $ico_e = $opt{ico_e}; $ico_h = $opt{ico_h}; $ico_i = $opt{ico_i}; $ico_j = $opt{ico_j}; $ico_a = $opt{ico_a}; $limit = $opt{limit}; $logmax = $opt{logmax}; $colanc = $opt{colanc}; $colhov = $opt{colhov}; $coltbg = $opt{coltbg}; $colnum = $opt{colnum}; $coltit = $opt{coltit}; $colnam = $opt{colnam}; $coltim = $opt{coltim}; $coladm = $opt{coladm}; $colsch = $opt{colsch}; $coldef = $opt{coldef}; $colbak = $opt{colbak}; $colptt = $opt{colptt}; $colmbg = $opt{colmbg}; $imgbak = $opt{imgbak}; $imglnk = $opt{imglnk}; $imgtit = $opt{imgtit}; $lnktxt = $opt{lnktxt}; $dateformat = $opt{dateformat}; $bbstitle = $opt{bbstitle}; $adminname = $opt{adminname}; $adminmail = $opt{adminmail}; $mailpath = $opt{mailpath}; $to = $opt{to}; $tabborder = $opt{tabborder}; $pwidth = $opt{pwidth}; $tsize = $opt{tsize}; $ilebel = $opt{ilebel}; $olebel = $opt{olebel}; $ecut = $opt{ecut}; $hmsg_d = $opt{hmsg_d}; $hmsg_e = $opt{hmsg_e}; $hmsg_h = $opt{hmsg_h}; $hmsg_i = $opt{hmsg_i}; $hmsg_j = $opt{hmsg_j}; $headmsg = $opt{headmsg}; $footmsg = $opt{footmsg}; $chtxt = $opt{chtxt}; foreach ($bbstitle,$adminname,$hmsg_d,$hmsg_e,$hmsg_h,$hmsg_i,$hmsg_j) { s/ / /g; s/,/,/g; s/&/&/g; } foreach ($headmsg,$footmsg) { s/<//g; s/"/"/g; s/ / /g; s/&/&/g; } @icons = split(/,/,$icons); if ($icons[0] =~ /=/) { for ($i = 0; $i <= $#icons; $i++) { my($name,$value) = split(/=/,$icons[$i]); $icons[$i] = $name; $iconam{$name} = $value; } } @footmsg = split(/,/,$footmsg); $headmsg =~ s/,/
/g; $footmsg =~ s/,/
/g; $imgfolder =~ s/\/$//; @chtxt = split(/,/,$chtxt); foreach (@chtxt) { &jcode::convert(\$_,euc); } if ($tabborder) { $border = " border=$tabborder"; } if ($pwidth) { $width = " width=$pwidth"; } if ($tsize) { $size = " size=-1"; } if (!$adminname || !$adminmail) { $pas = 1; } } #-------------------------------------------------------------------------- # [ ブラウザのチェック ] sub CHECK_BROWSER { ($mob{car},$mob{ver},$mob{mod}) = split(/\//,$ENV{'HTTP_USER_AGENT'}); if ($mob{car} eq 'J-PHONE') { $mobile = 'j'; $adkey = 'directkey'; $imgext = '.png'; $hr = '
'; $br = '
'; $href = 'href'; $mailto = 'mailto:'; @key = (); if ($back_j) { $backurl = $back_j; } else { $backurl = ''; } if ($hmsg_j) { $hmsg = $hmsg_j; } else { $hmsg = ''; } } elsif ($mob{car} eq 'DoCoMo') { $mobile = 'i'; $adkey = 'accesskey'; $imgext = '.gif'; $hr = '
'; $br = '
'; $href = 'href'; $mailto = 'mailto:'; @key = ('戀','驪','麗','黎','力', '曆','歷','轢','年','憐'); if ($back_i) { $backurl = $back_i; } else { $backurl = ''; } if ($hmsg_i) { $hmsg = $hmsg_i; } else { $hmsg = ''; } } elsif (($mob{car} eq 'PDXGW') || ($mob{car} eq 'Ginga')) { $mobile = 'h'; $imgext = '.gif'; @key[1..9] = ('@','A','B','C','D','E','F','G','H'); ($mob{ver},$pdx) = split(/\(/,$mob{ver}); $pdx =~ s/\)$//; @pdx = split(/;/,$pdx); foreach (@pdx) { my($name,$value) = split(/=/,$_); $pdx{$name} = $value; } if ($pdx{TX}) { $hr = '−' x $pdx{TX}; } else { $hr = '−' x 6; } if ($back_h) { $backurl = $back_h; } else { $backurl = ''; } if ($hmsg_h) { $hmsg = $hmsg_h; } else { $hmsg = ''; } $br = "\n"; } elsif ($mob{car} eq 'UP.Browser') { $mobile = 'e'; $adkey = 'accesskey'; if ($ENV{HTTP_X_UP_DEVCAP_ISCOLOR}) { $imgext = '.png'; } else { $imgext = '.bmp'; } $br = '
'; $href = 'task="go" dest'; @key = (); if ($ENV{HTTP_X_UP_DEVCAP_SCREENCHARS}) { ($ez{TX},$ez{TY}) = split(/,/,$ENV{HTTP_X_UP_DEVCAP_SCREENCHARS}); $hr = '-' x $ez{TX}; $hr .= '
'; } else { $hr = '------------
'; } if ($ENV{HTTP_X_UP_DEVCAP_MAX_PDU} <= 5000) { $in{vnm} = 3; } else { $in{vnm} = 5; } if ($back_e) { $backurl = $back_e; } else { $backurl = ''; } if ($hmsg_e) { $hmsg = $hmsg_e; } else { $hmsg = ''; } if (($ENV{HTTP_X_UP_UPLINK} =~ /ezweb/) && (!$ENV{HTTP_X_UP_FAX_LIMIT})) { $mailto = 'mailto:'; } else { $mailto = 'device:home/goto?svc=Email&SUB=sendMsg" vars="TO='; } } elsif ($mob{car} eq 'ASTEL') { $mobile = 'd'; $adkey = 'accesskey'; $imgext = '.gif'; $hr = '
'; $br = '
'; $href = 'href'; $mailto = 'mailto:'; for ($i = 0; $i <= 9; $i++) { $key[$i] = "$i."; } $in{vnm} = 5; if ($back_d) { $backurl = $back_d; } else { $backurl = ''; } if ($hmsg_d) { $hmsg = $hmsg_d; } else { $hmsg = ''; } } } #-------------------------------------------------------------------------- # [ URLのチェック ] sub CHECK_URL { $thisfile ||= 'http://' . $ENV{'SERVER_NAME'} . $ENV{'SCRIPT_NAME'}; $thisfile =~ s/\?\S+$//; } #-------------------------------------------------------------------------- # [ コードチェンジ ] sub CHANGE_CODE { my($text) = $_[0]; if ($ccode eq 'euc') { &jcode::h2z_euc(\$text); } elsif ($ccode eq 'jis') { &jcode::h2z_jis(\$text); } elsif ($ccode eq 'sjis') { &jcode::h2z_sjis(\$text); } &jcode::convert(\$text,$ccode); $text =~ s/&/&/g; $text =~ s/,/,/g; $text =~ s//>/g; $text =~ s/"/"/g; $text =~ s/ / /g; return $text; } #-------------------------------------------------------------------------- # [ クッキーの取得 ] sub GET_COOKIE { foreach (split(/; */,$ENV{'HTTP_COOKIE'})) { my($name,$value) = split(/=/,$_); $cookies{$name} = $value; } @cookies = split(/:/,$cookies{$cookiename}); foreach (@cookies) { $_ = &CHANGE_CODE($_); } } #-------------------------------------------------------------------------- # [ クッキーを食わせる ] sub PUT_COOKIE { my($cookies) = join(':',@_); $cookies =~ s/,/,/g; $cookies =~ s/<//g; $cookies =~ s/"/"/g; $cookies =~ s/ / /g; $cookies =~ s/&/&/g; my($expires) = time() + 30 * 24 * 60 * 60; $expires = &GET_DATE('DDD, dd-MM-yyyy HH:mm:ss',$expires,'en'); print "Set-Cookie: $cookiename=$cookies; expires=$expires GMT\n"; } #-------------------------------------------------------------------------- # [ 入力内容のチェック ] sub CHECK_DATA { if ($mobile eq 'h') { $thisfile =~ s/http://; if ($in{pdxturn} == 1) { $in{nam} = $in{pdxsubj}; } elsif ($in{pdxreq} eq 'mal') { print "Content-Type: text/plain\n\n"; print "X-PmailDX-CTRL: NameRequest\n"; print "From: $thisfile?pdxreq=nam\n"; print "Content-Type: Text/Plain\n\n"; print "メールアドレス入力\n"; exit; } elsif ($in{pdxreq} eq 'nam') { $mal = $in{pdxname}; print "Content-Type: text/plain\n\n"; print "From: $thisfile?mal=$mal&pdxreq=tit\n"; print "X-PmailDX-Input: KANJI\n"; print "Content-Type: Text/Plain\n\n"; print "お名前入力\n"; exit; } elsif (($in{pdxreq} eq 'tit') && ($nam = $in{pdxdata})) { $mal = $in{mal}; $nam =~ s/,/,/g; $nam =~ s/<//g; $nam =~ s/"/"/g; $nam =~ s/ / /g; $nam =~ s/&/&/g; $nam =~ s/([^a-zA-Z0-9_.-])/sprintf("%%%02X",ord($1))/eg; print "Content-Type: text/plain\n\n"; print "From: $thisfile?mal=$mal&nam=$nam&pdxreq=mes\n"; print "X-PmailDX-Input: KANJI\n"; print "Content-Type: Text/Plain\n\n"; print "タイトル入力\n"; exit; } elsif ($in{pdxreq} eq 'mes') { $mal = $in{mal}; $nam = $in{nam}; $nam =~ s/,/,/g; $nam =~ s/<//g; $nam =~ s/"/"/g; $nam =~ s/ / /g; $nam =~ s/&/&/g; $nam =~ s/([^a-zA-Z0-9_.-])/sprintf("%%%02X",ord($1))/eg; $tit = $in{pdxdata}; $tit =~ s/,/,/g; $tit =~ s/<//g; $tit =~ s/"/"/g; $tit =~ s/ / /g; $tit =~ s/&/&/g; $tit =~ s/([^a-zA-Z0-9_.-])/sprintf("%%%02X",ord($1))/eg; print "Content-Type: text/plain\n\n"; print "From: $thisfile?mal=$mal&nam=$nam&tit=$tit\n"; print "X-PmailDX-Input: KANJI\n"; print "Content-Type: Text/Plain\n\n"; print "メッセージ入力\n"; exit; } elsif ($in{pdxreq} eq 'end') { print "Content-Type: text/plain\n\n"; print "X-PmailDX-CTRL: LineDisconnect\n"; print "From: $thisfile\n"; print "Content-Type: Text/Plain\n\n"; print "ご利用ありがとうございました。\n"; print "情報サービスコンテンツに接続する際に"; print "件名(Subject)に名前、本文に内容を書けば"; print "オフラインから投稿できます。\n"; exit; } $in{mes} = $in{pdxdata}; $in{mal} =~ s/\r|\n//g; $in{nam} =~ s/\r|\n//g; $in{tit} =~ s/\r|\n//g; } if ($in{vnm}) { $vnm = $in{vnm}; } $vnm ||= 5; if ($in{pnm}) { $pnm = $in{pnm}; } else { $pnm = 1; } if ($in{sch}) { $sch = $in{sch}; } elsif (length($sch) == 1) { $msg .= "検索語が短すぎます。
"; $sch = ''; return 1; } if ($in{nam}) { $cnam = $in{nam}; } if ($in{mal} =~ /[\w\.\_\-]+\@[\w\.\_\-]+/) { $cmal = $in{mal}; } elsif ($in{nam}) { $cmal = ''; } if ($in{url} =~ /http:\/\/[\w\.\_\~\-\/\?\&\+\=\:\%\;\,]+/) { $curl = $in{url}; $curl =~ s/^http:\/\///; } elsif ($in{nam}) { $curl = ''; } if ($in{ico}) { $cico = $in{ico}; } if ($in{tit}) { $ctit = $in{tit}; } if ($in{mes}) { $cmes = $in{mes}; } if ($in{adm}) { $cadm = $in{adm}; } if ($mobile) { $cico = "&$mobile"; } $cico =~ s/&/&/; foreach ($cmes,$cadm) { s/\r//g; s/\n\n[\n]+/\n\n\n/g; s/^\n+//g; s/(\n| | | )+$//g; s/\n/
/g; } foreach ($cmal,$curl) { s/^( | | )+//g; s/( | | )+$//g; } $ctim = time(); $cipa = $ENV{'REMOTE_ADDR'}; $crmh = $ENV{'REMOTE_HOST'}; $crmh ||= gethostbyaddr(pack('C4',split(/\./,$cipa)),2); $crmh =~ tr/\r\n/ /; $ckey ||= substr(crypt($ctim,rand(100)),-4,4); $ckey =~ s/\,//; if (length($cnam) > 40) { $cnam = ''; $msg .= "名前が長すぎます。
"; } if (length($ctit) > 160) { $ctit = ''; $msg .= "タイトルが長すぎます。
"; } if (length($cmes) > 1200) { $cmes = ''; $msg .= "内容が長すぎます。
"; } if ($cnam && $cmes) { if (!$ecut) { foreach ($cnam,$ctit,$cmes) { $_ = &CUT_EMOJI($_); } } $input = "$cnam,$cmal,$curl,$cico,$ctit,$cmes,$cadm,$ctim,$cipa,$crmh"; } if ($in{use}) { $use = $in{use}; } if ($in{bak}) { $bak = $in{bak}; } if ($in{ade}) { $ade = $in{ade}; } if ($in{enm}) { $enm = $in{enm}; } if ($in{edt}) { $edt = $in{edt}; } if ($in{del}) { $del = $in{del}; } if ($in{pas}) { $pas = $in{pas}; } if ($in{pky}) { $pky = $in{pky}; } if ($in{ivw}) { $ivw = $in{ivw}; } } #-------------------------------------------------------------------------- # [ I/O ] sub IO { &LOCK_FILE("$logfile.1.txt"); &LOCK_FILE("$logfile.2.txt"); if ($input || $edt) { open (OLD,"<$logfile") or &DIE("ログファイルが開けません。"); open (NEW, "+>$logfile.tmp") or &DIE("一時ファイルが開けません。"); if ($edt) { while ($log = ) { if ($edt == (split(/,/,$log))[0]) { $key = (split(/,/,$log))[1]; $adm = (split(/,/,$log))[8]; $tim = (split(/,/,$log))[9]; $ipa = (split(/,/,$log))[10]; $rmh = (split(/,/,$log))[11]; if ($input && $master) { if ($del) { $log = ''; } else { $log = "$edt,$key,$input\n"; @log = split(/,/,$log); $log[9] = $tim; $log[10] = $ipa; $log[11] = $rmh; $log = join(",",@log); } } elsif ($input && ($ckey eq $key) && ($tim > time() - $limit * 60)) { if ($del) { $log = ''; } else { $log = "$edt,,$input\n"; @log = split(/,/,$log); $log[8] = $adm; $log[9] = $tim; $log[10] = $ipa; $log[11] = $rmh; $log = join(",",@log); } } print NEW "$log"; $logsize += length($log); last; } print NEW "$log"; $logsize += length($log); } } else { $log = ; $cnum = (split(/,/,$log))[0] + 1; $tmp = (split(/,/,$log))[7]; if ($cmes ne $tmp) { $log = "$cnum,$ckey,$input\n$log"; } print NEW "$log"; $logsize += length($log); } while ($log = ) { if (($logmax < 0) || ($logsize <= $logmax * 1024)) { print NEW "$log"; $logsize += length($log); } } close (NEW); close (OLD); rename ("$logfile.tmp","$logfile") or &DIE("ファイル名変更失敗"); } open (LOG,"<$logfile") or &DIE("ログファイルが開けません。"); $dnm++ while (); $pmx = int(($dnm - 1) / $vnm) + 1; if ($pnm > $pmx) { $pnm = $pmx; } $dmx = $vnm * $pnm; if ($dmx > $dnm) { $dmx = $dnm; } $dmn = $vnm * ($pnm - 1) + 1; seek (LOG,0,0); $tmp = 0; if ($sch || $enm) { while ($log = ) { if (&SEARCH) { $tmp++; chomp $log; if ($tmp <= $dmx) { push(@print,$log); } if ($#print >= $vnm) { shift(@print); } } } } else { while ($log = ) { $tmp++; chomp $log; if (($tmp >= $dmn) && ($tmp <= $dmx)) { push(@print,$log); } } } $dnm = $tmp; if(!$enm && $sch) { if($dnm) { $msg .= "$dnm件の記事にヒットしました。
"; } else { $msg .= "該当する記事はありませんでした。
"; } $msg .= "検索終了
"; } close (LOG); &UNLOCK_FILE("$logfile.1.txt"); &UNLOCK_FILE("$logfile.2.txt"); # メール送信 if ($input && !$edt && $mailpath) { $to ||= $adminmail; $ml = "To: $to\n"; $ml .= "From: $adminmail\n"; $ml .= "Subject: " . &MAIL64("$bbstitle [$cnum]"); $ml .= "Content-Type: text/plain\; charset=\"iso-2022-jp\"\n\n"; $ml .= "投稿者: $cnam"; if ($cmal) { $ml .= " <$cmal>"; } $ml .= "\n"; if ($curl) { $ml .= "URL: http://$curl\n"; } $ml .= "内 容: "; if ($ctit) { $ml .= "$ctit"; } $ml .= "\n$cmes"; $ml =~ s/
/\n/g; $ml =~ s/"/"/g; $ml =~ s/<//g; $ml =~ s/,/,/g; $ml =~ s/ / /g; $ml =~ s/&/&/g; &jcode::convert(\$ml,'jis'); open (MAIL, "| $mailpath -t"); print MAIL "$ml\n"; close (MAIL); } ($cnum,$ctit,$cmes,$cadm,$ctim,$cipa,$crmh) = (); $pmx = int(($dnm - 1) / $vnm) + 1; if ((!$enm) && ($pnm > $pmx)) { $pnm = $pmx; } if ($pnm != 1) { $next = $pnm - 1; } if ($pnm != $pmx) { $prev = $pnm + 1; } } #-------------------------------------------------------------------------- # [ ファイルロック ] sub LOCK_FILE { my($lockfile) = $_[0]; my($retry) = 5; while (-f $lockfile) { for ($retry-- <= 0) { if ((stat($lockfile))[9] < time() - 120) { &UNLOCK_FILE($lockfile); } &DIE("混雑しております。しばしお待ちを。"); } sleep 1; } open (LOCK,">$lockfile"); close(LOCK); return 1; } #-------------------------------------------------------------------------- # [ ファイルロック解除 ] sub UNLOCK_FILE { unlink($_[0]); } #-------------------------------------------------------------------------- # [ 検索 ] sub SEARCH { my($num,$key,$nam,$mal,$url,$ico,$tit,$mes,$adm,$tim) = split(/,/,$log); if ($enm) { if ($enm == $num) { return 1; } else { return 0; } } elsif (!$sch) { return 1; } if ($sch =~ /\[(\d+)\]/) { if ($num <= $1) { return 1; } } elsif (($sch =~ /\//) && ($sch =~ /^[\d\/]{3,10}$/)) { @sch = split(/\//,$sch); my($ye,$mo,$da); $da = $sch[-1]; $mo = $sch[-2]; $ye = $sch[-3]; $mo = substr($mo,-2,2); $da = substr($da,-2,2); $mo = sprintf("%02d",$mo); $da = sprintf("%02d",$da); if ($ye) { $ye = substr($ye,-2,2); if ($ye == 99) { $ye = "19$ye"; } else { $ye = "20$ye"; } } else { $ye = &GET_DATE('yyyy'); $sch = "$mo/$da"; if (&GET_DATE('MM/dd') lt $sch) { $ye--; } } $sch = "$ye/$mo/$da"; if (&GET_DATE('yyyy/MM/dd',$tim) le $sch) { return 1; } } else { $swrd = $sch; $swrd =~ s/\\/\\\\/go; $swrd =~ s/([\|\(\)\[\]\{\}\^\$\+\-\*\/\?\.])/\\$1/go; foreach $_ ($nam,$tit,$mes,$adm) { if ($_ =~ /$swrd/go) { return 1; } } } } #-------------------------------------------------------------------------- # [ 日付の取得 ] sub GET_DATE { my($timeformat,$time,$lang) = @_; my($s,$ss,$m,$mm,$H,$HH,$h,$hh,$d,$dd,$M,$MM,$yyyy,$yy,$DDD,$t); $timeformat ||= 'yyyy/MM/dd HH:mm'; $time ||= time(); $ENV{'TZ'} = "JST-9"; ($s,$m,$H,$d,$M,$yyyy,$DDD) = localtime($time); $yyyy += 1900; if ($H < 12) { $t = 0; } else { $t = 1; } if ($lang eq 'en') { $DDD = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat')[$DDD]; $M = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec')[$M]; $timeformat =~ s/MM/M/g; $t = ('a.m.','p.m.')[$t]; } else { $DDD = ('日','月','火','水','木','金','土')[$DDD]; $M++; $MM = sprintf("%02d",$M); $t = ('午前','午後')[$t]; } $h = $H % 12; $yy = substr($yyyy,2,2); $dd = sprintf("%02d",$d); $HH = sprintf("%02d",$H); $hh = sprintf("%02d",$h); $mm = sprintf("%02d",$m); $ss = sprintf("%02d",$s); $timeformat =~ s/yyyy/$yyyy/ig; $timeformat =~ s/yy/$yy/g; $timeformat =~ s/HH/$HH/g; $timeformat =~ s/H/$H/g; $timeformat =~ s/hh/$hh/g; $timeformat =~ s/h/$h/g; $timeformat =~ s/mm/$mm/g; $timeformat =~ s/m/$m/g; $timeformat =~ s/ss/$ss/ig; $timeformat =~ s/s/$s/ig; $timeformat =~ s/t/$t/ig; $timeformat =~ s/MM/$MM/g; $timeformat =~ s/M/$M/g; $timeformat =~ s/dd/$dd/g; $timeformat =~ s/d/$d/g; $timeformat =~ s/DDD/$DDD/ig; return "$timeformat"; } #-------------------------------------------------------------------------- # [ 絵文字の除去 ] sub CUT_EMOJI { # sjisから他の文字コードに変換する前に使用すること $_[0] =~ s/\G((?:[\x80-\x9f\xe0-\xf7\xfa-\xfc][\x40-\xff]|[\x00-\x7f])*?)([\xf8\xf9][\x40-\xff]|[\xf0-\xf4][\x40-\xff])/$1/g; return $_[0]; } #-------------------------------------------------------------------------- # [ 絵文字の10進コードへの置き換え ] sub REP_EMOJI { # sjisから他の文字コードに変換する前に使用すること $_[0] =~ s/\G((?:[\x80-\x9f\xe0-\xf7\xfa-\xfc][\x40-\xff]|[\x00-\x7f])*?)([\xf8\xf9][\x40-\xff]|[\xf0-\xf4][\x40-\xff])/$1.'&#'.(ord($2)*256+ord(substr($2,1,1))).';'/eg; return $_[0]; } #-------------------------------------------------------------------------- # [ BASE64エンコード ] sub MAIL64 { local($xx) = $_[0]; &jcode::convert(\$xx,'jis'); $xx =~ s/\x1b\x28\x42/\x1b\x28\x4a/g; $xx = &BASE64($xx); return("=?iso-2022-jp?B?$xx?=\n"); } sub BASE64 { my($base) = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" . "abcdefghijklmnopqrstuvwxyz" . "0123456789+/"; local($xx, $yy, $zz, $i); $xx = unpack("B*", $_[0]); for ($i = 0; $yy = substr($xx, $i, 6); $i += 6) { $zz .= substr($base, ord(pack("B*", "00" . $yy)), 1); if (length($yy) == 2) { $zz .= "=="; } elsif (length($yy) == 4) { $zz .= "="; } } return($zz); } #-------------------------------------------------------------------------- # [ エラー ] sub DIE { &HTML_HEADER; print "
\n"; print "エラー
\n"; print "$_[0]
\n"; print "
\n"; &HTML_FOOTER; }