synapse 2.183.0__py311-none-any.whl → 2.184.0__py311-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 synapse might be problematic. Click here for more details.
- synapse/datamodel.py +41 -3
- synapse/lib/ast.py +3 -2
- synapse/lib/autodoc.py +9 -2
- synapse/lib/cell.py +1 -1
- synapse/lib/stormlib/graph.py +17 -0
- synapse/lib/stormtypes.py +1 -1
- synapse/lib/stormwhois.py +3 -0
- synapse/lib/version.py +2 -2
- synapse/models/infotech.py +3 -0
- synapse/models/orgs.py +76 -2
- synapse/models/risk.py +22 -0
- synapse/tests/test_cortex.py +15 -44
- synapse/tests/test_lib_ast.py +58 -0
- synapse/tests/test_lib_autodoc.py +54 -0
- synapse/tests/test_lib_storm.py +14 -0
- synapse/tests/test_lib_stormlib_modelext.py +52 -0
- synapse/tests/test_lib_stormwhois.py +4 -4
- synapse/tests/test_model_infotech.py +5 -1
- synapse/tests/test_model_orgs.py +37 -0
- synapse/tests/test_model_risk.py +3 -0
- synapse/tests/utils.py +26 -0
- {synapse-2.183.0.dist-info → synapse-2.184.0.dist-info}/METADATA +1 -1
- {synapse-2.183.0.dist-info → synapse-2.184.0.dist-info}/RECORD +26 -26
- {synapse-2.183.0.dist-info → synapse-2.184.0.dist-info}/WHEEL +1 -1
- {synapse-2.183.0.dist-info → synapse-2.184.0.dist-info}/LICENSE +0 -0
- {synapse-2.183.0.dist-info → synapse-2.184.0.dist-info}/top_level.txt +0 -0
synapse/datamodel.py
CHANGED
|
@@ -987,7 +987,17 @@ class Model:
|
|
|
987
987
|
if form is None:
|
|
988
988
|
return
|
|
989
989
|
|
|
990
|
-
|
|
990
|
+
ifaceprops = set()
|
|
991
|
+
for iface in form.ifaces.values():
|
|
992
|
+
for prop in iface.get('props', ()):
|
|
993
|
+
ifaceprops.add(prop[0])
|
|
994
|
+
|
|
995
|
+
formprops = []
|
|
996
|
+
for propname, prop in form.props.items():
|
|
997
|
+
if prop.univ is not None or propname in ifaceprops:
|
|
998
|
+
continue
|
|
999
|
+
formprops.append(prop)
|
|
1000
|
+
|
|
991
1001
|
if formprops:
|
|
992
1002
|
propnames = ', '.join(prop.name for prop in formprops)
|
|
993
1003
|
mesg = f'Form has extended properties: {propnames}'
|
|
@@ -996,8 +1006,8 @@ class Model:
|
|
|
996
1006
|
if isinstance(form.type, s_types.Array):
|
|
997
1007
|
self.arraysbytype[form.type.arraytype.name].pop(form.name, None)
|
|
998
1008
|
|
|
999
|
-
for ifname in form.
|
|
1000
|
-
self.
|
|
1009
|
+
for ifname in form.type.info.get('interfaces', ()):
|
|
1010
|
+
self._delFormIface(form, ifname)
|
|
1001
1011
|
|
|
1002
1012
|
self.forms.pop(formname, None)
|
|
1003
1013
|
self.props.pop(formname, None)
|
|
@@ -1108,6 +1118,34 @@ class Model:
|
|
|
1108
1118
|
for ifname in ifaces:
|
|
1109
1119
|
self._addFormIface(form, ifname, subifaces=subifaces)
|
|
1110
1120
|
|
|
1121
|
+
def _delFormIface(self, form, name, subifaces=None):
|
|
1122
|
+
|
|
1123
|
+
if (iface := self.ifaces.get(name)) is None:
|
|
1124
|
+
return
|
|
1125
|
+
|
|
1126
|
+
for propname, typedef, propinfo in iface.get('props', ()):
|
|
1127
|
+
fullprop = f'{form.name}:{propname}'
|
|
1128
|
+
self.delFormProp(form.name, propname)
|
|
1129
|
+
self.ifaceprops[f'{name}:{propname}'].remove(fullprop)
|
|
1130
|
+
|
|
1131
|
+
if subifaces is not None:
|
|
1132
|
+
for subi in subifaces:
|
|
1133
|
+
self.ifaceprops[f'{subi}:{propname}'].remove(fullprop)
|
|
1134
|
+
|
|
1135
|
+
form.ifaces.pop(name, None)
|
|
1136
|
+
self.formsbyiface[name].remove(form.name)
|
|
1137
|
+
|
|
1138
|
+
if (ifaces := iface.get('interfaces')) is not None:
|
|
1139
|
+
if subifaces is None:
|
|
1140
|
+
subifaces = []
|
|
1141
|
+
else:
|
|
1142
|
+
subifaces = list(subifaces)
|
|
1143
|
+
|
|
1144
|
+
subifaces.append(name)
|
|
1145
|
+
|
|
1146
|
+
for ifname in ifaces:
|
|
1147
|
+
self._delFormIface(form, ifname, subifaces=subifaces)
|
|
1148
|
+
|
|
1111
1149
|
def delTagProp(self, name):
|
|
1112
1150
|
return self.tagprops.pop(name)
|
|
1113
1151
|
|
synapse/lib/ast.py
CHANGED
|
@@ -1302,8 +1302,9 @@ class VarListSetOper(Oper):
|
|
|
1302
1302
|
names = self.kids[0].value()
|
|
1303
1303
|
vkid = self.kids[1]
|
|
1304
1304
|
|
|
1305
|
+
anynodes = False
|
|
1305
1306
|
async for node, path in genr:
|
|
1306
|
-
|
|
1307
|
+
anynodes = True
|
|
1307
1308
|
item = await vkid.compute(runt, path)
|
|
1308
1309
|
item = [i async for i in s_stormtypes.toiter(item)]
|
|
1309
1310
|
|
|
@@ -1318,7 +1319,7 @@ class VarListSetOper(Oper):
|
|
|
1318
1319
|
|
|
1319
1320
|
yield node, path
|
|
1320
1321
|
|
|
1321
|
-
if vkid.isRuntSafe(runt):
|
|
1322
|
+
if not anynodes and vkid.isRuntSafe(runt):
|
|
1322
1323
|
|
|
1323
1324
|
item = await vkid.compute(runt, None)
|
|
1324
1325
|
item = [i async for i in s_stormtypes.toiter(item)]
|
synapse/lib/autodoc.py
CHANGED
|
@@ -464,6 +464,7 @@ def docStormTypes(page, docinfo, linkprefix, islib=False, lvl=1,
|
|
|
464
464
|
|
|
465
465
|
locls = info.get('locals', ())
|
|
466
466
|
locls = sorted(locls, key=lambda x: x.get('name'))
|
|
467
|
+
libdepr = info.get('deprecated')
|
|
467
468
|
|
|
468
469
|
for locl in locls:
|
|
469
470
|
|
|
@@ -478,6 +479,8 @@ def docStormTypes(page, docinfo, linkprefix, islib=False, lvl=1,
|
|
|
478
479
|
lines = []
|
|
479
480
|
if depr := locl.get('deprecated'):
|
|
480
481
|
lines.extend(genDeprecationWarning(f'${loclname}', depr, True))
|
|
482
|
+
elif libdepr is not None:
|
|
483
|
+
lines.extend(genDeprecationWarning(f'${loclname}', libdepr, True))
|
|
481
484
|
|
|
482
485
|
if isinstance(rtype, dict):
|
|
483
486
|
rname = rtype.get('type')
|
|
@@ -576,6 +579,7 @@ def runtimeDocStormTypes(page, docinfo, islib=False, lvl=1,
|
|
|
576
579
|
|
|
577
580
|
page.addLines(*preamble)
|
|
578
581
|
|
|
582
|
+
libdepr = info.get('deprecated')
|
|
579
583
|
locls = info.get('locals', ())
|
|
580
584
|
locls = sorted(locls, key=lambda x: x.get('name'))
|
|
581
585
|
|
|
@@ -624,8 +628,11 @@ def runtimeDocStormTypes(page, docinfo, islib=False, lvl=1,
|
|
|
624
628
|
assert rtype is not None
|
|
625
629
|
|
|
626
630
|
lines = []
|
|
627
|
-
if
|
|
628
|
-
|
|
631
|
+
if not oneline:
|
|
632
|
+
if (depr := locl.get('deprecated')):
|
|
633
|
+
lines.extend(genDeprecationWarning(f'${loclname}', depr))
|
|
634
|
+
elif libdepr is not None:
|
|
635
|
+
lines.extend(genDeprecationWarning(f'${loclname}', libdepr))
|
|
629
636
|
|
|
630
637
|
if isinstance(rtype, dict):
|
|
631
638
|
rname = rtype.get('type')
|
synapse/lib/cell.py
CHANGED
|
@@ -3560,7 +3560,7 @@ class Cell(s_nexus.Pusher, s_telepath.Aware):
|
|
|
3560
3560
|
item.setdefault('permissions', {})
|
|
3561
3561
|
item['permissions'].setdefault('users', {})
|
|
3562
3562
|
item['permissions'].setdefault('roles', {})
|
|
3563
|
-
item['permissions']
|
|
3563
|
+
item['permissions'].setdefault('default', default)
|
|
3564
3564
|
|
|
3565
3565
|
async def getTeleApi(self, link, mesg, path):
|
|
3566
3566
|
|
synapse/lib/stormlib/graph.py
CHANGED
|
@@ -157,6 +157,15 @@ class GraphLib(s_stormtypes.Lib):
|
|
|
157
157
|
),
|
|
158
158
|
'returns': {'type': 'null', }}},
|
|
159
159
|
|
|
160
|
+
{'name': 'revoke', 'desc': 'Revoke permissions granted to users/roles on a graph projection.',
|
|
161
|
+
'type': {'type': 'function', '_funcname': '_methGraphRevoke',
|
|
162
|
+
'args': (
|
|
163
|
+
{'name': 'gden', 'type': 'str', 'desc': 'Iden of the graph projection to modify.'},
|
|
164
|
+
{'name': 'scope', 'type': 'str', 'desc': 'The scope, either "users" or "roles".'},
|
|
165
|
+
{'name': 'iden', 'type': 'str', 'desc': 'The user/role iden depending on scope.'},
|
|
166
|
+
),
|
|
167
|
+
'returns': {'type': 'null'}}},
|
|
168
|
+
|
|
160
169
|
{'name': 'activate', 'desc': 'Set the graph projection to use for the top level Storm Runtime.',
|
|
161
170
|
'type': {'type': 'function', '_funcname': '_methGraphActivate',
|
|
162
171
|
'args': (
|
|
@@ -174,6 +183,7 @@ class GraphLib(s_stormtypes.Lib):
|
|
|
174
183
|
'mod': self._methGraphMod,
|
|
175
184
|
'list': self._methGraphList,
|
|
176
185
|
'grant': self._methGraphGrant,
|
|
186
|
+
'revoke': self._methGraphRevoke,
|
|
177
187
|
'activate': self._methGraphActivate,
|
|
178
188
|
}
|
|
179
189
|
|
|
@@ -219,6 +229,13 @@ class GraphLib(s_stormtypes.Lib):
|
|
|
219
229
|
|
|
220
230
|
await self.runt.snap.core.setStormGraphPerm(gden, scope, iden, level, user=self.runt.user)
|
|
221
231
|
|
|
232
|
+
async def _methGraphRevoke(self, gden, scope, iden):
|
|
233
|
+
gden = await s_stormtypes.tostr(gden)
|
|
234
|
+
scope = await s_stormtypes.tostr(scope)
|
|
235
|
+
iden = await s_stormtypes.tostr(iden)
|
|
236
|
+
|
|
237
|
+
await self.runt.snap.core.setStormGraphPerm(gden, scope, iden, None, user=self.runt.user)
|
|
238
|
+
|
|
222
239
|
async def _methGraphActivate(self, iden):
|
|
223
240
|
gdef = await self._methGraphGet(iden)
|
|
224
241
|
self.runt.setGraph(gdef)
|
synapse/lib/stormtypes.py
CHANGED
|
@@ -2661,7 +2661,7 @@ class LibBytes(Lib):
|
|
|
2661
2661
|
'returns': {'type': 'list', 'desc': 'A tuple of the file size and sha256 value.', }}},
|
|
2662
2662
|
)
|
|
2663
2663
|
_storm_lib_path = ('bytes',)
|
|
2664
|
-
_storm_lib_deprecation = {'eolvers': 'v3.0.0'}
|
|
2664
|
+
_storm_lib_deprecation = {'eolvers': 'v3.0.0', 'mesg': 'Use the corresponding ``$lib.axon`` function.'}
|
|
2665
2665
|
|
|
2666
2666
|
def getObjLocals(self):
|
|
2667
2667
|
return {
|
synapse/lib/stormwhois.py
CHANGED
|
@@ -16,6 +16,7 @@ class LibWhois(s_stormtypes.Lib):
|
|
|
16
16
|
|
|
17
17
|
Raises:
|
|
18
18
|
StormRuntimeError: If form is not supported in this method.''',
|
|
19
|
+
'deprecated': {'eolvers': 'v3.0.0', 'mesg': 'Please use the GUID constructor syntax.'},
|
|
19
20
|
'type': {'type': 'function', '_funcname': '_whoisGuid',
|
|
20
21
|
'args': (
|
|
21
22
|
{'name': 'props', 'type': 'dict', 'desc': 'Dictionary of properties used to create the form.', },
|
|
@@ -31,6 +32,8 @@ class LibWhois(s_stormtypes.Lib):
|
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
async def _whoisGuid(self, props, form):
|
|
35
|
+
s_common.deprecated('$lib.inet.whois.guid()', curv='2.183.0')
|
|
36
|
+
await self.runt.snap.warnonce('$lib.inet.whois.guid() is deprecated. Use the GUID constructor syntax.')
|
|
34
37
|
form = await s_stormtypes.tostr(form)
|
|
35
38
|
props = await s_stormtypes.toprim(props)
|
|
36
39
|
if form == 'iprec':
|
synapse/lib/version.py
CHANGED
|
@@ -223,6 +223,6 @@ def reqVersion(valu, reqver,
|
|
|
223
223
|
##############################################################################
|
|
224
224
|
# The following are touched during the release process by bumpversion.
|
|
225
225
|
# Do not modify these directly.
|
|
226
|
-
version = (2,
|
|
226
|
+
version = (2, 184, 0)
|
|
227
227
|
verstring = '.'.join([str(x) for x in version])
|
|
228
|
-
commit = '
|
|
228
|
+
commit = '05940dce070d26f83bb7e4070f1d44d051804e3b'
|
synapse/models/infotech.py
CHANGED
|
@@ -2986,6 +2986,9 @@ class ItModule(s_module.CoreModule):
|
|
|
2986
2986
|
'doc': 'The sensor host node that produced the hit.'}),
|
|
2987
2987
|
('version', ('it:semver', {}), {
|
|
2988
2988
|
'doc': 'The version of the rule at the time of match.'}),
|
|
2989
|
+
|
|
2990
|
+
('dropped', ('bool', {}), {
|
|
2991
|
+
'doc': 'Set to true if the network traffic was dropped due to the match.'}),
|
|
2989
2992
|
)),
|
|
2990
2993
|
|
|
2991
2994
|
('it:sec:stix:bundle', {}, (
|
synapse/models/orgs.py
CHANGED
|
@@ -45,6 +45,24 @@ class OuModule(s_module.CoreModule):
|
|
|
45
45
|
),
|
|
46
46
|
}}),
|
|
47
47
|
|
|
48
|
+
('ou:asset:type:taxonomy', ('taxonomy', {}), {
|
|
49
|
+
'interfaces': ('meta:taxonomy',),
|
|
50
|
+
'doc': 'An asset type taxonomy.'}),
|
|
51
|
+
|
|
52
|
+
('ou:asset:status:taxonomy', ('taxonomy', {}), {
|
|
53
|
+
'interfaces': ('meta:taxonomy',),
|
|
54
|
+
'doc': 'An asset status taxonomy.'}),
|
|
55
|
+
|
|
56
|
+
('ou:asset', ('guid', {}), {
|
|
57
|
+
'doc': 'A node for tracking assets which belong to an organization.',
|
|
58
|
+
'display': {
|
|
59
|
+
'columns': (
|
|
60
|
+
{'type': 'prop', 'opts': {'name': 'id'}},
|
|
61
|
+
{'type': 'prop', 'opts': {'name': 'name'}},
|
|
62
|
+
{'type': 'prop', 'opts': {'name': 'org::name'}},
|
|
63
|
+
),
|
|
64
|
+
}}),
|
|
65
|
+
|
|
48
66
|
('ou:orgtype', ('taxonomy', {}), {
|
|
49
67
|
'doc': 'An org type taxonomy.',
|
|
50
68
|
'interfaces': ('meta:taxonomy',),
|
|
@@ -246,6 +264,9 @@ class OuModule(s_module.CoreModule):
|
|
|
246
264
|
('ou:jobtitle', ('str', {'lower': True, 'onespace': True}), {
|
|
247
265
|
'doc': 'A title for a position within an org.',
|
|
248
266
|
}),
|
|
267
|
+
('ou:requirement:type:taxonomy', ('taxonomy', {}), {
|
|
268
|
+
'interfaces': ('meta:taxonomy',),
|
|
269
|
+
'doc': 'A taxonomy of requirement types.'}),
|
|
249
270
|
('ou:requirement', ('guid', {}), {
|
|
250
271
|
'doc': 'A specific requirement.'}),
|
|
251
272
|
),
|
|
@@ -341,8 +362,11 @@ class OuModule(s_module.CoreModule):
|
|
|
341
362
|
'doc': 'The currency of the econ:price values.',
|
|
342
363
|
}),
|
|
343
364
|
('costs', ('econ:price', {}), {
|
|
344
|
-
'doc': 'The costs/expenditures over the period.',
|
|
345
|
-
|
|
365
|
+
'doc': 'The costs/expenditures over the period.'}),
|
|
366
|
+
|
|
367
|
+
('budget', ('econ:price', {}), {
|
|
368
|
+
'doc': 'The budget allocated for the period.'}),
|
|
369
|
+
|
|
346
370
|
('revenue', ('econ:price', {}), {
|
|
347
371
|
'doc': 'The gross revenue over the period.',
|
|
348
372
|
}),
|
|
@@ -728,6 +752,52 @@ class OuModule(s_module.CoreModule):
|
|
|
728
752
|
('org', ('ou:org', {}), {}),
|
|
729
753
|
('name', ('ou:name', {}), {}),
|
|
730
754
|
)),
|
|
755
|
+
|
|
756
|
+
('ou:asset:type:taxonomy', {}, ()),
|
|
757
|
+
('ou:asset:status:taxonomy', {}, ()),
|
|
758
|
+
('ou:asset', {}, (
|
|
759
|
+
('org', ('ou:org', {}), {
|
|
760
|
+
'doc': 'The organization which owns the asset.'}),
|
|
761
|
+
|
|
762
|
+
('id', ('str', {'strip': True}), {
|
|
763
|
+
'doc': 'The ID of the asset.'}),
|
|
764
|
+
|
|
765
|
+
('name', ('str', {'lower': True, 'onespace': True}), {
|
|
766
|
+
'doc': 'The name of the assset.'}),
|
|
767
|
+
|
|
768
|
+
('period', ('ival', {}), {
|
|
769
|
+
'doc': 'The period of time when the asset was being tracked.'}),
|
|
770
|
+
|
|
771
|
+
('status', ('ou:asset:status:taxonomy', {}), {
|
|
772
|
+
'doc': 'The current status of the asset.'}),
|
|
773
|
+
|
|
774
|
+
('type', ('ou:asset:type:taxonomy', {}), {
|
|
775
|
+
'doc': 'The asset type.'}),
|
|
776
|
+
|
|
777
|
+
('priority', ('meta:priority', {}), {
|
|
778
|
+
'doc': 'The overall priority of protecting the asset.'}),
|
|
779
|
+
|
|
780
|
+
('priority:confidentiality', ('meta:priority', {}), {
|
|
781
|
+
'doc': 'The priority of protecting the confidentiality of the asset.'}),
|
|
782
|
+
|
|
783
|
+
('priority:integrity', ('meta:priority', {}), {
|
|
784
|
+
'doc': 'The priority of protecting the integrity of the asset.'}),
|
|
785
|
+
|
|
786
|
+
('priority:availability', ('meta:priority', {}), {
|
|
787
|
+
'doc': 'The priority of protecting the availability of the asset.'}),
|
|
788
|
+
|
|
789
|
+
('node', ('ndef', {}), {
|
|
790
|
+
'doc': 'The node which represents the asset.'}),
|
|
791
|
+
|
|
792
|
+
('place', ('geo:place', {}), {
|
|
793
|
+
'doc': 'The place where the asset is deployed.'}),
|
|
794
|
+
|
|
795
|
+
('owner', ('ps:contact', {}), {
|
|
796
|
+
'doc': 'The contact information of the owner or administrator of the asset.'}),
|
|
797
|
+
|
|
798
|
+
('operator', ('ps:contact', {}), {
|
|
799
|
+
'doc': 'The contact information of the user or operator of the asset.'}),
|
|
800
|
+
)),
|
|
731
801
|
('ou:position', {}, (
|
|
732
802
|
('org', ('ou:org', {}), {
|
|
733
803
|
'doc': 'The org which has the position.',
|
|
@@ -1213,11 +1283,15 @@ class OuModule(s_module.CoreModule):
|
|
|
1213
1283
|
}),
|
|
1214
1284
|
# TODO duration ('duration'
|
|
1215
1285
|
)),
|
|
1286
|
+
('ou:requirement:type:taxonomy', {}, ()),
|
|
1216
1287
|
('ou:requirement', {}, (
|
|
1217
1288
|
|
|
1218
1289
|
('name', ('str', {'lower': True, 'onespace': True}), {
|
|
1219
1290
|
'doc': 'A name for the requirement.'}),
|
|
1220
1291
|
|
|
1292
|
+
('type', ('ou:requirement:type:taxonomy', {}), {
|
|
1293
|
+
'doc': 'The type of requirement.'}),
|
|
1294
|
+
|
|
1221
1295
|
('text', ('str', {}), {
|
|
1222
1296
|
'disp': {'hint': 'text'},
|
|
1223
1297
|
'doc': 'The text of the stated requirement.'}),
|
synapse/models/risk.py
CHANGED
|
@@ -96,12 +96,17 @@ class RiskModule(s_module.CoreModule):
|
|
|
96
96
|
),
|
|
97
97
|
},
|
|
98
98
|
}),
|
|
99
|
+
('risk:mitigation:type:taxonomy', ('taxonomy', {}), {
|
|
100
|
+
'interaces': ('taxonomy',),
|
|
101
|
+
'doc': 'A taxonomy of mitigation types.',
|
|
102
|
+
}),
|
|
99
103
|
('risk:mitigation', ('guid', {}), {
|
|
100
104
|
'doc': 'A mitigation for a specific risk:vuln.',
|
|
101
105
|
'display': {
|
|
102
106
|
'columns': (
|
|
103
107
|
{'type': 'prop', 'opts': {'name': 'name'}},
|
|
104
108
|
{'type': 'prop', 'opts': {'name': 'reporter:name'}},
|
|
109
|
+
{'type': 'prop', 'opts': {'name': 'type'}},
|
|
105
110
|
{'type': 'prop', 'opts': {'name': 'tag'}},
|
|
106
111
|
),
|
|
107
112
|
},
|
|
@@ -198,9 +203,22 @@ class RiskModule(s_module.CoreModule):
|
|
|
198
203
|
'doc': 'The tool uses the target node.'}),
|
|
199
204
|
(('risk:compromise', 'stole', None), {
|
|
200
205
|
'doc': 'The target node was stolen or copied as a result of the compromise.'}),
|
|
206
|
+
|
|
201
207
|
(('risk:mitigation', 'addresses', 'ou:technique'), {
|
|
202
208
|
'doc': 'The mitigation addresses the technique.'}),
|
|
203
209
|
|
|
210
|
+
(('risk:mitigation', 'uses', 'meta:rule'), {
|
|
211
|
+
'doc': 'The mitigation uses the rule.'}),
|
|
212
|
+
|
|
213
|
+
(('risk:mitigation', 'uses', 'it:app:yara:rule'), {
|
|
214
|
+
'doc': 'The mitigation uses the YARA rule.'}),
|
|
215
|
+
|
|
216
|
+
(('risk:mitigation', 'uses', 'it:app:snort:rule'), {
|
|
217
|
+
'doc': 'The mitigation uses the Snort rule.'}),
|
|
218
|
+
|
|
219
|
+
(('risk:mitigation', 'uses', 'inet:service:rule'), {
|
|
220
|
+
'doc': 'The mitigation uses the service rule.'}),
|
|
221
|
+
|
|
204
222
|
(('risk:leak', 'leaked', None), {
|
|
205
223
|
'doc': 'The leak included the disclosure of the target node.'}),
|
|
206
224
|
|
|
@@ -334,6 +352,7 @@ class RiskModule(s_module.CoreModule):
|
|
|
334
352
|
'doc': 'A mapping to a MITRE ATT&CK software if applicable.'}),
|
|
335
353
|
|
|
336
354
|
)),
|
|
355
|
+
('risk:mitigation:type:taxonomy', {}, ()),
|
|
337
356
|
('risk:mitigation', {}, (
|
|
338
357
|
|
|
339
358
|
('vuln', ('risk:vuln', {}), {
|
|
@@ -342,6 +361,9 @@ class RiskModule(s_module.CoreModule):
|
|
|
342
361
|
('name', ('str', {'lower': True, 'onespace': True}), {
|
|
343
362
|
'doc': 'A brief name for this risk mitigation.'}),
|
|
344
363
|
|
|
364
|
+
('type', ('risk:mitigation:type:taxonomy', {}), {
|
|
365
|
+
'doc': 'A taxonomy type entry for the mitigation.'}),
|
|
366
|
+
|
|
345
367
|
('desc', ('str', {}), {
|
|
346
368
|
'disp': {'hint': 'text'},
|
|
347
369
|
'doc': 'A description of the mitigation approach for the vulnerability.'}),
|
synapse/tests/test_cortex.py
CHANGED
|
@@ -3419,50 +3419,6 @@ class CortexBasicTest(s_t_utils.SynTest):
|
|
|
3419
3419
|
self.eq(nodes[0].ndef, ('inet:ipv4', 0x01020304))
|
|
3420
3420
|
self.nn(nodes[0].getTag('hehe.haha'))
|
|
3421
3421
|
|
|
3422
|
-
async def test_storm_varlistset(self):
|
|
3423
|
-
|
|
3424
|
-
async with self.getTestCore() as core:
|
|
3425
|
-
|
|
3426
|
-
opts = {'vars': {'blob': ('vertex.link', '9001')}}
|
|
3427
|
-
text = '($fqdn, $crap) = $blob [ inet:fqdn=$fqdn ]'
|
|
3428
|
-
|
|
3429
|
-
nodes = await core.nodes(text, opts=opts)
|
|
3430
|
-
self.len(1, nodes)
|
|
3431
|
-
for node in nodes:
|
|
3432
|
-
self.eq(node.ndef, ('inet:fqdn', 'vertex.link'))
|
|
3433
|
-
|
|
3434
|
-
now = s_common.now()
|
|
3435
|
-
ret = await core.callStorm('($foo, $bar)=$lib.cast(ival, $lib.time.now()) return($foo)')
|
|
3436
|
-
self.ge(ret, now)
|
|
3437
|
-
|
|
3438
|
-
text = '.created ($foo, $bar, $baz) = $blob'
|
|
3439
|
-
with self.raises(s_exc.StormVarListError):
|
|
3440
|
-
await core.nodes(text, opts)
|
|
3441
|
-
|
|
3442
|
-
text = '($foo, $bar, $baz) = $blob'
|
|
3443
|
-
with self.raises(s_exc.StormVarListError):
|
|
3444
|
-
await core.nodes(text, opts)
|
|
3445
|
-
|
|
3446
|
-
text = 'for ($x, $y) in ((1),) { $lib.print($x) }'
|
|
3447
|
-
with self.raises(s_exc.StormVarListError):
|
|
3448
|
-
await core.nodes(text)
|
|
3449
|
-
|
|
3450
|
-
text = 'for ($x, $y) in ($lib.layer.get(),) { $lib.print($x) }'
|
|
3451
|
-
with self.raises(s_exc.StormRuntimeError):
|
|
3452
|
-
await core.nodes(text)
|
|
3453
|
-
|
|
3454
|
-
text = '[test:str=foo] for ($x, $y) in ((1),) { $lib.print($x) }'
|
|
3455
|
-
with self.raises(s_exc.StormVarListError):
|
|
3456
|
-
await core.nodes(text)
|
|
3457
|
-
|
|
3458
|
-
text = '[test:str=foo] for ($x, $y) in ((1),) { $lib.print($x) }'
|
|
3459
|
-
with self.raises(s_exc.StormRuntimeError):
|
|
3460
|
-
await core.nodes(text)
|
|
3461
|
-
|
|
3462
|
-
text = '($x, $y) = (1)'
|
|
3463
|
-
with self.raises(s_exc.StormRuntimeError):
|
|
3464
|
-
await core.nodes(text)
|
|
3465
|
-
|
|
3466
3422
|
async def test_storm_contbreak(self):
|
|
3467
3423
|
|
|
3468
3424
|
async with self.getTestCore() as core:
|
|
@@ -3929,6 +3885,15 @@ class CortexBasicTest(s_t_utils.SynTest):
|
|
|
3929
3885
|
opts['vars']['useriden'] = visi.iden
|
|
3930
3886
|
|
|
3931
3887
|
await self.asyncraises(s_exc.AuthDeny, core.nodes('$lib.graph.del($iden2)', opts=uopts))
|
|
3888
|
+
await core.nodes('$lib.graph.grant($iden2, users, $useriden, 3)', opts=opts)
|
|
3889
|
+
|
|
3890
|
+
await core.nodes('$lib.graph.mod($iden2, ({"name": "newname"}))', opts=uopts)
|
|
3891
|
+
gdef = await core.callStorm('return($lib.graph.get($iden2))', opts=opts)
|
|
3892
|
+
self.eq(gdef['name'], 'newname')
|
|
3893
|
+
|
|
3894
|
+
await core.nodes('$lib.graph.revoke($iden2, users, $useriden)', opts=opts)
|
|
3895
|
+
await self.asyncraises(s_exc.AuthDeny, core.nodes('$lib.graph.mod($iden2, ({"name": "newp"}))', opts=uopts))
|
|
3896
|
+
|
|
3932
3897
|
await core.nodes('$lib.graph.grant($iden2, users, $useriden, 3)', opts=opts)
|
|
3933
3898
|
await core.nodes('$lib.graph.del($iden2)', opts=uopts)
|
|
3934
3899
|
|
|
@@ -4018,6 +3983,12 @@ class CortexBasicTest(s_t_utils.SynTest):
|
|
|
4018
3983
|
async with self.getTestCore(dirn=dirn) as core:
|
|
4019
3984
|
self.len(3, await core.callStorm('return($lib.graph.list())', opts=opts))
|
|
4020
3985
|
|
|
3986
|
+
gdef = await core.callStorm('return($lib.graph.add(({"name": "nodef"})))')
|
|
3987
|
+
self.eq(1, gdef['permissions']['default'])
|
|
3988
|
+
|
|
3989
|
+
gdef = await core.callStorm('return($lib.graph.add(({"name": "def", "permissions": {"default": 0}})))')
|
|
3990
|
+
self.eq(0, gdef['permissions']['default'])
|
|
3991
|
+
|
|
4021
3992
|
async def test_storm_two_level_assignment(self):
|
|
4022
3993
|
async with self.getTestCore() as core:
|
|
4023
3994
|
q = '$foo=baz $bar=$foo [test:str=$bar]'
|
synapse/tests/test_lib_ast.py
CHANGED
|
@@ -4331,3 +4331,61 @@ class AstTest(s_test.SynTest):
|
|
|
4331
4331
|
_assert_edge(msgs, small, {'type': 'prop', 'prop': 'ndefs', 'reverse': True}, nidx=1)
|
|
4332
4332
|
_assert_edge(msgs, small, {'type': 'edge', 'verb': 'seen', 'reverse': True}, nidx=2)
|
|
4333
4333
|
_assert_edge(msgs, small, {'type': 'edge', 'verb': 'someedge', 'reverse': True}, nidx=3)
|
|
4334
|
+
|
|
4335
|
+
async def test_ast_varlistset(self):
|
|
4336
|
+
|
|
4337
|
+
async with self.getTestCore() as core:
|
|
4338
|
+
|
|
4339
|
+
opts = {'vars': {'blob': ('vertex.link', '9001')}}
|
|
4340
|
+
text = '($fqdn, $crap) = $blob [ inet:fqdn=$fqdn ]'
|
|
4341
|
+
|
|
4342
|
+
nodes = await core.nodes(text, opts=opts)
|
|
4343
|
+
self.len(1, nodes)
|
|
4344
|
+
for node in nodes:
|
|
4345
|
+
self.eq(node.ndef, ('inet:fqdn', 'vertex.link'))
|
|
4346
|
+
|
|
4347
|
+
now = s_common.now()
|
|
4348
|
+
ret = await core.callStorm('($foo, $bar)=$lib.cast(ival, $lib.time.now()) return($foo)')
|
|
4349
|
+
self.ge(ret, now)
|
|
4350
|
+
|
|
4351
|
+
# The runtsafe invocation of the VarListSetOper is done per node.
|
|
4352
|
+
q = '''
|
|
4353
|
+
init { $count = ({ 'c': (0) }) }
|
|
4354
|
+
function foo(){
|
|
4355
|
+
$count.c = ( $count.c + (1) )
|
|
4356
|
+
return((a, b))
|
|
4357
|
+
}
|
|
4358
|
+
inet:fqdn=vertex.link
|
|
4359
|
+
($a, $b) = $foo()
|
|
4360
|
+
fini { return ( $count ) }
|
|
4361
|
+
'''
|
|
4362
|
+
valu = await core.callStorm(q)
|
|
4363
|
+
self.eq(valu, {'c': 1})
|
|
4364
|
+
|
|
4365
|
+
text = '.created ($foo, $bar, $baz) = $blob'
|
|
4366
|
+
with self.raises(s_exc.StormVarListError):
|
|
4367
|
+
await core.nodes(text, opts)
|
|
4368
|
+
|
|
4369
|
+
text = '($foo, $bar, $baz) = $blob'
|
|
4370
|
+
with self.raises(s_exc.StormVarListError):
|
|
4371
|
+
await core.nodes(text, opts)
|
|
4372
|
+
|
|
4373
|
+
text = 'for ($x, $y) in ((1),) { $lib.print($x) }'
|
|
4374
|
+
with self.raises(s_exc.StormVarListError):
|
|
4375
|
+
await core.nodes(text)
|
|
4376
|
+
|
|
4377
|
+
text = 'for ($x, $y) in ($lib.layer.get(),) { $lib.print($x) }'
|
|
4378
|
+
with self.raises(s_exc.StormRuntimeError):
|
|
4379
|
+
await core.nodes(text)
|
|
4380
|
+
|
|
4381
|
+
text = '[test:str=foo] for ($x, $y) in ((1),) { $lib.print($x) }'
|
|
4382
|
+
with self.raises(s_exc.StormVarListError):
|
|
4383
|
+
await core.nodes(text)
|
|
4384
|
+
|
|
4385
|
+
text = '[test:str=foo] for ($x, $y) in ((1),) { $lib.print($x) }'
|
|
4386
|
+
with self.raises(s_exc.StormRuntimeError):
|
|
4387
|
+
await core.nodes(text)
|
|
4388
|
+
|
|
4389
|
+
text = '($x, $y) = (1)'
|
|
4390
|
+
with self.raises(s_exc.StormRuntimeError):
|
|
4391
|
+
await core.nodes(text)
|
|
@@ -288,3 +288,57 @@ Returns:
|
|
|
288
288
|
}
|
|
289
289
|
with self.raises(s_exc.SchemaViolation):
|
|
290
290
|
s_autodoc.docStormTypes(page, (doc,), linkprefix='test')
|
|
291
|
+
|
|
292
|
+
libdepr = s_t_utils.LibDepr
|
|
293
|
+
locls = copy.deepcopy(libdepr._storm_locals)
|
|
294
|
+
[obj.get('type', {}).pop('_funcname', None) for obj in locls]
|
|
295
|
+
doc = {
|
|
296
|
+
'desc': s_stormtypes.getDoc(libdepr, "err"),
|
|
297
|
+
'path': ('lib',) + libdepr._storm_lib_path,
|
|
298
|
+
'locals': locls,
|
|
299
|
+
'deprecated': libdepr._storm_lib_deprecation
|
|
300
|
+
}
|
|
301
|
+
page = s_autodoc.RstHelp()
|
|
302
|
+
page.addHead('Test')
|
|
303
|
+
page.addLines('I am a line.')
|
|
304
|
+
s_autodoc.docStormTypes(page, (doc,), linkprefix='test', islib=True)
|
|
305
|
+
text = page.getRstText()
|
|
306
|
+
expected = '''
|
|
307
|
+
####
|
|
308
|
+
Test
|
|
309
|
+
####
|
|
310
|
+
|
|
311
|
+
I am a line.
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
.. _test-lib-depr:
|
|
315
|
+
|
|
316
|
+
*********
|
|
317
|
+
$lib.depr
|
|
318
|
+
*********
|
|
319
|
+
|
|
320
|
+
Deprecate me!
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
.. _test-lib-depr-boop:
|
|
325
|
+
|
|
326
|
+
$lib.depr.boop(valu)
|
|
327
|
+
====================
|
|
328
|
+
|
|
329
|
+
.. warning::
|
|
330
|
+
``$lib.depr.boop`` has been deprecated and will be removed in version v3.0.0.
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
An example storm function that's not deprecated on its own, but the entire library is.
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
Args:
|
|
338
|
+
valu (str): What to boop.
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
Returns:
|
|
343
|
+
The booped. The return type is ``str``.'''
|
|
344
|
+
self.eq(text, expected)
|
synapse/tests/test_lib_storm.py
CHANGED
|
@@ -3917,6 +3917,11 @@ class StormTest(s_t_utils.SynTest):
|
|
|
3917
3917
|
self.stormIsInPrint('Warning', msgs)
|
|
3918
3918
|
self.stormIsInPrint('``$lib.infosec.cvss.saveVectToNode`` has been deprecated and will be removed in version v3.0.0.', msgs)
|
|
3919
3919
|
|
|
3920
|
+
msgs = await core.stormlist('help --verbose $lib.inet.whois.guid')
|
|
3921
|
+
self.stormIsInPrint('Warning', msgs)
|
|
3922
|
+
self.stormIsInPrint('``$lib.inet.whois.guid`` has been deprecated and will be removed in version v3.0.0.', msgs)
|
|
3923
|
+
self.stormIsInPrint('Please use the GUID constructor syntax.', msgs)
|
|
3924
|
+
|
|
3920
3925
|
msgs = await core.stormlist('help $lib.inet')
|
|
3921
3926
|
self.stormIsInPrint('The following libraries are available:\n\n'
|
|
3922
3927
|
'$lib.inet.http : A Storm Library exposing an HTTP client API.\n'
|
|
@@ -3947,6 +3952,15 @@ class StormTest(s_t_utils.SynTest):
|
|
|
3947
3952
|
msgs = await core.stormlist('$mod=$lib.import(foosmod) help $mod.f')
|
|
3948
3953
|
self.stormIsInErr('help does not currently support runtime defined functions.', msgs)
|
|
3949
3954
|
|
|
3955
|
+
msgs = await core.stormlist('help --verbose $lib.bytes')
|
|
3956
|
+
self.stormIsInPrint('Warning', msgs)
|
|
3957
|
+
self.stormIsInPrint('$lib.bytes.put`` has been deprecated and will be removed in version v3.0.0', msgs)
|
|
3958
|
+
self.stormIsInPrint('$lib.bytes.has`` has been deprecated and will be removed in version v3.0.0', msgs)
|
|
3959
|
+
self.stormIsInPrint('$lib.bytes.size`` has been deprecated and will be removed in version v3.0.0', msgs)
|
|
3960
|
+
self.stormIsInPrint('$lib.bytes.upload`` has been deprecated and will be removed in version v3.0.0', msgs)
|
|
3961
|
+
self.stormIsInPrint('$lib.bytes.hashset`` has been deprecated and will be removed in version v3.0.0', msgs)
|
|
3962
|
+
self.stormIsInPrint('Use the corresponding ``$lib.axon`` function.', msgs)
|
|
3963
|
+
|
|
3950
3964
|
async def test_liftby_edge(self):
|
|
3951
3965
|
async with self.getTestCore() as core:
|
|
3952
3966
|
|
|
@@ -510,3 +510,55 @@ class StormtypesModelextTest(s_test.SynTest):
|
|
|
510
510
|
with self.raises(s_exc.BadArg) as exc:
|
|
511
511
|
await core.callStorm(query)
|
|
512
512
|
self.eq(err, exc.exception.get('mesg'))
|
|
513
|
+
|
|
514
|
+
async def test_lib_stormlib_modelext_interfaces(self):
|
|
515
|
+
async with self.getTestCore() as core:
|
|
516
|
+
|
|
517
|
+
await core.callStorm('''
|
|
518
|
+
$forminfo = ({"interfaces": ["test:interface"]})
|
|
519
|
+
$lib.model.ext.addForm(_test:iface, str, ({}), $forminfo)
|
|
520
|
+
$lib.model.ext.addFormProp(_test:iface, tick, (time, ({})), ({}))
|
|
521
|
+
''')
|
|
522
|
+
|
|
523
|
+
self.nn(core.model.form('_test:iface'))
|
|
524
|
+
self.nn(core.model.prop('_test:iface:flow'))
|
|
525
|
+
self.nn(core.model.prop('_test:iface:proc'))
|
|
526
|
+
self.nn(core.model.prop('_test:iface:tick'))
|
|
527
|
+
self.isin('_test:iface', core.model.formsbyiface['test:interface'])
|
|
528
|
+
self.isin('_test:iface', core.model.formsbyiface['inet:proto:request'])
|
|
529
|
+
self.isin('_test:iface', core.model.formsbyiface['it:host:activity'])
|
|
530
|
+
self.isin('_test:iface:flow', core.model.ifaceprops['inet:proto:request:flow'])
|
|
531
|
+
self.isin('_test:iface:proc', core.model.ifaceprops['test:interface:proc'])
|
|
532
|
+
self.isin('_test:iface:proc', core.model.ifaceprops['inet:proto:request:proc'])
|
|
533
|
+
self.isin('_test:iface:proc', core.model.ifaceprops['it:host:activity:proc'])
|
|
534
|
+
|
|
535
|
+
q = '$lib.model.ext.delForm(_test:iface)'
|
|
536
|
+
with self.raises(s_exc.CantDelForm) as exc:
|
|
537
|
+
await core.callStorm(q)
|
|
538
|
+
self.eq('Form has extended properties: tick', exc.exception.get('mesg'))
|
|
539
|
+
|
|
540
|
+
await core.callStorm('''
|
|
541
|
+
$lib.model.ext.delFormProp(_test:iface, tick)
|
|
542
|
+
$lib.model.ext.delForm(_test:iface)
|
|
543
|
+
''')
|
|
544
|
+
|
|
545
|
+
self.none(core.model.form('_test:iface'))
|
|
546
|
+
self.none(core.model.prop('_test:iface:flow'))
|
|
547
|
+
self.none(core.model.prop('_test:iface:proc'))
|
|
548
|
+
self.none(core.model.prop('_test:iface:tick'))
|
|
549
|
+
self.notin('_test:iface', core.model.formsbyiface['test:interface'])
|
|
550
|
+
self.notin('_test:iface', core.model.formsbyiface['inet:proto:request'])
|
|
551
|
+
self.notin('_test:iface', core.model.formsbyiface['it:host:activity'])
|
|
552
|
+
self.notin('_test:iface:flow', core.model.ifaceprops['inet:proto:request:flow'])
|
|
553
|
+
self.notin('_test:iface:proc', core.model.ifaceprops['test:interface:proc'])
|
|
554
|
+
self.notin('_test:iface:proc', core.model.ifaceprops['inet:proto:request:proc'])
|
|
555
|
+
self.notin('_test:iface:proc', core.model.ifaceprops['it:host:activity:proc'])
|
|
556
|
+
|
|
557
|
+
await core.stormlist('''
|
|
558
|
+
$forminfo = ({"interfaces": ["newp"]})
|
|
559
|
+
$lib.model.ext.addForm(_test:iface, str, ({}), $forminfo)
|
|
560
|
+
''')
|
|
561
|
+
self.nn(core.model.form('_test:iface'))
|
|
562
|
+
|
|
563
|
+
await core.callStorm('$lib.model.ext.delForm(_test:iface)')
|
|
564
|
+
self.none(core.model.form('_test:iface'))
|
|
@@ -84,8 +84,8 @@ class StormWhoisTest(s_test.SynTest):
|
|
|
84
84
|
'''
|
|
85
85
|
opts = {'vars': {'props': props}}
|
|
86
86
|
mesgs = await core.stormlist(stormcmd, opts=opts)
|
|
87
|
-
|
|
88
|
-
self.
|
|
87
|
+
self.stormIsInWarn('$lib.inet.whois.guid() is deprecated', mesgs)
|
|
88
|
+
self.stormIsInWarn('Insufficient guid vals identified, using random guid:', mesgs)
|
|
89
89
|
self.len(1, await core.nodes(f'inet:whois:ipquery:fqdn={props["fqdn"]}'))
|
|
90
90
|
|
|
91
91
|
props = {
|
|
@@ -97,8 +97,8 @@ class StormWhoisTest(s_test.SynTest):
|
|
|
97
97
|
'''
|
|
98
98
|
opts = {'vars': {'props': props}}
|
|
99
99
|
mesgs = await core.stormlist(stormcmd, opts=opts)
|
|
100
|
-
|
|
101
|
-
self.
|
|
100
|
+
self.stormIsInWarn('$lib.inet.whois.guid() is deprecated', mesgs)
|
|
101
|
+
self.stormIsInWarn('Insufficient guid vals identified, using random guid:', mesgs)
|
|
102
102
|
self.len(1, await core.nodes(f'inet:whois:ipcontact:asn={props["asn"]}'))
|
|
103
103
|
|
|
104
104
|
# Failure cases
|
|
@@ -1675,8 +1675,12 @@ class InfotechModelTest(s_t_utils.SynTest):
|
|
|
1675
1675
|
self.eq(1640995200000, nodes[0].get('updated'))
|
|
1676
1676
|
self.nn(nodes[0].get('author'))
|
|
1677
1677
|
|
|
1678
|
-
nodes = await core.nodes('[ it:app:snort:hit=$hit
|
|
1678
|
+
nodes = await core.nodes('''[ it:app:snort:hit=$hit
|
|
1679
|
+
:rule=$rule :flow=$flow :src="tcp://[::ffff:0102:0304]:0"
|
|
1680
|
+
:dst="tcp://[::ffff:0505:0505]:80" :time=2015 :sensor=$host
|
|
1681
|
+
:version=1.2.3 :dropped=true ]''', opts=opts)
|
|
1679
1682
|
self.len(1, nodes)
|
|
1683
|
+
self.true(nodes[0].get('dropped'))
|
|
1680
1684
|
self.eq(rule, nodes[0].get('rule'))
|
|
1681
1685
|
self.eq(flow, nodes[0].get('flow'))
|
|
1682
1686
|
self.eq(host, nodes[0].get('sensor'))
|
synapse/tests/test_model_orgs.py
CHANGED
|
@@ -640,6 +640,7 @@ class OuModelTest(s_t_utils.SynTest):
|
|
|
640
640
|
|
|
641
641
|
nodes = await core.nodes('''[ ou:requirement=50b757fafe4a839ec499023ebcffe7c0
|
|
642
642
|
:name="acquire pizza toppings"
|
|
643
|
+
:type=foo.bar
|
|
643
644
|
:text="The team must acquire ANSI standard pizza toppings."
|
|
644
645
|
:goal={[ ou:goal=* :name=pizza ]}
|
|
645
646
|
:issuer={[ ps:contact=* :name=visi ]}
|
|
@@ -657,6 +658,7 @@ class OuModelTest(s_t_utils.SynTest):
|
|
|
657
658
|
self.eq('The team must acquire ANSI standard pizza toppings.', nodes[0].get('text'))
|
|
658
659
|
self.eq(1, nodes[0].get('deps:min'))
|
|
659
660
|
self.eq(50, nodes[0].get('priority'))
|
|
661
|
+
self.eq('foo.bar.', nodes[0].get('type'))
|
|
660
662
|
self.eq(True, nodes[0].get('optional'))
|
|
661
663
|
self.eq(1328140800000, nodes[0].get('issued'))
|
|
662
664
|
self.eq((1672531200000, 9223372036854775807), nodes[0].get('period'))
|
|
@@ -665,6 +667,39 @@ class OuModelTest(s_t_utils.SynTest):
|
|
|
665
667
|
self.len(1, await core.nodes('ou:requirement=50b757fafe4a839ec499023ebcffe7c0 -> ou:goal +:name=pizza'))
|
|
666
668
|
self.len(1, await core.nodes('ou:requirement=50b757fafe4a839ec499023ebcffe7c0 :issuer -> ps:contact +:name=visi'))
|
|
667
669
|
self.len(1, await core.nodes('ou:requirement=50b757fafe4a839ec499023ebcffe7c0 :assignee -> ps:contact +:orgname=ledos'))
|
|
670
|
+
self.len(1, await core.nodes('ou:requirement=50b757fafe4a839ec499023ebcffe7c0 -> ou:requirement:type:taxonomy'))
|
|
671
|
+
|
|
672
|
+
nodes = await core.nodes('''
|
|
673
|
+
[ ou:asset=*
|
|
674
|
+
:id=V-31337
|
|
675
|
+
:name="visi laptop"
|
|
676
|
+
:type=host.laptop
|
|
677
|
+
:priority=highest
|
|
678
|
+
:priority:confidentiality=highest
|
|
679
|
+
:priority:integrity=highest
|
|
680
|
+
:priority:availability=highest
|
|
681
|
+
:node = (it:host, *)
|
|
682
|
+
:period=(2016, ?)
|
|
683
|
+
:status=deployed
|
|
684
|
+
:org={[ ou:org=* :name=vertex ]}
|
|
685
|
+
:owner={[ ps:contact=* :name=foo ]}
|
|
686
|
+
:operator={[ ps:contact=* :name=bar ]}
|
|
687
|
+
]''')
|
|
688
|
+
self.len(1, nodes)
|
|
689
|
+
self.eq((1451606400000, 9223372036854775807), nodes[0].get('period'))
|
|
690
|
+
self.eq('visi laptop', nodes[0].get('name'))
|
|
691
|
+
self.eq('host.laptop.', nodes[0].get('type'))
|
|
692
|
+
self.eq('deployed.', nodes[0].get('status'))
|
|
693
|
+
self.eq(50, nodes[0].get('priority'))
|
|
694
|
+
self.eq(50, nodes[0].get('priority:confidentiality'))
|
|
695
|
+
self.eq(50, nodes[0].get('priority:integrity'))
|
|
696
|
+
self.eq(50, nodes[0].get('priority:availability'))
|
|
697
|
+
|
|
698
|
+
self.len(1, await core.nodes('ou:asset -> ou:asset:type:taxonomy'))
|
|
699
|
+
self.len(1, await core.nodes('ou:asset :node -> it:host'))
|
|
700
|
+
self.len(1, await core.nodes('ou:asset :org -> ou:org +:name=vertex'))
|
|
701
|
+
self.len(1, await core.nodes('ou:asset :owner -> ps:contact +:name=foo '))
|
|
702
|
+
self.len(1, await core.nodes('ou:asset :operator -> ps:contact +:name=bar '))
|
|
668
703
|
|
|
669
704
|
async def test_ou_code_prefixes(self):
|
|
670
705
|
guid0 = s_common.guid()
|
|
@@ -832,6 +867,7 @@ class OuModelTest(s_t_utils.SynTest):
|
|
|
832
867
|
:orgfqdn = wootwoot.com
|
|
833
868
|
:currency = USD
|
|
834
869
|
:costs = 200
|
|
870
|
+
:budget = 300
|
|
835
871
|
:revenue = 500
|
|
836
872
|
:profit = 300
|
|
837
873
|
:valuation = 1000000000
|
|
@@ -850,6 +886,7 @@ class OuModelTest(s_t_utils.SynTest):
|
|
|
850
886
|
self.eq(nodes[0].get('orgfqdn'), 'wootwoot.com')
|
|
851
887
|
self.eq(nodes[0].get('currency'), 'usd')
|
|
852
888
|
self.eq(nodes[0].get('costs'), '200')
|
|
889
|
+
self.eq(nodes[0].get('budget'), '300')
|
|
853
890
|
self.eq(nodes[0].get('revenue'), '500')
|
|
854
891
|
self.eq(nodes[0].get('profit'), '300')
|
|
855
892
|
self.eq(nodes[0].get('valuation'), '1000000000')
|
synapse/tests/test_model_risk.py
CHANGED
|
@@ -542,6 +542,7 @@ class RiskModelTest(s_t_utils.SynTest):
|
|
|
542
542
|
risk:mitigation=*
|
|
543
543
|
:vuln=*
|
|
544
544
|
:name=" FooBar "
|
|
545
|
+
:type=foo.bar
|
|
545
546
|
:desc=BazFaz
|
|
546
547
|
:hardware=*
|
|
547
548
|
:software=*
|
|
@@ -552,11 +553,13 @@ class RiskModelTest(s_t_utils.SynTest):
|
|
|
552
553
|
self.eq('foobar', nodes[0].props['name'])
|
|
553
554
|
self.eq('BazFaz', nodes[0].props['desc'])
|
|
554
555
|
self.eq('vertex', nodes[0].get('reporter:name'))
|
|
556
|
+
self.eq('foo.bar.', nodes[0].get('type'))
|
|
555
557
|
self.nn(nodes[0].get('reporter'))
|
|
556
558
|
self.len(1, await core.nodes('risk:mitigation -> risk:vuln'))
|
|
557
559
|
self.len(1, await core.nodes('risk:mitigation -> it:prod:softver'))
|
|
558
560
|
self.len(1, await core.nodes('risk:mitigation -> it:prod:hardware'))
|
|
559
561
|
self.len(1, await core.nodes('risk:mitigation -> it:mitre:attack:mitigation'))
|
|
562
|
+
self.len(1, await core.nodes('risk:mitigation -> risk:mitigation:type:taxonomy'))
|
|
560
563
|
|
|
561
564
|
async def test_model_risk_tool_software(self):
|
|
562
565
|
|
synapse/tests/utils.py
CHANGED
|
@@ -201,6 +201,32 @@ class LibTst(s_stormtypes.Lib):
|
|
|
201
201
|
ret = f'A {valu} beep which {bar} the {faz}!'
|
|
202
202
|
return ret
|
|
203
203
|
|
|
204
|
+
class LibDepr(s_stormtypes.Lib):
|
|
205
|
+
'''
|
|
206
|
+
Deprecate me!
|
|
207
|
+
'''
|
|
208
|
+
_storm_locals = (
|
|
209
|
+
{'name': 'boop',
|
|
210
|
+
'desc': '''
|
|
211
|
+
An example storm function that's not deprecated on its own, but the entire library is.
|
|
212
|
+
''',
|
|
213
|
+
'type': {'type': 'function', '_funcname': 'boop',
|
|
214
|
+
'args': (
|
|
215
|
+
{'name': 'valu', 'type': 'str', 'desc': 'What to boop.', },
|
|
216
|
+
),
|
|
217
|
+
'returns': {'type': 'str', 'desc': 'The booped.', }}},
|
|
218
|
+
)
|
|
219
|
+
_storm_lib_path = ('depr',)
|
|
220
|
+
_storm_lib_deprecation = {'eolvers': 'v3.0.0'}
|
|
221
|
+
|
|
222
|
+
def addLibFuncs(self): # pragma: no cover
|
|
223
|
+
self.locls.update({
|
|
224
|
+
'boop': self.boop,
|
|
225
|
+
})
|
|
226
|
+
|
|
227
|
+
async def boop(self, valu): # pragma: no cover
|
|
228
|
+
return f'You have been booped, {valu}!'
|
|
229
|
+
|
|
204
230
|
class TestType(s_types.Type):
|
|
205
231
|
|
|
206
232
|
stortype = s_layer.STOR_TYPE_UTF8
|
|
@@ -5,7 +5,7 @@ synapse/common.py,sha256=JRGiA6FCkCZP2pBc3s_H7MsQGwc9jU_vkJFQP3XpVLs,36523
|
|
|
5
5
|
synapse/cortex.py,sha256=DHJegMCR9oUfMLx3Wl_bvj_w1G1iJISAM9K5aCpvqA0,254581
|
|
6
6
|
synapse/cryotank.py,sha256=oTbAOKq-q8WqAkYmY46Mc8hy85W3ZcQMxmP2EJDFyZ0,12124
|
|
7
7
|
synapse/daemon.py,sha256=-xy6EnmD5CodWQs_S-v7apKILECmn5EEYBpEPG-MDns,16986
|
|
8
|
-
synapse/datamodel.py,sha256=
|
|
8
|
+
synapse/datamodel.py,sha256=BKefwDjxt8OgznnV1DLCP8gb2vuDZUPXeITo_AhoWHQ,38013
|
|
9
9
|
synapse/exc.py,sha256=0D9kI8RCDBdaMEtMW6XDPuknJAikavwFskbYpq7Pr_Y,9056
|
|
10
10
|
synapse/glob.py,sha256=tb6NPtK6Jp6YES9sB1AQi26HP6f-BcEiHrZz2yEyZ90,3210
|
|
11
11
|
synapse/mindmeld.py,sha256=TiijGH7wX2zdXIFSBUlN40CPOvYaFlw6Wxi66XZuB_M,26
|
|
@@ -87,13 +87,13 @@ synapse/data/jsonschemas/raw.githubusercontent.com/oasis-open/cti-stix2-json-sch
|
|
|
87
87
|
synapse/lib/__init__.py,sha256=qLS7nt8-Iot8jnD2Xss_6wZi5lJoyv2rqxF9kkektT0,129
|
|
88
88
|
synapse/lib/agenda.py,sha256=ddr6FrbDY5YslJS3vdBqUUcoh32XwiEj1OkomFg-NAg,33107
|
|
89
89
|
synapse/lib/aha.py,sha256=vUFzh_s4VYSYXb73C3GYVcQRIaQow_0PSrSYOvz5wis,50308
|
|
90
|
-
synapse/lib/ast.py,sha256=
|
|
90
|
+
synapse/lib/ast.py,sha256=rhX9iHyrt1wENYg1ZBqW8wSKuQRRFhdzXrsi-rOH8RI,155045
|
|
91
91
|
synapse/lib/auth.py,sha256=MfSyR7RWWwDuSv5zQW_-CtYLJfnIuCRTEcyfa1vnxvw,52313
|
|
92
|
-
synapse/lib/autodoc.py,sha256=
|
|
92
|
+
synapse/lib/autodoc.py,sha256=eTwyKM0msJFmLmZR1OxKFVAb8wcMgJ2q72Ccphsi-u8,23226
|
|
93
93
|
synapse/lib/base.py,sha256=FfS6k30ZcS1CVfHPa5LNKog1f48rJ0xE14PI89vW7tM,23634
|
|
94
94
|
synapse/lib/boss.py,sha256=rYu4jkHJ3Y5GLX23Hlrwe9H17LF27LZ0BkK_A_9Aqh0,2056
|
|
95
95
|
synapse/lib/cache.py,sha256=N8BoNFQXOaYQU33LLYQcVkdV6IYjSNaUoaKue55y7H0,6275
|
|
96
|
-
synapse/lib/cell.py,sha256=
|
|
96
|
+
synapse/lib/cell.py,sha256=ny_lKV_proJ3mErmHaeAk29sCEyB9VgzSibR7nqOD0A,176400
|
|
97
97
|
synapse/lib/certdir.py,sha256=laGLxgx0gVxXvoaLKKemBQv71OZr9mDaqlAatdESV1A,56176
|
|
98
98
|
synapse/lib/chop.py,sha256=F0RRLlJ6NlpLW7sBWPNZV9Xw4w6HVbQbxPZPE6VhwVQ,9404
|
|
99
99
|
synapse/lib/cli.py,sha256=rwaO4SbJIzOhwxB9B7NHXpyegQeRsUQ1gULVwgnNCfg,14580
|
|
@@ -148,8 +148,8 @@ synapse/lib/storm_format.py,sha256=3C7SAzxOcc7a3JUuFeVRK46C7N1En7XMy7RylSeAYoo,4
|
|
|
148
148
|
synapse/lib/stormctrl.py,sha256=XvyZ6M0Ew8sXsjGvRTWbXh0MjktZrGi_zQ9kNa7AWTE,285
|
|
149
149
|
synapse/lib/stormhttp.py,sha256=tw0LuO0UfxZT50sfF_V9hemudv5yZc2M9nFMkGrRHRw,28884
|
|
150
150
|
synapse/lib/stormsvc.py,sha256=dKREBhzYAncOXBbI-FYLRy9VusGIbRyF0TaDDz7mMXw,7581
|
|
151
|
-
synapse/lib/stormtypes.py,sha256=
|
|
152
|
-
synapse/lib/stormwhois.py,sha256=
|
|
151
|
+
synapse/lib/stormtypes.py,sha256=mH5W3jNOyor4ke8DJsckZDYxnhJjVwnwuHH3eXT3GZ0,387187
|
|
152
|
+
synapse/lib/stormwhois.py,sha256=w7N2oCyMljNvi_sRt_bZb5BJwWwYkVGcRd7H_0oHY8Q,2554
|
|
153
153
|
synapse/lib/structlog.py,sha256=qiuD7TTdwCyYEDF2f-88G2iX54SuB-lJ1pqlYokL1r8,1303
|
|
154
154
|
synapse/lib/task.py,sha256=krDjQvNh0EpAs1PILK8CJJa9DMeM0depI0K8Eimp010,5733
|
|
155
155
|
synapse/lib/thishost.py,sha256=b4s3X2tsUPVtECBmxSkvtMix_C7jvgAOQXS5Mq-Nka4,840
|
|
@@ -159,7 +159,7 @@ synapse/lib/time.py,sha256=FKTYwpdvpuAj8p8sSodRjOxoA7Vu67CIbbXz55gtghk,9231
|
|
|
159
159
|
synapse/lib/trigger.py,sha256=mnfkoBHB88JfqPoxb5oflvAaBKZpNvYdxP247YS53fE,20697
|
|
160
160
|
synapse/lib/types.py,sha256=er9Jj4Mb3qh8YY4mUukyM7C164eIjO_fJeZvVJmSHFE,69500
|
|
161
161
|
synapse/lib/urlhelp.py,sha256=j-DvWGi-xH0TcO0NbCuwG7guUuiV8wxIxfMyJOzDygo,2523
|
|
162
|
-
synapse/lib/version.py,sha256=
|
|
162
|
+
synapse/lib/version.py,sha256=AZLXVeHHFZiHCESHHWwzzEX6h-ArJTCYvoXK0-OP_9U,7162
|
|
163
163
|
synapse/lib/view.py,sha256=bP1lMl8Wm0yaMIlc4cfwobm5ojNzMsWguPFnPUkKhoM,60567
|
|
164
164
|
synapse/lib/crypto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
165
165
|
synapse/lib/crypto/coin.py,sha256=_dhlkzIrHT8BvHdJOWK7PDThz3sK3dDRnWAUqjRpZJc,4910
|
|
@@ -187,7 +187,7 @@ synapse/lib/stormlib/env.py,sha256=0e5w92jPl_lpVJkyOd8Ia8Lrl6bysXZZIGAT2LsxMW8,1
|
|
|
187
187
|
synapse/lib/stormlib/ethereum.py,sha256=hsgQD4tQpS7mS9lrbghxZF5gEwop4OeeN2Tf3CfncuY,1219
|
|
188
188
|
synapse/lib/stormlib/gen.py,sha256=owyc9N1Cg8LXoORVx16g7r0Sp-xz1Mmq5_mGtvtZz1g,30911
|
|
189
189
|
synapse/lib/stormlib/gis.py,sha256=LUsFcPn0g3Y23lMDpKveegT2SwoOSAwkgmifpXpm23c,1629
|
|
190
|
-
synapse/lib/stormlib/graph.py,sha256=
|
|
190
|
+
synapse/lib/stormlib/graph.py,sha256=XvL6SV2khN3WktekVvHECIh7e0B5kjTg6LMdIYbQPcg,9943
|
|
191
191
|
synapse/lib/stormlib/hashes.py,sha256=h0gtVLiC70FZboJH8gPSR9G53i8-T6WNCFjVfXAH4ig,4751
|
|
192
192
|
synapse/lib/stormlib/hex.py,sha256=nB4nByxkiFs6Kt7V8WGXD0AnWvCtHEN5LKOj4swEsXQ,5849
|
|
193
193
|
synapse/lib/stormlib/imap.py,sha256=ScF-b5JxNkgJcBpYQeewKSmJXTm5I9r7q367Dd2Edis,12733
|
|
@@ -238,16 +238,16 @@ synapse/models/files.py,sha256=tGb7sCb06Ehg-LmjFgA3TtJPzNHUUXcMCv-KgPgB4iU,33512
|
|
|
238
238
|
synapse/models/geopol.py,sha256=QbSw5hhXVeOhGcB6oP1v4TPsYPbeK_3tQIYs_dLt_eU,11256
|
|
239
239
|
synapse/models/geospace.py,sha256=MY1vPyZXBCQ4GJPj0RCvx0WGaYy0Rue03WfKzMCteko,19345
|
|
240
240
|
synapse/models/inet.py,sha256=4iIbIW2yO5wuwR65b4ORjgPUNpviNT_XeAEgJv2Cdjg,168035
|
|
241
|
-
synapse/models/infotech.py,sha256=
|
|
241
|
+
synapse/models/infotech.py,sha256=0KeNfp23I3626whQpoK61YWWsdnfUhzhT_kyKxrOT9E,147609
|
|
242
242
|
synapse/models/language.py,sha256=hBVVIf5kc_FSIV7HZhWnberoc9ssxuqeff4fqC9iz4o,3640
|
|
243
243
|
synapse/models/material.py,sha256=d-nonZKyJpHc32ebghtkm5tSifwVFN_ctx2kb8N4NqI,3214
|
|
244
244
|
synapse/models/math.py,sha256=5zDLSwGbOcWI6T5-KspPL20sR8Bcs59pnRK2nEELzss,1775
|
|
245
245
|
synapse/models/media.py,sha256=uIsayKqdDM36eGyrJwz2UqOa_QQ9MpMJ2uHdgGYDLa4,3605
|
|
246
|
-
synapse/models/orgs.py,sha256=
|
|
246
|
+
synapse/models/orgs.py,sha256=PWJfncbMueWcPzGPOUeyogPmpj-tUxz0DMje1nuYV_g,66771
|
|
247
247
|
synapse/models/person.py,sha256=-YJh_KgEvL4a0ArdBX1xirMQy_8YZGyaA04Mq7Hg_VQ,27193
|
|
248
248
|
synapse/models/planning.py,sha256=vmrY4d3WRxizrNU1YBe36NGZTuuu4lhGS8KI5lCZ5yQ,7302
|
|
249
249
|
synapse/models/proj.py,sha256=eYY2bY7H8HJGvmuVQOrn4rQQWZQ_7noKtjLiq3QzgUU,9035
|
|
250
|
-
synapse/models/risk.py,sha256=
|
|
250
|
+
synapse/models/risk.py,sha256=xOjRe0Rp-2uKRjpK8zrSaZQOzIrpj9KfS-4yQVCC35g,52570
|
|
251
251
|
synapse/models/science.py,sha256=oSkKbjmVncYcVkVgx8rhM08XtcsgDgjf3mpunz5kL30,4329
|
|
252
252
|
synapse/models/syn.py,sha256=nE8zbZC6msILF4AR9h4S7t6hcXfUxgf4ZXaK0C15Lzk,12166
|
|
253
253
|
synapse/models/telco.py,sha256=1BdnFr6Cyb1ZPtekIXaoUuRjISfJnIerTklQUEk_MzE,15273
|
|
@@ -272,7 +272,7 @@ synapse/tests/test_cmds_boss.py,sha256=SdBwM2qJHFzzfrjWYiZOLBKeye8uru7KeJ3NU_YSk
|
|
|
272
272
|
synapse/tests/test_cmds_cortex.py,sha256=LWFz8HyuvsIGjtz2DqXYh-R-5QbiQWzLlQKqew7gabY,17157
|
|
273
273
|
synapse/tests/test_cmds_hive.py,sha256=aRH_Gh8oF_1BsfpmffyhDDNIqnTqsuF2cavdtGke1-0,5912
|
|
274
274
|
synapse/tests/test_common.py,sha256=2SAJ4M2iLdZuPPV-j16QVwE073VrikyW75cYTPRMjWI,16940
|
|
275
|
-
synapse/tests/test_cortex.py,sha256=
|
|
275
|
+
synapse/tests/test_cortex.py,sha256=J-pXrTWAMYlbna-oimYinbNVgMVT8UKLUrHELqbgsjs,351723
|
|
276
276
|
synapse/tests/test_cryotank.py,sha256=ms2VkL0aUskMi-LArTzRt8LUYw0z_y8nQfOOBDiCkvI,12027
|
|
277
277
|
synapse/tests/test_daemon.py,sha256=QqKELhm1HF0q_8Kbk0Uf9fnUg3K5nLQ7MocGIyuKKIw,7715
|
|
278
278
|
synapse/tests/test_data.py,sha256=f8L-q6kpMq8XPG3hq1jwlyaFRQEinSBf7ZlsRFeCuoM,196
|
|
@@ -282,9 +282,9 @@ synapse/tests/test_glob.py,sha256=cSNrtEKWLsZXRhsjxQjRjjMqdgqfpl05yT4S53dC0NU,24
|
|
|
282
282
|
synapse/tests/test_init.py,sha256=rHqYBVL_aFf1HO6zCF5akHVcHUP2g1kpJLRdTkV0yys,557
|
|
283
283
|
synapse/tests/test_lib_agenda.py,sha256=nVIaM7P9JOr5IK_NtvsSdVaY2WdMYoPRh0B7Fl_vCWs,44102
|
|
284
284
|
synapse/tests/test_lib_aha.py,sha256=nRHs14-LtnsSRi-C7nRu24g3ENN-R3S-0Uk8Oq2LVy4,61945
|
|
285
|
-
synapse/tests/test_lib_ast.py,sha256=
|
|
285
|
+
synapse/tests/test_lib_ast.py,sha256=il-g_TeEkfTSNbw70Ep9aWmuu9jMAesHceRz6sKekFw,180194
|
|
286
286
|
synapse/tests/test_lib_auth.py,sha256=NnRMiGfVm4SQmDEBTSs1aJ1g7TKmFs3Vi8udOKJ3GaM,37815
|
|
287
|
-
synapse/tests/test_lib_autodoc.py,sha256
|
|
287
|
+
synapse/tests/test_lib_autodoc.py,sha256=H2XO2_d8FmsHUd-cn7M-LjTX-078xLhMiOGiGGk5Oj0,8381
|
|
288
288
|
synapse/tests/test_lib_base.py,sha256=yhGOfA-OgZrdhISTXwSl6l6YGqN5nqO3pcDes6oICPg,14550
|
|
289
289
|
synapse/tests/test_lib_boss.py,sha256=gZEuJnMO99Fu9gQ7Ct0g67umBW5XFCs8vcwInB5qr14,1598
|
|
290
290
|
synapse/tests/test_lib_cache.py,sha256=oQgEBhm8pZFCEvMfcD3znTDQgl8Gv91fEOB-3eb2IIg,8594
|
|
@@ -332,7 +332,7 @@ synapse/tests/test_lib_slaboffs.py,sha256=FHQ8mGZ27dGqVwGk6q2UJ4gkPRZN22eIVzS8hM
|
|
|
332
332
|
synapse/tests/test_lib_slabseqn.py,sha256=74V6jU7DRTsy_hqUFDuT4C6dPlJ6ObNnjmI9qhbbyVc,5230
|
|
333
333
|
synapse/tests/test_lib_snap.py,sha256=OviJtj9N5LhBV-56TySkWvRly7f8VH9d-VBcNFLAtmg,27805
|
|
334
334
|
synapse/tests/test_lib_spooled.py,sha256=dC5hba4c0MehALt4qW-cokqJl-tZsIsmABCGMIclXNM,2776
|
|
335
|
-
synapse/tests/test_lib_storm.py,sha256=
|
|
335
|
+
synapse/tests/test_lib_storm.py,sha256=kDDL4SSv32KdzTRhX46RgavWZ8MiLAm10MI0htOldBU,222986
|
|
336
336
|
synapse/tests/test_lib_storm_format.py,sha256=tEZgQMmKAeG8FQZE5HUjOT7bnKawVTpNaVQh_3Wa630,277
|
|
337
337
|
synapse/tests/test_lib_stormhttp.py,sha256=ZS8iONsisWjEi2CXx9AttiQ9bOrPs9x4GCwXlJEB_u0,42592
|
|
338
338
|
synapse/tests/test_lib_stormlib_aha.py,sha256=2x3KQa64LN86wzSdJwAu3QFb5NNR3WNx1o9aD3N954o,8796
|
|
@@ -359,7 +359,7 @@ synapse/tests/test_lib_stormlib_log.py,sha256=pZwEgCou368-MzeDL5jMEARRyswVNKKJ-V
|
|
|
359
359
|
synapse/tests/test_lib_stormlib_macro.py,sha256=IfGRX6ZAJr_RJGNPq2BKTEPByY90pnYDYdtHp8C1JbQ,18508
|
|
360
360
|
synapse/tests/test_lib_stormlib_mime.py,sha256=ozBJ70XxdrErOmycStWdh1xkBHVnM0BTPHvaP4faC0g,1510
|
|
361
361
|
synapse/tests/test_lib_stormlib_model.py,sha256=ylsrjecdl3IxLojcmVsMmOU7i0bdTKBTsmzX20eCZg4,44570
|
|
362
|
-
synapse/tests/test_lib_stormlib_modelext.py,sha256=
|
|
362
|
+
synapse/tests/test_lib_stormlib_modelext.py,sha256=Dxw-pz9eYwL1bFofi8ijCbnTbuLizFxMkGfEWN51Lvw,26168
|
|
363
363
|
synapse/tests/test_lib_stormlib_oauth.py,sha256=rb6ZWyLrWwcDT32VfjdQUg3AurwlhzbQv-kXIfPeRsQ,28858
|
|
364
364
|
synapse/tests/test_lib_stormlib_pack.py,sha256=YSb4dErPM3CeU0piqvhIQF_F1m3YjApo3nA14ewPWf0,1563
|
|
365
365
|
synapse/tests/test_lib_stormlib_random.py,sha256=8bncEY6Unwry7h29CFqIUaAk9lkiNy7Qq9UNINeqpXE,4656
|
|
@@ -375,7 +375,7 @@ synapse/tests/test_lib_stormlib_xml.py,sha256=dWa9NkXXE28VZ3bTmMDbddo7VpUKsSEHTS
|
|
|
375
375
|
synapse/tests/test_lib_stormlib_yaml.py,sha256=egTVXk8wW31V2msF__9WxP3THcqfysG1mYhc7hQG8rw,1358
|
|
376
376
|
synapse/tests/test_lib_stormsvc.py,sha256=J5-bmS_M3nkmJtmgUjyh7_vSwEzw_TxcMwe6q5ah1e8,43887
|
|
377
377
|
synapse/tests/test_lib_stormtypes.py,sha256=NbWGXY-talxf6j-MRTFU4foj0p87ClCaTmA1GeBdfVs,309453
|
|
378
|
-
synapse/tests/test_lib_stormwhois.py,sha256=
|
|
378
|
+
synapse/tests/test_lib_stormwhois.py,sha256=AWMUYEgZ5yqvDfPC_rM4evmhgfOA_Fv5aoTjmKmN1_0,4818
|
|
379
379
|
synapse/tests/test_lib_structlog.py,sha256=DGfzrfc2nybRq5RjwiUXd1v4sC5zl8d46RHgTmFD0iA,3964
|
|
380
380
|
synapse/tests/test_lib_task.py,sha256=Zby9Evlg_mBwE3_aF7p_5PIMhWp2Er7Y-ye4Y-3L5RQ,1646
|
|
381
381
|
synapse/tests/test_lib_thishost.py,sha256=O6QCENStRuMjWS7qV9rqwW3bSZwzEUn9NcttKnDqXw8,366
|
|
@@ -402,16 +402,16 @@ synapse/tests/test_model_gov_cn.py,sha256=FnfKNM_wnvmScLm4cYFSQXZ21kVaTPPDusiCD7
|
|
|
402
402
|
synapse/tests/test_model_gov_intl.py,sha256=v5BZhQnoMurzZYhM9hkzALzQzp92KidweYxVlghXDws,770
|
|
403
403
|
synapse/tests/test_model_gov_us.py,sha256=kvZ9DudBrbKtZmqGm8X-b_IOw4oJ7XZMnvTgiDkzsrY,1525
|
|
404
404
|
synapse/tests/test_model_inet.py,sha256=vJs4OjwY9Bx3H9YfxuGse-hWQ_Cd7sSv17S_7fK4NUU,150463
|
|
405
|
-
synapse/tests/test_model_infotech.py,sha256=
|
|
405
|
+
synapse/tests/test_model_infotech.py,sha256=81vsV6SCEDLgQfppwnbZuThH0MGmGjaJekum5sXDJis,110804
|
|
406
406
|
synapse/tests/test_model_language.py,sha256=49stF1B8_EwWJB67Xa5VXCG563Zfbr6S85iKN9Iom48,3046
|
|
407
407
|
synapse/tests/test_model_material.py,sha256=M7ACDCuMtavm-xtwAIZa1M-bHVq5PCUedDfR-Ty9_F4,1975
|
|
408
408
|
synapse/tests/test_model_math.py,sha256=x-rHBfm-59ueZdHXXzSi53eshldvVURoJeLeexWTL2U,826
|
|
409
409
|
synapse/tests/test_model_media.py,sha256=RQVhYjOZ4rkNPBSzz05rle1M7F6-Yxw545s7k-YBwzc,2627
|
|
410
|
-
synapse/tests/test_model_orgs.py,sha256=
|
|
410
|
+
synapse/tests/test_model_orgs.py,sha256=mVQAsLPhTIy_OUpuQlpjfzHIbjV6mn6VD_OgMOUvba0,42239
|
|
411
411
|
synapse/tests/test_model_person.py,sha256=6Zj_dnOyY4axLvl7VKCEYGtwVlnEYqKSg5kOi3Brp9s,17322
|
|
412
412
|
synapse/tests/test_model_planning.py,sha256=U2kkE0uBO6CqtTfy7wlnhEIu_NFdSri4I_I5b-mRjBE,5615
|
|
413
413
|
synapse/tests/test_model_proj.py,sha256=bBPNzvcbd1jZReeJ7X-AQdH7F7ZMugZVgaCTvS-QNFM,22849
|
|
414
|
-
synapse/tests/test_model_risk.py,sha256=
|
|
414
|
+
synapse/tests/test_model_risk.py,sha256=dym9_hxZYhCoftMjMDJSPuvJIyYbqN207MD4dVct-SU,28161
|
|
415
415
|
synapse/tests/test_model_science.py,sha256=2T9VxdzpltDufgjkUB95q97TQP9AxH2-T_sBbHfPDRk,2450
|
|
416
416
|
synapse/tests/test_model_syn.py,sha256=5Smzakimp7BSujeJbwXdpmOHsbCLJgFXM4EIDG96ObM,21481
|
|
417
417
|
synapse/tests/test_model_telco.py,sha256=5ToiRhCX7faiDx4lDMV6b7E9WteN3PcBlznYF6GA2co,13166
|
|
@@ -451,7 +451,7 @@ synapse/tests/test_tools_storm.py,sha256=QkyPX4HS67n1q4LbmsCGF9yUSyMLHK4BjNRX3JC
|
|
|
451
451
|
synapse/tests/test_utils.py,sha256=sI-uDhUpkVQHSKHa2-czmWNvyXL2QTsCojtPAV2jueI,8688
|
|
452
452
|
synapse/tests/test_utils_getrefs.py,sha256=bBV7yZ9tnOXmjqpsU1YKV5pw0behoKpzpwHJDxLjmLs,2304
|
|
453
453
|
synapse/tests/test_utils_stormcov.py,sha256=H9p1vFH8kNE6qMLrGzSV0eH7KOgdZFh7QuarFe47FtU,6149
|
|
454
|
-
synapse/tests/utils.py,sha256=
|
|
454
|
+
synapse/tests/utils.py,sha256=7BENTJiU04JpatJjVBjs8O4wXJn62L2MCS55vK98GwM,77934
|
|
455
455
|
synapse/tests/files/TestUtilsGetrefs.test_basics.yaml,sha256=Ch8cEGFYfDUCZTEvzAqW5Ir79OnYb49pq4i9OJ7K9T0,8257
|
|
456
456
|
synapse/tests/files/__init__.py,sha256=iqkaqGCD7UedfSwVc6hoQDu2UGSZOkybUCZeFRHAFgQ,1786
|
|
457
457
|
synapse/tests/files/cpedata.json,sha256=e_wajnxn4ZClQ3-hwlOxK-2MWzLQwrqgtWVUV5dUVF4,13799445
|
|
@@ -600,8 +600,8 @@ synapse/vendor/xrpl/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
|
|
|
600
600
|
synapse/vendor/xrpl/tests/test_codec.py,sha256=Zwq6A5uZUK_FWDL3BA932c5b-rL3hnC6efobWHSLC4o,6651
|
|
601
601
|
synapse/vendor/xrpl/tests/test_main.py,sha256=kZQwWk7I6HrP-PMvLdsUUN4POvWD9I-iXDHOwdeF090,4299
|
|
602
602
|
synapse/vendor/xrpl/tests/test_main_test_cases.py,sha256=vTlUM4hJD2Hd2wCIdd9rfsvcMZZZQmNHWdCTTFeGz2Y,4221
|
|
603
|
-
synapse-2.
|
|
604
|
-
synapse-2.
|
|
605
|
-
synapse-2.
|
|
606
|
-
synapse-2.
|
|
607
|
-
synapse-2.
|
|
603
|
+
synapse-2.184.0.dist-info/LICENSE,sha256=xllut76FgcGL5zbIRvuRc7aezPbvlMUTWJPsVr2Sugg,11358
|
|
604
|
+
synapse-2.184.0.dist-info/METADATA,sha256=dywzlGY2aOJEpk2m9mtmQTMWIiSa4GkBVRkm5goDCHo,4860
|
|
605
|
+
synapse-2.184.0.dist-info/WHEEL,sha256=SrTdYlP5_vE84QjjtlalV7U4zA9dssr1tS8MY2C6kns,93
|
|
606
|
+
synapse-2.184.0.dist-info/top_level.txt,sha256=v_1YsqjmoSCzCKs7oIhzTNmWtSYoORiBMv1TJkOhx8A,8
|
|
607
|
+
synapse-2.184.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|