109 lines
3.2 KiB
Lua
109 lines
3.2 KiB
Lua
-- SPDX-License-Identifier: GPL-3.0-or-later
|
|
-- check lua-psl is available
|
|
local has_psl = pcall(require, 'psl')
|
|
if not has_psl then
|
|
os.exit(77) -- SKIP policy.slice
|
|
end
|
|
|
|
-- unload modules which are not related to this test
|
|
if ta_update then
|
|
modules.unload('ta_update')
|
|
end
|
|
if ta_signal_query then
|
|
modules.unload('ta_signal_query')
|
|
end
|
|
if priming then
|
|
modules.unload('priming')
|
|
end
|
|
if detect_time_skew then
|
|
modules.unload('detect_time_skew')
|
|
end
|
|
|
|
local kres = require('kres')
|
|
|
|
local slice_queries = {
|
|
{},
|
|
{},
|
|
{},
|
|
}
|
|
|
|
local function sliceaction(index)
|
|
return function(_, req)
|
|
-- log query
|
|
local qry = req:current()
|
|
local name = kres.dname2str(qry:name())
|
|
local count = slice_queries[index][name]
|
|
if not count then
|
|
count = 0
|
|
end
|
|
slice_queries[index][name] = count + 1
|
|
|
|
-- refuse query
|
|
local answer = req:ensure_answer()
|
|
if answer == nil then return nil end
|
|
answer:rcode(kres.rcode.REFUSED)
|
|
answer:ad(false)
|
|
return kres.DONE
|
|
end
|
|
end
|
|
|
|
-- configure slicing
|
|
policy.add(policy.slice(
|
|
policy.slice_randomize_psl(0),
|
|
sliceaction(1),
|
|
sliceaction(2),
|
|
sliceaction(3)
|
|
))
|
|
|
|
local function check_slice(desc, qname, qtype, expected_slice, expected_count)
|
|
callback = function()
|
|
count = slice_queries[expected_slice][qname]
|
|
qtype_str = kres.tostring.type[qtype]
|
|
same(count, expected_count, desc .. qname .. ' ' .. qtype_str)
|
|
end
|
|
resolve(qname, qtype, kres.class.IN, {}, callback)
|
|
end
|
|
|
|
local function test_randomize_psl()
|
|
local desc = 'randomize_psl() same qname, different qtype (same slice): '
|
|
check_slice(desc, 'example.com.', kres.type.A, 2, 1)
|
|
check_slice(desc, 'example.com.', kres.type.AAAA, 2, 2)
|
|
check_slice(desc, 'example.com.', kres.type.MX, 2, 3)
|
|
check_slice(desc, 'example.com.', kres.type.NS, 2, 4)
|
|
|
|
desc = 'randomize_psl() subdomain in same slice: '
|
|
check_slice(desc, 'a.example.com.', kres.type.A, 2, 1)
|
|
check_slice(desc, 'b.example.com.', kres.type.A, 2, 1)
|
|
check_slice(desc, 'c.example.com.', kres.type.A, 2, 1)
|
|
check_slice(desc, 'a.a.example.com.', kres.type.A, 2, 1)
|
|
check_slice(desc, 'a.a.a.example.com.', kres.type.A, 2, 1)
|
|
|
|
desc = 'randomize_psl() different qnames in different slices: '
|
|
check_slice(desc, 'example2.com.', kres.type.A, 1, 1)
|
|
check_slice(desc, 'example5.com.', kres.type.A, 3, 1)
|
|
|
|
desc = 'randomize_psl() check unregistrable domains: '
|
|
check_slice(desc, '.', kres.type.A, 3, 1)
|
|
check_slice(desc, 'com.', kres.type.A, 1, 1)
|
|
check_slice(desc, 'cz.', kres.type.A, 2, 1)
|
|
check_slice(desc, 'co.uk.', kres.type.A, 1, 1)
|
|
|
|
desc = 'randomize_psl() check multi-level reg. domains: '
|
|
check_slice(desc, 'example.co.uk.', kres.type.A, 3, 1)
|
|
check_slice(desc, 'a.example.co.uk.', kres.type.A, 3, 1)
|
|
check_slice(desc, 'b.example.co.uk.', kres.type.MX, 3, 1)
|
|
check_slice(desc, 'example2.co.uk.', kres.type.A, 2, 1)
|
|
|
|
desc = 'randomize_psl() reg. domain - always ends up in slice: '
|
|
check_slice(desc, 'fdsnnsdfvkdn.com.', kres.type.A, 3, 1)
|
|
check_slice(desc, 'bdfbd.cz.', kres.type.A, 1, 1)
|
|
check_slice(desc, 'nrojgvn.net.', kres.type.A, 1, 1)
|
|
check_slice(desc, 'jnojtnbv.engineer.', kres.type.A, 2, 1)
|
|
check_slice(desc, 'dfnjonfdsjg.gov.', kres.type.A, 1, 1)
|
|
check_slice(desc, 'okfjnosdfgjn.mil.', kres.type.A, 1, 1)
|
|
check_slice(desc, 'josdhnojn.test.', kres.type.A, 2, 1)
|
|
end
|
|
|
|
return {
|
|
test_randomize_psl,
|
|
}
|