From 906216affcd983299e63c4f06dc92d8a4d6592b6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andrej=20Rama=C5=A1euski?= <andrej@x2.cz>
Date: Thu, 7 Jan 2021 00:19:00 +0100
Subject: [PATCH] Limity na editaci a zakaz likovani navrhu postupu regp

---
 .gitlab-ci.yml             |  2 +-
 cf.conf                    |  3 +++
 lib/CF.pm                  |  2 +-
 lib/CF/Controller/Posts.pm | 40 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 45 insertions(+), 2 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index b50be78..cea2c7e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,7 +2,7 @@ image: docker:19.03.12
 
 variables:
   DOCKER_TLS_CERTDIR: "/certs"
-  IMAGE_VER: 1.8.4
+  IMAGE_VER: 1.9.0
 
 services:
   - docker:19.03.12-dind
diff --git a/cf.conf b/cf.conf
index 6e08762..268c996 100644
--- a/cf.conf
+++ b/cf.conf
@@ -7,4 +7,7 @@
   jitsi_room           => 'cf2021',
   jitsi_token_secret   => 'UtfkxQEpudmCh2MKLXrRmHAXoQwg5twF',
   jitsi_token_lifetime => 300,
+  limit_post_count     => 64,
+  limit_post_add_rate  => 1,
+  limit_post_edit_rate => 4,
 }
diff --git a/lib/CF.pm b/lib/CF.pm
index fae3ee9..a703d0a 100644
--- a/lib/CF.pm
+++ b/lib/CF.pm
@@ -46,7 +46,7 @@ sub startup {
         plugins                        => [qw(+SpecRenderer +Cors +Security)],
         render_specification           => 1,
         render_specification_for_paths => 1,
-        default_response_codes         => [400, 401, 403, 404, 500, 501],
+        default_response_codes         => [400, 401, 403, 404, 429, 500, 501],
 
         security => {
             Bearer => sub {
diff --git a/lib/CF/Controller/Posts.pm b/lib/CF/Controller/Posts.pm
index a59f381..18a2d5c 100644
--- a/lib/CF/Controller/Posts.pm
+++ b/lib/CF/Controller/Posts.pm
@@ -31,6 +31,26 @@ sub create ($c) {
         return $c->error(403, 'Debate closed');
     }
 
+    # limit poctu prispevku jedneho uzivatele k jednemu bodu
+    my $limit = $c->schema->resultset('Post')->count({
+        program_entry_id => $program_entry->id,
+        user_id          => $c->user->{id},
+    });
+
+    if ( $limit > $c->cfg->{limit_post_count}) {
+        return $c->error(429, 'Too many post from user');
+    }
+
+    # limit poctu prispevku za minutu
+    $limit = $c->schema->resultset('Post')->count({
+        user_id          => $c->user->{id},
+        datetime         => { '>' => \"now()-'1 min'::interval" },
+    });
+
+    if ( $limit >= $c->cfg->{limit_post_add_rate}) {
+        return $c->error(429, 'Too many posts per minute');
+    }
+
     my $post = $program_entry->add_to_posts({
         user_id          => $c->user->{id},
         type             => $args->{type},
@@ -159,6 +179,17 @@ sub update ($c) {
     my $post = $c->schema->resultset('Post')->find($c->stash->{id});
     return $c->error(404, 'Post not found') if ! $post;
 
+    # limit poctu prispevku za minutu
+    my $limit = $c->schema->resultset('PostHistory')->count({
+        user_id  => $c->user->{id},
+        post_id  => $post->id,
+        datetime => { '>' => \"now()-'1 min'::interval" },
+    });
+
+    if ( $limit >= $c->cfg->{limit_post_edit_rate}) {
+        return $c->error(429, 'Too many posts changes per minute');
+    }
+
     if ( ! $c->user_roles->{chairman} ) {
         if ( $post->user_id != $c->user->{id} ) {
             return $c->error(403, 'Access deined');
@@ -254,6 +285,11 @@ sub ranking ($c) {
     my $post = $c->schema->resultset('Post')->find($c->stash->{id});
     return $c->error(404, 'Post not found') if ! $post;
 
+    if ( $post->type == 0 and ! $c->user_roles->{member} ) {
+        $c->render(status => 403, text => '');
+        return;
+    }
+
     my $user_ranking = $post->rankings({
         user_id => $c->user->{id},
     })->first;
@@ -312,4 +348,8 @@ sub ranking ($c) {
     $c->render(status => 204, text => '');
 }
 
+
+
+
+
 1;
-- 
GitLab