mod_dwd/mod_dwd.lua
author Kim Alvefur <zash@zash.se>
Tue, 12 Mar 2013 13:49:36 +0100
changeset 928 4584c3303bb4
child 932 4e235e565693
permissions -rw-r--r--
mod_dwd: Initial commit.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
928
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
local hosts = _G.hosts;
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
local st = require "util.stanza";
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
local s2s_make_authenticated = require "core.s2smanager".make_authenticated;
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
local nameprep = require "util.encodings".stringprep.nameprep;
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
local cert_verify_identity = require "util.x509".verify_identity;
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
module:hook("stanza/jabber:server:dialback:result", function(event)
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
	local origin, stanza = event.origin, event.stanza;
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
	if origin.cert_chain_status == "valid" and origin.type == "s2sin_unauthed" or origin.type == "s2sin" then
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
		local attr = stanza.attr;
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
		local to, from = nameprep(attr.to), nameprep(attr.from);
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
		local conn = origin.conn:socket()
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
		local cert;
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
		if conn.getpeercertificate then
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
			cert = conn:getpeercertificate()
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    18
		end
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
		if cert and hosts[to] and cert_verify_identity(from, "xmpp-server", cert) then
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    21
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    22
			-- COMPAT: ejabberd, gmail and perhaps others do not always set 'to' and 'from'
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
			-- on streams. We fill in the session's to/from here instead.
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    24
			if not origin.from_host then
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
				origin.from_host = from;
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
			end
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    27
			if not origin.to_host then
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    28
				origin.to_host = to;
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    29
			end
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    30
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
			module:log("info", "Accepting Dialback without Dialback for %s", from);
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
			s2s_make_authenticated(origin, from);
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
			origin.sends2s(
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    34
				st.stanza("db:result", { from = attr.to, to = attr.from, id = attr.id, type = "valid" }));
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    35
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    36
			return true;
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
		end
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
	end
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
end, 100);
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
4584c3303bb4 mod_dwd: Initial commit.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    41