Skip to content

Commit eed1272

Browse files
authored
Merge pull request ceph#54773 from phlogistonjohn/jjm-cephadm-zipapp-templating-again
cephadm: simplify loading jinja2 templates from zipapp Reviewed-by: Adam King <[email protected]>
2 parents 9cba1f1 + 47858c5 commit eed1272

File tree

1 file changed

+12
-25
lines changed

1 file changed

+12
-25
lines changed

src/cephadm/cephadmlib/templating.py

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -34,27 +34,18 @@ def __init__(
3434
self,
3535
template: str,
3636
*,
37-
path: str = '',
3837
relative_path: str = '',
39-
archive_norm_path: str = '',
40-
archive_path: str = ''
38+
archive_path: str = '',
4139
) -> None:
4240
super().__init__(template)
43-
self.path = path
4441
self.relative_path = relative_path
45-
self.archive_norm_path = archive_norm_path
4642
self.archive_path = archive_path
4743

4844
def __str__(self) -> str:
49-
msg = self.message
50-
msg2 = ''
51-
if self.path or self.relative_path:
52-
msg2 += f' path [{self.path!r}, rel={self.relative_path!r}] not found'
53-
if self.archive_norm_path or self.archive_path:
54-
msg2 += f' in [{self.archive_norm_path!r}, orig={self.archive_path!r}]'
55-
if msg2:
56-
msg2 = ':' + msg2
57-
return f'{msg}{msg2}'
45+
return (
46+
f'{self.message}: path {self.relative_path!r}'
47+
f' not found in {self.archive_path!r}'
48+
)
5849

5950

6051
class _PackageLoader(jinja2.PackageLoader):
@@ -86,27 +77,23 @@ def get_source(
8677

8778
def _get_archive_source(self, template: str) -> Tuple[str, str, None]:
8879
assert isinstance(self._loader, zipimport.zipimporter)
89-
path = arelpath = os.path.normpath(
90-
posixpath.join(
91-
self._template_root,
92-
*jinja2.loaders.split_template_path(template)
93-
)
80+
arelpath = posixpath.join(
81+
self.package_name, self.package_path, template
9482
)
95-
archive_path = os.path.normpath(self._loader.archive)
96-
if arelpath.startswith(archive_path + '/'):
97-
plen = len(archive_path) + 1
98-
arelpath = arelpath[plen:]
83+
if any(p == '.' or p == '..' for p in arelpath.split(posixpath.sep)):
84+
raise ValueError('template path contains invalid components')
9985
try:
10086
source = cast(bytes, self._loader.get_data(arelpath))
10187
except OSError as e:
10288
not_found = TemplateNotFoundInZipApp(
10389
template,
104-
path=path,
10590
relative_path=arelpath,
106-
archive_norm_path=archive_path,
10791
archive_path=self._loader.archive,
10892
)
10993
raise not_found from e
94+
path = os.path.normpath(
95+
posixpath.join(self._loader.archive, arelpath)
96+
)
11097
return source.decode(self.encoding), path, None
11198

11299

0 commit comments

Comments
 (0)