From 3fa4434d417c4bc85916ed79cc7bbb324b2768ac Mon Sep 17 00:00:00 2001 From: HombreLaser Date: Mon, 5 Feb 2024 12:53:22 -0600 Subject: Add blacklist matching --- src/controllers/comments_controller.py | 3 --- src/lib/__init__.py | 1 + src/lib/blacklist_matcher.py | 19 +++++++++++++++++++ src/services/callback.py | 6 ++++++ src/services/comment_creation_callbacks.py | 27 +++++++++++++++++++++++++++ src/services/create_comment_service.py | 3 +++ 6 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 src/lib/__init__.py create mode 100644 src/lib/blacklist_matcher.py create mode 100644 src/services/callback.py create mode 100644 src/services/comment_creation_callbacks.py (limited to 'src') 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() -- cgit v1.2.3