annotate mod_statsd/mod_statsd.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 c3a039972b74
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1443
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
1 -- Log common stats to statsd
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
2 --
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
3 -- Copyright (C) 2014 Daurnimator
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
4 --
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
5 -- This module is MIT/X11 licensed.
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
6
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
7 local socket = require "socket"
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
8 local iterators = require "util.iterators"
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
9 local jid = require "util.jid"
2425
26c68a5f432f mod_statsd: Import bare_sessions from the prosody global, using it as a global directly is deprecated
Kim Alvefur <zash@zash.se>
parents: 1451
diff changeset
10 local bare_sessions = prosody.bare_sessions;
1443
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
11
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
12 local options = module:get_option("statsd") or {}
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
13
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
14 -- Create UDP socket to statsd server
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
15 local sock = socket.udp()
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
16 sock:setpeername(options.hostname or "127.0.0.1", options.port or 8125)
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
17
2875
c3a039972b74 mod_statsd: Fix typo in comment [codespell]
Kim Alvefur <zash@zash.se>
parents: 2425
diff changeset
18 -- Metrics are namespaced by ".", and separated by newline
1447
e96ac4291b36 mod_statsd: Clean off colons (:)
daurnimator <quae@daurnimator.com>
parents: 1443
diff changeset
19 function clean(s) return (s:gsub("[%.:\n]", "_")) end
1443
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
20
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
21 -- A 'safer' send function to expose
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
22 function send(s) return sock:send(s) end
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
23
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
24 -- prefix should end in "."
1448
d722a4defea7 mod_statsd: Optionally include host in prefix
daurnimator <quae@daurnimator.com>
parents: 1447
diff changeset
25 local prefix = (options.prefix or "prosody") .. "."
d722a4defea7 mod_statsd: Optionally include host in prefix
daurnimator <quae@daurnimator.com>
parents: 1447
diff changeset
26 if not options.no_host then
d722a4defea7 mod_statsd: Optionally include host in prefix
daurnimator <quae@daurnimator.com>
parents: 1447
diff changeset
27 prefix = prefix .. clean(module.host) .. "."
d722a4defea7 mod_statsd: Optionally include host in prefix
daurnimator <quae@daurnimator.com>
parents: 1447
diff changeset
28 end
1443
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
29
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
30 -- Track users as they bind/unbind
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
31 -- count bare sessions every time, as we have no way to tell if it's a new bare session or not
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
32 module:hook("resource-bind", function(event)
1451
d31ace5b1175 mod_statsd: Add missing `pairs` call
daurnimator <quae@daurnimator.com>
parents: 1449
diff changeset
33 send(prefix.."bare_sessions:"..iterators.count(pairs(bare_sessions)).."|g")
1443
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
34 send(prefix.."full_sessions:+1|g")
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
35 end, 1)
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
36 module:hook("resource-unbind", function(event)
1451
d31ace5b1175 mod_statsd: Add missing `pairs` call
daurnimator <quae@daurnimator.com>
parents: 1449
diff changeset
37 send(prefix.."bare_sessions:"..iterators.count(pairs(bare_sessions)).."|g")
1443
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
38 send(prefix.."full_sessions:-1|g")
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
39 end, 1)
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
40
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
41 -- Track MUC occupants as they join/leave
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
42 module:hook("muc-occupant-joined", function(event)
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
43 send(prefix.."n_occupants:+1|g")
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
44 local room_node = jid.split(event.room.jid)
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
45 send(prefix..clean(room_node)..".occupants:+1|g")
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
46 end)
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
47 module:hook("muc-occupant-left", function(event)
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
48 send(prefix.."n_occupants:-1|g")
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
49 local room_node = jid.split(event.room.jid)
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
50 send(prefix..clean(room_node)..".occupants:-1|g")
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
51 end)
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
52
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
53 -- Misc other MUC
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
54 module:hook("muc-broadcast-message", function(event)
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
55 send(prefix.."broadcast-message:1|c")
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
56 local room_node = jid.split(event.room.jid)
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
57 send(prefix..clean(room_node)..".broadcast-message:1|c")
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
58 end)
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
59 module:hook("muc-invite", function(event)
1449
365f6db9531a mod_statsd: Better accounting for invites, add declines
daurnimator <quae@daurnimator.com>
parents: 1448
diff changeset
60 -- Total count
1443
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
61 send(prefix.."invite:1|c")
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
62 local room_node = jid.split(event.room.jid)
1449
365f6db9531a mod_statsd: Better accounting for invites, add declines
daurnimator <quae@daurnimator.com>
parents: 1448
diff changeset
63 -- Counts per room
1443
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
64 send(prefix..clean(room_node)..".invite:1|c")
1449
365f6db9531a mod_statsd: Better accounting for invites, add declines
daurnimator <quae@daurnimator.com>
parents: 1448
diff changeset
65 -- Counts per recipient
365f6db9531a mod_statsd: Better accounting for invites, add declines
daurnimator <quae@daurnimator.com>
parents: 1448
diff changeset
66 send(prefix..clean(event.stanza.attr.to)..".invited:1|c")
1443
faf1a5d89cd7 mod_statsd: First commit
daurnimator <quae@daurnimator.com>
parents:
diff changeset
67 end)
1449
365f6db9531a mod_statsd: Better accounting for invites, add declines
daurnimator <quae@daurnimator.com>
parents: 1448
diff changeset
68 module:hook("muc-decline", function(event)
365f6db9531a mod_statsd: Better accounting for invites, add declines
daurnimator <quae@daurnimator.com>
parents: 1448
diff changeset
69 -- Total count
365f6db9531a mod_statsd: Better accounting for invites, add declines
daurnimator <quae@daurnimator.com>
parents: 1448
diff changeset
70 send(prefix.."decline:1|c")
365f6db9531a mod_statsd: Better accounting for invites, add declines
daurnimator <quae@daurnimator.com>
parents: 1448
diff changeset
71 local room_node = jid.split(event.room.jid)
365f6db9531a mod_statsd: Better accounting for invites, add declines
daurnimator <quae@daurnimator.com>
parents: 1448
diff changeset
72 -- Counts per room
365f6db9531a mod_statsd: Better accounting for invites, add declines
daurnimator <quae@daurnimator.com>
parents: 1448
diff changeset
73 send(prefix..clean(room_node)..".decline:1|c")
365f6db9531a mod_statsd: Better accounting for invites, add declines
daurnimator <quae@daurnimator.com>
parents: 1448
diff changeset
74 -- Counts per sender
365f6db9531a mod_statsd: Better accounting for invites, add declines
daurnimator <quae@daurnimator.com>
parents: 1448
diff changeset
75 send(prefix..clean(event.incoming.attr.from)..".declined:1|c")
365f6db9531a mod_statsd: Better accounting for invites, add declines
daurnimator <quae@daurnimator.com>
parents: 1448
diff changeset
76 end)