Calculate absolute path for email templates

This commit is contained in:
Richard van der Hoff 2018-10-19 14:01:59 +01:00
parent c00f4d237b
commit cc325c7069
3 changed files with 21 additions and 28 deletions

1
changelog.d/4068.bugfix Normal file
View File

@ -0,0 +1 @@
Fix bug which prevented email notifications from being sent unless an absolute path was given for `email_templates`.

View File

@ -19,19 +19,13 @@ from __future__ import print_function
import email.utils import email.utils
import logging import logging
import os import os
import sys
import textwrap
from ._base import Config import pkg_resources
from ._base import Config, ConfigError
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
TEMPLATE_DIR_WARNING = """\
WARNING: The email notifier is configured to look for templates in '%(template_dir)s',
but no templates could be found there. We will fall back to using the example templates;
to get rid of this warning, leave 'email.template_dir' unset.
"""
class EmailConfig(Config): class EmailConfig(Config):
def read_config(self, config): def read_config(self, config):
@ -78,20 +72,22 @@ class EmailConfig(Config):
self.email_notif_template_html = email_config["notif_template_html"] self.email_notif_template_html = email_config["notif_template_html"]
self.email_notif_template_text = email_config["notif_template_text"] self.email_notif_template_text = email_config["notif_template_text"]
self.email_template_dir = email_config.get("template_dir") template_dir = email_config.get("template_dir")
# we need an absolute path, because we change directory after starting (and
# backwards-compatibility hack # we don't yet know what auxilliary templates like mail.css we will need).
if ( # (Note that loading as package_resources with jinja.PackageLoader doesn't
self.email_template_dir == "res/templates" # work for the same reason.)
and not os.path.isfile( if not template_dir:
os.path.join(self.email_template_dir, self.email_notif_template_text) template_dir = pkg_resources.resource_filename(
'synapse', 'res/templates'
) )
): template_dir = os.path.abspath(template_dir)
t = TEMPLATE_DIR_WARNING % {
"template_dir": self.email_template_dir, for f in self.email_notif_template_text, self.email_notif_template_html:
} p = os.path.join(template_dir, f)
print(textwrap.fill(t, width=80) + "\n", file=sys.stderr) if not os.path.isfile(p):
self.email_template_dir = None raise ConfigError("Unable to find email template file %s" % (p, ))
self.email_template_dir = template_dir
self.email_notif_for_new_users = email_config.get( self.email_notif_for_new_users = email_config.get(
"notif_for_new_users", True "notif_for_new_users", True

View File

@ -526,12 +526,8 @@ def load_jinja2_templates(config):
Returns: Returns:
(notif_template_html, notif_template_text) (notif_template_html, notif_template_text)
""" """
logger.info("loading jinja2") logger.info("loading email templates from '%s'", config.email_template_dir)
loader = jinja2.FileSystemLoader(config.email_template_dir)
if config.email_template_dir:
loader = jinja2.FileSystemLoader(config.email_template_dir)
else:
loader = jinja2.PackageLoader('synapse', 'res/templates')
env = jinja2.Environment(loader=loader) env = jinja2.Environment(loader=loader)
env.filters["format_ts"] = format_ts_filter env.filters["format_ts"] = format_ts_filter
env.filters["mxc_to_http"] = _create_mxc_to_http_filter(config) env.filters["mxc_to_http"] = _create_mxc_to_http_filter(config)