tools/openfire2prosody.lua
author Kim Alvefur <zash@zash.se>
Sat, 23 Mar 2024 20:48:19 +0100
changeset 13465 c673ff1075bd
parent 13146 879a6a33c21b
permissions -rw-r--r--
mod_posix: Move everything to util.startup This allows greater control over the order of events. Notably, the internal ordering between daemonization, initialization of libunbound and setup of signal handling is sensitive. libunbound starts a separate thread for processing DNS requests. If this thread is started before signal handling has been set up, it will not inherit the signal handlers and instead behave as it would have before signal handlers were set up, i.e. cause the whole process to immediately exit. libunbound is usually initialized on the first DNS request, usually triggered by an outgoing s2s connection attempt. If daemonization happens before signals have been set up, signals may not be processed at all.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5089
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     1
#!/usr/bin/env lua
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     2
-- Prosody IM
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     3
-- Copyright (C) 2008-2009 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5696
diff changeset
     4
--
5089
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     6
-- COPYING file in the source package for more information.
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     7
--
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     8
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     9
package.path = package.path..";../?.lua";
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    10
package.cpath = package.cpath..";../?.so"; -- needed for util.pposix used in datamanager
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    11
5696
9fba74a28e0c package{,c}path fixes for migration tools
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 5217
diff changeset
    12
local my_name = arg[0];
9fba74a28e0c package{,c}path fixes for migration tools
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 5217
diff changeset
    13
if my_name:match("[/\\]") then
9fba74a28e0c package{,c}path fixes for migration tools
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 5217
diff changeset
    14
	package.path = package.path..";"..my_name:gsub("[^/\\]+$", "../?.lua");
9fba74a28e0c package{,c}path fixes for migration tools
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 5217
diff changeset
    15
	package.cpath = package.cpath..";"..my_name:gsub("[^/\\]+$", "../?.so");
9fba74a28e0c package{,c}path fixes for migration tools
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 5217
diff changeset
    16
end
9fba74a28e0c package{,c}path fixes for migration tools
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 5217
diff changeset
    17
13146
879a6a33c21b tools: Update imports to use new prosody.* namespace
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
    18
if not pcall(require, "prosody.loader") then
879a6a33c21b tools: Update imports to use new prosody.* namespace
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
    19
	pcall(require, "loader");
879a6a33c21b tools: Update imports to use new prosody.* namespace
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
    20
end
879a6a33c21b tools: Update imports to use new prosody.* namespace
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
    21
5089
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    22
-- ugly workaround for getting datamanager to work outside of prosody :(
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    23
prosody = { };
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    24
prosody.platform = "unknown";
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    25
if os.getenv("WINDIR") then
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    26
	prosody.platform = "windows";
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    27
elseif package.config:sub(1,1) == "/" then
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    28
	prosody.platform = "posix";
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    29
end
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    30
13146
879a6a33c21b tools: Update imports to use new prosody.* namespace
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
    31
local parse_xml = require "prosody.util.xml".parse;
5089
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    32
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    33
-----------------------------------------------------------------------
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    34
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    35
package.loaded["util.logger"] = {init = function() return function() end; end}
13146
879a6a33c21b tools: Update imports to use new prosody.* namespace
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
    36
local dm = require "prosody.util.datamanager"
5089
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    37
dm.set_data_path("data");
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    38
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    39
local arg = ...;
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    40
local help = "/? -? ? /h -h /help -help --help";
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    41
if not arg or help:find(arg, 1, true) then
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    42
	print([[Openfire importer for Prosody
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    43
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    44
  Usage: openfire2prosody.lua filename.xml hostname
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    45
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    46
]]);
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    47
	os.exit(1);
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    48
end
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    49
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    50
local host = select(2, ...) or "localhost";
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    51
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    52
local file = assert(io.open(arg));
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    53
local data = assert(file:read("*a"));
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    54
file:close();
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    55
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    56
local xml = assert(parse_xml(data));
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    57
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    58
assert(xml.name == "Openfire", "The input file is not an Openfire XML export");
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    59
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    60
local substatus_mapping = { ["0"] = "none", ["1"] = "to", ["2"] = "from", ["3"] = "both" };
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    61
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    62
for _,tag in ipairs(xml.tags) do
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    63
	if tag.name == "User" then
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    64
		local username, password, roster;
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    65
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    66
		for _,tag in ipairs(tag.tags) do
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    67
			if tag.name == "Username" then
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    68
				username = tag:get_text();
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    69
			elseif tag.name == "Password" then
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    70
				password = tag:get_text();
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    71
			elseif tag.name == "Roster" then
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    72
				roster = {};
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    73
				local pending = {};
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    74
				for _,tag in ipairs(tag.tags) do
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    75
					if tag.name == "Item" then
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    76
						local jid = assert(tag.attr.jid, "Roster item has no JID");
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    77
						if tag.attr.substatus ~= "-1" then
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    78
							local item = {};
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    79
							item.name = tag.attr.name;
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    80
							item.subscription = assert(substatus_mapping[tag.attr.substatus], "invalid substatus");
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    81
							item.ask = tag.attr.askstatus == "0" and "subscribe" or nil;
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    82
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    83
							local groups = {};
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    84
							for _,tag in ipairs(tag) do
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    85
								if tag.name == "Group" then
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    86
									groups[tag:get_text()] = true;
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    87
								end
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    88
							end
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    89
							item.groups = groups;
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    90
							roster[jid] = item;
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    91
						end
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    92
						if tag.attr.recvstatus == "1" then pending[jid] = true; end
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    93
					end
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    94
				end
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    95
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    96
				if next(pending) then
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    97
					roster[false] = { pending = pending };
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    98
				end
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    99
			end
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   100
		end
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   101
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   102
		assert(username and password, "No username or password");
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   103
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   104
		local ret, err = dm.store(username, host, "accounts", {password = password});
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   105
		print("["..(err or "success").."] stored account: "..username.."@"..host.." = "..password);
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   106
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   107
		if roster then
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   108
			local ret, err = dm.store(username, host, "roster", roster);
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   109
			print("["..(err or "success").."] stored roster: "..username.."@"..host.." = "..password);
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   110
		end
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   111
	end
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   112
end
a5b683909f79 tools/openfire2prosody: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   113