#!/usr/local/bin/perl ## Honey Board v1.62 (2000/10/08) ## Copyright(C) Kent Web 2000 ## Mail: webmaster@kent-web.com ## Home: http://www.kent-web.com/ $ver = 'Honey v1.62'; # バージョン情報 #--- [注意事項] ------------------------------------------------# # 1. このスクリプトはフリーソフトです。このスクリプトを使用した # # いかなる損害に対して作者は一切の責任を負いません。 # # 2. 設置に関する質問はサポート掲示板にお願いいたします。 # # 直接メールによる質問は一切お受けいたしておりません。 # #---------------------------------------------------------------# #============# # 設定 # #============# # 文字コードライブラリ取込み require './jcode.pl'; # タイトル名 $title = "Meg BBS"; # タイトル文字の色 $t_color = "#DD0000"; # タイトル文字のタイプ $t_face = "MS Pゴシック"; # タイトル文字サイズ(スタイルシートで有効) $t_point = '18pt'; # 本文の文字サイズ(スタイルシートで有効) $b_size = '12px'; # スクリプト名 $script = "./honey.cgi"; # ログファイル名 $logfile = "./honey.log"; # 管理用パスワード $pass = 'caseyjones'; # 最大記事数(これを超える記事は古い順に削除されます) $max = 50; # 戻り先 $home = "../index.html"; # 画像格納ディレクトリ(絶対パスなら http://から記述) $imgurl = "./img"; # 背景色、文字色 $bgrnd = ""; # 壁紙 $bgcol = "#FFFF33"; # 背景色 $text = "#000000"; # 文字色 $link = "#0000FF"; # リンク色:未訪問 $vlink = "#800080"; # リンク色:既訪問 $alink = "#DD0000"; # リンク色:訪問中 # 記事タイトル色 / 記事Noの色 $onepnt = "#008000"; # 文字色 @colors = ('#800000','#DF0000','#008040','#0000FF', '#C100C1','#FF80C0','#FF8040','#000080'); # 記事表示部「下地」の色 (1=白 2=グレー) $oya_sita = 1; # 親記事 $res_sita = 2; # レス記事 # Eメールアドレスの必須入力 (0=no 1=yes) $in_email = 0; # method形式 (POST/GET) $method = 'POST'; # 記事の更新は method=POST 限定 (0=no 1=yes) # --> 連続投稿などの荒らし対策 $MethPost = 1; # 同一IPアドレスからの連続投稿時間(秒数) # --> 連続投稿などの荒らし対策 # --> 値を 0 にするとこの機能は無効になります $wait = 30; # タグ許可 (0=no 1=yes) $tagkey = 0; # URLの自動リンク (0=no 1=yes) # --> タグ許可の場合は no とすること。 $autolink = 1; # 1ページあたりの記事表示件数 $p_log = 7; # レスがついたらツリー毎トップへ移動 (0=no 1=yes) $top_sort = 1; # ホスト名取得に gethostbyaddr関数を使用 (0=no 1=yes) $gethostbyaddr = 0; # ロックファイル機構 (0=no 1=symlink関数 2=open関数) # --> ロックファイル機構を使用する場合ロックファイルを生成するディレクトリ # のパーミッションは 777 に設定する $lockkey = 0; # ロックファイル名 $lockfile = "./honey.lock"; # メール通知機能 # --> 0 : no # --> 1 : yes 自分の投稿記事もメール通知する # --> 2 : yes 自分の投稿記事はメール通知しない $mailing = 2; # sendmailのパス(メール通知する場合) $sendmail = '/usr/lib/sendmail'; # メール通知先アドレス(メール通知する場合) $mailto = 'meg@daruma.co.jp'; # キャラクタを指定(上下の配列はペアで) @icon1 = ( 'aiko.gif','bertha.gif','bigboss.gif','blackpeter.gif','chinacat.gif', 'crazy.gif','daisy.gif','eyesof.gif','foolish.gif','irie.gif', 'kingbee.gif','lazylight.gif','mexicali.gif','aviator.gif','blue.gif', 'peggyo.gif','picassomoon.gif','reuben.gif','shakedown.gif','terrapin.gif'); @icon2 = ( 'Aiko','Bertha','BigBoss','BlackPeter','ChinaCat', 'Crazy','Daisy','EyesoftheWorld','FoolishHeart','Irie', 'KingBee','LazyLight','Mexicali','Aviator','Blue', 'Peggyo','PicassoMoon','Reuben','ShakeDown','Terrapin'); # 管理者用アイコン # --> 管理アイコンを指定する場合は「削除キー」欄に管理用パスワードを # 同時に入力する必要があります。 $mgr_icon = "casejones.gif"; # タグ広告挿入オプション (FreeWebなど) # → の代わりに「広告タグ」を挿入する。 # → 広告タグ以外に、MIDIタグ や LimeCounter等のタグにも使用可能です。 $banner1 = ''; # 掲示板上部に挿入 $banner2 = ''; # 掲示板下部に挿入 # アクセス制限(拒否するホスト名を記述) @deny = ( "anonymizer", "cache*.*.interlog.com", "", "", "", "", "", "", "" ); #============# # 設定完了 # #============# # イメージディレクトリ調整 $imgurl =~ s/\/$//; &decode; &axs_check; if ($mode eq 'regist') { ®ist; } if ($mode eq 'find') { &find; } if ($mode eq 'howto') { &howto; } if ($mode eq 'admin') { &admin; } if ($mode eq 'usrdel') { &usrdel; } if ($mode eq 'image') { ℑ } if ($mode eq 'res') { &res_msg; } &html; #----------------# # アクセス制限 # #----------------# sub axs_check { # ホスト名を取得 &get_host; local($flag)=0; foreach (@deny) { if (!$_) { next; } $_ =~ s/\*/\.\*/g; if ($host =~ /$_/i) { $flag=1; last; } } if ($flag) { &error("アクセスを許可されていません"); } } #----------------# # 記事表示処理 # #----------------# sub html { &header; print "
\n"; if ($banner1 ne "") { print "$banner1

