#!/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";
} else {
print "投稿完了
戻る\n";
}
print "