synapse 2.178.0__py311-none-any.whl → 2.179.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.

Files changed (44) hide show
  1. synapse/cortex.py +162 -27
  2. synapse/datamodel.py +47 -1
  3. synapse/exc.py +1 -0
  4. synapse/lib/aha.py +2 -1
  5. synapse/lib/ast.py +26 -22
  6. synapse/lib/base.py +12 -3
  7. synapse/lib/cell.py +150 -11
  8. synapse/lib/coro.py +14 -0
  9. synapse/lib/drive.py +551 -0
  10. synapse/lib/schemas.py +39 -0
  11. synapse/lib/snap.py +17 -7
  12. synapse/lib/storm.py +3 -1
  13. synapse/lib/stormhttp.py +1 -0
  14. synapse/lib/stormlib/modelext.py +29 -3
  15. synapse/lib/stormlib/stix.py +40 -17
  16. synapse/lib/stormlib/vault.py +2 -2
  17. synapse/lib/stormtypes.py +1 -1
  18. synapse/lib/types.py +9 -0
  19. synapse/lib/version.py +2 -2
  20. synapse/lookup/pe.py +303 -38
  21. synapse/models/dns.py +24 -1
  22. synapse/models/geospace.py +4 -1
  23. synapse/models/infotech.py +26 -1
  24. synapse/tests/test_cortex.py +45 -1
  25. synapse/tests/test_lib_aha.py +17 -0
  26. synapse/tests/test_lib_cell.py +224 -0
  27. synapse/tests/test_lib_coro.py +12 -0
  28. synapse/tests/test_lib_stormhttp.py +40 -0
  29. synapse/tests/test_lib_stormlib_modelext.py +55 -3
  30. synapse/tests/test_lib_stormlib_stix.py +15 -0
  31. synapse/tests/test_lib_stormlib_vault.py +11 -1
  32. synapse/tests/test_lib_stormtypes.py +5 -0
  33. synapse/tests/test_lib_types.py +9 -0
  34. synapse/tests/test_model_dns.py +8 -0
  35. synapse/tests/test_model_geospace.py +3 -1
  36. synapse/tests/test_model_infotech.py +47 -0
  37. synapse/tests/test_model_syn.py +11 -0
  38. synapse/tests/test_utils_stormcov.py +1 -1
  39. synapse/tools/changelog.py +28 -0
  40. {synapse-2.178.0.dist-info → synapse-2.179.0.dist-info}/METADATA +1 -1
  41. {synapse-2.178.0.dist-info → synapse-2.179.0.dist-info}/RECORD +44 -43
  42. {synapse-2.178.0.dist-info → synapse-2.179.0.dist-info}/WHEEL +1 -1
  43. {synapse-2.178.0.dist-info → synapse-2.179.0.dist-info}/LICENSE +0 -0
  44. {synapse-2.178.0.dist-info → synapse-2.179.0.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,5 @@
1
1
  import synapse.exc as s_exc
2
+ import synapse.common as s_common
2
3
  import synapse.lib.grammar as s_grammar
3
4
 
4
5
  import synapse.lib.stormtypes as s_stormtypes
@@ -54,6 +55,8 @@ class LibModelExt(s_stormtypes.Lib):
54
55
  'args': (
55
56
  {'name': 'formname', 'type': 'str', 'desc': 'The form with the extended property.', },
56
57
  {'name': 'propname', 'type': 'str', 'desc': 'The extended property to remove.', },
58
+ {'name': 'force', 'type': 'boolean', 'default': False,
59
+ 'desc': 'Delete the property from all nodes before removing the definition.', },
57
60
  ),
58
61
  'returns': {'type': 'null', }}},
59
62
  {'name': 'delUnivProp',
@@ -61,12 +64,16 @@ class LibModelExt(s_stormtypes.Lib):
61
64
  'type': {'type': 'function', '_funcname': 'delUnivProp',
62
65
  'args': (
63
66
  {'name': 'propname', 'type': 'str', 'desc': 'Name of the universal property to remove.', },
67
+ {'name': 'force', 'type': 'boolean', 'default': False,
68
+ 'desc': 'Delete the property from all nodes before removing the definition.', },
64
69
  ),
65
70
  'returns': {'type': 'null', }}},
66
71
  {'name': 'delTagProp', 'desc': 'Remove an extended tag property definition from the model.',
67
72
  'type': {'type': 'function', '_funcname': 'delTagProp',
68
73
  'args': (
69
74
  {'name': 'propname', 'type': 'str', 'desc': 'Name of the tag property to remove.', },
75
+ {'name': 'force', 'type': 'boolean', 'default': False,
76
+ 'desc': 'Delete the tag property from all nodes before removing the definition.', },
70
77
  ),
71
78
  'returns': {'type': 'null', }}},
