synapse 2.171.0__py311-none-any.whl → 2.173.1__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 (57) hide show
  1. synapse/common.py +20 -0
  2. synapse/cortex.py +86 -4
  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 +5 -0
  7. synapse/lib/coro.py +12 -0
  8. synapse/lib/hiveauth.py +81 -4
  9. synapse/lib/layer.py +124 -84
  10. synapse/lib/lmdbslab.py +17 -10
  11. synapse/lib/node.py +1 -1
  12. synapse/lib/slabseqn.py +11 -5
  13. synapse/lib/storm.py +7 -71
  14. synapse/lib/stormhttp.py +1 -1
  15. synapse/lib/stormlib/auth.py +19 -0
  16. synapse/lib/stormlib/cell.py +42 -4
  17. synapse/lib/stormlib/compression.py +6 -6
  18. synapse/lib/stormlib/env.py +50 -0
  19. synapse/lib/stormlib/gen.py +1 -1
  20. synapse/lib/stormlib/model.py +1 -1
  21. synapse/lib/stormtypes.py +35 -11
  22. synapse/lib/types.py +6 -6
  23. synapse/lib/version.py +2 -2
  24. synapse/lib/view.py +6 -12
  25. synapse/models/base.py +13 -0
  26. synapse/models/biz.py +14 -0
  27. synapse/models/economic.py +3 -0
  28. synapse/models/inet.py +474 -4
  29. synapse/models/infotech.py +163 -22
  30. synapse/models/orgs.py +22 -2
  31. synapse/models/person.py +5 -2
  32. synapse/models/planning.py +5 -0
  33. synapse/models/risk.py +15 -1
  34. synapse/models/transport.py +1 -1
  35. synapse/tests/test_common.py +15 -0
  36. synapse/tests/test_lib_ast.py +2 -1
  37. synapse/tests/test_lib_hiveauth.py +139 -1
  38. synapse/tests/test_lib_layer.py +207 -44
  39. synapse/tests/test_lib_lmdbslab.py +13 -0
  40. synapse/tests/test_lib_stormlib_auth.py +22 -0
  41. synapse/tests/test_lib_stormlib_cell.py +47 -0
  42. synapse/tests/test_lib_stormlib_env.py +25 -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_inet.py +405 -1
  47. synapse/tests/test_model_infotech.py +135 -3
  48. synapse/tests/test_model_orgs.py +14 -2
  49. synapse/tests/test_model_person.py +2 -0
  50. synapse/tests/test_model_risk.py +8 -0
  51. synapse/tests/test_tools_storm.py +46 -8
  52. synapse/tools/storm.py +14 -6
  53. {synapse-2.171.0.dist-info → synapse-2.173.1.dist-info}/METADATA +1 -1
  54. {synapse-2.171.0.dist-info → synapse-2.173.1.dist-info}/RECORD +57 -55
  55. {synapse-2.171.0.dist-info → synapse-2.173.1.dist-info}/WHEEL +1 -1
  56. {synapse-2.171.0.dist-info → synapse-2.173.1.dist-info}/LICENSE +0 -0
  57. {synapse-2.171.0.dist-info → synapse-2.173.1.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,218 @@ class LayerTest(s_t_utils.SynTest):
1897
1916
 
1898
1917
  async def test_layer_edit_perms(self):
1899
1918
 
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)
1922
+
1923
+ seen = set()
1924
+ def confirm(self, perm, default=None, gateiden=None):
1925
+ seen.add(perm)
1926
+ return True
1927
+
1928
+ def confirmPropSet(self, user, prop, layriden):
1929
+ seen.add(prop.setperms[0])
1930
+ seen.add(prop.setperms[1])
1931
+
1932
+ def confirmPropDel(self, user, prop, layriden):
1933
+ seen.add(prop.delperms[0])
1934
+ seen.add(prop.delperms[1])
1935
+
1936
+ with mock.patch('synapse.lib.spooled.Dict', Dict):
1937
+ async with self.getTestCore() as core:
1938
+
1939
+ user = await core.auth.addUser('blackout@vertex.link')
1940
+
1941
+ viewiden = await core.callStorm('''
1942
+ $lyr = $lib.layer.add()
1943
+ $view = $lib.view.add(($lyr.iden,))
1944
+ return($view.iden)
1945
+ ''')
1946
+
1947
+ layr = core.views[viewiden].layers[0]
1948
+
1949
+ opts = {'view': viewiden}
1950
+
1951
+ await core.addTagProp('score', ('int', {}), {})
1952
+
1953
+ await core.nodes('[ test:str=bar +#foo.bar ]', opts=opts)
1954
+
1955
+ await core.nodes('''
1956
+ [ test:str=foo
1957
+ :hehe=bar
1958
+ +#foo:score=2
1959
+ +#foo.bar.baz
1960
+ +#bar:score=2
1961
+ <(refs)+ { test:str=bar }
1962
+ ]
1963
+ $node.data.set(foo, bar)
1964
+ ''', opts=opts)
1965
+
1966
+ parent = core.view.layers[0]
1967
+
1968
+ seen.clear()
1969
+ with mock.patch.object(s_hiveauth.HiveUser, 'confirm', confirm):
1970
+ with mock.patch.object(s_cortex.Cortex, 'confirmPropSet', confirmPropSet):
1971
+ with mock.patch.object(s_cortex.Cortex, 'confirmPropDel', confirmPropDel):
1972
+ await layr.confirmLayerEditPerms(user, parent.iden)
1973
+
1974
+ self.eq(seen, {
1975
+ # Node add
1976
+ ('node', 'add', 'syn:tag'),
1977
+ ('node', 'add', 'test:str'),
1978
+
1979
+ # Old style prop set
1980
+ ('node', 'prop', 'set', 'test:str:hehe'),
1981
+ ('node', 'prop', 'set', 'test:str.created'),
1982
+
1983
+ ('node', 'prop', 'set', 'syn:tag:up'),
1984
+ ('node', 'prop', 'set', 'syn:tag:base'),
1985
+ ('node', 'prop', 'set', 'syn:tag:depth'),
1986
+ ('node', 'prop', 'set', 'syn:tag.created'),
1987
+
1988
+ # New style prop set
1989
+ ('node', 'prop', 'set', 'test:str', 'hehe'),
1990
+ ('node', 'prop', 'set', 'test:str', '.created'),
1991
+
1992
+ ('node', 'prop', 'set', 'syn:tag', 'up'),
1993
+ ('node', 'prop', 'set', 'syn:tag', 'base'),
1994
+ ('node', 'prop', 'set', 'syn:tag', 'depth'),
1995
+ ('node', 'prop', 'set', 'syn:tag', '.created'),
1996
+
1997
+ # Tag/tagprop add
1998
+ ('node', 'tag', 'add', 'foo'),
1999
+ ('node', 'tag', 'add', 'bar'),
2000
+ ('node', 'tag', 'add', 'foo', 'bar'),
2001
+ ('node', 'tag', 'add', 'foo', 'bar', 'baz'),
2002
+
2003
+ # Nodedata set
2004
+ ('node', 'data', 'set', 'foo'),
2005
+
2006
+ # Edge add
2007
+ ('node', 'edge', 'add', 'refs'),
2008
+ })
2009
+
2010
+ await core.nodes('''
2011
+ test:str=foo
2012
+ [ <(refs)- { test:str=bar } ]
2013
+ $node.data.pop(foo)
2014
+ | delnode
2015
+ ''', opts=opts)
2016
+
2017
+ seen.clear()
2018
+ with mock.patch.object(s_hiveauth.HiveUser, 'confirm', confirm):
2019
+ with mock.patch.object(s_cortex.Cortex, 'confirmPropSet', confirmPropSet):
2020
+ with mock.patch.object(s_cortex.Cortex, 'confirmPropDel', confirmPropDel):
2021
+ await layr.confirmLayerEditPerms(user, parent.iden)
2022
+
2023
+ self.eq(seen, {
2024
+ # Node add
2025
+ ('node', 'add', 'syn:tag'),
2026
+ ('node', 'add', 'test:str'),
2027
+
2028
+ # Old style prop set
2029
+ ('node', 'prop', 'set', 'test:str.created'),
2030
+
2031
+ ('node', 'prop', 'set', 'syn:tag:up'),
2032
+ ('node', 'prop', 'set', 'syn:tag:base'),
2033
+ ('node', 'prop', 'set', 'syn:tag:depth'),
2034
+ ('node', 'prop', 'set', 'syn:tag.created'),
2035
+
2036
+ # New style prop set
2037
+ ('node', 'prop', 'set', 'test:str', '.created'),
2038
+
2039
+ ('node', 'prop', 'set', 'syn:tag', 'up'),
2040
+ ('node', 'prop', 'set', 'syn:tag', 'base'),
2041
+ ('node', 'prop', 'set', 'syn:tag', 'depth'),
2042
+ ('node', 'prop', 'set', 'syn:tag', '.created'),
2043
+
2044
+ # Tag/tagprop add
2045
+ ('node', 'tag', 'add', 'foo', 'bar'),
2046
+ })
2047
+
2048
+ seen.clear()
2049
+ with mock.patch.object(s_hiveauth.HiveUser, 'confirm', confirm):
2050
+ with mock.patch.object(s_cortex.Cortex, 'confirmPropSet', confirmPropSet):
2051
+ with mock.patch.object(s_cortex.Cortex, 'confirmPropDel', confirmPropDel):
2052
+ await layr.confirmLayerEditPerms(user, layr.iden, delete=True)
2053
+
2054
+ self.eq(seen, {
2055
+ # Node del
2056
+ ('node', 'del', 'syn:tag'),
2057
+ ('node', 'del', 'test:str'),
2058
+
2059
+ # Old style prop del
2060
+ ('node', 'prop', 'del', 'test:str.created'),
2061
+
2062
+ ('node', 'prop', 'del', 'syn:tag:up'),
2063
+ ('node', 'prop', 'del', 'syn:tag:base'),
2064
+ ('node', 'prop', 'del', 'syn:tag:depth'),
2065
+ ('node', 'prop', 'del', 'syn:tag.created'),
2066
+
2067
+ # New style prop del
2068
+ ('node', 'prop', 'del', 'test:str', '.created'),
2069
+
2070
+ ('node', 'prop', 'del', 'syn:tag', 'up'),
2071
+ ('node', 'prop', 'del', 'syn:tag', 'base'),
2072
+ ('node', 'prop', 'del', 'syn:tag', 'depth'),
2073
+ ('node', 'prop', 'del', 'syn:tag', '.created'),
2074
+
2075
+ # Tag/tagprop del
2076
+ ('node', 'tag', 'del', 'foo', 'bar'),
2077
+ })
2078
+
1900
2079
  async with self.getTestCore() as core:
