@@ -242,7 +242,6 @@ async def show_job(request: Request, job_id: str) -> HTMLResponse:
242242 "downloads" : store .list_download_entries (record ),
243243 "log_sections" : _collect_log_sections (store .logs_dir (job_id )),
244244 "flow_svg" : _first_matching (store .artifacts_dir (job_id ), ".svg" ),
245- "flow_svg_markup" : _read_flow_svg_markup (store .artifacts_dir (job_id )),
246245 "settings" : settings ,
247246 "analyze_defaults" : analyze_defaults ,
248247 }
@@ -305,6 +304,7 @@ async def run_analyze(
305304 local_support_defaults = _local_support_file_defaults (settings )
306305 hosts_path = await _resolve_support_file (
307306 store = store ,
307+ settings = settings ,
308308 record = record ,
309309 label = "hosts" ,
310310 raw_path = hosts_file ,
@@ -313,6 +313,7 @@ async def run_analyze(
313313 )
314314 mapping_path = await _resolve_support_file (
315315 store = store ,
316+ settings = settings ,
316317 record = record ,
317318 label = "mapping" ,
318319 raw_path = mapping_file ,
@@ -321,6 +322,7 @@ async def run_analyze(
321322 )
322323 subnets_path = await _resolve_support_file (
323324 store = store ,
325+ settings = settings ,
324326 record = record ,
325327 label = "subnets" ,
326328 raw_path = subnets_file ,
@@ -329,6 +331,7 @@ async def run_analyze(
329331 )
330332 ss7pcs_path = await _resolve_support_file (
331333 store = store ,
334+ settings = settings ,
332335 record = record ,
333336 label = "ss7pcs" ,
334337 raw_path = ss7pcs_file ,
@@ -337,6 +340,7 @@ async def run_analyze(
337340 )
338341 network_element_mapping_path = await _resolve_support_file (
339342 store = store ,
343+ settings = settings ,
340344 record = record ,
341345 label = "network-element-mapping" ,
342346 raw_path = network_element_mapping_file ,
@@ -931,6 +935,7 @@ def _parse_optional_float(value: str) -> float | None:
931935async def _resolve_support_file (
932936 * ,
933937 store : JobStore ,
938+ settings : WebSettings ,
934939 record : JobRecord ,
935940 label : str ,
936941 raw_path : str ,
@@ -954,13 +959,14 @@ async def _resolve_support_file(
954959 candidate = text or default_path
955960 if not candidate :
956961 return None
957- return str (_validate_support_path (candidate , store = store , record = record ))
962+ return str (_validate_support_path (candidate , store = store , settings = settings , record = record ))
958963
959964
960- def _validate_support_path (value : str , * , store : JobStore , record : JobRecord ) -> Path :
965+ def _validate_support_path (value : str , * , store : JobStore , settings : WebSettings , record : JobRecord ) -> Path :
961966 path = Path (value )
962967 resolved = path .resolve ()
963- allowed_roots = (store .support_dir (record .job_id ), store .workdir .parent / ".local" , store .workdir .parent )
968+ configured_root = settings .support_files_root or settings .local_workspace_dir
969+ allowed_roots = (store .support_dir (record .job_id ), configured_root )
964970 for root in allowed_roots :
965971 try :
966972 return ensure_within (root , resolved )
@@ -1064,20 +1070,6 @@ def _read_log(path: Path) -> str:
10641070 return data [- 8000 :]
10651071
10661072
1067- def _read_flow_svg_markup (folder : Path ) -> str | None :
1068- filename = _first_matching (folder , ".svg" )
1069- if not filename :
1070- return None
1071- path = folder / filename
1072- data = path .read_text (encoding = "utf-8" , errors = "replace" )
1073- lowered = data .lower ()
1074- if not data .lstrip ().startswith ("<svg" ):
1075- return None
1076- if "<script" in lowered or "javascript:" in lowered :
1077- return None
1078- return data
1079-
1080-
10811073def _collect_log_sections (logs_dir : Path ) -> list [dict [str , str ]]:
10821074 sections : list [dict [str , str ]] = []
10831075 for prefix , label in (
0 commit comments