synapse 2.221.0__py311-none-any.whl → 2.223.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 (46) hide show
  1. synapse/cortex.py +143 -44
  2. synapse/cryotank.py +1 -1
  3. synapse/data/lark/storm.lark +9 -6
  4. synapse/lib/ast.py +13 -5
  5. synapse/lib/layer.py +18 -11
  6. synapse/lib/nexus.py +1 -1
  7. synapse/lib/parser.py +1 -0
  8. synapse/lib/rstorm.py +19 -1
  9. synapse/lib/schemas.py +4 -0
  10. synapse/lib/snap.py +15 -9
  11. synapse/lib/storm.py +0 -190
  12. synapse/lib/stormlib/auth.py +1 -1
  13. synapse/lib/stormlib/cortex.py +1 -1
  14. synapse/lib/stormlib/mime.py +15 -5
  15. synapse/lib/stormlib/pkg.py +598 -0
  16. synapse/lib/stormlib/task.py +115 -0
  17. synapse/lib/stormtypes.py +42 -178
  18. synapse/lib/trigger.py +16 -14
  19. synapse/lib/version.py +2 -2
  20. synapse/lib/view.py +17 -14
  21. synapse/models/files.py +1 -1
  22. synapse/models/orgs.py +3 -0
  23. synapse/tests/test_cortex.py +1 -1
  24. synapse/tests/test_lib_aha.py +68 -53
  25. synapse/tests/test_lib_ast.py +3 -0
  26. synapse/tests/test_lib_cell.py +12 -12
  27. synapse/tests/test_lib_grammar.py +4 -4
  28. synapse/tests/test_lib_rstorm.py +55 -7
  29. synapse/tests/test_lib_storm.py +105 -249
  30. synapse/tests/test_lib_stormlib_auth.py +84 -0
  31. synapse/tests/test_lib_stormlib_cortex.py +1 -0
  32. synapse/tests/test_lib_stormlib_mime.py +24 -0
  33. synapse/tests/test_lib_stormlib_pkg.py +456 -0
  34. synapse/tests/test_lib_stormlib_task.py +98 -0
  35. synapse/tests/test_lib_stormtypes.py +25 -100
  36. synapse/tests/test_lib_trigger.py +66 -3
  37. synapse/tests/test_lib_view.py +53 -0
  38. synapse/tests/test_model_files.py +11 -0
  39. synapse/tests/test_model_orgs.py +6 -1
  40. synapse/tools/cryo/cat.py +2 -1
  41. synapse/tools/cryo/list.py +2 -0
  42. {synapse-2.221.0.dist-info → synapse-2.223.0.dist-info}/METADATA +1 -1
  43. {synapse-2.221.0.dist-info → synapse-2.223.0.dist-info}/RECORD +46 -42
  44. {synapse-2.221.0.dist-info → synapse-2.223.0.dist-info}/WHEEL +0 -0
  45. {synapse-2.221.0.dist-info → synapse-2.223.0.dist-info}/licenses/LICENSE +0 -0
  46. {synapse-2.221.0.dist-info → synapse-2.223.0.dist-info}/top_level.txt +0 -0
@@ -2054,6 +2054,31 @@ class StormTypesTest(s_test.SynTest):
2054
2054
  self.eq(nodes[0].repr(), 'foo')
2055
2055
  self.none(nodes[0].get('hehe'))
2056
2056
 
2057
+ async with self.getTestCore() as core2:
2058
+ url = core.getLocalUrl('*/layer')
2059
+
2060
+ layers = set(core2.layers.keys())
2061
+ q = f'layer.add --mirror {url}'
2062
+ await core2.stormlist(q)
2063
+
2064
+ uplayr = list(set(core2.layers.keys()) - layers)[0]
2065
+ vdef = {'layers': [uplayr]}
2066
+
2067
+ view00 = await core2.addView(vdef)
2068
+ opts = {'view': view00.get('iden')}
2069
+
2070
+ nodes = await core.nodes('[ test:str=foo :hehe=bar ]')
2071
+
2072
+ layr = core2.getLayer(uplayr)
2073
+ offs = await core.view.layers[0].getEditOffs()
2074
+ self.true(await layr.waitEditOffs(offs, timeout=10))
2075
+
2076
+ q = 'test:str return($lib.layer.get().delStorNodeProp($node.iden(), test:str:hehe))'
2077
+ self.true(await core2.callStorm(q, opts=opts))
2078
+
2079
+ # attempting to delete a second time should not blow up
2080
+ self.false(await core2.callStorm(q, opts=opts))
2081
+
2057
2082
  # no test:str:newp prop