\n"; } # タイトル部 print <<"EOM";
HOME 使い方 ワード検索 meg用
EOM # フォームを表示 &form_view; # ページ区切り処理 $start = $page + 1; $end = $page + $p_log; open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; $i=0; $j=0; while () { ($no,$reno,$date,$name,$mail,$sub,$icon, $icon2,$com,$color,$url,$host,$pw) = split(/<>/); if ($reno eq "") { $i++; $j++; } if ($i < $start) { next; } if ($i > $end) { next; } if ($mail) { $name = "$name"; } if (!$reno && $url) { $url = ""; } elsif ($reno && $url) { $url = "<HOME>"; } # 1マスの大きさ $pix = 18; # 親子記事で幅と色を調整 @GIF1 = ("","wh1.gif","wh2.gif","wh3.gif","wh4.gif","wh5.gif","wh6.gif"); @GIF2 = ("","gy1.gif","gy2.gif","gy3.gif","gy4.gif","gy5.gif","gy6.gif"); if ($reno) { $wide = 350; if ($res_sita == 2) { $iro = "#D6D6D6"; @gif = @GIF2; } else { $iro = "#FFFFFF"; @gif = @GIF1; } } else { $wide = 500; if ($oya_sita == 2) { $iro = "#DEDEDE"; @gif = @GIF2; } else { $iro = "#FFFFFF"; @gif = @GIF1; } } # 記事を表示 if (!$reno) { print "

\n"; } print "\n"; # 反転対象部分1 if (!$flag) { print "\n"; print "
\n"; print "\n"; print "\n"; } else { print "

\n"; print "\n"; } print "\n"; print "\n"; print "\n"; # 反転対象部分2 if ($flag == 0) { print ""; print "\n"; } else { print "\n\n"; } print "\n"; print "\n"; if ($flag == 1) { print "\n"; } print "\n"; # 反転対象部分3 if ($flag == 0) { print "\n"; } print "\n"; print "\n"; print "\n"; if ($flag == 1) { print "\n"; } print "



