#!/usr/bin/perl #┌───────────────────────────────── #│ e-PAD v1.42 (2004/04/07) #│ Copyright (c) KentWeb #│ webmaster@kent-web.com #│ http://www.kent-web.com/ #└───────────────────────────────── $ver = 'e-PAD v1.42'; #┌───────────────────────────────── #│ [注意事項] #│ 1. このスクリプトはフリーソフトです。このスクリプトを使用した #│ いかなる損害に対して作者は一切の責任を負いません。 #│ 2. 設置に関する質問はサポート掲示板にお願いいたします。 #│ 直接メールによる質問は一切お受けいたしておりません。 #└───────────────────────────────── # # 【ファイル構成例】 # # public_html (ホームディレクトリ) # | # +-- epad / epad.cgi [705] # | elog.cgi [606] # | pcom.pl [604] # | ptel.pl [604] # | jcode.pl [604] # | # +-- img / *.gif # | # +-- i / *.gif *.png # | # +-- j / *.gif # | # +-- lock [707] / # #------------------------------------------------- # 基本設定 #------------------------------------------------- # 外部ファイル取り込み $jcode = './jcode.pl'; $ptel = './ptel.pl'; $pcom = './pcom.pl'; # タイトル名 $title = "BlueArrow掲示板"; # タイトル文字の色 $t_color = "#666666"; # タイトル文字サイズ $t_size = '24px'; # 本文文字サイズ $b_size = '13px'; # 本文文字のタイプ $b_face = "MS UI Gothic, Osaka"; # 記事題名の色 $sub_color = "#DD0000"; # スクリプトURL $script = './epad.cgi'; # ログファイル $logfile = './elog.cgi'; # 管理用パスワード $pass = 'bullbullbull'; # 最大記事数(これを超える記事は古い順に削除) $max = 100; # 戻り先 $home = "../index.html"; # bodyタグ $body = ''; # URLの自動リンク (0=no 1=yes) $autolink = 1; # 1ページ当り記事表示件数 $p_log = 10; # PCモード $p_log2 = 4; # 携帯モード # ファイルロック形式 # → 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.*'; $deny = ''; # ホスト取得方法 # 0 : gethostbyaddr関数を使わない # 1 : gethostbyaddr関数を使う $gethostbyaddr = 0; # 同一IPアドレスからの連続投稿時間(秒数) # → 連続投稿などの荒らし対策 # → 値を 0 にするとこの機能は無効 $wait = 0; # 一般画像ディレクトリURL $imgurl = './img'; # i-mode画像ディレクトリURL $img_i = './i'; # j-sky画像ディレクトリURL $img_j = './j'; # コメント部投稿データ制限(バイト) $maxdata = 1000; #------------------------------------------------- # 設定完了 #------------------------------------------------- &agent; &decode; &axscheck; if ($mode eq 'regist') { ®ist; } elsif ($mode eq 'find') { &find; } elsif ($mode eq 'howto') { &howto; } elsif ($mode eq 'admin') { &admin; } elsif ($mode eq 'usrdel') { &usrdel; } elsif ($mode eq 'check') { ✓ } &html; #------------------------------------------------- # 機種チェック #------------------------------------------------- sub agent { # 機種情報 local($agent) = $ENV{'HTTP_USER_AGENT'}; # jcode.pl使用フラグ $jflag=0; # i-mode if ($agent =~ /DoCoMo/i) { $type = 'i'; $method = 'POST'; $button = 'accesskey'; $emo1 = '驪'; $emo2 = '麗'; $emo3 = '黎'; $emo4 = '力'; $emo5 = '曆'; $meta = ''; require $ptel; # J-PHONE } elsif ($agent =~ m|J-PHONE/[^\/]+/([^\/]+)|i) { $type = 'j'; $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) { $type = 'e'; $method = 'GET'; $button = 'accesskey'; $emo1 = ''; $emo2 = ''; $emo3 = ''; $emo4 = ''; $emo5 = ''; $meta = ''; require $ptel; # PC } else { $type = 'p'; $method = 'POST'; $meta = ''; $meta .= ''; $meta .= ''; $meta .= ''; $meta .= ''; $meta .= ''; $meta .= ''; $meta .= ''; $meta .= 'BLUE ARROW - Darts and Dining'; require $pcom; require $jcode; $jflag++; } # 絵文字変換テーブル ( i → j ) %i2j = ( 'f89f','G6a', 'f8a0','G69', 'f8a1','G6b', 'f8a2','G68', 'f8a3','E5d', 'f8a7','F5f', 'f8a8','F60', 'f8a9','F61', 'f8aa','F62', 'f8ab','F63', 'f8ac','F64', 'f8ad','F65', 'f8ae','F66', 'f8af','F67', 'f8b0','F68', 'f8b1','F69', 'f8b2','F6a', 'f8b3','G26', 'f8b4','G36', 'f8b5','G34', 'f8b6','G35', 'f8b7','F38', 'f8b8','G33', 'f8ba','E52', 'f8bc','G3e', 'f8bd','G3e', 'f8be','G3f', 'f8bf','G3b', 'f8c0','G3b', 'f8c1','E79', 'f8c2','F22', 'f8c3','G3d', 'f8c4','G56', 'f8c5','G58', 'f8c6','E73', 'f8c7','E75', 'f8c8','E6d', 'f8c9','E74', 'f8ca','E76', 'f8cb','E76', 'f8cc','G5a', 'f8cd','E6f', 'f8ce','E6e', 'f8cf','E71', 'f8d0','G63', 'f8d1','G65', 'f8d2','G64', 'f8d3','G67', 'f8d4','E40', 'f8d5','E5e', 'f8d7','G5c', 'f8d8','G5d', 'f8d9','F56', 'f8da','E44', 'f8df','E45', 'f8e1','F28', 'f8e2','G28', 'f8e3','E3e', 'f8e4','E68', 'f8e6','E32', 'f8e8','G29', 'f8e9','G2a', 'f8eb','E4a', 'f8ed','E46', 'f8ee','F2c', 'f8ef','F2e', 'f8f0','F2d', 'f8f1','F2f', 'f8f4','G30', 'f8f5','G31', 'f8f6','G32', 'f8f7','F58', 'f8f8','F57', 'f8fa','G27', 'f8fc','F2a', 'f945','G72', 'f946','G6f', 'f947','G3c', 'f948','G53', 'f949','F59', 'f972','E24', 'f973','E23', 'f977','E23', 'f97a','F35', 'f97b','F36', 'f981','E34', 'f982','F32', 'f984','F31', 'f985','F30', 'f987','F3c', 'f988','F3d', 'f989','F3e', 'f98a','F3f', 'f98b','F40', 'f98c','F41', 'f98d','F42', 'f98e','F43', 'f98f','F44', 'f990','F45', 'f991','G42', 'f993','G43', 'f995','G76', 'f996','G79', 'f997','G78', 'f998','G78', 'f999','E27', 'f99a','F56', 'f99b','G5e', 'f99c','E43', 'f99e','G23', 'f9a0','E2f', 'f9a1','G79', 'f9a2','G2d', 'f9a5','F58', 'f9a6','E5c', 'f9a7','G41', 'f951','E4f', 'f95e','G4d', ); # 絵文字変換テーブル ( j → i ) %j2i = ( 'G6a','f89f', 'G69','f8a0', 'G6b','f8a1', 'G68','f8a2', 'E5d','f8a3', 'F5f','f8a7', 'F60','f8a8', 'F61','f8a9', 'F62','f8aa', 'F63','f8ab', 'F64','f8ac', 'F65','f8ad', 'F66','f8ae', 'F67','f8af', 'F68','f8b0', 'F69','f8b1', 'F6a','f8b2', 'G26','f8b3', 'G36','f8b4', 'G34','f8b5', 'G35','f8b6', 'F38','f8b7', 'G33','f8b8', 'E52','f8ba', 'G3e','f8bc', 'G3e','f8bd', 'G3f','f8be', 'G3b','f8bf', 'G3b','f8c0', 'E79','f8c1', 'F22','f8c2', 'G3d','f8c3', 'G56','f8c4', 'G58','f8c5', 'E73','f8c6', 'E75','f8c7', 'E6d','f8c8', 'E74','f8c9', 'E76','f8ca', 'E76','f8cb', 'G5a','f8cc', 'E6f','f8cd', 'E6e','f8ce', 'E71','f8cf', 'G63','f8d0', 'G65','f8d1', 'G64','f8d2', 'G67','f8d3', 'E40','f8d4', 'E5e','f8d5', 'G5c','f8d7', 'G5d','f8d8', 'F56','f8d9', 'E44','f8da', 'E45','f8df', 'F28','f8e1', 'G28','f8e2', 'E3e','f8e3', 'E68','f8e4', 'E32','f8e6', 'G29','f8e8', 'G2a','f8e9', 'E4a','f8eb', 'E46','f8ed', 'F2c','f8ee', 'F2e','f8ef', 'F2d','f8f0', 'F2f','f8f1', 'G30','f8f4', 'G31','f8f5', 'G32','f8f6', 'F58','f8f7', 'F57','f8f8', 'G27','f8fa', 'F2a','f8fc', 'G72','f945', 'G6f','f946', 'G3c','f947', 'G53','f948', 'F59','f949', 'E24','f972', 'E23','f973', 'E23','f977', 'F35','f97a', 'F36','f97b', 'E34','f981', 'F32','f982', 'F31','f984', 'F30','f985', 'F3c','f987', 'F3d','f988', 'F3e','f989', 'F3f','f98a', 'F40','f98b', 'F41','f98c', 'F42','f98d', 'F43','f98e', 'F44','f98f', 'F45','f990', 'G42','f991', 'G43','f993', 'G76','f995', 'G79','f996', 'G78','f997', 'G78','f998', 'E27','f999', 'F56','f99a', 'G5e','f99b', 'E43','f99c', 'G23','f99e', 'E2f','f9a0', 'G79','f9a1', 'G2d','f9a2', 'F58','f9a5', 'E5c','f9a6', 'G41','f9a7', 'E4f','f951', 'G4d','f95e', ); # 絵文字変換テーブル ( i → e ) %i2e = ( 'f89f', 44, 'f8a0', 107, 'f8a1', 95, 'f8a2', 191, 'f8a3', 16, 'f8a4', 190, 'f8a5', 305, 'f8a6', 95, 'f8a7', 192, 'f8a8', 193, 'f8a9', 194, 'f8aa', 195, 'f8ab', 196, 'f8ac', 197, 'f8ad', 198, 'f8ae', 199, 'f8af', 200, 'f8b0', 201, 'f8b1', 202, 'f8b2', 203, 'f8b3', 218, 'f8b4', 45, 'f8b5', 306, 'f8b6', 220, 'f8b7', 219, 'f8b8', 221, 'f8b9', 307, 'f8ba', 222, 'f8bb', 308, 'f8bc', 172, 'f8bd', 172, 'f8be', 217, 'f8bf', 125, 'f8c0', 125, 'f8c1', 216, 'f8c2', 169, 'f8c3', 168, 'f8c4', 112, 'f8c5', 156, 'f8c6', 156, 'f8c7', 156, 'f8c8', 212, 'f8c9', 205, 'f8ca', 156, 'f8cb', 206, 'f8cc', 213, 'f8cd', 208, 'f8ce', 99, 'f8cf', 207, 'f8d0', 146, 'f8d1', 93, 'f8d2', 52, 'f8d3', 65, 'f8d4', 245, 'f8d5', 124, 'f8d6', 104, 'f8d7', 289, 'f8d8', 111, 'f8d9', 70, 'f8da', 223, 'f8db', 294, 'f8dc', 309, 'f8dd', 310, 'f8df', 106, 'f8e0', 176, 'f8e1', 177, 'f8e2', 94, 'f8e3', 83, 'f8e4', 97, 'f8e6', 144, 'f8e8', 85, 'f8e9', 161, 'f8ea', 121, 'f8eb', 288, 'f8ec', 232, 'f8ed', 300, 'f8ee', 51, 'f8f4', 281, 'f8f7', 43, 'f8f8', 42, 'f8f9', 276, 'f8fa', 124, 'f8fb', 116, 'f8fc', 178, 'f943', 15, 'f944', 47, 'f945', 74, 'f946', 251, 'f947', 169, 'f948', 234, 'f949', 71, 'f972', 161, 'f973', 151, 'f974', 166, 'f977', 108, 'f97a', 109, 'f97b', 299, 'f97c', 138, 'f97d', 120, 'f97e', 118, 'f981', 119, 'f982', 303, 'f983', 210, 'f987', 180, 'f988', 181, 'f989', 182, 'f98a', 183, 'f98b', 184, 'f98c', 185, 'f98d', 186, 'f98e', 187, 'f98f', 188, 'f992', 266, 'f993', 265, 'f994', 266, 'f995', 257, 'f996', 258, 'f997', 260, 'f998', 259, 'f999', 327, 'f99a', 29, 'f99b', 291, 'f99c', 224, 'f99d', 328, 'f99e', 273, 'f99f', 267, 'f9a0', 77, 'f9a1', 262, 'f9a2', 281, 'f9a3', 268, 'f9a4', 291, 'f9a5', 30, 'f9a6', 261, 'f9a7', 2, 'f9a8', 2, 'f9a9', 2, 'f9aa', 329, 'f9ab', 330, 'f9ac', 263, 'f9ad', 282, ); } #------------------------------------------------- # アクセス制限 #------------------------------------------------- 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)=0; foreach ( split(/\s+/, $deny) ) { s/\./\\\./g; s/\*/\.\*/g; s/\?/\.\?/g; if ($host =~ /$_/i || $addr =~ /$_/i) { $flag=1; last; } } if ($flag) { &error("アクセスを許可されていません"); } } #------------------------------------------------- # 記事受理 #------------------------------------------------- sub regist { local($limit, $pwd, $time, @file, @w); # データ制限 $limit = $maxdata / 2; if (length($in{'comment'}) > $maxdata) { &error("コメントは全角$limit字以内にしてください"); } # フォーム内容チェック if ($in{'name'} eq "") { &error("名前未入力"); } if ($in{'comment'} eq "") { &error("コメント未入力"); } if ($in{'url'} eq "http://") { $in{'url'} = ""; } if ($in{'sub'} eq "") { $in{'sub'} = "無題"; } # ロック開始 &lock if ($lockkey); # データ読み込み open(IN,"$logfile") || &error("Open Error : $logfile"); @file = ; close(IN); # 重複投稿チェック $time = time; local($no,$nam,$com,$hos,$tim) = (split(/<>/, $file[0]))[0,2,5,7,9]; if ($in{'name'} eq $nam && $in{'comment'} eq $com) { &error("二重投稿です"); } # 同一ホスト連続投稿チェック if ($host eq $hos && $wait > $time - $tim) { &error("連続投稿はもうしばらく時間をおいて下さい"); } # 記事No採番 $no++; # 削除キー暗号化 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'}); # 更新 while ($max <= @file) { pop(@file); } unshift(@file,"$no<>$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 @file; close(OUT); # ロック解除 &unlock if ($lockkey); # クッキー記憶 if ($in{'cook'} eq 'on') { &set_cookie($in{'name'},$in{'email'},$in{'url'},$in{'pwd'}); } # メール通知 if ($mailing == 1) { &mail_to; } elsif ($mailing == 2 && $in{'email'} ne $mailto) { &mail_to; } # 投稿後メッセージ &header; if ($type eq 'p') { print "

