Software / code / prosody
Annotate
util/logger.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 | 12975:d10957394a3c |
| rev | line source |
|---|---|
|
1523
841d61be198f
Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents:
1020
diff
changeset
|
1 -- Prosody IM |
|
2923
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
1523
diff
changeset
|
2 -- Copyright (C) 2008-2010 Matthew Wild |
|
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
1523
diff
changeset
|
3 -- Copyright (C) 2008-2010 Waqas Hussain |
|
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
4937
diff
changeset
|
4 -- |
| 758 | 5 -- This project is MIT/X11 licensed. Please see the |
| 6 -- COPYING file in the source package for more information. | |
|
519
cccd610a0ef9
Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents:
437
diff
changeset
|
7 -- |
|
7131
ea3eea291321
util.logger: Silence luacheck warning
Kim Alvefur <zash@zash.se>
parents:
7130
diff
changeset
|
8 -- luacheck: ignore 213/level |
|
519
cccd610a0ef9
Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents:
437
diff
changeset
|
9 |
|
7130
2b48ce0bfe7d
util.logger: Remove unused locals
Kim Alvefur <zash@zash.se>
parents:
6777
diff
changeset
|
10 local pairs = pairs; |
|
8556
5800f0c7afd6
util.logger: Import globals (fixes on Lua 5.2)
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
11 local ipairs = ipairs; |
|
5800f0c7afd6
util.logger: Import globals (fixes on Lua 5.2)
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
12 local require = require; |
|
12394
86d6b069b892
util.logger: Support for removing individual log sinks without a full reset
Matthew Wild <mwild1@gmail.com>
parents:
8556
diff
changeset
|
13 local t_remove = table.remove; |
| 262 | 14 |
|
6777
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
5776
diff
changeset
|
15 local _ENV = nil; |
|
8555
4f0f5b49bb03
vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents:
8553
diff
changeset
|
16 -- luacheck: std none |
| 30 | 17 |
|
4627
b046cafc81a8
loggingmanager, util.logger: Remove name sinks and the ability to filter logs by source name (lots of code, hardly used if at all, and possibly broken)
Matthew Wild <mwild1@gmail.com>
parents:
3556
diff
changeset
|
18 local level_sinks = {}; |
| 262 | 19 |
|
1015
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
20 local make_logger; |
|
582
8eb45a8099c4
Make it possible to set custom output handler for logger
Matthew Wild <mwild1@gmail.com>
parents:
519
diff
changeset
|
21 |
|
6777
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
5776
diff
changeset
|
22 local function init(name) |
|
1015
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
23 local log_debug = make_logger(name, "debug"); |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
24 local log_info = make_logger(name, "info"); |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
25 local log_warn = make_logger(name, "warn"); |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
26 local log_error = make_logger(name, "error"); |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
27 |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
28 return function (level, message, ...) |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
29 if level == "debug" then |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
30 return log_debug(message, ...); |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
31 elseif level == "info" then |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
32 return log_info(message, ...); |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
33 elseif level == "warn" then |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
34 return log_warn(message, ...); |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
35 elseif level == "error" then |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
36 return log_error(message, ...); |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
37 end |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
38 end |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
39 end |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
40 |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
41 function make_logger(source_name, level) |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
42 local level_handlers = level_sinks[level]; |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
43 if not level_handlers then |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
44 level_handlers = {}; |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
45 level_sinks[level] = level_handlers; |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
46 end |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
47 |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
48 local logger = function (message, ...) |
|
3554
1770f8aaf04a
util.logger: Remove my precious premature optimisation :(
Matthew Wild <mwild1@gmail.com>
parents:
3540
diff
changeset
|
49 for i = 1,#level_handlers do |
|
1015
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
50 level_handlers[i](source_name, level, message, ...); |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
51 end |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
52 end |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
53 |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
54 return logger; |
| 30 | 55 end |
| 56 | |
|
6777
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
5776
diff
changeset
|
57 local function reset() |
|
3357
1dd83dd2b832
util.logger: Add reset() method to clear all sinks
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
58 for level, handler_list in pairs(level_sinks) do |
|
1dd83dd2b832
util.logger: Add reset() method to clear all sinks
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
59 -- Clear all handlers for this level |
|
1dd83dd2b832
util.logger: Add reset() method to clear all sinks
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
60 for i = 1, #handler_list do |
|
1dd83dd2b832
util.logger: Add reset() method to clear all sinks
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
61 handler_list[i] = nil; |
|
1dd83dd2b832
util.logger: Add reset() method to clear all sinks
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
62 end |
|
1dd83dd2b832
util.logger: Add reset() method to clear all sinks
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
63 end |
|
1dd83dd2b832
util.logger: Add reset() method to clear all sinks
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
64 end |
|
1dd83dd2b832
util.logger: Add reset() method to clear all sinks
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
65 |
|
6777
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
5776
diff
changeset
|
66 local function add_level_sink(level, sink_function) |
|
1015
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
67 if not level_sinks[level] then |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
68 level_sinks[level] = { sink_function }; |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
69 else |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
70 level_sinks[level][#level_sinks[level] + 1 ] = sink_function; |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
71 end |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
72 end |
|
9e31e9397cff
util.logger: Revamped logger library, but backwards-compatible for users of logger.init()
Matthew Wild <mwild1@gmail.com>
parents:
977
diff
changeset
|
73 |
|
8553
32438665dc5e
util.logger: New method 'add_simple_sink', logger.add_simple_sink(print) works
Matthew Wild <mwild1@gmail.com>
parents:
7131
diff
changeset
|
74 local function add_simple_sink(simple_sink_function, levels) |
|
12975
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12395
diff
changeset
|
75 local format = require "prosody.util.format".format; |
|
8553
32438665dc5e
util.logger: New method 'add_simple_sink', logger.add_simple_sink(print) works
Matthew Wild <mwild1@gmail.com>
parents:
7131
diff
changeset
|
76 local function sink_function(name, level, msg, ...) |
|
32438665dc5e
util.logger: New method 'add_simple_sink', logger.add_simple_sink(print) works
Matthew Wild <mwild1@gmail.com>
parents:
7131
diff
changeset
|
77 return simple_sink_function(name, level, format(msg, ...)); |
|
32438665dc5e
util.logger: New method 'add_simple_sink', logger.add_simple_sink(print) works
Matthew Wild <mwild1@gmail.com>
parents:
7131
diff
changeset
|
78 end |
|
32438665dc5e
util.logger: New method 'add_simple_sink', logger.add_simple_sink(print) works
Matthew Wild <mwild1@gmail.com>
parents:
7131
diff
changeset
|
79 for _, level in ipairs(levels or {"debug", "info", "warn", "error"}) do |
|
32438665dc5e
util.logger: New method 'add_simple_sink', logger.add_simple_sink(print) works
Matthew Wild <mwild1@gmail.com>
parents:
7131
diff
changeset
|
80 add_level_sink(level, sink_function); |
|
32438665dc5e
util.logger: New method 'add_simple_sink', logger.add_simple_sink(print) works
Matthew Wild <mwild1@gmail.com>
parents:
7131
diff
changeset
|
81 end |
|
12395
1e34b910b73a
util.logger: Return sink_function from add_simple_sink()
Matthew Wild <mwild1@gmail.com>
parents:
12394
diff
changeset
|
82 return sink_function; |
|
8553
32438665dc5e
util.logger: New method 'add_simple_sink', logger.add_simple_sink(print) works
Matthew Wild <mwild1@gmail.com>
parents:
7131
diff
changeset
|
83 end |
|
32438665dc5e
util.logger: New method 'add_simple_sink', logger.add_simple_sink(print) works
Matthew Wild <mwild1@gmail.com>
parents:
7131
diff
changeset
|
84 |
|
12394
86d6b069b892
util.logger: Support for removing individual log sinks without a full reset
Matthew Wild <mwild1@gmail.com>
parents:
8556
diff
changeset
|
85 local function remove_sink(sink_function) |
|
86d6b069b892
util.logger: Support for removing individual log sinks without a full reset
Matthew Wild <mwild1@gmail.com>
parents:
8556
diff
changeset
|
86 local removed; |
|
86d6b069b892
util.logger: Support for removing individual log sinks without a full reset
Matthew Wild <mwild1@gmail.com>
parents:
8556
diff
changeset
|
87 for level, sinks in pairs(level_sinks) do |
|
86d6b069b892
util.logger: Support for removing individual log sinks without a full reset
Matthew Wild <mwild1@gmail.com>
parents:
8556
diff
changeset
|
88 for i = #sinks, 1, -1 do |
|
86d6b069b892
util.logger: Support for removing individual log sinks without a full reset
Matthew Wild <mwild1@gmail.com>
parents:
8556
diff
changeset
|
89 if sinks[i] == sink_function then |
|
86d6b069b892
util.logger: Support for removing individual log sinks without a full reset
Matthew Wild <mwild1@gmail.com>
parents:
8556
diff
changeset
|
90 t_remove(sinks, i); |
|
86d6b069b892
util.logger: Support for removing individual log sinks without a full reset
Matthew Wild <mwild1@gmail.com>
parents:
8556
diff
changeset
|
91 removed = true; |
|
86d6b069b892
util.logger: Support for removing individual log sinks without a full reset
Matthew Wild <mwild1@gmail.com>
parents:
8556
diff
changeset
|
92 end |
|
86d6b069b892
util.logger: Support for removing individual log sinks without a full reset
Matthew Wild <mwild1@gmail.com>
parents:
8556
diff
changeset
|
93 end |
|
86d6b069b892
util.logger: Support for removing individual log sinks without a full reset
Matthew Wild <mwild1@gmail.com>
parents:
8556
diff
changeset
|
94 end |
|
86d6b069b892
util.logger: Support for removing individual log sinks without a full reset
Matthew Wild <mwild1@gmail.com>
parents:
8556
diff
changeset
|
95 return removed; |
|
86d6b069b892
util.logger: Support for removing individual log sinks without a full reset
Matthew Wild <mwild1@gmail.com>
parents:
8556
diff
changeset
|
96 end |
|
86d6b069b892
util.logger: Support for removing individual log sinks without a full reset
Matthew Wild <mwild1@gmail.com>
parents:
8556
diff
changeset
|
97 |
|
6777
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
5776
diff
changeset
|
98 return { |
|
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
5776
diff
changeset
|
99 init = init; |
|
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
5776
diff
changeset
|
100 make_logger = make_logger; |
|
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
5776
diff
changeset
|
101 reset = reset; |
|
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
5776
diff
changeset
|
102 add_level_sink = add_level_sink; |
|
8553
32438665dc5e
util.logger: New method 'add_simple_sink', logger.add_simple_sink(print) works
Matthew Wild <mwild1@gmail.com>
parents:
7131
diff
changeset
|
103 add_simple_sink = add_simple_sink; |
|
6777
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
5776
diff
changeset
|
104 new = make_logger; |
|
12394
86d6b069b892
util.logger: Support for removing individual log sinks without a full reset
Matthew Wild <mwild1@gmail.com>
parents:
8556
diff
changeset
|
105 remove_sink = remove_sink; |
|
6777
5de6b93d0190
util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents:
5776
diff
changeset
|
106 }; |