Initial import of the prosody otr module

Signed-off-by: David Goulet <dgoulet@ev0ke.net>
This commit is contained in:
David Goulet 2014-04-07 21:50:10 -04:00
commit 5bf4e308cc
1 changed files with 79 additions and 0 deletions

79
mod_otr.lua Normal file
View File

@ -0,0 +1,79 @@
--
-- Copyright (C) 2014 - David Goulet <dgoulet@ev0ke.net>
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License, version 2 only,
-- as published by the Free Software Foundation.
--
-- This program is distributed in the hope that it will be useful, but WITHOUT
-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-- more details.
--
-- You should have received a copy of the GNU General Public License along
-- with this program; if not, write to the Free Software Foundation, Inc.,
-- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--
local st = require "util.stanza";
-- Module option.
--
-- This tells the module policy which for now there is two choices.
-- mandatory: OTR will be enforced
-- optional: Warn user to suggest OTR. (default)
local policy = module:get_option_string("otr_policy", "optional");
local mandatory;
local mandatory_msg = "For security reasons, OTR encryption is required for conversations on this server";
local optional;
local optional_msg = "For security reasons, OTR encryption is STRONGLY recommended for conversations on this server";
local messaged = {};
--
-- Check body message for the presence of the OTR tag.
local function check_message_otr(event)
local body = event.stanza:get_child_text("body");
local session = event.origin;
local is_otr;
-- Is this body is an OTR message?
if body and body:sub(1,4) ~= "?OTR" then
is_otr = 0;
else
is_otr = 1;
end
-- Force OTR if policy is mandatory.
if mandatory and is_otr == 0 then
event.origin.send(st.message{ type = "chat", from = module.host, to = event.stanza.attr.from }:tag("body"):text(mandatory_msg));
return true;
end
-- Warn if NO otr is detected and if we've NOT warned before the user.
if optional and messaged[session.full_jid] == nil and is_otr == 0 then
event.origin.send(st.message{ type = "chat", from = module.host, to = event.stanza.attr.from }:tag("body"):text(optional_msg));
messaged[session.full_jid] = 1
end
end
-- Module load entry point.
function module.load()
-- Validate policy option.
if policy == "mandatory" then
mandatory = 1;
elseif policy == "optional" then
optional = 1;
else
-- Invalid policy, stop loading module.
module:log("error", "Unknown policy %s", policy);
return;
end
module:log("info", "OTR policy set to %s", policy);
end
module:hook("message/bare", check_message_otr, 300);
module:hook("message/full", check_message_otr, 300);
module:hook("message/host", check_message_otr, 300);