2058
2083
  q = '''
2059
2084
  [ test:str=foobar00 ]
@@ -7980,103 +8005,3 @@ words\tword\twrd'''
7980
8005
 
7981
8006
  q = 'return($lib.axon.unpack($sha256, fmt=">Q", offs=24))'
7982
8007
  await self.asyncraises(s_exc.BadDataValu, core.callStorm(q, opts=opts))
7983
-
7984
- async def test_storm_pkg_vars(self):
7985
- with self.getTestDir() as dirn:
7986
-
7987
- async with self.getTestCore(dirn=dirn) as core:
7988
-
7989
- lowuser = await core.addUser('lowuser')
7990
- aslow = {'user': lowuser.get('iden')}
7991
- await core.callStorm('auth.user.addrule lowuser node')
7992
-
7993
- # basic crud
7994
-
7995
- self.none(await core.callStorm('return($lib.pkg.vars(pkg0).bar)'))
7996
- self.none(await core.callStorm('$varz=$lib.pkg.vars(pkg0) $varz.baz=$lib.undef return($varz.baz)'))
7997
- self.eq([], await core.callStorm('''
7998
- $kvs = ([])
7999
- for $kv in $lib.pkg.vars(pkg0) { $kvs.append($kv) }
8000
- return($kvs)
8001
- '''))
8002
-
8003
- await core.callStorm('$lib.pkg.vars(pkg0).bar = cat')
8004
- await core.callStorm('$lib.pkg.vars(pkg0).baz = dog')
8005
-
8006
- await core.callStorm('$lib.pkg.vars(pkg1).bar = emu')
8007
- await core.callStorm('$lib.pkg.vars(pkg1).baz = groot')
8008
-
8009
- self.eq('cat', await core.callStorm('return($lib.pkg.vars(pkg0).bar)'))
8010
- self.eq('dog', await core.callStorm('return($lib.pkg.vars(pkg0).baz)'))
8011
- self.eq('emu', await core.callStorm('return($lib.pkg.vars(pkg1).bar)'))
8012
- self.eq('groot', await core.callStorm('return($lib.pkg.vars(pkg1).baz)'))
8013
-
8014
- self.sorteq([('bar', 'cat'), ('baz', 'dog')], await core.callStorm('''
8015
- $kvs = ([])
8016
- for $kv in $lib.pkg.vars(pkg0) { $kvs.append($kv) }
8017
- return($kvs)
8018
- '''))
8019
- self.sorteq([('bar', 'emu'), ('baz', 'groot')], await core.callStorm('''
8020
- $kvs = ([])
8021
- for $kv in $lib.pkg.vars(pkg1) { $kvs.append($kv) }
8022
- return($kvs)
8023
- '''))
8024
-
8025
- await core.callStorm('$lib.pkg.vars(pkg0).baz = $lib.undef')
8026
- self.none(await core.callStorm('return($lib.pkg.vars(pkg0).baz)'))
8027
-
8028
- # perms
8029
-
8030
- await self.asyncraises(s_exc.AuthDeny, core.callStorm('$lib.print($lib.pkg.vars(pkg0))', opts=aslow))
8031
- await self.asyncraises(s_exc.AuthDeny, core.callStorm('return($lib.pkg.vars(pkg0).baz)', opts=aslow))
8032
- await self.asyncraises(s_exc.AuthDeny, core.callStorm('$lib.pkg.vars(pkg0).baz = cool', opts=aslow))
8033
- await self.asyncraises(s_exc.AuthDeny, core.callStorm('$lib.pkg.vars(pkg0).baz = $lib.undef', opts=aslow))
8034
- await self.asyncraises(s_exc.AuthDeny, core.callStorm('''
8035
- $kvs = ([])
8036
- for $kv in $lib.pkg.vars(pkg0) { $kvs.append($kv) }
8037
- return($kvs)
8038
- ''', opts=aslow))
8039
- await self.asyncraises(s_exc.AuthDeny, core.callStorm('''
8040
- [ test:str=foo ]
8041
- $kvs = ([])
8042
- for $kv in $lib.pkg.vars(pkg0) { $kvs.append($kv) }
8043
- fini { return($kvs) }
8044
- ''', opts=aslow))
8045
-
8046
- await core.callStorm('auth.user.addrule lowuser "power-ups.pkg0.admin"')
8047
-
8048
- self.stormHasNoWarnErr(await core.nodes('$lib.print($lib.pkg.vars(pkg0))', opts=aslow))
8049
- await core.callStorm('$lib.pkg.vars(pkg0).baz = cool', opts=aslow)
8050
- self.eq('cool', await core.callStorm('return($lib.pkg.vars(pkg0).baz)', opts=aslow))
8051
- await core.callStorm('$lib.pkg.vars(pkg0).baz = $lib.undef', opts=aslow)
8052
- self.eq([('bar', 'cat')], await core.callStorm('''
8053
- $kvs = ([])
8054
- for $kv in $lib.pkg.vars(pkg0) { $kvs.append($kv) }
8055
- return($kvs)
8056
- ''', opts=aslow))
8057
- self.eq([('bar', 'cat')], await core.callStorm('''
8058
- [ test:str=foo ]
8059
- $kvs = ([])
8060
- for $kv in $lib.pkg.vars(pkg0) { $kvs.append($kv) }
8061
- fini { return($kvs) }
8062
- ''', opts=aslow))
8063
-
8064
- async with self.getTestCore(dirn=dirn) as core:
8065
-
8066
- # data persists
8067
-
8068
- self.eq('cat', await core.callStorm('return($lib.pkg.vars(pkg0).bar)'))
8069
- self.none(await core.callStorm('return($lib.pkg.vars(pkg0).baz)'))
8070
- self.eq('emu', await core.callStorm('return($lib.pkg.vars(pkg1).bar)'))
8071
- self.eq('groot', await core.callStorm('return($lib.pkg.vars(pkg1).baz)'))
8072
-
8073
- self.sorteq([('bar', 'cat')], await core.callStorm('''
8074
- $kvs = ([])
8075
- for $kv in $lib.pkg.vars(pkg0) { $kvs.append($kv) }
8076
- return($kvs)
8077
- '''))
8078
- self.sorteq([('bar', 'emu'), ('baz', 'groot')], await core.callStorm('''
8079
- $kvs = ([])
8080
- for $kv in $lib.pkg.vars(pkg1) { $kvs.append($kv) }
8081
- return($kvs)
8082
- '''))
@@ -8,7 +8,7 @@ import synapse.tools.backup as s_tools_backup
8
8
 
