OSDN Git Service

Plugin::ResponseFilter: fix to apply timeline results
authorhylom <hylom@users.osdn.me>
Mon, 17 Jun 2019 08:36:04 +0000 (08:36 +0000)
committerhylom <hylom@users.osdn.me>
Mon, 17 Jun 2019 08:36:04 +0000 (08:36 +0000)
src/newslash_web/lib/Newslash/Plugin/ResponseFilter.pm
src/newslash_web/lib/Newslash/Web/Controller/API/Comment.pm
src/newslash_web/lib/Newslash/Web/Controller/API/Metamoderation.pm
src/newslash_web/lib/Newslash/Web/Controller/API/Submission.pm

index 07261f5..ab3774f 100644 (file)
@@ -14,8 +14,31 @@ sub register {
                               submissions => { 1000 => [qw(ipid subnetid note comment)] },
                             };
     $cnf->{faculities} ||= $default_faculities;
-    $cnf->{enable} = 0 if !defined $cnf->{enable};
+    $cnf->{enable} //= 0;
     $app->helper(apply_seclev_filter => sub { apply_seclev_filter(@_) });
+
+    if ($cnf->{enable}) {
+       $app->hook(before_render => sub {
+                      my ($c, $args) = @_;
+                      return if (!defined $args->{json});
+
+                      my $json = $args->{json};
+                      my $result = $json->{result} || $json;
+                      if ($result->{item}) {
+                          if ($result->{item}->{content_type}) {
+                              apply_seclev_filter($c, $result->{item}->{content_type}, $result->{item});
+                          }
+                      }
+
+                      if ($result->{items} && ref($result->{items}) eq "ARRAY") {
+                          for my $item (@{$result->{items}}) {
+                              if ($item->{content_type}) {
+                                  apply_seclev_filter($c, $item->{content_type}, $item);
+                              }
+                          }
+                      }
+                  });
+    }
 }
 
 sub apply_seclev_filter {
@@ -35,21 +58,38 @@ sub apply_seclev_filter {
 
     my $cnf = $c->config->{ResponseFilter} || {};
     my $faculties = $cnf->{faculities} || {};
-    my $faculty = $faculties->{$model};
-    if (!$faculty) {
-        $c->app->log->debug("no faculty found for $model");
-        return;
+
+    #warn Dumper $faculties;
+
+    my $faculty_all = $faculties->{all} || {};
+    for my $lv (keys %$faculty_all) {
+        if ($security_level < $lv) {
+            for my $item (@$targets) {
+                for my $k (@{$faculty_all->{$lv}}) {
+                    if (defined $item->{$k}) {
+                       delete $item->{$k};
+                       #$c->app->log->debug("remove $k");
+                   }
+                }
+            }
+        }
     }
 
+    my $faculty = $faculties->{$model} || {};
     for my $lv (keys %$faculty) {
         if ($security_level < $lv) {
             for my $item (@$targets) {
                 for my $k (@{$faculty->{$lv}}) {
-                    delete $item->{$k} if defined $item->{$k};
+                    if (defined $item->{$k}) {
+                       delete $item->{$k};
+                       #$c->app->log->debug("remove $k");
+                   }
                 }
             }
         }
     }
+
+
     return $items;
 }
 
index 64bde5b..42384e4 100644 (file)
@@ -75,7 +75,7 @@ sub post {
             my $ret = {};
             my $result = $comments->select(cid => $cid,
                                            security_level => $user->{seclev});
-            $c->apply_seclev_filter("comments", $result);
+            $c->apply_seclev_filter("comment", $result);
 
             if ($result) {
                 $ret->{type} = "comment";
@@ -134,7 +134,7 @@ sub get {
     }
     my $rs = $comments->select($key => $value);
 
-    $c->apply_seclev_filter("comments", $rs);
+    $c->apply_seclev_filter("comment", $rs);
 
     if (!defined $rs) {
         $c->render(json => { error => 1, message => 'invalid request' });
index 092e1ca..7c1d2a7 100644 (file)
@@ -17,7 +17,7 @@ sub get {
     }
     else {
         my $m2s = $metamoderations->select(cid => $cid);
-        $c->apply_seclev_filter("metamoderations", $m2s);
+        $c->apply_seclev_filter("metamoderation", $m2s);
 
         if ($m2s) {
             my $hashed_m2s = {};
index 8181869..f5e2179 100644 (file)
@@ -18,7 +18,7 @@ sub get {
     }
     my $submissions = $c->model('submissions');
     my $submission = $submissions->select(submission_id => $subid);
-    $c->apply_seclev_filter("submissions", $submission);
+    $c->apply_seclev_filter("submission", $submission);
 
     if (!$submission) {
         $c->render(json => { err => 1, message => "not_found" });
@@ -57,7 +57,7 @@ sub list {
                                   order_by => {create_time => "DESC"},
                                   limit => $limit,
                                   skip => $skip);
-    $c->apply_seclev_filter("submissions", $items);
+    $c->apply_seclev_filter("submission", $items);
 
     if (!$items) {
         $message = $submissions->last_error;