From f11aa6df762733934f7a61e937d9892af985029c Mon Sep 17 00:00:00 2001 From: Aevann1 Date: Sun, 19 Sep 2021 20:38:24 +0200 Subject: [PATCH] fsfs --- files/classes/mod_logs.py | 12 ++--- files/classes/user.py | 3 +- files/helpers/wrappers.py | 4 -- files/mail/__init__.py | 102 +++++++++++++++++++++++++++++++++++++- files/mail/mail.py | 101 ------------------------------------- files/routes/admin.py | 1 - files/routes/comments.py | 4 -- files/routes/reporting.py | 2 - files/routes/users.py | 3 -- 9 files changed, 106 insertions(+), 126 deletions(-) delete mode 100644 files/mail/mail.py diff --git a/files/classes/mod_logs.py b/files/classes/mod_logs.py index 97d07c630..ab75432ca 100644 --- a/files/classes/mod_logs.py +++ b/files/classes/mod_logs.py @@ -99,14 +99,10 @@ class ModAction(Base): @property @lazy def target_link(self): - if self.target_user: - return f'{self.target_user.username}' - elif self.target_post: - return f'{self.target_post.title}' - elif self.target_comment: - return f'comment' - else: - return "" + if self.target_user: return f'{self.target_user.username}' + elif self.target_post: return f'{self.target_post.title.replace("<","").replace(">","")}' + elif self.target_comment: return f'comment' + else: return "" @property @lazy diff --git a/files/classes/user.py b/files/classes/user.py index b556272c8..1566b6771 100644 --- a/files/classes/user.py +++ b/files/classes/user.py @@ -1,7 +1,6 @@ -from sqlalchemy.orm import deferred, contains_eager, aliased +from sqlalchemy.orm import deferred, aliased from secrets import token_hex import pyotp - from files.helpers.discord import remove_user from files.helpers.images import * from files.helpers.const import * diff --git a/files/helpers/wrappers.py b/files/helpers/wrappers.py index f40a080d6..5cfaea7db 100644 --- a/files/helpers/wrappers.py +++ b/files/helpers/wrappers.py @@ -1,9 +1,5 @@ -from random import vonmisesvariate -from sqlalchemy.sql import visitors -from werkzeug.wrappers.response import Response as RespObj from .get import * from .alerts import send_notification -from files.__main__ import app from files.helpers.const import * diff --git a/files/mail/__init__.py b/files/mail/__init__.py index 2db6c49d0..6ab92ed6a 100644 --- a/files/mail/__init__.py +++ b/files/mail/__init__.py @@ -1 +1,101 @@ -from .mail import * +from os import environ +import requests +import time +from flask import * +from urllib.parse import quote + +from files.helpers.security import * +from files.helpers.wrappers import * +from files.classes import * +from files.__main__ import app + +site = environ.get("DOMAIN").strip() +name = environ.get("SITE_NAME").strip() +mailgun_domain = environ.get("MAILGUN_DOMAIN", "").strip() + +def send_mail(to_address, subject, html, plaintext=None, files={}, + from_address=f"{name} "): + + url = f"https://api.mailgun.net/v3/{mailgun_domain}/messages" + + data = {"from": from_address, + "to": [to_address], + "subject": subject, + "text": plaintext, + "html": html, + } + + return requests.post(url, + auth=( + "api", environ.get("MAILGUN_KEY").strip()), + data=data, + files=[("attachment", (k, files[k])) for k in files] + ) + + +def send_verification_email(user, email=None): + + if not email: + email = user.email + + url = f"https://{app.config['SERVER_NAME']}/activate" + now = int(time.time()) + + token = generate_hash(f"{email}+{user.id}+{now}") + params = f"?email={quote(email)}&id={user.id}&time={now}&token={token}" + + link = url + params + + send_mail(to_address=email, + html=render_template("email/email_verify.html", + action_url=link, + v=user), + subject=f"Validate your {name} account email." + ) + + +@app.post("/verify_email") +@auth_required +def api_verify_email(v): + + send_verification_email(v) + + return {"message": "Email has been sent (ETA ~5 minutes)"} + + +@app.get("/activate") +@auth_desired +def activate(v): + + email = request.values.get("email", "") + id = request.values.get("id", "") + timestamp = int(request.values.get("time", "0")) + token = request.values.get("token", "") + + if int(time.time()) - timestamp > 3600: + return render_template("message.html", v=v, title="Verification link expired.", + message="That link has expired. Visit your settings to send yourself another verification email."), 410 + + if not validate_hash(f"{email}+{id}+{timestamp}", token): + abort(403) + + user = g.db.query(User).options(lazyload('*')).filter_by(id=id).first() + if not user: + abort(404) + + if user.is_activated and user.email == email: + return render_template("message_success.html", v=v, + title="Email already verified.", message="Email already verified."), 404 + + user.email = email + user.is_activated = True + + if not any([b.badge_id == 2 for b in user.badges]): + mail_badge = Badge(user_id=user.id, + badge_id=2) + g.db.add(mail_badge) + + g.db.add(user) + g.db.commit() + + return render_template("message_success.html", v=v, title="Email verified.", message=f"Your email {email} has been verified. Thank you.") diff --git a/files/mail/mail.py b/files/mail/mail.py deleted file mode 100644 index 6ab92ed6a..000000000 --- a/files/mail/mail.py +++ /dev/null @@ -1,101 +0,0 @@ -from os import environ -import requests -import time -from flask import * -from urllib.parse import quote - -from files.helpers.security import * -from files.helpers.wrappers import * -from files.classes import * -from files.__main__ import app - -site = environ.get("DOMAIN").strip() -name = environ.get("SITE_NAME").strip() -mailgun_domain = environ.get("MAILGUN_DOMAIN", "").strip() - -def send_mail(to_address, subject, html, plaintext=None, files={}, - from_address=f"{name} "): - - url = f"https://api.mailgun.net/v3/{mailgun_domain}/messages" - - data = {"from": from_address, - "to": [to_address], - "subject": subject, - "text": plaintext, - "html": html, - } - - return requests.post(url, - auth=( - "api", environ.get("MAILGUN_KEY").strip()), - data=data, - files=[("attachment", (k, files[k])) for k in files] - ) - - -def send_verification_email(user, email=None): - - if not email: - email = user.email - - url = f"https://{app.config['SERVER_NAME']}/activate" - now = int(time.time()) - - token = generate_hash(f"{email}+{user.id}+{now}") - params = f"?email={quote(email)}&id={user.id}&time={now}&token={token}" - - link = url + params - - send_mail(to_address=email, - html=render_template("email/email_verify.html", - action_url=link, - v=user), - subject=f"Validate your {name} account email." - ) - - -@app.post("/verify_email") -@auth_required -def api_verify_email(v): - - send_verification_email(v) - - return {"message": "Email has been sent (ETA ~5 minutes)"} - - -@app.get("/activate") -@auth_desired -def activate(v): - - email = request.values.get("email", "") - id = request.values.get("id", "") - timestamp = int(request.values.get("time", "0")) - token = request.values.get("token", "") - - if int(time.time()) - timestamp > 3600: - return render_template("message.html", v=v, title="Verification link expired.", - message="That link has expired. Visit your settings to send yourself another verification email."), 410 - - if not validate_hash(f"{email}+{id}+{timestamp}", token): - abort(403) - - user = g.db.query(User).options(lazyload('*')).filter_by(id=id).first() - if not user: - abort(404) - - if user.is_activated and user.email == email: - return render_template("message_success.html", v=v, - title="Email already verified.", message="Email already verified."), 404 - - user.email = email - user.is_activated = True - - if not any([b.badge_id == 2 for b in user.badges]): - mail_badge = Badge(user_id=user.id, - badge_id=2) - g.db.add(mail_badge) - - g.db.add(user) - g.db.commit() - - return render_template("message_success.html", v=v, title="Email verified.", message=f"Your email {email} has been verified. Thank you.") diff --git a/files/routes/admin.py b/files/routes/admin.py index 3e280f36a..d244172d4 100644 --- a/files/routes/admin.py +++ b/files/routes/admin.py @@ -3,7 +3,6 @@ import calendar from sqlalchemy.orm import lazyload import imagehash from os import remove -from os.path import exists from PIL import Image as IMAGE from files.helpers.wrappers import * diff --git a/files/routes/comments.py b/files/routes/comments.py index 512ab9581..21fe10641 100644 --- a/files/routes/comments.py +++ b/files/routes/comments.py @@ -1,6 +1,3 @@ -import traceback -import sys - from files.helpers.wrappers import * from files.helpers.filters import * from files.helpers.alerts import * @@ -10,7 +7,6 @@ from files.helpers.const import * from files.classes import * from files.routes.front import comment_idlist from pusher_push_notifications import PushNotifications - from flask import * from files.__main__ import app, limiter diff --git a/files/routes/reporting.py b/files/routes/reporting.py index 1781ed959..305243dde 100644 --- a/files/routes/reporting.py +++ b/files/routes/reporting.py @@ -2,8 +2,6 @@ from files.helpers.wrappers import * from files.helpers.get import * from flask import g from files.__main__ import app -from files.helpers.sanitize import sanitize -from os import path @app.post("/flag/post/") @auth_desired diff --git a/files/routes/users.py b/files/routes/users.py index 15e2aacbe..ce13728a8 100644 --- a/files/routes/users.py +++ b/files/routes/users.py @@ -1,9 +1,6 @@ import qrcode import io import time -import traceback -import sys - from files.classes.user import ViewerRelationship from files.helpers.alerts import * from files.helpers.sanitize import *