Mercurial > prosody-modules
view mod_server_status/mod_server_status.lua @ 5193:2bb29ece216b
mod_http_oauth2: Implement stateless dynamic client registration
Replaces previous explicit registration that required either the
additional module mod_adhoc_oauth2_client or manually editing the
database. That method was enough to have something to test with, but
would not probably not scale easily.
Dynamic client registration allows creating clients on the fly, which
may be even easier in theory.
In order to not allow basically unauthenticated writes to the database,
we implement a stateless model here.
per_host_key := HMAC(config -> oauth2_registration_key, hostname)
client_id := JWT { client metadata } signed with per_host_key
client_secret := HMAC(per_host_key, client_id)
This should ensure everything we need to know is part of the client_id,
allowing redirects etc to be validated, and the client_secret can be
validated with only the client_id and the per_host_key.
A nonce injected into the client_id JWT should ensure nobody can submit
the same client metadata and retrieve the same client_secret
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 03 Mar 2023 21:14:19 +0100 |
parents | 7dbde05b48a9 |
children |
line wrap: on
line source
-- (C) 2011, Marco Cirillo (LW.Org) -- Display server stats in readable XML or JSON format module:depends("http") local base_path = module:get_option_string("server_status_basepath", "/server-status/") local show_hosts = module:get_option_array("server_status_show_hosts", nil) local show_comps = module:get_option_array("server_status_show_comps", nil) local json_output = module:get_option_boolean("server_status_json", false) local json_encode = require "util.json".encode -- code begin if not prosody.stanza_counter and not show_hosts and not show_comps then module:log ("error", "mod_server_status requires at least one of the following things:") module:log ("error", "mod_stanza_counter loaded, or either server_status_show_hosts or server_status_show_comps configuration values set.") module:log ("error", "check the module wiki at: http://code.google.com/p/prosody-modules/wiki/mod_server_status") return false end local response_table = {} response_table.header = '<?xml version="1.0" encoding="UTF-8" ?>' response_table.doc_header = '<document>' response_table.doc_closure = '</document>' response_table.stanzas = { elem_header = ' <stanzas>', elem_closure = ' </stanzas>', incoming = ' <incoming iq="%d" message="%d" presence="%d" />', outgoing = ' <outgoing iq="%d" message="%d" presence="%d" />' } response_table.hosts = { elem_header = ' <hosts>', elem_closure = ' </hosts>', status = ' <status name="%s" current="%s" />' } response_table.comps = { elem_header = ' <components>', elem_closure = ' </components>', status = ' <status name="%s" current="%s" />' } local function forge_response_xml() local hosts_s = {}; local components = {}; local stats = {}; local hosts_stats = {}; local comps_stats = {} local function t_builder(t,r) for _, bstring in ipairs(t) do r[#r+1] = bstring end end if show_hosts then t_builder(show_hosts, hosts_s) end if show_comps then t_builder(show_comps, components) end -- build stanza stats if there if prosody.stanza_counter then stats[1] = response_table.stanzas.elem_header stats[2] = response_table.stanzas.incoming:format(prosody.stanza_counter.iq["incoming"], prosody.stanza_counter.message["incoming"], prosody.stanza_counter.presence["incoming"]) stats[3] = response_table.stanzas.outgoing:format(prosody.stanza_counter.iq["outgoing"], prosody.stanza_counter.message["outgoing"], prosody.stanza_counter.presence["outgoing"]) stats[4] = response_table.stanzas.elem_closure end -- build hosts stats if there if hosts_s[1] then hosts_stats[1] = response_table.hosts.elem_header for _, name in ipairs(hosts_s) do hosts_stats[#hosts_stats+1] = response_table.hosts.status:format( name, hosts[name] and "online" or "offline") end hosts_stats[#hosts_stats+1] = response_table.hosts.elem_closure end -- build components stats if there if components[1] then comps_stats[1] = response_table.comps.elem_header for _, name in ipairs(components) do comps_stats[#comps_stats+1] = response_table.comps.status:format( name, hosts[name] and hosts[name].modules.component and hosts[name].modules.component.connected and "online" or hosts[name] and hosts[name].modules.component == nil and "online" or "offline") end comps_stats[#comps_stats+1] = response_table.comps.elem_closure end -- build xml document local result = {} result[#result+1] = response_table.header; result[#result+1] = response_table.doc_header -- start t_builder(stats, result); t_builder(hosts_stats, result); t_builder(comps_stats, result) result[#result+1] = response_table.doc_closure -- end return table.concat(result, "\n") end local function forge_response_json() local result = {} if prosody.stanza_counter then result.stanzas = {} ; result.stanzas = prosody.stanza_counter end if show_hosts then result.hosts = {} for _,n in ipairs(show_hosts) do result.hosts[n] = hosts[n] and "online" or "offline" end end if show_comps then result.components = {} for _,n in ipairs(show_comps) do result.components[n] = hosts[n] and hosts[n].modules.component and hosts[n].modules.component.connected and "online" or hosts[n] and hosts[n].modules.component == nil and "online" or "offline" end end return json_encode(result) end -- http handlers local function request(event) local response = event.response if not json_output then response.headers.content_type = "text/xml" response:send(forge_response_xml()) else response.headers.content_type = "application/json" response:send(forge_response_json()) end end -- initialization. module:provides("http", { default_path = base_path, route = { ["GET /"] = request } })