From 3fa4434d417c4bc85916ed79cc7bbb324b2768ac Mon Sep 17 00:00:00 2001 From: HombreLaser Date: Mon, 5 Feb 2024 12:53:22 -0600 Subject: Add blacklist matching --- config/__init__.py | 3 ++- requests.http | 2 +- 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 +++ 8 files changed, 59 insertions(+), 5 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 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() -- cgit v1.2.3