and_cesbo icon

Astra Relay: auth_request

and_cesbo | PRO | 06/11/14 05:00:41 PM UTC | 0 ⭐ | 1132 👁️ | Never ⏰ | []
Lua |

1.75 KB

|

None

|

0 👍

/

0 👎

channels = {
    -- promo channel for auth_request redirect
    ["promo"] = "...",
    -- channel list
}
 
access_list_file = "/etc/astra/access_list.txt"
access_redirect = "/promo"
 
function ip_to_number(ip)
    ip = split(ip, "%.")
    if #ip ~= 4 then return 0 end
    for k,v in ipairs(ip) do
        ip[k] = tonumber(v)
        if not ip[k] then return 0 end
    end
    return (ip[1] * 0x1000000) + (ip[2] * 0x10000) + (ip[3] * 0x100) + (ip[4])
end
 
function mask_to_number(mask)
    local a = 0xFFFFFFFF
    local m = 32 - tonumber(mask)
    if m > 0 then
        a = bit32.rshift(a, m)
        a = bit32.lshift(a, m)
    end
    return a
end
 
function ip_check(ip)
    ip = ip_to_number(ip)
    for _,v in ipairs(access_list) do
        if v[1] == bit32.band(ip, v[2]) then return true end
    end
    return false
end
 
function load_access_list()
    local r = {}
    local f = io.open(access_list_file, "r")
    for ip in f:lines() do
        local b = ip:find("/")
        if b then
            local a = ip_to_number(ip:sub(1, b - 1))
            local m = mask_to_number(ip:sub(b + 1))
            a = bit32.band(a, m)
            table.insert(r, { a, m })
        else
            local a = ip_to_number(ip)
            local m = mask_to_number(32)
            table.insert(r, { a, m })
        end
    end
    f:close()
    return r
end
 
access_list = load_access_list()
 
function auth_request(client_id, request, auth_callback)
    if not request then
        return nil
    end
 
    if request.path == access_redirect then
        auth_callback(true)
        return nil
    end
 
    if ip_check(request.addr) then
        auth_callback(true)
    else
        auth_callback(access_redirect)
    end
end

Comments