\n"; print "$sub "; if (!$reno) { print "投稿者:"; } print "$name $date "; print "No\.$no "; if (!$reno) { print "[返信]   \n"; } print "$url
\n"; print "
$com
\n"; print "


 
\n"; if ($flag == 1) { print "
\n"; } print "
\n"; if (!$reno) { if ($flag == 0) { $flag = 1;} else { $flag = 0; } } } close(IN); $next_page = $page + $p_log; $back_page = $page - $p_log; print "
\n"; if ($back_page >= 0) { print "\n"; } if ($next_page < $i) { print "\n"; } print "
\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "【記事削除フォーム】
\n"; print "記事No\n"; print "削除キー\n"; print "\n"; print "

\n"; # 著作権表示(削除不可) print "
$banner2

\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
E-mail:meg\@daruma.co.jp
\n"; print "\n"; print "

\n"; print "\n"; exit; } #----------------# # 書きこみ処理 # #----------------# sub regist { # POST限定 if ($MethPost && !$post_flag) { &error("不正なアクセスです"); } # フォーム内容をチェック if ($in{'name'} eq "") { &error("名前が入力されていません"); } if ($in{'comment'} eq "") { &error("コメントが入力されていません"); } if ($in_email && $in{'email'} !~ /(.+)\@(.+)\.(.+)/) { &error("メールアドレスの入力が不正です"); } # 管理者アイコン処理 if ($in{'icon'} eq "$mgr_icon") { if ($in{'pwd'} ne "$pass") { &error("管理者アイコンは管理者以外は使用できません"); } } # ロック処理 if ($lockkey == 1) { &lock1; } elsif ($lockkey == 2) { &lock2; } open(IN,"$logfile") || &error("Open Error : $logfile","lock"); @lines = ; close(IN); # 記事NO処理 $top = shift(@lines); ($no,$ip,$time2) = split(/<>/, $top); $no++; # 連続投稿チェック if ($addr eq "$ip" && $wait > $times - $time2) { &error("連続投稿はもうしばらく時間をおいて下さい","lock"); } # 削除キーを暗号化 if ($in{'pwd'} ne "") { $PW = &encrypt("$in{'pwd'}"); } # URL自動リンク if ($autolink) { &auto_link($in{'comment'}); } # 親記事の場合 if ($in{'reno'} eq "") { # 最大記事数処理 while ($max <= @lines) { pop(@lines); } unshift(@lines,"$no<><>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'icon'}<>$icon2<>$in{'comment'}<>$in{'color'}<>$in{'url'}<>$host<>$PW<>\n"); unshift(@lines,"$no<>$addr<>$times<>\n"); # 更新 open(OUT,">$logfile") || &error("Write Error : $logfile","lock"); print OUT @lines; close(OUT); } # レス記事の場合:トップソートあり elsif ($in{'reno'} && $top_sort) { $match=0; @new=(); @tmp=(); foreach (@lines) { ($no2,$reno2) = split(/<>/); if ($in{'reno'} eq "$no2") { $match=1; push(@new,$_); } elsif ($in{'reno'} eq "$reno2") { push(@new,$_); } elsif ($match == 1 && $in{'reno'} ne "$reno2") { $match=2; push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'icon'}<>$icon2<>$in{'comment'}<>$in{'color'}<>$in{'url'}<>$host<>$PW<>\n"); push(@tmp,$_); } else { push(@tmp,$_); } } if ($match == 1) { push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'icon'}<>$icon2<>$in{'comment'}<>$in{'color'}<>$in{'url'}<>$host<>$PW<>\n"); } push(@new,@tmp); # 更新 unshift(@new,"$no<>$addr<>$times<>\n"); open(OUT,">$logfile") || &error("Write Error : $logfile","lock"); print OUT @new; close(OUT); } # レス記事の場合:トップソートなし else { $match=0; @new=(); foreach (@lines) { ($no2,$reno2) = split(/<>/); if ($match == 0 && $in{'reno'} eq "$no2") { $match=1; } elsif ($match == 1 && $in{'reno'} ne "$reno2") { $match=2; push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'icon'}<>$icon2<>$in{'comment'}<>$in{'color'}<>$in{'url'}<>$host<>$PW<>\n"); } push(@new,$_); } if ($match == 1) { push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'icon'}<>$icon2<>$in{'comment'}<>$in{'color'}<>$in{'url'}<>$host<>$PW<>\n"); } # 更新 unshift(@new,"$no<>$addr<>$times<>\n"); open(OUT,">$logfile") || &error("Write Error : $logfile","lock"); print OUT @new; close(OUT); } # ロック解除 if (-e $lockfile) { unlink($lockfile); } if ($in{'cook'} eq 'on') { &set_cookie; } # メール通知処理 if ($mailing == 1) { &mail_to; } elsif ($mailing == 2 && $email ne "$mailto") { &mail_to; } } #--------------# # ワード検索 # #--------------# sub find { &header; print <<"HTML";
 ワード検索 HOME | 掲示板に戻る

  • 検索したいキーワードを入力し、検索領域を選択して「検索ボタン」を押してください。
  • キーワードは「半角スペース」で区切って複数指定することができます。

