package tfmlib; # ###################################################################### ### ### ### CGIフォームメール送信 T-FormMail Ver.1.03 ### [3/3] 関数ライブラリ (tfmlib.pl) ### (c) 1996-2002 Takahiro Nishida ### http://www.mytools.net/ ### ### ###################################################################### # ### 変数設定部 (詳細は上記ページをご覧下さい) ###################### # データディレクトリ(basedir) のパス $basedir = "."; # 戻り先URL $backurl = "http://your.homepage/"; # 管理者メールアドレス $admin_email = "your\@email.address"; # 入力最大バイト数 $word_max = 10240; # 文字コード $char_code = "sjis"; # sendmailのパス $sendmailpath = "/usr/sbin/sendmail"; ### 変数設定部 (ここまで)########################################### require "./jcode.pl"; $code = "sjis"; $verno = "1.03"; $lockfile = "$basedir/lockdir/tfm.lock"; $log_max = 20; ########## 入力の受け取り sub parseform{ local($buffer, $vn, $pair, @pairs); ($word_max > $ENV{'CONTENT_LENGTH'}) || &error(7, "$ENV{'CONTENT_LENGTH'}/$word_max"); if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($vn, $value) = split(/=/, $pair); ($vn =~ /^_/) || defined($F{$vn}) || push(@vseqs, $vn); $F{$vn} .= $value; } } ########## 日本語のデコード sub decode{ local($w) = @_; $w =~ tr/+/ /; $w =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $w =~ s/\t//g; $w =~ s/</g; $w =~ s/>/>/g; $w =~ s/\cM//g; $w =~ s/\n{2,}/
/g;
$w =~ s/\n/
/g;
$w =~ s/"/"/g;
&jcode'convert(*w, $code);
$w;
}
########## 改行タグを\nに
sub TagToValue{
local($w) = @_;
$w =~ s/
/\n\n/g;
$w =~ s/ \n";
print "$msg[$id]($file)\n";
($emsg) && print " $fmsg[$fid]
/\n/g;
&jcode'convert(*w, $code);
$w;
}
########## エスケープ済文字を元に戻す
sub unescape{
local($w) = @_;
$w =~ s/<//g;
$w =~ s/"/"/g;
&jcode'convert(*w, $code);
$w;
}
########## 現在の時刻を得る
sub get_time{
local($tsec, $format) = @_;
($tsec = 0) || ($tsec = time());
local($sec, $min, $hour, $mday, $mon, $year) = localtime($tsec);
$mon++;
$year += 1900;
($format == 1) && return sprintf("%04d/%02d/%02d %02d:%02d", $year, $mon, $mday, $hour, $min);
($format == 2) && return sprintf("%04d%02d%02d%02d%02d%02d", $year, $mon, $mday, $hour, $min, $sec);
}
########### ファイルを開いて、中身を配列に代入する
sub openfile{
local ($filename, *buf, $frag) = @_;
open(FILE, "$filename") || $frag || &error(1, $filename);
@buf =
";
}
########## ロック(symlink使用)
#sub lock{
# $try = 3;
# while(!symlink("$$", $lockfile)){
# (--$try > 0) || &error(0);
# sleep(1);
# }
#}
########## ロック(symlinkが使えないサーバ(Windows系)用、弱い)
sub lock{
$try = 3;
while(-f $lockfile){
(--$try > 0) || &error(0);
sleep(1);
}
open(FILE,">$lockfile") || &error(2, $lockfile);
close(FILE);
}
########## ロック解除
sub unlock{
unlink($lockfile);
}
########## 汎用エラーメッセージ
sub error{
local($id, $file, $emsg) = @_;
$fmid[0] = 1; $msg[0] = 'ロック中です';
$fmid[1] = 0; $msg[1] = 'データファイルが開けません';
$fmid[2] = 0; $msg[2] = 'データファイルに書き込めません';
$fmid[3] = 1; $msg[3] = '変数が取得できないか不正です';
$fmid[4] = 0; $msg[4] = 'データファイルが壊れています';
$fmid[5] = 1; $msg[5] = '関数のパラメータが不足しています';
$fmid[6] = 0; $msg[6] = 'メールの送信に失敗しました';
$fmid[7] = 1; $msg[7] = '入力文字数が多すぎます。文章を短くしてください。';
$fmid[8] = 1; $msg[8] = '以下の項目の入力に誤りがあります。';
$fmid[9] = 0; $msg[9] = 'コードが指定されていません。';
$fmid[10] = 0; $msg[10]= '指定されたコードが存在しません。';
$fmsg[0] = "管理者 ($admin_email) に連絡してください";
$fmsg[1] = "ブラウザのBackを押して戻ってください";
$fid = $fmid[$id];
print "
Powered by T-FormMail Ver.$verno
$emsg\n";
print "
\n";
print ©right;
print "";
&lock_check;
exit;
}
########## ロックチェック
sub lock_check{
local($lc) = @_;
local(@sts) = lstat($lockfile);
local($tn) = time();
($id) && &unlock; # IDが0以外はロック解除
($lc) && &unlock; # $lcがあったらロック解除
($tn - $sts[9] < 15) || &unlock; # 約15秒以上ロックが続いてたら自動解除
}
########## 固定の正規表現ライブラリ
sub matchingpattern{
$PATTERN{'NUMBER'} = '^\d+$';
$PATTERN{'WORD'} = '^\w+$';
$PATTERN{'EMAIL'} = '^[\w\-\+\.]+\@[\w\-\+\.]+$';
$PATTERN{'URL'} = '^http://.+$';
}
1;