#! /usr/bin/perl require 'a_deny.cgi'; # ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ # めーるBBS ver. 3.00 #        copyright hikotaka 2000 # WEB:http://tac-labo.pekori.to/ # MAIL:tac-labo@pekori.to # special thanks!! Hiroki http://www.interq.or.jp/punk/hrkxxxxx/ # ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ # 管理人の連絡先 $adminmail='info@yuni-net.com'; # 設置URLを、http:///〜から記述 $setti='http://www.yuni-net.com/mailbbs/mailbbs.cgi'; # 戻り先の名前 「〜〜に戻る」の「〜〜」の部分 $web='トップページ'; # 「戻る」の行き先(index.htmlなど) $homepage = 'http://www.yuni-net.com/'; # 掲示板のタイトル $title = 'ゆにちゃ♪メル友募集(^^)'; # sendmailのパス $sendmail = '/usr/sbin/sendmail'; # 最大記事保持数 (あまり多くしない方がいいです) $max = 100; # 管理用パスワード(半角英数字) $master = '1123'; # 管理者レス機能(1=あり 0=無し) $res_key='1'; # レス機能が「あり」のとき、アイコン画像の名前を入力。 $icon = './rotedama.gif'; # アイコンを使わない場合は、上の欄をそのままにして、 # 代わりに表示する文字を下に入力。(短くした方がいいと思います。) $ad_na = 'from
 管理者'; ##########この先は必要に応じて指定して下さい # 投稿確認メールの送付(0:無し 1:有り) $kakunin='1'; # タイトルにGIF画像を使用する場合はhttp://から書いてください $title_gif = ''; $tg_w = '150'; # 幅 $tg_h = '50'; # 高さ # タグについて(0=許可しない 1=タグOK) $tag = '0'; # URLの自動リンク (0=つかわない 1=つかう) # タグを許可する場合は0にしてください $autolink = 1; # 本体のスクリプトファイル名 $script = 'mailbbs.cgi'; # ログファイル名 $logfile = './mailbbs.log'; # 1ページ当たりの記事表示数 $pagelog = 15; # 特定のサイトからのアクセスを防止するときはhttp://からのURLを書く $deny = '.'; # 選択項目の編集 # 選択項目1(サンプルでは職業)を編集します。 # 選択項目名(ここでは「職業」)を一番最初に書きます # その後、各選択肢を「'」で囲んで、「,」で区切って書いていきます。 # 注意:最後の「)」と「;」を忘れないで下さいね。 @joblist = ('職業','中学生','高校生','大学生','専門学校生','短大生','社会人','その他'); # 選択項目2(サンプルでは地域) # 上と同じ要領で設定してください @arealist = ('地域','北海道','東北','関東','甲信越','中部','北陸','東海','関西','中国','四国','九州','沖縄','海外'); # 選択項目3(サンプルでは年齢) @agelist = ('年齢','秘密','〜9歳','10代','20代','30代','40代','50代','60代','それ以上'); # 選択項目1(サンプルは職業)の記入は必要か # (1:必要 0:強制ではない) # (1=「必要」にすると、選ばれていない場合、 # 記入するように警告されます。) $job_key = '0'; # 選択項目2(サンプルでは地域)は必要か(上に同じ) $area_key = '1'; # 選択項目3(サンプルでは年齢)は必要か(上に同じ) $age_key = '1'; require './jcode.pl'; # 処理分岐 &form; if ($mode eq "mail") { &writemail; } if ($mode eq "mailing") {&mailing;} if ($mode eq "msg") { ®ist; } if ($mode eq "del") { &del; } if ($mode eq "res") { &res; } if ($mode eq "res_resist") { &res_r; } &log; # ログの書き出し sub log{ # ログを読み込む open(IN,"$logfile") || &error("$logfileがひらけませ〜ん"); @logs = ; close(IN); shift(@logs); # &scookie; if ($c_url eq ""){$c_url = "http\:\/\/";} if ($icon) {$ico = "";} else {$ico = "$ad_na";} @new = (); foreach $log (@logs) { local($num,$date,$name,$mail, $subj,$com,$url,$host,$pw,$area,$job,$sex,$age,$res) = split(/<>/,$log); push(@new,$log); } # 女性 @tcf=("atbf","atf","sbjf"); # 男性 @tcm=("atbm","atm","sbjm"); &header; if ($title_gif eq '') { print "
"; print "

$title

\n"; } else { print "
\n"; } if ($kakunin eq "1"){print '投稿と同時に、あなたのアドレスに確認メールが届きます。アドレス間違いにご注意! ';} print <<"END";
$webに戻る
お名前
メールアドレス
END if ($c_sex eq "man") {$mch = "selected";} if ($c_sex eq "woman") {$wch = "selected";} 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";
$sbj $date
おなまえ $name($sex) $age $job $area
$com $res_msg
$url めーるを書く $res_link
END $res_msg=""; } print "
\n"; # ページがえ $tugi = $page_end + 1; $maelog = $page - $pagelog; # 前頁処理 if ($maelog >= 0) { print "\n"; } # 次頁処理 if ($page_end ne $end_data) { print "\n"; } print "
\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; 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; } 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
"; print "★mailBBS by hikotaka★\n"; 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";

$tonameさんへメールを送ります


お名前

メールアドレス

タイトル

内容


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";
★$sbj $date
おなまえ $name($sex) $age $job $area
$com $res_msg
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; }