12 local modulemanager = require "core.modulemanager"; |
12 local modulemanager = require "core.modulemanager"; |
13 local jid_split = require "util.jid".split; |
13 local jid_split = require "util.jid".split; |
14 local fire_event = require "core.eventmanager".fire_event; |
14 local fire_event = require "core.eventmanager".fire_event; |
15 local events_new = require "util.events".new; |
15 local events_new = require "util.events".new; |
16 local st = require "util.stanza"; |
16 local st = require "util.stanza"; |
17 local hosts = hosts; |
17 local prosody, hosts = prosody, prosody.hosts; |
|
18 local ssl = ssl; |
18 |
19 |
19 local pairs, type, tostring = pairs, type, tostring; |
20 local pairs, setmetatable, type, tostring = pairs, setmetatable, type, tostring; |
20 |
21 |
21 local components = {}; |
22 local components = {}; |
22 |
23 |
23 local disco_items = require "util.multitable".new(); |
24 local disco_items = require "util.multitable".new(); |
24 local NULL = {}; |
25 local NULL = {}; |
71 end |
72 end |
72 end |
73 end |
73 |
74 |
74 function create_component(host, component, events) |
75 function create_component(host, component, events) |
75 -- TODO check for host well-formedness |
76 -- TODO check for host well-formedness |
76 local ssl_ctx; |
77 local ssl_ctx, ssl_ctx_in; |
77 if host then |
78 if host and ssl then |
78 -- We need to find SSL context to use... |
79 -- We need to find SSL context to use... |
79 -- Discussion in prosody@ concluded that |
80 -- Discussion in prosody@ concluded that |
80 -- 1 level back is usually enough by default |
81 -- 1 level back is usually enough by default |
81 local base_host = host:gsub("^[^%.]+%.", ""); |
82 local base_host = host:gsub("^[^%.]+%.", ""); |
82 if hosts[base_host] then |
83 if hosts[base_host] then |
83 ssl_ctx = hosts[base_host].ssl_ctx; |
84 ssl_ctx = hosts[base_host].ssl_ctx; |
|
85 ssl_ctx_in = hosts[base_host].ssl_ctx_in; |
|
86 elseif prosody.global_ssl_ctx then |
|
87 -- We have no cert, and no parent host to borrow a cert from |
|
88 -- Use global/default cert if there is one |
|
89 ssl_ctx = ssl.newcontext(prosody.global_ssl_ctx); |
|
90 ssl_ctx_in = ssl.newcontext(setmetatable({ mode = "server" }, { __index = prosody.global_ssl_ctx })); |
84 end |
91 end |
85 end |
92 end |
86 return { type = "component", host = host, connected = true, s2sout = {}, |
93 return { type = "component", host = host, connected = true, s2sout = {}, |
87 ssl_ctx = ssl_ctx, events = events or events_new() }; |
94 ssl_ctx = ssl_ctx, ssl_ctx_in = ssl_ctx_in, events = events or events_new() }; |
88 end |
95 end |
89 |
96 |
90 function register_component(host, component, session) |
97 function register_component(host, component, session) |
91 if not hosts[host] or (hosts[host].type == 'component' and not hosts[host].connected) then |
98 if not hosts[host] or (hosts[host].type == 'component' and not hosts[host].connected) then |
92 local old_events = hosts[host] and hosts[host].events; |
99 local old_events = hosts[host] and hosts[host].events; |