OSDN Git Service

Plugin::ResponseFilter: remove debug output
[newslash/newslash.git] / src / newslash_web / lib / Newslash / Plugin / ResponseFilter.pm
1 package Newslash::Plugin::ResponseFilter;
2 use Mojo::Base 'Mojolicious::Plugin';
3 use Data::Dumper;
4
5 sub register {
6     my ($self, $app, $conf) = @_;
7
8     # set default config value
9     my $cnf = $app->config->{ResponseFilter} ||= {};
10     my $default_faculities = { users => { 10000 => [qw(realemail passwd newpasswd newpasswd_ts)] },
11                                comments => { 1000 => [qw(ipid subnetid)] },
12                                metamoderations => { 1000 => [qw(uid)] },
13                                moderations => { 1000 => [qw(ipid subnetid uid m2uid)] },
14                                stories => { 1000 => [qw(hits hitparade)] },
15                                submissions => { 1000 => [qw(ipid subnetid note comment)] },
16                              };
17     $cnf->{faculities} ||= $default_faculities;
18     $cnf->{enable} //= 0;
19     $app->helper(apply_seclev_filter => sub { apply_seclev_filter(@_) });
20
21     if ($cnf->{enable}) {
22         $app->hook(before_render => sub {
23                        my ($c, $args) = @_;
24                        return if (!defined $args->{json});
25
26                        my $json = $args->{json};
27                        my $result = $json;
28                        if (defined $json->{result} && ref($json->{result}) eq "HASH") {
29                            $result = $json->{result};
30                        }
31
32                        if ($result->{item}) {
33                            my $type = $result->{item}->{content_type};
34                            if ($type) {
35                                apply_seclev_filter($c, $type, $result->{item});
36                            }
37                        }
38
39                        if ($result->{items} && ref($result->{items}) eq "ARRAY") {
40                            for my $item (@{$result->{items}}) {
41                                my $type = $item->{content_type};
42                                if ($type) {
43                                    apply_seclev_filter($c, $type, $item);
44                                }
45                            }
46                        }
47                    });
48     }
49 }
50
51 sub apply_seclev_filter {
52     my ($c, $model, $items) = @_;
53     if (!$items || !$model) {
54         $c->app->log->error("ResponseFilter: model or items not given");
55         return;
56     }
57
58     my $user = $c->stash('user') || {};
59     my $security_level = $user->{seclev} || 0;
60
61     my $targets = $items;
62     if (ref($items) ne "ARRAY") {
63         $targets = [$items];
64     }
65
66     my $cnf = $c->config->{ResponseFilter} || {};
67     my $faculties = $cnf->{faculities} || {};
68
69     my $faculty_all = $faculties->{all} || {};
70     for my $lv (keys %$faculty_all) {
71         if ($security_level < $lv) {
72             for my $item (@$targets) {
73                 for my $k (@{$faculty_all->{$lv}}) {
74                     if (defined $item->{$k}) {
75                         delete $item->{$k};
76                         #$c->app->log->debug("remove $k");
77                     }
78                 }
79             }
80         }
81     }
82
83     my $faculty = $faculties->{$model} || {};
84     for my $lv (keys %$faculty) {
85         if ($security_level < $lv) {
86             for my $item (@$targets) {
87                 for my $k (@{$faculty->{$lv}}) {
88                     if (defined $item->{$k}) {
89                         delete $item->{$k};
90                         #$c->app->log->debug("remove $k");
91                     }
92                 }
93             }
94         }
95     }
96
97
98     return $items;
99 }
100
101 1;