72
79
  {'name': 'getExtModel', 'desc': 'Get all extended model elements.',
@@ -163,20 +170,39 @@ class LibModelExt(s_stormtypes.Lib):
163
170
  s_stormtypes.confirm(('model', 'form', 'del', formname))
164
171
  await self.runt.snap.core.delForm(formname)
165
172
 
166
- async def delFormProp(self, formname, propname):
173
+ async def delFormProp(self, formname, propname, force=False):
167
174
  formname = await s_stormtypes.tostr(formname)
168
175
  propname = await s_stormtypes.tostr(propname)
176
+ force = await s_stormtypes.tobool(force)
169
177
  s_stormtypes.confirm(('model', 'prop', 'del', formname))
178
+
179
+ if force is True:
180
+ meta = {'user': self.runt.snap.user.iden, 'time': s_common.now()}
181
+ await self.runt.snap.core._delAllFormProp(formname, propname, meta)
182
+
170
183
  await self.runt.snap.core.delFormProp(formname, propname)
171
184
 
172
- async def delUnivProp(self, propname):
185
+ async def delUnivProp(self, propname, force=False):
173
186
  propname = await s_stormtypes.tostr(propname)
187
+ force = await s_stormtypes.tobool(force)
174
188
  s_stormtypes.confirm(('model', 'univ', 'del'))
189
+
190
+ if force:
191
+ meta = {'user': self.runt.snap.user.iden, 'time': s_common.now()}
192
+ await self.runt.snap.core._delAllUnivProp(propname, meta)
193
+
175
194
  await self.runt.snap.core.delUnivProp(propname)
176
195
 
177
- async def delTagProp(self, propname):
196
+ async def delTagProp(self, propname, force=False):
178
197
  propname = await s_stormtypes.tostr(propname)
198
+ force = await s_stormtypes.tobool(force)
199
+
179
200
  s_stormtypes.confirm(('model', 'tagprop', 'del'))
201
+
202
+ if force:
203
+ meta = {'user': self.runt.snap.user.iden, 'time': s_common.now()}
204
+ await self.runt.snap.core._delAllTagProp(propname, meta)
205
+
180
206
  await self.runt.snap.core.delTagProp(propname)
181
207
 
182
208
  @s_stormtypes.stormfunc(readonly=True)
@@ -875,14 +875,19 @@ class LibStixImport(s_stormtypes.Lib):
875
875
  bundle = await s_stormtypes.toprim(bundle)
876
876
  config = await s_stormtypes.toprim(config)
877
877
 
878
+ if not isinstance(config, dict):
879
+ mesg = 'STIX ingest config must be a dictionary.'
880
+ raise s_exc.BadArg(mesg=mesg)
881
+
878
882
  config.setdefault('bundle', {})
879
883
  config.setdefault('objects', {})
880
884
  config.setdefault('relationships', [])
881
885
 
882
- rellook = {r['type']: r for r in config.get('relationships', ())}
883
-
884
- nodesbyid = {}
885
- relationships = []
886
+ try:
887
+ rellook = {r['type']: r for r in config.get('relationships', ())}
888
+ except Exception as e:
889
+ mesg = f'Error processing relationships in STIX bundle ingest config: {e}.'
890
+ raise s_exc.BadArg(mesg=mesg)
886
891
 
887
892
  bundlenode = None
888
893
 
@@ -890,13 +895,41 @@ class LibStixImport(s_stormtypes.Lib):
890
895
  if bundleconf is None:
891
896
  bundleconf = {}
892
897
 
898
+ if not isinstance(bundleconf, dict):
899
+ mesg = 'STIX ingest config bundle value must be a dictionary.'
900
+ raise s_exc.BadArg(mesg=mesg)
901
+
893
902
  bundlestorm = bundleconf.get('storm')
894
903
  if bundlestorm:
904
+ if not isinstance(bundlestorm, str):
905
+ mesg = 'STIX ingest config storm query must be a string.'
906
+ raise s_exc.BadArg(mesg=mesg)
907
+
895
908
  bundlenode = await self._callStorm(bundlestorm, {'bundle': bundle})
896
909
 
897
910
  self.runt.layerConfirm(('node', 'edge', 'add', 'refs'))
898
911
 
899
- for obj in bundle.get('objects'):
912
+ try:
913
+ nodesbyid = await self._ingestObjects(bundle, config, rellook)
914
+ except Exception as e:
915
+ mesg = f'Error processing objects in STIX bundle ingest: {e}.'
916
+ raise s_exc.BadArg(mesg=mesg)
917
+
918
+ if bundlenode is not None:
919
+ for node in nodesbyid.values():
920
+ await bundlenode.addEdge('refs', node.iden())
921
+ await asyncio.sleep(0)
922
+ yield bundlenode
923
+
924
+ for node in nodesbyid.values():
925
+ yield node
926
+
927
+ async def _ingestObjects(self, bundle, config, rellook):
928
+
929
+ nodesbyid = {}
930
+ relationships = []
931
+
932
+ for obj in bundle.get('objects', ()):
900
933
 
901
934
  objtype = obj.get('type')
902
935
 
@@ -971,7 +1004,7 @@ class LibStixImport(s_stormtypes.Lib):
971
1004
  await self.runt.snap.warnonce(f'STIX bundle ingest has no relationship definition for: {reltype}.')
972
1005
 
973
1006
  # attempt to resolve object_refs
974
- for obj in bundle.get('objects'):
1007
+ for obj in bundle.get('objects', ()):
975
1008
 
976
1009
  node = nodesbyid.get(obj.get('id'))
977
1010
  if node is None:
@@ -984,17 +1017,7 @@ class LibStixImport(s_stormtypes.Lib):
984
1017
 
985
1018
  await node.addEdge('refs', refsnode.iden())
986
1019
 
987
- if bundlenode is not None:
988
- for node in nodesbyid.values():
989
- await bundlenode.addEdge('refs', node.iden())
990
- await asyncio.sleep(0)
991
- yield bundlenode
992
-
993
- for node in nodesbyid.values():
994
- yield node
995
-
996
- if bundlenode:
997
- yield bundlenode
1020
+ return nodesbyid
998
1021
 
999
1022
  async def _callStorm(self, text, varz):
1000
1023
 
@@ -649,7 +649,7 @@ class Vault(s_stormtypes.Prim):
649
649
  'type': {'type': 'function', '_funcname': '_methSetPerm',
650
650
  'args': (
651
651
  {'name': 'iden', 'type': 'str', 'desc': 'The user or role to modify.'},
652
- {'name': 'level', 'type': 'str', 'desc': 'The easyperm level for the iden. $lib.undef to remove an existing permission.'},
652
+ {'name': 'level', 'type': 'str', 'desc': 'The easyperm level for the iden. $lib.null to remove an existing permission.'},
653
653
  ),
654
654
  'returns': {'type': 'boolean', 'desc': '$lib.true if the permission was set, $lib.false otherwise.', }}},
