Comparison

plugins/mod_component.lua @ 6913:c7a0d5299933

mod_component: Add config option for deciding what happens if a component connects while already connected (fixes #525)
author Kim Alvefur <zash@zash.se>
date Wed, 21 Oct 2015 01:56:07 +0200
parent 6774:3965662ae091
child 7300:66e7517bd8f3
comparison
equal deleted inserted replaced
6912:cb5b14c95b7b 6913:c7a0d5299933
34 error("Don't load mod_component manually, it should be for a component, please see http://prosody.im/doc/components", 0); 34 error("Don't load mod_component manually, it should be for a component, please see http://prosody.im/doc/components", 0);
35 end 35 end
36 36
37 local env = module.environment; 37 local env = module.environment;
38 env.connected = false; 38 env.connected = false;
39 env.session = false;
39 40
40 local send; 41 local send;
41 42
42 local function on_destroy(session, err) 43 local function on_destroy(session, err)
43 env.connected = false; 44 env.connected = false;
45 env.session = false;
44 send = nil; 46 send = nil;
45 session.on_destroy = nil; 47 session.on_destroy = nil;
46 end 48 end
47 49
48 -- Handle authentication attempts by component 50 -- Handle authentication attempts by component
71 session:close{ condition = "not-authorized", text = "Given token does not match calculated token" }; 73 session:close{ condition = "not-authorized", text = "Given token does not match calculated token" };
72 return true; 74 return true;
73 end 75 end
74 76
75 if env.connected then 77 if env.connected then
76 module:log("error", "Second component attempted to connect, denying connection"); 78 local policy = module:get_option_string("component_conflict_resolve", "kick_new");
77 session:close{ condition = "conflict", text = "Component already connected" }; 79 if policy == "kick_old" then
78 return true; 80 env.session:close{ condition = "conflict", text = "Replaced by a new connection" };
81 else -- kick_new
82 module:log("error", "Second component attempted to connect, denying connection");
83 session:close{ condition = "conflict", text = "Component already connected" };
84 return true;
85 end
79 end 86 end
80 87
81 env.connected = true; 88 env.connected = true;
89 env.session = session;
82 send = session.send; 90 send = session.send;
83 session.on_destroy = on_destroy; 91 session.on_destroy = on_destroy;
84 session.component_validate_from = module:get_option_boolean("validate_from_addresses", true); 92 session.component_validate_from = module:get_option_boolean("validate_from_addresses", true);
85 session.type = "component"; 93 session.type = "component";
86 module:log("info", "External component successfully authenticated"); 94 module:log("info", "External component successfully authenticated");