Replaced way too lax SourceRootFileLoader with SelectedFileLoader

This commit is contained in:
Gina Häußge 2015-11-26 19:51:57 +01:00
parent fc4e786745
commit 6f83a175da
2 changed files with 41 additions and 26 deletions

View file

@ -635,30 +635,8 @@ class Server():
if octoprint.util.is_running_from_source():
root = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../.."))
allowed = ["AUTHORS.md", "CHANGELOG.md", "THIRDPARTYLICENSES.md"]
class SourceRootFilesystemLoader(jinja2.FileSystemLoader):
def __init__(self, template_filter, prefix, *args, **kwargs):
jinja2.FileSystemLoader.__init__(self, *args, **kwargs)
self._filter = template_filter
if not prefix.endswith("/"):
prefix += "/"
self._prefix = prefix
def get_source(self, environment, template):
if not template.startswith(self._prefix):
raise jinja2.TemplateNotFound(template)
template = template[len(self._prefix):]
if not self._filter(template):
raise jinja2.TemplateNotFound(template)
return jinja2.FileSystemLoader.get_source(self, environment, template)
def list_templates(self):
templates = jinja2.FileSystemLoader.list_templates(self)
return map(lambda t: self._prefix + t, filter(self._filter, templates))
loaders.append(SourceRootFilesystemLoader(lambda t: t in allowed, "_data/", root))
files = {name: os.path.join(root, name) for name in allowed}
loaders.append(octoprint.util.jinja.SelectedFilesLoader(files))
jinja_loader = jinja2.ChoiceLoader(loaders)
app.jinja_loader = jinja_loader

View file

@ -10,7 +10,7 @@ import os
from jinja2 import nodes
from jinja2.ext import Extension
from jinja2.loaders import FileSystemLoader, PrefixLoader, ChoiceLoader, \
TemplateNotFound, split_template_path
BaseLoader, TemplateNotFound, split_template_path
class FilteredFileSystemLoader(FileSystemLoader):
"""
@ -54,6 +54,39 @@ class FilteredFileSystemLoader(FileSystemLoader):
return all(filter_results)
class SelectedFilesLoader(BaseLoader):
def __init__(self, files, encoding="utf-8"):
self.files = files
self.encoding = encoding
def get_source(self, environment, template):
if not template in self.files:
raise TemplateNotFound(template)
from jinja2.loaders import open_if_exists
path = self.files[template]
f = open_if_exists(path)
if f is None:
raise TemplateNotFound(template)
try:
contents = f.read().decode(self.encoding)
finally:
f.close()
mtime = os.path.getmtime(path)
def uptodate():
try:
return os.path.getmtime(path) == mtime
except OSError:
return False
return contents, path, uptodate
def list_templates(self):
return self.files.keys()
class ExceptionHandlerExtension(Extension):
tags = {"try"}
@ -115,7 +148,11 @@ def get_all_template_paths(loader):
return files
def collect_templates_for_loader(loader):
if isinstance(loader, FilteredFileSystemLoader):
if isinstance(loader, SelectedFilesLoader):
import copy
return copy.copy(loader.files.values())
elif isinstance(loader, FilteredFileSystemLoader):
result = []
for folder in loader.searchpath:
result += walk_folder(folder)