Changeset

50:e5cdd8e93e05

clix.export: XEP-0227 format account exporter
author Kim Alvefur <zash@zash.se>
date Mon, 14 Mar 2011 17:29:01 +0100 (2011-03-14)
parents 49:64e637041347
children 51:e6a408eaa825
files clix/export.lua
diffstat 1 files changed, 75 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/clix/export.lua	Mon Mar 14 17:29:01 2011 +0100
@@ -0,0 +1,75 @@
+short_opts.i = "interactive";
+local split_jid = require "util.jid".split;
+local timer = require "util.timer";
+
+local xmlns_pie = "urn:xmpp:pie:0";
+local xmlns_nodes = {
+	{ "query", "jabber:iq:roster" },
+	{ "query", "jabber:iq:privacy" },
+	{ "vCard", "vcard-temp" },
+}
+local xmlns_private = "jabber:iq:private";
+local xmlns_private_nodes = {
+	{ "storage", "storage:bookmarks" },
+}
+
+local function on_connect(conn)
+	local export = verse.stanza("server-data", { xmlns = xmlns_pie })
+		:tag("host", { jid = conn.host })
+			:tag("user", { name = conn.username, password = conn.password });
+	local out = 0;
+
+	for i = 1,#xmlns_nodes do
+		out = out + 1;
+		local node = xmlns_nodes[i];
+		print(("requesting %s*%s"):format(node[2], node[1]));
+		conn:send_iq(verse.iq{type="get"}
+			:tag(node[1], { xmlns = node[2] })
+		, function(stanza)
+			print(("got %s*%s"):format(node[2], node[1]));
+			local query = stanza:get_child(node[1], node[2]);
+			if query then
+				export:add_child(query):up();
+			end
+			out = out - 1;
+		end);
+	end
+
+	for i = 1,#xmlns_private_nodes do
+		out = out + 1;
+		local node = xmlns_private_nodes[i];
+		print(("requesting private node %s*%s"):format(node[2], node[1]));
+		conn:send_iq(verse.iq{type="get"}
+			:tag("query", { xmlns = xmlns_private })
+				:tag(node[1], { xmlns = node[2] })
+		, function(stanza)
+			print(("got private %s*%s"):format(node[2], node[1]));
+			local query = stanza:get_child("query", xmlns_private);
+			if query then
+				export:add_child(query):up();
+			end
+			out = out - 1;
+		end);
+	end
+
+	timer.add_task(1, function ()
+		if out > 0 then
+			return 1
+		end
+		print("<?xml version='1.0' encoding='UTF-8'?>");
+		print(export);
+		conn:close();
+	end)
+end
+
+return function (opts, arg)
+	if opts.short_help then
+		print("Export your account");
+		return;
+	end
+	if opts.help then
+		return 0;
+	end
+	clix_connect(opts, on_connect);
+end
+