synapse 2.170.0__py311-none-any.whl → 2.172.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 (58) hide show
  1. synapse/common.py +20 -0
  2. synapse/cortex.py +98 -6
  3. synapse/lib/agenda.py +13 -7
  4. synapse/lib/ast.py +9 -8
  5. synapse/lib/cache.py +2 -2
  6. synapse/lib/cell.py +7 -3
  7. synapse/lib/coro.py +12 -0
  8. synapse/lib/layer.py +124 -84
  9. synapse/lib/lmdbslab.py +34 -10
  10. synapse/lib/node.py +1 -1
  11. synapse/lib/slabseqn.py +11 -5
  12. synapse/lib/storm.py +7 -71
  13. synapse/lib/stormhttp.py +1 -1
  14. synapse/lib/stormlib/auth.py +19 -0
  15. synapse/lib/stormlib/cell.py +42 -4
  16. synapse/lib/stormlib/compression.py +6 -6
  17. synapse/lib/stormlib/env.py +50 -0
  18. synapse/lib/stormlib/gen.py +1 -1
  19. synapse/lib/stormlib/model.py +1 -1
  20. synapse/lib/stormtypes.py +35 -11
  21. synapse/lib/types.py +7 -7
  22. synapse/lib/version.py +2 -2
  23. synapse/lib/view.py +13 -13
  24. synapse/models/base.py +13 -0
  25. synapse/models/biz.py +14 -0
  26. synapse/models/economic.py +3 -0
  27. synapse/models/inet.py +474 -4
  28. synapse/models/infotech.py +163 -22
  29. synapse/models/orgs.py +17 -0
  30. synapse/models/risk.py +15 -1
  31. synapse/models/transport.py +1 -1
  32. synapse/tests/test_common.py +15 -0
  33. synapse/tests/test_cortex.py +9 -0
  34. synapse/tests/test_lib_ast.py +2 -1
  35. synapse/tests/test_lib_cell.py +1 -1
  36. synapse/tests/test_lib_layer.py +168 -59
  37. synapse/tests/test_lib_lmdbslab.py +49 -0
  38. synapse/tests/test_lib_stormlib_auth.py +22 -0
  39. synapse/tests/test_lib_stormlib_cell.py +47 -0
  40. synapse/tests/test_lib_stormlib_env.py +25 -0
  41. synapse/tests/test_lib_stormtypes.py +12 -1
  42. synapse/tests/test_lib_types.py +1 -0
  43. synapse/tests/test_lib_view.py +9 -9
  44. synapse/tests/test_model_base.py +5 -3
  45. synapse/tests/test_model_economic.py +4 -0
  46. synapse/tests/test_model_files.py +1 -0
  47. synapse/tests/test_model_inet.py +405 -1
  48. synapse/tests/test_model_infotech.py +135 -3
  49. synapse/tests/test_model_orgs.py +6 -0
  50. synapse/tests/test_model_risk.py +8 -0
  51. synapse/tests/test_tools_storm.py +46 -8
  52. synapse/tests/utils.py +30 -9
  53. synapse/tools/storm.py +14 -6
  54. {synapse-2.170.0.dist-info → synapse-2.172.0.dist-info}/METADATA +1 -1
  55. {synapse-2.170.0.dist-info → synapse-2.172.0.dist-info}/RECORD +58 -56
  56. {synapse-2.170.0.dist-info → synapse-2.172.0.dist-info}/WHEEL +1 -1
  57. {synapse-2.170.0.dist-info → synapse-2.172.0.dist-info}/LICENSE +0 -0
  58. {synapse-2.170.0.dist-info → synapse-2.172.0.dist-info}/top_level.txt +0 -0
@@ -4,11 +4,14 @@ import asyncio
4
4
 
5
5
  import synapse.exc as s_exc
6
6
  import synapse.common as s_common
7
+ import synapse.cortex as s_cortex
7
8
  import synapse.telepath as s_telepath
8
9
 
9
10
  import synapse.lib.time as s_time
10
11
  import synapse.lib.layer as s_layer
11
12
  import synapse.lib.msgpack as s_msgpack
13
+ import synapse.lib.spooled as s_spooled
14
+ import synapse.lib.hiveauth as s_hiveauth
12
15
 
13
16
  import synapse.tools.backup as s_tools_backup
14
17
 
@@ -16,6 +19,8 @@ import synapse.tests.utils as s_t_utils
16
19
 
17
20
  from synapse.tests.utils import alist
18
21
 
