File

teal-src/util/jsonpointer.tl @ 12790:24b55f0e2db9 0.12

mod_http: Allow disabling CORS in the http_cors_override option and by default Fixes #1779. Due to an oversight in the logic, if the user set 'enabled' to false in an override, it would disable the item's requested CORS settings, but still apply Prosody's default CORS policy. This change ensures that 'enabled = false' will now disable CORS entirely for the requested item. Due to the new structure of the code, it was necessary to have a flag to say whether CORS is to be applied at all. Rather than hard-coding 'true' here, I chose to add a new option: 'http_default_cors_enabled'. This is a boolean that allows the operator to disable Prosody's default CORS policy entirely (the one that is used when a module or config does not override it). This makes it easier to disable CORS and then selectively enable it only on services you want it on.
author Matthew Wild <mwild1@gmail.com>
date Mon, 31 Oct 2022 14:32:02 +0000
parent 12496:87c3d45208ef
line wrap: on
line source


local enum ptr_error
	"invalid-table"
	"invalid-path"
end

local function unescape_token(escaped_token : string) : string
	local unescaped = escaped_token:gsub("~1", "/"):gsub("~0", "~")
	return unescaped
end

local function resolve_json_pointer(ref : table, path : string) : any, ptr_error
	local ptr_len = #path+1
	for part, pos in path:gmatch("/([^/]*)()") do
		local token = unescape_token(part)
		if not ref is table then
			return nil
		end
		local idx = next(ref)
		local new_ref : any

		if idx is string then
			new_ref = ref[token]
		elseif idx is integer then
			local i = tonumber(token)
			if token == "-" then i = #ref + 1 end
			new_ref = ref[i+1]
		else
			return nil, "invalid-table"
		end

		if pos as integer == ptr_len then
			return new_ref
		elseif new_ref is table then
			ref = new_ref
		elseif not ref is table then
			return nil, "invalid-path"
		end

	end
	return ref
end

return {
	resolve = resolve_json_pointer,
}