1901
2080
 
2081
+ user = await core.auth.addUser('blackout@vertex.link')
2082
+ await user.addRule((False, ('node', 'edge', 'add', 'haha')))
2083
+ await user.addRule((False, ('node', 'data', 'set', 'hehe')))
2084
+ await user.addRule((True, ('node',)))
2085
+
1902
2086
  viewiden = await core.callStorm('''
1903
2087
  $lyr = $lib.layer.add()
1904
2088
  $view = $lib.view.add(($lyr.iden,))
1905
2089
  return($view.iden)
1906
2090
  ''')
1907
2091
 
1908
- opts = {'view': viewiden}
2092
+ layr = core.views[viewiden].layers[0]
1909
2093
 
1910
- await core.addTagProp('score', ('int', {}), {})
2094
+ opts = {'view': viewiden}
1911
2095
 
1912
- await core.nodes('[ test:str=bar ]', opts=opts)
2096
+ await core.nodes('[ test:str=bar +#foo.bar ]', opts=opts)
1913
2097
 
1914
2098
  await core.nodes('''
1915
2099
  [ test:str=foo
1916
2100
  :hehe=bar
1917
- +#foo:score=2
1918
- +#foo.bar
2101
+ +#foo.bar.baz
1919
2102
  <(refs)+ { test:str=bar }
1920
2103
  ]
1921
2104
  $node.data.set(foo, bar)
1922
2105
  ''', opts=opts)
