mobirc とmod_proxy を連携させる

mobirc を使うためにport 5678 を空けるのはださいので
mod_proxy と組み合わせるための備忘録。


mod_proxy と組み合わせたときの問題点として以下が挙がった。

  • 環境変数で%ENV{REMOTE_ADDR} が取れない
  • ローカルホストのApache 経由なので、$req->address が127.0.0.1 となる

ぐぐっても情報が出ないのだが、私の環境だけなのだろうか。


仕方ないのでApache のRequestHeader を使ってmobirc にケータイのリモートアドレスを渡し、
それを使ってIP アドレスチェックをするようにした。


httpd.conf

RequestHeader set X_FORWARDED_FOR %{Remote_Addr}e

ProxyPass / http://127.0.0.1:5678/
ProxyPassReverse / http://127.0.0.1:5678/


mobirc/extlib/HTTP/Session/State/MobileAttributeID.pm

if ($self->check_ip) {
#    my $ip = $ENV{REMOTE_ADDR} || $req->address || die "cannot get address";
    my @forwarded_for = $req->headers->header('X_FORWARDED_FOR');
    my $ip = $forwarded_for[1] || $req->address || die "cannot get address";
    if (!$ma->isa_cidr($ip)) {
        die "SECURITY: invalid ip($ip, $ma, $user_id)";
    }
}

mobirc/lib/App/Mobirc/Web/C/Account.pm

# if ($ma->isa_cidr(req->address)) {
my @forwarded_for = req->headers->header('X_FORWARDED_FOR');
if ($ma->isa_cidr($forwarded_for[1])) {
    session->set('authorized', 1);
    return redirect('/');
} else {
    return redirect('/account/login?invalid_cidr=1');
}


mobirc/extlib/HTTP/Session/State/MobileAgentID.pm にも類似の箇所があったのだが
こちらは修正しなくても今のところ問題が出ていないので放置している。


これでIP アドレスのチェックをパスできるが、チャンネルに入ろうとすると

Can't locate object method "is_foma" via package "HTTP::MobileAttribute::Agent::DoCoMo" at /path/to/mobirc/lib/App/Mobirc/Pictogram.pm line 53.

と怒られる。自分しか使わないので


mobirc/lib/App/Mobirc/Pictogram.pm

if ($ma->is_docomo) {
#    if ($ma->is_foma) {
        'I.uni'
#    } else {
#        'I.sjis'
#    }


ちなみに、FOMA から利用するときはURL にguid=ON を付けなくてはいけないのも注意。