synapse 2.221.0__py311-none-any.whl → 2.222.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 +34 -14
- synapse/data/lark/storm.lark +9 -6
- synapse/lib/ast.py +8 -2
- synapse/lib/layer.py +18 -11
- synapse/lib/parser.py +1 -0
- synapse/lib/rstorm.py +19 -1
- synapse/lib/schemas.py +4 -0
- synapse/lib/stormlib/cortex.py +1 -1
- synapse/lib/stormtypes.py +18 -4
- synapse/lib/version.py +2 -2
- synapse/models/orgs.py +3 -0
- synapse/tests/test_lib_grammar.py +4 -4
- synapse/tests/test_lib_rstorm.py +55 -7
- synapse/tests/test_lib_storm.py +74 -1
- synapse/tests/test_lib_stormlib_auth.py +84 -0
- synapse/tests/test_lib_stormlib_cortex.py +1 -0
- synapse/tests/test_lib_stormtypes.py +25 -0
- synapse/tests/test_model_orgs.py +6 -1
- {synapse-2.221.0.dist-info → synapse-2.222.0.dist-info}/METADATA +1 -1
- {synapse-2.221.0.dist-info → synapse-2.222.0.dist-info}/RECORD +23 -23
- {synapse-2.221.0.dist-info → synapse-2.222.0.dist-info}/WHEEL +0 -0
- {synapse-2.221.0.dist-info → synapse-2.222.0.dist-info}/licenses/LICENSE +0 -0
- {synapse-2.221.0.dist-info → synapse-2.222.0.dist-info}/top_level.txt +0 -0
synapse/cortex.py
CHANGED
|
@@ -624,7 +624,8 @@ class CoreApi(s_cell.CellApi):
|
|
|
624
624
|
Returns:
|
|
625
625
|
AsyncIterator[Tuple(buid, valu)]
|
|
626
626
|
'''
|
|
627
|
-
self.user.
|
|
627
|
+
if not self.user.allowed(('layer', 'lift', layriden)):
|
|
628
|
+
self.user.confirm(('layer', 'read', layriden))
|
|
628
629
|
async for item in self.cell.iterFormRows(layriden, form, stortype=stortype, startvalu=startvalu):
|
|
629
630
|
yield item
|
|
630
631
|
|
|
@@ -642,7 +643,8 @@ class CoreApi(s_cell.CellApi):
|
|
|
642
643
|
Returns:
|
|
643
644
|
AsyncIterator[Tuple(buid, valu)]
|
|
644
645
|
'''
|
|
645
|
-
self.user.
|
|
646
|
+
if not self.user.allowed(('layer', 'lift', layriden)):
|
|
647
|
+
self.user.confirm(('layer', 'read', layriden))
|
|
646
648
|
async for item in self.cell.iterPropRows(layriden, form, prop, stortype=stortype, startvalu=startvalu):
|
|
647
649
|
yield item
|
|
648
650
|
|
|
@@ -659,7 +661,8 @@ class CoreApi(s_cell.CellApi):
|
|
|
659
661
|
Returns:
|
|
660
662
|
AsyncIterator[Tuple(buid, valu)]
|
|
661
663
|
'''
|
|
662
|
-
self.user.
|
|
664
|
+
if not self.user.allowed(('layer', 'lift', layriden)):
|
|
665
|
+
self.user.confirm(('layer', 'read', layriden))
|
|
663
666
|
async for item in self.cell.iterUnivRows(layriden, prop, stortype=stortype, startvalu=startvalu):
|
|
664
667
|
yield item
|
|
665
668
|
|
|
@@ -680,7 +683,8 @@ class CoreApi(s_cell.CellApi):
|
|
|
680
683
|
This yields (buid, (tagvalu, form)) instead of just buid, valu in order to allow resuming an interrupted
|
|
681
684
|
call by feeding the last value retrieved into starttupl
|
|
682
685
|
'''
|
|
683
|
-
self.user.
|
|
686
|
+
if not self.user.allowed(('layer', 'lift', layriden)):
|
|
687
|
+
self.user.confirm(('layer', 'read', layriden))
|
|
684
688
|
async for item in self.cell.iterTagRows(layriden, tag, form=form, starttupl=starttupl):
|
|
685
689
|
yield item
|
|
686
690
|
|
|
@@ -699,7 +703,8 @@ class CoreApi(s_cell.CellApi):
|
|
|
699
703
|
Returns:
|
|
700
704
|
AsyncIterator[Tuple(buid, valu)]
|
|
701
705
|
'''
|
|
702
|
-
self.user.
|
|
706
|
+
if not self.user.allowed(('layer', 'lift', layriden)):
|
|
707
|
+
self.user.confirm(('layer', 'read', layriden))
|
|
703
708
|
async for item in self.cell.iterTagPropRows(layriden, tag, prop, form=form, stortype=stortype,
|
|
704
709
|
startvalu=startvalu):
|
|
705
710
|
yield item
|
|
@@ -1366,6 +1371,30 @@ class Cortex(s_oauth.OAuthMixin, s_cell.Cell): # type: ignore
|
|
|
1366
1371
|
|
|
1367
1372
|
def _initCorePerms(self):
|
|
1368
1373
|
self._cortex_permdefs.extend((
|
|
1374
|
+
{'perm': ('axon', 'upload'), 'gate': 'cortex',
|
|
1375
|
+
'desc': 'Controls the ability to upload a file to the Axon.'},
|
|
1376
|
+
{'perm': ('axon', 'get'), 'gate': 'cortex',
|
|
1377
|
+
'desc': 'Controls the ability to retrieve a file from the Axon.'},
|
|
1378
|
+
{'perm': ('axon', 'has'), 'gate': 'cortex',
|
|
1379
|
+
'desc': 'Controls the ability to check if the Axon contains a file.'},
|
|
1380
|
+
{'perm': ('axon', 'del'), 'gate': 'cortex',
|
|
1381
|
+
'desc': 'Controls the ability to remove a file from the Axon.'},
|
|
1382
|
+
|
|
1383
|
+
{'perm': ('layer', 'add'), 'gate': 'cortex',
|
|
1384
|
+
'desc': 'Controls the ability to add Layers to the cortex.'},
|
|
1385
|
+
{'perm': ('layer', 'del'), 'gate': 'cortex',
|
|
1386
|
+
'desc': 'Controls the ability to remove Layers from the cortex.'},
|
|
1387
|
+
{'perm': ('layer', 'read'), 'gate': 'layer',
|
|
1388
|
+
'desc': 'Controls the ability to read/lift from a Layer.'},
|
|
1389
|
+
{'perm': ('layer', 'read', '<iden>'), 'gate': 'cortex',
|
|
1390
|
+
'desc': 'Controls the ability to read/lift from a specific Layer.'},
|
|
1391
|
+
{'perm': ('layer', 'set', '<name>'), 'gate': 'layer',
|
|
1392
|
+
'desc': 'Controls the ability to configure properties of a Layer.'},
|
|
1393
|
+
{'perm': ('layer', 'write'), 'gate': 'layer',
|
|
1394
|
+
'desc': 'Controls the ability to write to a Layer.'},
|
|
1395
|
+
{'perm': ('layer', 'write', '<iden>'), 'gate': 'cortex',
|
|
1396
|
+
'desc': 'Controls the ability to write to a specific Layer.'},
|
|
1397
|
+
|
|
1369
1398
|
{'perm': ('model', 'form', 'add'), 'gate': 'cortex',
|
|
1370
1399
|
'desc': 'Controls access to adding extended model forms.'},
|
|
1371
1400
|
{'perm': ('model', 'form', 'add', '<form>'), 'gate': 'cortex',
|
|
@@ -1519,15 +1548,6 @@ class Cortex(s_oauth.OAuthMixin, s_cell.Cell): # type: ignore
|
|
|
1519
1548
|
{'perm': ('view', 'set', '<setting>'), 'gate': 'view',
|
|
1520
1549
|
'desc': 'Controls access to change view settings.',
|
|
1521
1550
|
'ex': 'view.set.name'},
|
|
1522
|
-
|
|
1523
|
-
{'perm': ('axon', 'upload'), 'gate': 'cortex',
|
|
1524
|
-
'desc': 'Controls the ability to upload a file to the Axon.'},
|
|
1525
|
-
{'perm': ('axon', 'get'), 'gate': 'cortex',
|
|
1526
|
-
'desc': 'Controls the ability to retrieve a file from the Axon.'},
|
|
1527
|
-
{'perm': ('axon', 'has'), 'gate': 'cortex',
|
|
1528
|
-
'desc': 'Controls the ability to check if the Axon contains a file.'},
|
|
1529
|
-
{'perm': ('axon', 'del'), 'gate': 'cortex',
|
|
1530
|
-
'desc': 'Controls the ability to remove a file from the Axon.'},
|
|
1531
1551
|
))
|
|
1532
1552
|
for pdef in self._cortex_permdefs:
|
|
1533
1553
|
s_schemas.reqValidPermDef(pdef)
|
synapse/data/lark/storm.lark
CHANGED
|
@@ -238,10 +238,10 @@ liftreverse: _REVERSE "(" (liftformtag | liftpropby | liftprop | liftbyarray | l
|
|
|
238
238
|
|
|
239
239
|
_DEREF.3: /\*(?=\$)/
|
|
240
240
|
|
|
241
|
-
liftformtag: (
|
|
242
|
-
liftpropby: (
|
|
243
|
-
liftprop: (
|
|
244
|
-
liftbyarray: (
|
|
241
|
+
liftformtag: (PROPS | UNIVNAME | WILDPROPS | derefprops) tagname [_cmpr _valu]
|
|
242
|
+
liftpropby: (PROPS | EMBEDPROPS | UNIVNAME | derefprops) _cmpr _valu
|
|
243
|
+
liftprop: (PROPS | UNIVNAME | WILDPROPS | derefprops)
|
|
244
|
+
liftbyarray: (PROPS | EMBEDPROPS | UNIVNAME | derefprops) "*[" _safe_cmpr _valu "]"
|
|
245
245
|
lifttagtag: (_HASH | _HASHSPACE) tagname [_cmpr _valu]
|
|
246
246
|
liftbytag: (tagname | tagnamewithspace) [_cmpr _valu]
|
|
247
247
|
liftbytagprop: (tagprop | tagpropwithspace) [_cmpr _valu]
|
|
@@ -249,7 +249,7 @@ liftbyformtagprop: formtagprop [_cmpr _valu]
|
|
|
249
249
|
|
|
250
250
|
tagprop: tagname _COLONNOSPACE (BASEPROP | _varvalu)
|
|
251
251
|
tagpropwithspace: tagnamewithspace _COLONNOSPACE (BASEPROP | _varvalu) -> tagprop
|
|
252
|
-
formtagprop: (
|
|
252
|
+
formtagprop: (PROPS | UNIVNAME | WILDPROPS | derefprops) tagname _COLONNOSPACE (BASEPROP | _varvalu)
|
|
253
253
|
_COLONNOSPACE.2: /(?<!\s):/
|
|
254
254
|
|
|
255
255
|
_funcarg: (VARTOKN [EQNOSPACE _valu])
|
|
@@ -484,7 +484,7 @@ EMBEDPROPS.2: /[a-z_][a-z0-9_]*(:[a-z0-9_]+)+((\:\:|\:|\.)[a-z0-9_]+)*(?![:.a-z0
|
|
|
484
484
|
UNIVNAME.2: /(?<=^|[\s\|\{\(\[+=-])\.[a-z_][a-z0-9_]*([:.][a-z0-9_]+)*/
|
|
485
485
|
univprop: UNIVNAME | "." _varvalu
|
|
486
486
|
// A full property or a universal property
|
|
487
|
-
formname: PROPS |
|
|
487
|
+
formname: PROPS | derefprops
|
|
488
488
|
// A relative property
|
|
489
489
|
relprop: RELNAME | _COLONDOLLAR _varvaluatom
|
|
490
490
|
|
|
@@ -494,6 +494,9 @@ RELNAME: /(?<!\w):\.?[a-z_][a-z0-9_]*(?:(\:\:|\:|\.)[a-z_][a-z0-9_]*)*/
|
|
|
494
494
|
// Similar to PROPS but does not require a colon
|
|
495
495
|
BASEPROP: /[a-z_][a-z0-9_]*(?:(\:\:|\:|\.)[a-z_][a-z0-9_]*)*/
|
|
496
496
|
|
|
497
|
+
// Derefed variable for prop names
|
|
498
|
+
derefprops: _DEREF _varvalu
|
|
499
|
+
|
|
497
500
|
// The entry point for a $(...) expression. The initial dollar sign is now optional
|
|
498
501
|
_dollarexprs: "$"? dollaroper
|
|
499
502
|
|
synapse/lib/ast.py
CHANGED
|
@@ -2,7 +2,6 @@ import types
|
|
|
2
2
|
import asyncio
|
|
3
3
|
import decimal
|
|
4
4
|
import fnmatch
|
|
5
|
-
import hashlib
|
|
6
5
|
import logging
|
|
7
6
|
import binascii
|
|
8
7
|
import itertools
|
|
@@ -1833,7 +1832,7 @@ class LiftProp(LiftOper):
|
|
|
1833
1832
|
|
|
1834
1833
|
assert len(self.kids) == 1
|
|
1835
1834
|
|
|
1836
|
-
name = await
|
|
1835
|
+
name = await self.kids[0].compute(runt, path)
|
|
1837
1836
|
|
|
1838
1837
|
prop = runt.model.props.get(name)
|
|
1839
1838
|
if prop is not None:
|
|
@@ -4029,6 +4028,13 @@ class FormName(Value):
|
|
|
4029
4028
|
async def compute(self, runt, path):
|
|
4030
4029
|
return await self.kids[0].compute(runt, path)
|
|
4031
4030
|
|
|
4031
|
+
class DerefProps(Value):
|
|
4032
|
+
async def compute(self, runt, path):
|
|
4033
|
+
valu = await toprim(await self.kids[0].compute(runt, path))
|
|
4034
|
+
if (exc := await s_stormtypes.typeerr(valu, str)) is not None:
|
|
4035
|
+
raise self.kids[0].addExcInfo(exc)
|
|
4036
|
+
return valu
|
|
4037
|
+
|
|
4032
4038
|
class RelProp(PropName):
|
|
4033
4039
|
pass
|
|
4034
4040
|
|
synapse/lib/layer.py
CHANGED
|
@@ -119,6 +119,7 @@ class LayerApi(s_cell.CellApi):
|
|
|
119
119
|
|
|
120
120
|
self.layr = layr
|
|
121
121
|
self.liftperm = ('layer', 'lift', self.layr.iden)
|
|
122
|
+
self.readperm = ('layer', 'read', self.layr.iden)
|
|
122
123
|
self.writeperm = ('layer', 'write', self.layr.iden)
|
|
123
124
|
|
|
124
125
|
async def iterLayerNodeEdits(self):
|
|
@@ -126,7 +127,8 @@ class LayerApi(s_cell.CellApi):
|
|
|
126
127
|
Scan the full layer and yield artificial nodeedit sets.
|
|
127
128
|
'''
|
|
128
129
|
|
|
129
|
-
|
|
130
|
+
if not self.allowed(self.liftperm):
|
|
131
|
+
await self._reqUserAllowed(self.readperm)
|
|
130
132
|
async for item in self.layr.iterLayerNodeEdits():
|
|
131
133
|
yield item
|
|
132
134
|
await asyncio.sleep(0)
|
|
@@ -165,13 +167,15 @@ class LayerApi(s_cell.CellApi):
|
|
|
165
167
|
|
|
166
168
|
Once caught up with storage, yield them in realtime.
|
|
167
169
|
'''
|
|
168
|
-
|
|
170
|
+
if not self.allowed(self.liftperm):
|
|
171
|
+
await self._reqUserAllowed(self.readperm)
|
|
169
172
|
async for item in self.layr.syncNodeEdits(offs, wait=wait, reverse=reverse):
|
|
170
173
|
yield item
|
|
171
174
|
await asyncio.sleep(0)
|
|
172
175
|
|
|
173
176
|
async def syncNodeEdits2(self, offs, wait=True):
|
|
174
|
-
|
|
177
|
+
if not self.allowed(self.liftperm):
|
|
178
|
+
await self._reqUserAllowed(self.readperm)
|
|
175
179
|
async for item in self.layr.syncNodeEdits2(offs, wait=wait):
|
|
176
180
|
yield item
|
|
177
181
|
await asyncio.sleep(0)
|
|
@@ -180,18 +184,21 @@ class LayerApi(s_cell.CellApi):
|
|
|
180
184
|
'''
|
|
181
185
|
Returns what will be the *next* nodeedit log index.
|
|
182
186
|
'''
|
|
183
|
-
|
|
187
|
+
if not self.allowed(self.liftperm):
|
|
188
|
+
await self._reqUserAllowed(self.readperm)
|
|
184
189
|
return await self.layr.getEditIndx()
|
|
185
190
|
|
|
186
191
|
async def getEditSize(self):
|
|
187
192
|
'''
|
|
188
193
|
Return the total number of (edits, meta) pairs in the layer changelog.
|
|
189
194
|
'''
|
|
190
|
-
|
|
195
|
+
if not self.allowed(self.liftperm):
|
|
196
|
+
await self._reqUserAllowed(self.readperm)
|
|
191
197
|
return await self.layr.getEditSize()
|
|
192
198
|
|
|
193
199
|
async def getIden(self):
|
|
194
|
-
|
|
200
|
+
if not self.allowed(self.liftperm):
|
|
201
|
+
await self._reqUserAllowed(self.readperm)
|
|
195
202
|
return self.layr.iden
|
|
196
203
|
|
|
197
204
|
BUID_CACHE_SIZE = 10000
|
|
@@ -3350,7 +3357,7 @@ class Layer(s_nexus.Pusher):
|
|
|
3350
3357
|
nodeedits = [(buid, newp_formname, [set_edit])]
|
|
3351
3358
|
|
|
3352
3359
|
_, changes = await self.saveNodeEdits(nodeedits, meta)
|
|
3353
|
-
return
|
|
3360
|
+
return any(c[2] for c in changes)
|
|
3354
3361
|
|
|
3355
3362
|
async def delStorNode(self, buid, meta):
|
|
3356
3363
|
'''
|
|
@@ -3434,7 +3441,7 @@ class Layer(s_nexus.Pusher):
|
|
|
3434
3441
|
if changed: # pragma: no cover
|
|
3435
3442
|
return changed
|
|
3436
3443
|
|
|
3437
|
-
return
|
|
3444
|
+
return any(c[2] for c in changes)
|
|
3438
3445
|
|
|
3439
3446
|
for n2iden, edges in n2edges.items():
|
|
3440
3447
|
edits = [(EDIT_EDGE_DEL, edge, ()) for edge in edges]
|
|
@@ -3455,7 +3462,7 @@ class Layer(s_nexus.Pusher):
|
|
|
3455
3462
|
nodeedits = [(buid, oldp_formname, [del_edit])]
|
|
3456
3463
|
|
|
3457
3464
|
_, changes = await self.saveNodeEdits(nodeedits, meta)
|
|
3458
|
-
return
|
|
3465
|
+
return any(c[2] for c in changes)
|
|
3459
3466
|
|
|
3460
3467
|
async def delNodeData(self, buid, meta, name=None):
|
|
3461
3468
|
'''
|
|
@@ -3480,7 +3487,7 @@ class Layer(s_nexus.Pusher):
|
|
|
3480
3487
|
nodeedits = [(buid, sode.get('form'), edits)]
|
|
3481
3488
|
|
|
3482
3489
|
_, changes = await self.saveNodeEdits(nodeedits, meta)
|
|
3483
|
-
return
|
|
3490
|
+
return any(c[2] for c in changes)
|
|
3484
3491
|
|
|
3485
3492
|
async def delEdge(self, n1buid, verb, n2buid, meta):
|
|
3486
3493
|
sode = self._getStorNode(n1buid)
|
|
@@ -3497,7 +3504,7 @@ class Layer(s_nexus.Pusher):
|
|
|
3497
3504
|
nodeedits = [(n1buid, sode.get('form'), edits)]
|
|
3498
3505
|
|
|
3499
3506
|
_, changes = await self.saveNodeEdits(nodeedits, meta)
|
|
3500
|
-
return
|
|
3507
|
+
return any(c[2] for c in changes)
|
|
3501
3508
|
|
|
3502
3509
|
async def storNodeEdits(self, nodeedits, meta):
|
|
3503
3510
|
|
synapse/lib/parser.py
CHANGED
|
@@ -669,6 +669,7 @@ ruleClassMap = {
|
|
|
669
669
|
'condsetoper': s_ast.CondSetOper,
|
|
670
670
|
'condtrysetoper': lambda astinfo, kids: s_ast.CondSetOper(astinfo, kids, errok=True),
|
|
671
671
|
'condsubq': s_ast.SubqCond,
|
|
672
|
+
'derefprops': s_ast.DerefProps,
|
|
672
673
|
'dollarexpr': s_ast.DollarExpr,
|
|
673
674
|
'edgeaddn1': s_ast.EditEdgeAdd,
|
|
674
675
|
'edgedeln1': s_ast.EditEdgeDel,
|
synapse/lib/rstorm.py
CHANGED
|
@@ -344,6 +344,7 @@ class StormRst(s_base.Base):
|
|
|
344
344
|
'storm-cortex': self._handleStormCortex,
|
|
345
345
|
'storm-envvar': self._handleStormEnvVar,
|
|
346
346
|
'storm-expect': self._handleStormExpect,
|
|
347
|
+
'storm-python-path': self._handlePythonPath,
|
|
347
348
|
'storm-multiline': self._handleStormMultiline,
|
|
348
349
|
'storm-mock-http': self._handleStormMockHttp,
|
|
349
350
|
'storm-vcr-opts': self._handleStormVcrOpts,
|
|
@@ -374,6 +375,22 @@ class StormRst(s_base.Base):
|
|
|
374
375
|
raise s_exc.NoSuchName(mesg=f'The {directive} directive is not supported', directive=directive)
|
|
375
376
|
return handler
|
|
376
377
|
|
|
378
|
+
async def _handlePythonPath(self, text):
|
|
379
|
+
'''
|
|
380
|
+
Add the text to sys.path.
|
|
381
|
+
|
|
382
|
+
Args:
|
|
383
|
+
text: The path to add.
|
|
384
|
+
'''
|
|
385
|
+
if not os.path.isdir(text):
|
|
386
|
+
raise s_exc.NoSuchDir(mesg=f'The path {text} is not a directory', path=text)
|
|
387
|
+
if text not in sys.path:
|
|
388
|
+
logger.debug(f'Inserting {text} into sys.path')
|
|
389
|
+
sys.path.insert(0, text)
|
|
390
|
+
def onfini():
|
|
391
|
+
sys.path.remove(text)
|
|
392
|
+
self.onfini(onfini)
|
|
393
|
+
|
|
377
394
|
async def _handleStorm(self, text):
|
|
378
395
|
'''
|
|
379
396
|
Run a Storm command and generate text from the output.
|
|
@@ -618,7 +635,8 @@ class StormRst(s_base.Base):
|
|
|
618
635
|
query = query.replace('--fail-ok', '')
|
|
619
636
|
query = query.strip()
|
|
620
637
|
|
|
621
|
-
env =
|
|
638
|
+
env = dict(os.environ)
|
|
639
|
+
env.update(self.context.get('shell-env', {}))
|
|
622
640
|
|
|
623
641
|
stderr = None
|
|
624
642
|
if opts.include_stderr:
|
synapse/lib/schemas.py
CHANGED
|
@@ -816,6 +816,10 @@ _reqValidPkgdefSchema = {
|
|
|
816
816
|
'items': {'type': 'array',
|
|
817
817
|
'items': {'type': 'string'}},
|
|
818
818
|
},
|
|
819
|
+
'asroot:ondeny:import': {
|
|
820
|
+
'type': 'string',
|
|
821
|
+
'enum': ['allow', 'warn', 'deny'],
|
|
822
|
+
},
|
|
819
823
|
},
|
|
820
824
|
'additionalProperties': True,
|
|
821
825
|
'required': ['name', 'storm']
|
synapse/lib/stormlib/cortex.py
CHANGED
|
@@ -1029,7 +1029,7 @@ class HttpReq(s_stormtypes.StormType):
|
|
|
1029
1029
|
if not isinstance(body, bytes):
|
|
1030
1030
|
body = await s_stormtypes.toprim(body)
|
|
1031
1031
|
body = s_json.dumps(body)
|
|
1032
|
-
headers['Content-Type'] = 'application/json; charset=utf8
|
|
1032
|
+
headers['Content-Type'] = 'application/json; charset=utf8'
|
|
1033
1033
|
headers['Content-Length'] = len(body)
|
|
1034
1034
|
|
|
1035
1035
|
await self._methSendCode(code)
|
synapse/lib/stormtypes.py
CHANGED
|
@@ -1595,8 +1595,16 @@ class LibBase(Lib):
|
|
|
1595
1595
|
|
|
1596
1596
|
if not asroot:
|
|
1597
1597
|
permtext = ' or '.join(('.'.join(p) for p in rootperms))
|
|
1598
|
-
|
|
1599
|
-
|
|
1598
|
+
|
|
1599
|
+
match mdef.get('asroot:ondeny:import', 'deny'):
|
|
1600
|
+
case 'allow':
|
|
1601
|
+
pass
|
|
1602
|
+
case 'warn':
|
|
1603
|
+
mesg = f'Module ({name}) permissions will not be elevated. Missing permission: {permtext}.'
|
|
1604
|
+
await self.runt.warnonce(mesg, log=False)
|
|
1605
|
+
case _:
|
|
1606
|
+
mesg = f'Module ({name}) requires permission: {permtext}'
|
|
1607
|
+
raise s_exc.AuthDeny(mesg=mesg, user=self.runt.user.iden, username=self.runt.user.name)
|
|
1600
1608
|
|
|
1601
1609
|
else:
|
|
1602
1610
|
perm = ('storm', 'asroot', 'mod') + tuple(name.split('.'))
|
|
@@ -7837,7 +7845,8 @@ class Layer(Prim):
|
|
|
7837
7845
|
|
|
7838
7846
|
layr = self.runt.snap.core.reqLayer(self.valu.get('iden'))
|
|
7839
7847
|
|
|
7840
|
-
self.runt.
|
|
7848
|
+
if not self.runt.allowed(('layer', 'edits', 'read'), gateiden=layr.iden):
|
|
7849
|
+
self.runt.confirm(('layer', 'read'), gateiden=layr.iden)
|
|
7841
7850
|
|
|
7842
7851
|
if reverse:
|
|
7843
7852
|
wait = False
|
|
@@ -10439,5 +10448,10 @@ async def totype(valu, basetypes=False) -> str:
|
|
|
10439
10448
|
async def typeerr(name, reqt):
|
|
10440
10449
|
if not isinstance(name, reqt):
|
|
10441
10450
|
styp = await totype(name, basetypes=True)
|
|
10442
|
-
|
|
10451
|
+
|
|
10452
|
+
reqtname = str(reqt)
|
|
10453
|
+
if (clsname := getattr(reqt, '__name__')):
|
|
10454
|
+
reqtname = clsname
|
|
10455
|
+
|
|
10456
|
+
mesg = f"Expected value of type '{reqtname}', got '{styp}' with value {name}."
|
|
10443
10457
|
return s_exc.StormRuntimeError(mesg=mesg, name=name, type=styp)
|
synapse/lib/version.py
CHANGED
|
@@ -223,6 +223,6 @@ def reqVersion(valu, reqver,
|
|
|
223
223
|
##############################################################################
|
|
224
224
|
# The following are touched during the release process by bumpversion.
|
|
225
225
|
# Do not modify these directly.
|
|
226
|
-
version = (2,
|
|
226
|
+
version = (2, 222, 0)
|
|
227
227
|
verstring = '.'.join([str(x) for x in version])
|
|
228
|
-
commit = '
|
|
228
|
+
commit = '1ab0342cfb8272e9f9a629f1755b0e33b78b78b3'
|
synapse/models/orgs.py
CHANGED
|
@@ -729,6 +729,9 @@ class OuModule(s_module.CoreModule):
|
|
|
729
729
|
|
|
730
730
|
('ext:id', ('str', {'strip': True}), {
|
|
731
731
|
'doc': 'An external identifier for the technique.'}),
|
|
732
|
+
|
|
733
|
+
('parent', ('ou:technique', {}), {
|
|
734
|
+
'doc': 'The parent technique for the technique.'}),
|
|
732
735
|
)),
|
|
733
736
|
('ou:technique:taxonomy', {}, ()),
|
|
734
737
|
('ou:orgtype', {}, ()),
|
|
@@ -1267,7 +1267,7 @@ _ParseResults = [
|
|
|
1267
1267
|
'Query: [EditTagPropDel: [TagProp: [TagName: [Const: baz, Const: faz], Const: lol]]]',
|
|
1268
1268
|
'Query: [EditTagPropSet: [TagProp: [TagName: [Const: baz, Const: faz], Const: lol], Const: =, Const: 20]]',
|
|
1269
1269
|
'Query: [LiftTagProp: [TagProp: [TagName: [Const: tag], Const: somegeoloctypebecauseihatelife], Const: near=, List: [VarValue: [Const: lat], VarValue: [Const: long]]]]',
|
|
1270
|
-
'Query: [LiftPropBy: [VarValue: [Const: foo], Const: near=, Const: 20]]',
|
|
1270
|
+
'Query: [LiftPropBy: [DerefProps: [VarValue: [Const: foo]], Const: near=, Const: 20]]',
|
|
1271
1271
|
'Query: [EditNodeAdd: [FormName: [Const: test:str], Const: =, VarDeref: [VarDeref: [VarDeref: [VarDeref: [VarDeref: [VarValue: [Const: foo], Const: woot], Const: var], VarValue: [Const: bar]], Const: mar], VarValue: [Const: car]]]]',
|
|
1272
1272
|
'Query: [LiftPropBy: [Const: test:str, Const: =, VarDeref: [VarDeref: [VarValue: [Const: foo], VarValue: [Const: space key]], Const: subkey]]]',
|
|
1273
1273
|
'Query: [ForLoop: [Const: iterkey, VarDeref: [VarDeref: [VarValue: [Const: foo], VarValue: [Const: bar key]], VarValue: [Const: biz key]], SubQuery: [Query: [LiftPropBy: [Const: inet:ipv4, Const: =, VarDeref: [VarDeref: [VarDeref: [VarValue: [Const: foo], VarValue: [Const: bar key]], VarValue: [Const: biz key]], VarValue: [Const: iterkey]]]]]]]',
|
|
@@ -1337,11 +1337,11 @@ _ParseResults = [
|
|
|
1337
1337
|
'Query: [VarEvalOper: [FuncCall: [VarDeref: [VarValue: [Const: lib], Const: print], CallArgs: [DollarExpr: [FuncCall: [VarDeref: [DollarExpr: [RelPropValue: [Const: prop]], Const: upper], CallArgs: [], CallKwargs: []]]], CallKwargs: []]]]',
|
|
1338
1338
|
'Query: [VarEvalOper: [FuncCall: [VarDeref: [VarValue: [Const: lib], Const: print], CallArgs: [VarDeref: [DollarExpr: [ExprDict: [Const: unicode, Const: 1]], DollarExpr: [RelPropValue: [Const: prop]]]], CallKwargs: []]]]',
|
|
1339
1339
|
'Query: [VarEvalOper: [FuncCall: [VarDeref: [VarValue: [Const: lib], Const: print], CallArgs: [DollarExpr: [ExprNode: [VarDeref: [DollarExpr: [ExprDict: [Const: unicode, Const: 1]], DollarExpr: [RelPropValue: [Const: prop]]], Const: +, DollarExpr: [Const: 2]]]], CallKwargs: []]]]',
|
|
1340
|
-
'Query: [LiftFormTag: [VarValue: [Const: form], TagName: [VarValue: [Const: tag]]]]',
|
|
1341
|
-
'Query: [LiftFormTagProp: [FormTagProp: [VarValue: [Const: form], TagName: [VarValue: [Const: tag]], VarValue: [Const: prop]]]]',
|
|
1340
|
+
'Query: [LiftFormTag: [DerefProps: [VarValue: [Const: form]], TagName: [VarValue: [Const: tag]]]]',
|
|
1341
|
+
'Query: [LiftFormTagProp: [FormTagProp: [DerefProps: [VarValue: [Const: form]], TagName: [VarValue: [Const: tag]], VarValue: [Const: prop]]]]',
|
|
1342
1342
|
'Query: [LiftProp: [Const: inet:ipv4]]',
|
|
1343
1343
|
'Query: [LiftPropBy: [Const: inet:ipv4, Const: =, Const: 1.2.3.4]]',
|
|
1344
|
-
'Query: [LiftPropBy: [VarValue: [Const: form], Const: =, VarValue: [Const: valu]]]',
|
|
1344
|
+
'Query: [LiftPropBy: [DerefProps: [VarValue: [Const: form]], Const: =, VarValue: [Const: valu]]]',
|
|
1345
1345
|
'Query: [LiftPropBy: [Const: test:str, Const: =, Const: foobar], FormPivot: [Const: inet:dns*], isjoin=False]',
|
|
1346
1346
|
'Query: [LiftPropBy: [Const: test:str, Const: =, Const: foobar], FormPivot: [Const: inet:dns:*], isjoin=False]',
|
|
1347
1347
|
'Query: [LiftPropBy: [Const: test:str, Const: =, Const: foobar], FormPivot: [List: [Const: meta:source, Const: inet:dns:a]], isjoin=False]',
|
synapse/tests/test_lib_rstorm.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import os
|
|
2
|
+
import sys
|
|
2
3
|
|
|
3
4
|
import vcr
|
|
4
5
|
|
|
@@ -226,10 +227,10 @@ Bye!
|
|
|
226
227
|
shell_input00 = '''
|
|
227
228
|
Shell with environment variable.
|
|
228
229
|
|
|
229
|
-
.. shell-env::
|
|
230
|
-
.. shell:: python3 -c "import os; print('
|
|
230
|
+
.. shell-env:: SYN_HEHE_HAHA=BEEP SYN_FOO=BAR
|
|
231
|
+
.. shell:: python3 -c "import os; print('HEHE_HAHA', os.environ.get('SYN_HEHE_HAHA')); print('FOO', os.environ.get('SYN_FOO'))"
|
|
231
232
|
.. shell-env::
|
|
232
|
-
.. shell:: python3 -c "import os; print('
|
|
233
|
+
.. shell:: python3 -c "import os; print('HEHE_HAHA', os.environ.get('SYN_HEHE_HAHA')); print('FOO', os.environ.get('SYN_FOO'))"
|
|
233
234
|
'''
|
|
234
235
|
|
|
235
236
|
shell_output00 = '''
|
|
@@ -237,17 +238,17 @@ Shell with environment variable.
|
|
|
237
238
|
|
|
238
239
|
::
|
|
239
240
|
|
|
240
|
-
python3 -c "import os; print('
|
|
241
|
+
python3 -c "import os; print('HEHE_HAHA', os.environ.get('SYN_HEHE_HAHA')); print('FOO', os.environ.get('SYN_FOO'))"
|
|
241
242
|
|
|
242
|
-
|
|
243
|
+
HEHE_HAHA BEEP
|
|
243
244
|
FOO BAR
|
|
244
245
|
|
|
245
246
|
|
|
246
247
|
::
|
|
247
248
|
|
|
248
|
-
python3 -c "import os; print('
|
|
249
|
+
python3 -c "import os; print('HEHE_HAHA', os.environ.get('SYN_HEHE_HAHA')); print('FOO', os.environ.get('SYN_FOO'))"
|
|
249
250
|
|
|
250
|
-
|
|
251
|
+
HEHE_HAHA None
|
|
251
252
|
FOO None
|
|
252
253
|
|
|
253
254
|
|
|
@@ -776,3 +777,50 @@ class RStormLibTest(s_test.SynTest):
|
|
|
776
777
|
fd.write(fix_input_for_cli(fail02).encode())
|
|
777
778
|
with self.raises(s_exc.StormRuntimeError):
|
|
778
779
|
await get_rst_text(path)
|
|
780
|
+
|
|
781
|
+
async def test_rstorm_python_path(self):
|
|
782
|
+
content = '''#comment
|
|
783
|
+
import synapse.lib.cell as s_cell
|
|
784
|
+
import synapse.lib.stormsvc as s_stormsvc
|
|
785
|
+
|
|
786
|
+
class SomeApi(s_stormsvc.StormSvc, s_cell.CellApi):
|
|
787
|
+
_storm_svc_name = 'someservice'
|
|
788
|
+
_storm_svc_vers = '0.1.0',
|
|
789
|
+
_storm_svc_pkgs = ()
|
|
790
|
+
|
|
791
|
+
class SomeService(s_cell.Cell):
|
|
792
|
+
cellapi = SomeApi
|
|
793
|
+
'''
|
|
794
|
+
with self.getTestDir() as dirn:
|
|
795
|
+
with s_common.genfile(dirn, 'somefile.py') as fd:
|
|
796
|
+
fd.write(content.encode())
|
|
797
|
+
pythonpath_rst_in = f'''
|
|
798
|
+
.. storm-cortex:: default
|
|
799
|
+
.. storm-python-path:: {dirn}
|
|
800
|
+
.. storm-svc:: somefile.SomeService fooservice {{"https:port": 0}}
|
|
801
|
+
.. storm:: service.list
|
|
802
|
+
|
|
803
|
+
hello world
|
|
804
|
+
'''
|
|
805
|
+
rst_path = s_common.genpath(dirn, 'test.rst')
|
|
806
|
+
|
|
807
|
+
with s_common.genfile(rst_path) as fd:
|
|
808
|
+
fd.write(pythonpath_rst_in.encode())
|
|
809
|
+
|
|
810
|
+
pythonpath_rst_out = await get_rst_text(rst_path)
|
|
811
|
+
self.notin('storm-python-path', pythonpath_rst_out)
|
|
812
|
+
self.isin('(fooservice) (someservice @ 0.1.0)', pythonpath_rst_out)
|
|
813
|
+
self.isin('hello world', pythonpath_rst_out)
|
|
814
|
+
# Fini handler cleaned up the path manipulation
|
|
815
|
+
self.notin(dirn, sys.path)
|
|
816
|
+
|
|
817
|
+
# Sad path
|
|
818
|
+
pythonpath_rst_in = f'''
|
|
819
|
+
.. storm-python-path:: {dirn}/{s_common.guid()}
|
|
820
|
+
hello world
|
|
821
|
+
'''
|
|
822
|
+
rst_path = s_common.genpath(dirn, 'test.rst')
|
|
823
|
+
with s_common.genfile(rst_path) as fd:
|
|
824
|
+
fd.write(pythonpath_rst_in.encode())
|
|
825
|
+
with self.raises(s_exc.NoSuchDir):
|
|
826
|
+
await get_rst_text(rst_path)
|
synapse/tests/test_lib_storm.py
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import copy
|
|
2
2
|
import asyncio
|
|
3
|
-
import datetime
|
|
4
3
|
import itertools
|
|
5
4
|
import urllib.parse as u_parse
|
|
6
5
|
import unittest.mock as mock
|
|
@@ -17,6 +16,7 @@ import synapse.lib.storm as s_storm
|
|
|
17
16
|
import synapse.lib.httpapi as s_httpapi
|
|
18
17
|
import synapse.lib.msgpack as s_msgpack
|
|
19
18
|
import synapse.lib.version as s_version
|
|
19
|
+
import synapse.lib.stormtypes as s_stormtypes
|
|
20
20
|
|
|
21
21
|
import synapse.tests.utils as s_t_utils
|
|
22
22
|
from synapse.tests.utils import alist
|
|
@@ -4874,6 +4874,79 @@ class StormTest(s_t_utils.SynTest):
|
|
|
4874
4874
|
self.len(1, links)
|
|
4875
4875
|
self.eq({'type': 'runtime'}, links[0][1])
|
|
4876
4876
|
|
|
4877
|
+
async def test_storm_derefprops(self):
|
|
4878
|
+
async with self.getTestCore() as core:
|
|
4879
|
+
await core.addTagProp('score', ('int', {}), {})
|
|
4880
|
+
|
|
4881
|
+
mesg = "Expected value of type 'str', got '"
|
|
4882
|
+
|
|
4883
|
+
# editnodeadd
|
|
4884
|
+
msgs = await core.stormlist('$form = inet:fqdn [ *$form=foobar.com ]')
|
|
4885
|
+
self.stormHasNoWarnErr(msgs)
|
|
4886
|
+
|
|
4887
|
+
invals = [10, None, False, [], {}]
|
|
4888
|
+
|
|
4889
|
+
for inval in invals:
|
|
4890
|
+
opts = {'vars': {'form': inval}}
|
|
4891
|
+
with self.raises(s_exc.StormRuntimeError) as exc:
|
|
4892
|
+
await core.nodes('[ *$form=valu ]', opts=opts)
|
|
4893
|
+
self.true(exc.exception.get('mesg').startswith(mesg))
|
|
4894
|
+
|
|
4895
|
+
# liftprop
|
|
4896
|
+
msgs = await core.stormlist('$form = inet:fqdn *$form')
|
|
4897
|
+
self.stormHasNoWarnErr(msgs)
|
|
4898
|
+
|
|
4899
|
+
for inval in invals:
|
|
4900
|
+
opts = {'vars': {'form': inval}}
|
|
4901
|
+
with self.raises(s_exc.StormRuntimeError) as exc:
|
|
4902
|
+
await core.nodes('*$form', opts=opts)
|
|
4903
|
+
self.true(exc.exception.get('mesg').startswith(mesg))
|
|
4904
|
+
|
|
4905
|
+
# liftpropby
|
|
4906
|
+
msgs = await core.stormlist('$form = inet:fqdn *$form=foobar.com')
|
|
4907
|
+
self.stormHasNoWarnErr(msgs)
|
|
4908
|
+
|
|
4909
|
+
for inval in invals:
|
|
4910
|
+
opts = {'vars': {'form': inval}}
|
|
4911
|
+
with self.raises(s_exc.StormRuntimeError) as exc:
|
|
4912
|
+
await core.nodes('*$form=newp', opts=opts)
|
|
4913
|
+
self.true(exc.exception.get('mesg').startswith(mesg))
|
|
4914
|
+
|
|
4915
|
+
# liftformtag
|
|
4916
|
+
msgs = await core.stormlist('$form = inet:fqdn *$form#foo')
|
|
4917
|
+
self.stormHasNoWarnErr(msgs)
|
|
4918
|
+
|
|
4919
|
+
for inval in invals:
|
|
4920
|
+
opts = {'vars': {'form': inval}}
|
|
4921
|
+
with self.raises(s_exc.StormRuntimeError) as exc:
|
|
4922
|
+
await core.nodes('*$form#newp', opts=opts)
|
|
4923
|
+
self.true(exc.exception.get('mesg').startswith(mesg))
|
|
4924
|
+
|
|
4925
|
+
# liftbyarray
|
|
4926
|
+
msgs = await core.stormlist('$form = test:arrayform *$form*[=(10)]')
|
|
4927
|
+
self.stormHasNoWarnErr(msgs)
|
|
4928
|
+
|
|
4929
|
+
for inval in invals:
|
|
4930
|
+
opts = {'vars': {'form': inval}}
|
|
4931
|
+
with self.raises(s_exc.StormRuntimeError) as exc:
|
|
4932
|
+
await core.nodes('*$form*[="newp"]', opts=opts)
|
|
4933
|
+
self.true(exc.exception.get('mesg').startswith(mesg))
|
|
4934
|
+
|
|
4935
|
+
# formtagprop
|
|
4936
|
+
msgs = await core.stormlist('$form = inet:fqdn *$form#foo:score')
|
|
4937
|
+
self.stormHasNoWarnErr(msgs)
|
|
4938
|
+
|
|
4939
|
+
for inval in invals:
|
|
4940
|
+
opts = {'vars': {'form': inval}}
|
|
4941
|
+
with self.raises(s_exc.StormRuntimeError) as exc:
|
|
4942
|
+
await core.nodes('*$form#newp:score', opts=opts)
|
|
4943
|
+
self.true(exc.exception.get('mesg').startswith(mesg))
|
|
4944
|
+
|
|
4945
|
+
# Check Storm Str types
|
|
4946
|
+
name = s_stormtypes.Str('inet:fqdn')
|
|
4947
|
+
msgs = await core.stormlist('*$form', opts={'vars': {'form': name}})
|
|
4948
|
+
self.stormHasNoWarnErr(msgs)
|
|
4949
|
+
|
|
4877
4950
|
async def test_storm_nested_root(self):
|
|
4878
4951
|
async with self.getTestCore() as core:
|
|
4879
4952
|
self.eq(20, await core.callStorm('''
|
|
@@ -427,6 +427,90 @@ class StormLibAuthTest(s_test.SynTest):
|
|
|
427
427
|
opts=asuser
|
|
428
428
|
)
|
|
429
429
|
|
|
430
|
+
async def test_stormlib_auth_asroot_ondeny(self):
|
|
431
|
+
async with self.getTestCore() as core:
|
|
432
|
+
|
|
433
|
+
stormpkg = {
|
|
434
|
+
'name': 'authtest',
|
|
435
|
+
'version': '0.0.1',
|
|
436
|
+
'perms': (
|
|
437
|
+
{'perm': ('authtest', 'perm'), 'desc': 'Elevate mod', 'gate': 'cortex'},
|
|
438
|
+
),
|
|
439
|
+
'modules': (
|
|
440
|
+
{
|
|
441
|
+
'name': 'authtest.mod.default',
|
|
442
|
+
'asroot:perms': (
|
|
443
|
+
('authtest', 'perm'),
|
|
444
|
+
),
|
|
445
|
+
'storm': 'function func() { [ test:guid=* ] return($node) }',
|
|
446
|
+
},
|
|
447
|
+
{
|
|
448
|
+
'name': 'authtest.mod.allow',
|
|
449
|
+
'asroot:perms': (
|
|
450
|
+
('authtest', 'perm'),
|
|
451
|
+
),
|
|
452
|
+
'asroot:ondeny:import': 'allow',
|
|
453
|
+
'storm': '''
|
|
454
|
+
function func() { [ test:guid=* ] return($node) }
|
|
455
|
+
function func2() { [ test:str=newp ] return($node) }
|
|
456
|
+
''',
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
'name': 'authtest.mod.warn',
|
|
460
|
+
'asroot:perms': (
|
|
461
|
+
('authtest', 'perm'),
|
|
462
|
+
),
|
|
463
|
+
'asroot:ondeny:import': 'warn',
|
|
464
|
+
'storm': '''
|
|
465
|
+
function func() { [ test:guid=* ] return($node) }
|
|
466
|
+
function func2() { [ test:str=newp ] return($node) }
|
|
467
|
+
''',
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
'name': 'authtest.mod.deny',
|
|
471
|
+
'asroot:perms': (
|
|
472
|
+
('authtest', 'perm'),
|
|
473
|
+
),
|
|
474
|
+
'asroot:ondeny:import': 'deny',
|
|
475
|
+
'storm': 'function func() { [ test:guid=* ] return($node) }',
|
|
476
|
+
},
|
|
477
|
+
),
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
await core.stormlist('auth.user.add user')
|
|
481
|
+
await core.stormlist('auth.user.add lowuser')
|
|
482
|
+
|
|
483
|
+
await core.addStormPkg(stormpkg)
|
|
484
|
+
|
|
485
|
+
user = await core.auth.getUserByName('user')
|
|
486
|
+
asuser = {'user': user.iden}
|
|
487
|
+
|
|
488
|
+
lowuser = await core.auth.getUserByName('lowuser')
|
|
489
|
+
aslowuser = {'user': lowuser.iden}
|
|
490
|
+
|
|
491
|
+
await core.stormlist('auth.user.addrule user authtest.perm')
|
|
492
|
+
await core.stormlist('auth.user.addrule lowuser node.add.test:guid')
|
|
493
|
+
|
|
494
|
+
# user has no node perms, but has asroot so perms are elevated
|
|
495
|
+
self.len(1, await core.nodes('yield $lib.import(authtest.mod.default).func()', opts=asuser))
|
|
496
|
+
self.len(1, await core.nodes('yield $lib.import(authtest.mod.allow).func()', opts=asuser))
|
|
497
|
+
self.len(1, await core.nodes('yield $lib.import(authtest.mod.deny).func()', opts=asuser))
|
|
498
|
+
msgs = await core.stormlist('yield $lib.import(authtest.mod.warn).func()', opts=asuser)
|
|
499
|
+
self.stormHasNoWarnErr(msgs)
|
|
500
|
+
self.len(1, [m for m in msgs if m[0] == 'node'])
|
|
501
|
+
|
|
502
|
+
# lowuser does not have asroot perms and gets denied importing certain modules
|
|
503
|
+
await self.asyncraises(s_exc.AuthDeny, core.nodes('yield $lib.import(authtest.mod.deny).func()', opts=aslowuser))
|
|
504
|
+
await self.asyncraises(s_exc.AuthDeny, core.nodes('yield $lib.import(authtest.mod.default).func()', opts=aslowuser))
|
|
505
|
+
# ...and for modules they can import perms are not elevated so they can only add test:guid nodes
|
|
506
|
+
self.len(1, await core.nodes('yield $lib.import(authtest.mod.allow).func()', opts=aslowuser))
|
|
507
|
+
msgs = await core.stormlist('yield $lib.import(authtest.mod.warn).func()', opts=aslowuser)
|
|
508
|
+
self.stormIsInWarn('permissions will not be elevated.', msgs)
|
|
509
|
+
self.len(1, [m for m in msgs if m[0] == 'node'])
|
|
510
|
+
# ...and gets denied on adding test:str nodes
|
|
511
|
+
await self.asyncraises(s_exc.AuthDeny, core.nodes('yield $lib.import(authtest.mod.allow).func2()', opts=aslowuser))
|
|
512
|
+
await self.asyncraises(s_exc.AuthDeny, core.nodes('yield $lib.import(authtest.mod.warn).func2()', opts=aslowuser))
|
|
513
|
+
|
|
430
514
|
async def test_stormlib_auth_userjson(self):
|
|
431
515
|
|
|
432
516
|
async with self.getTestCore() as core:
|
|
@@ -110,6 +110,7 @@ $request.reply(206, headers=$headers, body=({"no":"body"}))
|
|
|
110
110
|
self.eq(resp.status, http.HTTPStatus.OK)
|
|
111
111
|
data = await resp.json()
|
|
112
112
|
self.eq(data.get('method'), 'get')
|
|
113
|
+
self.eq(resp.headers.get('Content-Type'), 'application/json; charset=utf8')
|
|
113
114
|
|
|
114
115
|
resp = await sess.post(f'https://localhost:{hport}/api/ext/testpath00')
|
|
115
116
|
self.eq(resp.status, http.HTTPStatus.CREATED)
|
|
@@ -2054,6 +2054,31 @@ class StormTypesTest(s_test.SynTest):
|
|
|
2054
2054
|
self.eq(nodes[0].repr(), 'foo')
|
|
2055
2055
|
self.none(nodes[0].get('hehe'))
|
|
2056
2056
|
|
|
2057
|
+
async with self.getTestCore() as core2:
|
|
2058
|
+
url = core.getLocalUrl('*/layer')
|
|
2059
|
+
|
|
2060
|
+
layers = set(core2.layers.keys())
|
|
2061
|
+
q = f'layer.add --mirror {url}'
|
|
2062
|
+
await core2.stormlist(q)
|
|
2063
|
+
|
|
2064
|
+
uplayr = list(set(core2.layers.keys()) - layers)[0]
|
|
2065
|
+
vdef = {'layers': [uplayr]}
|
|
2066
|
+
|
|
2067
|
+
view00 = await core2.addView(vdef)
|
|
2068
|
+
opts = {'view': view00.get('iden')}
|
|
2069
|
+
|
|
2070
|
+
nodes = await core.nodes('[ test:str=foo :hehe=bar ]')
|
|
2071
|
+
|
|
2072
|
+
layr = core2.getLayer(uplayr)
|
|
2073
|
+
offs = await core.view.layers[0].getEditOffs()
|
|
2074
|
+
self.true(await layr.waitEditOffs(offs, timeout=10))
|
|
2075
|
+
|
|
2076
|
+
q = 'test:str return($lib.layer.get().delStorNodeProp($node.iden(), test:str:hehe))'
|
|
2077
|
+
self.true(await core2.callStorm(q, opts=opts))
|
|
2078
|
+
|
|
2079
|
+
# attempting to delete a second time should not blow up
|
|
2080
|
+
self.false(await core2.callStorm(q, opts=opts))
|
|
2081
|
+
|
|
2057
2082
|
# no test:str:newp prop
|
|
2058
2083
|
q = '''
|
|
2059
2084
|
[ test:str=foobar00 ]
|
synapse/tests/test_model_orgs.py
CHANGED
|
@@ -25,6 +25,7 @@ class OuModelTest(s_t_utils.SynTest):
|
|
|
25
25
|
:reporter=$lib.gen.orgByName(vertex)
|
|
26
26
|
:reporter:name=vertex
|
|
27
27
|
:ext:id=Foo
|
|
28
|
+
:parent={[ ou:technique=* :name=metawoot ]}
|
|
28
29
|
]
|
|
29
30
|
''')
|
|
30
31
|
self.len(1, nodes)
|
|
@@ -37,10 +38,14 @@ class OuModelTest(s_t_utils.SynTest):
|
|
|
37
38
|
self.eq('T0001', nodes[0].get('mitre:attack:technique'))
|
|
38
39
|
self.eq(40, nodes[0].get('sophistication'))
|
|
39
40
|
self.eq('vertex', nodes[0].get('reporter:name'))
|
|
41
|
+
self.nn(nodes[0].get('parent'))
|
|
40
42
|
self.len(1, await core.nodes('ou:technique -> syn:tag'))
|
|
41
43
|
self.len(1, await core.nodes('ou:technique -> ou:technique:taxonomy'))
|
|
42
44
|
self.len(1, await core.nodes('ou:technique -> it:mitre:attack:technique'))
|
|
43
|
-
|
|
45
|
+
|
|
46
|
+
nodes = await core.nodes('ou:technique :parent -> *')
|
|
47
|
+
self.len(1, nodes)
|
|
48
|
+
self.eq('metawoot', nodes[0].get('name'))
|
|
44
49
|
|
|
45
50
|
props = {
|
|
46
51
|
'name': 'MyGoal',
|
|
@@ -2,7 +2,7 @@ synapse/__init__.py,sha256=R2kOXlF5j-8m6G0JkHuN7rXRPg_tHLmbMxr__94mHQk,1145
|
|
|
2
2
|
synapse/axon.py,sha256=HtKPfSDNt3ltOaQC2P_7satXhgdxf7fO2mGAioF78Iw,66029
|
|
3
3
|
synapse/cells.py,sha256=eNvdglfAoTURVhGOLGcgMXCGpfsIX1a02SQnyiklo3E,308
|
|
4
4
|
synapse/common.py,sha256=j8b3lrZ7O-utkjJswSf_kx1nySmKRTCNsk6I8bfNPGA,37880
|
|
5
|
-
synapse/cortex.py,sha256=
|
|
5
|
+
synapse/cortex.py,sha256=UGwG5ur5ba6J0sPtfAqXlcLtPBjn-KRwLOMIKxmrFjE,269972
|
|
6
6
|
synapse/cryotank.py,sha256=2-MzdTZ1AofkBp2ew3ZrZLo33rHRtNVTlr4YlXEfdrc,12130
|
|
7
7
|
synapse/daemon.py,sha256=CllFBFGcZ8aI5jOmAu-7AQRXExjhojmq4saUE7uFOAQ,17171
|
|
8
8
|
synapse/datamodel.py,sha256=Lc8PF4tapY6leXv35M1UZHNQ3nDLxEWbfwS4crGNTV0,40347
|
|
@@ -85,11 +85,11 @@ synapse/data/jsonschemas/raw.githubusercontent.com/oasis-open/cti-stix2-json-sch
|
|
|
85
85
|
synapse/data/jsonschemas/raw.githubusercontent.com/oasis-open/cti-stix2-json-schemas/stix2.1/schemas/sros/sighting.json,sha256=f1T3r4CRcJP0743qmAlVCdNvi5ASrOU42PSoiDNlRqc,3575
|
|
86
86
|
synapse/data/lark/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
87
87
|
synapse/data/lark/imap.lark,sha256=LpPhhbI_oYjSYn30gL5q9kZVSWR4LT48OFDu1UdiF48,237
|
|
88
|
-
synapse/data/lark/storm.lark,sha256=
|
|
88
|
+
synapse/data/lark/storm.lark,sha256=Q72SAVH49o4z8Wnlhp__sInEdi2xHiYMm2kCHH-0E2o,27436
|
|
89
89
|
synapse/lib/__init__.py,sha256=qLS7nt8-Iot8jnD2Xss_6wZi5lJoyv2rqxF9kkektT0,129
|
|
90
90
|
synapse/lib/agenda.py,sha256=v3g6LC7lD9i1V5sngnmpw9AYZTar6LwBu1or2qQ8QXc,34429
|
|
91
91
|
synapse/lib/aha.py,sha256=FZC-NjEBN4QFdzOo1ENbRnJu_z0cBuZt7n8NRqbFYBg,56471
|
|
92
|
-
synapse/lib/ast.py,sha256=
|
|
92
|
+
synapse/lib/ast.py,sha256=lq_9QhVKsziUm6CmPycOeV05mNxK9RAZitViMGRef7c,166755
|
|
93
93
|
synapse/lib/auth.py,sha256=B7-Ji3MzPlW6pvRNtb0ciJKDru54QC-_yvznGraZCJs,54400
|
|
94
94
|
synapse/lib/autodoc.py,sha256=tM2OCPrV7yeth8Cx-wx-_VXBmBfzJS52vaubg_7BqCI,23217
|
|
95
95
|
synapse/lib/base.py,sha256=yJVfv7SiZhnzAP9LWKHlFOsY_l6ztUDNtt2TDT22U4Q,23422
|
|
@@ -119,7 +119,7 @@ synapse/lib/ingest.py,sha256=HNW1xs215c_UXVjKaxjipKBmVL4ujrjmarHBRvLPLkE,40
|
|
|
119
119
|
synapse/lib/interval.py,sha256=PqpEhMGG6LD9mJxEms0oQWC-NB01H6gwsmLSc5LrDFk,1175
|
|
120
120
|
synapse/lib/json.py,sha256=s5ULBdrpQ5lMy7DIUFvqwukEkrG8taH1kzHx7sxCE8s,8268
|
|
121
121
|
synapse/lib/jsonstor.py,sha256=GAzIEqYszPkInIOHTfjPQbhXU1vo6GDNfalyNSgdaLo,19595
|
|
122
|
-
synapse/lib/layer.py,sha256=
|
|
122
|
+
synapse/lib/layer.py,sha256=Xk5NObx8I7ynWjlMn235XZ1Znt6RzeVtLh2cvkkwxRo,160457
|
|
123
123
|
synapse/lib/link.py,sha256=qv1NK1TguHiqOlOHSsqVamhRn-WdQY1vc1gorMsLhmo,10657
|
|
124
124
|
synapse/lib/lmdbslab.py,sha256=PcOUL1FeC5464MwYMWd9GbGv-xksfVu-KPgr9-QtO9M,61069
|
|
125
125
|
synapse/lib/modelrev.py,sha256=bSBKjKjOeXJ2ZZYa0w4KSFLOz3J_HxBCww1l0_5DoRg,72568
|
|
@@ -131,12 +131,12 @@ synapse/lib/nexus.py,sha256=CrdOco9bcAzV1-93h1DlvZeqLP_kCIJvZRvb1Rwxgfk,23687
|
|
|
131
131
|
synapse/lib/node.py,sha256=XwcgKbouFHMt79Hmju3vo6xd3jTrLu5Ai5zFqpU_HuA,31474
|
|
132
132
|
synapse/lib/oauth.py,sha256=xgJNXyt4uWymt5xaoXpCAeZmrSiJV7XVwl9h3Pm92zg,20367
|
|
133
133
|
synapse/lib/output.py,sha256=MARscREHja4h8PQN7GZxHGvF36RoOkUyw3vfhmFzMTk,890
|
|
134
|
-
synapse/lib/parser.py,sha256=
|
|
134
|
+
synapse/lib/parser.py,sha256=eYlboQXpDNSTyeewgx_t_kEyU8Q2Kcj5xXmbjWjFXZQ,29437
|
|
135
135
|
synapse/lib/queue.py,sha256=omMtqD4HWg2mLOhhtIe4pA_evz234lJ9uhlAhC_xbW4,3879
|
|
136
136
|
synapse/lib/ratelimit.py,sha256=BIeFPZb9Bk5GFIVvhM43Uw1s0abY6z7NgTuBorVajz4,1124
|
|
137
137
|
synapse/lib/reflect.py,sha256=j7Y522UzAwNswUehyfi9kHFNkTxuHXsFuEKY4ATXWTQ,2783
|
|
138
|
-
synapse/lib/rstorm.py,sha256=
|
|
139
|
-
synapse/lib/schemas.py,sha256=
|
|
138
|
+
synapse/lib/rstorm.py,sha256=VgxWBpTmOSYPEsgpB-zFVaDOrGH3otiq70aYVjn-to8,22608
|
|
139
|
+
synapse/lib/schemas.py,sha256=gn2XoiWZVbR2HmeZYGlhAflAc5d0SgBrBXYXKnyIDuI,42301
|
|
140
140
|
synapse/lib/scope.py,sha256=0CuSXLG_7pNleC1BcJ8_WbA50DswrX4DNjW5MyGGGNo,5496
|
|
141
141
|
synapse/lib/scrape.py,sha256=ppUUkobkITN7n2gFov0nfzV3sVKpyPNrZKPtt1zwjjU,23979
|
|
142
142
|
synapse/lib/share.py,sha256=wE0WE77QxJTbfcZmVLn_9hHbXMsptj6e2I4KbTho9_Q,605
|
|
@@ -149,7 +149,7 @@ synapse/lib/storm_format.py,sha256=9cE8WNPYTcqgRakIqkmIQzOr16Hqbj_sM1QabHug3i0,4
|
|
|
149
149
|
synapse/lib/stormctrl.py,sha256=3UC2LOHClC17JwYNuo8NeyntuAvIXphjenXEzVP33mY,2523
|
|
150
150
|
synapse/lib/stormhttp.py,sha256=hy87c76CqMqplv9gLB5_P032uvZ2Cggp4IC27QzhRjY,28907
|
|
151
151
|
synapse/lib/stormsvc.py,sha256=FURIsQUVNJmY8Z5TmhTF1O__DGXPiVg5pUiOoPM8r3g,7573
|
|
152
|
-
synapse/lib/stormtypes.py,sha256=
|
|
152
|
+
synapse/lib/stormtypes.py,sha256=GBCpqMmJtLeYnR7vSAi8BxTdEjT8MHM0yOPv5lLSXp8,417201
|
|
153
153
|
synapse/lib/stormwhois.py,sha256=w7N2oCyMljNvi_sRt_bZb5BJwWwYkVGcRd7H_0oHY8Q,2554
|
|
154
154
|
synapse/lib/structlog.py,sha256=v5MK5jtJIRSF-E4y4fQuzEVKmbocu8ByFLDTY8Ybjpk,1336
|
|
155
155
|
synapse/lib/task.py,sha256=LVVM7Yr0VPUihIH6N_CrMHm3GHZR3bu-dw05SkG8zFE,6267
|
|
@@ -160,7 +160,7 @@ synapse/lib/time.py,sha256=bk_1F6_MDuCWJ1ToPJ-XHkeTWVw5b4SE7cCixBqVxXo,9435
|
|
|
160
160
|
synapse/lib/trigger.py,sha256=mnfkoBHB88JfqPoxb5oflvAaBKZpNvYdxP247YS53fE,20697
|
|
161
161
|
synapse/lib/types.py,sha256=0ILS8netSELraSJu1YfPyQf3P-bVbevYkVzSC-WigsU,70917
|
|
162
162
|
synapse/lib/urlhelp.py,sha256=ljhnF91z9ihyOLdZZ6OoQYCN1WYjOj1imukD45xiKU0,3320
|
|
163
|
-
synapse/lib/version.py,sha256=
|
|
163
|
+
synapse/lib/version.py,sha256=4y2VOzmtCygXekHXQ95MYKw-TWl66nSf_AN3s7zHpmI,7162
|
|
164
164
|
synapse/lib/view.py,sha256=9PZTDSkw002hiCF2gYIBMSUB3uRSht5UJBgFUxnh-D4,62989
|
|
165
165
|
synapse/lib/crypto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
166
166
|
synapse/lib/crypto/coin.py,sha256=_dhlkzIrHT8BvHdJOWK7PDThz3sK3dDRnWAUqjRpZJc,4910
|
|
@@ -182,7 +182,7 @@ synapse/lib/stormlib/basex.py,sha256=BHnThzA7xv_wBaoxO3sVjjPGgS7K5PMXyGrFFQzmX2Y
|
|
|
182
182
|
synapse/lib/stormlib/cache.py,sha256=SUQ8vSaX8CNTsPOv--rJiQIzAoJmhpBWQodAGOI6DIM,8133
|
|
183
183
|
synapse/lib/stormlib/cell.py,sha256=w0c5lLMq4dz5zPAi6z27gfcpA1QjRvgTZTSFc1IaBXE,14449
|
|
184
184
|
synapse/lib/stormlib/compression.py,sha256=ZOEuGv0MGiXuXOfarTgVGK6lB1ta6X7tDmXvOza9TDQ,6284
|
|
185
|
-
synapse/lib/stormlib/cortex.py,sha256=
|
|
185
|
+
synapse/lib/stormlib/cortex.py,sha256=ePJlndl23TH5tzE-booviI8r5DIXc_RMtiKF8H_5xAc,55560
|
|
186
186
|
synapse/lib/stormlib/easyperm.py,sha256=QNaxDhYIJIGapISs4WNHYFpbB3EyEgWAj1UlHlQD8UU,5851
|
|
187
187
|
synapse/lib/stormlib/env.py,sha256=sXcsaReSsOw0tBdgaaDgwD-RzXPsBabVC1FY2Q-ZebI,1707
|
|
188
188
|
synapse/lib/stormlib/ethereum.py,sha256=oHWmkYAdtxITXxKx09vwLeUKDojymvCLnXCUZIhLEZw,1222
|
|
@@ -247,7 +247,7 @@ synapse/models/language.py,sha256=hBVVIf5kc_FSIV7HZhWnberoc9ssxuqeff4fqC9iz4o,36
|
|
|
247
247
|
synapse/models/material.py,sha256=UvmnBEkbhBbdbnvWtTlgGJAJlKDrx9E-YSQ3K49ws5M,5405
|
|
248
248
|
synapse/models/math.py,sha256=5zDLSwGbOcWI6T5-KspPL20sR8Bcs59pnRK2nEELzss,1775
|
|
249
249
|
synapse/models/media.py,sha256=wdXNzLrHb4YYRZ3NlGombNwZsphwfH20oZQQ9ICq7ZQ,3604
|
|
250
|
-
synapse/models/orgs.py,sha256=
|
|
250
|
+
synapse/models/orgs.py,sha256=leQKO9NP3bl2-iikScd62kYiehAWqGVaKqwPgOVD4qE,71755
|
|
251
251
|
synapse/models/person.py,sha256=HiZy_zT0Q1AoeXbpogEJWuJe436bOo_Ai4kkmA9c2ZU,28568
|
|
252
252
|
synapse/models/planning.py,sha256=vmrY4d3WRxizrNU1YBe36NGZTuuu4lhGS8KI5lCZ5yQ,7302
|
|
253
253
|
synapse/models/proj.py,sha256=vl-2uZouiWSey8t4lTNA4BxUKhX94rqm3SuLrodQUP8,9904
|
|
@@ -306,7 +306,7 @@ synapse/tests/test_lib_datfile.py,sha256=jyWAx0BtPK6hjkUmAzUB0-jAWYgIyx3EmB2XxaZ
|
|
|
306
306
|
synapse/tests/test_lib_dyndeps.py,sha256=qahr9yrB1SM5bkF9VwW_eQqB_Tva_HRUJwx9QQQCxiM,1239
|
|
307
307
|
synapse/tests/test_lib_encoding.py,sha256=SmMs3VriYSsaC0oqFEHv7NalNuvDzOlAkDNxueJKOuY,6590
|
|
308
308
|
synapse/tests/test_lib_gis.py,sha256=7vUXgHzjLNDPtYfcrVKQmNNo4EoJNYGYFXWdYf7XG9k,3186
|
|
309
|
-
synapse/tests/test_lib_grammar.py,sha256=
|
|
309
|
+
synapse/tests/test_lib_grammar.py,sha256=L-UawqnIz055vOLCQn_VTYGPBiC4reBR7SOAKLGXQIw,147740
|
|
310
310
|
synapse/tests/test_lib_hashitem.py,sha256=IyyueviwK8g-MpCkXU-jLfMDRFMuO8Bl3870IucZMg8,715
|
|
311
311
|
synapse/tests/test_lib_hashset.py,sha256=HwFsohiEzLyQ3evpvcezlj2iM7Li5IrN4rWh1jZnnPQ,1329
|
|
312
312
|
synapse/tests/test_lib_health.py,sha256=yqNw6rXBm_2UBqPlWxeLpFhawKocdS1VitOCD3Lv8gE,2265
|
|
@@ -329,25 +329,25 @@ synapse/tests/test_lib_platforms_linux.py,sha256=MgafTw5hq1ld9sKLREqf3LnmINk4Kdh
|
|
|
329
329
|
synapse/tests/test_lib_queue.py,sha256=pr1dTeBcu4zVD9p0li1PvgH3XTiXZ4oPQm2ibAXXMpg,829
|
|
330
330
|
synapse/tests/test_lib_ratelimit.py,sha256=2aH3KodVGOEkxbe0hZ1RAQ4p6waF1tueSZP9h_QNya0,415
|
|
331
331
|
synapse/tests/test_lib_reflect.py,sha256=C2GMXUPm705p2ySLRpICWZUNB-oo4NiluT6XU_gY_jA,3104
|
|
332
|
-
synapse/tests/test_lib_rstorm.py,sha256=
|
|
332
|
+
synapse/tests/test_lib_rstorm.py,sha256=8kAEHT8rufMWIBbj_LXeCi5XfmYfVl0MAlEJQUt1zCo,24938
|
|
333
333
|
synapse/tests/test_lib_scope.py,sha256=0uh6B1mB68kqTsFAL0oPbhDe64mtIAVblfAWNTxo6FQ,6217
|
|
334
334
|
synapse/tests/test_lib_scrape.py,sha256=Mojpt7f9IfFe-nMcCAzzdMb-Qsn1Tg0EPNGfreWXLno,48424
|
|
335
335
|
synapse/tests/test_lib_slaboffs.py,sha256=FHQ8mGZ27dGqVwGk6q2UJ4gkPRZN22eIVzS8hMPkD9c,756
|
|
336
336
|
synapse/tests/test_lib_slabseqn.py,sha256=74V6jU7DRTsy_hqUFDuT4C6dPlJ6ObNnjmI9qhbbyVc,5230
|
|
337
337
|
synapse/tests/test_lib_snap.py,sha256=OviJtj9N5LhBV-56TySkWvRly7f8VH9d-VBcNFLAtmg,27805
|
|
338
338
|
synapse/tests/test_lib_spooled.py,sha256=Ki9UnzTPUtw7devwN_M0a8uwOst81fGQtGSVqSSh1u8,4002
|
|
339
|
-
synapse/tests/test_lib_storm.py,sha256=
|
|
339
|
+
synapse/tests/test_lib_storm.py,sha256=LUpQKXtB_Mt3jl7RVi0Hnc2T4Uc0El-KEtLphZDoIng,265289
|
|
340
340
|
synapse/tests/test_lib_storm_format.py,sha256=tEZgQMmKAeG8FQZE5HUjOT7bnKawVTpNaVQh_3Wa630,277
|
|
341
341
|
synapse/tests/test_lib_stormctrl.py,sha256=1vY7PGjgmz3AibgSiGcp_G4NSYl9YNifWdjPB0CDf1g,2877
|
|
342
342
|
synapse/tests/test_lib_stormhttp.py,sha256=rhZ9xLTIzLm4GlJUFDieFqAcrhE0EFTDi2erGltPm0I,46056
|
|
343
343
|
synapse/tests/test_lib_stormlib_aha.py,sha256=XhBokRnanwe2vWZf0PcwyZgJE3mu-7V4xKNhFf7Go4U,17782
|
|
344
|
-
synapse/tests/test_lib_stormlib_auth.py,sha256
|
|
344
|
+
synapse/tests/test_lib_stormlib_auth.py,sha256=8JvqF8InTU8KTuUQTfnPUce9780UdKwXuiTRwcoN99k,65628
|
|
345
345
|
synapse/tests/test_lib_stormlib_backup.py,sha256=3ZYE3swQ4A8aYJyVueFXzbekCdoKMC7jsHLoq0hTKGI,1644
|
|
346
346
|
synapse/tests/test_lib_stormlib_basex.py,sha256=DDOsH3XDR8MdJ1uj5avyqnFqBnlaIu8L5stX61jqKrw,2049
|
|
347
347
|
synapse/tests/test_lib_stormlib_cache.py,sha256=trPkuHLC4GKHHH2FiF_EmXtxMVwjDRN_Sq5wdYqPbFE,10619
|
|
348
348
|
synapse/tests/test_lib_stormlib_cell.py,sha256=V2ERQLP0HWKA_nH2zRfxkCdXI4MQ3AM6IT24bvX4eDU,16710
|
|
349
349
|
synapse/tests/test_lib_stormlib_compression.py,sha256=JX8P5XQH66Mv97dfq0_mnY8kqA67T2B5pbBH4B91nPo,2859
|
|
350
|
-
synapse/tests/test_lib_stormlib_cortex.py,sha256=
|
|
350
|
+
synapse/tests/test_lib_stormlib_cortex.py,sha256=6dCBDCE7Xa5fJNowH1AiorBt6OJtD61E3L2jpwJy4lE,72762
|
|
351
351
|
synapse/tests/test_lib_stormlib_easyperm.py,sha256=qPZr5qjjmD4BnLeLQM3i2HgiHhTsjvu7is7l26xkMxY,4133
|
|
352
352
|
synapse/tests/test_lib_stormlib_env.py,sha256=gzvx1e_t_3jbw4Vg1cWz5jn9CY0wRhFPLHzBK2-5mjA,1094
|
|
353
353
|
synapse/tests/test_lib_stormlib_ethereum.py,sha256=yfil8RZWmbH7CUOlnito1kyL7VJVegoCgLaLXNKHFRI,797
|
|
@@ -381,7 +381,7 @@ synapse/tests/test_lib_stormlib_vault.py,sha256=pE_nDisXiyb-4Zm1hOrfsuEz3bjYwR8c
|
|
|
381
381
|
synapse/tests/test_lib_stormlib_xml.py,sha256=asF-Y1LVpLoqHRK71_LWy727XJvsTNpf8qRSK-CynMM,3659
|
|
382
382
|
synapse/tests/test_lib_stormlib_yaml.py,sha256=egTVXk8wW31V2msF__9WxP3THcqfysG1mYhc7hQG8rw,1358
|
|
383
383
|
synapse/tests/test_lib_stormsvc.py,sha256=XeUQo6GzIdwV3EZJv8lU3sR4MpJY3iY90fahb9zsfa4,43972
|
|
384
|
-
synapse/tests/test_lib_stormtypes.py,sha256=
|
|
384
|
+
synapse/tests/test_lib_stormtypes.py,sha256=FcL0mPrtXqiQF9xI8gH52TBgtyYTvMXG5ow3M9Iooxs,352764
|
|
385
385
|
synapse/tests/test_lib_stormwhois.py,sha256=AWMUYEgZ5yqvDfPC_rM4evmhgfOA_Fv5aoTjmKmN1_0,4818
|
|
386
386
|
synapse/tests/test_lib_structlog.py,sha256=BxglFqOsJFPE2RsZ8dQyTBCEe1frQrHWWXmUBO2fPJs,3898
|
|
387
387
|
synapse/tests/test_lib_task.py,sha256=UQi14LdQ0rxDRCSy4TAxyq2OXDOXPQqnvp-nCK_aoBE,2454
|
|
@@ -416,7 +416,7 @@ synapse/tests/test_model_language.py,sha256=49stF1B8_EwWJB67Xa5VXCG563Zfbr6S85iK
|
|
|
416
416
|
synapse/tests/test_model_material.py,sha256=Hkd8BJh6FdQE0RuFMV2NO6fGqw9kOCb5AeIuTYtwCEM,2723
|
|
417
417
|
synapse/tests/test_model_math.py,sha256=x-rHBfm-59ueZdHXXzSi53eshldvVURoJeLeexWTL2U,826
|
|
418
418
|
synapse/tests/test_model_media.py,sha256=OhMb3OwmZ7hXfoQYGeUBlnsqIk0sAohSodCLML2_yVk,2655
|
|
419
|
-
synapse/tests/test_model_orgs.py,sha256=
|
|
419
|
+
synapse/tests/test_model_orgs.py,sha256=YuKmjO7c6kzrydEwiVtmEdpZpSVlPfN_aCx_yqbKXDE,47881
|
|
420
420
|
synapse/tests/test_model_person.py,sha256=CKfOtp7iCPAHQEfjlduDxPXLbFbi2LdVqExRyVwoxAc,19170
|
|
421
421
|
synapse/tests/test_model_planning.py,sha256=U2kkE0uBO6CqtTfy7wlnhEIu_NFdSri4I_I5b-mRjBE,5615
|
|
422
422
|
synapse/tests/test_model_proj.py,sha256=hCuM-CTyCAvqVPy7klP6NXOEtgJ61OyyT0x8mcJsjns,23238
|
|
@@ -645,8 +645,8 @@ synapse/vendor/xrpl/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
|
|
|
645
645
|
synapse/vendor/xrpl/tests/test_codec.py,sha256=Zwq6A5uZUK_FWDL3BA932c5b-rL3hnC6efobWHSLC4o,6651
|
|
646
646
|
synapse/vendor/xrpl/tests/test_main.py,sha256=kZQwWk7I6HrP-PMvLdsUUN4POvWD9I-iXDHOwdeF090,4299
|
|
647
647
|
synapse/vendor/xrpl/tests/test_main_test_cases.py,sha256=vTlUM4hJD2Hd2wCIdd9rfsvcMZZZQmNHWdCTTFeGz2Y,4221
|
|
648
|
-
synapse-2.
|
|
649
|
-
synapse-2.
|
|
650
|
-
synapse-2.
|
|
651
|
-
synapse-2.
|
|
652
|
-
synapse-2.
|
|
648
|
+
synapse-2.222.0.dist-info/licenses/LICENSE,sha256=xllut76FgcGL5zbIRvuRc7aezPbvlMUTWJPsVr2Sugg,11358
|
|
649
|
+
synapse-2.222.0.dist-info/METADATA,sha256=Td5lNUY1tl03w3ZE7pvsuUKUS-tZcrWmPi0CQF2mwIc,4583
|
|
650
|
+
synapse-2.222.0.dist-info/WHEEL,sha256=cRWFNt_CJSuf6BnJKAdKunDXUJxjAbWvbt_kstDCs1I,93
|
|
651
|
+
synapse-2.222.0.dist-info/top_level.txt,sha256=v_1YsqjmoSCzCKs7oIhzTNmWtSYoORiBMv1TJkOhx8A,8
|
|
652
|
+
synapse-2.222.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|