#!/usr/local/bin/perl #┌───────────────────────────────── #│ E-PAD v2.12 (2005/08/12) #│ Copyright (c) KentWeb #│ webmaster@kent-web.com #│ http://www.kent-web.com/ #│ #│ E-PAD utn Edition v1.01 (2006/04/25) #│ 端末情報記録機能追加 (2005/11/17) #│ 端末情報アクセス制限追加(2006/04/25) #│ 英語SPAMブロック追加(2006/04/25 By かず) #│ Copyright (c) Bancho #│ info@bancho.saikyou.biz #│ http://bancho.saikyou.biz/archives/2006/01/epad_utn.html #└───────────────────────────────── $ver = 'E-PAD v2.12'; #┌───────────────────────────────── #│ [注意事項] #│ 1. このスクリプトはフリーソフトです。このスクリプトを使用した #│ いかなる損害に対して作者は一切の責任を負いません。 #│ 2. 設置に関する質問はサポート掲示板にお願いいたします。 #│ 直接メールによる質問は一切お受けいたしておりません。 #└───────────────────────────────── # # 【ファイル構成例】 # # public_html (ホームディレクトリ) # | # +-- epad / epad.cgi [705] # | elog.cgi [606] # | num.dat [606] # | # +-- lib / jcode.pl [604] # | admin.pl [604] # | ptel.pl [604] # | pcom.pl [604] # | # +-- data / i2e.dat [604] # | i2j.dat [604] # | j2e.dat [604] # | # +-- img / *.gif # | # +-- i / *.gif *.png # | # +-- j / *.gif # | # +-- e / *.gif *.png # | # +-- lock [707] / # #------------------------------------------------- # ▽基本設定 #------------------------------------------------- # 外部ファイル取り込み $jcode = './lib/jcode.pl'; $ptel = './lib/ptel.pl'; $pcom = './lib/pcom.pl'; $admin = './lib/admin.pl'; # 掲示板タイプ # 1 : 標準タイプ(レス機能なし) # 2 : 返信レス式(レス記事はクリック後に表示) # 3 : 返信レス式(レス記事は初期画面から表示) $bbstype = 3; # 自動ソート # → 返信時に親記事をトップへ自動ソートする # 0 : しない # 1 : する $topsort = 0; # タイトル名 $title = "BLUEFOREST BBS"; # タイトル文字の色 $t_color = "#ff1111"; # タイトル文字サイズ $t_size = '24px'; # 本文文字サイズ $b_size = '13px'; # 本文文字のタイプ $b_face = "MS UI Gothic, MS Pゴシック, Osaka"; # 記事題名の色 $sub_col = "#DD0000"; # 記事下地の色 (PCモード時) $tbl_col = "#ffffff"; # 記事番号の色 (PCモード時) $num_col = "#008000"; # CGI本体スクリプト (URL) $script = './bbs.cgi'; # ログファイル (サーバパス) $logfile = './elog.cgi'; # データ番号ファイル (サーバパス) $numfile = './num.dat'; # 管理用パスワード $pass = 'smsm5858'; # 最大記事数 # → 親記事単位 # → これを超える記事は古い順に削除 $max = 1000; # 戻り先 (URL) $home = "http://www.blueforest-kumagaya.com/"; # bodyタグ (PCモードの場合) $body = ''; # URLの自動リンク (0=no 1=yes) $autolink = 1; # 1ページ当り記事表示件数 $pageLog = 10; # PCモード $pageLog2 = 5; # 携帯モード # ファイルロック形式 # → 0=no 1=symlink関数 2=mkdir関数 $lockkey = 0; # ロックファイル名 $lockfile = './lock/epad.lock'; # メール通知機能 # 0 : 通知しない # 1 : 通知する → 自分の投稿記事も通知する # 2 : 通知する → 自分の投稿記事は通知しない $mailing = 0; # メールソフトのパス(メール通知する場合) $sendmail = '/usr/lib/sendmail'; # メール通知先アドレス(メール通知する場合) $mailto = 'xxx@xxx.xxx'; # アクセス制限(半角スペースで区切る) # → 拒否するホスト名又はIPアドレスをスペースで区切る # → 記述例 $deny = '.anonymizer.com 211.154.120.'; $denyhost = '220.226.63.254 83.151.156.148 211.143.37.188 206.51.229.115'; # ホスト取得方法 # 0 : gethostbyaddr関数を使わない # 1 : gethostbyaddr関数を使う $gethostbyaddr = 0; # 同一IPアドレスからの連続投稿時間(秒数) # → 連続投稿などの荒らし対策 # → 値を 0 にするとこの機能は無効 $wait = 30; # Docomo 及び VodaPhoneで端末情報を送信しない場合 # 0 : 投稿を許可する(端末情報の代わりにIPアドレスを保存) # 1 : 投稿を禁止する $selchk = 0; # 一般画像ディレクトリURL $imgurl = './img'; # i-mode画像ディレクトリURL $img_i = './i'; # vodafone画像ディレクトリURL $img_j = './j'; # EZweb画像ディレクトリURL $img_e = './e'; # コメント部投稿データ制限(バイト) $maxdata = 10000; # ヘッダのContent-Lengthを表示する # → 0=no 1=yes # → 無料HPサービス等で広告バナーが自動表示される場合にはNOとする $cont_len = 1; # 絵文字変換データディレクトリ $emodir = './data'; #------------------------------------------------- # △設定完了 #------------------------------------------------- &agent; &decode; &axscheck; if ($mode eq 'regist') { ®ist; } elsif ($mode eq 'find') { &find; } elsif ($mode eq 'howto') { &howto; } elsif ($mode eq 'admin') { require $admin; &admin; } elsif ($mode eq 'usrdel') { &usrdel; } elsif ($mode eq 'popup') { &popup; } elsif ($mode eq 'check') { ✓ } &html; #------------------------------------------------- # 機種チェック #------------------------------------------------- sub agent { # 機種情報 local($agent) = $ENV{'HTTP_USER_AGENT'}; # jcode.pl使用フラグ $jflag=0; # FOMA if ($agent =~ /DoCoMo\/2/i) { #Docomo(FOMA)のutnを取り出し @item = split(/\;/, $ENV{'HTTP_USER_AGENT'}); if (length($item[3]) == 0) { $errflg = 1; } else { $utn = $item[3]; } $type = 'f'; $method = 'POST'; $button = 'accesskey'; $emo1 = '驪'; $emo2 = '麗'; $emo3 = '黎'; $emo4 = '力'; $emo5 = '曆'; $meta = ''; require $ptel; # Mova } elsif ($agent =~ /DoCoMo\/1/i) { #DoCoMo(Mova)のutnを取り出し @item = split(/\//, $ENV{'HTTP_USER_AGENT'}); if (length($item[6]) == 0) { $errflg = 1; } else { $utn = $item[6]; } $type = 'i'; $method = 'post'; $button = 'accesskey'; $emo1 = '驪'; $emo2 = '麗'; $emo3 = '黎'; $emo4 = '力'; $emo5 = '曆'; $meta = ''; require $ptel; # vodafone } elsif ($agent =~ m|J-PHONE/[^\/]+/([^\/]+)|i || $agent =~ /Vodafone/|i || $agent =~ /^MOT\-/|i) { $type = 'j'; #VodaPhoneのシリアルNo.を取り出し @item = split(/\//, $ENV{'HTTP_USER_AGENT'}); if (length($item[4]) == 0) { $errflg = 1; } else { $ser = $item[4]; } # $model = $1; # 機種 # if ($model =~ /51/) { $model=51; } else { $model=0; } $method = 'get'; $button = 'DIRECTKEY'; $emo1 = pack('H2H2','1B','24') . 'F' . pack('H2','3c') . pack('H2','0F'); $emo2 = pack('H2H2','1B','24') . 'F' . pack('H2','3d') . pack('H2','0F'); $emo3 = pack('H2H2','1B','24') . 'F' . pack('H2','3e') . pack('H2','0F'); $emo4 = pack('H2H2','1B','24') . 'F' . pack('H2','3f') . pack('H2','0F'); $emo5 = pack('H2H2','1B','24') . 'F' . pack('H2','40') . pack('H2','0F'); $meta = ''; require $ptel; # EZweb } elsif ($agent =~ /UP\.Browser/i) { # auのサブスクライバIDを取得 By Bancho $au = $ENV{'HTTP_X_UP_SUBNO'}; $type = 'e'; $method = 'get'; $button = 'accesskey'; $emo1 = ''; $emo2 = ''; $emo3 = ''; $emo4 = ''; $emo5 = ''; $meta = ''; require $ptel; # PC } else { $type = 'p'; $method = 'post'; $meta = ''; $meta .= "\n\n"; require $pcom; require $jcode; $jflag++; } } #------------------------------------------------- # アクセス制限 #------------------------------------------------- sub axscheck { # 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; } local($flag); foreach ( split(/\s/, $denyhost) ) { if (index($host,$_) >= 0) { $flag=1; last; } elsif (index($utn,$_) >= 0) { $flag=1; last; } elsif (index($au,$_) >= 0) { $flag=1; last; } elsif (index($ser,$_) >= 0) { $flag=1; last; } } if ($flag) { &error("アクセスを許可されていません"); } } #------------------------------------------------- # 投稿受付 #------------------------------------------------- sub regist { local($limit, $pwd, $time, @file, @w); # データ制限 $limit = $maxdata / 2; if (length($in{'comment'}) > $maxdata) { &error("コメントは全角$limit字以内にしてください"); } # フォーム内容チェック local($err); if ($in{'name'} eq "") { $err .= "名前が未入力です
\n"; } if ($in{'comment'} eq "") { $err .= "コメントが未入力です
\n"; } if ($err) { &error($err); } if ($in{'url'} eq "http://") { $in{'url'} = ""; } if ($in{'sub'} eq "") { $in{'sub'} = "無題"; } # スパム拒否 By かず $c = $in{'comment'}; if ($in{'url'} && $c =~ /\Q$in{'url'}\E/i) { &error("参照先のアドレスと同一アドレスがコメント中に含まれています"); } if ($c !~ /[\x80-\xff]/) { &error("コメント中に日本語が含まれていません"); } $urlnum = ($c =~ s/http/http/g); if ($urlnum > 3) { &error("コメント中のアドレスが4個を越えています"); } # ロック開始 &lock if ($lockkey); # データ読み込み open(IN,"$logfile") || &error("Open Error: $logfile"); @file = ; close(IN); open(IN,"$numfile") || &error("Open Error: $numfile"); $num = ; close(IN); ($no,$tim,$hos) = split(/<>/, $num); $no++; # 重複投稿チェック $time = time; # 同一ホスト連続投稿チェック if ($host eq $hos && $wait > $time - $tim) { &error("連続投稿はもうしばらく時間をおいて下さい"); } # 端末情報拒否チェック By Bancho if ($selchk eq 1 ) { if ($errflg eq 1 ) { &error("端末情報を送信しないと投稿出来ません"); } } # 削除キー暗号化 if ($in{'pwd'} ne "") { $pwd = &encrypt($in{'pwd'}); } # 日時取得 $date = &get_time($time, 'p'); # 絵文字処理 $in{'sub'} = &emoji($in{'sub'}); $in{'name'} = &emoji($in{'name'}); $in{'comment'} = &emoji($in{'comment'}); # &#xxxxx; を復元 $in{'sub'} =~ s/\&(#\d{5};)/\&$1/ig; $in{'name'} =~ s/\&(#\d{5};)/\&$1/ig; $in{'comment'} =~ s/\&(#\d{5};)/\&$1/ig; #携帯の場合にIPアドレスを固体識別情報に変換 if ($type eq 'i') { #Movaの場合 if ($errflg eq 1 ) { #端末情報が空で if ($host eq "") { #リモートホストも空なら $host = $addr; #リモートアドレスを入れる } else { $host = $host; #リモートホスト情報があればリモートホストを入れる } } else { #端末情報があれば端末情報を入れる $host = $utn; } } elsif ($type eq 'f') { #FOMAの場合 if ($errflg eq 1 ) { if ($host eq "") { $host = $addr; } else { $host = $host; } } else { $host = $utn; } } elsif ($type eq 'e') { #auの場合 $host = $au; } elsif ($type eq 'j') { #VodaPhoneの場合 if ($errflg eq 1 ) { if ($host eq "") { $host = $addr; } else { $host = $host; } } else { $host = $ser; } } else { #その他(PCなど) if ($host eq "") { $host = $addr; } else { $host = $host; } } # 親記事の場合 if ($in{'res'} eq "") { $i=0; $stop=0; foreach (@file) { ($no2,$reno2) = split(/<>/); $i++; if ($i > $max-1 && $reno2 eq "") { $stop=1; } if (!$stop) { push(@data,$_); } } unshift(@data,"$no<><>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$pwd<>$time<>$type<>0<>\n"); # レス記事の場合:トップソートあり } elsif ($in{'res'} && $topsort) { $f=0; $oyaChk=0; $match=0; @data=(); @tmp=(); foreach (@file) { ($no2,$reno2,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$tim,$typ,$res) = split(/<>/); if ($in{'res'} == $no2) { if ($reno2) { $f++; last; } $res++; $oyaChk++; $match=1; push(@data,"$no2<>$reno2<>$dat<>$nam<>$eml<>$sub<>$com<>$url<>$hos<>$pw<>$tim<>$typ<>$res<>\n"); } elsif ($in{'res'} == $reno2) { push(@data,$_); } elsif ($match == 1 && $in{'res'} != $reno2) { $match=2; push(@data,"$no<>$in{'res'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$pwd<>$time<>$type<><>\n"); push(@tmp,$_); } else { push(@tmp,$_); } } if ($f) { &error("不正な返信要求です"); } if (!$oyaChk) { &error("親記事が存在しません"); } if ($match == 1) { push(@data,"$no<>$in{'res'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$pwd<>$time<>$type<><>\n"); } push(@data,@tmp); # レス記事の場合:トップソートなし } else { $f=0; $oyaChk=0; $match=0; @data=(); foreach (@file) { ($no2,$reno2,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$tim,$typ,$res) = split(/<>/); if ($in{'res'} == $no2) { $oyaChk++; $res++; $_ = "$no2<>$reno2<>$dat<>$nam<>$eml<>$sub<>$com<>$url<>$hos<>$pw<>$tim<>$typ<>$res<>\n"; } if ($match == 0 && $in{'res'} == $no2) { if ($reno2) { $f++; last; } $match=1; } elsif ($match == 1 && $in{'res'} != $reno2) { $match=2; push(@data,"$no<>$in{'res'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$pwd<>$time<>$type<><>\n"); } push(@data,$_); } if ($f) { &error("不正な返信要求です"); } if (!$oyaChk) { &error("親記事が存在しません"); } if ($match == 1) { push(@data,"$no<>$in{'res'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$pwd<>$time<>$type<><>\n"); } } # 更新 open(OUT,">$logfile") || &error("Write Error: $logfile"); print OUT @data; close(OUT); open(OUT,">$numfile") || &error("Write Error: $numfile"); print OUT "$no<>$time<>$host"; close(OUT); # ロック解除 &unlock if ($lockkey); # メール通知 if ($mailing == 1 || ($mailing == 2 && $in{'email'} ne $mailto)) { &mail_to; } # 投稿後メッセージ if ($type eq 'p') { # クッキー記憶 &set_cookie($in{'cook'},$in{'name'},$in{'email'},$in{'url'},$in{'pwd'}); &header; print "

