#!/usr/bin/perl

#--------------------------------------------------------------------#
#	JS WEB MAIL
#	WEBメール(webmail.cgi)
#	Since      : 1999/11/19
#	Programing : JUNICHI SASAKI
#	E-mail     : CHERRY@MAKIZOU.COM
#	URL        : http://www.makizou.com/cherry/
#	Copyright (C) 1999 JUNICHI SASAKI. All rights reserved.
#--------------------------------------------------------------------#

#### 初期値 ##########################################################

$version = 'JS WEB MAIL ver1.01';
require 'jcode.pl';			#日本語コード変換ライブラリ
$title      = 'Tetish dog mail';	#WEB MAILのタイトル
$method     = 'POST';			#methodの形式
$cgifile    = 'webmail.cgi';		#CGIファイル名
$htmlmain   = 'mail.html';		#表示用HTMLファイル名
$htmlcheck  = 'check.html';		#確認用HTMLファイル名
$htmlfollow = 'follow.html';		#完了用HTMLファイル名
$cookei     = 'JsWebMail';		#クッキーのタイトル
$expdays    = '90';			#クッキーの保存日数
$now_time   = time;			#現在の時刻(秒)
$time_diff  = '0';			#時差修正(単位は秒)
$m_sendmail = '/usr/lib/sendmail';			#sendmailのパス
$m_mailto   = 'tetsu@tetish.com';	#メールの宛先
$m_subject  = 'dog mail';		#メールの表題に含ませる表題


#### 本文(メイン) ####################################################

#メイン処理
&FORM_DECODE;
if($input{'MODE'} eq 'CHECK'){
    &CHECK_INPUT_DATA1;			#入力メッセージ確認処理
    &SHOW_CHECK;
}elsif($input{'MODE'} eq 'SEND'){
    &MAIL;				#メール送信処理
}else{
    &SHOW;				#記事表示処理
}
exit;


#### 本文(サブ１) ####################################################

