fluidattacks_core_models 14.1.0__tar.gz → 14.2.0__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.
Files changed (38) hide show
  1. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/PKG-INFO +1 -1
  2. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/fluidattacks_core/models/scanners/__init__.py +4 -0
  3. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/fluidattacks_core/models/scanners/scan_config.py +2 -0
  4. fluidattacks_core_models-14.2.0/fluidattacks_core/models/scanners/sspm_config.py +34 -0
  5. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/pyproject.toml +1 -1
  6. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/tests/test_model_scanner.py +18 -0
  7. fluidattacks_core_models-14.1.0/build/default.nix +0 -19
  8. fluidattacks_core_models-14.1.0/build/filter.nix +0 -13
  9. fluidattacks_core_models-14.1.0/flake.lock +0 -303
  10. fluidattacks_core_models-14.1.0/flake.nix +0 -29
  11. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/.envrc +0 -0
  12. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/.gitignore +0 -0
  13. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/fluidattacks_core/models/__init__.py +0 -0
  14. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/fluidattacks_core/models/py.typed +0 -0
  15. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/fluidattacks_core/models/scanners/apk_config.py +0 -0
  16. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/fluidattacks_core/models/scanners/common_config.py +0 -0
  17. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/fluidattacks_core/models/scanners/containers_sca_config.py +0 -0
  18. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/fluidattacks_core/models/scanners/cspm_config.py +0 -0
  19. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/fluidattacks_core/models/scanners/dast_config.py +0 -0
  20. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/fluidattacks_core/models/scanners/loader.py +0 -0
  21. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/fluidattacks_core/models/scanners/resolves_config.py +0 -0
  22. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/fluidattacks_core/models/scanners/sast_config.py +0 -0
  23. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/fluidattacks_core/models/scanners/sbom_config.py +0 -0
  24. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/fluidattacks_core/models/scanners/sca_config.py +0 -0
  25. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/fluidattacks_core/models/scanners/sniffs_config.py +0 -0
  26. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/fluidattacks_core/models/state_machines/__init__.py +0 -0
  27. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/fluidattacks_core/models/state_machines/component_orchestrator.py +0 -0
  28. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/fluidattacks_core/models/state_machines/root_scanner.py +0 -0
  29. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/fluidattacks_core/models/state_machines/types.py +0 -0
  30. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/import-linter.cfg +0 -0
  31. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/mypy.ini +0 -0
  32. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/ruff.toml +0 -0
  33. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/tests/__init__.py +0 -0
  34. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/tests/test_component_orchestrator.py +0 -0
  35. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/tests/test_loader_env.py +0 -0
  36. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/tests/test_root_scanner.py +0 -0
  37. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/tests/test_state_machines.py +0 -0
  38. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.2.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: fluidattacks_core_models
3
- Version: 14.1.0
3
+ Version: 14.2.0
4
4
  Summary: Fluid Attacks Core Models Library
5
5
  Author-email: Development <development@fluidattacks.com>
6
6
  License: MPL-2.0
