synapse 2.160.0__py311-none-any.whl → 2.162.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/cortex.py +12 -7
- synapse/daemon.py +7 -2
- synapse/lib/agenda.py +8 -2
- synapse/lib/aha.py +4 -4
- synapse/lib/ast.py +3 -3
- synapse/lib/cell.py +20 -1
- synapse/lib/hiveauth.py +1 -1
- synapse/lib/httpapi.py +5 -0
- synapse/lib/layer.py +21 -1
- synapse/lib/nexus.py +9 -5
- synapse/lib/node.py +3 -4
- synapse/lib/rstorm.py +16 -0
- synapse/lib/schemas.py +2 -1
- synapse/lib/snap.py +20 -11
- synapse/lib/storm.py +19 -3
- synapse/lib/stormhttp.py +14 -2
- synapse/lib/stormlib/easyperm.py +5 -2
- synapse/lib/stormlib/gen.py +119 -44
- synapse/lib/stormlib/stix.py +6 -3
- synapse/lib/stormlib/vault.py +32 -15
- synapse/lib/stormtypes.py +187 -21
- synapse/lib/trigger.py +2 -0
- synapse/lib/version.py +2 -2
- synapse/lib/view.py +42 -10
- synapse/models/inet.py +9 -0
- synapse/models/infotech.py +28 -26
- synapse/models/orgs.py +3 -0
- synapse/models/proj.py +9 -2
- synapse/models/risk.py +32 -0
- synapse/telepath.py +6 -2
- synapse/tests/files/rstorm/testsvc.py +8 -1
- synapse/tests/files/stormpkg/testpkg.yaml +4 -0
- synapse/tests/test_axon.py +4 -4
- synapse/tests/test_cortex.py +66 -8
- synapse/tests/test_daemon.py +19 -0
- synapse/tests/test_lib_agenda.py +8 -0
- synapse/tests/test_lib_aha.py +18 -3
- synapse/tests/test_lib_ast.py +38 -16
- synapse/tests/test_lib_cell.py +3 -0
- synapse/tests/test_lib_grammar.py +4 -4
- synapse/tests/test_lib_httpapi.py +59 -0
- synapse/tests/test_lib_nexus.py +63 -0
- synapse/tests/test_lib_rstorm.py +38 -2
- synapse/tests/test_lib_snap.py +10 -0
- synapse/tests/test_lib_storm.py +61 -20
- synapse/tests/test_lib_stormhttp.py +21 -21
- synapse/tests/test_lib_stormlib_auth.py +3 -3
- synapse/tests/test_lib_stormlib_cell.py +1 -1
- synapse/tests/test_lib_stormlib_cortex.py +50 -2
- synapse/tests/test_lib_stormlib_gen.py +77 -0
- synapse/tests/test_lib_stormlib_json.py +2 -2
- synapse/tests/test_lib_stormlib_macro.py +1 -1
- synapse/tests/test_lib_stormlib_modelext.py +37 -37
- synapse/tests/test_lib_stormlib_oauth.py +20 -20
- synapse/tests/test_lib_stormlib_stix.py +3 -1
- synapse/tests/test_lib_stormlib_vault.py +1 -1
- synapse/tests/test_lib_stormtypes.py +159 -47
- synapse/tests/test_lib_stormwhois.py +1 -1
- synapse/tests/test_lib_trigger.py +11 -11
- synapse/tests/test_lib_view.py +23 -1
- synapse/tests/test_model_crypto.py +1 -1
- synapse/tests/test_model_inet.py +6 -0
- synapse/tests/test_model_orgs.py +2 -1
- synapse/tests/test_model_proj.py +6 -0
- synapse/tests/test_model_risk.py +10 -0
- synapse/tests/test_tools_storm.py +1 -1
- {synapse-2.160.0.dist-info → synapse-2.162.0.dist-info}/METADATA +5 -3
- {synapse-2.160.0.dist-info → synapse-2.162.0.dist-info}/RECORD +71 -71
- {synapse-2.160.0.dist-info → synapse-2.162.0.dist-info}/LICENSE +0 -0
- {synapse-2.160.0.dist-info → synapse-2.162.0.dist-info}/WHEEL +0 -0
- {synapse-2.160.0.dist-info → synapse-2.162.0.dist-info}/top_level.txt +0 -0
|
@@ -1902,3 +1902,62 @@ class HttpApiTest(s_tests.SynTest):
|
|
|
1902
1902
|
self.eq('ok', retn.get('status'))
|
|
1903
1903
|
roles = set([r.get('name') for r in retn.get('result', {}).get('roles')])
|
|
1904
1904
|
self.eq(roles, {'all'})
|
|
1905
|
+
|
|
1906
|
+
async def test_http_sess_setvals(self):
|
|
1907
|
+
|
|
1908
|
+
class ValsHandler(s_httpapi.StreamHandler):
|
|
1909
|
+
|
|
1910
|
+
async def get(self):
|
|
1911
|
+
|
|
1912
|
+
iden = await self.useriden()
|
|
1913
|
+
if iden is None or self._web_sess is None: # pragma: no cover
|
|
1914
|
+
self.sendRestErr('NoSuchUser', 'User must login with a valid sess')
|
|
1915
|
+
return
|
|
1916
|
+
|
|
1917
|
+
throw = bool(int(self.request.headers.get('throw', 0)))
|
|
1918
|
+
|
|
1919
|
+
if throw:
|
|
1920
|
+
vals = {'hehe': 'haha', 'omg': {'hehe', 'haha'}}
|
|
1921
|
+
else:
|
|
1922
|
+
vals = {'now': s_common.now(), 'lastip': self.request.connection.context.remote_ip}
|
|
1923
|
+
|
|
1924
|
+
await self._web_sess.update(vals)
|
|
1925
|
+
|
|
1926
|
+
self.sendRestRetn({'iden': s_common.ehex(self._web_sess.iden), 'info': self._web_sess.info})
|
|
1927
|
+
return
|
|
1928
|
+
|
|
1929
|
+
async with self.getTestCore() as core:
|
|
1930
|
+
core.addHttpApi('/api/v1/vals', ValsHandler, {'cell': core})
|
|
1931
|
+
|
|
1932
|
+
host, port = await core.addHttpsPort(0, host='127.0.0.1')
|
|
1933
|
+
|
|
1934
|
+
root = await core.auth.getUserByName('root')
|
|
1935
|
+
await root.setPasswd('secret')
|
|
1936
|
+
|
|
1937
|
+
url = f'https://localhost:{port}/api/v1/vals'
|
|
1938
|
+
|
|
1939
|
+
async with self.getHttpSess() as sess:
|
|
1940
|
+
info = {'user': 'root', 'passwd': 'secret'}
|
|
1941
|
+
async with sess.post(f'https://localhost:{port}/api/v1/login', json=info) as resp:
|
|
1942
|
+
item = await resp.json()
|
|
1943
|
+
self.eq('ok', item.get('status'))
|
|
1944
|
+
|
|
1945
|
+
async with sess.get(url) as resp:
|
|
1946
|
+
self.eq(resp.status, 200)
|
|
1947
|
+
data = await resp.json()
|
|
1948
|
+
result = data.get('result')
|
|
1949
|
+
iden = s_common.uhex(result.get('iden'))
|
|
1950
|
+
info = result.get('info')
|
|
1951
|
+
self.isin('now', info)
|
|
1952
|
+
self.isin('lastip', info)
|
|
1953
|
+
self.isin('user', info)
|
|
1954
|
+
self.isin('username', info)
|
|
1955
|
+
|
|
1956
|
+
cell_sess = core.sessions.get(iden)
|
|
1957
|
+
self.eq(cell_sess.info, result.get('info'))
|
|
1958
|
+
|
|
1959
|
+
async with sess.get(url, headers={'throw': '1'}) as resp:
|
|
1960
|
+
self.eq(resp.status, 500)
|
|
1961
|
+
|
|
1962
|
+
# No change with the bad data
|
|
1963
|
+
self.eq(cell_sess.info, result.get('info'))
|
synapse/tests/test_lib_nexus.py
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
from unittest import mock
|
|
3
|
+
|
|
1
4
|
import synapse.exc as s_exc
|
|
2
5
|
import synapse.common as s_common
|
|
3
6
|
import synapse.cortex as s_cortex
|
|
4
7
|
|
|
5
8
|
import synapse.lib.cell as s_cell
|
|
6
9
|
import synapse.lib.nexus as s_nexus
|
|
10
|
+
import synapse.lib.hiveauth as s_hiveauth
|
|
7
11
|
|
|
8
12
|
import synapse.tests.utils as s_t_utils
|
|
9
13
|
|
|
@@ -201,3 +205,62 @@ class NexusTest(s_t_utils.SynTest):
|
|
|
201
205
|
nexsindx = await core.getNexsIndx()
|
|
202
206
|
layrindx = max([await layr.getEditIndx() for layr in core.layers.values()])
|
|
203
207
|
self.ge(nexsindx, layrindx)
|
|
208
|
+
|
|
209
|
+
async def test_nexus_safety(self):
|
|
210
|
+
|
|
211
|
+
orig = s_hiveauth.Auth.reqUser
|
|
212
|
+
async def slowReq(self, iden):
|
|
213
|
+
await asyncio.sleep(0.2)
|
|
214
|
+
return await orig(self, iden)
|
|
215
|
+
|
|
216
|
+
with self.getTestDir() as dirn:
|
|
217
|
+
async with self.getTestCore(dirn=dirn) as core:
|
|
218
|
+
|
|
219
|
+
with mock.patch('synapse.lib.hiveauth.Auth.reqUser', slowReq):
|
|
220
|
+
|
|
221
|
+
vcnt = len(core.views)
|
|
222
|
+
deflayr = (await core.getLayerDef()).get('iden')
|
|
223
|
+
|
|
224
|
+
strt = await core.nexsroot.index()
|
|
225
|
+
|
|
226
|
+
vdef = {'layers': (deflayr,), 'name': 'nextview'}
|
|
227
|
+
core.schedCoro(core.addView(vdef))
|
|
228
|
+
|
|
229
|
+
for x in range(10):
|
|
230
|
+
vdef = {'layers': (deflayr,), 'name': f'someview{x}'}
|
|
231
|
+
core.schedCoro(core.addView(vdef))
|
|
232
|
+
|
|
233
|
+
await asyncio.sleep(0.1)
|
|
234
|
+
|
|
235
|
+
async with self.getTestCore(dirn=dirn) as core:
|
|
236
|
+
|
|
237
|
+
viewadds = 0
|
|
238
|
+
async for item in core.nexsroot.nexslog.iter(strt):
|
|
239
|
+
if item[1][1] == 'view:add':
|
|
240
|
+
viewadds += 1
|
|
241
|
+
|
|
242
|
+
self.eq(1, viewadds)
|
|
243
|
+
self.len(vcnt + viewadds, core.views)
|
|
244
|
+
self.len(1, [v for v in core.views.values() if (await v.pack())['name'] == 'nextview'])
|
|
245
|
+
|
|
246
|
+
vcnt = len(core.views)
|
|
247
|
+
strt = await core.nexsroot.index()
|
|
248
|
+
|
|
249
|
+
with mock.patch('synapse.lib.hiveauth.Auth.reqUser', slowReq):
|
|
250
|
+
for x in range(3):
|
|
251
|
+
vdef = {'layers': (deflayr,), 'name': f'someview{x}'}
|
|
252
|
+
with self.raises(TimeoutError):
|
|
253
|
+
await s_common.wait_for(core.addView(vdef), 0.1)
|
|
254
|
+
|
|
255
|
+
await core.nexsroot.waitOffs(strt + 3, timeout=2)
|
|
256
|
+
|
|
257
|
+
viewadds = 0
|
|
258
|
+
async for item in core.nexsroot.nexslog.iter(strt):
|
|
259
|
+
if item[1][1] == 'view:add':
|
|
260
|
+
viewadds += 1
|
|
261
|
+
|
|
262
|
+
self.eq(3, viewadds)
|
|
263
|
+
self.len(vcnt + viewadds, core.views)
|
|
264
|
+
|
|
265
|
+
async with self.getTestCore(dirn=dirn) as core:
|
|
266
|
+
self.len(vcnt + viewadds, core.views)
|
synapse/tests/test_lib_rstorm.py
CHANGED
|
@@ -21,7 +21,7 @@ HI
|
|
|
21
21
|
.. storm-pre:: [ inet:ipv6=0 ]
|
|
22
22
|
.. storm-pkg:: synapse/tests/files/stormpkg/testpkg.yaml
|
|
23
23
|
.. storm:: --hide-props testpkgcmd foo
|
|
24
|
-
.. storm:: --hide-query $lib.print(secret)
|
|
24
|
+
.. storm:: --hide-query $lib.print(secret) $lib.print($lib.globals.get(testpkg))
|
|
25
25
|
.. storm:: --hide-query file:bytes
|
|
26
26
|
.. storm-svc:: synapse.tests.files.rstorm.testsvc.Testsvc test {"secret": "jupiter"}
|
|
27
27
|
.. storm:: testsvc.test
|
|
@@ -44,6 +44,7 @@ HI
|
|
|
44
44
|
::
|
|
45
45
|
|
|
46
46
|
secret
|
|
47
|
+
testpkg-done
|
|
47
48
|
|
|
48
49
|
::
|
|
49
50
|
|
|
@@ -53,6 +54,7 @@ HI
|
|
|
53
54
|
|
|
54
55
|
> testsvc.test
|
|
55
56
|
jupiter
|
|
57
|
+
testsvc-done
|
|
56
58
|
|
|
57
59
|
'''
|
|
58
60
|
|
|
@@ -259,6 +261,17 @@ HI
|
|
|
259
261
|
.. storm-cortex:: path.to.NewpCell
|
|
260
262
|
'''
|
|
261
263
|
|
|
264
|
+
pkg_onload_timeout = '''
|
|
265
|
+
.. storm-cortex:: default
|
|
266
|
+
.. storm-pre:: $lib.globals.set(onload_sleep, 2)
|
|
267
|
+
.. storm-pkg:: synapse/tests/files/stormpkg/testpkg.yaml
|
|
268
|
+
'''
|
|
269
|
+
|
|
270
|
+
svc_onload_timeout = '''
|
|
271
|
+
.. storm-cortex:: default
|
|
272
|
+
.. storm-pre:: $lib.globals.set(onload_sleep, 2)
|
|
273
|
+
.. storm-svc:: synapse.tests.files.rstorm.testsvc.Testsvc test {"secret": "jupiter"}
|
|
274
|
+
'''
|
|
262
275
|
|
|
263
276
|
async def get_rst_text(rstfile):
|
|
264
277
|
async with await s_rstorm.StormRst.anit(rstfile) as rstorm:
|
|
@@ -339,7 +352,7 @@ class RStormLibTest(s_test.SynTest):
|
|
|
339
352
|
self.isin('inet:ipv4=5.6.7.8', text) # one mock at a time
|
|
340
353
|
self.isin('it:dev:str=notjson', text) # one mock at a time
|
|
341
354
|
|
|
342
|
-
# multi
|
|
355
|
+
# multi request in 1 rstorm command
|
|
343
356
|
path = s_common.genpath(dirn, 'http_multi.rst')
|
|
344
357
|
with s_common.genfile(path) as fd:
|
|
345
358
|
fd.write(multi_rst_in_http.encode())
|
|
@@ -496,6 +509,29 @@ class RStormLibTest(s_test.SynTest):
|
|
|
496
509
|
with self.raises(s_exc.NoSuchCtor):
|
|
497
510
|
await get_rst_text(path)
|
|
498
511
|
|
|
512
|
+
# onload failures
|
|
513
|
+
|
|
514
|
+
try:
|
|
515
|
+
oldv = s_rstorm.ONLOAD_TIMEOUT
|
|
516
|
+
s_rstorm.ONLOAD_TIMEOUT = 0.1
|
|
517
|
+
|
|
518
|
+
path = s_common.genpath(dirn, 'pkg_onload_timeout.rst')
|
|
519
|
+
with s_common.genfile(path) as fd:
|
|
520
|
+
fd.write(pkg_onload_timeout.encode())
|
|
521
|
+
with self.raises(s_exc.SynErr) as ectx:
|
|
522
|
+
await get_rst_text(path)
|
|
523
|
+
self.eq('Package onload failed to run for testpkg', ectx.exception.errinfo['mesg'])
|
|
524
|
+
|
|
525
|
+
path = s_common.genpath(dirn, 'svc_onload_timeout.rst')
|
|
526
|
+
with s_common.genfile(path) as fd:
|
|
527
|
+
fd.write(svc_onload_timeout.encode())
|
|
528
|
+
with self.raises(s_exc.SynErr) as ectx:
|
|
529
|
+
await get_rst_text(path)
|
|
530
|
+
self.eq('Package onload failed to run for service test', ectx.exception.errinfo['mesg'])
|
|
531
|
+
|
|
532
|
+
finally:
|
|
533
|
+
s_rstorm.ONLOAD_TIMEOUT = oldv
|
|
534
|
+
|
|
499
535
|
async def test_rstorm_cli(self):
|
|
500
536
|
|
|
501
537
|
with self.getTestDir() as dirn:
|
synapse/tests/test_lib_snap.py
CHANGED
|
@@ -276,6 +276,16 @@ class SnapTest(s_t_utils.SynTest):
|
|
|
276
276
|
self.len(1, await alist(view1.eval('inet:ipv4 +:asn=42')))
|
|
277
277
|
self.len(1, await alist(view1.eval('inet:ipv4 +#woot')))
|
|
278
278
|
|
|
279
|
+
await view0.core.nodes('[ inet:ipv4=1.1.1.1 :asn=5 ]')
|
|
280
|
+
nodes = await view0.core.nodes('inet:ipv4=1.1.1.1 [ :asn=6 ]', opts={'view': view1.iden})
|
|
281
|
+
|
|
282
|
+
await view0.core.nodes('inet:ipv4=1.1.1.1 | delnode')
|
|
283
|
+
edits = await nodes[0]._getPropDelEdits('asn')
|
|
284
|
+
|
|
285
|
+
root = view0.core.auth.rootuser
|
|
286
|
+
async with await view1.snap(user=root) as snap:
|
|
287
|
+
await snap.applyNodeEdit((nodes[0].buid, 'inet:ipv4', edits))
|
|
288
|
+
|
|
279
289
|
async def test_cortex_lift_layers_bad_filter(self):
|
|
280
290
|
'''
|
|
281
291
|
Test a two layer cortex where a lift operation gives the wrong result
|
synapse/tests/test_lib_storm.py
CHANGED
|
@@ -735,9 +735,9 @@ class StormTest(s_t_utils.SynTest):
|
|
|
735
735
|
# check that the feed API uses toprim
|
|
736
736
|
email = await core.callStorm('''
|
|
737
737
|
$iden = $lib.guid()
|
|
738
|
-
$props =
|
|
738
|
+
$props = ({"email": "visi@vertex.link"})
|
|
739
739
|
$lib.feed.ingest(syn.nodes, (
|
|
740
|
-
( (ps:contact, $iden),
|
|
740
|
+
( (ps:contact, $iden), ({"props": $props})),
|
|
741
741
|
))
|
|
742
742
|
ps:contact=$iden
|
|
743
743
|
return(:email)
|
|
@@ -746,9 +746,9 @@ class StormTest(s_t_utils.SynTest):
|
|
|
746
746
|
|
|
747
747
|
email = await core.callStorm('''
|
|
748
748
|
$iden = $lib.guid()
|
|
749
|
-
$props =
|
|
749
|
+
$props = ({"email": "visi@vertex.link"})
|
|
750
750
|
yield $lib.feed.genr(syn.nodes, (
|
|
751
|
-
( (ps:contact, $iden),
|
|
751
|
+
( (ps:contact, $iden), ({"props": $props})),
|
|
752
752
|
))
|
|
753
753
|
return(:email)
|
|
754
754
|
''')
|
|
@@ -777,7 +777,7 @@ class StormTest(s_t_utils.SynTest):
|
|
|
777
777
|
# and again to test *not* creating it...
|
|
778
778
|
self.eq(0, await core.callStorm('return($lib.queue.gen(woot).size())'))
|
|
779
779
|
|
|
780
|
-
self.eq({'foo': 'bar'}, await core.callStorm('return(
|
|
780
|
+
self.eq({'foo': 'bar'}, await core.callStorm('return(({ "foo" : "bar" }))'))
|
|
781
781
|
|
|
782
782
|
ddef0 = await core.callStorm('return($lib.dmon.add(${ $lib.queue.gen(hehedmon).put(lolz) $lib.time.sleep(10) }, name=hehedmon))')
|
|
783
783
|
ddef1 = await core.callStorm('return($lib.dmon.get($iden))', opts={'vars': {'iden': ddef0.get('iden')}})
|
|
@@ -914,8 +914,17 @@ class StormTest(s_t_utils.SynTest):
|
|
|
914
914
|
with self.raises(s_exc.CantMergeView):
|
|
915
915
|
await core.callStorm('inet:ipv4=11.22.33.44 | merge')
|
|
916
916
|
|
|
917
|
-
# test printing a merge that the node was created in the top layer
|
|
917
|
+
# test printing a merge that the node was created in the top layer. We also need to make sure the layer
|
|
918
|
+
# is in a steady state for layer merge --diff tests.
|
|
919
|
+
|
|
920
|
+
real_layer = core.layers.get(layr) # type: s_layer.Layer
|
|
921
|
+
if real_layer.dirty:
|
|
922
|
+
waiter = real_layer.layrslab.waiter(1, 'commit')
|
|
923
|
+
await waiter.wait(timeout=12)
|
|
924
|
+
|
|
925
|
+
waiter = real_layer.layrslab.waiter(1, 'commit')
|
|
918
926
|
msgs = await core.stormlist('[ inet:fqdn=mvmnasde.com ] | merge', opts=opts)
|
|
927
|
+
|
|
919
928
|
self.stormIsInPrint('3496c02183961db4fbc179f0ceb5526347b37d8ff278279917b6eb6d39e1e272 inet:fqdn = mvmnasde.com', msgs)
|
|
920
929
|
self.stormIsInPrint('3496c02183961db4fbc179f0ceb5526347b37d8ff278279917b6eb6d39e1e272 inet:fqdn:host = mvmnasde', msgs)
|
|
921
930
|
self.stormIsInPrint('3496c02183961db4fbc179f0ceb5526347b37d8ff278279917b6eb6d39e1e272 inet:fqdn:domain = com', msgs)
|
|
@@ -923,6 +932,10 @@ class StormTest(s_t_utils.SynTest):
|
|
|
923
932
|
self.stormIsInPrint('3496c02183961db4fbc179f0ceb5526347b37d8ff278279917b6eb6d39e1e272 inet:fqdn:iszone = true', msgs)
|
|
924
933
|
self.stormIsInPrint('3496c02183961db4fbc179f0ceb5526347b37d8ff278279917b6eb6d39e1e272 inet:fqdn:zone = mvmnasde.com', msgs)
|
|
925
934
|
|
|
935
|
+
# Ensure that the layer has sync()'d to avoid getting data from
|
|
936
|
+
# dirty sodes in the merge --diff tests.
|
|
937
|
+
self.len(1, await waiter.wait(timeout=12))
|
|
938
|
+
|
|
926
939
|
# test that a user without perms can diff but not apply
|
|
927
940
|
await visi.addRule((True, ('view', 'read')))
|
|
928
941
|
|
|
@@ -1213,12 +1226,12 @@ class StormTest(s_t_utils.SynTest):
|
|
|
1213
1226
|
await core.nodes('cron.list')
|
|
1214
1227
|
|
|
1215
1228
|
self.eq({'foo': 'bar', 'baz': 'faz'}, await core.callStorm('''
|
|
1216
|
-
return(
|
|
1217
|
-
foo /* hehe */
|
|
1218
|
-
baz // hehe
|
|
1219
|
-
|
|
1220
|
-
faz // hehe
|
|
1221
|
-
))
|
|
1229
|
+
return(({ // do foo thing
|
|
1230
|
+
"foo" /* hehe */ : /* haha */ "bar", //lol
|
|
1231
|
+
"baz" // hehe
|
|
1232
|
+
: // haha
|
|
1233
|
+
"faz" // hehe
|
|
1234
|
+
}))
|
|
1222
1235
|
'''))
|
|
1223
1236
|
|
|
1224
1237
|
self.eq(('foo', 'bar', 'baz'), await core.callStorm('''
|
|
@@ -1792,7 +1805,7 @@ class StormTest(s_t_utils.SynTest):
|
|
|
1792
1805
|
|
|
1793
1806
|
# Headers as list of tuples, params as dict
|
|
1794
1807
|
q = '''
|
|
1795
|
-
$params
|
|
1808
|
+
$params=({"key": "valu", "foo": "bar"})
|
|
1796
1809
|
$hdr = (
|
|
1797
1810
|
("User-Agent", "my fav ua"),
|
|
1798
1811
|
)|
|
|
@@ -1923,6 +1936,32 @@ class StormTest(s_t_utils.SynTest):
|
|
|
1923
1936
|
await core.setUserLocked(visi.iden, False)
|
|
1924
1937
|
self.true(await stream.wait(2))
|
|
1925
1938
|
|
|
1939
|
+
async def test_storm_dmon_caching(self):
|
|
1940
|
+
|
|
1941
|
+
async with self.getTestCore() as core:
|
|
1942
|
+
|
|
1943
|
+
q = f'''
|
|
1944
|
+
$lib.dmon.add(${{
|
|
1945
|
+
for $x in $lib.range(2) {{
|
|
1946
|
+
inet:ipv4=1.2.3.4
|
|
1947
|
+
if $node {{
|
|
1948
|
+
$lib.queue.gen(foo).put($node.props.asn)
|
|
1949
|
+
$lib.queue.gen(bar).get(1)
|
|
1950
|
+
}}
|
|
1951
|
+
[ inet:ipv4=1.2.3.4 :asn=5 ]
|
|
1952
|
+
$lib.queue.gen(foo).put($node.props.asn)
|
|
1953
|
+
$lib.queue.gen(bar).get(0)
|
|
1954
|
+
}}
|
|
1955
|
+
| spin
|
|
1956
|
+
}}, name=foo)'''
|
|
1957
|
+
await core.nodes(q)
|
|
1958
|
+
|
|
1959
|
+
self.eq((0, 5), await core.callStorm('return($lib.queue.gen(foo).get(0))'))
|
|
1960
|
+
|
|
1961
|
+
await core.nodes('inet:ipv4=1.2.3.4 [ :asn=6 ] $lib.queue.gen(bar).put(0)')
|
|
1962
|
+
|
|
1963
|
+
self.eq((1, 6), await core.callStorm('return($lib.queue.gen(foo).get(1))'))
|
|
1964
|
+
|
|
1926
1965
|
async def test_storm_pipe(self):
|
|
1927
1966
|
|
|
1928
1967
|
async with self.getTestCore() as core:
|
|
@@ -2006,7 +2045,7 @@ class StormTest(s_t_utils.SynTest):
|
|
|
2006
2045
|
self.none(await core.callStorm('''
|
|
2007
2046
|
[ ps:contact = * ]
|
|
2008
2047
|
if $node {
|
|
2009
|
-
$foo =
|
|
2048
|
+
$foo = ({})
|
|
2010
2049
|
$foo.bar = $lib.undef
|
|
2011
2050
|
return($foo.bar)
|
|
2012
2051
|
}
|
|
@@ -2025,7 +2064,7 @@ class StormTest(s_t_utils.SynTest):
|
|
|
2025
2064
|
# runtsafe variants
|
|
2026
2065
|
self.eq(('foo', 'baz'), await core.callStorm('$foo = (foo, bar, baz) $foo.1 = $lib.undef return($foo)'))
|
|
2027
2066
|
self.eq(('foo', 'bar'), await core.callStorm('$foo = (foo, bar, baz) $foo."-1" = $lib.undef return($foo)'))
|
|
2028
|
-
self.none(await core.callStorm('$foo =
|
|
2067
|
+
self.none(await core.callStorm('$foo = ({}) $foo.bar = 10 $foo.bar = $lib.undef return($foo.bar)'))
|
|
2029
2068
|
self.eq(('woot',), await core.callStorm('''
|
|
2030
2069
|
$foo = (foo, bar, baz)
|
|
2031
2070
|
$foo.0 = $lib.undef
|
|
@@ -2079,7 +2118,9 @@ class StormTest(s_t_utils.SynTest):
|
|
|
2079
2118
|
msgs = await core.stormlist(f'pkg.load --ssl-noverify https://127.0.0.1:{port}/api/v1/pkgtest/notok')
|
|
2080
2119
|
self.stormIsInWarn('pkg.load got JSON error: FooBar', msgs)
|
|
2081
2120
|
|
|
2082
|
-
|
|
2121
|
+
replay = s_common.envbool('SYNDEV_NEXUS_REPLAY')
|
|
2122
|
+
nevents = 4 if replay else 2
|
|
2123
|
+
waiter = core.waiter(nevents, 'core:pkg:onload:complete')
|
|
2083
2124
|
|
|
2084
2125
|
with self.getAsyncLoggerStream('synapse.cortex') as stream:
|
|
2085
2126
|
msgs = await core.stormlist(f'pkg.load --ssl-noverify https://127.0.0.1:{port}/api/v1/pkgtest/yep')
|
|
@@ -2096,10 +2137,10 @@ class StormTest(s_t_utils.SynTest):
|
|
|
2096
2137
|
self.len(1, await core.nodes(f'ps:contact={cont}'))
|
|
2097
2138
|
|
|
2098
2139
|
evnts = await waiter.wait(timeout=2)
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
('core:pkg:onload:complete', {'pkg': 'testload'})
|
|
2102
|
-
|
|
2140
|
+
exp = []
|
|
2141
|
+
for _ in range(nevents):
|
|
2142
|
+
exp.append(('core:pkg:onload:complete', {'pkg': 'testload'}))
|
|
2143
|
+
self.eq(exp, evnts)
|
|
2103
2144
|
|
|
2104
2145
|
async def test_storm_tree(self):
|
|
2105
2146
|
|
|
@@ -64,8 +64,8 @@ class StormHttpTest(s_test.SynTest):
|
|
|
64
64
|
|
|
65
65
|
# Header and params as dict
|
|
66
66
|
q = '''
|
|
67
|
-
$params
|
|
68
|
-
$hdr =
|
|
67
|
+
$params=({"key": "valu", "foo": "bar", "baz": $lib.false})
|
|
68
|
+
$hdr = ({"true": $lib.true})
|
|
69
69
|
$hdr."User-Agent"="Storm HTTP Stuff"
|
|
70
70
|
$k = (0)
|
|
71
71
|
$hdr.$k="Why"
|
|
@@ -240,7 +240,7 @@ class StormHttpTest(s_test.SynTest):
|
|
|
240
240
|
opts = {'vars': {'url': url, 'noauth_url': noauth_url, 'newp_url': newp_url}}
|
|
241
241
|
|
|
242
242
|
q = '''
|
|
243
|
-
$params
|
|
243
|
+
$params=({"key": "valu", "foo": "bar"})
|
|
244
244
|
$hdr = (
|
|
245
245
|
("User-Agent", "Storm HTTP Stuff"),
|
|
246
246
|
)
|
|
@@ -256,7 +256,7 @@ class StormHttpTest(s_test.SynTest):
|
|
|
256
256
|
self.eq('1', headers.get('Head'))
|
|
257
257
|
|
|
258
258
|
q = '''
|
|
259
|
-
$params
|
|
259
|
+
$params=({"key": "valu", "redirect": 'http://test.newp/'})
|
|
260
260
|
$hdr = (
|
|
261
261
|
("User-Agent", "Storm HTTP Stuff"),
|
|
262
262
|
)
|
|
@@ -273,7 +273,7 @@ class StormHttpTest(s_test.SynTest):
|
|
|
273
273
|
self.eq('http://test.newp/', headers.get('Location'))
|
|
274
274
|
|
|
275
275
|
q = '''
|
|
276
|
-
$params
|
|
276
|
+
$params=({"key": "valu", "redirect": $noauth_url})
|
|
277
277
|
$hdr = (
|
|
278
278
|
("User-Agent", "Storm HTTP Stuff"),
|
|
279
279
|
)
|
|
@@ -286,7 +286,7 @@ class StormHttpTest(s_test.SynTest):
|
|
|
286
286
|
self.eq(b'', body)
|
|
287
287
|
|
|
288
288
|
q = '''
|
|
289
|
-
$params
|
|
289
|
+
$params=({"key": "valu", "redirect": $newp_url})
|
|
290
290
|
$hdr = (
|
|
291
291
|
("User-Agent", "Storm HTTP Stuff"),
|
|
292
292
|
)
|
|
@@ -299,7 +299,7 @@ class StormHttpTest(s_test.SynTest):
|
|
|
299
299
|
self.eq(b'', body)
|
|
300
300
|
|
|
301
301
|
q = '''
|
|
302
|
-
$params
|
|
302
|
+
$params=({"key": "valu", "redirect": "http://127.0.0.1/newp"})
|
|
303
303
|
$hdr = (
|
|
304
304
|
("User-Agent", "Storm HTTP Stuff"),
|
|
305
305
|
)
|
|
@@ -321,7 +321,7 @@ class StormHttpTest(s_test.SynTest):
|
|
|
321
321
|
url = f'https://root:root@127.0.0.1:{port}/api/v0/test'
|
|
322
322
|
opts = {'vars': {'url': url}}
|
|
323
323
|
q = '''
|
|
324
|
-
$params
|
|
324
|
+
$params=({"key": "valu", "foo": "bar"})
|
|
325
325
|
$hdr = (
|
|
326
326
|
("User-Agent", "Storm HTTP Stuff"),
|
|
327
327
|
)
|
|
@@ -337,7 +337,7 @@ class StormHttpTest(s_test.SynTest):
|
|
|
337
337
|
url = f'https://root:root@127.0.0.1:{port}/api/v0/test'
|
|
338
338
|
opts = {'vars': {'url': url, 'sleep': 1, 'timeout': 2}}
|
|
339
339
|
q = '''
|
|
340
|
-
$params
|
|
340
|
+
$params=({"key": "valu", "foo": "bar", "sleep": $sleep})
|
|
341
341
|
$hdr = (
|
|
342
342
|
("User-Agent", "Storm HTTP Stuff"),
|
|
343
343
|
)
|
|
@@ -351,7 +351,7 @@ class StormHttpTest(s_test.SynTest):
|
|
|
351
351
|
url = f'https://root:root@127.0.0.1:{port}/api/v0/test'
|
|
352
352
|
opts = {'vars': {'url': url, 'sleep': 10, 'timeout': 1}}
|
|
353
353
|
q = '''
|
|
354
|
-
$params
|
|
354
|
+
$params=({"key": "valu", "foo": "bar", "sleep": $sleep})
|
|
355
355
|
$hdr = (
|
|
356
356
|
("User-Agent", "Storm HTTP Stuff"),
|
|
357
357
|
)
|
|
@@ -374,7 +374,7 @@ class StormHttpTest(s_test.SynTest):
|
|
|
374
374
|
|
|
375
375
|
adduser = '''
|
|
376
376
|
$url = $lib.str.format("https://root:root@127.0.0.1:{port}/api/v1/auth/adduser", port=$port)
|
|
377
|
-
$user =
|
|
377
|
+
$user = ({"name": $name, "passwd": $passwd})
|
|
378
378
|
$post = $lib.inet.http.post($url, json=$user, ssl_verify=$(0)).json().result.name
|
|
379
379
|
$lib.print($post)
|
|
380
380
|
[ test:str=$post ]
|
|
@@ -387,7 +387,7 @@ class StormHttpTest(s_test.SynTest):
|
|
|
387
387
|
adduser = '''
|
|
388
388
|
$url = $lib.str.format("https://root:root@127.0.0.1:{port}/api/v1/auth/adduser", port=$port)
|
|
389
389
|
$user = $lib.str.format('{"name": "{name}", "passwd": "{passwd}"}', name=$name, passwd=$passwd)
|
|
390
|
-
$header =
|
|
390
|
+
$header = ({"Content-Type": "application/json"})
|
|
391
391
|
$post = $lib.inet.http.post($url, headers=$header, body=$user, ssl_verify=$(0)).json().result.name
|
|
392
392
|
[ test:str=$post ]
|
|
393
393
|
'''
|
|
@@ -400,7 +400,7 @@ class StormHttpTest(s_test.SynTest):
|
|
|
400
400
|
url = f'https://root:root@127.0.0.1:{port}/api/v0/test'
|
|
401
401
|
opts = {'vars': {'url': url, 'buf': b'1234'}}
|
|
402
402
|
q = '''
|
|
403
|
-
$params
|
|
403
|
+
$params=({"key": "valu", "foo": "bar"})
|
|
404
404
|
$resp = $lib.inet.http.post($url, params=$params, body=$buf, ssl_verify=$lib.false)
|
|
405
405
|
return ( $resp.json() )
|
|
406
406
|
'''
|
|
@@ -411,9 +411,9 @@ class StormHttpTest(s_test.SynTest):
|
|
|
411
411
|
|
|
412
412
|
q = '''
|
|
413
413
|
$fields=$lib.list(
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
414
|
+
({"name": "foo", "value": "bar"}),
|
|
415
|
+
({"name": "foo", "value": "bar2"}),
|
|
416
|
+
({"name": "baz", "value": "cool"})
|
|
417
417
|
)
|
|
418
418
|
$resp = $lib.inet.http.post($url, fields=$fields, ssl_verify=$lib.false)
|
|
419
419
|
return ( $resp.json() )
|
|
@@ -467,7 +467,7 @@ class StormHttpTest(s_test.SynTest):
|
|
|
467
467
|
text = '''
|
|
468
468
|
$url = $lib.str.format("https://root:root@127.0.0.1:{port}/api/v1/storm", port=$port)
|
|
469
469
|
$stormq = "($size, $sha2) = $lib.bytes.put($lib.base64.decode('dmVydGV4')) [ test:str = $sha2 ] [ test:int = $size ]"
|
|
470
|
-
$json =
|
|
470
|
+
$json = ({"query": $stormq})
|
|
471
471
|
$bytez = $lib.inet.http.post($url, json=$json, ssl_verify=$(0))
|
|
472
472
|
'''
|
|
473
473
|
opts = {'vars': {'port': port}}
|
|
@@ -482,7 +482,7 @@ class StormHttpTest(s_test.SynTest):
|
|
|
482
482
|
|
|
483
483
|
text = '''
|
|
484
484
|
$url = $lib.str.format("https://root:root@127.0.0.1:{port}/api/v1/storm", port=$port)
|
|
485
|
-
$json =
|
|
485
|
+
$json = ({"query": "test:str"})
|
|
486
486
|
$body = $json
|
|
487
487
|
$resp=$lib.inet.http.post($url, json=$json, body=$body, ssl_verify=$(0))
|
|
488
488
|
return ( ($resp.code, $resp.err) )
|
|
@@ -615,7 +615,7 @@ class StormHttpTest(s_test.SynTest):
|
|
|
615
615
|
$hdr = ( { "key": $lib.false } )
|
|
616
616
|
$url = $lib.str.format('https://127.0.0.1:{port}/test/ws', port=$port)
|
|
617
617
|
|
|
618
|
-
($ok, $sock) = $lib.inet.http.connect($url, headers=$hdr, params=$params)
|
|
618
|
+
($ok, $sock) = $lib.inet.http.connect($url, headers=$hdr, params=$params, ssl_verify=$lib.false)
|
|
619
619
|
if (not $ok) { $lib.exit($sock) }
|
|
620
620
|
|
|
621
621
|
($ok, $mesg) = $sock.rx()
|
|
@@ -631,7 +631,7 @@ class StormHttpTest(s_test.SynTest):
|
|
|
631
631
|
$hdr = ( { "key": $lib.false } )
|
|
632
632
|
$url = $lib.str.format('https://127.0.0.1:{port}/test/ws', port=$port)
|
|
633
633
|
|
|
634
|
-
($ok, $sock) = $lib.inet.http.connect($url, headers=$hdr)
|
|
634
|
+
($ok, $sock) = $lib.inet.http.connect($url, headers=$hdr, ssl_verify=$lib.false)
|
|
635
635
|
if (not $ok) { $lib.exit($sock) }
|
|
636
636
|
|
|
637
637
|
($ok, $mesg) = $sock.rx()
|
|
@@ -645,7 +645,7 @@ class StormHttpTest(s_test.SynTest):
|
|
|
645
645
|
query = '''
|
|
646
646
|
$url = $lib.str.format('https://127.0.0.1:{port}/test/ws', port=$port)
|
|
647
647
|
|
|
648
|
-
($ok, $sock) = $lib.inet.http.connect($url, proxy=$proxy)
|
|
648
|
+
($ok, $sock) = $lib.inet.http.connect($url, proxy=$proxy, ssl_verify=$lib.false)
|
|
649
649
|
if (not $ok) { $lib.exit($sock) }
|
|
650
650
|
|
|
651
651
|
($ok, $mesg) = $sock.rx()
|
|
@@ -420,8 +420,8 @@ class StormLibAuthTest(s_test.SynTest):
|
|
|
420
420
|
async with self.getTestCore() as core:
|
|
421
421
|
self.none(await core.callStorm('return($lib.user.json.get(foo))'))
|
|
422
422
|
self.none(await core.callStorm('return($lib.user.json.get(foo, prop=bar))'))
|
|
423
|
-
self.true(await core.callStorm('return($lib.user.json.set(hi,
|
|
424
|
-
self.true(await core.callStorm('return($lib.user.json.set(bye/bye,
|
|
423
|
+
self.true(await core.callStorm('return($lib.user.json.set(hi, ({"foo": "bar", "baz": "faz"})))'))
|
|
424
|
+
self.true(await core.callStorm('return($lib.user.json.set(bye/bye, ({"zip": "zop", "bip": "bop"})))'))
|
|
425
425
|
self.eq('bar', await core.callStorm('return($lib.user.json.get(hi, prop=foo))'))
|
|
426
426
|
self.eq({'foo': 'bar', 'baz': 'faz'}, await core.callStorm('return($lib.user.json.get(hi))'))
|
|
427
427
|
|
|
@@ -454,7 +454,7 @@ class StormLibAuthTest(s_test.SynTest):
|
|
|
454
454
|
await core.callStorm('return($lib.auth.users.byname(root).json.get(bye/bye, prop=zip))', opts=asvisi)
|
|
455
455
|
|
|
456
456
|
self.none(await core.callStorm('return($lib.user.json.get(hi))', opts=asvisi))
|
|
457
|
-
await core.callStorm('if (not $lib.user.json.has(hehe)) { $lib.user.json.set(hehe,
|
|
457
|
+
await core.callStorm('if (not $lib.user.json.has(hehe)) { $lib.user.json.set(hehe, ({})) }', opts=asvisi)
|
|
458
458
|
|
|
459
459
|
self.true(await core.callStorm('return($lib.user.json.set(hehe, haha, prop=foo))', opts=asvisi))
|
|
460
460
|
self.true(await core.callStorm('return($lib.user.json.set(hehe, haha, prop=foo))', opts=asvisi))
|