gulp-cli 1.1.6__tar.gz → 1.1.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {gulp_cli-1.1.6/src/gulp_cli.egg-info → gulp_cli-1.1.7}/PKG-INFO +1 -1
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/_version.py +3 -3
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/ingest.py +10 -2
- {gulp_cli-1.1.6 → gulp_cli-1.1.7/src/gulp_cli.egg-info}/PKG-INFO +1 -1
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli.egg-info/SOURCES.txt +2 -0
- gulp_cli-1.1.7/src/gulp_cli.egg-info/scm_file_list.json +61 -0
- gulp_cli-1.1.7/src/gulp_cli.egg-info/scm_version.json +8 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/tests/test_zip_create.py +55 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/.github/workflows/portable-bundles.yml +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/.github/workflows/python-package.yml +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/.gitignore +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/GULP_DUAL_LICENSE.txt +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/LICENSE.AGPL-3.0.txt +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/LICENSE.md +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/README.md +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/docs/command-reference.md +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/docs/examples.md +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/docs/extensions.md +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/docs/getting-started.md +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/docs/portable.md +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/docs/resource-management.md +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/docs/troubleshooting-cli.md +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/gulp-cli.spec +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/portable/launch-linux.sh +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/portable/launch-macos.sh +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/portable/launch-windows.bat +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/pyproject.toml +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/setup.cfg +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/__init__.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/__main__.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/cli.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/client.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/__init__.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/acl.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/auth.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/collab.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/context.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/db.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/enhance_map.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/enrich.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/glyph.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/mapping.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/operations.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/plugin.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/query.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/source.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/stats.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/storage.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/user_group.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/users.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/commands/utility.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/config.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/extension/__init__.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/extension/query_sigma_zip.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/extension/story.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/extension_helpers.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/extensions.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/output.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/utils.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli/version.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli.egg-info/dependency_links.txt +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli.egg-info/entry_points.txt +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli.egg-info/requires.txt +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/src/gulp_cli.egg-info/top_level.txt +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/tests/test_enrich_live.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/tests/test_ingest_paths_file.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/tests/test_ingest_wait_log.py +0 -0
- {gulp_cli-1.1.6 → gulp_cli-1.1.7}/tests/test_version.py +0 -0
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.1.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 1,
|
|
21
|
+
__version__ = version = '1.1.7'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 1, 7)
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'g5f188bb2b'
|
|
@@ -297,18 +297,26 @@ def _build_zip_from_sources(
|
|
|
297
297
|
total_entries = 0
|
|
298
298
|
entries_added = 0
|
|
299
299
|
|
|
300
|
+
def _safe_archive_name(path: str) -> str:
|
|
301
|
+
"""Return a ZIP entry path without dot-directory components."""
|
|
302
|
+
return "/".join(
|
|
303
|
+
part
|
|
304
|
+
for part in path.replace("\\", "/").split("/")
|
|
305
|
+
if part not in ("", ".", "..")
|
|
306
|
+
)
|
|
307
|
+
|
|
300
308
|
def _archive_name_for_path(source_path: Path, base_dir: Path) -> str:
|
|
301
309
|
if preserve_path:
|
|
302
310
|
try:
|
|
303
311
|
rel_path = os.path.relpath(source_path, Path.cwd())
|
|
304
312
|
except ValueError:
|
|
305
313
|
rel_path = source_path.name
|
|
306
|
-
return
|
|
314
|
+
return _safe_archive_name(rel_path)
|
|
307
315
|
try:
|
|
308
316
|
rel_path = source_path.relative_to(base_dir)
|
|
309
317
|
except ValueError:
|
|
310
318
|
rel_path = source_path.name
|
|
311
|
-
return rel_path.as_posix()
|
|
319
|
+
return _safe_archive_name(rel_path.as_posix())
|
|
312
320
|
|
|
313
321
|
planned_entries: list[tuple[Path, Path, str]] = []
|
|
314
322
|
for source_path, base_dir in sources:
|
|
@@ -33,6 +33,8 @@ src/gulp_cli.egg-info/SOURCES.txt
|
|
|
33
33
|
src/gulp_cli.egg-info/dependency_links.txt
|
|
34
34
|
src/gulp_cli.egg-info/entry_points.txt
|
|
35
35
|
src/gulp_cli.egg-info/requires.txt
|
|
36
|
+
src/gulp_cli.egg-info/scm_file_list.json
|
|
37
|
+
src/gulp_cli.egg-info/scm_version.json
|
|
36
38
|
src/gulp_cli.egg-info/top_level.txt
|
|
37
39
|
src/gulp_cli/commands/__init__.py
|
|
38
40
|
src/gulp_cli/commands/acl.py
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"files": [
|
|
3
|
+
"GULP_DUAL_LICENSE.txt",
|
|
4
|
+
"README.md",
|
|
5
|
+
"pyproject.toml",
|
|
6
|
+
"LICENSE.AGPL-3.0.txt",
|
|
7
|
+
"LICENSE.md",
|
|
8
|
+
"gulp-cli.spec",
|
|
9
|
+
".gitignore",
|
|
10
|
+
"portable/launch-windows.bat",
|
|
11
|
+
"portable/launch-linux.sh",
|
|
12
|
+
"portable/launch-macos.sh",
|
|
13
|
+
"docs/troubleshooting-cli.md",
|
|
14
|
+
"docs/examples.md",
|
|
15
|
+
"docs/getting-started.md",
|
|
16
|
+
"docs/extensions.md",
|
|
17
|
+
"docs/resource-management.md",
|
|
18
|
+
"docs/portable.md",
|
|
19
|
+
"docs/command-reference.md",
|
|
20
|
+
"src/gulp_cli/__init__.py",
|
|
21
|
+
"src/gulp_cli/version.py",
|
|
22
|
+
"src/gulp_cli/extension_helpers.py",
|
|
23
|
+
"src/gulp_cli/output.py",
|
|
24
|
+
"src/gulp_cli/config.py",
|
|
25
|
+
"src/gulp_cli/utils.py",
|
|
26
|
+
"src/gulp_cli/client.py",
|
|
27
|
+
"src/gulp_cli/extensions.py",
|
|
28
|
+
"src/gulp_cli/cli.py",
|
|
29
|
+
"src/gulp_cli/__main__.py",
|
|
30
|
+
"src/gulp_cli/extension/query_sigma_zip.py",
|
|
31
|
+
"src/gulp_cli/extension/story.py",
|
|
32
|
+
"src/gulp_cli/extension/__init__.py",
|
|
33
|
+
"src/gulp_cli/commands/__init__.py",
|
|
34
|
+
"src/gulp_cli/commands/source.py",
|
|
35
|
+
"src/gulp_cli/commands/ingest.py",
|
|
36
|
+
"src/gulp_cli/commands/users.py",
|
|
37
|
+
"src/gulp_cli/commands/glyph.py",
|
|
38
|
+
"src/gulp_cli/commands/context.py",
|
|
39
|
+
"src/gulp_cli/commands/acl.py",
|
|
40
|
+
"src/gulp_cli/commands/user_group.py",
|
|
41
|
+
"src/gulp_cli/commands/utility.py",
|
|
42
|
+
"src/gulp_cli/commands/operations.py",
|
|
43
|
+
"src/gulp_cli/commands/auth.py",
|
|
44
|
+
"src/gulp_cli/commands/stats.py",
|
|
45
|
+
"src/gulp_cli/commands/enrich.py",
|
|
46
|
+
"src/gulp_cli/commands/query.py",
|
|
47
|
+
"src/gulp_cli/commands/enhance_map.py",
|
|
48
|
+
"src/gulp_cli/commands/storage.py",
|
|
49
|
+
"src/gulp_cli/commands/db.py",
|
|
50
|
+
"src/gulp_cli/commands/collab.py",
|
|
51
|
+
"src/gulp_cli/commands/mapping.py",
|
|
52
|
+
"src/gulp_cli/commands/plugin.py",
|
|
53
|
+
"tests/test_ingest_paths_file.py",
|
|
54
|
+
"tests/test_version.py",
|
|
55
|
+
"tests/test_enrich_live.py",
|
|
56
|
+
"tests/test_zip_create.py",
|
|
57
|
+
"tests/test_ingest_wait_log.py",
|
|
58
|
+
".github/workflows/portable-bundles.yml",
|
|
59
|
+
".github/workflows/python-package.yml"
|
|
60
|
+
]
|
|
61
|
+
}
|
|
@@ -94,6 +94,61 @@ def test_build_zip_from_sources_preserves_path_when_requested(
|
|
|
94
94
|
assert archive.namelist() == ["samples/nested/data.json"]
|
|
95
95
|
|
|
96
96
|
|
|
97
|
+
@pytest.mark.parametrize(
|
|
98
|
+
"rel_path",
|
|
99
|
+
["./samples/nested/data.json", ".\\samples\\nested\\data.json"],
|
|
100
|
+
)
|
|
101
|
+
def test_build_zip_from_sources_strips_current_dir_paths_when_preserving(
|
|
102
|
+
tmp_path: Path, monkeypatch, rel_path: str
|
|
103
|
+
) -> None:
|
|
104
|
+
source_file = tmp_path / "data.json"
|
|
105
|
+
source_file.write_text('{"value": 1}', encoding="utf-8")
|
|
106
|
+
monkeypatch.setattr(
|
|
107
|
+
"gulp_cli.commands.ingest.os.path.relpath",
|
|
108
|
+
lambda _source_path, _cwd: rel_path,
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
output_zip = tmp_path / "out.zip"
|
|
112
|
+
archived_count, archived_entries, created_archives = _build_zip_from_sources(
|
|
113
|
+
output_zip,
|
|
114
|
+
[(source_file, tmp_path)],
|
|
115
|
+
preserve_path=True,
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
expected = "samples/nested/data.json"
|
|
119
|
+
assert archived_count == 1
|
|
120
|
+
assert archived_entries == [expected]
|
|
121
|
+
|
|
122
|
+
with zipfile.ZipFile(created_archives[0]) as archive:
|
|
123
|
+
assert archive.namelist() == [expected]
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def test_build_zip_from_sources_strips_parent_paths_when_preserving(
|
|
127
|
+
tmp_path: Path, monkeypatch
|
|
128
|
+
) -> None:
|
|
129
|
+
source_dir = tmp_path / "samples" / "win_evtx"
|
|
130
|
+
source_dir.mkdir(parents=True)
|
|
131
|
+
source_file = source_dir / "2-system-Microsoft-Windows-LiveId%4Operational.evtx"
|
|
132
|
+
source_file.write_text("payload", encoding="utf-8")
|
|
133
|
+
cwd = tmp_path / "a" / "b" / "c"
|
|
134
|
+
cwd.mkdir(parents=True)
|
|
135
|
+
monkeypatch.chdir(cwd)
|
|
136
|
+
|
|
137
|
+
output_zip = tmp_path / "out.zip"
|
|
138
|
+
archived_count, archived_entries, created_archives = _build_zip_from_sources(
|
|
139
|
+
output_zip,
|
|
140
|
+
[(source_file, source_dir.parent)],
|
|
141
|
+
preserve_path=True,
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
expected = "samples/win_evtx/2-system-Microsoft-Windows-LiveId%4Operational.evtx"
|
|
145
|
+
assert archived_count == 1
|
|
146
|
+
assert archived_entries == [expected]
|
|
147
|
+
|
|
148
|
+
with zipfile.ZipFile(created_archives[0]) as archive:
|
|
149
|
+
assert archive.namelist() == [expected]
|
|
150
|
+
|
|
151
|
+
|
|
97
152
|
def test_build_zip_from_sources_prints_file_progress(
|
|
98
153
|
tmp_path: Path, capsys: pytest.CaptureFixture[str]
|
|
99
154
|
) -> None:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|