22
+ from unittest import mock
23
+
19
24
  async def iterPropForm(self, form=None, prop=None):
20
25
  bad_valu = [(b'foo', "bar"), (b'bar', ('bar',)), (b'biz', 4965), (b'baz', (0, 56))]
21
26
  bad_valu += [(b'boz', 'boz')] * 10
@@ -1014,6 +1019,20 @@ class LayerTest(s_t_utils.SynTest):
1014
1019
  if offs == layr.nodeeditlog.index() - 1:
1015
1020
  break
1016
1021
 
1022
+ fwdedits = [item async for item in core0.getLayer().syncNodeEdits(0, wait=False)]
1023
+ revedits = [item async for item in core0.getLayer().syncNodeEdits(0xffffffff, wait=False, reverse=True)]
1024
+
1025
+ self.eq(fwdedits, list(reversed(revedits)))
1026
+
1027
+ fwdedit = await core0.callStorm('for $item in $lib.layer.get().edits() { return($item) }')
1028
+ revedit = await core0.callStorm('for $item in $lib.layer.get().edits(reverse=(true)) { return($item) }')
1029
+
1030
+ self.nn(await core0.callStorm('return($lib.layer.get().edited())'))
1031
+
1032
+ self.ne(fwdedit, revedit)
1033
+ self.eq(fwdedits[0], fwdedit)
1034
+ self.eq(revedits[0], revedit)
1035
+
1017
1036
  async with self.getTestCore() as core1:
1018
1037
 
1019
1038
  url = core1.getLocalUrl('*/layer')
@@ -1897,74 +1916,164 @@ class LayerTest(s_t_utils.SynTest):
1897
1916
 
1898
1917
  async def test_layer_edit_perms(self):
1899
1918
 
1900
- async with self.getTestCore() as core:
1901
-
1902
- viewiden = await core.callStorm('''
1903
- $lyr = $lib.layer.add()
1904
- $view = $lib.view.add(($lyr.iden,))
1905
- return($view.iden)
1906
- ''')
1919
+ class Dict(s_spooled.Dict):
1920
+ async def __anit__(self, dirn=None, size=1, cell=None):
1921
+ await super().__anit__(dirn=dirn, size=size, cell=cell)
1907
1922
 
1908
- opts = {'view': viewiden}
1909
-
1910
- await core.addTagProp('score', ('int', {}), {})
1923
+ with mock.patch('synapse.lib.spooled.Dict', Dict):
1924
+ async with self.getTestCore() as core:
1911
1925
 
1912
- await core.nodes('[ test:str=bar ]', opts=opts)
1926
+ user = await core.auth.addUser('blackout@vertex.link')
1913
1927
 
