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.
- synapse/common.py +20 -0
- synapse/cortex.py +98 -6
- synapse/lib/agenda.py +13 -7
- synapse/lib/ast.py +9 -8
- synapse/lib/cache.py +2 -2
- synapse/lib/cell.py +7 -3
- synapse/lib/coro.py +12 -0
- synapse/lib/layer.py +124 -84
- synapse/lib/lmdbslab.py +34 -10
- synapse/lib/node.py +1 -1
- synapse/lib/slabseqn.py +11 -5
- synapse/lib/storm.py +7 -71
- synapse/lib/stormhttp.py +1 -1
- synapse/lib/stormlib/auth.py +19 -0
- synapse/lib/stormlib/cell.py +42 -4
- synapse/lib/stormlib/compression.py +6 -6
- synapse/lib/stormlib/env.py +50 -0
- synapse/lib/stormlib/gen.py +1 -1
- synapse/lib/stormlib/model.py +1 -1
- synapse/lib/stormtypes.py +35 -11
- synapse/lib/types.py +7 -7
- synapse/lib/version.py +2 -2
- synapse/lib/view.py +13 -13
- synapse/models/base.py +13 -0
- synapse/models/biz.py +14 -0
- synapse/models/economic.py +3 -0
- synapse/models/inet.py +474 -4
- synapse/models/infotech.py +163 -22
- synapse/models/orgs.py +17 -0
- synapse/models/risk.py +15 -1
- synapse/models/transport.py +1 -1
- synapse/tests/test_common.py +15 -0
- synapse/tests/test_cortex.py +9 -0
- synapse/tests/test_lib_ast.py +2 -1
- synapse/tests/test_lib_cell.py +1 -1
- synapse/tests/test_lib_layer.py +168 -59
- synapse/tests/test_lib_lmdbslab.py +49 -0
- synapse/tests/test_lib_stormlib_auth.py +22 -0
- synapse/tests/test_lib_stormlib_cell.py +47 -0
- synapse/tests/test_lib_stormlib_env.py +25 -0
- synapse/tests/test_lib_stormtypes.py +12 -1
- synapse/tests/test_lib_types.py +1 -0
- synapse/tests/test_lib_view.py +9 -9
- synapse/tests/test_model_base.py +5 -3
- synapse/tests/test_model_economic.py +4 -0
- synapse/tests/test_model_files.py +1 -0
- synapse/tests/test_model_inet.py +405 -1
- synapse/tests/test_model_infotech.py +135 -3
- synapse/tests/test_model_orgs.py +6 -0
- synapse/tests/test_model_risk.py +8 -0
- synapse/tests/test_tools_storm.py +46 -8
- synapse/tests/utils.py +30 -9
- synapse/tools/storm.py +14 -6
- {synapse-2.170.0.dist-info → synapse-2.172.0.dist-info}/METADATA +1 -1
- {synapse-2.170.0.dist-info → synapse-2.172.0.dist-info}/RECORD +58 -56
- {synapse-2.170.0.dist-info → synapse-2.172.0.dist-info}/WHEEL +1 -1
- {synapse-2.170.0.dist-info → synapse-2.172.0.dist-info}/LICENSE +0 -0
- {synapse-2.170.0.dist-info → synapse-2.172.0.dist-info}/top_level.txt +0 -0
synapse/tests/test_lib_layer.py
CHANGED
|
@@ -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
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1926
|
+
user = await core.auth.addUser('blackout@vertex.link')
|
|
1913
1927
|
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
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
|
-
|
|
1949
|
-
('node', 'prop', 'del', 'test:str:hehe'),
|
|
1934
|
+
layr = core.views[viewiden].layers[0]
|
|
1950
1935
|
|
|
1951
|
-
|
|
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
|
-
('
|
|
1957
|
-
('node', 'tag', 'del', 'foo'),
|
|
1938
|
+
await core.addTagProp('score', ('int', {}), {})
|
|
1958
1939
|
|
|
1959
|
-
('
|
|
1960
|
-
('node', 'tag', 'del', 'foo', 'bar'),
|
|
1940
|
+
await core.nodes('[ test:str=bar +#foo.bar ]', opts=opts)
|
|
1961
1941
|
|
|
1962
|
-
('
|
|
1963
|
-
|
|
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
|
-
('
|
|
1966
|
-
|
|
1967
|
-
|
|
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
|
-
|
|
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'])
|
synapse/tests/test_lib_types.py
CHANGED
|
@@ -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]+)'})
|
synapse/tests/test_lib_view.py
CHANGED
|
@@ -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.
|
|
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.
|
|
778
|
+
self.eq('node.add.syn:tag', cm.exception.errinfo['perm'])
|
|
785
779
|
|
|
786
|
-
await core.addUserRule(useriden, (True, ('node', '
|
|
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)')
|
synapse/tests/test_model_base.py
CHANGED
|
@@ -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
|