From 1016cb7d48acda978809300f77b6c3dba335efd8 Mon Sep 17 00:00:00 2001 From: Waqas Hussain Date: Sun, 2 Aug 2009 14:35:03 +0500 Subject: ejabberdsql2prosody: Added an XML parser --- tools/ejabberdsql2prosody.lua | 52 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) (limited to 'tools/ejabberdsql2prosody.lua') diff --git a/tools/ejabberdsql2prosody.lua b/tools/ejabberdsql2prosody.lua index 5b975269..c9f8beb6 100644 --- a/tools/ejabberdsql2prosody.lua +++ b/tools/ejabberdsql2prosody.lua @@ -156,6 +156,58 @@ return readFile(filename); ------ end +-- XML parser +local parse_xml = (function() + local entity_map = setmetatable({ + ["amp"] = "&"; + ["gt"] = ">"; + ["lt"] = "<"; + ["apos"] = "'"; + ["quot"] = "\""; + }, {__index = function(_, s) + if s:sub(1,1) == "#" then + if s:sub(2,2) == "x" then + return string.char(tonumber(s:sub(3), 16)); + else + return string.char(tonumber(s:sub(2))); + end + end + end + }); + local function xml_unescape(str) + return (str:gsub("&(.-);", entity_map)); + end + local function parse_tag(s) + local name,sattr=(s):gmatch("([^%s]+)(.*)")(); + local attr = {}; + for a,b in (sattr):gmatch("([^=%s]+)=['\"]([^'\"]*)['\"]") do attr[a] = xml_unescape(b); end + return name, attr; + end + return function(xml) + local stanza = st.stanza("root"); + local regexp = "<([^>]*)>([^<]*)"; + for elem, text in xml:gmatch(regexp) do + if elem:sub(1,1) == "!" or elem:sub(1,1) == "?" then -- neglect comments and processing-instructions + elseif elem:sub(1,1) == "/" then -- end tag + elem = elem:sub(2); + stanza:up(); -- TODO check for start-end tag name match + elseif elem:sub(-1,-1) == "/" then -- empty tag + elem = elem:sub(1,-2); + local name,attr = parse_tag(elem); + stanza:tag(name, attr):up(); + else -- start tag + local name,attr = parse_tag(elem); + stanza:tag(name, attr); + end + if #text ~= 0 then -- text + stanza:text(xml_unescape(text)); + end + end + return stanza.tags[1]; + end +end)(); +-- end of XML parser + local arg, host = ...; local help = "/? -? ? /h -h /help -help --help"; if not(arg and host) or help:find(arg, 1, true) then -- cgit v1.2.3 From f964308d22d06fa551f11c5df0034a40dabe9eae Mon Sep 17 00:00:00 2001 From: Waqas Hussain Date: Sun, 2 Aug 2009 14:35:41 +0500 Subject: ejabberdsql2prosody: Added support for vCards --- tools/ejabberdsql2prosody.lua | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'tools/ejabberdsql2prosody.lua') diff --git a/tools/ejabberdsql2prosody.lua b/tools/ejabberdsql2prosody.lua index c9f8beb6..21d480ea 100644 --- a/tools/ejabberdsql2prosody.lua +++ b/tools/ejabberdsql2prosody.lua @@ -310,3 +310,7 @@ end 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); +end -- cgit v1.2.3 From 21801b6bf4a4227ec17c5bab7ea9f07b1d66faa4 Mon Sep 17 00:00:00 2001 From: Waqas Hussain Date: Sun, 2 Aug 2009 14:40:34 +0500 Subject: ejabberdsql2prosody: Added support for Private XML Storage --- tools/ejabberdsql2prosody.lua | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'tools/ejabberdsql2prosody.lua') diff --git a/tools/ejabberdsql2prosody.lua b/tools/ejabberdsql2prosody.lua index 21d480ea..4aace085 100644 --- a/tools/ejabberdsql2prosody.lua +++ b/tools/ejabberdsql2prosody.lua @@ -278,6 +278,12 @@ function roster_group(node, host, jid, group) local ret, err = dm.store(node, host, "roster", roster); print("["..(err or "success").."] roster-group: " ..node.."@"..host.." - "..jid.." - "..group); end +function private_storage(node, host, xmlns, stanza) + local private = dm.load(node, host, "private") or {}; + private[stanza.name..":"..xmlns] = st.preserialize(stanza); + local ret, err = dm.store(node, host, "private", private); + print("["..(err or "success").."] private: " ..node.."@"..host.." - "..xmlns); +end for i, row in ipairs(t["rosterusers"] or NULL) do local node, contact = row.username, row.jid; local name = row.nick; @@ -314,3 +320,6 @@ 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); end +for i, row in ipairs(t["private_storage"] or NULL) do + private_storage(row.username, host, row.namespace, st.preserialize(parse_xml(row.data))); +end -- cgit v1.2.3