#!/usr/local/bin/perl

#----------------------------------------------------------
# version 1.1
#
# 2002.06.01 :
#  投稿があったら指定アドレスに内容をメールする機能の追加(sendmail利用)
#----------------------------------------------------------

#----------------------------------------------------------
# インクルード

require 'jcode.pl';

#----------------------------------------------------------
# 初期設定

$bbs_title = "EasyBBS Ver 1.1";                            # BBSのタイトル
$title_color = "#008040";                                  # タイトルの色
$title_size = 6;                                           # タイトルの文字サイズ
$title_image = "";                                         # タイトル画像

$max = 50;                                                 # 最大保存件数

$com_color = "#CC0000";                                    # コメント(題名）の色
$bk_color = "#FFFFFF";                                     # 背景色
$bk_image = "";                                            # 背景画像
$tx_color = "#000000";                                     # テキスト色
$logfile = 
  "/home/fujio/public_html/jp/bbs/lab/fujii/fujii.log";    # ログデータ格納ファイル

$method = 'POST';                                          # データの取得形式

# メール転送関係
$SendMailExecute = 1;                                      # メール転送実行フラグ(実行:1,禁止0)
$SendMailPath = "/usr/lib/sendmail -t";                    # sendmailのパス(システム依存)
$RecipientAddress = 'fujio@cce.numazu-ct.ac.jp';           # 送信先メールアドレス(英語のみ)
$MailFromAddres = 'fujii@marsbrain.com';                   # 送信元メールアドレス(英語のみ)
$MailSubject = "EasyBBS Post Announcement";                # メールタイトル

#----------------------------------------------------------
# メイン処理

# 入力データの解析
&input_decode;                                             # 入力データを %form に格納
# 入力データのログファイルへの登録
if($form{'mode'} eq 'write'){                              # 書き込みモードならばログファイル更新
  &regist_log;                                             # logfileの更新
  &send_mail;                                              # メールの送信
}
# ログファイルのHTML出力
&out_header;                                               # HTMLヘッダーの出力
&out_contents;                                             # ログファイルの中身をHTML形式で出力

#----------------------------------------------------------
# サブルーチン

#--- 入力の解析 ---
sub input_decode{
  # ローカル変数の定義
  local($name, $value, @pairs);
  # 入力データの取得
  if( $ENV{'REQUEST_METHOD'} eq $method ){
    read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});           # POSTでのデータ受け取り
  }else{
    $buffer = $ENV{'QUERY_STRING'};                         # GETでのデータ受け取り
  }
  # 入力データの有無チェックとデータ解析
  if($buffer eq ""){                                        # データが無い場合は READ
    $form{'mode'} = 'read';                                
  }else{                                                    # データがある場合は分析し WRITE
    $form{'mode'} = 'write';
    # データの分解
    @pairs = split(/&/,$buffer);
    # 個別データの取り出しと使用禁止タグの除去
    foreach $pair (@pairs){
      ($name,$value) = split(/=/,$pair);
      $value =~ tr/+/ /;
      $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
      # S-JISコードへの変換
      &jcode'h2z_sjis(*value);                               # 半角を全角にする
      &jcode'convert(*value,sjis);                           # Shift_JISに変換す
      # 使用禁止タグコードの除去
      $value =~ s/&/&amp;/g;                                 # & の除去
      $value =~ s/"/&quot;/g;                                # " の除去
      $value =~ s/</&lt;/g;                                  # < の除去
      $value =~ s/>/&gt;/g;                                  # > の除去
      $value =~ s/\n//g;                                     # 改行の除去
      # データの格納
      $form{$name} = $value;
    }
  }
}