#デコード処理
sub FORM_DECODE {
    if($ENV{'REQUEST_METHOD'} eq 'GET'){
	$query_string = $ENV{'QUERY_STRING'};
    }elsif($ENV{'REQUEST_METHOD'} eq 'POST'){
        read(STDIN,$query_string,$ENV{'CONTENT_LENGTH'});
        if($ENV{'CONTENT_LENGTH'} > 51200){&ERROR('投稿量が大きすぎます');}
    }else{
        &ERROR('Status: 500 Server Error');
    }
    my @key_value_plus = split(/&/,$query_string);
    foreach(@key_value_plus){
        ($key,$value) = split(/=/, $_);
        $key =~ tr/+/ /;
        $key =~ tr/,/_/;
        $key =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg;
          &jcode'convert(*key,'euc');
        $value =~ tr/+/ /;
        $value =~ tr/,/_/;
        $value =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg;
          &jcode'convert(*value,'euc');
        $value =~ s/\"/&quot;/g;
        $value =~ s/&/&amp;/g;
        $value =~ s/</&lt;/g;
        $value =~ s/>/&gt;/g;
        $value =~ s/`/\'/g;
        $value =~ s/,/，/g;
        $input{$key} = $value;
    }
    $copy = q(<A href="http://www.makizou.com/cherry/" target="_blank"><FONT size="1">&copy; JS WEB MAIL</FONT></A>);
    $input{'URL'} =~ s/^http\:\/\///;
    $input{'MESSAGE'} =~ s/\r\n|\n|\r/<BR>/g;
    while($input{'MESSAGE'} =~ /<BR>$/){$input{'MESSAGE'} =~ s/<BR>$//;}
}

#入力メッセージ確認処理1
sub CHECK_INPUT_DATA1 {
    if($input{'NAME'} =~ /^$/)
        {&ERROR('名前が入力されていません');}
    if($input{'MESSAGE'} =~ /^$/)
        {&ERROR('メッセージが入力されていません');}
    if(($input{'MAIL'} !~ /^$/)
    && ($input{'MAIL'} !~ /([#-9A-~\-\_]+\@[#-9A-~\-\_\.]+)/))
        {&ERROR('メールアドレスは正確に入力して下さい');}
    if($input{'URL'}){$input{'URL'} = "http://$input{'URL'}";}
    if(($input{'URL'} !~ /^$/)
    && ($input{'URL'} !~ /([^=^\"]|^)(http:[!#-9A-~]+)/))
        {&ERROR('URLは正確に入力して下さい');}
}

#入力メッセージ確認メッセージ表示
sub SHOW_CHECK {
    $message = $input{'MESSAGE'};
    $message =~ s/<BR>/\n/g;
    open(HTML,"$htmlcheck") or die "Can't open $htmlcheck";
    print "Content-type: text/html\n\n";
    while(<HTML>){
        if(/\@/){
            if(/\@COPY\@/){$copy_flg = 1;}
            s/\@TITLE\@/$title/g;
            s/\@METHOD\@/$method/g;
            s/\@CGIFILE\@/$cgifile/g;
            s/\@NAME\@/$input{'NAME'}/g;
            if($input{'MAIL'} =~ /^$/){s/\@1MAIL1\@/<I>nothing<\/I>/g;}
            else{s/\@1MAIL1\@/$input{'MAIL'}/g;}
            s/\@MAIL\@/$input{'MAIL'}/g;
            if($input{'URL'} =~ /^$/){s/\@1URL1\@/<I>nothing<\/I>/g;}
            else{s/\@1URL1\@/$input{'URL'}/g;}
            s/\@URL\@/$input{'URL'}/g;
            if($input{'SUBJECT'} =~ /^$/){s/\@1SUBJECT1\@/<I>nothing<\/I>/g;}
            else{s/\@1SUBJECT1\@/$input{'SUBJECT'}/g;}
            s/\@SUBJECT\@/$input{'SUBJECT'}/g;
            s/\@1MESSAGE1\@/$input{'MESSAGE'}/g;
            s/\@MESSAGE\@/$message/g;
            s/\@CHECK_COOKIE@/$input{'CHECK_COOKIE'}/g;
            s/\@COPY\@/$copy/g;
        }
        print;
    }
    close(HTML);
    unless($copy_flg){print qq(<H1 STYLE="font-size: 80px;"><A href="http://www.makizou.com/cherry/" target="_blank">&copy; $version</A></H1>);}
}

#メール送信
sub MAIL {
    &SET_COOKIE;
    &GET_TIME;
    &GET_HOST;
    if($input{'MAIL'} =~ /^$/){$input{'MAIL'} = 'nothing';}
    else{$g_mail = "$input{'MAIL'}";}
    if($input{'URL'} =~ /^$/){$input{'URL'} = 'nothing';}
    if($input{'SUBJECT'} =~ /^$/){$input{'SUBJECT'} = 'nothing';}
    $input{'SUBJECT'} =~ s/&quot;/\"/g;
    $input{'SUBJECT'} =~ s/&amp;/&/g;
    $input{'SUBJECT'} =~ s/&lt;/</g;
    $input{'SUBJECT'} =~ s/&gt;/>/g;
    $input{'MESSAGE'} =~ s/&quot;/\"/g;
    $input{'MESSAGE'} =~ s/&amp;/&/g;
    $input{'MESSAGE'} =~ s/&lt;/</g;
    $input{'MESSAGE'} =~ s/&gt;/>/g;
    $input{'MESSAGE'} =~ s/<BR>/\n/ig;
    $mail_data = <<"END_OF_MAIL";
X-Mailer: $version
To: $m_mailto
From: $g_mail
Subject: $m_subject $input{'SUBJECT'}
Content-Transfer-Encoding: 7bit
Content-Type: text/plain

Date    : $DATE
Name    : $input{'NAME'}
E-Mail  : $input{'MAIL'}
URL     : $input{'URL'}
HOST    : $HOST
Subject : $input{'SUBJECT'}
MESSAGE :
$input{'MESSAGE'}
------------------------------------------------------
$version
END_OF_MAIL
    &jcode'convert(*mail_data,'jis');
    open(MAIL,"| $m_sendmail -t -f $m_mailto") or die"Can't sendmail";
    print MAIL $mail_data;
    close(MAIL);
    if($ENV{PERLXS} eq "PerlIS") {	#IISサーバ(PerlIS)対応
        print "HTTP/1.0 302 Temporary Redirection\r\n";
        print "Content-type: text/html\n";
    }
    print "Location: $htmlfollow\n\n";
}

#投稿表示処理
sub SHOW {
    &GET_COOKIE;			#クッキーの取得
    my $message = $input{'MESSAGE'};
    $message =~ s/(<|&lt;)BR(>|&gt;)/\n/ig;
    open(HTML,"$htmlmain") or die "Can't open $htmlmain";
    print "Content-type: text/html\n\n";
    while(<HTML>){			#表示用HTMLファイルの読み込み
        if(/\@/){
            if(/\@COPY\@/){$copy_flg = 1;}
            s/\@TITLE\@/$title/g;
            s/\@METHOD\@/$method/g;
            s/\@CGIFILE\@/$cgifile/g;
            s/\@NAME\@/$input{'NAME'}/g;
            s/\@MAIL\@/$input{'MAIL'}/g;
            s/\@URL\@/$input{'URL'}/g;
            s/\@SUBJECT\@/$input{'SUBJECT'}/g;
            s/\@MESSAGE\@/$message/g;
            s/\@COPY\@/$copy/g;
        }
        print;
    }
    close(HTML);
    unless($copy_flg){print qq(<H1 STYLE="font-size: 80px;"><A href="http://www.makizou.com/cherry/" target="_blank">&copy; $version</A></H1>);}
}

#### 本文(サブ２) ####################################################

#エラー表示処理
sub ERROR {
    print "Content-type: text/html\n\n";
    open(HTML,"$htmlmain") or die "Can't open $htmlmain";
    while(<HTML>){			#表示用HTMLファイルの読み込み
        s/\@TITLE\@/$title-ERROR!!/g;
        if(/<BODY.*>/ig){
            $error_flg = 1;
            print;
            print qq(<FORM method="POST" action="$cgifile">\n);
            print qq(<CENTER><H1>ERROR！</H1>\n);
            print qq(<P><B>$_[0]</B><BR>$_[1]<BR><BR></P>\n);
            print qq(<INPUT type="hidden" name="NAME" value="$input{'NAME'}">\n);
            print qq(<INPUT type="hidden" name="MAIL" value="$input{'MAIL'}">\n);
            print qq(<INPUT type="hidden" name="URL" value="$input{'URL'}">\n);
            print qq(<INPUT type="hidden" name="SUBJECT" value="$input{'SUBJECT'}">\n);
            print qq(<INPUT type="hidden" name="MESSAGE" value="$input{'MESSAGE'}">\n);
            print qq(<INPUT type="submit" name="submit" value="戻る">\n);
            print qq(</CENTER>\n</FORM>\n);
        }elsif(/<\/BODY>/ig){
            undef $error_flg;
            print;
        }elsif(!($error_flg)){
            print;
        }
    }
    close(HTML);
    exit;
}

#日時の取得
sub GET_TIME {
    my($sec,$min,$hour,$mday,$mon,$wday);
    ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($now_time+$time_diff);
    $year = $year + 1900;
    my @z = ('00'..'99');
    $mon  = $z[$mon];
    $mon++;
    $mday = $z[$mday];
    $hour = $z[$hour];
    $min  = $z[$min];
    $sec  = $z[$sec];
    my $week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat')[$wday];

    #日時のフォーマット
    $DATE = "$year/$mon/$mday($week) $hour\:$min";
}

sub GET_HOST {
    $HOST = $ENV{'REMOTE_HOST'};
    $HOST = $ENV{'HTTP_X_FORWARDED_FOR'} if($ENV{'HTTP_X_FORWARDED_FOR'});
    my $addr = $ENV{'REMOTE_ADDR'};
    if($HOST =~ /^$/ || $HOST eq "$addr"){
        ($p1,$p2,$p3,$p4) = split(/\./,$addr);
        my $temp = pack("C4",$p1,$p2,$p3,$p4);
        $HOST = gethostbyaddr("$temp",2);
        if($HOST =~ /^$/){$HOST = $addr;}
    }
}

#クッキーの発行
sub SET_COOKIE {
    if($input{'CHECK_COOKIE'} eq 'on') {
        my($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg) = gmtime($now_time + $expdays*24*60*60);
        $yearg += 1900;
        my @z = ('00'..'99');
        $secg  = $z[$secg];
        $ming  = $z[$ming];
        $hourg = $z[$hourg];
        $mdayg = $z[$mdayg];
        my $month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mong];
        my $youbi = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wdayg];
        my $date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT";
        $input{'URL'} =~ s/^http\:\/\///;
        my $cook="name\:$input{'NAME'}\,mail\:$input{'MAIL'}\,url\:$input{'URL'}";
        print "Set-Cookie: $cookei=$cook; expires=$date_gmt\n";
    }
}

#クッキーを取得
sub GET_COOKIE {
    my @pairs = split(/;/, $ENV{'HTTP_COOKIE'});
    foreach(@pairs){
        local($name, $value) = split(/=/, $_);
        $name =~ s/ //g;
        $DUMMY{$name} = $value;
    }
    @pairs = split(/,/, $DUMMY{"$cookei"});
    foreach(@pairs){
        local($name, $value) = split(/:/, $_);
        $COOKIE{$name} = $value;
    }
    unless($input{'NAME'}){$input{'NAME'} = $COOKIE{'name'};}
    unless($input{'MAIL'}){$input{'MAIL'} = $COOKIE{'mail'};}
    unless($input{'URL'}){$input{'URL'} = "http://$COOKIE{'url'}";}
    else{$input{'URL'} = "http://$input{'URL'}";}
}
#### END_OF_SCRIPT ###################################################
__END__
