From 8311053d0881419c547802cda07ad9a6b534564b Mon Sep 17 00:00:00 2001 From: Yax Date: Sat, 15 Sep 2018 15:50:25 +0200 Subject: [PATCH] WIP --- app/core/cron.py | 30 +++++++++++------------------- app/core/mailer.py | 41 +++++++++++++++++++++++++++++++++++------ app/core/processor.py | 40 ---------------------------------------- app/interface/api.py | 1 - 4 files changed, 46 insertions(+), 66 deletions(-) delete mode 100644 app/core/processor.py diff --git a/app/core/cron.py b/app/core/cron.py index 932bf83..fcd8137 100644 --- a/app/core/cron.py +++ b/app/core/cron.py @@ -13,12 +13,10 @@ from model.comment import Site logger = logging.getLogger(__name__) -client_ips = {} - def cron(func): def wrapper(): - logger.debug("execute fun " + func) + logger.debug("execute CRON " + func.__name__) func() return wrapper @@ -27,16 +25,13 @@ def cron(func): @cron def fetch_mail_answers(): - msg = {} - - if msg["request"] == "new_mail": - reply_comment_email(msg["data"]) - mailer.delete(msg["data"]) - - # data = request.get_json() - # logger.debug(data) - - # processor.enqueue({'request': 'new_mail', 'data': data}) + for msg in mailer.fetch(): + m = re.search(r"\[(\d+)\:(\w+)\]", msg["subject"]) + if m: + full_msg = mailer.get(msg["id"]) + if full_msg: + reply_comment_email(full_msg) + mailer.delete(msg["id"]) @cron @@ -58,8 +53,8 @@ def submit_new_comment(): url=comment.url, comment=comment_text ) - site = Site.select().where(Site.id == Comment.site).get() # send email + site = Site.select().where(Site.id == Comment.site).get() subject = "STACOSYS %s: [%d:%s]" % (site.name, comment.id, site.token) mailer.send(site.admin_email, subject, email_body) logger.debug("new comment processed ") @@ -106,17 +101,13 @@ def reply_comment_email(data): # put a log to help fail2ban if message[:2].upper() == "SP": # SPAM - if comment_id in client_ips: + if comment.ip: logger.info( "SPAM comment from %s: %d" % (client_ips[comment_id], comment_id) ) else: logger.info("cannot identify SPAM source: %d" % comment_id) - # forget client IP - if comment_id in client_ips: - del client_ips[comment_id] - logger.info("discard comment: %d" % comment_id) comment.delete_instance() email_body = get_template("drop_comment").render(original=message) @@ -124,6 +115,7 @@ def reply_comment_email(data): else: # update Comment row comment.published = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + comment.ip = None comment.save() logger.info("commit comment: %d" % comment_id) diff --git a/app/core/mailer.py b/app/core/mailer.py index b58e6e1..8e54651 100644 --- a/app/core/mailer.py +++ b/app/core/mailer.py @@ -1,15 +1,44 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +import logging +import json +import requests +from conf import config + +logger = logging.getLogger(__name__) + def fetch(): - pass + mails = [] + r = requests.get(config.get(config.MAILER_URL) + "/mbox") + if r.status_code == 200: + logger.info("MAILER => " + str(r.json())) + payload = r.json() + if payload["count"] > 0: + mails = payload["emails"] + return mails -def send(email, subject, body): - pass +def get(id): + payload = None + r = requests.get(config.get(config.MAILER_URL) + "/mbox/" + id) + if r.status_code == 200: + payload = r.json() + return payload -def delete(content): - # TODO delete mail - pass +def send(to_email, subject, message): + headers = {"Content-Type": "application/json; charset=utf-8"} + msg = {"to": to_email, "subject": subject, "content": message} + r = requests.post( + config.get(config.MAILER_URL) + "/mbox", data=json.dumps(msg), headers=headers + ) + if r.status_code in (200, 201): + logger.debug("Email for %s posted" % to_email) + else: + logger.warn("Cannot post email for %s" % to_email) + + +def delete(id): + requests.delete(config.get(config.MAILER_URL) + "/mbox/" + id) diff --git a/app/core/processor.py b/app/core/processor.py deleted file mode 100644 index 148924d..0000000 --- a/app/core/processor.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import os -import logging -import re -import PyRSS2Gen -import markdown -import json -from datetime import datetime -from threading import Thread -from queue import Queue -from model.site import Site -from model.comment import Comment -from helper.hashing import md5 -from conf import config -from core import mailer - - -logger = logging.getLogger(__name__) -queue = Queue() -proc = None -env = None - -# keep client IP in memory until classified -client_ips = {} - - - - - -def get_email_metadata(message): - # retrieve metadata reader email from email body sent by admin - email = "" - m = re.search(r"email:\s(.+@.+\..+)", message) - if m: - email = m.group(1) - return email - - diff --git a/app/interface/api.py b/app/interface/api.py index 8aba222..c6f17f8 100644 --- a/app/interface/api.py +++ b/app/interface/api.py @@ -6,7 +6,6 @@ from flask import request, jsonify, abort from model.site import Site from model.comment import Comment from conf import config -from core import processor logger = logging.getLogger(__name__) app = config.flaskapp()