summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Lord <davidism@gmail.com>2022-03-15 12:11:30 -0700
committerDavid Lord <davidism@gmail.com>2022-03-15 13:58:22 -0700
commit040088a39527825c03107f17695d13a1752cc2f3 (patch)
treec757c7691c650aca1a7c0d7124455217f37d9eb9
parent3a050b122ed8c7b3b6bf0116cb91bd9d5eac7d8f (diff)
downloadjinja2-040088a39527825c03107f17695d13a1752cc2f3.tar.gz
use `posixpath.join` when loading template names
-rw-r--r--CHANGES.rst3
-rw-r--r--src/jinja2/loaders.py11
-rw-r--r--tests/test_loader.py7
3 files changed, 15 insertions, 6 deletions
diff --git a/CHANGES.rst b/CHANGES.rst
index 88e167d..5770eff 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -36,6 +36,9 @@ Unreleased
- The ``groupby`` filter is case-insensitive by default, matching
other comparison filters. Added the ``case_sensitive`` parameter to
control this. :issue:`1463`
+- Windows drive-relative path segments in template names will not
+ result in ``FileSystemLoader`` and ``PackageLoader`` loading from
+ drive-relative paths. :pr:`1621`
Version 3.0.3
diff --git a/src/jinja2/loaders.py b/src/jinja2/loaders.py
index d7d9bd0..e255cd4 100644
--- a/src/jinja2/loaders.py
+++ b/src/jinja2/loaders.py
@@ -3,6 +3,7 @@ sources.
"""
import importlib.util
import os
+import posixpath
import sys
import typing as t
import weakref
@@ -193,7 +194,9 @@ class FileSystemLoader(BaseLoader):
) -> t.Tuple[str, str, t.Callable[[], bool]]:
pieces = split_template_path(template)
for searchpath in self.searchpath:
- filename = os.path.join(searchpath, *pieces)
+ # Use posixpath even on Windows to avoid "drive:" or UNC
+ # segments breaking out of the search directory.
+ filename = posixpath.join(searchpath, *pieces)
f = open_if_exists(filename)
if f is None:
continue
@@ -296,7 +299,7 @@ class PackageLoader(BaseLoader):
if isinstance(loader, zipimport.zipimporter):
self._archive = loader.archive
pkgdir = next(iter(spec.submodule_search_locations)) # type: ignore
- template_root = os.path.join(pkgdir, package_path)
+ template_root = os.path.join(pkgdir, package_path).rstrip(os.path.sep)
else:
roots: t.List[str] = []
@@ -326,7 +329,9 @@ class PackageLoader(BaseLoader):
def get_source(
self, environment: "Environment", template: str
) -> t.Tuple[str, str, t.Optional[t.Callable[[], bool]]]:
- p = os.path.join(self._template_root, *split_template_path(template))
+ # Use posixpath even on Windows to avoid "drive:" or UNC
+ # segments breaking out of the search directory.
+ p = posixpath.join(self._template_root, *split_template_path(template))
up_to_date: t.Optional[t.Callable[[], bool]]
if self._archive is None:
diff --git a/tests/test_loader.py b/tests/test_loader.py
index b300c8f..8123583 100644
--- a/tests/test_loader.py
+++ b/tests/test_loader.py
@@ -3,6 +3,7 @@ import importlib.machinery
import importlib.util
import os
import platform
+import posixpath
import shutil
import sys
import tempfile
@@ -303,7 +304,7 @@ def package_dir_loader(monkeypatch):
def test_package_dir_source(package_dir_loader, template, expect):
source, name, up_to_date = package_dir_loader.get_source(None, template)
assert source.rstrip() == expect
- assert name.endswith(os.path.join(*split_template_path(template)))
+ assert name.endswith(posixpath.join(*split_template_path(template)))
assert up_to_date()
@@ -325,7 +326,7 @@ def package_file_loader(monkeypatch):
def test_package_file_source(package_file_loader, template, expect):
source, name, up_to_date = package_file_loader.get_source(None, template)
assert source.rstrip() == expect
- assert name.endswith(os.path.join(*split_template_path(template)))
+ assert name.endswith(posixpath.join(*split_template_path(template)))
assert up_to_date()
@@ -348,7 +349,7 @@ def package_zip_loader(monkeypatch):
def test_package_zip_source(package_zip_loader, template, expect):
source, name, up_to_date = package_zip_loader.get_source(None, template)
assert source.rstrip() == expect
- assert name.endswith(os.path.join(*split_template_path(template)))
+ assert name.endswith(posixpath.join(*split_template_path(template)))
assert up_to_date is None