mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-04-25 00:51:20 +00:00
fix(profiles): stage profile imports to prevent directory clobbering
This commit is contained in:
parent
08cb345e24
commit
51c1d2de16
2 changed files with 82 additions and 15 deletions
|
|
@ -455,6 +455,47 @@ class TestExportImport:
|
|||
with pytest.raises(FileExistsError):
|
||||
import_profile(str(archive_path), name="coder")
|
||||
|
||||
def test_import_with_explicit_name_does_not_mutate_existing_archive_root_profile(
|
||||
self, profile_env, tmp_path
|
||||
):
|
||||
create_profile("victim", no_alias=True)
|
||||
victim_dir = get_profile_dir("victim")
|
||||
(victim_dir / "marker.txt").write_text("original")
|
||||
|
||||
archive_path = tmp_path / "export" / "victim.tar.gz"
|
||||
archive_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
with tarfile.open(archive_path, "w:gz") as tf:
|
||||
data = b"imported"
|
||||
info = tarfile.TarInfo("victim/marker.txt")
|
||||
info.size = len(data)
|
||||
tf.addfile(info, io.BytesIO(data))
|
||||
|
||||
imported = import_profile(str(archive_path), name="renamed")
|
||||
|
||||
assert imported == get_profile_dir("renamed")
|
||||
assert (imported / "marker.txt").read_text() == "imported"
|
||||
assert (victim_dir / "marker.txt").read_text() == "original"
|
||||
|
||||
def test_import_rejects_archive_with_multiple_top_level_directories(
|
||||
self, profile_env, tmp_path
|
||||
):
|
||||
archive_path = tmp_path / "export" / "multi-root.tar.gz"
|
||||
archive_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
with tarfile.open(archive_path, "w:gz") as tf:
|
||||
for member_name, data in (
|
||||
("alpha/marker.txt", b"a"),
|
||||
("beta/marker.txt", b"b"),
|
||||
):
|
||||
info = tarfile.TarInfo(member_name)
|
||||
info.size = len(data)
|
||||
tf.addfile(info, io.BytesIO(data))
|
||||
|
||||
with pytest.raises(ValueError, match="exactly one top-level directory"):
|
||||
import_profile(str(archive_path), name="coder")
|
||||
|
||||
assert not get_profile_dir("coder").exists()
|
||||
|
||||
def test_import_rejects_traversal_archive_member(self, profile_env, tmp_path):
|
||||
archive_path = tmp_path / "export" / "evil.tar.gz"
|
||||
archive_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue