| 12 | |
| 13 | |
| 14 | class AbilitySchema(ma.Schema): |
| 15 | |
| 16 | class Meta: |
| 17 | unknown = ma.EXCLUDE |
| 18 | |
| 19 | ability_id = ma.fields.String() |
| 20 | tactic = ma.fields.String(load_default=None) |
| 21 | technique_name = ma.fields.String(load_default=None) |
| 22 | technique_id = ma.fields.String(load_default=None) |
| 23 | name = ma.fields.String(load_default=None) |
| 24 | description = ma.fields.String(load_default=None) |
| 25 | executors = ma.fields.List(ma.fields.Nested(ExecutorSchema)) |
| 26 | requirements = ma.fields.List(ma.fields.Nested(RequirementSchema), load_default=None) |
| 27 | privilege = ma.fields.String(load_default=None) |
| 28 | repeatable = ma.fields.Bool(load_default=None) |
| 29 | buckets = ma.fields.List(ma.fields.String(), load_default=None) |
| 30 | additional_info = ma.fields.Dict(keys=ma.fields.String(), values=ma.fields.String()) |
| 31 | access = ma.fields.Nested(AccessSchema, load_default=None) |
| 32 | singleton = ma.fields.Bool(load_default=None) |
| 33 | plugin = ma.fields.String(load_default=None) |
| 34 | delete_payload = ma.fields.Bool(load_default=None) |
| 35 | |
| 36 | @ma.pre_load |
| 37 | def fix_id(self, data, **_): |
| 38 | if 'id' in data: |
| 39 | data['ability_id'] = data.pop('id') |
| 40 | return data |
| 41 | |
| 42 | @ma.post_load |
| 43 | def build_ability(self, data, **kwargs): |
| 44 | if 'technique' in data: |
| 45 | data['technique_name'] = data.pop('technique') |
| 46 | return None if kwargs.get('partial') is True else Ability(**data) |
| 47 | |
| 48 | |
| 49 | class Ability(FirstClassObjectInterface, BaseObject): |
no outgoing calls