Merge 0.10->trunk
authorMatthew Wild <mwild1@gmail.com>
Sat, 18 Jan 2014 18:46:31 +0000 (18:46 +0000)
committerMatthew Wild <mwild1@gmail.com>
Sat, 18 Jan 2014 18:46:31 +0000 (18:46 +0000)
plugins/mod_tls.lua
tools/ejabberd2prosody.lua
tools/ejabberdsql2prosody.lua

index bab2202ea7eb01b0216944e40aa2359ca6a9a07c..7c3d79be069bb87ad8bf2c5864e2b1bc08433e8d 100644 (file)
@@ -10,9 +10,15 @@ local config = require "core.configmanager";
 local create_context = require "core.certmanager".create_context;
 local st = require "util.stanza";
 
-local secure_auth_only = module:get_option("c2s_require_encryption") or module:get_option("require_encryption");
-local secure_s2s_only = module:get_option("s2s_require_encryption");
+local c2s_require_encryption = module:get_option("c2s_require_encryption") or module:get_option("require_encryption");
+local s2s_require_encryption = module:get_option("s2s_require_encryption");
 local allow_s2s_tls = module:get_option("s2s_allow_encryption") ~= false;
+local s2s_secure_auth = module:get_option("s2s_secure_auth");
+
+if s2s_secure_auth and s2s_require_encryption == false then
+       module:log("warn", "s2s_secure_auth implies s2s_require_encryption, but s2s_require_encryption is set to false");
+       s2s_require_encryption = true;
+end
 
 local xmlns_starttls = 'urn:ietf:params:xml:ns:xmpp-tls';
 local starttls_attr = { xmlns = xmlns_starttls };
@@ -20,8 +26,8 @@ local starttls_proceed = st.stanza("proceed", starttls_attr);
 local starttls_failure = st.stanza("failure", starttls_attr);
 local c2s_feature = st.stanza("starttls", starttls_attr);
 local s2s_feature = st.stanza("starttls", starttls_attr);
-if secure_auth_only then c2s_feature:tag("required"):up(); end
-if secure_s2s_only then s2s_feature:tag("required"):up(); end
+if c2s_require_encryption then c2s_feature:tag("required"):up(); end
+if s2s_require_encryption then s2s_feature:tag("required"):up(); end
 
 local hosts = prosody.hosts;
 local host = hosts[module.host];
index 0a6736d782b11e52389a25cc4fd26dea21ef3301..4bc15eb7bb8d6a04d2242b5d791aa73970d7ddbc 100755 (executable)
@@ -152,6 +152,48 @@ function privacy(node, host, default, lists)
        local ret, err = dm.store(node, host, "privacy", privacy);
        print("["..(err or "success").."] privacy: " ..node.."@"..host.." - "..count.." list(s)");
 end