\n"; print "

投稿は正常に処理されました

\n"; print "
\n"; print "
\n"; print "
\n"; } else { &header; print "投稿完了
戻る\n"; } print "\n"; exit; } #------------------------------------------------- # ユーザ記事削除 #------------------------------------------------- sub usrdel { local($no,$reno,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw, $tim,$typ,$res,$match,$flag,$enpw,@data,@sort,%data,%res); if ($in{'no'} eq '') { &error("削除Noが入力モレです"); } if ($in{'pwd'} eq '') { &error("削除キーが入力モレです"); } # ロック開始 &lock if ($lockkey); $flag=0; open(IN,"$logfile") || &error("Open Error: $logfile"); while () { ($no,$reno,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$tim,$typ,$res) = split(/<>/); if ($in{'no'} == $no) { $flag=1; $enpw = $pw; next; } elsif ($in{'no'} == $reno) { next; } $data{$no} = $_; if ($reno) { $res{$reno}++; } push(@sort,$no); } close(IN); if (!$flag) { &error("該当記事が見当たりません"); } if ($enpw eq '') { &error("記事に削除キーが設定されていません"); } # 削除キー照合 $match = &decrypt($in{'pwd'}, $enpw); if ($match != 1) { &error("削除キーが違います"); } # データ整列 foreach (@sort) { ($no,$reno,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$tim,$typ,$res) = split(/<>/, $data{$_}); push(@data,"$no<>$reno<>$dat<>$nam<>$eml<>$sub<>$com<>$url<>$hos<>$pw<>$tim<>$typ<>$res{$no}<>\n"); } # ログ更新 open(OUT,">$logfile") || &error("Write Error: $logfile"); print OUT @data; close(OUT); # ロック解除 &unlock if ($lockkey); } #------------------------------------------------- # フォームデコード #------------------------------------------------- sub decode { local($buf,$key,$val); if ($ENV{'REQUEST_METHOD'} eq "POST") { if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量超過"); } read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } else { $buf = $ENV{'QUERY_STRING'}; } undef(%in); foreach ( split(/&/, $buf) ) { ($key, $val) = split(/=/); $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; # PCは文字コード変換 &jcode'convert(*val, 'sjis') if ($type eq 'p'); # エスケープ $val =~ s/&/&/g; $val =~ s/"/"/g; $val =~ s//>/g; $val =~ s/\r\n/
/g; $val =~ s/\r/
/g; $val =~ s/\n/
/g; # $val =~ s/[\x00-\x20]+/ /g; $in{$key} .= "\0" if (defined($in{$key})); $in{$key} .= $val; } $page = $in{'page'}; $mode = $in{'mode'}; $headflag=0; # タイムゾーン設定 $ENV{'TZ'} = "JST-9"; } #------------------------------------------------- # HTMLヘッダ #------------------------------------------------- sub header { local($len) = @_; if ($headflag) { return; } local($head) = "\n$meta\n"; $head .= "$title\n"; if ($type eq 'p') { $head .= "$body\n"; } else { $head .= "\n"; } print "Content-Type: text/html\n"; if ($cont_len && $len > 0) { $len += length($head); print "Content-Length: $len\n"; } print "\n"; print $head; $headflag=1; } #------------------------------------------------- # 日時取得 #------------------------------------------------- sub get_time { local($time, $key) = @_; local($date); # 時間取得 local($min,$hour,$mday,$mon,$year,$wday) = (localtime($time))[1..6]; # フォーマット if ($key eq 'p') { local(@wk) = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); $date = sprintf("%04d/%02d/%02d(%s) %02d:%02d", $year+1900,$mon+1,$mday,$wk[$wday],$hour,$min); } else { $date = sprintf("%s/%s-%02d:%02d", $mon+1,$mday,$hour,$min); } $date; } #------------------------------------------------- # パスワード暗号化 #------------------------------------------------- sub encrypt { local($inpw) = @_; local($salt, $crypt, @s); # 種生成 @s = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/'); srand; $salt = $s[int(rand(@s))] . $s[int(rand(@s))]; # 暗号化 $crypt = crypt($inpw, $salt) || crypt ($inpw, '$1$' . $salt); $crypt; } #------------------------------------------------- # パスワード照合 #------------------------------------------------- sub decrypt { local($inpw, $enpw) = @_; # 種取得 local($salt) = $enpw =~ /^\$1\$(.*)\$/ && $1 || substr($enpw, 0, 2); # 照合 if (crypt($inpw, $salt) eq $enpw || crypt($inpw, '$1$' . $salt) eq $enpw) { return (1); } else { return (0); } } #------------------------------------------------- # ロック処理 #------------------------------------------------- sub lock { # リトライ定義 local($retry) = 5; # 古いロックは削除 if (-e $lockfile) { local($mtime) = (stat($lockfile))[9]; if ($mtime < time - 30) { &unlock; } } # 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($msub,$mbody,$msg,$email); # JISコード変換 if (!$jflag) { require $jcode; } # メールタイトルを定義 $msub = &base64("[$title : $no] $in{'sub'}"); # 本文内容編集 $msg = $in{'comment'}; $msg =~ s/
/\n/g; $msg =~ s/<([^>]|\n)*>//g; $msg =~ s/<//g; $msg =~ s/&/&/g; $msg =~ s/"/"/g; $mbody = <$2<\/a>/g; } #------------------------------------------------- # 絵文字DB認識 #------------------------------------------------- sub emoji_data { local($i,$j,$e,$e2); # ハッシュ初期化 %i2e=(); %i2e2=(); %e2i=(); %e2i2=(); %i2j=(); %j2i=(); %j2e=(); %j2e2=(); # i2e open(IN,"$emodir/i2e.dat"); while () { chop; ($i,$e,$e2) = split(/\t/); $i2e{$i} = $e; $i2e2{$i} = $e2; $e2i{$e} = $i; $e2i2{$e2} = $i; } close(IN); # i2j open(IN,"$emodir/i2j.dat"); while () { chop; ($i,$j) = split(/\t/); $i2j{$i} = $j; $j2i{$j} = $i; } close(IN); # j2e open(IN,"$emodir/j2e.dat"); while () { chop; ($j,$e,$e2) = split(/\t/); $j2e{$j} = $e; $j2e2{$j} = $e2; } close(IN); } #------------------------------------------------- # 絵文字受理 #------------------------------------------------- sub emoji { local($_) = @_; # 10進表記で投稿された場合 → 独自フォーマット化 s/\&\;\#(63\d{3})\;/''/eg; # i-mode → 独自フォーマット化 s/\G((?:[\x80-\x9F\xE0-\xF7\xFA-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF])*)([\xF8\xF9][\x40-\x7E\x80-\xFC])/$1.''/ego; # vodafone → 独自フォーマット化 s/(\x1B\x24[E-GO-Q][\x21-\x7A]+)\x0F/&j2o($1)/eg; # EZweb → 独自フォーマット化 s/\G((?:[\x80-\x9F\xE0-\xF2\xF4-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF])*)([\xF3][\x40-\x7E\x80-\xFC])/$1.''/ego; s/\G((?:[\x80-\x9F\xE0-\xF3\xF5-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF])*)([\xF4][\x40-\x7E\x80-\x8D])/$1.''/ego; s/\G((?:[\x80-\x9F\xE0-\xF5\xF8-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF])*)([\xF6\xF7][\x40-\x7E\x80-\xFC])/$1.''/ego; $_; } #------------------------------------------------- # 絵文字 j → 独自 #------------------------------------------------- sub j2o { local($_) = @_; # タグ復元 s/&/&/g; s/"/"/g; s/<//g; s/\x1B\x24[E-GO-Q]([^\x0F]+)\x0F/$1/; s/\x1B\x24([E-GO-Q])([\x21-\x7A]+)/&j2o2($1,$2)/eg; $_; } sub j2o2 { local($f1, $f2) = @_; $f2 =~ s/([\x21-\x7A])/''/eg; $f2; } #------------------------------------------------- # 絵文字 独自 → i,j,e #------------------------------------------------- sub o2ije { local($_) = @_; # i-mode s//pack('H2H2', "$1$2", $3)/eg; # vodafone s//pack('H2H2','1B','24').$1.pack('H2',$2).pack('H2','0F')/eg; # EZweb s//pack('H2H2', "$1$2", $3)/eg; $_; } #------------------------------------------------- # 絵文字 独自 → PC #------------------------------------------------- sub o2p { local($_) = @_; # vodafone s|||g; # i-mode s|||g; # EZweb s|||g; $_; } #------------------------------------------------- # 絵文字 i → j #------------------------------------------------- sub i2j { local($_) = @_; s//&i2j2("$1$2$3")/eg; $_; } sub i2j2 { local($_) = @_; if (defined($i2j{$_})) { $e = $i2j{$_}; $e =~ s/(.)(..)/pack('H2H2','1B','24').$1.pack('H2',$2).pack('H2','0F')/eg; $e; } else { return ""; } } #------------------------------------------------- # 絵文字 i → e #------------------------------------------------- sub i2e { local($_) = @_; s//&i2e2("$1$2$3")/eg; $_; } sub i2e2 { local($_) = @_; if (defined($i2e{$_})) { return ""; } else { return ""; } } #------------------------------------------------- # 絵文字 j → i #------------------------------------------------- sub j2i { local($_) = @_; s//&j2i2($1,$2)/eg; $_; } sub j2i2 { local($f1, $f2) = @_; if (defined($j2i{"$f1$f2"})) { local($e) = $j2i{"$f1$f2"}; $e =~ s/(..)(..)/pack('H2H2', $1, $2)/e; return $e; } else { return ""; } } #------------------------------------------------- # 絵文字 j → e #------------------------------------------------- sub j2e { local($_) = @_; s||&j2e2("$1$2")|eg; $_; } sub j2e2 { local($_) = @_; if (defined($j2e{$_})) { return ""; } else { return ""; } } #------------------------------------------------- # 絵文字 e → i #------------------------------------------------- sub e2i { local($_) = @_; s||&e2i2("$1$2")|eg; $_; } sub e2i2 { local($_) = @_; if (defined($e2i2{$_})) { local($e) = $e2i2{$_}; $e =~ s/(..)(..)/pack('H2H2', $1, $2)/e; return $e; } else { return ""; } } #------------------------------------------------- # 絵文字 e → j #------------------------------------------------- sub e2j { local($_) = @_; s||&e2j2("$1$2")|eg; $_; } sub e2j2 { local($_) = @_; if (defined($e2j2{$_})) { $e = $e2j2{$_}; $e =~ s/(.)(..)/pack('H2H2','1B','24').$1.pack('H2',$2).pack('H2','0F')/eg; $e; } else { return ""; } } #------------------------------------------------- # チェックモード #------------------------------------------------- sub check { &header; print <チェックモード
    EOM local(%log) = ( $logfile, "ログファイル", $numfile, "記事Noファイル" ); foreach ( $logfile, $numfile ) { if (-e $_) { print "
  • $log{$_}パス:OK\n"; if (-r $_ && -w $_) { print "
  • $log{$_}パーミッション:OK\n"; } else { print "
  • $log{$_}パーミッション:NG\n"; } } else { print "
  • $log{$_}パス:NG → $_\n"; } } # ロックディレクトリ print "
  • ロック形式:"; if ($lockkey == 0) { print "ロック設定なし\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"; } } print <バージョン:$ver
EOM exit; } __END__