キーワード
検索条件 AND OR
HTML # ワード検索の実行と結果表示 if ($in{'word'} ne "") { # 入力内容を整理 $in{'word'} =~ s/ / /g; @pairs = split(/\s+/, $in{'word'}); # 検索処理 print "
    \n"; open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; $i=0; while () { $flag=0; foreach $pair (@pairs) { if (index($_,$pair) >= 0) { $flag=1; if ($in{'cond'} eq 'or') { last; } } else { if ($in{'cond'} eq 'and') { $flag=0; last; } } } if ($flag == 0) { next; } # 結果を表示 $i++; ($no,$reno,$date,$name,$mail,$sub, $icon,$icon2,$com,$res,$url,$host,$pw) = split(/<>/); if ($mail) { $name = "$name"; } if ($url) { $url = "http://$url"; } print "
  1. [$no] 投稿者:$name 投稿日:$date
    \n"; print "
    $com

    $url


    \n"; } close(IN); print "検索結果は $i件です。\n"; print "
\n"; } print "\n"; exit; } #--------------# # 管理モード # #--------------# sub admin { if ($in{'pass'} ne "" && $in{'pass'} ne "$pass") { &error("パスワードが違います"); } &header; print <<"EOM";
 meg用 HOME | 掲示板に戻る
EOM if ($in{'pass'} eq "") { print "

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

\n"; print "
\n"; print "\n"; print "\n"; print ""; print "\n"; print "
\n"; } else { # 削除処理 if ($DEL[0]) { # ロック処理 if ($lockkey == 1) { &lock1; } elsif ($lockkey == 2) { &lock2; } # 削除情報をマッチングし更新 @new=(); open(IN,"$logfile") || &error("Open Error : $logfile","lock"); $top = ; while () { $flag=0; ($no,$reno,$date) = split(/<>/); foreach $del (@DEL) { if ($no eq "$del" || $reno eq "$del") { $flag=1; last; } } if ($flag == 0) { push(@new,$_); } } close(IN); # 更新 unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error : $logfile","lock"); print OUT @new; close(OUT); # ロック解除 if (-e $lockfile) { unlink($lockfile); } } # 管理を表示 if ($page eq "") { $page = 0; } print "

\n"; print "
  • 削除する記事のチェックボックスにチェックを入れ、削除ボタンを押して下さい。\n"; print "
  • 親記事を削除するとレス記事も一括して削除されます。
\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print ""; print "\n"; print "

\n"; print ""; print "\n"; # ページ区切り処理 $start = $page + 1; $end = $page + $p_log; open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; $i=0; $j=0; while () { ($no,$reno,$date,$name,$mail,$sub,$icon, $icon2,$com,$color,$url,$host,$pw) = split(/<>/); if ($reno eq "") { $i++; $j++; } if ($i < $start) { next; } if ($i > $end) { next; } if ($mail) { $name="$name"; } ($date,$dmy) = split(/\(/, $date); if ($url) { $url = "Home"; } else { $url = '-'; } $com =~ s/
//ig; $com =~ s//>/g; if (length($com) > 50) { $com = substr($com,0,48); $com = "$com" . "..."; } if ($reno eq "") { print "
\n"; } # 削除チェックボックス print ""; print ""; print ""; print ""; print "\n"; } close(IN); print "\n"; print "
削除記事NO投稿日タイトル投稿者URLコメントホスト名

$no$date$sub$name$url$com$host

\n"; } $next_page = $page + $p_log; $back_page = $page - $p_log; print "

\n"; if ($back_page >= 0) { print "\n"; } if ($next_page < $i) { print "\n"; } print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "

