\n";
}
if ($kakunin eq "1"){print '
投稿と同時に、あなたのアドレスに確認メールが届きます。アドレス間違いにご注意! ';}
print <<"END";
END
if ($FORM{'page'} eq '') { $page = 0; }
else { $page = $FORM{'page'}; }
# 記事数を取得
$end_data = @new - 1;
$page_end = $page + ($pagelog - 1);
if ($page_end >= $end_data) { $page_end = $end_data; }
foreach ($page .. $page_end) {
($num,$date,$name,$mail,
$sbj,$com,$url,$host,$pw,$area,$job,$sex,$age,$res,$dum)= split(/<>/, $new[$_]);
if (!$sbj) { $sbj = "Untitled"; }
# URL表示
if ($url) {
$url = "
WebPage";
}
# 自動リンク
if ($autolink) { &auto_link($com); }
# 男性か女性かによってカラーセットを変える
if ($sex eq "man") {@tc=@tcm;$sex="♂";}
else {@tc=@tcf;$sex="♀";}
# 管理者レスがついてるかどうか確認
if ($res_key eq "1") {$res_link="
レス";
if ($res ne "" && $res ne "\n") {$res_msg="
$ico | $res";}
}
print <<"END";
END
$res_msg="";
}
print "\n";
&footer;
exit;
}
#パスワードめちゃくちゃ
sub passwd_encode {
$now = time;
($p1, $p2) = unpack("C2", $now);
$wk = $now / (60*60*24*7) + $p1 + $p2 - 8;
@saltset = ('a'..'z','A'..'Z','0'..'9','.','/');
$nsalt = $saltset[$wk % 64] . $saltset[$now % 64];
$ango = crypt($_[0], $nsalt);
}
#パスワード合ってます?
sub passwd_decode {
if ($_[0] =~ /^\$1\$/) { $crptkey = 3; }
else { $crptkey = 0; }
$check = "no";
if (crypt($plain_text, substr($_[0],$crptkey,2)) eq "$_[0]") {
$check = "yes";
}
}
## --- 自動リンク
sub auto_link {
$_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1$2<\/a>/g;
}
## --- 日時の取得
sub get_time {
$ENV{'TZ'} = "JST-9";
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time);
$year = 1900 + $year;
$mon++;
if ($mon < 10) { $mon = "0$mon"; }
if ($mday < 10) { $mday = "0$mday"; }
if ($hour < 10) { $hour = "0$hour"; }
if ($min < 10) { $min = "0$min"; }
if ($sec < 10) { $sec = "0$sec"; }
$youbi = ('日','月','火','水','木','金','土') [$wday];
$date = "$mon月$mday日 ($youbi) $hour時$min分$sec秒";
}
## --- エラー処理
sub error {
# if (-e $lockfile) { unlink($lockfile); }
if ($_[1] ne '0') { &header; }
print "確認して下さい\n";
print "$_[0]\n";
print " \n";
&footer;
exit;
}
## --- ホスト名取得
sub get_host {
$host = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
$hst_addr =$addr;
$host = gethostbyaddr(pack("C4", split(/\./, $hst_addr)), 2);
if ($host eq "") { $host = $addr; }
}
# ログに書きこむ
sub regist {
#不正アクセスを防止。
if ($deny ne ".") {
$refe_url = $ENV{'HTTP_REFERER'};
$refe_url =~ s/\?(.|\n)*//ig;
$refe_url =~ s/\%7E/\~/ig;
if ($refe_url && $refe_url !~ $deny) { &error("不正なアクセスです。"); }
}
#必須事項
if ($pwd eq "") { &error("削除用パスワードが抜けています");}
if ($name eq "") { &error("名前が入力されていません。"); }
if ($comment eq "") { &error("コメントが入力されていません。"); }
if ($email eq "" || $email !~ /(.*)\@(.*)\.(.*)/) {
&error("Eメールの入力内容を確認して下さい");}
if ($sex eq "") { &error("性別が選ばれていません");}
if ($age eq "") {
if ($age_key eq "1"){ &error("選ばれていない項目があります!");}
else {$age = "不明";}
}
if ($job eq "") {
if ($job_key eq "1") {&error("選ばれていない項目があります!");}
else {$job = "不明";}
}
if ($area eq "") {
if ($area_key eq "1") {&error("選ばれていない項目があります!");}
else {$area = "不明";}
}
# ホスト名を取得
&get_host;
# ファイルロック(今後検討の上実装)
# if ($lockkey == 1) { &lock1; }
# elsif ($lockkey == 2) { &lock2; }
# クッキー処理
# &hcookie;
# ログを開く
open(IN,"$logfile") || &error("Can't open $logfile");
@logs = ;
close(IN);
# 記事ナンバー処理
$kizino = $logs[0];
if ($kizino =~ /<>/) {
&error("ログが正しくありません。");
}
$kizino =~ s/\n//;
shift(@logs);
# 二重投稿チェック
local($flag) = 0;
foreach $log (@logs) {
($knum,$kdate,$kname,$kmail,
$ksubj,$kcom,$kurl,$khost,$kpw,$karea,$kjob,$ksex,$kage) = split(/<>/,$log);
if ($name eq "$kname" && $comment eq "$kcom") {
$flag=1; last;
}
}
if ($flag) { &error("二重投稿は禁止です"); }
$kizino++;
$number = $kizino;
# 削除キーを暗号化
if ($pwd) { &passwd_encode($pwd); } else {&error("削除用パスワードが抜けています");}
# 時間を取得
&get_time;
# ログをフォーマット
$new_msg = "$number<>$date<>$name<>$email<>$subj<>$comment<>$url<>$host<>$ango<>$area<>$job<>$sex<>$age<>\n";
$i = 0;
$stop = 0;
foreach $log (@logs) {
($num,$d,$na,$em,$sub,$com,$u,$ho,$p,$are,$j,$se,$ag)=split(/<>/,$log);
$i++;
if ($i > $max-1) {
$stop = 1;
if ($pastkey == 0) { last; }}
else {
$kflag=1; push(@past_data,$log);
}
if ($stop == 0) { push(@new,$log); }
}
unshift(@new,$new_msg);
# 記事NOを付加
unshift (@new,"$kizino\n");
# ログを更新
open(OUT,">$logfile") || &error("Can't write $logfile");
print OUT @new;
close(OUT);
# ロック解除
# if (-e $lockfile) { unlink($lockfile); }
# 確認メール発信!
if ($kakunin eq "1"){
$mail_subj="$title確認メール";
$add_comment = "$settiに設置されている掲示板「$title」に、以上の内容が投稿されました。\n万が一、身に覚えの無い場合は、お手数ですが、掲示板にアクセスし、その記事を探して、記事下部にあるフォームに、「Your pass:」に記載されているパスワード($pwd)を入力、削除してください。\nご不明の点は、管理者$adminmailへ、このメール内容をコピーした上でお問い合わせ下さい。";
&jcode'convert(*subj,'jis');
&jcode'convert(*name,'jis');
&jcode'convert(*mailtitle,'jis');
&jcode'convert(*comment,'jis');
&jcode'convert(*add_comment,'jis');
&jcode'convert(*mail_subj,'jis');
$comment =~ s/ /\n/g;
$comment =~ s/\<\;//g;
open(MAIL,"| $sendmail $email") || &error("Can't post sendmail");
print MAIL "X-Mailer: BBS MAILER\n";
print MAIL "To: $email\n";
print MAIL "From: $adminmail\n";
print MAIL "Subject: $mail_subj\n";
print MAIL "Content-Transfer-Encoding: 7bit\n";
print MAIL "Content-type: text/plain\n\n";
print MAIL "$mail_subj\n";
print MAIL "Title:$subj\n";
print MAIL "NAME : $name\n";
print MAIL "EMAIL: $email\n";
print MAIL "host: $host\n";
print MAIL "comment:\n $comment\n";
print MAIL "Your pass: $pwd\n";
print MAIL "$add_comment\n";
close(MAIL);
}
}
# フォームからのデータ受け取り
sub form {
if ($ENV{'REQUEST_METHOD'} eq "POST") {
if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("最大文字数を超えています"); }
read(STDIN, $IN, $ENV{'CONTENT_LENGTH'});
} else { $IN = $ENV{'QUERY_STRING'}; }
@pairs = split(/&/,$IN);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
&jcode'convert(*value,'sjis');
# タグの有効性
if ($tag == 0) {
$value =~ s/<\;/g;
$value =~ s/>/>\;/g;
} else {
$value =~ s///g;
$value =~ s/<>/<\;>\;/g;
}
$FORM{$name} = $value;
}
$name = $FORM{'name'};
$comment = $FORM{'comment'};
$comment =~ s/\r\n/ /g;
$comment =~ s/\r|\n/ /g;
$email = $FORM{'email'};
$url = $FORM{'url'};
$url =~ s/^http\:\/\///;
$mode = $FORM{'mode'};
$subj = $FORM{'subj'};
$pwd = $FORM{'pwd'};
$age = $FORM{'age'};
$sex = $FORM{'sex'};
$job = $FORM{'job'};
$area = $FORM{'area'};
$fname = $FORM{'fname'};
$fmail = $FORM{'fmail'};
$mailtitle = $FORM{'mailtitle'};
if ($url eq "http://"){$url="";}
}
sub header{
# HTMLヘッダー
print "Content-type: text/html\n\n";
print <<"END";
$title
END
}
# フッターと自己主張(^^;
sub footer {
# 著作権表示(消さないでね)
print "
\n";
print "\n";
}
# 削除モード
sub del {
# ロック開始
# if ($lockkey == 1) { &lock1; }
# elsif ($lockkey == 2) { &lock2; }
# ログを読み込む
open(DB,"$logfile") || &error("Can't open $logfile");
$oya= ;
@lines = ;
close(DB);
# 削除処理
foreach $line (@lines) {
$dflag=0;
($num,$dt,$name,$email,$sub,$com,$url,$host,$pw) = split(/<>/,$line);
if ($FORM{'no'} eq $num){
if ($FORM{'delpas'} eq $master) {$dflag ="1";}
else{
if ($pw eq '') { &error("この記事には削除キーが設定されていません。"); }
$plain_text = $FORM{'delpas'};
&passwd_decode($pw);
if ($check eq 'no') { &error("パスワードが違います"); }
else {$dflag="1";}
}
}
if ($dflag == 0) { push(@new,$line);
}
}
# 記事NOをつける
unshift(@new,$oya);
# ログを更新
open(DB,">$logfile") || &error("Can't write $logfile");
print DB @new;
close(DB);
# ロック解除
# if (-e $lockfile) { unlink($lockfile); }
}
#メールを書く
sub writemail {
#ファイルを開く
open(DB,"$logfile") || &error("Can't open $logfile");
$oya= ;
@lines = ;
close(DB);
foreach $line (@lines) {
$dflag=0;
($num,$dt,$name,$email,$sub,$com,$url,$host,$pw) = split(/<>/,$line);
if ($FORM{'no'} eq $num){
$toname=$name;
last;}
}
&header;
print <<"END";
END
&footer;
exit;
}
sub mailing{
if ($fmail eq ""){&error("あなたのメールアドレスが入力されていません");}
if ($fname eq ""){&error("お名前が入力されていません");}
if ($mailtitle eq ""){&error("メールのタイトルが入力されていません");}
if ($comment eq ""){&error("コメントが入力されていません");}
open(DB,"$logfile") || &error("Can't open $logfile");
$oya= ;
@lines = ;
close(DB);
foreach $line (@lines) {
$dflag=0;
($num,$dt,$name,$email,$sub,$com,$url,$host,$pw) = split(/<>/,$line);
if ($FORM{'no'} eq $num){
$tomail=$email;
$topw=$pw;
last;}
}
$mail_subj = "$titleからメールが届きました";
&jcode'convert(*mail_subj,'jis');
&jcode'convert(*fname,'jis');
&jcode'convert(*mailtitle,'jis');
&jcode'convert(*comment,'jis');
$comment =~ s/ /\n/g;
$comment =~ s/\<\;//g;
open(MAIL,"| $sendmail $tomail") || &error("Can't post sendmail");
print MAIL "X-Mailer: BBS MAILER\n";
print MAIL "To: $tomail\n";
print MAIL "From: $fmail\n";
print MAIL "Subject: $mail_subj\n";
print MAIL "Content-Transfer-Encoding: 7bit\n";
print MAIL "Content-type: text/plain\n\n";
print MAIL "$mail_subj\n";
print MAIL "--------------------------------------------------------\n";
print MAIL "Title $mailtitle\n";
print MAIL "NAME : $fname\n";
print MAIL "EMAIL: $fmail\n";
print MAIL "$comment\n";
print MAIL "--------------------------------------------------------\n";
close(MAIL);
&header;
print <<"END";
メールを送信しました。
このウインドウは閉じてください。 |
END
&footer;
exit;
}
# レス記入モード
sub res{
# ログを読み込む
open(DB,"$logfile") || &error("Can't open $logfile");
$oya= ;
@lines = ;
close(DB);
# 記事抽出
foreach $line (@lines) {
$dflag=0;
($knum,$kdate,$kname,$kmail,$ksbj,$kcom,$kurl,$khost,$kpw,$karea,$kjob,$ksex,$kage,$kres,$kdum)= split(/<>/, $line);
if ($FORM{'no'} eq $knum){
($num,$date,$name,$mail,
$sbj,$com,$url,$host,$pw,$area,$job,$sex,$age,$res,$dum)=($knum,$kdate,$kname,$kmail,$ksbj,$kcom,$kurl,$khost,$kpw,$karea,$kjob,$ksex,$kage,$kres,$kdum);
}
}
# 表示
# 男性か女性かによってカラーセットを変える
if ($sex eq "man") {@tc=@tcm;$sex="♂";}
else {@tc=@tcf;$sex="♀";}
&header;
print <<"END";
END
&footer;
exit;
}
# レス書きこみ処理
sub res_r{
if ($FORM{'delpas'} ne $master) {&error('パスワードが違います');}
if ($comment eq "") { &error("コメントが入力されていません。"); }
# ログを読み込む
open(DB,"$logfile") || &error("Can't open $logfile");
$oya= ;
@lines = ;
close(DB);
# 記事抽出
foreach $line (@lines) {
$dflag=0;
($knum,$kdate,$kname,$kmail,$ksbj,$kcom,$kurl,$khost,$kpw,$karea,$kjob,$ksex,$kage,$kres,$kdum)= split(/<>/, $line);
if ($FORM{'no'} eq $knum){
$line = "$knum<>$kdate<>$kname<>$kemail<>$ksbj<>$kcom<>$kurl<>$khost<>$kpw<>$karea<>$kjob<>$ksex<>$kage<>$comment<>\n";
}
push(@new,$line);
}
# 記事NOをつける
unshift(@new,$oya);
# ログを更新
open(DB,">$logfile") || &error("Can't write $logfile");
print DB @new;
close(DB);
# ロック解除
# if (-e $lockfile) { unlink($lockfile); }
}
# --- クッキーの発行
sub hcookie {
($secgm,$mingm,$hourgm,$mdaygm,$mongm,
$yeargm,$wdaygm,$ydaygm,$isdstgm) = gmtime(time + 60*24*60*60);
$yearg += 1900;
if ($secgm < 10) { $secgm = "0"."$secg"; }
if ($mingm < 10) { $mingm = "0"."$ming"; }
if ($hourgm < 10) { $hourgm = "0"."$hourg"; }
if ($mdaygm < 10) { $mdaygm = "0"."$mdayg"; }
$month = ('Jan','Feb','Mar','Apr','May','Jun',
'Jul','Aug','Sep','Oct','Nov','Dec')[$mong];
$youbi = ('Sunday','Monday','Tuesday','Wednesday',
'Thursday','Friday','Saturday')[$wdayg];
$date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT";
$naiyou="name\:$name\,email\:$email\,url\:$url\,job\:$job\,pwd\:$pwd\,area\:$area\,age\:$age\,sex\:$sex";
print "Set-Cookie: mailbbs=$naiyou; expires=$date_gmt\n";
}
# --- クッキーを取得
sub scookie {
@pairs = split(/\;/, $ENV{'HTTP_COOKIE'});
foreach $pair (@pairs) {
local($name, $value) = split(/\=/, $pair);
$name =~ s/ //g;
$dum{$name} = $value;
}
@pairs = split(/\,/, $dum{'mailbbs'});
foreach $pair (@pairs) {
local($name, $value) = split(/\:/, $pair);
$COOKIE{$name} = $value;
}
$c_name = $COOKIE{'name'};
$c_email = $COOKIE{'email'};
$c_url = $COOKIE{'url'};
$c_pwd = $COOKIE{'pwd'};
$c_sex = $COOKIE{'sex'};
$c_age = $COOKIE{'age'};
$c_area = $COOKIE{'area'};
$c_job = $COOKIE{'job'};
$c_url = "http://".$c_url;
}
|