my $cnf = $app->config->{PostFilter} ||= {};
$cnf->{enable} = 0 if !$cnf->{enable};
- my $filters = [
- { filter_id => "foobarhogehoge",
- name => "foobarhogehoge",
- discription => "test filter",
- message => "filter test",
- status => "enabled",
- regexp => "foobarhogehoge",
- ratio => 1,
- threshold => 0,
- limit => 0,
- pathes => ['^\/api\/v1\/comment$', ],
- fields => ["/title", "/comment"],
- },
+ my $filters_sample = [
+ { filter_id => "foobarhogehoge",
+ name => "foobarhogehoge",
+ discription => "test filter",
+ message => "filter test",
+ status => "enabled",
+ regexp => '^foobarhogehoge',
+ ratio => 1,
+ threshold => 0,
+ limit => 0,
+ pathes => ['^\/api\/v1\/comment$', ],
+ fields => ["/title", "/comment"],
+ },
];
$app->hook(around_action => sub {
return $next->() if !$config->{enable};
# calculation score
- my $score = 0.0;
my $post_data;
-
if ($c->req->headers->content_type =~ m/^.*\/json(\s*|;.*)$/) {
# request body is JSON
$post_data = $c->req->json;
}
my $reason = "";
+ my $score = 0.0;
my $max_score = 0.0;
if ($post_data) {
+ # get filters
+ my $filters = $c->model('filters')->select;
+ if (!$filters) {
+ $app->log->error("Plugin::PostFilter: cannot retrieve filters from database.");
+ return $next->();
+ }
+
#$app->log->debug(Dumper $post_data);
my $pointer = Mojo::JSON::Pointer->new($post_data);
+ #warn "target: " . Dumper $post_data;
+
for my $filter (@$filters) {
+ #warn "filter test:" . Dumper $filter;
+
# check if enabled
next if $filter->{status} eq "disabled";
# check for each field
my $match_count = 0;
for my $field (@{$filter->{fields}}) {
+ #warn "check $field field...";
if ($pointer->contains($field)) {
my $val = $pointer->get($field);
- my @matches = eval {$val =~ $filter->{regexp}};
+ #warn "check $filter->{regexp} for $val";
+ my @matches = eval {$val =~ /$filter->{regexp}/};
if ($@) {
$app->log->warn("Plugin::PostFilter: invalid regexp: $filter->{regexp}. filter ID: $filter->{id}");
}
$match_count += @matches;
}
}
+ #warn "$match_count matches";
# ceiling by limit
if ($filter->{limit} > 0 && $match_count > $filter->{limit}) {
$reason = $filter->{message};
}
}
+ #warn "score: $score";
}
}
--- /dev/null
+# -*-Perl-*-
+# PostFilter plugin tests
+
+use Mojo::Base -strict;
+use Test::More;
+use Test::Mojo;
+
+use Newslash::Util::TestMan;
+use Data::Dumper;
+use Newslash::Eventd::Handlers;
+
+my $t = Test::Mojo->new('Newslash::Web');
+my $test_man = Newslash::Util::TestMan->new($t);
+
+my $filters = $t->app->model('filters');
+
+my $user_name = "postfiltertest";
+my $admin_name = "postfilteradmin";
+my $test_passwd = "foobar";
+my ($user, $admin);
+
+my $cnf = $t->app->config->{PostFilter} ||= {};
+my $filter_enabled = $cnf->{enable} ||= 0;
+
+# prepare for test
+if ($t->app->mode eq 'test') {
+ # at first, create test users.
+ $user = $test_man->create_user($user_name, $test_passwd);
+ $admin = $test_man->create_admin($admin_name, $test_passwd);
+}
+
+subtest 'filter test' => sub {
+ if ($t->app->mode ne 'test') {
+ fail("mode is not 'test'");
+ return;
+ }
+
+ # clean-up all filter
+ $filters->delete;
+
+ # check if no filter exists
+ my $filter_items = $filters->select;
+ ok($filter_items, "filter select succeed");
+ is(@$filter_items, 0, "no filter exists");
+
+ # clean-up all submissions
+ #$t->app->model('submissions')->hard_delete;
+ #ok(my $subs = $t->app->model('submissions')->select, "get submissions");
+ #is(@$subs, 0, "all submission deleted");
+
+ # login
+ $test_man->login($admin);
+
+ # enable post filter
+ $cnf->{enable} ||= 1;
+
+ # append filter
+ my $error_message = "error_message";
+ my $params = { action => "create",
+ name => "test_filter",
+ description => "test_description",
+ message => $error_message,
+ regexp => '^\A\s*1\s*get\s*\z',
+ fields => "/item/introtext /item/bodytext /item/title",
+ pathes => '^/api/v1/submission$',
+ };
+ $t->post_ok('/api/v1/admin/filter' => {Accept => '*/*'} => json => $params)
+ ->status_is(200)
+ ->json_has('/filter_id');
+ if (!$t->success) {
+ diag Dumper $t->tx->res;
+ }
+
+ my $filter_id = 0;
+ if ($t->tx->res->json) {
+ $filter_id = $t->tx->res->json->{filter_id};
+ }
+
+ # logout
+ $test_man->logout;
+
+ # do posting (expect to filter)
+ my $test_data = {
+ action => 'preview',
+ item => {
+ title => "テストタレコミ @ " . localtime,
+ introtext => "1 get"
+ },
+ };
+
+ $t->post_ok('/api/v1/submission' => {Accept => '*/*'} => json => $test_data)
+ ->status_is(400)
+ ->content_type_like(qr/application\/json/)
+ ->json_has('/error')
+ ->json_is('/reason', "post_is_filtered")
+ ->json_is('/message', $error_message);
+ if (!$t->success) {
+ diag Dumper $t->tx->res->json;
+ }
+
+ # do posting (expect to no filter)
+ $test_data = {
+ action => 'preview',
+ item => {
+ title => "テストタレコミ @ " . localtime,
+ introtext => "ほげほげ"
+ },
+ };
+
+ $t->post_ok('/api/v1/submission' => {Accept => '*/*'} => json => $test_data)
+ ->status_is(200)
+ ->content_type_like(qr/application\/json/);
+ if (!$t->success) {
+ diag Dumper $t->tx->res->json;
+ }
+
+ # clean-up all filter
+ $filters->delete;
+
+ # clean-up all submissions
+ #$t->app->model('submissions')->hard_delete;
+
+
+ # restore settings
+ $cnf->{enable} = $filter_enabled;
+
+};
+
+$test_man->cleanup;
+done_testing();