+local function _table_to_jid(t)
+       if type(t[2]) == "string" then
+               local jid = t[2];
+               if type(t[1]) == "string" then jid = t[1].."@"..jid; end
+               if type(t[3]) == "string" then jid = jid.."/"..t[3]; end
+               return jid;
+       end
+end
+function muc_room(node, host, properties)
+       local store = { jid = node.."@"..host, _data = {}, _affiliations = {} };
+       for _,aff in ipairs(properties.affiliations) do
+               store._affiliations[_table_to_jid(aff[1])] = aff[2];
+       end
+       store._data.subject = properties.subject;
+       if properties.subject_author then
+               store._data.subject_from = store.jid .. "/" .. properties.subject_author;
+       end
+       store._data.name = properties.title;
+       store._data.description = properties.description;
+       store._data.password = properties.password;
+       store._data.moderated = (properties.moderated == "true") or nil;
+       store._data.members_only = (properties.members_only == "true") or nil;
+       store._data.persistent = (properties.persistent == "true") or nil;
+       store._data.changesubject = (properties.allow_change_subj == "true") or nil;
+       store._data.whois = properties.anonymous == "true" and "moderators" or "anyone";
+       store._data.hidden = (properties.public_list == "false") or nil;
+
+       if not store._data.persistent then
+               return print("[error] muc_room: skipping non-persistent room: "..node.."@"..host);
+       end
+
+       local ret, err = dm.store(node, host, "config", store);
+       if ret then
+               ret, err = dm.load(nil, host, "persistent");
+               if ret or not err then
+                       ret = ret or {};
+                       ret[store.jid] = true;
+                       ret, err = dm.store(nil, host, "persistent", ret);
+               end
+       end
+       print("["..(err or "success").."] muc_room: " ..node.."@"..host);
+end
 
 
 local filters = {
@@ -196,6 +238,15 @@ local filters = {
        privacy = function(tuple)
                privacy(tuple[2][1], tuple[2][2], tuple[3], tuple[4]);
        end;
+       muc_room = function(tuple)
+               local properties = {};
+               for _,pair in ipairs(tuple[3]) do
+                       if not(type(pair[2]) == "table" and #pair[2] == 0) then -- skip nil values
+                               properties[pair[1]] = pair[2];
+                       end
+               end
+               muc_room(tuple[2][1], tuple[2][2], properties);
+       end;
        config = function(tuple)
                if tuple[2] == "hosts" then
                        local output = io.output(); io.output("prosody.cfg.lua");
index 930d5a6b787dd4204ea0de476199525d4d9fb8ff..69c8cfe813fed6f0880d3f246e13898b50fa3cf5 100644 (file)
@@ -291,11 +291,21 @@ for i, row in ipairs(t["rostergroups"] or NULL) do
        roster_group(row.username, host, row.jid, row.grp);
 end
 for i, row in ipairs(t["vcard"] or NULL) do
-       local ret, err = dm.store(row.username, host, "vcard", st.preserialize(parse_xml(row.vcard)));
-       print("["..(err or "success").."] vCard: "..row.username.."@"..host);
+       local stanza, err = parse_xml(row.vcard);
+       if stanza then
+               local ret, err = dm.store(row.username, host, "vcard", st.preserialize(stanza));
+               print("["..(err or "success").."] vCard: "..row.username.."@"..host);
+       else
+               print("[error] vCard XML parse failed: "..row.username.."@"..host);
+       end
 end
 for i, row in ipairs(t["private_storage"] or NULL) do
-       private_storage(row.username, host, row.namespace, parse_xml(row.data));
+       local stanza, err = parse_xml(row.data);
+       if stanza then
+               private_storage(row.username, host, row.namespace, stanza);
+       else
+               print("[error] Private XML parse failed: "..row.username.."@"..host);
+       end
 end
 table.sort(t["spool"] or NULL, function(a,b) return a.seq < b.seq; end); -- sort by sequence number, just in case
 local time_offset = os.difftime(os.time(os.date("!*t")), os.time(os.date("*t"))) -- to deal with timezones
@@ -304,11 +314,15 @@ local date_parse = function(s)
        return os.time({year=year, month=month, day=day, hour=hour, min=min, sec=sec-time_offset});
 end
 for i, row in ipairs(t["spool"] or NULL) do
-       local stanza = parse_xml(row.xml);
-       local last_child = stanza.tags[#stanza.tags];
-       if not last_child or last_child ~= stanza[#stanza] then error("Last child of offline message is not a tag"); end
-       if last_child.name ~= "x" and last_child.attr.xmlns ~= "jabber:x:delay" then error("Last child of offline message is not a timestamp"); end
-       stanza[#stanza], stanza.tags[#stanza.tags] = nil, nil;
-       local t = date_parse(last_child.attr.stamp);
-       offline_msg(row.username, host, t, stanza);
+       local stanza, err = parse_xml(row.xml);
+       if stanza then
+               local last_child = stanza.tags[#stanza.tags];
+               if not last_child or last_child ~= stanza[#stanza] then error("Last child of offline message is not a tag"); end
+               if last_child.name ~= "x" and last_child.attr.xmlns ~= "jabber:x:delay" then error("Last child of offline message is not a timestamp"); end
+               stanza[#stanza], stanza.tags[#stanza.tags] = nil, nil;
+               local t = date_parse(last_child.attr.stamp);
+               offline_msg(row.username, host, t, stanza);
+       else
+               print("[error] Offline message XML parsing failed: "..row.username.."@"..host);
+       end
 end