9
9
  class TrigTest(s_t_utils.SynTest):
10
10
 
11
- async def test_trigger_async(self):
11
+ async def test_trigger_async_base(self):
12
12
 
13
13
  with self.getTestDir() as dirn:
14
14
 
@@ -49,6 +49,24 @@ class TrigTest(s_t_utils.SynTest):
49
49
  self.none(nodes[0].tags.get('foo'))
50
50
  self.none(await core.callStorm('return($lib.queue.gen(foo).pop())'))
51
51
 
52
+ q = '''$u=$lib.auth.users.get($auto.opts.user)
53
+ $s=`f={$auto.opts.form} v={$auto.opts.valu} u={$u.name}`
54
+ $lib.log.info($s) [ test:guid="*" +#nodeadd]'''
55
+ tdef = {'cond': 'node:add', 'form': 'test:str', 'storm': q}
56
+ await core.view.addTrigger(tdef)
57
+ with self.getAsyncLoggerStream('synapse.storm.log', 'f=') as stream:
58
+ await core.nodes('[ test:str=foo ]')
59
+ self.true(await stream.wait(12))
60
+ self.eq(stream.getvalue().strip(), 'f=test:str v=foo u=root')
61
+ self.len(1, await core.nodes('test:guid#nodeadd'))
62
+ unfo = await core.addUser('someuser')
63
+ await core.setUserAdmin(unfo.get('iden'), True)
64
+ with self.getAsyncLoggerStream('synapse.storm.log', 'f=') as stream:
65
+ await core.nodes('[ test:str=bar ]', opts={'user': unfo.get('iden')})
66
+ self.true(await stream.wait(12))
67
+ self.eq(stream.getvalue().strip(), 'f=test:str v=bar u=someuser')
68
+ self.len(2, await core.nodes('test:guid#nodeadd'))
69
+
52
70
  async with self.getTestCore(dirn=dirn) as core:
