summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHombreLaser <sebastian-440@live.com>2024-02-05 12:53:22 -0600
committerHombreLaser <sebastian-440@live.com>2024-02-05 12:53:22 -0600
commit3fa4434d417c4bc85916ed79cc7bbb324b2768ac (patch)
treee2c1586b94f5ac877ad0a260cd95876e99be59da
parentbc01c595dc4f78bcbeb81577f4947b42bf8f9d61 (diff)
Add blacklist matching
-rw-r--r--config/__init__.py3
-rw-r--r--requests.http2
-rw-r--r--src/controllers/comments_controller.py3
-rw-r--r--src/lib/__init__.py1
-rw-r--r--src/lib/blacklist_matcher.py19
-rw-r--r--src/services/callback.py6
-rw-r--r--src/services/comment_creation_callbacks.py27
-rw-r--r--src/services/create_comment_service.py3
8 files changed, 59 insertions, 5 deletions
diff --git a/config/__init__.py b/config/__init__.py
index dcaeefc..24ff968 100644
--- a/config/__init__.py
+++ b/config/__init__.py
@@ -3,7 +3,6 @@ import re
import sqlalchemy.exc as sqlalchemy_exceptions
from src.database import db, init_db
from src.database.models import Blog
-import src.controllers as app_controllers
with open('config.toml', 'rb') as config_file:
user_config = tomllib.load(config_file)
@@ -46,6 +45,8 @@ def initialize_blogs(app):
def initialize_blueprints(app):
+ import src.controllers as app_controllers
+
controller_regex = re.compile('_controller$')
controllers = [definition for definition in dir(app_controllers)
if controller_regex.search(definition) is not None]
diff --git a/requests.http b/requests.http
index 52ecad4..c791503 100644
--- a/requests.http
+++ b/requests.http
@@ -2,6 +2,6 @@ POST http://localhost:5000/what/a/good/post/comments
Content-Type: application/json
{
"email": "awesome@example.org",
- "content": "This is a comment",
+ "content": "This is a comment. Hey man, sorry but this is\\na bad not word ok? No hard feelings.",
"domain": "localhost:5000"
}
diff --git a/src/controllers/comments_controller.py b/src/controllers/comments_controller.py
index 20fe3c4..1bbb0f8 100644
--- a/src/controllers/comments_controller.py
+++ b/src/controllers/comments_controller.py
@@ -1,7 +1,4 @@
from flask import Blueprint, request, abort, render_template
-from sqlalchemy import select
-from src.database.models import Blog, Comment
-from src.database import db
from src.services import CreateCommentService
diff --git a/src/lib/__init__.py b/src/lib/__init__.py
new file mode 100644
index 0000000..4c7efe4
--- /dev/null
+++ b/src/lib/__init__.py
@@ -0,0 +1 @@
+from src.lib.blacklist_matcher import contains_forbidden_term
diff --git a/src/lib/blacklist_matcher.py b/src/lib/blacklist_matcher.py
new file mode 100644
index 0000000..0f28953
--- /dev/null
+++ b/src/lib/blacklist_matcher.py
@@ -0,0 +1,19 @@
+import re
+from functools import cache
+from config import user_config
+
+
+def contains_forbidden_term(comment):
+ matcher = build_matcher()
+
+ return matcher.search(comment) is not None
+
+
+@cache
+def build_matcher():
+ regex_string = ''
+
+ for word in user_config['Env']['blacklist']:
+ regex_string += f"{word}|"
+
+ return re.compile(regex_string.removesuffix('|'))
diff --git a/src/services/callback.py b/src/services/callback.py
new file mode 100644
index 0000000..5dc3149
--- /dev/null
+++ b/src/services/callback.py
@@ -0,0 +1,6 @@
+class Callback:
+ def _moderate(self):
+ pass
+
+ def deliver_notification(self):
+ pass
diff --git a/src/services/comment_creation_callbacks.py b/src/services/comment_creation_callbacks.py
new file mode 100644
index 0000000..5f5d024
--- /dev/null
+++ b/src/services/comment_creation_callbacks.py
@@ -0,0 +1,27 @@
+import src.lib as lib
+from config import user_config
+from src.services.callback import Callback
+
+
+class CommentCreationCallbacks(Callback):
+ """
+ Check config for blacklists, moderation behavior and
+ notification delivery.
+ """
+ def __init__(self, comment):
+ self._comment = comment
+
+ def run_callbacks(self):
+ self._moderate()
+ self._deliver_notification()
+
+ return self._comment
+
+ def _moderate(self):
+ if user_config['Env']['moderation'] == 'strict':
+ self._comment.approved = False
+ return
+
+ if lib.contains_forbidden_term(self._comment.content):
+ if user_config['Env']['blacklist_match_action'] == 'reject':
+ self._comment.approved = False
diff --git a/src/services/create_comment_service.py b/src/services/create_comment_service.py
index b995b25..97cf726 100644
--- a/src/services/create_comment_service.py
+++ b/src/services/create_comment_service.py
@@ -1,6 +1,7 @@
from sqlalchemy import select
from src.database.models import Blog, Comment
from src.database import db
+from src.services.comment_creation_callbacks import CommentCreationCallbacks
class CreateCommentService:
@@ -26,6 +27,8 @@ class CreateCommentService:
comment = Comment(blog_id=self._blog_id, content=self._content,
email=self._email, author=self._author,
post=self._post, language='en')
+ comment_callbacks = CommentCreationCallbacks(comment)
+ comment = comment_callbacks.run_callbacks()
db.session.add(comment)
db.session.commit()