prelude-sdk-beta 1406__py3-none-any.whl

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.

Potentially problematic release.


This version of prelude-sdk-beta might be problematic. Click here for more details.

@@ -0,0 +1,446 @@
1
+ import logging
2
+
3
+ from enum import Enum, EnumMeta
4
+
5
+
6
+ class MissingItem(EnumMeta):
7
+ def __getitem__(cls, name):
8
+ try:
9
+ return super().__getitem__(name.upper())
10
+ except (AttributeError, KeyError):
11
+ try:
12
+ return cls(int(name))
13
+ except ValueError:
14
+ return cls(name)
15
+
16
+
17
+ class RunCode(Enum, metaclass=MissingItem):
18
+ INVALID = -1
19
+ DAILY = 1
20
+ WEEKLY = 2
21
+ MONTHLY = 3
22
+ SMART = 4
23
+ DEBUG = 5
24
+ RUN_ONCE = 6
25
+ MONDAY = 10
26
+ TUESDAY = 11
27
+ WEDNESDAY = 12
28
+ THURSDAY = 13
29
+ FRIDAY = 14
30
+ SATURDAY = 15
31
+ SUNDAY = 16
32
+ MONTH_1 = 20
33
+
34
+ @classmethod
35
+ def _missing_(cls, value):
36
+ return RunCode.DAILY
37
+
38
+
39
+ class Mode(Enum, metaclass=MissingItem):
40
+ MANUAL = 0
41
+ FROZEN = 1
42
+ AUTOPILOT = 2
43
+
44
+ @classmethod
45
+ def _missing_(cls, value):
46
+ return Mode.MANUAL
47
+
48
+
49
+ class Permission(Enum, metaclass=MissingItem):
50
+ INVALID = -1
51
+ ADMIN = 0
52
+ EXECUTIVE = 1
53
+ BUILD = 2
54
+ SERVICE = 3
55
+ SUPPORT = 5
56
+
57
+ @classmethod
58
+ def _missing_(cls, value):
59
+ return Permission.INVALID
60
+
61
+
62
+ class ExitCode(Enum):
63
+ MISSING = -1
64
+ UNKNOWN_ERROR = 1
65
+ MALFORMED_TEST = 2
66
+ UNREPORTED = 3
67
+ PROCESS_BLOCKED = 9
68
+ PROCESS_BLOCKED_GRACEFULLY = 15
69
+ PROTECTED = 100
70
+ UNPROTECTED = 101
71
+ TIMED_OUT = 102
72
+ FAILED_CLEANUP = 103
73
+ TEST_NOT_RELEVANT = 104
74
+ DYNAMIC_QUARANTINE = 105
75
+ BLOCKED_AT_PERIMETER = 106
76
+ EXPLOIT_PREVENTED = 107
77
+ ENDPOINT_NOT_RELEVANT = 108
78
+ INSUFFICIENT_PRIVILEGES = 109
79
+ INCORRECTLY_BLOCKED = 110
80
+ PREVENTED_EXECUTION = 126
81
+ STATIC_QUARANTINE = 127
82
+ BLOCKED = 137
83
+ UNEXPECTED_ERROR = 256
84
+
85
+ @classmethod
86
+ def _missing_(cls, value):
87
+ if value and not isinstance(value, int):
88
+ return cls(int(value))
89
+ logging.warning("Unknown ExitCode: %s", str(value))
90
+ return ExitCode.MISSING
91
+
92
+ @property
93
+ def state(self):
94
+ for k, v in State.mapping().items():
95
+ if self in v:
96
+ return k
97
+ return State.NONE
98
+
99
+
100
+ class State(Enum):
101
+ NONE = 0
102
+ PROTECTED = 1
103
+ UNPROTECTED = 2
104
+ ERROR = 3
105
+ NOT_RELEVANT = 4
106
+
107
+ @classmethod
108
+ def mapping(cls):
109
+ return {
110
+ State.ERROR: [
111
+ ExitCode.FAILED_CLEANUP,
112
+ ExitCode.INCORRECTLY_BLOCKED,
113
+ ExitCode.MALFORMED_TEST,
114
+ ExitCode.TIMED_OUT,
115
+ ExitCode.UNEXPECTED_ERROR,
116
+ ExitCode.UNKNOWN_ERROR,
117
+ ExitCode.UNREPORTED,
118
+ ],
119
+ State.NONE: [ExitCode.MISSING],
120
+ State.NOT_RELEVANT: [
121
+ ExitCode.ENDPOINT_NOT_RELEVANT,
122
+ ExitCode.INSUFFICIENT_PRIVILEGES,
123
+ ExitCode.TEST_NOT_RELEVANT,
124
+ ],
125
+ State.PROTECTED: [
126
+ ExitCode.BLOCKED,
127
+ ExitCode.BLOCKED_AT_PERIMETER,
128
+ ExitCode.DYNAMIC_QUARANTINE,
129
+ ExitCode.EXPLOIT_PREVENTED,
130
+ ExitCode.PREVENTED_EXECUTION,
131
+ ExitCode.PROCESS_BLOCKED,
132
+ ExitCode.PROCESS_BLOCKED_GRACEFULLY,
133
+ ExitCode.PROTECTED,
134
+ ExitCode.STATIC_QUARANTINE,
135
+ ],
136
+ State.UNPROTECTED: [
137
+ ExitCode.UNPROTECTED,
138
+ ],
139
+ }
140
+
141
+
142
+ class DOS(Enum):
143
+ none = "none"
144
+ arm64 = "arm64"
145
+ x86_64 = "x86_64"
146
+ aarch64 = "arm64"
147
+ amd64 = "x86_64"
148
+ x86 = "x86_64"
149
+
150
+ @classmethod
151
+ def normalize(cls, dos: str):
152
+ try:
153
+ arch = dos.split("-", 1)[-1]
154
+ return dos[: -len(arch)].lower() + cls[arch.lower()].value
155
+ except (KeyError, IndexError, AttributeError):
156
+ return cls.none.value
157
+
158
+
159
+ class Control(Enum, metaclass=MissingItem):
160
+ INVALID = -1
161
+ NONE = 0
162
+ CROWDSTRIKE = 1
163
+ DEFENDER = 2
164
+ SPLUNK = 3
165
+ SENTINELONE = 4
166
+ VECTR = 5
167
+ S3 = 6
168
+ INTUNE = 7
169
+ SERVICENOW = 8
170
+ OKTA = 9
171
+ M365 = 10
172
+ ENTRA = 11
173
+ JAMF = 12
174
+ CROWDSTRIKE_IDENTITY = 13
175
+ GMAIL = 14
176
+ GOOGLE_IDENTITY = 15
177
+ DEFENDER_DISCOVERY = 16
178
+ TENABLE = 17
179
+ EC2 = 18
180
+ AWS_SSM = 19
181
+ AZURE_VM = 20
182
+ GITHUB = 21
183
+ TENABLE_DISCOVERY = 22
184
+ QUALYS = 23
185
+ QUALYS_DISCOVERY = 24
186
+
187
+ @classmethod
188
+ def _missing_(cls, value):
189
+ return Control.INVALID
190
+
191
+ @property
192
+ def control_category(self):
193
+ for k, v in ControlCategory.mapping().items():
194
+ if self in v:
195
+ return k
196
+ return ControlCategory.NONE
197
+
198
+ @property
199
+ def scm_category(self):
200
+ for k, v in SCMCategory.control_mapping().items():
201
+ if self in v:
202
+ return k
203
+ return SCMCategory.NONE
204
+
205
+
206
+ class ControlCategory(Enum, metaclass=MissingItem):
207
+ INVALID = -1
208
+ NONE = 0
209
+ CLOUD = 1
210
+ EMAIL = 2
211
+ IDENTITY = 3
212
+ NETWORK = 4
213
+ XDR = 5
214
+ ASSET_MANAGER = 6
215
+ DISCOVERED_DEVICES = 7
216
+ VULN_MANAGER = 8
217
+ SIEM = 9
218
+ PRIVATE_REPO = 10
219
+
220
+ @classmethod
221
+ def _missing_(cls, value):
222
+ return ControlCategory.INVALID
223
+
224
+ @classmethod
225
+ def mapping(cls):
226
+ return {
227
+ ControlCategory.ASSET_MANAGER: [
228
+ Control.AWS_SSM,
229
+ Control.INTUNE,
230
+ Control.JAMF,
231
+ ],
232
+ ControlCategory.CLOUD: [],
233
+ ControlCategory.DISCOVERED_DEVICES: [
234
+ Control.AZURE_VM,
235
+ Control.DEFENDER_DISCOVERY,
236
+ Control.EC2,
237
+ Control.QUALYS_DISCOVERY,
238
+ Control.SERVICENOW,
239
+ Control.TENABLE_DISCOVERY,
240
+ ],
241
+ ControlCategory.EMAIL: [
242
+ Control.GMAIL,
243
+ Control.M365,
244
+ ],
245
+ ControlCategory.IDENTITY: [
246
+ Control.CROWDSTRIKE_IDENTITY,
247
+ Control.ENTRA,
248
+ Control.GOOGLE_IDENTITY,
249
+ Control.OKTA,
250
+ ],
251
+ ControlCategory.NETWORK: [],
252
+ ControlCategory.PRIVATE_REPO: [
253
+ Control.GITHUB,
254
+ ],
255
+ ControlCategory.SIEM: [
256
+ Control.S3,
257
+ Control.SPLUNK,
258
+ Control.VECTR,
259
+ ],
260
+ ControlCategory.VULN_MANAGER: [Control.QUALYS, Control.TENABLE],
261
+ ControlCategory.XDR: [
262
+ Control.CROWDSTRIKE,
263
+ Control.DEFENDER,
264
+ Control.SENTINELONE,
265
+ ],
266
+ }
267
+
268
+
269
+ class SCMCategory(Enum, metaclass=MissingItem):
270
+ INVALID = -1
271
+ NONE = 0
272
+ ENDPOINT = 1
273
+ INBOX = 2
274
+ USER = 3
275
+
276
+ @classmethod
277
+ def _missing_(cls, value):
278
+ return SCMCategory.INVALID
279
+
280
+ @classmethod
281
+ def control_mapping(cls):
282
+ return {
283
+ SCMCategory.ENDPOINT: [
284
+ Control.AWS_SSM,
285
+ Control.AZURE_VM,
286
+ Control.CROWDSTRIKE,
287
+ Control.DEFENDER,
288
+ Control.DEFENDER_DISCOVERY,
289
+ Control.EC2,
290
+ Control.INTUNE,
291
+ Control.JAMF,
292
+ Control.QUALYS,
293
+ Control.QUALYS_DISCOVERY,
294
+ Control.SENTINELONE,
295
+ Control.SERVICENOW,
296
+ Control.TENABLE,
297
+ Control.TENABLE_DISCOVERY,
298
+ ],
299
+ SCMCategory.USER: [
300
+ Control.CROWDSTRIKE_IDENTITY,
301
+ Control.ENTRA,
302
+ Control.GOOGLE_IDENTITY,
303
+ Control.OKTA,
304
+ ],
305
+ SCMCategory.INBOX: [
306
+ Control.GMAIL,
307
+ Control.M365,
308
+ ],
309
+ }
310
+
311
+ @classmethod
312
+ def category_mapping(cls):
313
+ return {
314
+ SCMCategory.ENDPOINT: [
315
+ ControlCategory.ASSET_MANAGER,
316
+ ControlCategory.DISCOVERED_DEVICES,
317
+ ControlCategory.VULN_MANAGER,
318
+ ControlCategory.XDR,
319
+ ],
320
+ SCMCategory.USER: [ControlCategory.IDENTITY],
321
+ SCMCategory.INBOX: [ControlCategory.EMAIL],
322
+ }
323
+
324
+
325
+ class BackgroundJobTypes(Enum, metaclass=MissingItem):
326
+ INVALID = -1
327
+ UPDATE_SCM = 1
328
+ DEPLOY_PROBE = 2
329
+ OBSERVED_DETECTED = 3
330
+ PRELUDE_ENDPOINT_SYNC = 4
331
+ EXPORT_SCM = 5
332
+ PARTNER_GROUPS = 6
333
+
334
+ @classmethod
335
+ def _missing_(cls, value):
336
+ return BackgroundJobTypes.INVALID
337
+
338
+
339
+ class EDRResponse(Enum, metaclass=MissingItem):
340
+ INVALID = -1
341
+ OBSERVE = 1
342
+ DETECT = 2
343
+ PREVENT = 3
344
+
345
+ @classmethod
346
+ def _missing_(cls, value):
347
+ return EDRResponse.INVALID
348
+
349
+
350
+ class PartnerEvents(Enum, metaclass=MissingItem):
351
+ INVALID = -1
352
+ REDUCED_FUNCTIONALITY_MODE = 1
353
+ NO_EDR = 2
354
+ MISSING_EDR_POLICY = 3
355
+ MISSING_AV_POLICY = 4
356
+ MISSING_MFA = 5
357
+ NO_ASSET_MANAGER = 6
358
+ MISCONFIGURED_POLICY_SETTING = 7
359
+ MISSING_SCAN = 8
360
+ OUT_OF_DATE_SCAN = 9
361
+ NO_VULN_MANAGER = 10
362
+ USER_MISSING_ASSET_MANAGER = 11
363
+ USER_MISSING_EDR = 12
364
+ USER_MISSING_VULN_MANAGER = 13
365
+
366
+ @classmethod
367
+ def _missing_(cls, value):
368
+ return PartnerEvents.INVALID
369
+
370
+ @classmethod
371
+ def control_category_mapping(cls):
372
+ return {
373
+ PartnerEvents.REDUCED_FUNCTIONALITY_MODE: [ControlCategory.XDR],
374
+ PartnerEvents.NO_EDR: [
375
+ ControlCategory.XDR,
376
+ ],
377
+ PartnerEvents.MISSING_EDR_POLICY: [ControlCategory.XDR],
378
+ PartnerEvents.MISSING_AV_POLICY: [ControlCategory.XDR],
379
+ PartnerEvents.MISSING_MFA: [ControlCategory.IDENTITY],
380
+ PartnerEvents.NO_ASSET_MANAGER: [ControlCategory.ASSET_MANAGER],
381
+ PartnerEvents.MISCONFIGURED_POLICY_SETTING: [
382
+ ControlCategory.XDR,
383
+ ControlCategory.EMAIL,
384
+ ControlCategory.IDENTITY,
385
+ ],
386
+ PartnerEvents.MISSING_SCAN: [ControlCategory.VULN_MANAGER],
387
+ PartnerEvents.OUT_OF_DATE_SCAN: [ControlCategory.VULN_MANAGER],
388
+ PartnerEvents.NO_VULN_MANAGER: [ControlCategory.VULN_MANAGER],
389
+ PartnerEvents.USER_MISSING_ASSET_MANAGER: [ControlCategory.IDENTITY],
390
+ PartnerEvents.USER_MISSING_EDR: [ControlCategory.IDENTITY],
391
+ PartnerEvents.USER_MISSING_VULN_MANAGER: [ControlCategory.IDENTITY],
392
+ }
393
+
394
+
395
+ class AlertTypes(Enum, metaclass=MissingItem):
396
+ INVALID = -1
397
+ NEW_REDUCED_FUNCTIONALITY_MODE_ENDPOINTS = 1
398
+ NEW_NO_EDR_ENDPOINTS = 2
399
+ NEW_MISSING_EDR_POLICY_ENDPOINTS = 3
400
+ NEW_MISSING_AV_POLICY_ENDPOINTS = 4
401
+ NEW_MISSING_MFA_USERS = 5
402
+ NEW_NO_ASSET_MANAGER_ENDPOINTS = 6
403
+ NEW_POLICY_SETTING_FAILURE = 7
404
+ NEW_POLICY_SETTING_PASS = 8
405
+ NEW_MISSING_SCAN_ENDPOINTS = 9
406
+ NEW_NO_VULN_MANAGER_ENDPOINTS = 10
407
+ NEW_OUT_OF_DATE_SCAN_ENDPOINTS = 11
408
+ NEW_USER_MISSING_ASSET_MANAGER = 12
409
+ NEW_USER_MISSING_EDR = 13
410
+ NEW_USER_MISSING_VULN_MANAGER = 14
411
+
412
+ @classmethod
413
+ def _missing_(cls, value):
414
+ return AlertTypes.INVALID
415
+
416
+
417
+ class PolicyType(Enum, metaclass=MissingItem):
418
+ INVALID = 0
419
+ EDR = 1
420
+ AV = 2
421
+ IDENTITY_PASSWORD = 3
422
+ EMAIL_ANTIPHISH = 4
423
+ EMAIL_OUTBOUND = 5
424
+ EMAIL_CONTENT = 6
425
+ EMAIL_MALWARE = 7
426
+ EMAIL_ATTACHMENT = 8
427
+ EMAIL_LINKS = 9
428
+ EMAIL_DKIM = 10
429
+ DEVICE_COMPLIANCE = 11
430
+ IDENTITY_MFA = 12
431
+
432
+ @classmethod
433
+ def _missing_(cls, value):
434
+ return PolicyType.INVALID
435
+
436
+
437
+ class Platform(Enum, metaclass=MissingItem):
438
+ INVALID = 0
439
+ WINDOWS = 1
440
+ DARWIN = 2
441
+ LINUX = 3
442
+ ALL = 4
443
+
444
+ @classmethod
445
+ def _missing_(cls, value):
446
+ return Platform.INVALID
@@ -0,0 +1,46 @@
1
+ Metadata-Version: 2.4
2
+ Name: prelude-sdk-beta
3
+ Version: 1406
4
+ Summary: For interacting with the Prelude API
5
+ Home-page: https://github.com/preludeorg
6
+ Author: Prelude Research
7
+ Author-email: support@preludesecurity.com
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: License :: OSI Approved :: MIT License
10
+ Classifier: Operating System :: OS Independent
11
+ Requires-Python: >=3.10
12
+ Description-Content-Type: text/markdown
13
+ License-File: LICENSE
14
+ Requires-Dist: requests
15
+ Dynamic: license-file
16
+
17
+ # Prelude SDK
18
+
19
+ Interact with the Prelude Service API via Python.
20
+
21
+ > The prelude-cli utility wraps around this SDK to provide a rich command line experience.
22
+
23
+ Install this package to write your own tooling that works with Build or Detect functionality.
24
+
25
+ - IAM: manage your account
26
+ - Build: write and maintain your collection of security tests
27
+ - Detect: schedule security tests for your endpoints
28
+
29
+ ## Quick start
30
+
31
+ ```bash
32
+ pip install prelude-sdk
33
+ ```
34
+
35
+ ## Documentation
36
+
37
+ TBD
38
+
39
+ ## Testing
40
+
41
+ To test the Python SDK and Probes, run the following commands from the python/sdk/ directory:
42
+
43
+ ```bash
44
+ pip install -r tests/requirements.txt
45
+ pytest tests --api https://api.preludesecurity.com --email <EMAIL>
46
+ ```
@@ -0,0 +1,20 @@
1
+ prelude_sdk_beta/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ prelude_sdk_beta/controllers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ prelude_sdk_beta/controllers/build_controller.py,sha256=XpsjsVJCcJ9jDOugBAqf2-tsvJYjyBk-_2wgVwaYfEw,8817
4
+ prelude_sdk_beta/controllers/detect_controller.py,sha256=0FAtg_HEZ2Z3ZDbfO8mpOKViF25tqHaFR5rUGRuULJA,7509
5
+ prelude_sdk_beta/controllers/export_controller.py,sha256=sTbRGmMa0xa7pB8AjSlJgifpXzutPHWw4bJBGygoAc4,862
6
+ prelude_sdk_beta/controllers/generate_controller.py,sha256=gNSr2yV1o8kdTy7heJ9bI31efEKyTKdacIkKl_eRIRg,1319
7
+ prelude_sdk_beta/controllers/http_controller.py,sha256=cj1SxmAX049ioAhTOQR4atuM82nJgd11S60-ISCg738,2300
8
+ prelude_sdk_beta/controllers/iam_controller.py,sha256=w40NO1kxPxLMFDICx32pqfZbTfDJTL9G-jxF6nR01Lw,7871
9
+ prelude_sdk_beta/controllers/jobs_controller.py,sha256=dwoBGX-gAVNKE8sbx1N_4jUJVDVSdNRYD826G0pfix0,765
10
+ prelude_sdk_beta/controllers/partner_controller.py,sha256=WV51CY-Bsf8Ms59y7RjtfvCmsArBoXt5-AHqrN8Eras,5128
11
+ prelude_sdk_beta/controllers/probe_controller.py,sha256=d2Aa74Css1uMNgBKGWqavbkEbXtVcOkYIIWbhDxzLS0,411
12
+ prelude_sdk_beta/controllers/scm_controller.py,sha256=X2CU11Se_zgGLKAR_whIlWMZdgT72XSfKCSP-gxNJaI,12793
13
+ prelude_sdk_beta/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ prelude_sdk_beta/models/account.py,sha256=ksyTZDOZpbT8XDu-Ygs_51ZG25oBd8qiwjO6-L6HH9Y,8734
15
+ prelude_sdk_beta/models/codes.py,sha256=-gxBflkV-RdE3LwGSDDSO48eK-J8skZ5CivMD2MYc5w,11425
16
+ prelude_sdk_beta-1406.dist-info/licenses/LICENSE,sha256=ttdT5omfN6LNmtQoIjUhkkFhz6i44SDMRNwKrbfyTf8,1069
17
+ prelude_sdk_beta-1406.dist-info/METADATA,sha256=L5B1pm77Vyl6sSukal59cWaI0uT5hw4tid0TkZTdzGs,1190
18
+ prelude_sdk_beta-1406.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
19
+ prelude_sdk_beta-1406.dist-info/top_level.txt,sha256=pqXTtEd5ElvJKoO6HAz232H9FW5j6X7gW4kEEakfSFM,17
20
+ prelude_sdk_beta-1406.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,9 @@
1
+ MIT LICENSE
2
+
3
+ Copyright 2022, Prelude Research
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1 @@
1
+ prelude_sdk_beta