53
71
 
54
72
  self.nn(await core.callStorm('return($lib.queue.gen(foo).pop(wait=$lib.true))'))
@@ -141,13 +159,15 @@ class TrigTest(s_t_utils.SynTest):
141
159
  view = core.view
142
160
 
143
161
  # node:add case
144
- q = '$s=`f={$auto.opts.form} v={$auto.opts.valu}` $lib.log.info($s) [ test:guid="*" +#nodeadd]'
162
+ q = '''$u=$lib.auth.users.get($auto.opts.user)
163
+ $s=`f={$auto.opts.form} v={$auto.opts.valu} u={$u.name}`
164
+ $lib.log.info($s) [ test:guid="*" +#nodeadd]'''
145
165
  tdef = {'cond': 'node:add', 'form': 'test:str', 'storm': q}
146
166
  await view.addTrigger(tdef)
147
167
  with self.getAsyncLoggerStream('synapse.storm.log', 'f=') as stream:
148
168
  await core.nodes('[ test:str=foo ]')
149
169
  self.true(await stream.wait(6))
150
- self.eq(stream.getvalue().strip(), 'f=test:str v=foo')
170
+ self.eq(stream.getvalue().strip(), 'f=test:str v=foo u=root')
151
171
  self.len(1, await core.nodes('test:guid#nodeadd'))
152
172
 
153
173
  # node:del case
@@ -910,3 +930,46 @@ class TrigTest(s_t_utils.SynTest):
910
930
  for view in core.views.values():
911
931
  for _, trigger in view.triggers.list():
912
932
  self.eq(trigger.tdef.get('view'), view.iden)
933
+
934
+ async def test_trigger_feed_data(self):
935
+ async with self.getTestCore() as core0:
936
+
937
+ podes = []
938
+
939
+ node1 = (await core0.nodes('[ test:int=1 ]'))[0]
940
+ await node1.setData('foo', 'bar')
941
+ pack = node1.pack()
942
+ pack[1]['nodedata']['foo'] = 'bar'
943
+ podes.append(pack)
944
+
945
+ node2 = (await core0.nodes('[ test:int=2 ] | [ +(refs)> { test:int=1 } ]'))[0]
946
+ pack = node2.pack()
947
+ pack[1]['edges'] = (('refs', node1.iden()), )
948
+ podes.append(pack)
949
+
950
+ node3 = (await core0.nodes('[ test:int=3 ]'))[0]
951
+ podes.append(node3.pack())
952
+
953
+ node = (await core0.nodes(f'[ test:int=4 ]'))[0]
954
+ pack = node.pack()
955
+ podes.append(pack)
956
+
957
+ async with self.getTestCore() as core1:
958
+
959
+ q = '''$u=$lib.auth.users.get($auto.opts.user)
960
+ $s=`f={$auto.opts.form} v={$auto.opts.valu} u={$u.name}`
961
+ $lib.log.info($s) [ test:guid="*" +#nodeadd]'''
962
+ tdef = {'cond': 'node:add', 'form': 'test:str', 'storm': q}
963
+ await core1.view.addTrigger(tdef)
964
+ tdef = {'cond': 'node:add', 'form': 'test:int', 'storm': q}
965
+ await core1.view.addTrigger(tdef)
966
+
967
+ with self.getAsyncLoggerStream('synapse.storm.log', 'f=') as stream:
968
+ await core1.addFeedData('syn.nodes', podes)
969
+ self.true(await stream.wait(6))
970
+ valu = stream.getvalue().strip()
971
+ self.isin('f=test:int v=1 u=root', valu)
972
+ self.isin('f=test:int v=2 u=root', valu)
973
+ self.isin('f=test:int v=3 u=root', valu)
974
+ self.isin('f=test:int v=4 u=root', valu)
975
+ self.len(4, await core1.nodes('test:guid#nodeadd'))
@@ -605,6 +605,59 @@ class ViewTest(s_t_utils.SynTest):
605
605
  self.len(1, await core.nodes('ou:org#foo', opts={'view': view}))