#--- ログファイルへの書き込み ---
sub regist_log{
  # ローカル変数の定義
  local($name,$mail,$sub,$com);
  # フォーム入力内容の確認(名前とコメントは必須)
  if($form{'name'} eq ""){ &error("名前が入力されていません"); }
  if($form{'comment'} eq ""){ &error("コメントが入力されていません"); }
  # 時間データの取得($dateに格納)
  &get_time;
  # ログファイルデータの取得
  open(LOG,"$logfile") || &error("ログファイル$logfileがオープンできません[0]");
  @lines = <LOG>;
  close(LOG);
  # データの更新(先頭に新規データ挿入)データの区切りは"<>"とする
  unshift(@lines, "$date<>$form{'title'}<>$form{'name'}<>$form{'mail'}<>$form{'homepage'}<>$form{'comment'}<>\n");
  # データ数の制限チェック
  if( $#lines >= $max-1 ){ pop(@lines);}                   # 最大件数を超えたデータを削除 
  # ログファイルへの格納
  open(LOG,">$logfile") || &error("ログファイル$logfileが書き込みでオープンできません");
  print LOG @lines;
  close(LOG);
}

#--- 日付取得 ---
sub get_time{
  local($sec,$min,$hour,$mday,$month,$year,$yday,$isdst);  # ローカル変数の定義
  # 時刻の取得
  ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(time);
  # 曜日データの作成
  @week = ('日','月','火','水','木','金','土');
  $wday = $week[$wday];
  # データ作成と桁数合わせ(２桁)
  $month += 1;
  $year += 1900;
  return $date = sprintf("%d年 %d月 %02d日(%s) %02d時 %02d分 %02d秒"
                         ,$year,$month,$mday,$wday,$hour,$min,$sec);
}

#--- ヘッダー出力 ---
sub out_header{
  print "Content-type: text/html\n\n";
  print "<html><head>";
  print "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=Shift_JIS\">";
  print "<title>$bbs_title</title></head>";
  print "<BODY background=\"$bk_image\" bgcolor=\"$bk_color\" text=\"tx_color\">";
  if($title_image ne  ""){
    print "<img src=\"$title_image\" alt=\"bbs_title\">";
  }
}

#--- ログファイルの中身をHTML形式で出力 ---
sub out_contents{
  local($date,$title,$name,$mail,$homepage,$comment);      # ローカル変数の定義
  open (LOG, "$logfile") || &error("ログファイル$logfileがオープンできません[1]");
  while(<LOG>){
    # １データを要素に区切る
    ($date,$title,$name,$mail,$homepage,$comment) = split(/<>/);
    # 要素の書き出し
    print "<b>タイトル:　$title</b><br>";                  # タイトルの書き出し
    print "<b>名前:　$name　　　</b>";                     # 名前の書き出し
    # メイルアドレス、ホームページの有無により１行のデータを作成する
    $ref = "";
    if($mail ne ""){                                       # mailデータがあるか
      $ref = $ref . "<a href = \"mailto:$mail\">email</a>　　";
    }
    if($homepage ne "http://"){                            # homepageデータがあるか
      $ref = $ref . "<a href = \"$homepage\" target=_blank>URL</a>";
    }
    if($ref ne ""){                                        # mail/URLのどちらかのデータがあるか
      print $ref;
      print "<br>";
    }
    print "投稿:　$date<br>";                              # 投稿データ
    $comment =~ s/\r/<br>/g;                               # 改行の挿入
    print "<font color=\"$tx_color\"><br>$comment</font><hr>";
  }
  close(LOG);
  print "<h6>EasyBBS lite Version 1.1 Copyright Fujio Lab.</h6>";
  print "</body></html>\n";                                # タグ出力
}

#--- メールの送信 ---
sub send_mail{
  local($fname,$fcheck);
  if($SendMailExecute){                                     # メールを送る必要があるかのチェック
    # S-JISコードからJISコード(mailのデフォルトコード)への変換
    &jcode'convert(*MailSubject,jis);                       # メールのタイトルをJIS化
    foreach $value(values %form){                           # 全項目について行う
      &jcode'convert(*value,jis);                           # 項目の内容をJIS化
    }
    # メールの転送
    $fcheck = open(MAIL,"|$SendMailPath $RecipientAddress");
    if(!$fcheck){
      &error("メールファイルがオープンできません [$fcheck]");
    }
    print MAIL "To: ",$RecipientAddressk,"\n";              # 送信先の設定
    print MAIL "From: ",$MailFromAddres,"\n";               # 送信元の設定
    print MAIL "Subject: ",$MailSubject,"\n","\n";          # メールのタイトル
    print MAIL "<date>:","\n",$date,"\n";                   # 投稿日時
    print MAIL "<title>:","\n",$form{'title'},"\n";         # タイトル
    print MAIL "<name>:","\n",$form{'name'},"\n";           # 名前
    print MAIL "<mail>:","\n",$form{'mail'},"\n";           # メールアドレス
    print MAIL "<homepage>:","\n",$form{'homepage'},"\n";   # URL
    print MAIL "<comment>:","\n",$form{'comment'},"\n";     # 投稿内容
    print MAIL "\n";
    close MAIL;
  }
}
    
#--- エラー処理 ---
sub error{
  &out_header;                                             # ヘッダー出力
  local($msg) = @_;                                        # エラーメッセージの設定
  print "<center><h2>Error</h2><br><br>\n";                # タグ出力
  print "<h3>$msg</h3>\n</body></html>\n";
  exit;
}

