iocaine 3.0.0

The deadliest poison known to AI
Documentation
function string:starts_with(start)
   return self:sub(1, #start) == start
end

function string:trim()
   return self:match("^%s*(.-)%s*$")
end

function load_from_json(path)
   local data = iocaine.file.read_as_json(path)
   local keys = {}
   for k, _ in pairs(data) do
      table.insert(keys, k)
   end

   return iocaine.matcher.Patterns(table.unpack(keys))
end

function load_from_file(path)
   local data = iocaine.file.read_as_string(path):trim()
   local keys = {}
   for line in string.gmatch(data, "[^\n]+") do
      table.insert(keys, line)
   end
   return iocaine.matcher.Patterns(table.unpack(keys))
end

local Garbage = "Garbage"
local Challenge = "Challenge"
local NotForUs = "NotForUs"

local matchers = {
   ["patterns.test-1"] = iocaine.matcher.Patterns("ClaudeBot"),
   ["patterns.data"] = load_from_json("tests/request-handler/data.json"),
   ["patterns.data-txt"] = load_from_file("tests/request-handler/data.txt"),
   ["regexes.test-1"] = iocaine.matcher.Regex("Firefox \\d\\.\\d"),
   ["regexes.capture-groups"] = iocaine.matcher.Regex(
      "AppleWebKit/(?<AppleWebKitVersion>(\\d+\\.?)+).*Safari/(?<SafariVersion>(\\d+\\.?)+)"
   ):as_regex_matcher(),
   ["regexsets.test-1"] = iocaine.matcher.RegexSet("iocaine.*malicious-agent", "iocaine.*terrible"),
   ["prefixes.test-1"] = iocaine.matcher.IPPrefixes("207.241.237.0/24")
}

function decide(request)
   if request:header("user-agent") == "iocaine-test::bad-agent" then
      return Garbage
   end
   if request.method == "INVALID" then
      return Garbage
   end
   if request.path:starts_with("/cgi-bin/") then
      return Garbage
   end
   if request:query("capitalism") == "good" then
      return Garbage
   end
   if request:query("capitalism") == "bad" then
      return NotForUs
   end
   if request:query("capitalism") ~= nil then
      return Challenge
   end
   if request:cookie("tracking-id") ~= nil then
      return Garbage
   end
   if matchers["patterns.test-1"]:matches(request:header("user-agent")) then
      return Garbage
   end
   if matchers["regexes.test-1"]:matches(request:header("user-agent")) then
      return Garbage
   end
   local xff = request:header("x-forwarded-for")
   if xff and matchers["prefixes.test-1"]:matches(xff) then
      return Garbage
   end
   if matchers["patterns.data"]:matches(request:header("user-agent")) then
      return Garbage
   end
   if matchers["patterns.data-txt"]:matches(request:header("user-agent")) then
      return Garbage
   end

   local webkit_version = matchers["regexes.capture-groups"]:capture(request:header("user-agent"), "AppleWebKitVersion")
   local safari_version = matchers["regexes.capture-groups"]:capture(request:header("user-agent"), "SafariVersion")
   if webkit_version ~= safari_version then
      return Garbage
   end

   if matchers["regexsets.test-1"]:matches(request:header("user-agent")) then
      return Garbage
   end

   local secchua = iocaine.SecCHUA(request:header("sec-ch-ua"))
   if secchua and secchua:contains_item("Chromium") then
      return Garbage
   end

   return NotForUs
end