OSDN Git Service

add maxlength to handle privmsg maxlength
[keitairc/keitairc.git] / keitairc
index 09b1c0f..fc7afd4 100755 (executable)
--- a/keitairc
+++ b/keitairc
@@ -36,24 +36,29 @@ use strict;
 use warnings;
 
 our $cf = new Keitairc::Config({version => '2.1a1', argv => \@ARGV});
-our $ib = new Keitairc::IrcBuffer({history => $cf->web_lines()});
-our $sm = new Keitairc::SessionManager({default_ttl => $cf->session_ttl()});
-our $pl = new Keitairc::Plugins({config => $cf});
 
 # daemonize
 if($cf->daemonize()){
-       use Proc::Daemon;
-
-       Proc::Daemon::Init;
-       if(length $cf->pid_dir()){
-               if (open(PID, '> ' . $cf->pid_dir() . '/' . $cf->pid_file())) {
-                       print PID $$, "\n";
-                       close(PID);
+       if (eval 'require Proc::Daemon') {
+               require Proc::Daemon;
+               Proc::Daemon::Init();
+               if(length $cf->pid_dir()){
+                       if (open(PID, '> ' . $cf->pid_dir() . '/' . $cf->pid_file())) {
+                               print PID $$, "\n";
+                               close(PID);
+                       }
                }
+               $poe_kernel->has_forked if ($poe_kernel->can('has_forked'));
+       } else {
+               warn('Proc::Daemon module is not installed, could not daemonize');
        }
-       $poe_kernel->has_forked if ($poe_kernel->can('has_forked'));
 }
 
+our $log = new Keitairc::Log({config => $cf});
+our $ib = new Keitairc::IrcBuffer({history => $cf->web_lines()});
+our $sm = new Keitairc::SessionManager({default_ttl => $cf->session_ttl()});
+our $pl = new Keitairc::Plugins({config => $cf});
+
 # create irc component
 our $irc = POE::Component::IRC->spawn(
        Alias => 'keitairc_irc',
@@ -117,8 +122,10 @@ sub http_request{
        # the responses as they are and finish up.
        if($request->isa('HTTP::Response')){
                $heap->{client}->put($request);
+               $log->log_error($request->as_string());
        }elsif(my $response = dispatch($request)){
                $heap->{client}->put($response);
+               $log->log_access($heap->{'remote_ip'}, $request, $response);
        }
 
        $kernel->yield('shutdown');
@@ -130,7 +137,7 @@ sub dispatch{
        my $uri = $request->uri();
        my $ci = new Keitairc::ClientInfo($request);
 
-       Keitairc::Log::log_debug("dispatch: $uri");
+       $log->log_debug("dispatch: $uri");
 
        {
                # chop off $cf->web_root()
@@ -203,8 +210,8 @@ sub action_login{
        my $content = $request->decoded_content();
        my ($password) = ($content =~ /^password=(.*)/);
 
-       Keitairc::Log::log_debug("password [$password]");
-       Keitairc::Log::log_debug("web_password [" . $cf->web_password() . "]");
+       $log->log_debug("password [$password]");
+       $log->log_debug("web_password [" . $cf->web_password() . "]");
 
        if($cf->web_password() eq $password){
                my $s = $sm->add($ci->user_agent(), $ci->serial_key());
@@ -233,12 +240,12 @@ sub action_error {
 }
 
 ################################################################
-sub action_public{
+sub action_public {
        my $request = shift;
        my $uri = shift;        # such as '/favicon.ico'
        my $ci = new Keitairc::ClientInfo($request);
        my $view = new Keitairc::View($cf, $ci);
-       return $view->public($uri);
+       return $view->public($request, $uri);
 }
 
 ################################################################
@@ -253,14 +260,14 @@ sub action_login_icc{
                if(length $docomo_foma_icc){
                        if(my $s = $sm->verify({serial_key => $docomo_foma_icc,
                                                user_agent => $ci->user_agent()})){
-                               Keitairc::Log::log_debug("redirect to /$s->{id}/index from docomo_foma_icc");
+                               $log->log_debug("redirect to /$s->{id}/index from docomo_foma_icc");
                                my $view = new Keitairc::View($cf, $ci, $s->{id});
                                return $view->redirect("/$s->{id}/index");
                        }
 
                        if($docomo_foma_icc eq $cf->docomo_foma_icc()){
                                my $s = $sm->add($ci->user_agent(), $docomo_foma_icc);
-                               Keitairc::Log::log_debug("redirect to /$s->{id}/index from docomo_foma_icc");
+                               $log->log_debug("redirect to /$s->{id}/index from docomo_foma_icc");
                                my $view = new Keitairc::View($cf, $ci, $s->{id});
                                return $view->redirect("/$s->{id}/index");
                        }
@@ -289,14 +296,14 @@ sub action_login_imodeid{
                if(length $docomo_imodeid){
                        if(my $s = $sm->verify({serial_key => $docomo_imodeid,
                                                user_agent => $ci->user_agent()})){
-                               Keitairc::Log::log_debug("redirect to /$s->{id}/index from docomo_imodeid");
+                               $log->log_debug("redirect to /$s->{id}/index from docomo_imodeid");
                                my $view = new Keitairc::View($cf, $ci, $s->{id});
                                return $view->redirect("/$s->{id}/index");
                        }
 
                        if($docomo_imodeid eq $cf->docomo_imodeid()){
                                my $s = $sm->add($ci->user_agent(), $docomo_imodeid);
-                               Keitairc::Log::log_debug("redirect to /$s->{id}/index from docomo_imodeid");
+                               $log->log_debug("redirect to /$s->{id}/index from docomo_imodeid");
                                my $view = new Keitairc::View($cf, $ci, $s->{id});
                                return $view->redirect("/$s->{id}/index");
                        }
@@ -323,7 +330,7 @@ sub action_root{
                if(defined($session_id) && length($session_id)){
                        if($sm->verify({session_id => $session_id,
                                        user_agent => $ci->user_agent()})){
-                               Keitairc::Log::log_debug("redirect to /$session_id/index from cookie");
+                               $log->log_debug("redirect to /$session_id/index from cookie");
                                my $view = new Keitairc::View($cf, $ci, $session_id);
                                if ($ci->is_webkit() && $cf->webkit_newui()) {
                                        return add_cookie($view->render('root_home.html', {sid => $session_id}), $session_id);
@@ -339,14 +346,14 @@ sub action_root{
                if(length $subscriber_id){
                        if(my $s = $sm->verify({serial_key => $subscriber_id,
                                                user_agent => $ci->user_agent()})){
-                               Keitairc::Log::log_debug("redirect to /$s->{id}/index from subscriber_id");
+                               $log->log_debug("redirect to /$s->{id}/index from subscriber_id");
                                my $view = new Keitairc::View($cf, $ci, $s->{id});
                                return $view->redirect("/$s->{id}/index");
                        }
 
                        if($subscriber_id eq $cf->au_subscriber_id()){
                                my $s = $sm->add($ci->user_agent(), $subscriber_id);
-                               Keitairc::Log::log_debug("redirect to /$s->{id}/index from au_subscriber_id");
+                               $log->log_debug("redirect to /$s->{id}/index from au_subscriber_id");
                                my $view = new Keitairc::View($cf, $ci, $s->{id});
                                return $view->redirect("/$s->{id}/index");
                        }
@@ -358,13 +365,13 @@ sub action_root{
                if(length $serial_key){
                        if(my $s = $sm->verify({serial_key => $serial_key,
                                                user_agent => $ci->user_agent()})){
-                               Keitairc::Log::log_debug("redirect to /$s->{id}/index from softbank serial_key");
+                               $log->log_debug("redirect to /$s->{id}/index from softbank serial_key");
                                my $view = new Keitairc::View($cf, $ci, $s->{id});
                                return $view->redirect("/$s->{id}/index");
                        }
                        if($serial_key eq $cf->softbank_serial_key()){
                                my $s = $sm->add($ci->user_agent(), $serial_key);
-                               Keitairc::Log::log_debug("redirect to /$s->{id}/index from softbank_serial_key");
+                               $log->log_debug("redirect to /$s->{id}/index from softbank_serial_key");
                                my $view = new Keitairc::View($cf, $ci, $s->{id});
                                return $view->redirect("/$s->{id}/index");
                        }
@@ -376,14 +383,14 @@ sub action_root{
                if(length $userid){
                        if(my $s = $sm->verify({serial_key => $userid,
                                                user_agent => $ci->user_agent()})){
-                               Keitairc::Log::log_debug("redirect to /$s->{id}/index from userid");
+                               $log->log_debug("redirect to /$s->{id}/index from userid");
                                my $view = new Keitairc::View($cf, $ci, $s->{id});
                                return $view->redirect("/$s->{id}/index");
                        }
 
                        if($userid eq $cf->emobile_userid()){
                                my $s = $sm->add($ci->user_agent(), $userid);
-                               Keitairc::Log::log_debug("redirect to /$s->{id}/index from emobile_userid");
+                               $log->log_debug("redirect to /$s->{id}/index from emobile_userid");
                                my $view = new Keitairc::View($cf, $ci, $s->{id});
                                return $view->redirect("/$s->{id}/index");
                        }
@@ -411,20 +418,27 @@ sub parse_message{
        my $ci = new Keitairc::ClientInfo($request);
        my $timestamp;
 
-       my $message = Encode::decode($cf->web_charset(), $request->content());
+       my $message = $request->content();
 
        if(length($message)){
                ($message, $timestamp) = split(/&/, $message);
+
                $timestamp =~ s/^stamp=//g;
 
                $message =~ s/^m=//;
                $message =~ s/\+/ /g;
                $message = uri_unescape($message);
-               if($ci->is_webkit()){
+
+               if($ci->is_webkit() && !$cf->webkit_newui()){
                        $message = fix_webkit_escape($message);
                }
        }
-
+       if ($cf->webkit_newui()) {
+               # ajax で投げ込んでるので utf8 できます
+               $message = Encode::decode('utf8', $message);
+       } else {
+               $message = Encode::decode($cf->web_charset(), $message);
+       }
        return ($message, $timestamp);
 }
 
@@ -435,11 +449,12 @@ sub send_message{
        my ($message, $timestamp) = parse_message($request);
 
        if(length($message) && length($channel)){
-               my $internal = Encode::decode($cf->web_charset(), $message);
                if($ib->update_timestamp($timestamp)){
-                       $irc->yield(privmsg => $channel => Encode::encode($cf->irc_charset(), $internal));
+                       my $enc_message = Encode::encode($cf->irc_charset(), $message);
+                       my $enc_channel = Encode::encode($cf->irc_charset(), $channel);
+                       $irc->yield(privmsg => $enc_channel => $enc_message);
                        my $cid = $ib->name2cid($channel);
-                       $ib->add_message($cid, $internal, $cf->irc_nick());
+                       $ib->add_message($cid, $message, $cf->irc_nick());
                }
        }
 }
@@ -480,9 +495,9 @@ sub fix_webkit_escape{
        # charset: $cf->irc_charset()
        my $in = shift;
        $in =~ s/\\x([0-9A-F]{2})/pack('C',hex($1))/egi;
-       my $pi = Encode::decode('utf8', $in);
-       $pi =~ s/%u([0-9A-F]{4})/pack('U',hex($1))/egi;
-       return Encode::encode($cf->web_charset(), $pi);
+       #my $pi = Encode::decode('utf8', $in);
+       $in =~ s/%u([0-9A-F]{4})/pack('U',hex($1))/egi;
+       return $in;
 }
 
 __END__