1914
- await core.nodes('''
1915
- [ test:str=foo
1916
- :hehe=bar
1917
- +#foo:score=2
1918
- +#foo.bar
1919
- <(refs)+ { test:str=bar }
1920
- ]
1921
- $node.data.set(foo, bar)
1922
- ''', opts=opts)
1923
-
1924
- await core.nodes('''
1925
- test:str=foo
1926
- [ <(refs)- { test:str=bar } ]
1927
- $node.data.pop(foo)
1928
- | delnode
1929
- ''', opts=opts)
1930
-
1931
- layr = core.views[viewiden].layers[0]
1932
-
1933
- nodeedits = []
1934
- async for _, edits, _ in layr.iterNodeEditLog():
1935
- nodeedits.extend(edits)
1936
-
1937
- perms = [perm for permoffs, perm in s_layer.getNodeEditPerms(nodeedits)]
1938
-
1939
- self.eq({
1940
- ('node', 'add', 'test:str'),
1941
- ('node', 'del', 'test:str'),
1942
-
1943
- ('node', 'add', 'syn:tag'),
1944
-
1945
- ('node', 'prop', 'set', 'test:str:.created'),
1946
- ('node', 'prop', 'del', 'test:str:.created'),
1928
+ viewiden = await core.callStorm('''
1929
+ $lyr = $lib.layer.add()
1930
+ $view = $lib.view.add(($lyr.iden,))
1931
+ return($view.iden)
1932
+ ''')
1947
1933
 
1948
- ('node', 'prop', 'set', 'test:str:hehe'),
1949
- ('node', 'prop', 'del', 'test:str:hehe'),
1934
+ layr = core.views[viewiden].layers[0]
1950
1935
 
1951
- ('node', 'prop', 'set', 'syn:tag:up'),
1952
- ('node', 'prop', 'set', 'syn:tag:base'),
1953
- ('node', 'prop', 'set', 'syn:tag:depth'),
1954
- ('node', 'prop', 'set', 'syn:tag:.created'),
1936
+ opts = {'view': viewiden}
1955
1937
 
1956
- ('node', 'tag', 'add', 'foo'),
1957
- ('node', 'tag', 'del', 'foo'),
1938
+ await core.addTagProp('score', ('int', {}), {})
1958
1939
 
1959
- ('node', 'tag', 'add', 'foo', 'bar'),
1960
- ('node', 'tag', 'del', 'foo', 'bar'),
1940
+ await core.nodes('[ test:str=bar +#foo.bar ]', opts=opts)
1961
1941
 
1962
- ('node', 'data', 'set', 'foo'),
1963
- ('node', 'data', 'pop', 'foo'),
1942
+ await core.nodes('''
1943
+ [ test:str=foo
1944
+ :hehe=bar
1945
+ +#foo:score=2
1946
+ +#foo.bar.baz
1947
+ +#bar:score=2
1948
+ <(refs)+ { test:str=bar }
1949
+ ]
1950
+ $node.data.set(foo, bar)
1951
+ ''', opts=opts)
1952
+
1953
+ parent = core.view.layers[0]
1954
+
1955
+ seen = set()
1956
+ def confirm(self, perm, default=None, gateiden=None):
1957
+ seen.add(perm)
1958
+ return True
1959
+
1960
+ def confirmPropSet(self, user, prop, layriden):
1961
+ seen.add(prop.setperms[0])
1962
+ seen.add(prop.setperms[1])
1963
+
1964
+ def confirmPropDel(self, user, prop, layriden):
1965
+ seen.add(prop.delperms[0])
1966
+ seen.add(prop.delperms[1])
1967
+
1968
+ with mock.patch.object(s_hiveauth.HiveUser, 'confirm', confirm):
1969
+ with mock.patch.object(s_cortex.Cortex, 'confirmPropSet', confirmPropSet):
1970
+ with mock.patch.object(s_cortex.Cortex, 'confirmPropDel', confirmPropDel):
1971
+ await layr.confirmLayerEditPerms(user, parent.iden)
1972
+
1973
+ self.eq(seen, {
1974
+ # Node add
1975
+ ('node', 'add', 'syn:tag'),
1976
+ ('node', 'add', 'test:str'),
1977
+
1978
+ # Old style prop set
1979
+ ('node', 'prop', 'set', 'test:str:hehe'),
1980
+ ('node', 'prop', 'set', 'test:str.created'),
1981
+
1982
+ ('node', 'prop', 'set', 'syn:tag:up'),
1983
+ ('node', 'prop', 'set', 'syn:tag:base'),
1984
+ ('node', 'prop', 'set', 'syn:tag:depth'),
1985
+ ('node', 'prop', 'set', 'syn:tag.created'),
1986
+
1987
+ # New style prop set
1988
+ ('node', 'prop', 'set', 'test:str', 'hehe'),
1989
+ ('node', 'prop', 'set', 'test:str', '.created'),
1990
+
1991
+ ('node', 'prop', 'set', 'syn:tag', 'up'),
1992
+ ('node', 'prop', 'set', 'syn:tag', 'base'),
1993
+ ('node', 'prop', 'set', 'syn:tag', 'depth'),
1994
+ ('node', 'prop', 'set', 'syn:tag', '.created'),
1995
+
1996
+ # Tag/tagprop add
1997
+ ('node', 'tag', 'add', 'foo'),
1998
+ ('node', 'tag', 'add', 'bar'),
1999
+ ('node', 'tag', 'add', 'foo', 'bar'),
2000
+ ('node', 'tag', 'add', 'foo', 'bar', 'baz'),
2001
+
2002
+ # Nodedata set
2003
+ ('node', 'data', 'set', 'foo'),
2004
+
2005
+ # Edge add
2006
+ ('node', 'edge', 'add', 'refs'),
2007
+ })
1964
2008
 
1965
- ('node', 'edge', 'add', 'refs'),
1966
- ('node', 'edge', 'del', 'refs'),
1967
- }, set(perms))
2009
+ await core.nodes('''
2010
+ test:str=foo
2011
+ [ <(refs)- { test:str=bar } ]
2012
+ $node.data.pop(foo)
2013
+ | delnode
2014
+ ''', opts=opts)
2015
+
2016
+ seen.clear()
2017
+ with mock.patch.object(s_hiveauth.HiveUser, 'confirm', confirm):
2018
+ with mock.patch.object(s_cortex.Cortex, 'confirmPropSet', confirmPropSet):
2019
+ with mock.patch.object(s_cortex.Cortex, 'confirmPropDel', confirmPropDel):
2020
+ await layr.confirmLayerEditPerms(user, parent.iden)
2021
+
2022
+ self.eq(seen, {
2023
+ # Node add
2024
+ ('node', 'add', 'syn:tag'),
2025
+ ('node', 'add', 'test:str'),
2026
+
2027
+ # Old style prop set
2028
+ ('node', 'prop', 'set', 'test:str.created'),
2029
+
2030
+ ('node', 'prop', 'set', 'syn:tag:up'),
2031
+ ('node', 'prop', 'set', 'syn:tag:base'),
2032
+ ('node', 'prop', 'set', 'syn:tag:depth'),
2033
+ ('node', 'prop', 'set', 'syn:tag.created'),
2034
+
2035
+ # New style prop set
2036
+ ('node', 'prop', 'set', 'test:str', '.created'),
2037
+
2038
+ ('node', 'prop', 'set', 'syn:tag', 'up'),
2039
+ ('node', 'prop', 'set', 'syn:tag', 'base'),
2040
+ ('node', 'prop', 'set', 'syn:tag', 'depth'),
2041
+ ('node', 'prop', 'set', 'syn:tag', '.created'),
2042
+
2043
+ # Tag/tagprop add
2044
+ ('node', 'tag', 'add', 'foo', 'bar'),
2045
+ })
2046
+
2047
+ seen.clear()
2048
+ with mock.patch.object(s_hiveauth.HiveUser, 'confirm', confirm):
2049
+ with mock.patch.object(s_cortex.Cortex, 'confirmPropSet', confirmPropSet):
2050
+ with mock.patch.object(s_cortex.Cortex, 'confirmPropDel', confirmPropDel):
2051
+ await layr.confirmLayerEditPerms(user, layr.iden, delete=True)
2052
+
2053
+ self.eq(seen, {
2054
+ # Node del
2055
+ ('node', 'del', 'syn:tag'),
2056
+ ('node', 'del', 'test:str'),
2057
+
2058
+ # Old style prop del
2059
+ ('node', 'prop', 'del', 'test:str.created'),
2060
+
2061
+ ('node', 'prop', 'del', 'syn:tag:up'),
2062
+ ('node', 'prop', 'del', 'syn:tag:base'),
2063
+ ('node', 'prop', 'del', 'syn:tag:depth'),
2064
+ ('node', 'prop', 'del', 'syn:tag.created'),
2065
+
2066
+ # New style prop del
2067
+ ('node', 'prop', 'del', 'test:str', '.created'),
2068
+
2069
+ ('node', 'prop', 'del', 'syn:tag', 'up'),
2070
+ ('node', 'prop', 'del', 'syn:tag', 'base'),
2071
+ ('node', 'prop', 'del', 'syn:tag', 'depth'),
2072
+ ('node', 'prop', 'del', 'syn:tag', '.created'),
2073
+
2074
+ # Tag/tagprop del
2075
+ ('node', 'tag', 'del', 'foo', 'bar'),
2076
+ })
1968
2077
 