@@ -33,6 +33,7 @@ from fluidattacks_core.models.scanners.sbom_config import (
33
33
  from fluidattacks_core.models.scanners.sca_config import ScaConfig
34
34
  from fluidattacks_core.models.scanners.scan_config import ScanConfig
35
35
  from fluidattacks_core.models.scanners.sniffs_config import SniffsConfig
36
+ from fluidattacks_core.models.scanners.sspm_config import GithubApp, GithubPat, SspmConfig
36
37
 
37
38
  __all__ = [
38
39
  "ApkConfig",
@@ -50,6 +51,8 @@ __all__ = [
50
51
  "DockerCredentialsConfig",
51
52
  "EcrCredentialsConfig",
52
53
  "FalsePositivesConfig",
54
+ "GithubApp",
55
+ "GithubPat",
53
56
  "LocalesEnum",
54
57
  "OutputConfig",
55
58
  "OutputFormat",
@@ -64,6 +67,7 @@ __all__ = [
64
67
  "ScanConfig",
65
68
  "SniffsConfig",
66
69
  "SourceType",
70
+ "SspmConfig",
67
71
  "build_config",
68
72
  "load_yaml_mapping",
69
73
  ]
@@ -14,6 +14,7 @@ from fluidattacks_core.models.scanners.sast_config import SastConfig
14
14
  from fluidattacks_core.models.scanners.sbom_config import SbomConfig
15
15
  from fluidattacks_core.models.scanners.sca_config import ScaConfig
16
16
  from fluidattacks_core.models.scanners.sniffs_config import SniffsConfig
17
+ from fluidattacks_core.models.scanners.sspm_config import SspmConfig
17
18
 
18
19
 
19
20
  class ScanConfig(BaseModel):
@@ -35,6 +36,7 @@ class ScanConfig(BaseModel):
35
36
  sbom: SbomConfig | None = None
36
37
  dast: DastConfig | None = None
37
38
  cspm: CspmConfig | None = None
39
+ sspm: SspmConfig | None = None
38
40
  apk: ApkConfig | None = None
39
41
  false_positives_identified: FalsePositivesConfig | None = None
40
42
  ss: SniffsConfig | None = None
@@ -0,0 +1,34 @@
1
+ from pydantic import BaseModel, Field, field_validator
2
+
3
+ from fluidattacks_core.models.scanners.loader import LoaderValidationInfo, resolve_env_var
4
+
5
+
6
+ class GithubPat(BaseModel):
7
+ model_config = {"extra": "forbid"}
8
+ organization: str
9
+ pat_token: str = Field(repr=False)
10
+ environment_id: str | None = None
11
+
12
+ @field_validator("pat_token", mode="before")
13
+ @classmethod
14
+ def _resolve_credentials(cls, v: object, info: LoaderValidationInfo) -> object:
15
+ return resolve_env_var(v, info)
16
+
17
+
18
+ class GithubApp(BaseModel):
19
+ model_config = {"extra": "forbid"}
20
+ organization: str
21
+ app_id: str
22
+ installation_id: str
23
+ private_key: str = Field(repr=False)
24
+ environment_id: str | None = None
25
+
26
+ @field_validator("private_key", mode="before")
27
+ @classmethod
28
+ def _resolve_credentials(cls, v: object, info: LoaderValidationInfo) -> object:
29
+ return resolve_env_var(v, info)
30
+
31
+
32
+ class SspmConfig(BaseModel):
33
+ model_config = {"extra": "forbid"}
34
+ github_credentials: list[GithubPat | GithubApp] = []
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fluidattacks_core_models"
3
- version = "14.1.0"
3
+ version = "14.2.0"
4
4
  description = "Fluid Attacks Core Models Library"
5
5
  authors = [{ name = "Development", email = "development@fluidattacks.com" }]
6
6
  license = { text = "MPL-2.0" }
@@ -99,6 +99,11 @@ cspm:
99
99
  - role: arn:aws:iam::123456789012:role/ScanRole
100
100
  external_id: ext-123
101
101
  environment_id: prod
102
+ sspm:
103
+ github_credentials:
104
+ - organization: octo-org
105
+ pat_token: ghp-token
106
+ environment_id: scm
102
107
  apk:
103
108
  environments:
104
109
  - apk_file_path: app.apk
@@ -230,6 +235,19 @@ def test_build_config_cspm(yaml_file: Path) -> None:
230
235
  assert role.environment_id == "prod"
231
236
 
232
237
 
238
+ def test_build_config_sspm(yaml_file: Path) -> None:
239
+ config = build_config(str(yaml_file), ScanConfig)
240
+ assert config.sspm is not None
241
+ assert config.sspm.github_credentials[0].organization == "octo-org"
242
+
243
+
244
+ def test_unknown_nested_key_sspm(tmp_path: Path) -> None:
245
+ f = tmp_path / "config.yaml"
246
+ f.write_text("sspm:\n github_credentals: []\n")
247
+ with pytest.raises(ValidationError):
248
+ build_config(str(f), ScanConfig)
249
+
250
+
233
251
  def test_build_config_apk(yaml_file: Path) -> None:
234
252
  config = build_config(str(yaml_file), ScanConfig)
235
253
  assert config.apk is not None
@@ -1,19 +0,0 @@
1
- { src, workspace_root }:
2
- {
3
- inherit src workspace_root;
4
- root_path = "develops/fluidattacks-core/python/models";
5
- module_name = "fluidattacks_core";
6
- pypi_token = {
7
- method = "oidc";
8
- };
9
- override = {
10
- checks = {
11
- basedpyright = false;
12
- };
13
- configs = {
14
- import_linter = ../import-linter.cfg;
15
- mypy = ../mypy.ini;
16
- ruff = ../ruff.toml;
17
- };
18
- };
19
- }
@@ -1,13 +0,0 @@
1
- path_filter: src:
2
- path_filter {
3
- root = src;
4
- include = [
5
- "fluidattacks_core"
6
- "tests"
7
- "import-linter.cfg"
8
- "mypy.ini"
9
- "pyproject.toml"
10
- "ruff.toml"
11
- "uv.lock"
12
- ];
13
- }
@@ -1,303 +0,0 @@
1
- {
2
- "nodes": {
3
- "flake-parts": {
4
- "inputs": {
5
- "nixpkgs-lib": "nixpkgs-lib"
6
- },
7
- "locked": {
8
- "lastModified": 1762810396,
9
- "narHash": "sha256-dxFVgQPG+R72dkhXTtqUm7KpxElw3u6E+YlQ2WaDgt8=",
10
- "owner": "hercules-ci",
11
- "repo": "flake-parts",
12
- "rev": "0bdadb1b265fb4143a75bd1ec7d8c915898a9923",
13
- "type": "github"
14
- },
15
- "original": {
16
- "owner": "hercules-ci",
17
- "repo": "flake-parts",
18
- "type": "github"
19
- }
20
- },
21
- "nix_filter": {
22
- "locked": {
23
- "lastModified": 1757882181,
24
- "narHash": "sha256-+cCxYIh2UNalTz364p+QYmWHs0P+6wDhiWR4jDIKQIU=",
25
- "owner": "numtide",
26
- "repo": "nix-filter",
27
- "rev": "59c44d1909c72441144b93cf0f054be7fe764de5",
28
- "type": "github"
29
- },
30
- "original": {
31
- "owner": "numtide",
32
- "repo": "nix-filter",
33
- "type": "github"
34
- }
35
- },
36
- "nixpkgs": {
37
- "locked": {
38
- "lastModified": 1758690382,
39
- "narHash": "sha256-NY3kSorgqE5LMm1LqNwGne3ZLMF2/ILgLpFr1fS4X3o=",
40
- "owner": "nixos",
41
- "repo": "nixpkgs",
42
- "rev": "e643668fd71b949c53f8626614b21ff71a07379d",
43
- "type": "github"
44
- },
45
- "original": {
46
- "owner": "nixos",
47
- "ref": "nixos-unstable",
48
- "repo": "nixpkgs",
49
- "type": "github"
50
- }
51
- },
52
- "nixpkgs-lib": {
53
- "locked": {
54
- "lastModified": 1761765539,
55
- "narHash": "sha256-b0yj6kfvO8ApcSE+QmA6mUfu8IYG6/uU28OFn4PaC8M=",
56
- "owner": "nix-community",
57
- "repo": "nixpkgs.lib",
58
- "rev": "719359f4562934ae99f5443f20aa06c2ffff91fc",
59
- "type": "github"
60
- },
61
- "original": {
62
- "owner": "nix-community",
63
- "repo": "nixpkgs.lib",
64
- "type": "github"
65
- }
66
- },
67
- "nixpkgs_2": {
68
- "locked": {
69
- "lastModified": 1758690382,
70
- "narHash": "sha256-NY3kSorgqE5LMm1LqNwGne3ZLMF2/ILgLpFr1fS4X3o=",
71
- "owner": "nixos",
72
- "repo": "nixpkgs",
73
- "rev": "e643668fd71b949c53f8626614b21ff71a07379d",
74
- "type": "github"
75
- },
76
- "original": {
77
- "owner": "nixos",
78
- "ref": "nixos-unstable",
79
- "repo": "nixpkgs",
80
- "type": "github"
81
- }
82
- },
83
- "nixpkgs_3": {
84
- "locked": {
85
- "lastModified": 1761373498,
86
- "narHash": "sha256-Q/uhWNvd7V7k1H1ZPMy/vkx3F8C13ZcdrKjO7Jv7v0c=",
87
- "owner": "nixos",
88
- "repo": "nixpkgs",
89
- "rev": "6a08e6bb4e46ff7fcbb53d409b253f6bad8a28ce",
90
- "type": "github"
91
- },
92
- "original": {
93
- "owner": "nixos",
94
- "ref": "nixos-unstable",
95
- "repo": "nixpkgs",
96
- "type": "github"
97
- }
98
- },
99
- "nixpkgs_flake": {
100
- "locked": {
101
- "lastModified": 1778253243,
102
- "narHash": "sha256-KkH2QvU6iRLDTGGEwH5jnMqHWj4zMTuHxi1S1zdr01w=",
103
- "owner": "nixos",
104
- "repo": "nixpkgs",
105
- "rev": "4fcda7103530b23c5ca44286344912082aad4220",
106
- "type": "github"
107
- },
108
- "original": {
109
- "owner": "nixos",
110
- "repo": "nixpkgs",
111
- "type": "github"
112
- }
113
- },
114
- "pyproject-build-systems": {
115
- "inputs": {
116
- "nixpkgs": "nixpkgs",
117
- "pyproject-nix": "pyproject-nix",
118
- "uv2nix": "uv2nix"
119
- },
120
- "locked": {
121
- "lastModified": 1761781027,
122
- "narHash": "sha256-YDvxPAm2WnxrznRqWwHLjryBGG5Ey1ATEJXrON+TWt8=",
123
- "owner": "pyproject-nix",
124
- "repo": "build-system-pkgs",
125
- "rev": "795a980d25301e5133eca37adae37283ec3c8e66",
126
- "type": "github"
127
- },
128
- "original": {
129
- "owner": "pyproject-nix",
130
- "repo": "build-system-pkgs",
131
- "type": "github"
132
- }
133
- },
134
- "pyproject-nix": {
135
- "inputs": {
136
- "nixpkgs": [
137
- "python_builder",
138
- "pyproject-build-systems",
139
- "nixpkgs"
140
- ]
141
- },
142
- "locked": {
143
- "lastModified": 1758265079,
144
- "narHash": "sha256-amLaLNwKSZPShQHzfgmc/9o76dU8xzN0743dWgvYlr8=",
145
- "owner": "nix-community",
146
- "repo": "pyproject.nix",
147
- "rev": "02e9418fd4af638447dca4b17b1280da95527fc9",
148
- "type": "github"
149
- },
150
- "original": {
151
- "owner": "nix-community",
152
- "repo": "pyproject.nix",
153
- "type": "github"
154
- }
155
- },
156
- "pyproject-nix_2": {
157
- "inputs": {
158
- "nixpkgs": "nixpkgs_2"
159
- },
160
- "locked": {
161
- "lastModified": 1762427963,
162
- "narHash": "sha256-CkPlAbIQ87wmjy5qHibfzk4DmMGBNqFer+lLfXjpP5M=",
163
- "owner": "pyproject-nix",
164
- "repo": "pyproject.nix",
165
- "rev": "4540ea004e04fcd12dd2738d51383d10f956f7b9",
166
- "type": "github"
167
- },
168
- "original": {
169
- "owner": "pyproject-nix",
170
- "repo": "pyproject.nix",
171
- "type": "github"
172
- }
173
- },
174
- "pyproject-nix_3": {
175
- "inputs": {
176
- "nixpkgs": [
177
- "python_builder",
178
- "uv2nix",
179
- "nixpkgs"
180
- ]
181
- },
182
- "locked": {
183
- "lastModified": 1760402624,
184
- "narHash": "sha256-jF6UKLs2uGc2rtved8Vrt58oTWjTQoAssuYs/0578Z4=",
185
- "owner": "pyproject-nix",
186
- "repo": "pyproject.nix",
187
- "rev": "84c4ea102127c77058ea1ed7be7300261fafc7d2",
188
- "type": "github"
189
- },
190
- "original": {
191
- "owner": "pyproject-nix",
192
- "repo": "pyproject.nix",
193
- "type": "github"
194
- }
195
- },
196
- "python_builder": {
197
- "inputs": {
198
- "nix_filter": "nix_filter",
199
- "nixpkgs_flake": "nixpkgs_flake",
200
- "pyproject-build-systems": "pyproject-build-systems",
201
- "pyproject-nix": "pyproject-nix_2",
202
- "shell-helpers": "shell-helpers",
203
- "uv2nix": "uv2nix_2"
204
- },
205
- "locked": {
206
- "dir": "common/utils/python-builder",
207
- "lastModified": 1787078362,
208
- "narHash": "sha256-HYL7Rn6SuNjYxkt/PwFLksZjsauCiY+ENbOWryLsIlw=",
209
- "ref": "refs/heads/trunk",
210
- "rev": "09fd25a13309eb5e3b5b2a061bb340df3ae5d281",
211
- "shallow": true,
212
- "type": "git",
213
- "url": "ssh://git@gitlab.com/fluidattacks/universe"
214
- },
215
- "original": {
216
- "dir": "common/utils/python-builder",
217
- "rev": "09fd25a13309eb5e3b5b2a061bb340df3ae5d281",
218
- "shallow": true,
219
- "type": "git",
220
- "url": "ssh://git@gitlab.com/fluidattacks/universe"
221
- }
222
- },
223
- "root": {
224
- "inputs": {
225
- "python_builder": "python_builder"
226
- }
227
- },
228
- "shell-helpers": {
229
- "inputs": {
230
- "flake-parts": "flake-parts",
231
- "nixpkgs": [
232
- "python_builder",
233
- "nixpkgs_flake"
234
- ]
235
- },
236
- "locked": {
237
- "dir": "common/utils/shell-helpers",
238
- "lastModified": 1762806066,
239
- "narHash": "sha256-Wz99Fl7SpPU1NkTHJ36XOo6DjOEAMXCw3ThRABOS2Hs=",
240
- "ref": "refs/heads/trunk",
241
- "rev": "d73cfdc7ae9e7f547e22a4481d4c2ccce38b26a8",
242
- "shallow": true,
243
- "type": "git",
244
- "url": "ssh://git@gitlab.com/fluidattacks/universe"
245
- },
246
- "original": {
247
- "dir": "common/utils/shell-helpers",
248
- "rev": "d73cfdc7ae9e7f547e22a4481d4c2ccce38b26a8",
249
- "shallow": true,
250
- "type": "git",
251
- "url": "ssh://git@gitlab.com/fluidattacks/universe"
252
- }
253
- },
254
- "uv2nix": {
255
- "inputs": {
256
- "nixpkgs": [
257
- "python_builder",
258
- "pyproject-build-systems",
259
- "nixpkgs"
260
- ],
261
- "pyproject-nix": [
262
- "python_builder",
263
- "pyproject-build-systems",
264
- "pyproject-nix"
265
- ]
266
- },
267
- "locked": {
268
- "lastModified": 1758933732,
269
- "narHash": "sha256-HAmm1GBS1myZCFuog0DC2ZLaynvZtiUI2Crmo+cdQI0=",
270
- "owner": "pyproject-nix",
271
- "repo": "uv2nix",
272
- "rev": "273ce18f913d8559e0d04f820d724308966d7c4d",
273
- "type": "github"
274
- },
275
- "original": {
276
- "owner": "pyproject-nix",
277
- "repo": "uv2nix",
278
- "type": "github"
279
- }
280
- },
281
- "uv2nix_2": {
282
- "inputs": {
283
- "nixpkgs": "nixpkgs_3",
284
- "pyproject-nix": "pyproject-nix_3"
285
- },
286
- "locked": {
287
- "lastModified": 1761872265,
288
- "narHash": "sha256-i25GRgp2vUOebY70L3NTAgkd+Pr1hnn5xM3qHxH0ONU=",
289
- "owner": "pyproject-nix",
290
- "repo": "uv2nix",
291
- "rev": "74dfb62871be152ad3673b143b0cc56105a4f3c5",
292
- "type": "github"
293
- },
294
- "original": {
295
- "owner": "pyproject-nix",
296
- "repo": "uv2nix",
297
- "type": "github"
298
- }
299
- }
300
- },
301
- "root": "root",
302
- "version": 7
303
- }
@@ -1,29 +0,0 @@
1
- {
2
- description = "Fluid Attacks Core models package.";
3
-
4
- inputs = {
5
- python_builder = {
6
- url = "git+ssh://git@gitlab.com/fluidattacks/universe?shallow=1&rev=09fd25a13309eb5e3b5b2a061bb340df3ae5d281&dir=common/utils/python-builder";
7
- };
8
- };
9
-
10
- outputs =
11
- { self, ... }@inputs:
12
- let
13
- build_args =
14
- {
15
- system,
16
- python_version,
17
- nixpkgs,
18
- builders,
19
- scripts,
20
- }:
21
- import ./build {
22
- src = import ./build/filter.nix nixpkgs.nix-filter self;
23
- workspace_root = ./.;
24
- };
25
- in
26
- {
27
- packages = inputs.python_builder.outputs.build build_args;
28
- };
29
- }