#!/usr/bin/perl

#============================================================
#
# minjector.pl - IRC/SMTPゲートウェイ用メッセージインジェクタ
#
# 川俣吉広、kaw@on.rim.or.jp
# $Id: minjector.pl,v 1.3 2009/10/02 14:26:08 kaw Exp $
#
#============================================================

use IO::Socket;

# 設定ファイル読み込み
#
if (@ARGV) {
    @INC = ('.');
    require $ARGV[0] || die;
} else {
    print STDERR <<EOT;
Usage: $0 config-file
EOT
}

# migwがlistenしているソケットをオープン
#
$client = IO::Socket::UNIX->new(Peer => $SOCKPATH,
                                Type => SOCK_STREAM) || die $@;

# メールの読み込みと処理
#
$rstat = ''; #行の読み込みステータスを格納する

while (<STDIN>) {
    chomp;

    # 現在読んでいる行がヘッダかボディかの判定
    #
    if ($rstat eq 'header') {
        unless ($_) {
            $rstat = 'body'; # ヘッダとボディを区切る空行
            next;
        }
    } elsif ($rstat ne 'body') {
        if ($_) {
            $rstat = 'header';
        } else {
            next; # ヘッダより前に空行がある場合
        }
    }

    # ヘッダ/ボディのそれぞれの処理
    #
    if ($rstat eq 'header') {
        # From:フィールド中のアドレスの抽出
        #
        if (($addr) = /^from:.*?(\S+@\S+)/i) {
            $addr =~ s/^<(.+)>$/\1/;
            print $client "FROM:$addr\n";
        }
    } elsif ($rstat eq 'body') {
        s/\s+$//;
        next unless (scalar(@body) || $_);
        $ln++;
        #
        # IRC_MAXLINES行目までのボディをmigwに伝送
        #
        if ($ln <= $IRC_MAXLINES) {
            if (/^--$/) {
                # QuickMLなどの "--" より後の
                # バナー行を無視する
                #
                1 while (<>);
                $ln = $IRC_MAXLINES;
                last;
            } elsif (/^${IRC_NICK}<-iam(\s+(\S{1,32})(.*)|\s*)$/io) {
                # ハンドルネームの変更
                #
		if ($3 eq '') {
		    print $client "IAM:$2\n";
		} else {
		    print $client "STAT:TOOLONGHANDLE\n";
		}
            } elsif (/^${IRC_NICK}<-relay\s+(on|off)(\s+.*)?/io) {
                # 中継動作の停止・実行
                #
		($relay = $1) =~ tr/a-z/A-Z/;
	        print $client "RELAY:$relay\n";
            } else {
                # 中継本文の送出
                #
                print $client "BODY:$_\n";
            }
        }
    }
}

# メールボディの本文が IRC_MAXLINESを超えている
#
if ($IRC_MAXLINES < $ln) {
    print $client "STAT:LINESOVER\n";
}

close($client);