1969
2078
  async def test_layer_v9(self):
1970
2079
  async with self.getRegrCore('2.101.1-hugenum-indxprec') as core:
@@ -57,9 +57,11 @@ class LmdbSlabTest(s_t_utils.SynTest):
57
57
 
58
58
  testgenr = slab.scanKeys(db=testdb)
59
59
  dupsgenr = slab.scanKeys(db=dupsdb)
60
+ nodupsgenr = slab.scanKeys(db=dupsdb, nodup=True)
60
61
 
61
62
  testlist = [next(testgenr)]
62
63
  dupslist = [next(dupsgenr)]
64
+ nodupslist = [next(nodupsgenr)]
63
65
 
64
66
  slab.put(b'derp', b'derp', db=editdb)
65
67
 
@@ -68,16 +70,25 @@ class LmdbSlabTest(s_t_utils.SynTest):
68
70
 
69
71
  testlist.extend(testgenr)
70
72
  dupslist.extend(dupsgenr)
73
+ nodupslist.extend(nodupsgenr)
71
74
 
72
75
  self.eq(testlist, (b'hehe', b'hoho'))
73
76
  self.eq(dupslist, (b'hehe', b'hehe', b'hoho'))
77
+ self.eq(nodupslist, (b'hehe', b'hoho'))
78
+
79
+ self.eq([b'hehe', b'hehe', b'hoho'], list(slab.scanKeysByPref(b'h', db=dupsdb)))
80
+ self.eq([b'hehe', b'hoho'], list(slab.scanKeysByPref(b'h', db=dupsdb, nodup=True)))
81
+
82
+ self.eq(3, await slab.countByPref(b'h', db=dupsdb))
74
83
 
