OSDN Git Service

ソフト404等のレスポンスエラーコード対応
[fswiki/fswiki.git] / lib / Wiki.pm
index c6216a1..8b0fd7b 100644 (file)
@@ -8,11 +8,11 @@ use strict;
 use CGI2;
 use File::Copy;
 use File::Path;
+use HTTP::Status;
 use Wiki::DefaultStorage;
 use Wiki::HTMLParser;
-#use Wiki::CacheParser;
 use vars qw($VERSION $DEBUG);
-$VERSION = '3.6.4';
+$VERSION = '3.6.5';
 $DEBUG   = 0;
 #==============================================================================
 # <p>
@@ -549,17 +549,17 @@ sub call_handler {
        my $obj = $self->get_plugin_instance($self->{"handler"}->{$action});
        
        unless(defined($obj)){
-               return $self->error("ÉÔÀµ¤Ê¥¢¥¯¥·¥ç¥ó¤Ç¤¹¡£");
+               return $self->error(RC_BAD_REQUEST, "ÉÔÀµ¤Ê¥¢¥¯¥·¥ç¥ó¤Ç¤¹¡£");
        }
        
        # ´ÉÍý¼ÔÍѤΥ¢¥¯¥·¥ç¥ó
        if($self->{"handler_permission"}->{$action}==0){
                my $login = $self->get_login_info();
                if(!defined($login)){
-                       return $self->error("¥í¥°¥¤¥ó¤·¤Æ¤¤¤Þ¤»¤ó¡£");
+                       return $self->error(RC_FORBIDDEN, "¥í¥°¥¤¥ó¤·¤Æ¤¤¤Þ¤»¤ó¡£");
                        
                } elsif($login->{type}!=0){
-                       return $self->error("´ÉÍý¼Ô¸¢¸Â¤¬É¬ÍפǤ¹¡£");
+                       return $self->error(RC_FORBIDDEN, "´ÉÍý¼Ô¸¢¸Â¤¬É¬ÍפǤ¹¡£");
                }
                return $obj->do_action($self).
                       "<div class=\"comment\"><a href=\"".$self->create_url({action=>"LOGIN"})."\">¥á¥Ë¥å¡¼¤ËÌá¤ë</a></div>";
@@ -568,7 +568,7 @@ sub call_handler {
        } elsif($self->{"handler_permission"}->{$action}==2){
                my $login = $self->get_login_info();
                if(!defined($login)){
-                       return $self->error("¥í¥°¥¤¥ó¤·¤Æ¤¤¤Þ¤»¤ó¡£");
+                       return $self->error(RC_FORBIDDEN, "¥í¥°¥¤¥ó¤·¤Æ¤¤¤Þ¤»¤ó¡£");
                }
                return $obj->do_action($self).
                       "<div class=\"comment\"><a href=\"".$self->create_url({action=>"LOGIN"})."\">¥á¥Ë¥å¡¼¤ËÌá¤ë</a></div>";
@@ -679,13 +679,23 @@ sub get_current_parser {
 #   my $wiki = shift;
 #   ...
 #   return $wiki-&gt;error(¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸);
+#     or
+#   return $wiki-&gt;error(¥¨¥é¡¼¥³¡¼¥É, ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸);
 # }
 # </pre>
 #==============================================================================
 sub error {
        my $self    = shift;
+       my $status = shift;
        my $message = shift;
        
+       if(!defined($message)){
+               $message = $status;
+               $status = undef;
+       } else {
+               printf "Status: %d\n", $status;
+       }
+       
        $self->set_title("¥¨¥é¡¼");
        $self->get_CGI->param("action","ERROR");
        
@@ -730,7 +740,7 @@ sub parse_inline_plugin {
        my $text = shift;
        my ($cmd, @args_tmp) = split(/ /,$text);
        my $args_txt = &Util::trim(join(" ",@args_tmp));
-       if($cmd =~ s/}}(.*?)$//){
+       if($cmd =~ s/\}\}(.*?)$//){
                return { command=>$cmd, args=>[], post=>"$1 $args_txt"};
        }
        
@@ -1073,8 +1083,20 @@ sub set_page_level {
        my $self  = shift;
        my $page  = shift;
        my $level = shift;
-       
+
        $self->{"storage"}->set_page_level($page,$level);
+
+       # $level ¤¬Ì¤ÄêµÁ¤Ê¤é¥Ú¡¼¥¸¥Ç¡¼¥¿ºï½ü¤Ê¤Î¤Ç¡¢¥Õ¥Ã¥¯´ØÏ¢½èÍýÉÔÍס£
+       return if (not defined $level);
+
+       # ½èÍý¤ÎÀ®Èݤò¸¡ºº¡£
+       my $new_level = $self->get_page_level($page);
+       if ($new_level != $level) {
+               die "¥Ú¡¼¥¸ '$page' ¤Î»²¾È¸¢¸Â¥ì¥Ù¥ë¤ò '$level' ¤ËÊѹ¹¤·¤è¤¦¤È¤·¤Þ¤·¤¿¤¬¼ºÇÔ¤·¤Þ¤·¤¿¡£";
+       }
+
+       # ¥Ú¡¼¥¸¥ì¥Ù¥ë¤ÎÊѹ¹¤ËÀ®¸ù¤·¤¿¤Î¤Ç¡¢¥Õ¥Ã¥¯¤òȯ¹Ô¡£
+       $self->do_hook('change_page_level', $page, $new_level);
 }
 
 #==============================================================================
@@ -1114,31 +1136,30 @@ sub get_page_level {
 # </pre>
 #==============================================================================
 sub _get_can_show_max {
-    my $self = shift;
-
-    # ¡Ö±ÜÍ÷²Äǽ¤Ê page level ¤Î¾å¸ÂÃ͡פ¬´ûÃΤʤé¤Ð¡¢¤½¤ì¤òÊֵѡ£
-    if (exists $self->{'can_show_max'}) {
-        return $self->{'can_show_max'};
-    }
-
-    # Wiki Á´ÂΤαÜÍ÷¸¢¸Â¤ÎÀßÄêÃͤȡ¢±ÜÍ÷¼Ô¤Î¥æ¡¼¥¶¸¢¸Â¥ì¥Ù¥ë¤òµá¤á¤ë¡£
-    my $accept_show = $self->config('accept_show'); # Wiki Á´ÂΤαÜÍ÷¸¢¸Â
-    my $login_user  = $self->get_login_info();      # ¸½ºß¤Î login ¾ðÊó
-    my $user_level                                  # ¥æ¡¼¥¶¸¢¸Â¥ì¥Ù¥ë
-        = (not defined $login_user)  ? 0            #   Èó¥í¥°¥¤¥ó¥æ¡¼¥¶
-        : ($login_user->{type} != 0) ? 1            #   ¥í¥°¥¤¥ó¥æ¡¼¥¶
-        :                              2;           #   ´ÉÍý¼Ô
+       my $self = shift;
 
-    # Wiki Á´ÂΤαÜÍ÷¸¢¸Â¤Ë㤷¤Æ¤¤¤ë¥æ¡¼¥¶¤Ê¤é¡¢
-    if ($user_level >= $accept_show) {
+       # ¡Ö±ÜÍ÷²Äǽ¤Ê page level ¤Î¾å¸ÂÃ͡פ¬´ûÃΤʤé¤Ð¡¢¤½¤ì¤òÊֵѡ£
+       if (exists $self->{'can_show_max'}) {
+               return $self->{'can_show_max'};
+       }
 
-        # ¡Ö±ÜÍ÷²Äǽ¤Ê page level ¾å¸ÂÃ͡פϡ¢¥æ¡¼¥¶¸¢¸Â¥ì¥Ù¥ë¤ËÅù¤·¤¤¡£
-        return $self->{'can_show_max'} = $user_level;
-    }
+       # Wiki Á´ÂΤαÜÍ÷¸¢¸Â¤ÎÀßÄêÃͤȡ¢±ÜÍ÷¼Ô¤Î¥æ¡¼¥¶¸¢¸Â¥ì¥Ù¥ë¤òµá¤á¤ë¡£
+       my $accept_show = $self->config('accept_show'); # Wiki Á´ÂΤαÜÍ÷¸¢¸Â
+       my $login_user  = $self->get_login_info();      # ¸½ºß¤Î login ¾ðÊó
+       my $user_level                                  # ¥æ¡¼¥¶¸¢¸Â¥ì¥Ù¥ë
+               = (not defined $login_user)  ? 0            #   Èó¥í¥°¥¤¥ó¥æ¡¼¥¶
+               : ($login_user->{type} != 0) ? 1            #   ¥í¥°¥¤¥ó¥æ¡¼¥¶
+               :                              2;           #   ´ÉÍý¼Ô
+
+       # Wiki Á´ÂΤαÜÍ÷¸¢¸Â¤Ë㤷¤Æ¤¤¤ë¥æ¡¼¥¶¤Ê¤é¡¢
+       if ($user_level >= $accept_show) {
+               # ¡Ö±ÜÍ÷²Äǽ¤Ê page level ¾å¸ÂÃ͡פϡ¢¥æ¡¼¥¶¸¢¸Â¥ì¥Ù¥ë¤ËÅù¤·¤¤¡£
+               return $self->{'can_show_max'} = $user_level;
+       }
 
-    # Wiki Á´ÂΤαÜÍ÷¸¢¸Â¤Ë㤷¤Æ¤¤¤Ê¤¤¥æ¡¼¥¶¤Ê¤Î¤Ç¡¢
-    # ¡Ö±ÜÍ÷²Äǽ¤Ê page level ¾å¸ÂÃ͡פϠ-1¡£¤¹¤Ê¤ï¤Á¡¢Á´¥Ú¡¼¥¸±ÜÍ÷ÉԲġ£
-    return $self->{'can_show_max'} = -1;
+       # Wiki Á´ÂΤαÜÍ÷¸¢¸Â¤Ë㤷¤Æ¤¤¤Ê¤¤¥æ¡¼¥¶¤Ê¤Î¤Ç¡¢
+       # ¡Ö±ÜÍ÷²Äǽ¤Ê page level ¾å¸ÂÃ͡פϠ-1¡£¤¹¤Ê¤ï¤Á¡¢Á´¥Ú¡¼¥¸±ÜÍ÷ÉԲġ£
+       return $self->{'can_show_max'} = -1;
 }
 
 #==============================================================================
@@ -1154,15 +1175,15 @@ sub _get_can_show_max {
 # </pre>
 #==============================================================================
 sub can_show {
-    my ($self, $page) = @_;
+       my ($self, $page) = @_;
 
-    #¡Ö±ÜÍ÷²Äǽ page level ¾å¸Â¡×¤¬Ì¤ÃΤʤé¤Ð¡¢µá¤á¤ë¡£
-    if (not exists $self->{'can_show_max'}) {
-        $self->_get_can_show_max();
-    }
+       #¡Ö±ÜÍ÷²Äǽ page level ¾å¸Â¡×¤¬Ì¤ÃΤʤé¤Ð¡¢µá¤á¤ë¡£
+       if (not exists $self->{'can_show_max'}) {
+               $self->_get_can_show_max();
+       }
 
-    # page level ¤¬¡¢±ÜÍ÷²Äǽ page level ¾å¸Â°Ê²¼¤Ê¤é¿¿¤òÊÖ¤¹¡£
-    return ($self->get_page_level($page) <= $self->{'can_show_max'});
+       # page level ¤¬¡¢±ÜÍ÷²Äǽ page level ¾å¸Â°Ê²¼¤Ê¤é¿¿¤òÊÖ¤¹¡£
+       return ($self->get_page_level($page) <= $self->{'can_show_max'});
 }
 
 ###############################################################################
@@ -1372,7 +1393,6 @@ sub get_backup {
 #==============================================================================
 # <p>
 # ¥Ú¡¼¥¸¤òÊݸ¤·¤Þ¤¹¡£
-# ¥­¥ã¥Ã¥·¥å¥â¡¼¥ÉON¤ÇÍøÍѤ·¤Æ¤¤¤ë¾ì¹ç¡¢¥Ú¡¼¥¸¤Î¥­¥ã¥Ã¥·¥å¤âºï½ü¤µ¤ì¤Þ¤¹¡£
 # </p>
 # <pre>
 # $wiki-&gt;save_page(¥Ú¡¼¥¸Ì¾,¥Ú¡¼¥¸ÆâÍÆ);
@@ -1468,11 +1488,23 @@ sub get_CGI {
 # <pre>
 # $wiki-&gt;redirect(&quot;FrontPage&quot;);
 # </pre>
+# <p>
+# ÂèÆó°ú¿ô¤Ë¥Ñ¡¼¥ÈÈÖ¹æ¤òÅϤ¹¤È¤½¤Î¥Ñ¡¼¥È¤Ë¥ê¥À¥¤¥ì¥¯¥È¤·¤Þ¤¹¡£
+# </p>
+# <pre>
+# $wiki-&gt;redirect(&quot;FrontPage&quot;, 1);
+# </pre>
+#
 #==============================================================================
 sub redirect {
        my $self = shift;
        my $page = shift;
-       $self->redirectURL($self->create_page_url($page));
+       my $part = shift;
+       my $url = $self->create_page_url($page);
+       if($part ne ""){
+               $url .= "#p".Util::url_encode($part);
+       }
+       $self->redirectURL($url);
 }
 
 #==============================================================================