OSDN Git Service

Plugin::ResponseFilter: remove debug output
[newslash/newslash.git] / src / newslash_web / lib / Newslash / Plugin / ResponseFilter.pm
index 8b42234..aded3ef 100644 (file)
@@ -1,25 +1,59 @@
 package Newslash::Plugin::ResponseFilter;
 use Mojo::Base 'Mojolicious::Plugin';
+use Data::Dumper;
 
 sub register {
     my ($self, $app, $conf) = @_;
 
     # set default config value
     my $cnf = $app->config->{ResponseFilter} ||= {};
-    my $defualt_faculities = { comments => { 1000 => [ipid, subnetid] },
-                              metamoderations => { 1000 => [uid] },
-                              moderations => { 1000 => [ipid, subnetid, uid, m2uid] },
-                              stories => { 1000 => [hits, hitparade] },
-                              submissions => { 1000 => [ipid, subnetid, note, comment] },
+    my $default_faculities = { users => { 10000 => [qw(realemail passwd newpasswd newpasswd_ts)] },
+                               comments => { 1000 => [qw(ipid subnetid)] },
+                              metamoderations => { 1000 => [qw(uid)] },
+                              moderations => { 1000 => [qw(ipid subnetid uid m2uid)] },
+                              stories => { 1000 => [qw(hits hitparade)] },
+                              submissions => { 1000 => [qw(ipid subnetid note comment)] },
                             };
     $cnf->{faculities} ||= $default_faculities;
-    $cnf->{enable} = 1 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;
+                      if (defined $json->{result} && ref($json->{result}) eq "HASH") {
+                          $result = $json->{result};
+                      }
+
+                      if ($result->{item}) {
+                          my $type = $result->{item}->{content_type};
+                          if ($type) {
+                              apply_seclev_filter($c, $type, $result->{item});
+                          }
+                      }
+
+                      if ($result->{items} && ref($result->{items}) eq "ARRAY") {
+                          for my $item (@{$result->{items}}) {
+                              my $type = $item->{content_type};
+                              if ($type) {
+                                  apply_seclev_filter($c, $type, $item);
+                              }
+                          }
+                      }
+                  });
+    }
 }
 
 sub apply_seclev_filter {
     my ($c, $model, $items) = @_;
-    return if !$items || !$model;
+    if (!$items || !$model) {
+        $c->app->log->error("ResponseFilter: model or items not given");
+        return;
+    }
 
     my $user = $c->stash('user') || {};
     my $security_level = $user->{seclev} || 0;
@@ -29,22 +63,38 @@ sub apply_seclev_filter {
         $targets = [$items];
     }
 
-    my $faculties = $c->config->{Faculties} || {};
-    my $faculty = $faculties->{$model};
-    if (!$faculty) {
-        $c->app->log->debug("no faculty found for $model");
-        return;
+    my $cnf = $c->config->{ResponseFilter} || {};
+    my $faculties = $cnf->{faculities} || {};
+
+    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;
 }