75
84
  # now lets delete the key we're on
76
85
  testgenr = slab.scanKeys(db=testdb)
77
86
  dupsgenr = slab.scanKeys(db=testdb)
87
+ nodupsgenr = slab.scanKeys(db=testdb, nodup=True)
78
88
 
79
89
  testlist = [next(testgenr)]
80
90
  dupslist = [next(dupsgenr)]
91
+ nodupslist = [next(nodupsgenr)]
81
92
 
82
93
  slab.delete(b'hehe', db=testdb)
83
94
  for lkey, lval in slab.scanByDups(b'hehe', db=dupsdb):
@@ -87,9 +98,11 @@ class LmdbSlabTest(s_t_utils.SynTest):
87
98
 
88
99
  testlist.extend(testgenr)
89
100
  dupslist.extend(dupsgenr)
101
+ nodupslist.extend(nodupsgenr)
90
102
 
91
103
  self.eq(testlist, (b'hehe', b'hoho'))
92
104
  self.eq(dupslist, (b'hehe', b'hoho'))
105
+ self.eq(nodupslist, (b'hehe', b'hoho'))
93
106
 
94
107
  # by pref
95
108
  self.eq([b'hoho'], list(slab.scanKeysByPref(b'h', db=dupsdb)))
@@ -649,6 +662,42 @@ class LmdbSlabTest(s_t_utils.SynTest):
649
662
  self.eq((b'1', b'1'), next(it))
650
663
  self.raises(StopIteration, next, it)
651
664
 
665
+ async def test_lmdbslab_scanback(self):
666
+
667
+ with self.getTestDir() as dirn:
668
+
669
+ path = os.path.join(dirn, 'test.lmdb')
670
+
671
+ async with await s_lmdbslab.Slab.anit(path, map_size=100000, growsize=10000) as slab:
672
+
673
+ foodup = slab.initdb('foodup', dupsort=True)
674
+ foonodup = slab.initdb('foonodup', dupsort=False)
675
+
676
+ for db in (foodup, foonodup):
677
+ slab.put(b'\x01', b'foo', db=db)
678
+ slab.put(b'\x01\x01', b'bar', db=db)
679
+ slab.put(b'\x01\x03', b'baz', db=db)
680
+ slab.put(b'\x02', b'faz', db=db)
681
+
682
+ items = list(slab.scanByPrefBack(b'\x01', db=foonodup))
683
+ self.eq(items, (
684
+ (b'\x01\x03', b'baz'),
685
+ (b'\x01\x01', b'bar'),
686
+ (b'\x01', b'foo')
687
+ ))
688
+
689
+ self.eq((), list(slab.scanByPrefBack(b'\x00', db=foonodup)))
690
+
691
+ slab.put(b'\x01\x03', b'waz', db=foodup)
692
+
693
+ items = list(slab.scanByPrefBack(b'\x01', db=foodup))
694
+ self.eq(items, (
695
+ (b'\x01\x03', b'waz'),
696
+ (b'\x01\x03', b'baz'),
697
+ (b'\x01\x01', b'bar'),
698
+ (b'\x01', b'foo')
699
+ ))
700
+
652
701
  async def test_lmdbslab_count_empty(self):
653
702
 
654
703
  with self.getTestDir() as dirn:
@@ -628,6 +628,28 @@ class StormLibAuthTest(s_test.SynTest):
628
628
 
629
629
  self.nn(await core.tryUserPasswd('hehe', 'haha'))
630
630
 
