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 CHANGED
@@ -987,7 +987,17 @@ class Model:
987
987
  if form is None:
988
988
  return
989
989
 
990
- formprops = [p for p in form.props.values() if p.univ is None]
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.ifaces.keys():
1000
- self.formsbyiface[ifname].remove(formname)
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 (depr := locl.get('deprecated')) and not oneline:
628
- lines.extend(genDeprecationWarning(f'${loclname}', depr))
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']['default'] = default
3563
+ item['permissions'].setdefault('default', default)
3564
3564
 
3565
3565
  async def getTeleApi(self, link, mesg, path):
3566
3566
 
@@ -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, 183, 0)
226
+ version = (2, 184, 0)
227
227
  verstring = '.'.join([str(x) for x in version])
228
- commit = '68e4f3dd36f4ff9dd7818ea2c8180b086092148f'
228
+ commit = '05940dce070d26f83bb7e4070f1d44d051804e3b'
@@ -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.'}),
@@ -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]'
@@ -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)
@@ -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
- warn = [m[1]['mesg'] for m in mesgs if m[0] == 'warn']
88
- self.isin('Insufficient guid vals identified, using random guid:', warn[0])
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
- warn = [m[1]['mesg'] for m in mesgs if m[0] == 'warn']
101
- self.isin('Insufficient guid vals identified, using random guid:', warn[0])
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 :rule=$rule :flow=$flow :src="tcp://[::ffff:0102:0304]:0" :dst="tcp://[::ffff:0505:0505]:80" :time=2015 :sensor=$host :version=1.2.3 ]', opts=opts)
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'))
@@ -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')
@@ -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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: synapse
3
- Version: 2.183.0
3
+ Version: 2.184.0
4
4
  Summary: Synapse Intelligence Analysis Framework
5
5
  Author-email: The Vertex Project LLC <root@vertex.link>
6
6
  License: Apache License 2.0
@@ -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=Axyn6u0Crbo1_2F0CQeJNw9pBqUGPufupHyB_tFYB_0,36785
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=TDSYImz4BAuwQ8Fh4APKt6mkfr4Y-ET7t2NkKhDv-7s,154976
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=FW9M00ZX3kmGGzO7BQ9MVdVrbMxyC_f3OzFlCuxu0FA,22880
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=mOYGqcbD1RQEXDk2l36kWO48OYtSzumuDMp8EUMZKEk,176390
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=4BwCyUtYxMuEqp3tUraRibFWhItftWudPICmICQfmJo,387130
152
- synapse/lib/stormwhois.py,sha256=efG4s1_UOShY3YD8N2OLEa_ELOnzsfLaMEMfDCJYeLQ,2275
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=n3U-ECv-9Lwae9z0kcPVQT_TNXskSqJzf3dMBiRhj-I,7162
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=00gFB0boj2dYv9vMY8nfIOwb2mhr_DyXOYK6O2sUrj4,9012
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=k0KMSwYaAgQ_2BiF7RiHM3P-laTAeMrnsRxLm_r4WFw,147459
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=PKt-p3lLbVqrPTBQa0ka8wbUZlNqOI-FTz8ZcDRXX94,63341
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=fLgfSViGRLTrGWCT0nzA9GflfqOYE_zIiciuw7_MhRE,51551
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=Pw78vx3Xeqs4OZUKElK-MYCUPsWY-LUNDhWL7AhpzGU,352552
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=aS9WNuEh7rYndAMJnv_LwqXBRvNgu2iLOmvt6YtxUqw,178055
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=-MTRi1m3VCHqM90iUpQWN0x5BYu15DXKoy_YoUQsxxI,7281
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=wBFqu3Nla3SD4WKhztdpAMVp_47IGM34UozwhHkmCCU,221857
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=gmwmwbAeMS7bHLnVAddf__qg72LmEZ-uv9pT-DgT9Us,23338
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=Rd7yx07kZtEs385e_8aA-EIYh4CrYdn_bh7ikIobiDU,4782
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=W4O7CddWWi5zc5k8JSaABQNDMVVh5u0GGMNT_4Dp2D0,110691
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=6MY1c5IILWm5k3Ks-5bnFumxiS36mSPgu3NKgLtl1B4,40331
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=UGm4CLQxWuQRe62iLj6T_XcK48VV9Y8F761UiqTJ1ao,27979
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=9_JbJ1BtmwHvn-RWZf9wwQBvdFGi_ZGArcf7tLMrZwE,77117
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.183.0.dist-info/LICENSE,sha256=xllut76FgcGL5zbIRvuRc7aezPbvlMUTWJPsVr2Sugg,11358
604
- synapse-2.183.0.dist-info/METADATA,sha256=-P71izjuDTMfQKjakuvwy7xatQhqxBduvnT0CL0-Wiw,4860
605
- synapse-2.183.0.dist-info/WHEEL,sha256=0gYN5xNdqpdGsLVVyA9-Xf3Xnq-9PwlAwkekQ_z55rY,93
606
- synapse-2.183.0.dist-info/top_level.txt,sha256=v_1YsqjmoSCzCKs7oIhzTNmWtSYoORiBMv1TJkOhx8A,8
607
- synapse-2.183.0.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.1.0)
2
+ Generator: setuptools (75.2.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py311-none-any
5
5