Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions synapse/lib/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,25 @@ def pack(self, dorepr=False, virts=False, verbs=True):
pode[1]['n1verbs'] = self.getEdgeCounts()
pode[1]['n2verbs'] = self.getEdgeCounts(n2=True)

if virts:
pode[1]['virts'] = vvals = {}

for sode in self.sodes:
if sode.get('antivalu') is not None:
break

if (valu := sode.get('valu')) is not None:
valu, stortype, vprops = valu

if vprops is not None:
for vname, vval in vprops.items():
vvals[vname] = vval[0]

if (svirts := storvirts.get(stortype)) is not None:
for vname, getr in svirts.items():
vvals[vname] = getr(valu)
break

if dorepr:
self._addPodeRepr(pode)

Expand Down
48 changes: 10 additions & 38 deletions synapse/models/inet.py
Original file line number Diff line number Diff line change
Expand Up @@ -736,10 +736,6 @@ def postTypeInit(self):
self.masktype = self.modl.type('int').clone({'size': 1, 'signed': False})
self.sizetype = self.modl.type('int').clone({'size': 16, 'signed': False})

# Offset size values by 1 so we can store ::/0 in 16 bytes and there is always at least 1 IP in the range
self.sizetype.minval += 1
self.sizetype.maxval += 1

self.pivs |= {
'inet:ip': ('range=', None),
}
Expand All @@ -754,35 +750,6 @@ def postTypeInit(self):
'size': (self.sizetype, self._getSize),
}

self.virtlifts |= {
'size': {
'in=': self._storLiftSizeIn,
'range=': self._storLiftSizeRange
},
}

for oper in ('=', '<', '>', '<=', '>='):
self.virtlifts['size'][oper] = self._storLiftSize

async def _storLiftSize(self, cmpr, valu):
norm, _ = await self.sizetype.norm(valu)
return (
(cmpr, norm - 1, self.sizetype.stortype),
)

async def _storLiftSizeIn(self, cmpr, valu):
retn = []
for realvalu in valu:
retn.extend(await self._storLiftSize('=', realvalu))
return retn

async def _storLiftSizeRange(self, cmpr, valu):
minx = (await self.sizetype.norm(valu[0]))[0]
maxx = (await self.sizetype.norm(valu[1]))[0]
return (
(cmpr, (minx - 1, maxx - 1), self.sizetype.stortype),
)

def _getMask(self, valu):
if (virts := valu[2]) is None:
return None
Expand All @@ -799,7 +766,7 @@ def _getSize(self, valu):
if (valu := virts.get('size')) is None:
return None

return valu[0] + 1
return valu[0]

def repr(self, norm):
if (cidr := self._getCidr(norm)) is not None:
Expand Down Expand Up @@ -830,7 +797,8 @@ async def _normPyStr(self, valu, view=None):

if '-' in valu:
norm, info = await super()._normPyStr(valu)
info['virts'] = {'size': (norm[1][1] - norm[0][1], self.sizetype.stortype)}
size = (await self.sizetype.norm(norm[1][1] - norm[0][1] + 1))[0]
info['virts'] = {'size': (size, self.sizetype.stortype)}

if (cidr := self._getCidr(norm)) is not None:
info['virts']['mask'] = (cidr.prefixlen, self.masktype.stortype)
Expand Down Expand Up @@ -864,10 +832,12 @@ async def _normPyStr(self, valu, view=None):
network, netinfo = await self.subtype.norm((6, int(netw.network_address)))
broadcast, binfo = await self.subtype.norm((6, int(netw.broadcast_address)))

size = (await self.sizetype.norm(broadcast[1] - network[1] + 1))[0]

return (network, broadcast), {'subs': {'min': (self.subtype.typehash, network, netinfo),
'max': (self.subtype.typehash, broadcast, binfo)},
'virts': {'mask': (mask_int, self.masktype.stortype),
'size': (broadcast[1] - network[1], self.sizetype.stortype)}}
'size': (size, self.sizetype.stortype)}}

async def _normPyTuple(self, valu, view=None):
if len(valu) != 2:
Expand All @@ -881,13 +851,15 @@ async def _normPyTuple(self, valu, view=None):
raise s_exc.BadTypeValu(valu=valu, name=self.name,
mesg=f'IP address version mismatch in range "{valu}"')

if ipaddress.ip_address(minv[1]) > ipaddress.ip_address(maxv[1]):
if minv[1] > maxv[1]:
raise s_exc.BadTypeValu(valu=valu, name=self.name,
mesg='minval cannot be greater than maxval')

size = (await self.sizetype.norm(maxv[1] - minv[1] + 1))[0]

info = {'subs': {'min': (self.subtype.typehash, minv, minfo),
'max': (self.subtype.typehash, maxv, maxfo)},
'virts': {'size': (maxv[1] - minv[1], self.sizetype.stortype)}}
'virts': {'size': (size, self.sizetype.stortype)}}

if (cidr := self._getCidr((minv, maxv))) is not None:
info['virts']['mask'] = (cidr.prefixlen, self.masktype.stortype)
Expand Down
19 changes: 19 additions & 0 deletions synapse/tests/test_lib_storm.py
Original file line number Diff line number Diff line change
Expand Up @@ -1275,6 +1275,25 @@ async def test_storm_node_opts(self):
self.eq(nodes[0][1]['props']['ndefs.size'], 2)
self.eq(nodes[0][1]['props']['ndefs.form'], ('test:str', 'test:str'))