631
+ hehe = await core.callStorm('''
632
+ $hehe = $lib.auth.users.byname(hehe)
633
+ $hehe.setArchived($lib.true)
634
+ return($hehe)
635
+ ''')
636
+ self.eq(True, hehe['archived'])
637
+ self.eq(True, hehe['locked'])
638
+
639
+ self.none(await core.tryUserPasswd('hehe', 'haha'))
640
+
641
+ hehe = await core.callStorm('''
642
+ $hehe = $lib.auth.users.byname(hehe)
643
+ $hehe.setArchived($lib.false)
644
+ return($hehe)
645
+ ''')
646
+ self.eq(True, hehe['locked'])
647
+ self.eq(False, hehe['archived'])
648
+ self.none(await core.tryUserPasswd('hehe', 'haha'))
649
+
650
+ await core.callStorm('$lib.auth.users.byname(hehe).setLocked($lib.false)')
651
+ self.nn(await core.tryUserPasswd('hehe', 'haha'))
652
+
631
653
  self.nn(await core.callStorm('''
632
654
  $visi = $lib.auth.users.byname(visi)
633
655
  if $( $visi.name = "visi" ) {
@@ -312,3 +312,50 @@ class StormCellTest(s_test.SynTest):
312
312
  self.len(1, await core.nodes('it:sec:cpe:v2_2', opts={'view': view0}))
313
313
  self.len(2, await core.nodes('it:sec:cpe:v2_2', opts={'view': view1}))
314
314
  self.len(1, await core.nodes('it:sec:cpe:v2_2', opts={'view': view2}))
315
+
316
+ async def test_stormfix_riskhasvuln(self):
317
+
318
+ async with self.getTestCore() as core:
319
+
320
+ view0 = core.getView().iden
321
+ view1 = await core.callStorm('return($lib.view.get().fork().iden)')
322
+ view2 = await core.callStorm('return($lib.view.add(($lib.layer.add().iden,)).iden)')
323
+
324
+ self.len(1, await core.nodes('''
325
+ [ risk:hasvuln=*
326
+ :vuln={[ risk:vuln=* ]}
327
+ :software={[ it:prod:softver=* :name=view0 ]}
328
+ ]
329
+ ''', opts={'view': view0}))
330
+
331
+ self.len(1, await core.nodes('''
332
+ risk:hasvuln
333
+ [ :software={[ it:prod:softver=* :name=view1 ]} ]
334
+ ''', opts={'view': view1}))
335
+
336
+ self.len(1, await core.nodes('''
337
+ [ risk:hasvuln=*
338
+ :vuln={[ risk:vuln=* ]}
339
+ :host={[ it:host=* :name=view2 ]}
340
+ ]
341
+ ''', opts={'view': view2}))
342
+
343
+ opts = {'vars': {'key': s_stormlib_cell.runtime_fixes_key, 'valu': (2, 0, 0)}}
344
+ await core.callStorm('$lib.globals.set($key, $valu)', opts)
345
+
346
+ msgs = await core.stormlist('$lib.cell.hotFixesCheck()')
347
+ printmesgs = [m[1]['mesg'] for m in msgs if m[0] == 'print']
348
+ self.isin('Would apply fix (3, 0, 0)', printmesgs[0])
349
+ self.eq('', printmesgs[1])
350
+ self.isin('Would apply fix (4, 0, 0)', printmesgs[2])
351
+ self.eq('', printmesgs[3])
352
+ self.isin('This hotfix should', printmesgs[4])
353
+ self.eq('', printmesgs[-1])
354
+
355
+ msgs = await core.stormlist('$lib.cell.hotFixesApply()')
356
+ self.stormIsInPrint('Applying hotfix (4, 0, 0) for [Create risk:vulnerable nodes', msgs)
357
+ self.stormIsInPrint('Applied hotfix (4, 0, 0)', msgs)
358
+
359
+ self.len(1, await core.nodes('risk:vulnerable -> it:prod:softver +:name=view0', opts={'view': view0}))
360
+ self.len(1, await core.nodes('risk:vulnerable -> it:prod:softver +:name=view1', opts={'view': view1}))
361
+ self.len(1, await core.nodes('risk:vulnerable -> it:host', opts={'view': view2}))
@@ -0,0 +1,25 @@
1
+ import os
2
+ import synapse.exc as s_exc
3
+ import synapse.tests.utils as s_test
4
+
5
+ class StormLibEnvTest(s_test.SynTest):
6
+
7
+ async def test_stormlib_env(self):
8
+
9
+ with self.setTstEnvars(SYN_STORM_ENV_WOOT='woot'):
10
+
11
+ async with self.getTestCore() as core:
12
+
13
+ self.eq('woot', await core.callStorm('return($lib.env.get(SYN_STORM_ENV_WOOT))'))
14
+ self.eq('hehe', await core.callStorm('return($lib.env.get(SYN_STORM_ENV_HEHE, default=hehe))'))
15
+
16
+ self.none(await core.callStorm('return($lib.env.get(SYN_STORM_ENV_HEHE))'))
17
+
18
+ visi = await core.auth.addUser('visi')
19
+
20
+ with self.raises(s_exc.AuthDeny):
21
+ opts = {'user': visi.iden}
22
+ await core.callStorm('return($lib.env.get(SYN_STORM_ENV_WOOT))', opts=opts)
23
+
24
+ with self.raises(s_exc.BadArg):
25
+ await core.callStorm('return($lib.env.get(USER))')
@@ -6758,10 +6758,12 @@ words\tword\twrd'''
6758
6758
  self.eq([], await core.callStorm(merging))
6759
6759
 
6760
6760
  # merge a view with a fork
6761
- fork00 = await core.getView().fork()
6761
+ mainview = core.getView()
6762
+ fork00 = await mainview.fork()
6762
6763
  midfork = core.getView(fork00['iden'])
6763
6764
 
6764
6765
  fork01 = await midfork.fork()
6766
+ fork01_iden = fork01['iden']
6765
6767
  self.true(midfork.hasKids())
6766
6768
 
6767
6769
  opts = {'view': midfork.iden}
@@ -6769,11 +6771,20 @@ words\tword\twrd'''
6769
6771
 
6770
6772
  self.eq([midfork.iden], await core.callStorm(merging))
6771
6773
 
6774
+ layridens = [lyr['iden'] for lyr in fork01['layers'] if lyr['iden'] != midfork.layers[0].iden]
6775
+ events = [
6776
+ {'event': 'view:setlayers', 'info': {'iden': fork01_iden, 'layers': layridens}},
6777
+ {'event': 'view:set', 'info': {'iden': fork01_iden, 'name': 'parent', 'valu': mainview.iden}}
6778
+ ]
6779
+ task = core.schedCoro(s_test.waitForBehold(core, events))
6780
+
6772
6781
  opts = {'view': midfork.iden, 'user': visi.iden}
6773
6782
  await core.callStorm('return($lib.view.get().setMergeVote())', opts=opts)
6774
6783
 
6775
6784
  self.true(await midfork.waitfini(timeout=12))
6776
6785
 
6786
+ await asyncio.wait_for(task, timeout=5)
6787
+
6777
6788
  self.eq([], await core.callStorm(merging))
6778
6789
 
6779
6790
  leaffork = core.getView(fork01['iden'])
@@ -1087,6 +1087,7 @@ class TypesTest(s_t_utils.SynTest):
1087
1087
  self.eq('hehe', enums.norm('hehe')[0])
1088
1088
  self.eq('haha', enums.norm('haha')[0])
1089
1089
  self.eq('zork', enums.norm('zork')[0])
1090
+ self.raises(s_exc.BadTypeValu, enums.norm, 1.23)
1090
1091
  self.raises(s_exc.BadTypeValu, enums.norm, 'zing')
1091
1092
 
1092
1093
  strsubs = model.type('str').clone({'regex': r'(?P<first>[ab]+)(?P<last>[zx]+)'})
@@ -769,21 +769,15 @@ class ViewTest(s_t_utils.SynTest):
769
769
 
770
770
  with self.raises(s_exc.AuthDeny) as cm:
771
771
  await core.nodes('$lib.view.get().merge()', opts=viewopts)
772
- self.eq('node.add.test:str', cm.exception.errinfo['perm'])
773
-
774
- await core.addUserRule(useriden, (True, ('node', 'add')), gateiden=baselayr)
775
-
776
- with self.raises(s_exc.AuthDeny) as cm:
777
- await core.nodes('$lib.view.get().merge()', opts=viewopts)
778
- self.eq('node.prop.set.test:str:.created', cm.exception.errinfo['perm'])
772
+ self.eq('node.prop.set.syn:tag.base', cm.exception.errinfo['perm'])
779
773
 
780
774
  await core.addUserRule(useriden, (True, ('node', 'prop', 'set')), gateiden=baselayr)
781
775
 
782
776
  with self.raises(s_exc.AuthDeny) as cm:
783
777
  await core.nodes('$lib.view.get().merge()', opts=viewopts)
784
- self.eq('node.edge.add.refs', cm.exception.errinfo['perm'])
778
+ self.eq('node.add.syn:tag', cm.exception.errinfo['perm'])
785
779
 
786
- await core.addUserRule(useriden, (True, ('node', 'edge', 'add')), gateiden=baselayr)
780
+ await core.addUserRule(useriden, (True, ('node', 'add')), gateiden=baselayr)
787
781
 
788
782
  with self.raises(s_exc.AuthDeny) as cm:
789
783
  await core.nodes('$lib.view.get().merge()', opts=viewopts)
@@ -797,6 +791,12 @@ class ViewTest(s_t_utils.SynTest):
797
791
 
798
792
  await core.addUserRule(useriden, (True, ('node', 'data', 'set')), gateiden=baselayr)
799
793
 
794
+ with self.raises(s_exc.AuthDeny) as cm:
795
+ await core.nodes('$lib.view.get().merge()', opts=viewopts)
796
+ self.eq('node.edge.add.refs', cm.exception.errinfo['perm'])
797
+
798
+ await core.addUserRule(useriden, (True, ('node', 'edge', 'add')), gateiden=baselayr)
799
+
800
800
  await core.nodes('$lib.view.get().merge()', opts=viewopts)
801
801
 
802
802
  nodes = await core.nodes('test:str=foo $node.data.load(foo)')
@@ -12,9 +12,10 @@ class BaseTest(s_t_utils.SynTest):
12
12
  nodes = await core.nodes('[ meta:timeline=* :title=Woot :summary=4LOLZ :type=lol.cats ]')
13
13
  self.len(1, nodes)
14
14
  nodes = await core.nodes('''
15
- [ meta:event=* :title=Zip :duration=1:30:00
15
+ [ meta:event=* :title=Zip :duration=1:30:00 :index=0
16
16
  :summary=Zop :time=20220321 :type=zip.zop :timeline={meta:timeline:title=Woot} ]''')
17
17
  self.len(1, nodes)
18
+ self.eq(0, nodes[0].get('index'))
18
19
  nodes = await core.nodes('''[ meta:event=* :title=Hehe :duration=2:00
19
20
  :summary=Haha :time=20220322 :type=hehe.haha :timeline={meta:timeline:title=Woot} ]''')
20
21
  self.len(1, nodes)
@@ -68,13 +69,14 @@ class BaseTest(s_t_utils.SynTest):
68
69
  self.len(1, nodes)
69
70
  self.eq(nodes[0].get('text'), 'yieldnote')
70
71
 
71
- nodes = await core.nodes('note.add --yield "nonodes"')
72
+ nodes = await core.nodes('note.add --yield "nonodes" | [ :replyto=* ]')
72
73
  self.len(1, nodes)
73
74
  self.eq(nodes[0].get('text'), 'nonodes')
74
75
  self.nn(nodes[0].get('created'))
75
76
  self.nn(nodes[0].get('updated'))
76
77
 
77
78
  self.len(0, await core.nodes('meta:note:text=nonodes -(about)> *'))
79
+ self.len(1, await core.nodes('meta:note:text=nonodes -> meta:note'))
78
80
 
79
81
  async def test_model_base_node(self):
80
82
 
@@ -348,7 +350,7 @@ class BaseTest(s_t_utils.SynTest):
348
350
 
349
351
  keep.append(node)
350
352
 
351
- self.len(0, keep)
353
+ self.len(0, keep, msg=[node.ndef[1] for node in keep])
352
354
  self.len(len(SYN_6315), skip)
353
355
 
354
356
  for edge in core.model.edges.values():
@@ -36,13 +36,17 @@ class EconTest(s_utils.SynTest):
36
36
  :paid:time=20180202
37
37
 
38
38
  :settled=20180205
39
+ :listing = *
39
40
  ]'''
40
41
 
41
42
  perc = (await core.nodes(text))[0]
42
43
 
44
+ self.nn(perc.get('listing'))
43
45
  self.eq('13.37', perc.get('price'))
44
46
  self.eq('usd', perc.get('currency'))
45
47
 
48
+ self.len(1, await core.nodes('econ:purchase -> biz:listing'))
49
+
46
50
  self.len(1, await core.nodes('econ:purchase:price=13.37'))
47
51
  self.len(1, await core.nodes('econ:purchase:price=13.370'))
48
52
  self.len(0, await core.nodes('econ:purchase:price=13.372'))
@@ -26,6 +26,7 @@ class FileTest(s_t_utils.SynTest):
26
26
  self.raises(s_exc.BadTypeValu, fbyts.norm, 'guid:0101')
27
27
  self.raises(s_exc.BadTypeValu, fbyts.norm, 'helo:moto')
28
28
  self.raises(s_exc.BadTypeValu, fbyts.norm, f'sha256:{s_common.guid()}')
29
+ self.raises(s_exc.BadTypeValu, fbyts.norm, 1.23)
29
30
 
30
31
  nodes = await core.nodes('''
31
32
  [ file:bytes=$byts