You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.2 KiB
Lua
55 lines
1.2 KiB
Lua
local lpeg = require "lpeg"
|
|
local http_core = require "lpeg_patterns.http.core"
|
|
local http_utils = require "lpeg_patterns.http.util"
|
|
|
|
local Cmt = lpeg.Cmt
|
|
local P = lpeg.P
|
|
|
|
-- RFC 7469
|
|
local Public_Key_Directives = http_utils.directive * (http_core.OWS * P";" * http_core.OWS * http_utils.directive)^0
|
|
local function pkp_cmt(pins, t, k, v, ...)
|
|
-- duplicates are allowed if the directive name starts with "pin-"
|
|
local pin_name = k:match("^pin%-(.+)")
|
|
if pin_name then
|
|
local hashes = pins[pin_name]
|
|
if hashes then
|
|
hashes[#hashes+1] = v
|
|
else
|
|
hashes = {v}
|
|
pins[pin_name] = hashes
|
|
end
|
|
else
|
|
local old = t[k]
|
|
if old then
|
|
return false
|
|
end
|
|
t[k] = v
|
|
end
|
|
if ... then
|
|
return pkp_cmt(pins, t, ...)
|
|
else
|
|
return true
|
|
end
|
|
end
|
|
local Public_Key_Pins = Cmt(Public_Key_Directives, function(_, _, ...)
|
|
local pins = {}
|
|
local t = {}
|
|
local ok = pkp_cmt(pins, t, ...)
|
|
if ok and t["max-age"] then
|
|
return true, pins, t
|
|
end
|
|
end)
|
|
local Public_Key_Pins_Report_Only = Cmt(Public_Key_Directives, function(_, _, ...)
|
|
local pins = {}
|
|
local t = {}
|
|
local ok = pkp_cmt(pins, t, ...)
|
|
if ok then
|
|
return true, pins, t
|
|
end
|
|
end)
|
|
|
|
return {
|
|
Public_Key_Pins = Public_Key_Pins;
|
|
Public_Key_Pins_Report_Only = Public_Key_Pins_Report_Only;
|
|
}
|