diff --git a/canaille/account.py b/canaille/account.py index 10111896..caa55f98 100644 --- a/canaille/account.py +++ b/canaille/account.py @@ -1,10 +1,8 @@ -import base64 import email.message import hashlib import pkg_resources import logging import smtplib -import urllib.request from flask import ( Blueprint, @@ -25,6 +23,7 @@ from .forms import ( PasswordResetForm, ForgottenPasswordForm, ) +from .apputils import base64logo from .flaskutils import current_user, user_needed, moderator_needed from .models import User @@ -227,15 +226,7 @@ def forgotten(): hash=profile_hash(user.uid[0], user.userPassword[0]), _external=True, ) - logo = None - logo_extension = None - if current_app.config.get("LOGO"): - logo_extension = current_app.config["LOGO"].split(".")[-1] - try: - with urllib.request.urlopen(current_app.config.get("LOGO")) as f: - logo = base64.b64encode(f.read()).decode("utf-8") - except (urllib.error.HTTPError, urllib.error.URLError): - pass + logo, logo_extension = base64logo() subject = _("Password reset on {website_name}").format( website_name=current_app.config.get("NAME", reset_url) diff --git a/canaille/apputils.py b/canaille/apputils.py new file mode 100644 index 00000000..b9a91f99 --- /dev/null +++ b/canaille/apputils.py @@ -0,0 +1,29 @@ +import base64 +import urllib.request +from flask import current_app, request + + +def base64logo(): + logo_url = current_app.config.get("LOGO") + if not logo_url: + return None, None + + logo_extension = logo_url.split(".")[-1] + 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: + logo = base64.b64encode(f.read()).decode("utf-8") + except (urllib.error.HTTPError, urllib.error.URLError): + logo = None + logo_extension = None + + return logo, logo_extension