655
655
 
@@ -744,7 +744,7 @@ class Vault(s_stormtypes.Prim):
744
744
  s_stormtypes.confirmEasyPerm(vault, s_cell.PERM_ADMIN, mesg=mesg)
745
745
 
746
746
  iden = await s_stormtypes.tostr(iden)
747
- level = await s_stormtypes.toint(level)
747
+ level = await s_stormtypes.toint(level, noneok=True)
748
748
 
749
749
  return await self.runt.snap.core.setVaultPerm(self.valu, iden, level)
750
750
 
synapse/lib/stormtypes.py CHANGED
@@ -5277,7 +5277,7 @@ class Number(Prim):
5277
5277
  def __init__(self, valu, path=None):
5278
5278
  try:
5279
5279
  valu = s_common.hugenum(valu)
5280
- except decimal.DecimalException as e:
5280
+ except (TypeError, decimal.DecimalException) as e:
5281
5281
  mesg = f'Failed to make number from {valu!r}'
5282
5282
  raise s_exc.BadCast(mesg=mesg) from e
5283
5283
 
synapse/lib/types.py CHANGED
@@ -1,3 +1,4 @@
1
+ import sys
1
2
  import asyncio
2
3
  import decimal
3
4
  import logging
@@ -78,6 +79,14 @@ class Type:
78
79
 
79
80
  self.postTypeInit()
80
81
 
82
+ normopts = dict(self.opts)
83
+ for optn, valu in normopts.items():
84
+ if isinstance(valu, float):
85
+ normopts[optn] = str(valu)
86
+
87
+ ctor = '.'.join([self.__class__.__module__, self.__class__.__qualname__])
88
+ self.typehash = sys.intern(s_common.guid((ctor, s_common.flatten(normopts))))
89
+
81
90
  def _storLiftSafe(self, cmpr, valu):
82
91
  try:
83
92
  return self.storlifts['=']('=', valu)
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, 178, 0)
226
+ version = (2, 179, 0)
227
227
  verstring = '.'.join([str(x) for x in version])
228
- commit = '56bad29e241893b702ea437d500a0229e8e1956b'
228
+ commit = '1c51c58523e9012655d8d18bfa1ad149e5536c25'