msgs = await core.stormlist('[ inet:net=10.0.0.0/24 ]', opts=opts)
nodes = [mesg[1] for mesg in msgs if mesg[0] == 'node']
self.eq(nodes[0][1]['virts'].get('mask'), 24)
self.eq(nodes[0][1]['virts'].get('size'), 256)

msgs = await core.stormlist('[ test:ival=(2020, 2021) ]', opts=opts)
nodes = [mesg[1] for mesg in msgs if mesg[0] == 'node']
self.eq(nodes[0][1]['virts'].get('min'), 1577836800000000)
self.eq(nodes[0][1]['virts'].get('max'), 1609459200000000)
self.eq(nodes[0][1]['virts'].get('duration'), 31622400000000)

fork = await core.callStorm('return($lib.view.get().fork().iden)', opts=opts)
opts['view'] = fork

nodes = await core.nodes('inet:net=10.0.0.0/24', opts=opts)
await core.nodes('inet:net=10.0.0.0/24 | delnode', opts=opts)
pode = nodes[0].pack(virts=True)
self.eq(pode[1]['virts'], {})

# test set tag assignment
nodes = await core.nodes('[ test:str=boo +?#baz="dud" ]')
self.len(1, nodes)
Expand Down
30 changes: 12 additions & 18 deletions synapse/tests/test_model_inet.py
Original file line number Diff line number Diff line change
Expand Up @@ -1165,7 +1165,7 @@ async def test_net4(self):

expected = (((4, 16909060), (4, 84281096)), {
'subs': {'min': minsub, 'max': maxsub},
'virts': {'size': (67372036, 19)}
'virts': {'size': (67372037, 19)}
})

self.eq(await t.norm(valu), expected)
Expand All @@ -1187,7 +1187,7 @@ async def test_net4(self):

expected = (((4, 0x01020300), (4, 0x010203ff)), {
'subs': {'min': minsub, 'max': maxsub},
'virts': {'mask': (24, 2), 'size': (255, 19)}
'virts': {'mask': (24, 2), 'size': (256, 19)}
})
self.eq(await t.norm(valu), expected)

Expand Down Expand Up @@ -1261,7 +1261,7 @@ async def test_net6(self):

expected = (((6, 0), (6, 0xff)), {
'subs': {'min': minsub, 'max': maxsub},
'virts': {'mask': (120, 2), 'size': (255, 19)}
'virts': {'mask': (120, 2), 'size': (256, 19)}
})
self.eq(await t.norm(valu), expected)

Expand All @@ -1284,7 +1284,7 @@ async def test_net6(self):

expected = ((minv, maxv), {
'subs': {'min': minsub, 'max': maxsub},
'virts': {'size': (1208925819614629174771711, 19)}
'virts': {'size': (1208925819614629174771712, 19)}
})
self.eq(await t.norm(valu), expected)

Expand All @@ -1303,7 +1303,7 @@ async def test_net6(self):

expected = ((minv, maxv), {
'subs': {'min': minsub, 'max': maxsub},
'virts': {'mask': (101, 2), 'size': (134217727, 19)}
'virts': {'mask': (101, 2), 'size': (134217728, 19)}
})
self.eq(await t.norm(valu), expected)

Expand All @@ -1316,13 +1316,6 @@ async def test_net6(self):
with self.raises(s_exc.BadTypeValu):
await t.norm(((6, 1), (4, 1)))

valu = '::/0'
norm, info = await t.norm(valu)
self.eq(norm, ((6, 0), (6, 0xffffffffffffffffffffffffffffffff)))
self.eq(t.repr(norm), valu)
self.eq(info['subs']['min'][1], (6, 0))
self.eq(info['subs']['max'][1], (6, 0xffffffffffffffffffffffffffffffff))

valu = '2001:db8::/59'
norm, info = await t.norm(valu)
self.eq(norm, ((6, 0x20010db8000000000000000000000000), (6, 0x20010db80000001fffffffffffffffff)))
Expand All @@ -1334,23 +1327,24 @@ async def test_net6(self):
await core.nodes('inet:net=0::10.2.1.1/300')

await core.nodes('''[
inet:net="::/0"
inet:net=([[6, 0], [6, 0xfffffffffffffffffffffffffffffffe]])
inet:net=([[6, 0], [6, 0]])
inet:net=([[6, 0], [6, 0xff]])
inet:net=([[6, 0], [6, 0xfe]])
]''')

self.len(1, await core.nodes('inet:net -.mask'))
self.len(3, await core.nodes('inet:net +.mask'))
self.len(2, await core.nodes('inet:net -.mask'))
self.len(2, await core.nodes('inet:net +.mask'))

self.len(1, await core.nodes('inet:net.mask=0'))
self.len(1, await core.nodes('inet:net.mask=128'))
self.len(2, await core.nodes('inet:net.mask>18'))
self.len(0, await core.nodes('inet:net.size=0xffffffffffffffffffffffffffffffff'))
self.len(1, await core.nodes('inet:net.size=0x100000000000000000000000000000000'))
self.len(1, await core.nodes('inet:net.size=0xffffffffffffffffffffffffffffffff'))
self.len(1, await core.nodes('inet:net.size=1'))
self.len(3, await core.nodes('inet:net.size>254'))

with self.raises(s_exc.BadTypeValu):
await core.nodes('[ inet:net="::/0" ]')

async def test_port(self):
tname = 'inet:port'
async with self.getTestCore() as core:
Expand Down