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