606
606
  self.len(1, await core.nodes('test:str=foo', opts={'view': view}))
607
607
 
608
+ async def test_lib_view_savenodeedits_telepath(self):
609
+
610
+ async with self.getTestCore() as core:
611
+
612
+ unfo = await core.getUserDefByName('root')
613
+ root = unfo.get('iden')
614
+
615
+ view = await core.callStorm('''
616
+ $layr = $lib.layer.add().iden
617
+ $view = $lib.view.add(($layr,))
618
+ return($view.iden)
619
+ ''')
620
+
621
+ await core.nodes('trigger.add node:add --form test:guid --query {$lib.log.info(`u={$auto.opts.user}`) [+#foo]}', opts={'view': view})
622
+ await core.nodes('trigger.add node:del --form test:int --query {$lib.log.info(`u={$auto.opts.user}`) [test:str=foo]}', opts={'view': view})
623
+
624
+ await core.nodes('[ test:guid=* ]')
625
+ self.len(0, await core.nodes('test:guid', opts={'view': view}))
626
+
627
+ await core.nodes('[ test:int=0 ]')
628
+ self.len(0, await core.nodes('test:int', opts={'view': view}))
629
+
630
+ await core.nodes('test:int | delnode')
631
+
632
+ edits = await core.callStorm('''$nodeedits = ()
633
+ for ($offs, $edits) in $lib.layer.get().edits(wait=$lib.false) {
634
+ $nodeedits.extend($edits)
635
+ }
636
+ return($nodeedits)''')
637
+
638
+ user = await core.auth.addUser('user')
639
+ await user.addRule((True, ('view', 'read')))
640
+ guid = s_common.guid()
641
+
642
+ async with core.getLocalProxy(share=f'*/view/{view}', user='user') as prox:
643
+ with self.raises(s_exc.AuthDeny):
644
+ await prox.saveNodeEdits(edits, {})
645
+
646
+ await core.setUserAdmin(user.iden, True)
647
+
648
+ with self.raises(s_exc.BadArg) as cm:
649
+ await prox.saveNodeEdits(edits, {})
650
+ self.eq(cm.exception.get('mesg'), "Meta argument requires user key to be a guid, got user=''")
651
+
652
+ with self.getAsyncLoggerStream('synapse.storm.log', 'u=') as stream:
653
+ await prox.saveNodeEdits(edits, {'time': s_common.now(), 'user': guid})
654
+ self.true(await stream.wait(6))
655
+ valu = stream.getvalue().strip()
656
+ self.isin(f'u={guid}', valu)
657
+
658
+ self.len(1, await core.nodes('test:guid#foo', opts={'view': view}))
659
+ self.len(1, await core.nodes('test:str=foo', opts={'view': view}))
660
+
608
661
  async def test_lib_view_wipeLayer(self):
609
662
 
610
663
  async with self.getTestCore() as core:
