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.

Files changed (71) hide show
  1. synapse/cortex.py +12 -7
  2. synapse/daemon.py +7 -2
  3. synapse/lib/agenda.py +8 -2
  4. synapse/lib/aha.py +4 -4
  5. synapse/lib/ast.py +3 -3
  6. synapse/lib/cell.py +20 -1
  7. synapse/lib/hiveauth.py +1 -1
  8. synapse/lib/httpapi.py +5 -0
  9. synapse/lib/layer.py +21 -1
  10. synapse/lib/nexus.py +9 -5
  11. synapse/lib/node.py +3 -4
  12. synapse/lib/rstorm.py +16 -0
  13. synapse/lib/schemas.py +2 -1
  14. synapse/lib/snap.py +20 -11
  15. synapse/lib/storm.py +19 -3
  16. synapse/lib/stormhttp.py +14 -2
  17. synapse/lib/stormlib/easyperm.py +5 -2
  18. synapse/lib/stormlib/gen.py +119 -44
  19. synapse/lib/stormlib/stix.py +6 -3
  20. synapse/lib/stormlib/vault.py +32 -15
  21. synapse/lib/stormtypes.py +187 -21
  22. synapse/lib/trigger.py +2 -0
  23. synapse/lib/version.py +2 -2
  24. synapse/lib/view.py +42 -10
  25. synapse/models/inet.py +9 -0
  26. synapse/models/infotech.py +28 -26
  27. synapse/models/orgs.py +3 -0
  28. synapse/models/proj.py +9 -2
  29. synapse/models/risk.py +32 -0
  30. synapse/telepath.py +6 -2
  31. synapse/tests/files/rstorm/testsvc.py +8 -1
  32. synapse/tests/files/stormpkg/testpkg.yaml +4 -0
  33. synapse/tests/test_axon.py +4 -4
  34. synapse/tests/test_cortex.py +66 -8
  35. synapse/tests/test_daemon.py +19 -0
  36. synapse/tests/test_lib_agenda.py +8 -0
  37. synapse/tests/test_lib_aha.py +18 -3
  38. synapse/tests/test_lib_ast.py +38 -16
  39. synapse/tests/test_lib_cell.py +3 -0
  40. synapse/tests/test_lib_grammar.py +4 -4
  41. synapse/tests/test_lib_httpapi.py +59 -0
  42. synapse/tests/test_lib_nexus.py +63 -0
  43. synapse/tests/test_lib_rstorm.py +38 -2
  44. synapse/tests/test_lib_snap.py +10 -0
  45. synapse/tests/test_lib_storm.py +61 -20
  46. synapse/tests/test_lib_stormhttp.py +21 -21
  47. synapse/tests/test_lib_stormlib_auth.py +3 -3
  48. synapse/tests/test_lib_stormlib_cell.py +1 -1
  49. synapse/tests/test_lib_stormlib_cortex.py +50 -2
  50. synapse/tests/test_lib_stormlib_gen.py +77 -0
  51. synapse/tests/test_lib_stormlib_json.py +2 -2
  52. synapse/tests/test_lib_stormlib_macro.py +1 -1
  53. synapse/tests/test_lib_stormlib_modelext.py +37 -37
  54. synapse/tests/test_lib_stormlib_oauth.py +20 -20
  55. synapse/tests/test_lib_stormlib_stix.py +3 -1
  56. synapse/tests/test_lib_stormlib_vault.py +1 -1
  57. synapse/tests/test_lib_stormtypes.py +159 -47
  58. synapse/tests/test_lib_stormwhois.py +1 -1
  59. synapse/tests/test_lib_trigger.py +11 -11
  60. synapse/tests/test_lib_view.py +23 -1
  61. synapse/tests/test_model_crypto.py +1 -1
  62. synapse/tests/test_model_inet.py +6 -0
  63. synapse/tests/test_model_orgs.py +2 -1
  64. synapse/tests/test_model_proj.py +6 -0
  65. synapse/tests/test_model_risk.py +10 -0
  66. synapse/tests/test_tools_storm.py +1 -1
  67. {synapse-2.160.0.dist-info → synapse-2.162.0.dist-info}/METADATA +5 -3
  68. {synapse-2.160.0.dist-info → synapse-2.162.0.dist-info}/RECORD +71 -71
  69. {synapse-2.160.0.dist-info → synapse-2.162.0.dist-info}/LICENSE +0 -0
  70. {synapse-2.160.0.dist-info → synapse-2.162.0.dist-info}/WHEEL +0 -0
  71. {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'))
@@ -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)
@@ -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 reqest in 1 rstorm command
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:
@@ -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
@@ -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 = $lib.dict(email=visi@vertex.link)
738
+ $props = ({"email": "visi@vertex.link"})
739
739
  $lib.feed.ingest(syn.nodes, (
740
- ( (ps:contact, $iden), $lib.dict(props=$props)),
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 = $lib.dict(email=visi@vertex.link)
749
+ $props = ({"email": "visi@vertex.link"})
750
750
  yield $lib.feed.genr(syn.nodes, (
751
- ( (ps:contact, $iden), $lib.dict(props=$props)),
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($lib.dict( foo = bar ))'))
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($lib.dict( // do foo thing
1217
- foo /* hehe */ = /* haha */ bar, //lol
1218
- baz // hehe
1219
- = // haha
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=$lib.dict(key=valu, foo=bar)
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 = $lib.dict()
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 = $lib.dict() $foo.bar = 10 $foo.bar = $lib.undef return($foo.bar)'))
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
- waiter = core.waiter(2, 'core:pkg:onload:complete')
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
- self.eq([
2100
- ('core:pkg:onload:complete', {'pkg': 'testload'}),
2101
- ('core:pkg:onload:complete', {'pkg': 'testload'}),
2102
- ], evnts)
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=$lib.dict(key=valu, foo=bar, baz=$lib.false)
68
- $hdr = $lib.dict(true=$lib.true)
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=$lib.dict(key=valu, foo=bar)
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=$lib.dict(key=valu, redirect='http://test.newp/')
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=$lib.dict(key=valu, redirect=$noauth_url)
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=$lib.dict(key=valu, redirect=$newp_url)
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=$lib.dict(key=valu, redirect="http://127.0.0.1/newp")
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=$lib.dict(key=valu, foo=bar)
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=$lib.dict(key=valu, foo=bar, sleep=$sleep)
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=$lib.dict(key=valu, foo=bar, sleep=$sleep)
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 = $lib.dict(name=$name, passwd=$passwd)
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 = $lib.dict("Content-Type"="application/json")
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=$lib.dict(key=valu, foo=bar)
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
- $lib.dict(name=foo, value=bar),
415
- $lib.dict(name=foo, value=bar2),
416
- $lib.dict(name=baz, value=cool)
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 = $lib.dict(query=$stormq)
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 = $lib.dict(query="test:str")
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, $lib.dict(foo=bar, baz=faz)))'))
424
- self.true(await core.callStorm('return($lib.user.json.set(bye/bye, $lib.dict(zip=zop, bip=bop)))'))
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, $lib.dict()) }', opts=asvisi)
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))
@@ -187,7 +187,7 @@ class StormCellTest(s_test.SynTest):
187
187
  }
188
188
  $lib.exit('No view found for name={name}', name=$name)
189
189
  }
190
- $ret = $lib.dict()
190
+ $ret = ({})
191
191
  $ret.baseview=$get_view(default)
192
192
  $ret.fork1a=$get_view(base1a)
193
193
  $ret.fork2a=$get_view(base2a)