Annotate

plugins/mod_iq.lua @ 13801:a5d5fefb8b68 13.0

mod_tls: Enable Prosody's certificate checking for incoming s2s connections (fixes #1916) (thanks Damian, Zash) Various options in Prosody allow control over the behaviour of the certificate verification process For example, some deployments choose to allow falling back to traditional "dialback" authentication (XEP-0220), while others verify via DANE, hard-coded fingerprints, or other custom plugins. Implementing this flexibility requires us to override OpenSSL's default certificate verification, to allow Prosody to verify the certificate itself, apply custom policies and make decisions based on the outcome. To enable our custom logic, we have to suppress OpenSSL's default behaviour of aborting the connection with a TLS alert message. With LuaSec, this can be achieved by using the verifyext "lsec_continue" flag. We also need to use the lsec_ignore_purpose flag, because XMPP s2s uses server certificates as "client" certificates (for mutual TLS verification in outgoing s2s connections). Commit 99d2100d2918 moved these settings out of the defaults and into mod_s2s, because we only really need these changes for s2s, and they should be opt-in, rather than automatically applied to all TLS services we offer. That commit was incomplete, because it only added the flags for incoming direct TLS connections. StartTLS connections are handled by mod_tls, which was not applying the lsec_* flags. It previously worked because they were already in the defaults. This resulted in incoming s2s connections with "invalid" certificates being aborted early by OpenSSL, even if settings such as `s2s_secure_auth = false` or DANE were present in the config. Outgoing s2s connections inherit verify "none" from the defaults, which means OpenSSL will receive the cert but will not terminate the connection when it is deemed invalid. This means we don't need lsec_continue there, and we also don't need lsec_ignore_purpose (because the remote peer is a "server"). Wondering why we can't just use verify "none" for incoming s2s? It's because in that mode, OpenSSL won't request a certificate from the peer for incoming connections. Setting verify "peer" is how you ask OpenSSL to request a certificate from the client, but also what triggers its built-in verification.
author Matthew Wild <mwild1@gmail.com>
date Tue, 01 Apr 2025 17:26:56 +0100
parent 12977:74b9e05af71e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1421
diff changeset
1 -- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 1522
diff changeset
2 -- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 1522
diff changeset
3 -- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5370
diff changeset
4 --
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1421
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1421
diff changeset
6 -- COPYING file in the source package for more information.
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1421
diff changeset
7 --
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1421
diff changeset
8
1265
3f3c62e45eeb mod_iq: Error reply for IQ to non-existing session. mod_iq now handles all 'iq/full' cases
Waqas Hussain <waqas20@gmail.com>
parents: 1260
diff changeset
9
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 8728
diff changeset
10 local st = require "prosody.util.stanza";
1234
0ff02499f05c mod_message, mod_iq: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents: 1233
diff changeset
11
5370
7838acadb0fa mod_announce, mod_auth_anonymous, mod_c2s, mod_c2s, mod_component, mod_iq, mod_message, mod_presence, mod_tls: Access prosody.{hosts,bare_sessions,full_sessions} instead of the old globals
Kim Alvefur <zash@zash.se>
parents: 4966
diff changeset
12 local full_sessions = prosody.full_sessions;
1233
4c8c3d7d9c27 mod_iq: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
13
3679
afdce92d07be mod_iq: Fix an extra character in previous commit...
Waqas Hussain <waqas20@gmail.com>
parents: 3678
diff changeset
14 if module:get_host_type() == "local" then
3678
ce04b8b144de mod_iq: Don't hook 'iq/full' on components.
Waqas Hussain <waqas20@gmail.com>
parents: 3673
diff changeset
15 module:hook("iq/full", function(data)
8728
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
16 -- IQ to full JID received
3678
ce04b8b144de mod_iq: Don't hook 'iq/full' on components.
Waqas Hussain <waqas20@gmail.com>
parents: 3673
diff changeset
17 local origin, stanza = data.origin, data.stanza;
1233
4c8c3d7d9c27 mod_iq: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
18
3678
ce04b8b144de mod_iq: Don't hook 'iq/full' on components.
Waqas Hussain <waqas20@gmail.com>
parents: 3673
diff changeset
19 local session = full_sessions[stanza.attr.to];
4966
073eff2853a1 mod_iq: Don't treat an iq as handled if session.send() returns false
Matthew Wild <mwild1@gmail.com>
parents: 4870
diff changeset
20 if not (session and session.send(stanza)) then
3678
ce04b8b144de mod_iq: Don't hook 'iq/full' on components.
Waqas Hussain <waqas20@gmail.com>
parents: 3673
diff changeset
21 if stanza.attr.type == "get" or stanza.attr.type == "set" then
ce04b8b144de mod_iq: Don't hook 'iq/full' on components.
Waqas Hussain <waqas20@gmail.com>
parents: 3673
diff changeset
22 origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
ce04b8b144de mod_iq: Don't hook 'iq/full' on components.
Waqas Hussain <waqas20@gmail.com>
parents: 3673
diff changeset
23 end
1265
3f3c62e45eeb mod_iq: Error reply for IQ to non-existing session. mod_iq now handles all 'iq/full' cases
Waqas Hussain <waqas20@gmail.com>
parents: 1260
diff changeset
24 end
3678
ce04b8b144de mod_iq: Don't hook 'iq/full' on components.
Waqas Hussain <waqas20@gmail.com>
parents: 3673
diff changeset
25 return true;
ce04b8b144de mod_iq: Don't hook 'iq/full' on components.
Waqas Hussain <waqas20@gmail.com>
parents: 3673
diff changeset
26 end);
ce04b8b144de mod_iq: Don't hook 'iq/full' on components.
Waqas Hussain <waqas20@gmail.com>
parents: 3673
diff changeset
27 end
1233
4c8c3d7d9c27 mod_iq: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
28
4c8c3d7d9c27 mod_iq: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
29 module:hook("iq/bare", function(data)
8728
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
30 -- IQ to bare JID received
4760
55501fc4394b mod_iq: Remove unused import of jid.split, bare_sessions and don't unpack event.origin when it isn't used. Waqas.
Matthew Wild <mwild1@gmail.com>
parents: 3679
diff changeset
31 local stanza = data.stanza;
3657
07f0c2ef16cb mod_iq: Optimized a bit (fewer table accesses).
Waqas Hussain <waqas20@gmail.com>
parents: 3656
diff changeset
32 local type = stanza.attr.type;
1233
4c8c3d7d9c27 mod_iq: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
33
4c8c3d7d9c27 mod_iq: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
34 -- TODO fire post processing events
3657
07f0c2ef16cb mod_iq: Optimized a bit (fewer table accesses).
Waqas Hussain <waqas20@gmail.com>
parents: 3656
diff changeset
35 if type == "get" or type == "set" then
3658
13600f0d56b5 mod_iq: Optimized a bit more (fewer table accesses).
Waqas Hussain <waqas20@gmail.com>
parents: 3657
diff changeset
36 local child = stanza.tags[1];
4870
ca39f9b4cc8e mod_iq: Use "jabber:client" when the stanza payload namespace is nil.
Waqas Hussain <waqas20@gmail.com>
parents: 4760
diff changeset
37 local xmlns = child.attr.xmlns or "jabber:client";
ca39f9b4cc8e mod_iq: Use "jabber:client" when the stanza payload namespace is nil.
Waqas Hussain <waqas20@gmail.com>
parents: 4760
diff changeset
38 local ret = module:fire_event("iq/bare/"..xmlns..":"..child.name, data);
3656
71fd1582f01b mod_iq: Extra IQ get and set sub-events are now fired: "iq-{get,set}/{host,self,bare}/xmlns:tag" (when "iq/{host,self,bare}/xmlns:tag" is unhandled).
Waqas Hussain <waqas20@gmail.com>
parents: 3647
diff changeset
39 if ret ~= nil then return ret; end
4870
ca39f9b4cc8e mod_iq: Use "jabber:client" when the stanza payload namespace is nil.
Waqas Hussain <waqas20@gmail.com>
parents: 4760
diff changeset
40 return module:fire_event("iq-"..type.."/bare/"..xmlns..":"..child.name, data);
1260
04c1fae0eb03 mod_iq: Fire sub-events for IQs directed at bare JIDs and hosts
Waqas Hussain <waqas20@gmail.com>
parents: 1234
diff changeset
41 else
3673
43b854062206 mod_iq: Don't stop event dispatch for unhandled IQ errors and results (this lets negative priority handlers intercept the events).
Waqas Hussain <waqas20@gmail.com>
parents: 3658
diff changeset
42 return module:fire_event("iq-"..type.."/bare/"..stanza.attr.id, data);
1260
04c1fae0eb03 mod_iq: Fire sub-events for IQs directed at bare JIDs and hosts
Waqas Hussain <waqas20@gmail.com>
parents: 1234
diff changeset
43 end
1233
4c8c3d7d9c27 mod_iq: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
44 end);
4c8c3d7d9c27 mod_iq: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
45
2686
d0d38fcaade0 mod_iq: Fire sub-events for iq/self events.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
46 module:hook("iq/self", function(data)
8728
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
47 -- IQ to self JID received
4760
55501fc4394b mod_iq: Remove unused import of jid.split, bare_sessions and don't unpack event.origin when it isn't used. Waqas.
Matthew Wild <mwild1@gmail.com>
parents: 3679
diff changeset
48 local stanza = data.stanza;
3657
07f0c2ef16cb mod_iq: Optimized a bit (fewer table accesses).
Waqas Hussain <waqas20@gmail.com>
parents: 3656
diff changeset
49 local type = stanza.attr.type;
2686
d0d38fcaade0 mod_iq: Fire sub-events for iq/self events.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
50
3657
07f0c2ef16cb mod_iq: Optimized a bit (fewer table accesses).
Waqas Hussain <waqas20@gmail.com>
parents: 3656
diff changeset
51 if type == "get" or type == "set" then
3658
13600f0d56b5 mod_iq: Optimized a bit more (fewer table accesses).
Waqas Hussain <waqas20@gmail.com>
parents: 3657
diff changeset
52 local child = stanza.tags[1];
4870
ca39f9b4cc8e mod_iq: Use "jabber:client" when the stanza payload namespace is nil.
Waqas Hussain <waqas20@gmail.com>
parents: 4760
diff changeset
53 local xmlns = child.attr.xmlns or "jabber:client";
ca39f9b4cc8e mod_iq: Use "jabber:client" when the stanza payload namespace is nil.
Waqas Hussain <waqas20@gmail.com>
parents: 4760
diff changeset
54 local ret = module:fire_event("iq/self/"..xmlns..":"..child.name, data);
3656
71fd1582f01b mod_iq: Extra IQ get and set sub-events are now fired: "iq-{get,set}/{host,self,bare}/xmlns:tag" (when "iq/{host,self,bare}/xmlns:tag" is unhandled).
Waqas Hussain <waqas20@gmail.com>
parents: 3647
diff changeset
55 if ret ~= nil then return ret; end
4870
ca39f9b4cc8e mod_iq: Use "jabber:client" when the stanza payload namespace is nil.
Waqas Hussain <waqas20@gmail.com>
parents: 4760
diff changeset
56 return module:fire_event("iq-"..type.."/self/"..xmlns..":"..child.name, data);
2686
d0d38fcaade0 mod_iq: Fire sub-events for iq/self events.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
57 else
3673
43b854062206 mod_iq: Don't stop event dispatch for unhandled IQ errors and results (this lets negative priority handlers intercept the events).
Waqas Hussain <waqas20@gmail.com>
parents: 3658
diff changeset
58 return module:fire_event("iq-"..type.."/self/"..stanza.attr.id, data);
2686
d0d38fcaade0 mod_iq: Fire sub-events for iq/self events.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
59 end
d0d38fcaade0 mod_iq: Fire sub-events for iq/self events.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
60 end);
d0d38fcaade0 mod_iq: Fire sub-events for iq/self events.
Waqas Hussain <waqas20@gmail.com>
parents: 1522
diff changeset
61
1233
4c8c3d7d9c27 mod_iq: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
62 module:hook("iq/host", function(data)
8728
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
63 -- IQ to a local host received
4760
55501fc4394b mod_iq: Remove unused import of jid.split, bare_sessions and don't unpack event.origin when it isn't used. Waqas.
Matthew Wild <mwild1@gmail.com>
parents: 3679
diff changeset
64 local stanza = data.stanza;
3657
07f0c2ef16cb mod_iq: Optimized a bit (fewer table accesses).
Waqas Hussain <waqas20@gmail.com>
parents: 3656
diff changeset
65 local type = stanza.attr.type;
1233
4c8c3d7d9c27 mod_iq: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
66
3657
07f0c2ef16cb mod_iq: Optimized a bit (fewer table accesses).
Waqas Hussain <waqas20@gmail.com>
parents: 3656
diff changeset
67 if type == "get" or type == "set" then
3658
13600f0d56b5 mod_iq: Optimized a bit more (fewer table accesses).
Waqas Hussain <waqas20@gmail.com>
parents: 3657
diff changeset
68 local child = stanza.tags[1];
4870
ca39f9b4cc8e mod_iq: Use "jabber:client" when the stanza payload namespace is nil.
Waqas Hussain <waqas20@gmail.com>
parents: 4760
diff changeset
69 local xmlns = child.attr.xmlns or "jabber:client";
ca39f9b4cc8e mod_iq: Use "jabber:client" when the stanza payload namespace is nil.
Waqas Hussain <waqas20@gmail.com>
parents: 4760
diff changeset
70 local ret = module:fire_event("iq/host/"..xmlns..":"..child.name, data);
3656
71fd1582f01b mod_iq: Extra IQ get and set sub-events are now fired: "iq-{get,set}/{host,self,bare}/xmlns:tag" (when "iq/{host,self,bare}/xmlns:tag" is unhandled).
Waqas Hussain <waqas20@gmail.com>
parents: 3647
diff changeset
71 if ret ~= nil then return ret; end
4870
ca39f9b4cc8e mod_iq: Use "jabber:client" when the stanza payload namespace is nil.
Waqas Hussain <waqas20@gmail.com>
parents: 4760
diff changeset
72 return module:fire_event("iq-"..type.."/host/"..xmlns..":"..child.name, data);
1260
04c1fae0eb03 mod_iq: Fire sub-events for IQs directed at bare JIDs and hosts
Waqas Hussain <waqas20@gmail.com>
parents: 1234
diff changeset
73 else
3673
43b854062206 mod_iq: Don't stop event dispatch for unhandled IQ errors and results (this lets negative priority handlers intercept the events).
Waqas Hussain <waqas20@gmail.com>
parents: 3658
diff changeset
74 return module:fire_event("iq-"..type.."/host/"..stanza.attr.id, data);
1260
04c1fae0eb03 mod_iq: Fire sub-events for IQs directed at bare JIDs and hosts
Waqas Hussain <waqas20@gmail.com>
parents: 1234
diff changeset
75 end
1233
4c8c3d7d9c27 mod_iq: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
76 end);