@@ -103,6 +103,17 @@ class FileTest(s_t_utils.SynTest):
103
103
  self.eq(rnode.get('type'), 2)
104
104
  self.eq(rnode.repr('langid'), 'en-US')
105
105
  self.eq(rnode.repr('type'), 'RT_BITMAP')
106
+ # unknown langid
107
+ nodes = await core.nodes('[file:mime:pe:resource=$valu]',
108
+ opts={'vars': {'valu': (filea, 2, 0x1804, 'd' * 64)}})
109
+ self.len(1, nodes)
110
+ rnode = nodes[0]
111
+ self.eq(rnode.get('langid'), 0x1804)
112
+ self.eq(rnode.repr('langid'), '6148')
113
+ # invalid langid
114
+ with self.raises(s_exc.BadTypeValu):
115
+ await core.nodes('[file:mime:pe:resource=$valu]',
116
+ opts={'vars': {'valu': (filea, 2, 0xfffff, 'd' * 64)}})
106
117
  # pe section
107
118
  nodes = await core.nodes('[file:mime:pe:section=$valu]',
108
119
  opts={'vars': {'valu': (filea, 'foo', 'b' * 64)}})
@@ -25,6 +25,7 @@ class OuModelTest(s_t_utils.SynTest):
25
25
  :reporter=$lib.gen.orgByName(vertex)
26
26
  :reporter:name=vertex
27
27
  :ext:id=Foo
28
+ :parent={[ ou:technique=* :name=metawoot ]}
28
29
  ]
29
30
  ''')
30
31
  self.len(1, nodes)
@@ -37,10 +38,14 @@ class OuModelTest(s_t_utils.SynTest):
37
38
  self.eq('T0001', nodes[0].get('mitre:attack:technique'))
38
39
  self.eq(40, nodes[0].get('sophistication'))
39
40
  self.eq('vertex', nodes[0].get('reporter:name'))
41
+ self.nn(nodes[0].get('parent'))
40
42
  self.len(1, await core.nodes('ou:technique -> syn:tag'))
41
43
  self.len(1, await core.nodes('ou:technique -> ou:technique:taxonomy'))
42
44
  self.len(1, await core.nodes('ou:technique -> it:mitre:attack:technique'))
43
- self.len(1, await core.nodes('ou:technique :reporter -> ou:org'))
45
+
46
+ nodes = await core.nodes('ou:technique :parent -> *')
47
+ self.len(1, nodes)
48
+ self.eq('metawoot', nodes[0].get('name'))
44
49
 
45
50
  props = {
46
51
  'name': 'MyGoal',
synapse/tools/cryo/cat.py CHANGED
@@ -1,7 +1,7 @@
1
1
  import sys
2
2
  import pprint
3
- import argparse
4
3
 
4
+ import synapse.common as s_common
5
5
  import synapse.telepath as s_telepath
6
6
 
7
7
  import synapse.lib.cmd as s_cmd
@@ -58,4 +58,5 @@ async def main(argv, outp=s_output.stdout):
58
58
  return 0
59
59
 
60
60
  if __name__ == '__main__': # pragma: no cover
61
+ s_common.deprecated('synapse.tools.cryo.cat', curv='2.223.0')
61
62
  s_cmd.exitmain(main)
@@ -1,3 +1,4 @@
1
+ import synapse.common as s_common
1
2
  import synapse.telepath as s_telepath
2
3
 
3
4
  import synapse.lib.cmd as s_cmd
@@ -24,4 +25,5 @@ async def main(argv, outp=s_output.stdout):
24
25
  return 0
25
26
 
26
27
  if __name__ == '__main__': # pragma: no cover
28
+ s_common.deprecated('synapse.tools.cryo.list', curv='2.223.0')
27
29
  s_cmd.exitmain(main)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synapse
3
- Version: 2.221.0
3
+ Version: 2.223.0
4
4
  Summary: Synapse Intelligence Analysis Framework
5
5
  Author-email: The Vertex Project LLC <root@vertex.link>
6
6
  License-Expression: Apache-2.0