canaille-globuzma/canaille/apputils.py

92 lines
2.7 KiB
Python
Raw Normal View History

2021-12-01 10:44:15 +00:00
import base64
import email.message
2021-12-01 10:44:15 +00:00
import hashlib
import json
import logging
2020-12-10 16:42:58 +00:00
import mimetypes
import smtplib
2020-11-16 13:42:24 +00:00
import urllib.request
2020-12-10 16:42:58 +00:00
from email.utils import make_msgid
2020-11-16 13:42:24 +00:00
from flask import current_app, request
2021-12-01 10:44:15 +00:00
def obj_to_b64(obj):
return base64.b64encode(json.dumps(obj).encode("utf-8")).decode("utf-8")
def b64_to_obj(string):
return json.loads(base64.b64decode(string.encode("utf-8")).decode("utf-8"))
def profile_hash(*args):
return hashlib.sha256(
current_app.config["SECRET_KEY"].encode("utf-8")
+ obj_to_b64(args).encode("utf-8")
).hexdigest()
2020-12-10 16:42:58 +00:00
def logo():
2020-11-16 13:42:24 +00:00
logo_url = current_app.config.get("LOGO")
if not logo_url:
2020-12-10 16:42:58 +00:00
return None, None, None
2020-11-16 13:42:24 +00:00
2020-12-10 16:42:58 +00:00
logo_filename = logo_url.split("/")[-1]
2020-11-16 13:42:24 +00:00
if not logo_url.startswith("http"):
if current_app.config.get("SERVER_NAME"):
logo_url = "{}://{}/{}".format(
current_app.config.get("PREFERRED_URL_SCHEME"),
current_app.config.get("SERVER_NAME"),
logo_url,
)
else:
logo_url = "{}{}".format(request.url_root, logo_url)
try:
with urllib.request.urlopen(logo_url) as f:
2020-12-10 16:42:58 +00:00
logo_raw = f.read()
2020-11-16 13:42:24 +00:00
except (urllib.error.HTTPError, urllib.error.URLError):
2020-12-10 16:42:58 +00:00
logo_filename = None
logo_raw = None
2020-11-16 13:42:24 +00:00
2020-12-10 16:42:58 +00:00
domain = current_app.config["SMTP"]["FROM_ADDR"].split("@")[-1]
logo_cid = make_msgid(domain=domain)
return logo_cid, logo_filename, logo_raw
2020-12-10 16:42:58 +00:00
def send_email(subject, recipient, text, html, sender=None, attachements=None):
msg = email.message.EmailMessage()
msg.set_content(text)
msg.add_alternative(html, subtype="html")
msg["Subject"] = subject
2020-12-10 16:42:58 +00:00
msg["From"] = sender or current_app.config["SMTP"]["FROM_ADDR"]
msg["To"] = recipient
2020-12-10 16:42:58 +00:00
attachements = attachements or []
for cid, filename, value in attachements:
maintype, subtype = mimetypes.guess_type(filename)[0].split("/")
msg.get_payload()[1].add_related(
value, maintype=maintype, subtype=subtype, cid=cid
)
try:
with smtplib.SMTP(
host=current_app.config["SMTP"]["HOST"],
port=current_app.config["SMTP"]["PORT"],
) as smtp:
if current_app.config["SMTP"].get("TLS"):
smtp.starttls()
if current_app.config["SMTP"].get("LOGIN"):
smtp.login(
user=current_app.config["SMTP"]["LOGIN"],
password=current_app.config["SMTP"].get("PASSWORD"),
)
smtp.send_message(msg)
except smtplib.SMTPRecipientsRefused:
pass
except OSError:
logging.exception("Could not send password reset email")
return False
return True