1923
2106
 
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'),
2107
+ parent = core.view.layers[0]
1947
2108
 
1948
- ('node', 'prop', 'set', 'test:str:hehe'),
1949
- ('node', 'prop', 'del', 'test:str:hehe'),
2109
+ seen.clear()
2110
+ with mock.patch.object(s_hiveauth.HiveUser, 'confirm', confirm):
2111
+ with mock.patch.object(s_cortex.Cortex, 'confirmPropSet', confirmPropSet):
2112
+ with mock.patch.object(s_cortex.Cortex, 'confirmPropDel', confirmPropDel):
2113
+ await layr.confirmLayerEditPerms(user, parent.iden)
1950
2114
 
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'),
2115
+ self.eq(seen, {
2116
+ # node.edge.add.* and node.data.set.* because of the deny rules
2117
+ ('node', 'edge', 'add', 'refs'),
2118
+ ('node', 'data', 'set', 'foo'),
2119
+ })
1955
2120
 
1956
- ('node', 'tag', 'add', 'foo'),
1957
- ('node', 'tag', 'del', 'foo'),
2121
+ await user.delRule((False, ('node', 'edge', 'add', 'haha')))
2122
+ await user.delRule((False, ('node', 'data', 'set', 'hehe')))
1958
2123
 
1959
- ('node', 'tag', 'add', 'foo', 'bar'),
1960
- ('node', 'tag', 'del', 'foo', 'bar'),
2124
+ seen.clear()
2125
+ with mock.patch.object(s_hiveauth.HiveUser, 'confirm', confirm):
2126
+ with mock.patch.object(s_cortex.Cortex, 'confirmPropSet', confirmPropSet):
2127
+ with mock.patch.object(s_cortex.Cortex, 'confirmPropDel', confirmPropDel):
2128
+ await layr.confirmLayerEditPerms(user, parent.iden)
1961
2129
 
1962
- ('node', 'data', 'set', 'foo'),
1963
- ('node', 'data', 'pop', 'foo'),
1964
-
1965
- ('node', 'edge', 'add', 'refs'),
1966
- ('node', 'edge', 'del', 'refs'),
1967
- }, set(perms))
2130
+ self.eq(seen, set())
1968
2131
 
1969
2132
  async def test_layer_v9(self):
1970
2133
  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)))
@@ -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))')
@@ -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'))