\n"; print "\n"; exit; } #--------------------# # 返信レスフォーム # #--------------------# sub res_msg { &header; print <<"EOM";
 返信モード HOME | 掲示板に戻る
EOM open(IN,"$logfile") || &error("Open Error : $logfile"); $top = ; while () { ($no,$reno,$date,$name,$mail,$sub,$icon, $icon2,$com,$color,$url,$host,$pw) = split(/<>/); if ($in{'no'} eq "$no" || $in{'no'} eq "$reno") { if ($mail) { $name = "$name"; } if ($url) { $url = "<Home>"; } # レス題名用 if ($reno eq "") { $res_sub = "Re: $sub"; } print "$sub $name - $date $url

\n"; print "

$com

\n"; } } close(IN); &form_view("$in{'no'}"); print "
\n"; print "\n"; exit; } #--------------# # 使い方表示 # #--------------# sub howto { &header; print <<"EOM";
 使い方 HOME | 掲示板に戻る

  1. この掲示板はクッキー対応です。1度記事を投稿いただくと、おなまえ、Eメール、URL、削除キーの情報は2回目以降は自動入力されます。(ただし利用者のブラウザがクッキー対応の場合)

    EOM if ($tagkey) { print "

  2. メッセージ欄には、タグ使用をすることができます。

    \n"; } else { print "

  3. 投稿記事には、タグは一切使用できません。

    \n"; } if ($in_email) { print "

  4. 記事を投稿する上での必須入力項目は「おなまえ」「メッセージ」「Eメール」です。URLと削除キーは任意です。

    \n"; } else { print "

  5. 記事を投稿する上での必須入力項目は「おなまえ」「メッセージ」です。Eメール、URL、削除キーは任意です。

    \n"; } print <<"EOM";

  6. 記事には、半角カナは一切使用しないで下さい。文字化けの原因となります。

  7. 記事の投稿時に「削除キー」にパスワード(英数字で8文字以内)を入れておくと、その記事は次回削除キーによって削除することができます。

  8. 記事の保持件数は最大 $max件です。それを超えると古い順に自動削除されます。

  9. 過去の投稿記事から「キーワード」によって簡易検索ができます。トップメニューの「ワード検索」のリンクをクリックすると検索モードとなります。

  10. 管理者が著しく不利益と判断する記事や他人を誹謗中傷する記事は予\告なく削除することがあります。
EOM exit; } #------------------# # ユーザ記事削除 # #------------------# sub usrdel { # POST限定 if ($MethPost && !$post_flag) { &error("不正なアクセスです"); } if ($in{'no'} eq '' || $in{'pwd'} eq '') { &error("削除Noまたは削除キーが入力モレです"); } # ロック処理 if ($lockkey == 1) { &lock1; } elsif ($lockkey == 2) { &lock2; } open(IN,"$logfile") || &error("Open Error : $logfile"); @lines = ; close(IN); $top = shift(@lines); $flag=0; foreach (@lines) { ($no,$reno,$date,$name,$mail,$sub,$icon, $icon2,$com,$color,$url,$host,$pw) = split(/<>/); if ($flag == 0 && $in{'no'} eq "$no") { $PW = $pw; if ($reno eq "") { $flag=2; } else { $flag=1; } } elsif ($flag == 2 && $in{'no'} eq "$reno") { next; } else { push(@new,$_); } } if ($flag == 0) { &error("該当記事が見当たりません","lock"); } if ($PW eq '') { &error("該当記事には削除キーが設定されていません","lock"); } # 削除キーを照合 $check = &decrypt("$in{'pwd'}", "$PW"); if ($check ne 'yes') { &error("削除キーが違います","lock"); } else { # 更新 unshift(@new,$top); open(OUT,">$logfile") || &error("Write Error : $logfile","lock"); print OUT @new; close(OUT); # ロック解除 if (-e $lockfile) { unlink($lockfile); } } } #----------------# # デコード処理 # #----------------# sub decode { $post_flag=0; if ($ENV{'REQUEST_METHOD'} eq "POST") { $post_flag=1; if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます"); } read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach (@pairs) { ($name,$value) = split(/=/); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # S-JISコード変換 &jcode'convert(*value, "sjis", "", "z"); # タグ処理 if ($tagkey == 0) { $value =~ s/\&/&/g; $value =~ s//>/g; } else { $value =~ s/<>/<>/g; $value =~ s///g; } # 改行処理 if ($name eq 'comment') { $value =~ s/\r\n/
/g; $value =~ s/\r/
/g; $value =~ s/\n/
/g; } else { $value =~ s/\r//g; $value =~ s/\n//g; } # 削除情報 if ($name eq 'del') { push(@DEL,$value); } $in{$name} = $value; } if ($in{'sub'} eq "") { $in{'sub'} = "無題"; } $in{'url'} =~ s/^http\:\/\///; $mode = $in{'mode'}; $page = $in{'page'}; # 日時の取得 $ENV{'TZ'} = "JST-9"; $times = time; ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($times); # 日時のフォーマット @week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); $date = sprintf("%04d\/%02d\/%02d(%s) %02d\:%02d", $year+1900,$mon+1,$mday,$week[$wday],$hour,$min); } #--------------# # HTMLヘッダ # #--------------# sub header { $head_flag = 1; # ヘッダ表示フラグ print "Content-type: text/html\n\n"; print <<"EOM"; $title EOM } #------------------------------------# # ブラウザ情報からフォーム長を定義 # #------------------------------------# sub get_agent { $agent = $ENV{'HTTP_USER_AGENT'}; if ($agent =~ /MSIE 4/i || $agent =~ /MSIE 5/i) { $f_name = 28; $f_sub = 35; $f_url = 63; $f_cols = 58; } else { $f_name = 20; $f_sub = 25; $f_url = 42; $f_cols = 55; } } #--------------# # エラー処理 # #--------------# sub error { if ($_[1] eq "lock" && -e $lockfile) { unlink($lockfile); } &header if (!$head_flag); print "


ERROR !

\n"; print "

$_[0]\n"; print "


\n"; print "\n"; exit; } #------------------# # クッキーの発行 # #------------------# sub set_cookie { ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg) = gmtime(time + 60*24*60*60); @mons = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); $date_g = sprintf("%s, %02d\-%s\-%04d %02d\:%02d\:%02d GMT", $week[$wdayg],$mdayg,$mons[$mong],$yearg+1900,$hourg,$ming,$secg); $cook="name\:$in{'name'}\,email\:$in{'email'}\,url\:$in{'url'}\,pwd\:$in{'pwd'}\,color\:$in{'color'}\,icon\:$in{'icon'}"; print "Set-Cookie: HONEY=$cook; expires=$date_g\n"; } #------------------# # クッキーを取得 # #------------------# sub get_cookie { local($key, $val); $cookies = $ENV{'HTTP_COOKIE'}; @pairs = split(/;/, $cookies); foreach (@pairs) { ($key, $val) = split(/=/); $key =~ s/\s//g; $DUMMY{$key} = $val; } @pairs = split(/,/, $DUMMY{'HONEY'}); foreach (@pairs) { ($key, $val) = split(/:/); $COOKIE{$key} = $val; } $c_name = $COOKIE{'name'}; $c_email = $COOKIE{'email'}; $c_url = $COOKIE{'url'}; $c_pwd = $COOKIE{'pwd'}; $c_icon = $COOKIE{'icon'}; $c_color = $COOKIE{'color'}; if ($in{'cook'} eq 'on') { if ($in{'name'}) { $c_name = $in{'name'}; } if ($in{'email'}) { $c_email = $in{'email'}; } if ($in{'url'}) { $c_url = $in{'url'}; } if ($in{'pwd'} ne "") { $c_pwd = $in{'pwd'}; } if ($in{'icon'}) { $c_icon = $in{'icon'}; } if ($in{'color'}) { $c_color = $in{'color'}; } } } #----------------# # ホスト名取得 # #----------------# sub get_host { $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($gethostbyaddr) { if ($host eq "" || $host eq "$addr") { $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2); } } if ($host eq "") { $host = $addr; } } #----------------------# # パスワード暗号処理 # #----------------------# sub encrypt { local($inpw) = $_[0]; local(@SALT, $salt, $encrypt); @SALT = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/'); srand; $salt = $SALT[int(rand(@SALT))] . $SALT[int(rand(@SALT))]; $encrypt = crypt($inpw, $salt) || crypt ($inpw, '$1$' . $salt); return $encrypt; } #----------------------# # パスワード照合処理 # #----------------------# sub decrypt { local($inpw, $logpw) = @_; local($salt, $key, $check); $salt = $logpw =~ /^\$1\$(.*)\$/ && $1 || substr($logpw, 0, 2); $check = "no"; if (crypt($inpw, $salt) eq "$logpw" || crypt($inpw, '$1$' . $salt) eq "$logpw") { $check = "yes"; } return $check; } #--------------------------------# # ロックファイル : symlink関数 # #--------------------------------# sub lock1 { local($retry) = 5; while (!symlink(".", $lockfile)) { if (--$retry <= 0) { &error("LOCK is BUSY","lock"); } sleep(1); } } #-----------------------------# # ロックファイル : open関数 # #-----------------------------# sub lock2 { local($flag) = 0; foreach (1 .. 5) { if (-e $lockfile) { sleep(1); } else { open(LOCK,">$lockfile") || &error("Write Error : $lockfile","lock"); close(LOCK); $flag = 1; last; } } if ($flag == 0) { &error("LOCK is BUSY","lock"); } } #--------------# # メール送信 # #--------------# sub mail_to { # メールタイトルを定義 $MailSub = "[$title : $no] $in{'sub'}"; # 記事の改行・タグを復元 $com = $in{'comment'}; $com =~ s/
/\n/g; $com =~ s/&/&/g; $com =~ s/<//g; # メール本文を定義 $MailBody = <<"EOM"; 投稿日時:$date ホスト名:$host ブラウザ:$ENV{'HTTP_USER_AGENT'} 投稿者名:$in{'name'} Eメール:$in{'email'} URL :$in{'url'} タイトル:$in{'sub'} 投稿記事: $com EOM # JISコード変換 &jcode'convert(*MailSub,'jis'); &jcode'convert(*MailBody,'jis'); # メールアドレスがない場合はダミーメールに置き換え if ($in{'email'} eq "") { $email = 'nomail@xxx.xxx'; } else { $email = $in{'email'}; } if (!open(MAIL,"| $sendmail -t")) { &error("メール送信に失敗しました"); } print MAIL "To: $mailto\n"; print MAIL "From: $email\n"; print MAIL "Subject: $MailSub\n"; print MAIL "MIME-Version: 1.0\n"; print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n"; print MAIL "Content-Transfer-Encoding: 7bit\n"; print MAIL "X-Mailer: $ver\n\n"; print MAIL "--------------------------------------------------------\n"; print MAIL "$MailBody\n"; print MAIL "--------------------------------------------------------\n"; close(MAIL); } #----------------# # イメージ表示 # #----------------# sub image { &header; print "

\n"; print "イメージ画像サンプル\n"; print "

現在登録されているイメージ画像は以下のとおりです\n"; print "


\n"; print "

\n"; $i=0; $j=0; $stop = @icon1; foreach (0 .. $#icon1) { $i++; $j++; print "\n"; if ($i >= 5) { print ''; $i=0; } if ($j eq "$stop") { if ($i == 0) { last; } while ($i < 5) { print ""; $i++; } } } print "
$icon2[$_]


\n"; print "

\n"; print "\n"; exit; } #--------------# # 自動リンク # #--------------# sub auto_link { $_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+)/$1$2<\/a>/g; } #----------------# # 投稿フォーム # #----------------# sub form_view { # ブラウザ情報を取得 &get_agent; # クッキー情報を取得 &get_cookie; print "
\n"; if ($mode eq "res") { print "\n"; } print <<"EOM";
おなまえ
Eメール
タイトル  
メッセージ
URL
イメージ [アイコン参照]
削除キー (記事の削除時に使用)
文字色 EOM if ($c_color eq "") { $c_color = $colors[0]; } foreach (0 .. $#colors) { if ($c_color eq "$colors[$_]") { print ""; print " \n"; } else { print ""; print " \n"; } } if ($_[0]) { print "\n"; } print "
\n"; print " "; print "クッキーを保存\n"; print "
\n"; print "
\n"; }