\n"; print "

投稿を受け付けました

\n"; print "
\n"; print "
\n"; print "
\n"; } else { print "投稿完了
戻る\n"; } print "\n"; exit; } #------------------------------------------------- # 管理モード #------------------------------------------------- sub admin { local($no,$date,$nam,$eml,$sub,$com,$url,$hos,$del,@new,@del); # ログイン画面 if ($in{'pass'} eq "") { &header; print "

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

\n"; print "
\n"; print "\n"; print "\n"; print "
\n"; print "\n"; exit; # 認証 } elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); } # 削除処理 if ($in{'del'}) { @del = split(/\0/, $in{'del'}); # ロック開始 &lock if ($lockkey); # 削除情報とマッチ @new=(); open(IN,"$logfile") || &error("Open Error: $logfile"); while () { $flag=0; ($no) = split(/<>/); foreach $del (@del) { if ($no == $del) { $flag=1; last; } } if (!$flag) { push(@new,$_); } } close(IN); # 更新 open(OUT,">$logfile") || &error("Write Error: $logfile"); print OUT @new; close(OUT); # ロック解除 &unlock if ($lockkey); } # 管理画面表示 &header; print <戻る]
EOM if ($type ne "p") { $p_log = $p_log2; } # 記事展開 $i=0; open(IN,"$logfile") || &error("Open Error: $logfile"); while () { $i++; next if ($i < $page + 1); last if ($i > $page + $p_log); ($no,$dat,$nam,$eml,$sub,$com,$url,$hos) = split(/<>/); if ($eml) { $nam="$nam"; } print "
"; print "[$no] $sub $nam - $dat <$hos>\n"; if ($type eq 'p') { $com =~ s/<([^>]|\n)*>//g; if (length($com) > 60) { $com = substr($com,0,60); $com .= "..."; } print "
$com\n"; } } close(IN); print "
\n"; $next = $page + $p_log; $back = $page - $p_log; print "\n"; if ($back >= 0) { print "\n"; } if ($next < $i) { print "\n"; } print <
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
EOM exit; } #------------------------------------------------- # ユーザ記事削除 #------------------------------------------------- sub usrdel { local($flag,$enpw,$match,$no,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,@new); if ($in{'no'} eq '') { &error("削除Noが入力モレです"); } if ($in{'pwd'} eq '') { &error("削除キーが入力モレです"); } # ロック開始 &lock if ($lockkey); $flag=0; @new=(); open(IN,"$logfile") || &error("Open Error: $logfile"); while () { ($no,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw) = split(/<>/); if ($in{'no'} == $no) { $flag=1; $enpw=$pw; } else { push(@new,$_); } } close(IN); if (!$flag) { &error("該当記事が見当たりません"); } if ($enpw eq '') { &error("記事に削除キーが設定されていません"); } # 削除キー照合 $match = &decrypt($in{'pwd'}, $enpw); if ($match != 1) { &error("削除キーが違います"); } # ログ更新 open(OUT,">$logfile") || &error("Write Error: $logfile"); print OUT @new; 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'}; } 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 .= "\n"; $head .= "$body\n"; print "Content-Type: text/html\n"; if ($len > 0) { $len += length($head); print "Content-Length: $len\n"; } print "\n"; print $head; $headflag=1; } #------------------------------------------------- # 日時取得 #------------------------------------------------- sub get_time { local($time, $key) = @_; local($min,$hour,$mday,$mon,$year,$wday,$date,@w); # 時間取得 ($min,$hour,$mday,$mon,$year,$wday) = (localtime($time))[1..6]; # フォーマット if ($key eq 'p') { @w = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); $date = sprintf("%04d/%02d/%02d(%s) %02d:%02d", $year+1900,$mon+1,$mday,$w[$wday],$hour,$min); } else { $date = sprintf("%s/%s-%02d:%02d", $mon+1,$mday,$hour,$min); } $date; } #------------------------------------------------- # パスワード暗号 #------------------------------------------------- sub encrypt { local($inpw) = @_; local($salt, $encrypt, @s); # 種生成 @s = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/'); srand; $salt = $s[int(rand(@s))] . $s[int(rand(@s))]; # 暗号化 $encrypt = crypt($inpw, $salt) || crypt ($inpw, '$1$' . $salt); $encrypt; } #------------------------------------------------- # パスワード照合 #------------------------------------------------- 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 { # 古いロックは削除 if (-e $lockfile) { local($mtime) = (stat($lockfile))[9]; if ($mtime < time - 30) { &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($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; } #------------------------------------------------- # 絵文字受理 #------------------------------------------------- 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; # j-sky → 独自フォーマット化 s/(\x1B\x24[E-GO-Q][\x21-\x7A]+)\x0F/&j2o($1)/eg; $_; } #------------------------------------------------- # 絵文字 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 → i #------------------------------------------------- sub i2i { local($_) = @_; s//pack('H2H2', "$1$2", $3)/eg; $_; } #------------------------------------------------- # 絵文字 j → j #------------------------------------------------- sub j2j { local($_) = @_; s//pack('H2H2','1B','24').$1.pack('H2',$2).pack('H2','0F')/eg; $_; } #------------------------------------------------- # 絵文字 j → PC #------------------------------------------------- sub jsky { local($_) = @_; s|||g; $_; } #------------------------------------------------- # 絵文字 i → PC #------------------------------------------------- sub imode { local($_) = @_; 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 ""; } } #------------------------------------------------- # 絵文字 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 ""; } } #------------------------------------------------- # 絵文字 i → e #------------------------------------------------- sub i2e { local($_) = @_; s//&i2e2("$1$2$3")/eg; $_; } sub i2e2 { local($_) = @_; if (defined($i2e{$_})) { return ""; } else { return ""; } } #------------------------------------------------- # 絵文字 j → e #------------------------------------------------- sub j2e { local($_) = @_; s|||g; $_; } #------------------------------------------------- # チェックモード #------------------------------------------------- sub check { &header; print <Check Mode
    EOM # ログファイル if (-e $logfile) { print "
  • ログファイルパス:OK\n"; if (-r $logfile && -w $logfile) { print "
  • ログパーミッション:OK\n"; } else { print "
  • ログパーミッションが不正です。\n"; } } else { print "
  • ログファイルのパスが不正です:NG → $logfile\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"; 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__