[ejabberd] Ejabberd ver. 14.07

Peter Lemenkov peter at fedoraproject.org
Sun Aug 31 14:52:57 UTC 2014


commit 145e11bc3af88258d588f8a21c394bafce40a27f
Author: Peter Lemenkov <lemenkov at gmail.com>
Date:   Sun Aug 31 18:52:59 2014 +0400

    Ejabberd ver. 14.07
    
    Signed-off-by: Peter Lemenkov <lemenkov at gmail.com>

 .gitignore                                         |    2 +
 ...-service-example-name-to-match-actual-one.patch |   33 +-
 ...berd-0002-Fixed-delays-in-s2s-connections.patch |   53 --
 ...ejabberd-0002-Introducing-mod_admin_extra.patch |  401 ++++++++--------
 ...03-Fedora-specific-changes-to-ejabberdctl.patch |   19 +
 ...04-Fedora-specific-changes-to-ejabberdctl.patch |   48 --
 ...Install-.so-objects-with-0755-permissions.patch |   19 +
 ...berd-0005-Clean-up-false-security-measure.patch |   19 +
 ...Install-.so-objects-with-0755-permissions.patch |   26 -
 ejabberd-0006-Enable-polkit-support.patch          |   16 +
 ...L-GSSAPI-authentication-thanks-to-Mikael-.patch |  505 --------------------
 ...07-Disable-INET_DIST_INTERFACE-by-default.patch |   26 -
 ...07-Install-into-BINDIR-instead-of-SBINDIR.patch |   45 ++
 ...berd-0008-Clean-up-false-security-measure.patch |   26 -
 ejabberd-0008-Disable-Erlang-version-check.patch   |   38 ++
 ejabberd-0009-Enable-polkit-support.patch          |   23 -
 ...d-0009-Fix-permissions-for-captcha-script.patch |   19 +
 ...-Enable-systemd-notification-if-available.patch |   18 +
 ...10-Install-into-BINDIR-instead-of-SBINDIR.patch |   50 --
 ejabberd.init                                      |  111 -----
 ejabberd.logrotate                                 |    2 +-
 ejabberd.service                                   |    9 +-
 ejabberd.spec                                      |  280 +++--------
 ejabberd.sysconfig                                 |   13 -
 ejabberdctl.apps                                   |    5 -
 sources                                            |    3 +-
 26 files changed, 494 insertions(+), 1315 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index b2b84eb..157f4d1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,5 @@ ejabberd-2.1.5.tar.gz
 /processone-ejabberd-v2.1.12-0-gc058687.tar.gz
 /processone-ejabberd-v2.1.13-0-g5feeacf.tar.gz
 /ejabberd-v2.1.13.tar.gz
+/ejabberd-14.07.tar.gz
+/ejabberd-src-deps.tar
diff --git a/ejabberd-0001-Fix-PAM-service-example-name-to-match-actual-one.patch b/ejabberd-0001-Fix-PAM-service-example-name-to-match-actual-one.patch
index 8883f15..1816b94 100644
--- a/ejabberd-0001-Fix-PAM-service-example-name-to-match-actual-one.patch
+++ b/ejabberd-0001-Fix-PAM-service-example-name-to-match-actual-one.patch
@@ -1,26 +1,19 @@
-From b3a61330f7328507e1608e437a152e806ef520d1 Mon Sep 17 00:00:00 2001
 From: Peter Lemenkov <lemenkov at gmail.com>
 Date: Tue, 16 Feb 2010 16:03:38 +0300
-Subject: [PATCH 01/10] Fix PAM service example name to match actual one
+Subject: [PATCH] Fix PAM service example name to match actual one
 
 Signed-off-by: Peter Lemenkov <lemenkov at gmail.com>
----
- src/ejabberd.cfg.example | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
 
-diff --git a/src/ejabberd.cfg.example b/src/ejabberd.cfg.example
-index a4068ad..9b24a4a 100644
---- a/src/ejabberd.cfg.example
-+++ b/src/ejabberd.cfg.example
-@@ -243,7 +243,7 @@
- %% Authentication using PAM
- %%
- %%{auth_method, pam}.
--%%{pam_service, "pamservicename"}.
-+%%{pam_service, "ejabberd"}.
+diff --git a/ejabberd.yml.example b/ejabberd.yml.example
+index ad5ca9e..028704b 100644
+--- a/ejabberd.yml.example
++++ b/ejabberd.yml.example
+@@ -245,7 +245,7 @@ auth_method: internal
+ ## Authentication using PAM
+ ##
+ ## auth_method: pam
+-## pam_service: "pamservicename"
++## pam_service: "ejabberd"
  
- %%
- %% Authentication using LDAP
--- 
-1.8.3.1
-
+ ##
+ ## Authentication using LDAP
diff --git a/ejabberd-0003-Introducing-mod_admin_extra.patch b/ejabberd-0002-Introducing-mod_admin_extra.patch
similarity index 83%
rename from ejabberd-0003-Introducing-mod_admin_extra.patch
rename to ejabberd-0002-Introducing-mod_admin_extra.patch
index 3f9d8a7..586cefb 100644
--- a/ejabberd-0003-Introducing-mod_admin_extra.patch
+++ b/ejabberd-0002-Introducing-mod_admin_extra.patch
@@ -1,7 +1,6 @@
-From 363bfab713d9267e3186126d2df4162f24969d8c Mon Sep 17 00:00:00 2001
 From: Badlop <badlop at process-one.net>
 Date: Tue, 16 Feb 2010 16:12:17 +0300
-Subject: [PATCH 03/10] Introducing mod_admin_extra
+Subject: [PATCH] Introducing mod_admin_extra
 
 Adds the mod_admin_extra module to ejabberd.
 This module extends the functionality provided by ejabberdctl
@@ -9,31 +8,14 @@ by adding several new commands.
 
 The code is taken from the ProcessOne repository:
 
-svn export -r 1125 https://svn.process-one.net/ejabberd-modules/mod_admin_extra/trunk/src/mod_admin_extra.erl
----
- src/ejabberd.app        |    1 +
- src/mod_admin_extra.erl | 1568 +++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 1569 insertions(+)
- create mode 100644 src/mod_admin_extra.erl
+wget https://raw.githubusercontent.com/processone/ejabberd-contrib/e23bf94/mod_admin_extra/src/mod_admin_extra.erl
 
-diff --git a/src/ejabberd.app b/src/ejabberd.app
-index 1320597..4efc68d 100644
---- a/src/ejabberd.app
-+++ b/src/ejabberd.app
-@@ -99,6 +99,7 @@
- 	     mod_vcard,
- 	     mod_vcard_ldap,
- 	     mod_version,
-+             mod_admin_extra,
- 	     node_buddy,
- 	     node_club,
- 	     node_default,
 diff --git a/src/mod_admin_extra.erl b/src/mod_admin_extra.erl
 new file mode 100644
-index 0000000..1cef25a
+index 0000000..63703ec
 --- /dev/null
 +++ b/src/mod_admin_extra.erl
-@@ -0,0 +1,1568 @@
+@@ -0,0 +1,1590 @@
 +%%%-------------------------------------------------------------------
 +%%% File    : mod_admin_extra.erl
 +%%% Author  : Badlop <badlop at process-one.net>
@@ -105,6 +87,7 @@ index 0000000..1cef25a
 +	 push_roster_all/1,
 +	 push_alltoall/2,
 +	 %% mod_last
++	 get_last/2,
 +	 set_last/4,
 +	 %% mod_private
 +	 private_get/4,
@@ -192,7 +175,7 @@ index 0000000..1cef25a
 +			module = ?MODULE, function = remove_node,
 +			args = [{node, string}],
 +			result = {res, rescode}},
-+     #ejabberd_commands{name = export2odbc, tags = [mnesia],
++     #ejabberd_commands{name = export2odbc, tags = [mnesia], %% Copied to ejabberd 2.1.x after 11
 +			desc = "Export Mnesia tables to files in directory",
 +			module = ?MODULE, function = export2odbc,
 +			args = [{host, string}, {path, string}],
@@ -201,7 +184,7 @@ index 0000000..1cef25a
 +     #ejabberd_commands{name = num_active_users, tags = [accounts, stats],
 +			desc = "Get number of users active in the last days",
 +			module = ?MODULE, function = num_active_users,
-+			args = [{host, string}, {days, integer}],
++			args = [{host, binary}, {days, integer}],
 +			result = {users, integer}},
 +     #ejabberd_commands{name = delete_old_users, tags = [accounts, purge],
 +			desc = "Delete users that didn't log in last days, or that never logged",
@@ -211,65 +194,65 @@ index 0000000..1cef25a
 +     #ejabberd_commands{name = delete_old_users_vhost, tags = [accounts, purge],
 +			desc = "Delete users that didn't log in last days in vhost, or that never logged",
 +			module = ?MODULE, function = delete_old_users_vhost,
-+			args = [{host, string}, {days, integer}],
++			args = [{host, binary}, {days, integer}],
 +			result = {res, restuple}},
 +
 +     #ejabberd_commands{name = check_account, tags = [accounts],
 +			desc = "Check if an account exists or not",
 +			module = ejabberd_auth, function = is_user_exists,
-+			args = [{user, string}, {host, string}],
++			args = [{user, binary}, {host, binary}],
 +			result = {res, rescode}},
 +     #ejabberd_commands{name = check_password, tags = [accounts],
 +			desc = "Check if a password is correct",
 +			module = ejabberd_auth, function = check_password,
-+			args = [{user, string}, {host, string}, {password, string}],
++			args = [{user, binary}, {host, binary}, {password, binary}],
 +			result = {res, rescode}},
 +     #ejabberd_commands{name = check_password_hash, tags = [accounts],
 +			desc = "Check if the password hash is correct",
 +			longdesc = "Allowed hash methods: md5, sha.",
 +			module = ?MODULE, function = check_password_hash,
-+			args = [{user, string}, {host, string}, {passwordhash, string}, {hashmethod, string}],
++			args = [{user, binary}, {host, binary}, {passwordhash, binary}, {hashmethod, binary}],
 +			result = {res, rescode}},
 +     #ejabberd_commands{name = change_password, tags = [accounts],
 +			desc = "Change the password of an account",
 +			module = ?MODULE, function = set_password,
-+			args = [{user, string}, {host, string}, {newpass, string}],
++			args = [{user, binary}, {host, binary}, {newpass, binary}],
 +			result = {res, rescode}},
 +     #ejabberd_commands{name = ban_account, tags = [accounts],
 +			desc = "Ban an account: kick sessions and set random password",
 +			module = ?MODULE, function = ban_account,
-+			args = [{user, string}, {host, string}, {reason, string}],
++			args = [{user, binary}, {host, binary}, {reason, binary}],
 +			result = {res, rescode}},
 +
 +     #ejabberd_commands{name = num_resources, tags = [session],
 +			desc = "Get the number of resources of a user",
 +			module = ?MODULE, function = num_resources,
-+			args = [{user, string}, {host, string}],
++			args = [{user, binary}, {host, binary}],
 +			result = {resources, integer}},
 +     #ejabberd_commands{name = resource_num, tags = [session],
 +			desc = "Resource string of a session number",
 +			module = ?MODULE, function = resource_num,
-+			args = [{user, string}, {host, string}, {num, integer}],
++			args = [{user, binary}, {host, binary}, {num, integer}],
 +			result = {resource, string}},
 +     #ejabberd_commands{name = kick_session, tags = [session],
 +			desc = "Kick a user session",
 +			module = ?MODULE, function = kick_session,
-+			args = [{user, string}, {host, string}, {resource, string}, {reason, string}],
++			args = [{user, binary}, {host, binary}, {resource, binary}, {reason, binary}],
 +			result = {res, rescode}},
 +     #ejabberd_commands{name = status_num_host, tags = [session, stats],
 +			desc = "Number of logged users with this status in host",
 +			module = ?MODULE, function = status_num,
-+			args = [{host, string}, {status, string}],
++			args = [{host, binary}, {status, binary}],
 +			result = {users, integer}},
 +     #ejabberd_commands{name = status_num, tags = [session, stats],
 +			desc = "Number of logged users with this status",
 +			module = ?MODULE, function = status_num,
-+			args = [{status, string}],
++			args = [{status, binary}],
 +			result = {users, integer}},
 +     #ejabberd_commands{name = status_list_host, tags = [session],
 +			desc = "List of users logged in host with their statuses",
 +			module = ?MODULE, function = status_list,
-+			args = [{host, string}, {status, string}],
++			args = [{host, binary}, {status, binary}],
 +			result = {users, {list,
 +					  {userstatus, {tuple, [
 +								{user, string},
@@ -282,7 +265,7 @@ index 0000000..1cef25a
 +     #ejabberd_commands{name = status_list, tags = [session],
 +			desc = "List of logged users with this status",
 +			module = ?MODULE, function = status_list,
-+			args = [{status, string}],
++			args = [{status, binary}],
 +			result = {users, {list,
 +					  {userstatus, {tuple, [
 +								{user, string},
@@ -355,47 +338,47 @@ index 0000000..1cef25a
 +			desc = "Get content from a vCard field",
 +			longdesc = Vcard1FieldsString ++ "\n" ++ Vcard2FieldsString ++ "\n\n" ++ VcardXEP,
 +			module = ?MODULE, function = get_vcard,
-+			args = [{user, string}, {host, string}, {name, string}],
++			args = [{user, binary}, {host, binary}, {name, binary}],
 +			result = {content, string}},
 +     #ejabberd_commands{name = get_vcard2, tags = [vcard],
 +			desc = "Get content from a vCard field",
 +			longdesc = Vcard2FieldsString ++ "\n\n" ++ Vcard1FieldsString ++ "\n" ++ VcardXEP,
 +			module = ?MODULE, function = get_vcard,
-+			args = [{user, string}, {host, string}, {name, string}, {subname, string}],
++			args = [{user, binary}, {host, binary}, {name, binary}, {subname, binary}],
 +			result = {content, string}},
 +     #ejabberd_commands{name = get_vcard2_multi, tags = [vcard],
 +			desc = "Get multiple contents from a vCard field (requires exmpp installed)",
 +			longdesc = Vcard2FieldsString ++ "\n\n" ++ Vcard1FieldsString ++ "\n" ++ VcardXEP,
 +			module = ?MODULE, function = get_vcard_multi,
-+			args = [{user, string}, {host, string}, {name, string}, {subname, string}],
++			args = [{user, binary}, {host, binary}, {name, binary}, {subname, binary}],
 +			result = {contents, {list, string}}},
 +
 +     #ejabberd_commands{name = set_vcard, tags = [vcard],
 +			desc = "Set content in a vCard field",
 +			longdesc = Vcard1FieldsString ++ "\n" ++ Vcard2FieldsString ++ "\n\n" ++ VcardXEP,
 +			module = ?MODULE, function = set_vcard,
-+			args = [{user, string}, {host, string}, {name, string}, {content, string}],
++			args = [{user, binary}, {host, binary}, {name, binary}, {content, binary}],
 +			result = {res, rescode}},
 +     #ejabberd_commands{name = set_vcard2, tags = [vcard],
 +			desc = "Set content in a vCard subfield",
 +			longdesc = Vcard2FieldsString ++ "\n\n" ++ Vcard1FieldsString ++ "\n" ++ VcardXEP,
 +			module = ?MODULE, function = set_vcard,
-+			args = [{user, string}, {host, string}, {name, string}, {subname, string}, {content, string}],
++			args = [{user, binary}, {host, binary}, {name, binary}, {subname, binary}, {content, binary}],
 +			result = {res, rescode}},
 +     #ejabberd_commands{name = set_vcard2_multi, tags = [vcard],
 +			desc = "Set multiple contents in a vCard subfield",
 +			longdesc = Vcard2FieldsString ++ "\n\n" ++ Vcard1FieldsString ++ "\n" ++ VcardXEP,
 +			module = ?MODULE, function = set_vcard,
-+			args = [{user, string}, {host, string}, {name, string}, {subname, string}, {contents, {list, string}}],
++			args = [{user, binary}, {host, binary}, {name, binary}, {subname, binary}, {contents, {list, binary}}],
 +			result = {res, rescode}},
 +
 +     #ejabberd_commands{name = add_rosteritem, tags = [roster],
 +			desc = "Add an item to a user's roster (supports ODBC)",
 +			module = ?MODULE, function = add_rosteritem,
-+			args = [{localuser, string}, {localserver, string},
-+				{user, string}, {server, string},
-+				{nick, string}, {group, string},
-+				{subs, string}],
++			args = [{localuser, binary}, {localserver, binary},
++				{user, binary}, {server, binary},
++				{nick, binary}, {group, binary},
++				{subs, binary}],
 +			result = {res, rescode}},
 +     %%{"", "subs= none, from, to or both"},
 +     %%{"", "example: add-roster peter localhost mike server.com MiKe Employees both"},
@@ -403,8 +386,8 @@ index 0000000..1cef25a
 +     #ejabberd_commands{name = delete_rosteritem, tags = [roster],
 +			desc = "Delete an item from a user's roster (supports ODBC)",
 +			module = ?MODULE, function = delete_rosteritem,
-+			args = [{localuser, string}, {localserver, string},
-+				{user, string}, {server, string}],
++			args = [{localuser, binary}, {localserver, binary},
++				{user, binary}, {server, binary}],
 +			result = {res, rescode}},
 +     #ejabberd_commands{name = process_rosteritems, tags = [roster],
 +			desc = "List or delete rosteritems that match filtering options",
@@ -438,11 +421,17 @@ index 0000000..1cef25a
 +			args = [{action, string}, {subs, string},
 +				{asks, string}, {users, string},
 +				{contacts, string}],
-+			result = {res, rescode}},
++			result = {response,
++				  {list,
++				   {pairs, {tuple,
++					       [{user, string},
++						{contact, string}
++					       ]}}
++				  }}},
 +     #ejabberd_commands{name = get_roster, tags = [roster],
 +			desc = "Get roster of a local user",
 +			module = ?MODULE, function = get_roster,
-+			args = [{user, string}, {host, string}],
++			args = [{user, binary}, {host, binary}],
 +			result = {contacts, {list, {contact, {tuple, [
 +								      {jid, string},
 +								      {nick, string},
@@ -466,6 +455,13 @@ index 0000000..1cef25a
 +			args = [{host, string}, {group, string}],
 +			result = {res, rescode}},
 +
++     #ejabberd_commands{name = get_last, tags = [last],
++			desc = "Get last activity information",
++			longdesc = "Timestamp is the seconds since"
++			"1970-01-01 00:00:00 UTC, for example: date +%s",
++			module = ?MODULE, function = get_last,
++			args = [{user, binary}, {host, binary}],
++			result = {last_activity, string}},
 +     #ejabberd_commands{name = set_last, tags = [last],
 +			desc = "Set last activity information",
 +			longdesc = "Timestamp is the seconds since"
@@ -495,71 +491,71 @@ index 0000000..1cef25a
 +			"  ejabberdctl srg_create group3 localhost "
 +			"name desc \\\"group1\\\\ngroup2\\\"",
 +			module = ?MODULE, function = srg_create,
-+			args = [{group, string}, {host, string},
-+				{name, string}, {description, string}, {display, string}],
++			args = [{group, binary}, {host, binary},
++				{name, binary}, {description, binary}, {display, binary}],
 +			result = {res, rescode}},
 +     #ejabberd_commands{name = srg_delete, tags = [shared_roster_group],
 +			desc = "Delete a Shared Roster Group",
 +			module = ?MODULE, function = srg_delete,
-+			args = [{group, string}, {host, string}],
++			args = [{group, binary}, {host, binary}],
 +			result = {res, rescode}},
 +     #ejabberd_commands{name = srg_list, tags = [shared_roster_group],
 +			desc = "List the Shared Roster Groups in Host",
 +			module = ?MODULE, function = srg_list,
-+			args = [{host, string}],
++			args = [{host, binary}],
 +			result = {groups, {list, {id, string}}}},
 +     #ejabberd_commands{name = srg_get_info, tags = [shared_roster_group],
 +			desc = "Get info of a Shared Roster Group",
 +			module = ?MODULE, function = srg_get_info,
-+			args = [{group, string}, {host, string}],
++			args = [{group, binary}, {host, binary}],
 +			result = {informations, {list, {information, {tuple, [{key, string}, {value, string}]}}}}},
 +     #ejabberd_commands{name = srg_get_members, tags = [shared_roster_group],
 +			desc = "Get members of a Shared Roster Group",
 +			module = ?MODULE, function = srg_get_members,
-+			args = [{group, string}, {host, string}],
++			args = [{group, binary}, {host, binary}],
 +			result = {members, {list, {member, string}}}},
 +     #ejabberd_commands{name = srg_user_add, tags = [shared_roster_group],
 +			desc = "Add the JID user at host to the Shared Roster Group",
 +			module = ?MODULE, function = srg_user_add,
-+			args = [{user, string}, {host, string}, {group, string}, {grouphost, string}],
++			args = [{user, binary}, {host, binary}, {group, binary}, {grouphost, binary}],
 +			result = {res, rescode}},
 +     #ejabberd_commands{name = srg_user_del, tags = [shared_roster_group],
 +			desc = "Delete this JID user at host from the Shared Roster Group",
 +			module = ?MODULE, function = srg_user_del,
-+			args = [{user, string}, {host, string}, {group, string}, {grouphost, string}],
++			args = [{user, binary}, {host, binary}, {group, binary}, {grouphost, binary}],
 +			result = {res, rescode}},
 +
 +     #ejabberd_commands{name = send_message_chat, tags = [stanza],
 +			desc = "Send a chat message to a local or remote bare of full JID",
 +			module = ?MODULE, function = send_message_chat,
-+			args = [{from, string}, {to, string}, {body, string}],
++			args = [{from, binary}, {to, binary}, {body, binary}],
 +			result = {res, rescode}},
 +     #ejabberd_commands{name = send_message_headline, tags = [stanza],
 +			desc = "Send a headline message to a local or remote bare of full JID",
 +			module = ?MODULE, function = send_message_headline,
-+			args = [{from, string}, {to, string},
-+				{subject, string}, {body, string}],
++			args = [{from, binary}, {to, binary},
++				{subject, binary}, {body, binary}],
 +			result = {res, rescode}},
 +     #ejabberd_commands{name = send_stanza_c2s, tags = [stanza],
 +			desc = "Send a stanza as if sent from a c2s session",
 +			module = ?MODULE, function = send_stanza_c2s,
-+			args = [{user, string}, {host, string}, {resource, string}, {stanza, string}],
++			args = [{user, binary}, {host, binary}, {resource, binary}, {stanza, binary}],
 +			result = {res, rescode}},
 +     #ejabberd_commands{name = privacy_set, tags = [stanza],
 +			desc = "Send a IQ set privacy stanza for a local account",
 +			module = ?MODULE, function = privacy_set,
-+			args = [{user, string}, {host, string}, {xmlquery, string}],
++			args = [{user, binary}, {host, binary}, {xmlquery, binary}],
 +			result = {res, rescode}},
 +
 +     #ejabberd_commands{name = stats, tags = [stats],
 +			desc = "Get statistical value: registeredusers onlineusers onlineusersnode uptimeseconds",
 +			module = ?MODULE, function = stats,
-+			args = [{name, string}],
++			args = [{name, binary}],
 +			result = {stat, integer}},
 +     #ejabberd_commands{name = stats_host, tags = [stats],
 +			desc = "Get statistical value for this host: registeredusers onlineusers",
 +			module = ?MODULE, function = stats,
-+			args = [{name, string}, {host, string}],
++			args = [{name, binary}, {host, binary}],
 +			result = {stat, integer}}
 +    ].
 +
@@ -800,14 +796,11 @@ index 0000000..1cef25a
 +    ok = ejabberd_auth:set_password(User, Server, Password).
 +
 +prepare_reason([]) ->
-+    "Kicked by administrator";
++    <<"Kicked by administrator">>;
 +prepare_reason([Reason]) ->
 +    Reason;
-+prepare_reason(Reason) when is_list(Reason) ->
-+    Reason;
-+prepare_reason(StringList) ->
-+    string:join(StringList, "_").
-+
++prepare_reason(Reason) when is_binary(Reason) ->
++    Reason.
 +
 +%%%
 +%%% Sessions
@@ -831,20 +824,20 @@ index 0000000..1cef25a
 +
 +kick_this_session(User, Server, Resource, Reason) ->
 +    ejabberd_router:route(
-+      jlib:make_jid("", "", ""),
++      jlib:make_jid(<<>>, <<>>, <<>>),
 +      jlib:make_jid(User, Server, Resource),
-+      {xmlelement, "broadcast", [], [{exit, Reason}]}).
++      {broadcast, {exit, Reason}}).
 +
 +
 +status_num(Host, Status) ->
 +    length(get_status_list(Host, Status)).
 +status_num(Status) ->
-+    status_num("all", Status).
++    status_num(<<"all">>, Status).
 +status_list(Host, Status) ->
 +    Res = get_status_list(Host, Status),
 +    [{U, S, R, P, St} || {U, S, R, P, St} <- Res].
 +status_list(Status) ->
-+    status_list("all", Status).
++    status_list(<<"all">>, Status).
 +
 +
 +get_status_list(Host, Status_required) ->
@@ -853,7 +846,7 @@ index 0000000..1cef25a
 +    %% Reformat the list
 +    Sessions2 = [ {Session#session.usr, Session#session.sid, Session#session.priority} || Session <- Sessions],
 +    Fhost = case Host of
-+		"all" ->
++		<<"all">> ->
 +		    %% All hosts are requested, so dont filter at all
 +		    fun(_, _) -> true end;
 +		_ ->
@@ -865,7 +858,7 @@ index 0000000..1cef25a
 +    Sessions4 = [ {ejabberd_c2s:get_presence(Pid), Server, Priority} || {Pid, Server, Priority} <- Sessions3],
 +    %% Filter by status
 +    Fstatus = case Status_required of
-+		  "all" ->
++		  <<"all">> ->
 +		      fun(_, _) -> true end;
 +		  _ ->
 +		      fun(A, B) -> A == B end
@@ -904,18 +897,18 @@ index 0000000..1cef25a
 +%% Make string more print-friendly
 +stringize(String) ->
 +    %% Replace newline characters with other code
-+    ejabberd_regexp:greplace(String, "\n", "\\n").
++    ejabberd_regexp:greplace(String, <<"\n">>, <<"\\n">>).
 +
 +set_presence(User, Host, Resource, Type, Show, Status, Priority) ->
 +    Pid = ejabberd_sm:get_session_pid(User, Host, Resource),
 +    USR = User ++ "@" ++ Host ++ "/" ++ Resource,
 +    US = User ++ "@" ++ Host,
 +    Message = {route_xmlstreamelement,
-+	       {xmlelement, "presence",
-+		[{"from", USR}, {"to", US}, {"type", Type}],
-+		[{xmlelement, "show", [], [{xmlcdata, Show}]},
-+		 {xmlelement, "status", [], [{xmlcdata, Status}]},
-+		 {xmlelement, "priority", [], [{xmlcdata, Priority}]}]}},
++	       {xmlel, <<"presence">>,
++		[{<<"from">>, USR}, {<<"to">>, US}, {<<"type">>, Type}],
++		[{xmlel, <<"show">>, [], [{xmlcdata, Show}]},
++		 {xmlel, <<"status">>, [], [{xmlcdata, Status}]},
++		 {xmlel, <<"priority">>, [], [{xmlcdata, Priority}]}]}},
 +    Pid ! Message.
 +
 +user_sessions_info(User, Host) ->
@@ -951,14 +944,14 @@ index 0000000..1cef25a
 +
 +set_nickname(User, Host, Nickname) ->
 +    R = mod_vcard:process_sm_iq(
-+	  {jid, User, Host, "", User, Host, ""},
-+	  {jid, User, Host, "", User, Host, ""},
-+	  {iq, "", set, "", "en",
-+	   {xmlelement, "vCard",
-+	    [{"xmlns", "vcard-temp"}], [
-+					{xmlelement, "NICKNAME", [], [{xmlcdata, Nickname}]}
-+				       ]
-+	   }}),
++	  {jid, User, Host, <<>>, User, Host, <<>>},
++	  {jid, User, Host, <<>>, User, Host, <<>>},
++	  {iq, <<>>, set, <<>>, <<"en">>,
++	   {xmlel, <<"vCard">>, [
++	     {<<"xmlns">>, <<"vcard-temp">>}], [
++		{xmlel, <<"NICKNAME">>, [], [{xmlcdata, Nickname}]}
++            ]
++	  }}),
 +    case R of
 +	{iq, [], result, [], _L, []} ->
 +	    ok;
@@ -988,9 +981,9 @@ index 0000000..1cef25a
 +%% Internal vcard
 +
 +get_module_resource(Server) ->
-+    case gen_mod:get_module_opt(Server, ?MODULE, module_resource, none) of
-+	none -> atom_to_list(?MODULE);
-+	R when is_list(R) -> R
++    case gen_mod:get_module_opt(Server, ?MODULE, module_resource, fun(A) -> A end, none) of
++	none -> list_to_binary(atom_to_list(?MODULE));
++	R when is_binary(R) -> R
 +    end.
 +
 +get_vcard_content(User, Server, Data) ->
@@ -1035,8 +1028,8 @@ index 0000000..1cef25a
 +
 +set_vcard_content(User, Server, Data, SomeContent) ->
 +    ContentList = case SomeContent of
-+	[Char | _] when not is_list(Char) -> [SomeContent];
-+	[Char | _] when is_list(Char) -> SomeContent
++	[Bin | _] when is_binary(Bin) -> SomeContent;
++	Bin when is_binary(Bin) -> [SomeContent]
 +    end,
 +    [{_, Module, Function, _Opts}] = ets:lookup(sm_iqtable, {?NS_VCARD, Server}),
 +    JID = jlib:make_jid(User, Server, get_module_resource(Server)),
@@ -1053,7 +1046,7 @@ index 0000000..1cef25a
 +	 end,
 +
 +    %% Build new vcard
-+    SubEl = {xmlelement, "vCard", [{"xmlns","vcard-temp"}], A4},
++    SubEl = {xmlel, <<"vCard">>, [{<<"xmlns">>,<<"vcard-temp">>}], A4},
 +    IQ2 = #iq{type=set, sub_el = SubEl},
 +
 +    Module:Function(JID, JID, IQ2),
@@ -1064,18 +1057,18 @@ index 0000000..1cef25a
 +    [Data1 | Data2] = Data,
 +    NewEls = case Data2 of
 +		[] ->
-+		    [{xmlelement, Data1, [], [{xmlcdata,Content}]} || Content <- ContentList];
++		    [{xmlel, Data1, [], [{xmlcdata,Content}]} || Content <- ContentList];
 +		[D2] ->
 +		    OldEl = case lists:keysearch(Data1, 2, Els2) of
 +				{value, A} -> A;
-+				false -> {xmlelement, Data1, [], []}
++				false -> {xmlel, Data1, [], []}
 +			    end,
-+		    {xmlelement, _, _, ContentOld1} = OldEl,
-+		    Content2 = [{xmlelement, D2, [], [{xmlcdata,Content}]} || Content <- ContentList],
++		    {xmlel, _, _, ContentOld1} = OldEl,
++		    Content2 = [{xmlel, D2, [], [{xmlcdata,Content}]} || Content <- ContentList],
 +		    ContentOld2 = [A || {_, X, _, _} = A <- ContentOld1, X/=D2],
 +		    ContentOld3 = lists:keysort(2, ContentOld2),
 +		    ContentNew = lists:keymerge(2, Content2, ContentOld3),
-+		    [{xmlelement, Data1, [], ContentNew}]
++		    [{xmlel, Data1, [], ContentNew}]
 +	    end,
 +    Els3 = lists:keydelete(Data1, 2, Els2),
 +    lists:keymerge(2, NewEls, Els3).
@@ -1086,7 +1079,7 @@ index 0000000..1cef25a
 +%%%
 +
 +add_rosteritem(LocalUser, LocalServer, User, Server, Nick, Group, Subs) ->
-+    case add_rosteritem(LocalUser, LocalServer, User, Server, Nick, Group, list_to_atom(Subs), []) of
++    case add_rosteritem(LocalUser, LocalServer, User, Server, Nick, Group, Subs, []) of
 +	{atomic, ok} ->
 +	    push_roster_item(LocalUser, LocalServer, User, Server, {add, Nick, Subs, Group}),
 +	    ok;
@@ -1098,16 +1091,11 @@ index 0000000..1cef25a
 +    subscribe(LU, LS, User, Server, Nick, Group, Subscription, Xattrs).
 +
 +subscribe(LU, LS, User, Server, Nick, Group, Subscription, _Xattrs) ->
-+    SubscriptionS = case is_atom(Subscription) of
-+	true -> atom_to_list(Subscription);
-+	false -> Subscription
-+    end,
-+    ItemEl = build_roster_item(User, Server, {add, Nick, SubscriptionS, Group}),
-+    {ok, M} = loaded_module(LS,[mod_roster_odbc,mod_roster]),
-+    M:set_items(
++    ItemEl = build_roster_item(User, Server, {add, Nick, Subscription, Group}),
++    mod_roster:set_items(
 +	LU, LS,
-+	{xmlelement,"query",
-+            [{"xmlns","jabber:iq:roster"}],
++	{xmlel, <<"query">>,
++            [{<<"xmlns">>, <<"jabber:iq:roster">>}],
 +            [ItemEl]}).
 +
 +delete_rosteritem(LocalUser, LocalServer, User, Server) ->
@@ -1121,22 +1109,12 @@ index 0000000..1cef25a
 +
 +unsubscribe(LU, LS, User, Server) ->
 +    ItemEl = build_roster_item(User, Server, remove),
-+    {ok, M} = loaded_module(LS,[mod_roster_odbc,mod_roster]),
-+    M:set_items(
++    mod_roster:set_items(
 +	LU, LS,
-+	{xmlelement,"query",
-+            [{"xmlns","jabber:iq:roster"}],
++	{xmlel, <<"query">>,
++            [{<<"xmlns">>, <<"jabber:iq:roster">>}],
 +            [ItemEl]}).
 +
-+loaded_module(Domain,Options) ->
-+    LoadedModules = gen_mod:loaded_modules(Domain),
-+    case lists:filter(fun(Module) ->
-+                              lists:member(Module, LoadedModules)
-+                      end, Options) of
-+        [M|_] -> {ok, M};
-+        [] -> {error,not_found}
-+    end.
-+
 +%% -----------------------------
 +%% Get Roster
 +%% -----------------------------
@@ -1155,11 +1133,10 @@ index 0000000..1cef25a
 +	      Subs = atom_to_list(Item#roster.subscription),
 +	      Ask = atom_to_list(Item#roster.ask),
 +	      Groups = case Item#roster.groups of
-+			   [] -> [""];
++			   [] -> [<<>>];
 +			   Gs -> Gs
 +		       end,
-+	      ItemsX = [{JIDS, Nick, Subs, Ask, Group}
-+			|| Group <- Groups],
++	      ItemsX = [{JIDS, Nick, Subs, Ask, Group} || Group <- Groups],
 +	      ItemsX ++ Res
 +      end,
 +      [],
@@ -1172,7 +1149,7 @@ index 0000000..1cef25a
 +
 +push_roster(File, User, Server) ->
 +    {ok, [Roster]} = file:consult(File),
-+    subscribe_roster({User, Server, "", User}, Roster).
++    subscribe_roster({User, Server, <<>>, User}, Roster).
 +
 +push_roster_all(File) ->
 +    {ok, [Roster]} = file:consult(File),
@@ -1193,7 +1170,7 @@ index 0000000..1cef25a
 +    subscribe_roster({Name, Server, Group, Nick}, Roster);
 +%% Subscribe Name2 to Name1
 +subscribe_roster({Name1, Server1, Group1, Nick1}, [{Name2, Server2, Group2, Nick2} | Roster]) ->
-+    subscribe(Name1, Server1, Name2, Server2, Nick2, Group2, both, []),
++    subscribe(Name1, Server1, Name2, Server2, Nick2, Group2, <<"both">>, []),
 +    subscribe_roster({Name1, Server1, Group1, Nick1}, Roster).
 +
 +push_alltoall(S, G) ->
@@ -1225,44 +1202,64 @@ index 0000000..1cef25a
 +    ejabberd_router:route(LJID, LJID, ResIQ).
 +
 +build_roster_item(U, S, {add, Nick, Subs, Group}) ->
-+    {xmlelement, "item",
-+     [{"jid", jlib:jid_to_string(jlib:make_jid(U, S, ""))},
-+      {"name", Nick},
-+      {"subscription", Subs}],
-+     [{xmlelement, "group", [], [{xmlcdata, Group}]}]
++    {xmlel, <<"item">>,
++     [{<<"jid">>, jlib:jid_to_string(jlib:make_jid(U, S, <<>>))},
++      {<<"name">>, Nick},
++      {<<"subscription">>, Subs}],
++     [{xmlel, <<"group">>, [], [{xmlcdata, Group}]}]
 +    };
 +build_roster_item(U, S, remove) ->
-+    {xmlelement, "item",
-+     [{"jid", jlib:jid_to_string(jlib:make_jid(U, S, ""))},
-+      {"subscription", "remove"}],
++    {xmlel, <<"item">>,
++     [{<<"jid">>, jlib:jid_to_string(jlib:make_jid(U, S, <<>>))},
++      {<<"subscription">>, <<"remove">>}],
 +     []
 +    }.
 +
 +build_iq_roster_push(Item) ->
-+    {xmlelement, "iq",
-+     [{"type", "set"}, {"id", "push"}],
-+     [{xmlelement, "query",
-+       [{"xmlns", ?NS_ROSTER}],
++    {xmlel, <<"iq">>,
++     [{<<"type">>, <<"set">>}, {<<"id">>, <<"push">>}],
++     [{xmlel, <<"query">>,
++       [{<<"xmlns">>, ?NS_ROSTER}],
 +       [Item]
 +      }
 +     ]
 +    }.
 +
 +build_broadcast(U, S, {add, _Nick, Subs, _Group}) ->
-+    build_broadcast(U, S, list_to_atom(Subs));
++    build_broadcast(U, S, list_to_atom(binary_to_list(Subs)));
 +build_broadcast(U, S, remove) ->
 +    build_broadcast(U, S, none);
-+%% @spec (U::string(), S::string(), Subs::atom()) -> any()
++%% @spec (U::binary(), S::binary(), Subs::atom()) -> any()
 +%% Subs = both | from | to | none
 +build_broadcast(U, S, SubsAtom) when is_atom(SubsAtom) ->
-+    {xmlelement, "broadcast", [],
-+     [{item, {U, S, ""}, SubsAtom}]
-+    }.
++    {broadcast, {item, {U, S, <<>>}, SubsAtom}}.
 +
 +%%%
 +%%% Last Activity
 +%%%
 +
++get_last(User, Server) ->
++    Mod = get_lastactivity_module(Server),
++    case ejabberd_sm:get_user_resources(User, Server) of
++        [] ->
++            case Mod:get_last_info(User, Server) of
++                not_found ->
++                    "Never";
++                {ok, Shift, _Status} ->
++                    TimeStamp = {Shift div 1000000,
++                        Shift rem 1000000,
++                        0},
++                    {{Year, Month, Day}, {Hour, Minute, Second}} =
++                        calendar:now_to_local_time(TimeStamp),
++                    lists:flatten(
++                        io_lib:format(
++                            "~w-~.2.0w-~.2.0w ~.2.0w:~.2.0w:~.2.0w",
++                            [Year, Month, Day, Hour, Minute, Second]))
++            end;
++        _ ->
++            "Online"
++    end.
++
 +set_last(User, Server, Timestamp, Status) ->
 +    Mod = get_lastactivity_module(Server),
 +    Mod:store_last_info(User, Server, Timestamp, Status).
@@ -1277,15 +1274,15 @@ index 0000000..1cef25a
 +%% <aa xmlns='bb'>Cluth</aa>
 +
 +private_get(Username, Host, Element, Ns) ->
-+    From = jlib:make_jid(Username, Host, ""),
-+    To = jlib:make_jid(Username, Host, ""),
-+    IQ = {iq, "", get, ?NS_PRIVATE, "",
-+	  {xmlelement,"query",
-+	   [{"xmlns",?NS_PRIVATE}],
-+	   [{xmlelement, Element, [{"xmlns", Ns}], []}]}},
++    From = jlib:make_jid(Username, Host, <<>>),
++    To = jlib:make_jid(Username, Host, <<>>),
++    IQ = {iq, <<>>, get, ?NS_PRIVATE, <<>>,
++	  {xmlel, <<"query">>,
++	   [{<<"xmlns">>,?NS_PRIVATE}],
++	   [{xmlel, Element, [{<<"xmlns">>, Ns}], []}]}},
 +    ResIq = mod_private:process_sm_iq(From, To, IQ),
-+    [{xmlelement,"query",
-+      [{"xmlns","jabber:iq:private"}],
++    [{xmlel, <<"query">>,
++      [{<<"xmlns">>, <<"jabber:iq:private">>}],
 +      [SubEl]}] = ResIq#iq.sub_el,
 +    xml:element_to_string(SubEl).
 +
@@ -1300,11 +1297,11 @@ index 0000000..1cef25a
 +    end.
 +
 +private_set2(Username, Host, Xml) ->
-+    From = jlib:make_jid(Username, Host, ""),
-+    To = jlib:make_jid(Username, Host, ""),
-+    IQ = {iq, "", set, ?NS_PRIVATE, "",
-+	  {xmlelement,"query",
-+	   [{"xmlns",?NS_PRIVATE}],
++    From = jlib:make_jid(Username, Host, <<>>),
++    To = jlib:make_jid(Username, Host, <<>>),
++    IQ = {iq, <<>>, set, ?NS_PRIVATE, <<>>,
++	  {xmlel, <<"query">>,
++	   [{<<"xmlns">>, ?NS_PRIVATE}],
 +	   [Xml]}},
 +    mod_private:process_sm_iq(From, To, IQ),
 +    ok.
@@ -1316,7 +1313,7 @@ index 0000000..1cef25a
 +srg_create(Group, Host, Name, Description, Display) ->
 +    DisplayList = case Display of
 +	[] -> [];
-+	_ -> ejabberd_regexp:split(Display, "\\\\n")
++	_ -> ejabberd_regexp:split(Display, <<"\\\\n">>)
 +    end,
 +    Opts = [{name, Name},
 +	    {displayed_groups, DisplayList},
@@ -1332,13 +1329,16 @@ index 0000000..1cef25a
 +    lists:sort(mod_shared_roster:list_groups(Host)).
 +
 +srg_get_info(Group, Host) ->
-+    Opts = mod_shared_roster:get_group_opts(Host,Group),
++    Opts = case mod_shared_roster:get_group_opts(Host,Group) of
++	Os when is_list(Os) -> Os;
++	error -> []
++    end,
 +    [{io_lib:format("~p", [Title]),
 +      io_lib:format("~p", [Value])} || {Title, Value} <- Opts].
 +
 +srg_get_members(Group, Host) ->
 +    Members = mod_shared_roster:get_group_explicit_users(Host,Group),
-+    [jlib:jid_to_string(jlib:make_jid(MUser, MServer, ""))
++    [jlib:jid_to_string(jlib:make_jid(MUser, MServer, <<>>))
 +     || {MUser, MServer} <- Members].
 +
 +srg_user_add(User, Host, Group, GroupHost) ->
@@ -1355,13 +1355,13 @@ index 0000000..1cef25a
 +%%%
 +
 +%% @doc Send a chat message to a Jabber account.
-+%% @spec (From::string(), To::string(), Body::string()) -> ok
++%% @spec (From::binary(), To::binary(), Body::binary()) -> ok
 +send_message_chat(From, To, Body) ->
 +    Packet = build_packet(message_chat, [Body]),
 +    send_packet_all_resources(From, To, Packet).
 +
 +%% @doc Send a headline message to a Jabber account.
-+%% @spec (From::string(), To::string(), Subject::string(), Body::string()) -> ok
++%% @spec (From::binary(), To::binary(), Subject::binary(), Body::binary()) -> ok
 +send_message_headline(From, To, Subject, Body) ->
 +    Packet = build_packet(message_headline, [Subject, Body]),
 +    send_packet_all_resources(From, To, Packet).
@@ -1380,7 +1380,7 @@ index 0000000..1cef25a
 +    ToUser = ToJID#jid.user,
 +    ToServer = ToJID#jid.server,
 +    case ToJID#jid.resource of
-+	"" ->
++	<<>> ->
 +	    send_packet_all_resources(FromJID, ToUser, ToServer, Packet);
 +	Res ->
 +	    send_packet_all_resources(FromJID, ToUser, ToServer, Res, Packet)
@@ -1389,7 +1389,7 @@ index 0000000..1cef25a
 +send_packet_all_resources(FromJID, ToUser, ToServer, Packet) ->
 +    case ejabberd_sm:get_user_resources(ToUser, ToServer) of
 +	[] ->
-+	    send_packet_all_resources(FromJID, ToUser, ToServer, "", Packet);
++	    send_packet_all_resources(FromJID, ToUser, ToServer, <<>>, Packet);
 +	ToResources ->
 +	    lists:foreach(
 +	      fun(ToResource) ->
@@ -1405,15 +1405,15 @@ index 0000000..1cef25a
 +
 +
 +build_packet(message_chat, [Body]) ->
-+    {xmlelement, "message",
-+     [{"type", "chat"}, {"id", randoms:get_string()}],
-+     [{xmlelement, "body", [], [{xmlcdata, Body}]}]
++    {xmlel, <<"message">>,
++     [{<<"type">>, <<"chat">>}, {<<"id">>, randoms:get_string()}],
++     [{xmlel, <<"body">>, [], [{xmlcdata, Body}]}]
 +    };
 +build_packet(message_headline, [Subject, Body]) ->
-+    {xmlelement, "message",
-+     [{"type", "headline"}, {"id", randoms:get_string()}],
-+     [{xmlelement, "subject", [], [{xmlcdata, Subject}]},
-+      {xmlelement, "body", [], [{xmlcdata, Body}]}
++    {xmlel, <<"message">>,
++     [{<<"type">>, <<"headline">>}, {<<"id">>, randoms:get_string()}],
++     [{xmlel, <<"subject">>, [], [{xmlcdata, Subject}]},
++      {xmlel, <<"body">>, [], [{xmlcdata, Body}]}
 +     ]
 +    }.
 +
@@ -1426,7 +1426,7 @@ index 0000000..1cef25a
 +    From = jlib:string_to_jid(Username ++ "@" ++ Host),
 +    To = jlib:string_to_jid(Host),
 +    QueryEl = xml_stream:parse_element(QueryS),
-+    StanzaEl = {xmlelement, "iq", [{"type", "set"}], [QueryEl]},
++    StanzaEl = {xmlel, <<"iq">>, [{<<"type">>, <<"set">>}], [QueryEl]},
 +    IQ = jlib:iq_query_info(StanzaEl),
 +    ejabberd_hooks:run_fold(
 +		     privacy_iq_set,
@@ -1442,16 +1442,16 @@ index 0000000..1cef25a
 +
 +stats(Name) ->
 +    case Name of
-+	"uptimeseconds" -> trunc(element(1, erlang:statistics(wall_clock))/1000);
-+	"registeredusers" -> length(ejabberd_auth:dirty_get_registered_users());
-+	"onlineusersnode" -> length(ejabberd_sm:dirty_get_my_sessions_list());
-+	"onlineusers" -> length(ejabberd_sm:dirty_get_sessions_list())
++	<<"uptimeseconds">> -> trunc(element(1, erlang:statistics(wall_clock))/1000);
++	<<"registeredusers">> -> length(ejabberd_auth:dirty_get_registered_users());
++	<<"onlineusersnode">> -> length(ejabberd_sm:dirty_get_my_sessions_list());
++	<<"onlineusers">> -> length(ejabberd_sm:dirty_get_sessions_list())
 +    end.
 +
 +stats(Name, Host) ->
 +    case Name of
-+	"registeredusers" -> length(ejabberd_auth:get_vh_registered_users(Host));
-+	"onlineusers" -> length(ejabberd_sm:get_vh_session_list(Host))
++	<<"registeredusers">> -> length(ejabberd_auth:get_vh_registered_users(Host));
++	<<"onlineusers">> -> length(ejabberd_sm:get_vh_session_list(Host))
 +    end.
 +
 +
@@ -1499,8 +1499,8 @@ index 0000000..1cef25a
 +		),
 +
 +    case rosteritem_purge({Action, Subs, Asks, Users, Contacts}) of
-+	{atomic, ok} ->
-+	    ok;
++	{atomic, Res} ->
++	    Res;
 +	{error, Reason} ->
 +	    io:format("Error purging rosteritems: ~p~n", [Reason]),
 +	    error;
@@ -1514,33 +1514,37 @@ index 0000000..1cef25a
 +    Num_rosteritems = mnesia:table_info(roster, size),
 +    io:format("There are ~p roster items in total.~n", [Num_rosteritems]),
 +    Key = mnesia:dirty_first(roster),
-+    ok = rip(Key, Options, {0, Num_rosteritems, 0, 0}),
-+    {atomic, ok}.
++    Res = rip(Key, Options, {0, Num_rosteritems, 0, 0}, []),
++    {atomic, Res}.
 +
-+rip('$end_of_table', _Options, Counters) ->
++rip('$end_of_table', _Options, Counters, Res) ->
 +    print_progress_line(Counters),
-+    ok;
-+rip(Key, Options, {Pr, NT, NV, ND}) ->
++    Res;
++rip(Key, Options, {Pr, NT, NV, ND}, Res) ->
 +    Key_next = mnesia:dirty_next(roster, Key),
 +    {Action, _, _, _, _} = Options,
-+    ND2 = case decide_rip(Key, Options) of
++    {ND2, Res2} = case decide_rip(Key, Options) of
 +	      true ->
-+		  apply_action(Action, Key),
-+		  ND+1;
++		  Jids = apply_action(Action, Key),
++		  {ND+1, [Jids | Res]};
 +	      false ->
-+		  ND
++		  {ND, Res}
 +	  end,
 +    NV2 = NV+1,
 +    Pr2 = print_progress_line({Pr, NT, NV2, ND2}),
-+    rip(Key_next, Options, {Pr2, NT, NV2, ND2}).
++    rip(Key_next, Options, {Pr2, NT, NV2, ND2}, Res2).
 +
 +apply_action(list, Key) ->
 +    {User, Server, JID} = Key,
 +    {RUser, RServer, _} = JID,
-+    io:format("Matches: ~s@~s ~s@~s~n", [User, Server, RUser, RServer]);
++    Jid1string = User ++ "@" ++ Server,
++    Jid2string = RUser ++ "@" ++ RServer,
++    io:format("Matches: ~s ~s~n", [Jid1string, Jid2string]),
++    {Jid1string, Jid2string};
 +apply_action(delete, Key) ->
-+    apply_action(list, Key),
-+    mnesia:dirty_delete(roster, Key).
++    R = apply_action(list, Key),
++    mnesia:dirty_delete(roster, Key),
++    R.
 +
 +print_progress_line({Pr, NT, NV, ND}) ->
 +    Pr2 = trunc((NV/NT)*100),
@@ -1602,6 +1606,3 @@ index 0000000..1cef25a
 +    not is_regexp_match(String, ejabberd_regexp:sh_to_awk(Glob));
 +is_glob_match(String, Glob) ->
 +    is_regexp_match(String, ejabberd_regexp:sh_to_awk(Glob)).
--- 
-1.8.3.1
-
diff --git a/ejabberd-0003-Fedora-specific-changes-to-ejabberdctl.patch b/ejabberd-0003-Fedora-specific-changes-to-ejabberdctl.patch
new file mode 100644
index 0000000..f9cf331
--- /dev/null
+++ b/ejabberd-0003-Fedora-specific-changes-to-ejabberdctl.patch
@@ -0,0 +1,19 @@
+From: Peter Lemenkov <lemenkov at gmail.com>
+Date: Tue, 16 Feb 2010 16:30:05 +0300
+Subject: [PATCH] Fedora-specific changes to ejabberdctl
+
+Signed-off-by: Peter Lemenkov <lemenkov at gmail.com>
+
+diff --git a/ejabberdctl.template b/ejabberdctl.template
+index a86694f..09b9947 100755
+--- a/ejabberdctl.template
++++ b/ejabberdctl.template
+@@ -22,7 +22,7 @@ if [ "$INSTALLUSER" != "" ] ; then
+     EXEC_CMD="false"
+     for GID in `id -G`; do
+         if [ $GID -eq 0 ] ; then
+-            EXEC_CMD="su $INSTALLUSER -p -c"
++            EXEC_CMD="/sbin/runuser -s /bin/bash -p ejabberd -c"
+         fi
+     done
+     if [ `id -g` -eq `id -g $INSTALLUSER` ] ; then
diff --git a/ejabberd-0004-Install-.so-objects-with-0755-permissions.patch b/ejabberd-0004-Install-.so-objects-with-0755-permissions.patch
new file mode 100644
index 0000000..dbf4fbf
--- /dev/null
+++ b/ejabberd-0004-Install-.so-objects-with-0755-permissions.patch
@@ -0,0 +1,19 @@
+From: Peter Lemenkov <lemenkov at gmail.com>
+Date: Sat, 12 Jun 2010 14:14:52 +0400
+Subject: [PATCH] Install *.so objects with 0755 permissions
+
+Signed-off-by: Peter Lemenkov <lemenkov at gmail.com>
+
+diff --git a/Makefile.in b/Makefile.in
+index 018ccd7..58d3486 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -156,7 +156,7 @@ install: all
+ 	#
+ 	# Binary system libraries
+ 	$(INSTALL) -d $(SODIR)
+-	$(INSTALL) -m 644 $(DLLs) $(SODIR)
++	$(INSTALL) -m 755 $(DLLs) $(SODIR)
+ 	#
+ 	# Translated strings
+ 	$(INSTALL) -d $(MSGSDIR)
diff --git a/ejabberd-0005-Clean-up-false-security-measure.patch b/ejabberd-0005-Clean-up-false-security-measure.patch
new file mode 100644
index 0000000..a6a99fd
--- /dev/null
+++ b/ejabberd-0005-Clean-up-false-security-measure.patch
@@ -0,0 +1,19 @@
+From: Peter Lemenkov <lemenkov at gmail.com>
+Date: Wed, 17 Jul 2013 14:56:09 +0400
+Subject: [PATCH] Clean up false security measure
+
+Signed-off-by: Peter Lemenkov <lemenkov at gmail.com>
+
+diff --git a/Makefile.in b/Makefile.in
+index 58d3486..de47be2 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -127,7 +127,7 @@ install: all
+ 	#
+ 	# Administration script
+ 	[ -d $(SBINDIR) ] || $(INSTALL) -d -m 755 $(SBINDIR)
+-	$(INSTALL) -m 550 $(G_USER) ejabberdctl.example $(SBINDIR)/ejabberdctl
++	$(INSTALL) -m 755 $(G_USER) ejabberdctl.example $(SBINDIR)/ejabberdctl
+ 	#
+ 	# Init script
+ 	$(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*" \
diff --git a/ejabberd-0006-Enable-polkit-support.patch b/ejabberd-0006-Enable-polkit-support.patch
new file mode 100644
index 0000000..715c5a4
--- /dev/null
+++ b/ejabberd-0006-Enable-polkit-support.patch
@@ -0,0 +1,16 @@
+From: Peter Lemenkov <lemenkov at gmail.com>
+Date: Wed, 17 Jul 2013 14:51:04 +0400
+Subject: [PATCH] Enable polkit support
+
+Signed-off-by: Peter Lemenkov <lemenkov at gmail.com>
+
+diff --git a/ejabberdctl.template b/ejabberdctl.template
+index 09b9947..0fd33fe 100755
+--- a/ejabberdctl.template
++++ b/ejabberdctl.template
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/usr/bin/pkexec /bin/sh
+ 
+ # define default configuration
+ POLL=true
diff --git a/ejabberd-0007-Install-into-BINDIR-instead-of-SBINDIR.patch b/ejabberd-0007-Install-into-BINDIR-instead-of-SBINDIR.patch
new file mode 100644
index 0000000..7a0e178
--- /dev/null
+++ b/ejabberd-0007-Install-into-BINDIR-instead-of-SBINDIR.patch
@@ -0,0 +1,45 @@
+From: Peter Lemenkov <lemenkov at gmail.com>
+Date: Wed, 17 Jul 2013 14:53:49 +0400
+Subject: [PATCH] Install into BINDIR instead of SBINDIR
+
+Signed-off-by: Peter Lemenkov <lemenkov at gmail.com>
+
+diff --git a/Makefile.in b/Makefile.in
+index de47be2..037d2ff 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -11,8 +11,8 @@ DESTDIR =
+ # /etc/ejabberd/
+ ETCDIR = $(DESTDIR)@sysconfdir@/ejabberd
+ 
+-# /sbin/
+-SBINDIR = $(DESTDIR)@sbindir@
++# /bin/
++BINDIR = $(DESTDIR)@bindir@
+ 
+ # /lib/ejabberd/
+ EJABBERDDIR = $(DESTDIR)@libdir@/ejabberd
+@@ -126,11 +126,11 @@ install: all
+ 	$(INSTALL) -b -m 644 $(G_USER) inetrc $(ETCDIR)/inetrc
+ 	#
+ 	# Administration script
+-	[ -d $(SBINDIR) ] || $(INSTALL) -d -m 755 $(SBINDIR)
+-	$(INSTALL) -m 755 $(G_USER) ejabberdctl.example $(SBINDIR)/ejabberdctl
++	[ -d $(BINDIR) ] || $(INSTALL) -d -m 755 $(BINDIR)
++	$(INSTALL) -m 755 $(G_USER) ejabberdctl.example $(BINDIR)/ejabberdctl
+ 	#
+ 	# Init script
+-	$(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*" \
++	$(SED) -e "s*@ctlscriptpath@*$(BINDIR)*" \
+ 		-e "s*@installuser@*$(INIT_USER)*" ejabberd.init.template \
+ 		> ejabberd.init
+ 	chmod 755 ejabberd.init
+@@ -191,7 +191,7 @@ install: all
+ uninstall: uninstall-binary
+ 
+ uninstall-binary:
+-	rm -f  $(SBINDIR)/ejabberdctl
++	rm -f  $(BINDIR)/ejabberdctl
+ 	rm -fr $(DOCDIR)
+ 	rm -f  $(BEAMDIR)/*.beam
+ 	rm -f  $(BEAMDIR)/*.app
diff --git a/ejabberd-0008-Disable-Erlang-version-check.patch b/ejabberd-0008-Disable-Erlang-version-check.patch
new file mode 100644
index 0000000..3c6d723
--- /dev/null
+++ b/ejabberd-0008-Disable-Erlang-version-check.patch
@@ -0,0 +1,38 @@
+From: Peter Lemenkov <lemenkov at gmail.com>
+Date: Sat, 30 Aug 2014 12:21:45 +0400
+Subject: [PATCH] Disable Erlang version check
+
+Signed-off-by: Peter Lemenkov <lemenkov at gmail.com>
+
+diff --git a/configure.ac b/configure.ac
+index e7bb43b..d24c543 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -3,8 +3,6 @@
+ 
+ AC_PREREQ(2.53)
+ AC_INIT(ejabberd, m4_esyscmd([echo `git describe --tags 2>/dev/null || echo community` | sed 's/-g.*//' | tr -d '\012']), [ejabberd at process-one.net], [ejabberd])
+-REQUIRE_ERLANG_MIN="5.9.1 (Erlang/OTP R15B01)"
+-REQUIRE_ERLANG_MAX="9.0.0 (No Max)"
+ 
+ # Checks for programs.
+ AC_PROG_MAKE_SET
+@@ -32,18 +30,6 @@ AC_PATH_TOOL(ERLC, erlc, , [${extra_erl_path}$PATH])
+ AC_ERLANG_NEED_ERL
+ AC_ERLANG_NEED_ERLC
+ 
+-AC_ARG_ENABLE(erlang-version-check,
+-[AC_HELP_STRING([--enable-erlang-version-check],
+-	[Check Erlang/OTP version @<:@default=yes@:>@])])
+-case "$enable_erlang_version_check" in
+-	yes|'')
+-		ERLANG_VERSION_CHECK([$REQUIRE_ERLANG_MIN],[$REQUIRE_ERLANG_MAX])
+-		;;
+-	no)
+-		ERLANG_VERSION_CHECK([$REQUIRE_ERLANG_MIN],[$REQUIRE_ERLANG_MAX],[warn])
+-		;;
+-esac
+-
+ # Checks and sets ERLANG_ROOT_DIR and ERLANG_LIB_DIR variable
+ AC_ERLANG_SUBST_ROOT_DIR
+ # AC_ERLANG_SUBST_LIB_DIR
diff --git a/ejabberd-0009-Fix-permissions-for-captcha-script.patch b/ejabberd-0009-Fix-permissions-for-captcha-script.patch
new file mode 100644
index 0000000..d694c57
--- /dev/null
+++ b/ejabberd-0009-Fix-permissions-for-captcha-script.patch
@@ -0,0 +1,19 @@
+From: Peter Lemenkov <lemenkov at gmail.com>
+Date: Sun, 31 Aug 2014 13:21:48 +0400
+Subject: [PATCH] Fix permissions for captcha script
+
+Signed-off-by: Peter Lemenkov <lemenkov at gmail.com>
+
+diff --git a/Makefile.in b/Makefile.in
+index 037d2ff..d972c98 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -150,7 +150,7 @@ install: all
+ 	#
+ 	# Binary C programs
+ 	$(INSTALL) -d $(PBINDIR)
+-	$(INSTALL) -m 750 $(O_USER) tools/captcha.sh $(PBINDIR)
++	$(INSTALL) -m 755 $(O_USER) tools/captcha.sh $(PBINDIR)
+ 	-[ -f deps/p1_pam/priv/bin/epam ] \
+ 		&& $(INSTALL) -m 750 $(O_USER) deps/p1_pam/priv/bin/epam $(PBINDIR)
+ 	#
diff --git a/ejabberd-0010-Enable-systemd-notification-if-available.patch b/ejabberd-0010-Enable-systemd-notification-if-available.patch
new file mode 100644
index 0000000..8a04f37
--- /dev/null
+++ b/ejabberd-0010-Enable-systemd-notification-if-available.patch
@@ -0,0 +1,18 @@
+From: Peter Lemenkov <lemenkov at gmail.com>
+Date: Sun, 31 Aug 2014 16:08:17 +0400
+Subject: [PATCH] Enable systemd notification if available
+
+Signed-off-by: Peter Lemenkov <lemenkov at gmail.com>
+
+diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl
+index 379f728..9aa6801 100644
+--- a/src/ejabberd_app.erl
++++ b/src/ejabberd_app.erl
+@@ -66,6 +66,7 @@ start(normal, _Args) ->
+     maybe_add_nameservers(),
+     start_modules(),
+     ejabberd_listener:start_listeners(),
++    {module, sd_notify} == code:load_file(sd_notify) andalso sd_notify:sd_notify(0, "READY=1"),
+     ?INFO_MSG("ejabberd ~s is started in the node ~p", [?VERSION, node()]),
+     Sup;
+ start(_, _) ->
diff --git a/ejabberd.logrotate b/ejabberd.logrotate
index cf5274a..9921889 100644
--- a/ejabberd.logrotate
+++ b/ejabberd.logrotate
@@ -4,6 +4,6 @@
     create 0640 ejabberd ejabberd
     sharedscripts
     postrotate
-    runuser -s /bin/bash - ejabberd -c "/usr/sbin/ejabberdctl reopen-log" >/dev/null 2>/dev/null || true
+    runuser -s /bin/bash - ejabberd -c "/usr/bin/ejabberdctl reopen-log" >/dev/null 2>/dev/null || true
     endscript
 }
diff --git a/ejabberd.service b/ejabberd.service
index ea16733..2fe9048 100644
--- a/ejabberd.service
+++ b/ejabberd.service
@@ -1,6 +1,7 @@
 [Unit]
 Description=A distributed, fault-tolerant Jabber/XMPP server
-After=network.target
+Requires=network-online.target
+After=network-online.target
 
 [Service]
 Type=oneshot
@@ -9,11 +10,11 @@ Group=ejabberd
 LimitNOFILE=16000
 RestartSec=5
 ExecStart=/usr/bin/bash /usr/bin/ejabberdctl \
-		--config /etc/ejabberd/ejabberd.cfg \
+		--config /etc/ejabberd/ejabberd.yml \
 		--ctl-config /etc/ejabberd/ejabberdctl.cfg \
 		--logs "/var/log/ejabberd" \
-		--spool "/var/lib/ejabberd/spool" start
-ExecStop=/usr/sbin/ejabberdctl stop
+		--spool "/var/lib/ejabberd" start
+ExecStop=/usr/bin/ejabberdctl stop
 RemainAfterExit=yes
 
 [Install]
diff --git a/ejabberd.spec b/ejabberd.spec
index 52c8d73..485d856 100644
--- a/ejabberd.spec
+++ b/ejabberd.spec
@@ -1,4 +1,5 @@
 %global _hardened_build 1
+
 # FIXME non-standard directory for storing *.so objects
 %{?filter_setup:
 %filter_provides_in %{_libdir}/ejabberd/priv/lib/.*\.so$
@@ -15,15 +16,14 @@
 # see https://bugzilla.redhat.com/bugzilla/250253
 %global _with_hevea 0
 %else
-# FIXME Hevea is deadly broken currently
-%global _with_hevea 0
+%global _with_hevea 1
 %endif
 %endif
 
 
 Name:           ejabberd
-Version:        2.1.13
-Release:        10%{?dist}
+Version:        14.07
+Release:        1%{?dist}
 Summary:        A distributed, fault-tolerant Jabber/XMPP server
 
 Group:          Applications/Internet
@@ -32,10 +32,8 @@ URL:            http://www.ejabberd.im/
 %if 0%{?el7}%{?fedora}
 VCS:		scm:git:https://github.com/processone/ejabberd.git
 %endif
-Source0:	https://github.com/processone/%{name}/archive/v%{version}/%{name}-v%{version}.tar.gz
-Source1:        ejabberd.init
+Source0:	https://github.com/processone/%{name}/archive/%{version}/%{name}-%{version}.tar.gz
 Source2:        ejabberd.logrotate
-Source3:	ejabberd.sysconfig
 
 # Support for systemd
 Source4:	ejabberd.service
@@ -45,42 +43,46 @@ Source5:	ejabberd.tmpfiles.conf
 Source9:        ejabberdctl.pam
 Source11:       ejabberd.pam
 
-# usermode support for old systems
-Source10:	ejabberdctl.apps
 # polkit support
 Source12:	ejabberdctl.polkit.actions
 Source13:	ejabberdctl.polkit.rules
 
+Source14:	ejabberd-src-deps.tar
+
 # Use ejabberd as an example for PAM service name (fedora/epel-specific)
 Patch1: ejabberd-0001-Fix-PAM-service-example-name-to-match-actual-one.patch
-# fixed delays in s2s connections
-Patch2: ejabberd-0002-Fixed-delays-in-s2s-connections.patch
 # Introducing mod_admin_extra
-Patch3: ejabberd-0003-Introducing-mod_admin_extra.patch
+Patch2: ejabberd-0002-Introducing-mod_admin_extra.patch
 # BZ# 439583, 452326, 451554, 465196, 502361 (fedora/epel-specific)
-Patch4: ejabberd-0004-Fedora-specific-changes-to-ejabberdctl.patch
-# Fix so-lib permissions while installing (fedora/epel-specific)
-Patch5:	ejabberd-0005-Install-.so-objects-with-0755-permissions.patch
-# Backported from upstream
-Patch6: ejabberd-0006-Support-SASL-GSSAPI-authentication-thanks-to-Mikael-.patch
-# Disable IP restriction for ejabberdctl (seems that it doesn't work well)
-Patch7: ejabberd-0007-Disable-INET_DIST_INTERFACE-by-default.patch
-# Don't try to make system-wide scripts unreadable for users (fedora/epel-specific)
-Patch8: ejabberd-0008-Clean-up-false-security-measure.patch
+Patch3: ejabberd-0003-Fedora-specific-changes-to-ejabberdctl.patch
+# Fedora-specific
+Patch4: ejabberd-0004-Install-.so-objects-with-0755-permissions.patch
+# Fedora-specific
+Patch5: ejabberd-0005-Clean-up-false-security-measure.patch
 # polkit support
-Patch9: ejabberd-0009-Enable-polkit-support.patch
-# polkit support
-Patch10:ejabberd-0010-Install-into-BINDIR-instead-of-SBINDIR.patch
-
-BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+Patch6: ejabberd-0006-Enable-polkit-support.patch
+# Fedora-specific
+Patch7: ejabberd-0007-Install-into-BINDIR-instead-of-SBINDIR.patch
+# Fedora-specific
+Patch8:	ejabberd-0008-Disable-Erlang-version-check.patch
+# Fedora-specific
+Patch9: ejabberd-0009-Fix-permissions-for-captcha-script.patch
+# Fedora-specific
+Patch10:ejabberd-0010-Enable-systemd-notification-if-available.patch
 
 BuildRequires:  expat-devel
 BuildRequires:  openssl-devel >= 0.9.8
 BuildRequires:  pam-devel
+BuildRequires:  libyaml-devel
 BuildRequires:  erlang
+BuildRequires:  erlang-rebar
+# FIXME
+#BuildRequires:  erlang-jiffy
+#BuildRequires:  erlang-lager
+#BuildRequires:  erlang-ibrowse
+#BuildRequires:  erlang-xmlrpc
 %if 0%{?_with_hevea}
 BuildRequires:  hevea
-BuildRequires:  texlive
 BuildRequires:  texlive-comment
 %endif
 BuildRequires:	autoconf
@@ -90,61 +92,22 @@ BuildRequires:	automake
 Requires(pre):		shadow-utils
 
 Requires(post): /usr/bin/openssl
-%if 0%{?el5}%{?el6}
-Requires(post): /sbin/chkconfig
-Requires(preun): /sbin/chkconfig
-Requires(preun): /sbin/service
-Requires(postun): /sbin/service
-%else
 Requires(post): systemd
 Requires(preun): systemd
 Requires(postun): systemd
-%endif
 
 Provides: user(%{name})
 Provides: group(%{name})
 
-#Error:erlang(exmpp_jid:domain_as_list/1)
-#Error:erlang(exmpp_jid:make/2)
-#Error:erlang(exmpp_jid:node_as_list/1)
-#Error:erlang(exmpp_jid:parse/1)
-#Error:erlang(exmpp_jid:prep_domain_as_list/1)
-#Error:erlang(exmpp_jid:prep_node_as_list/1)
-#Error:erlang(exmpp_jid:prep_resource_as_list/1)
-#Error:erlang(exmpp_jid:resource_as_list/1)
-#Error:erlang(exmpp:start/0)
-#Error:erlang(exmpp_xml:document_to_list/1)
-#Error:erlang(exmpp_xml:foreach/2)
-#Error:erlang(exmpp_xml:get_attribute/3)
-#Error:erlang(exmpp_xml:get_attribute_as_list/3)
-#Error:erlang(exmpp_xml:get_element/2)
-#Error:erlang(exmpp_xml:get_elements/2)
-#Error:erlang(exmpp_xml:parse/2)
-#Error:erlang(exmpp_xml:start_parser/1)
-#Error:erlang(exmpp_xml:stop_parser/1)
-#Error:erlang(exmpp_xml:xmlelement_to_xmlel/1)
-#Error:erlang(exmpp_xml:xmlel_to_xmlelement/1)
-#Error:erlang(mysql_conn:fetch/3)
-#Error:erlang(mysql_conn:start/6)
-#Error:erlang(mysql_conn:stop/1)
-#Error:erlang(mysql:get_result_affected_rows/1)
-#Error:erlang(mysql:get_result_field_info/1)
-#Error:erlang(mysql:get_result_reason/1)
-#Error:erlang(mysql:get_result_rows/1)
-#Error:erlang(release_handler_1:eval_script/3)
-#Error:erlang(ssl:seed/1)
 Requires:       erlang
-#Error:erlang(esasl:str_error/2)
-Requires:       erlang-esasl
-%if 0%{?el5}%{?el6}
-Requires:       usermode
-%else
+# FIXME see also patch #10
+#Requires:       erlang-sd_notify
 # for /usr/bin/pkexec
 Requires:       polkit
-%endif
 # for flock in ejabberdctl
 Requires:	util-linux
 %{?__erlang_drv_version:Requires: %{__erlang_drv_version}}
+%{?__erlang_nif_version:Requires: %{__erlang_nif_version}}
 
 
 %description
@@ -155,10 +118,8 @@ Windows NT/2000/XP).
 
 %package doc
 Summary: Documentation for ejabberd
-%if 0%{?el6}%{?el7}%{?fedora}
 BuildArch: noarch
 Obsoletes: %{name}-doc < 2.1.4
-%endif
 # docdir owner
 Requires: %{name} = %{version}-%{release}
 Group: Documentation
@@ -170,100 +131,67 @@ Documentation for ejabberd.
 %setup -q
 
 %patch1 -p1 -b .pam_name
-%patch2 -p1 -b .s2s_delays
-%patch3 -p1 -b .mod_admin_extra
-%patch4 -p1 -b .fedora_specific
-%patch5 -p1 -b .fix_perms
-%patch6 -p1 -b .gssapi
-%patch7 -p1 -b .disable_ip_restriction_for_ejabberdctl
-%patch8 -p1 -b .dont_hide
-%if 0%{?el7}%{?fedora}
-%patch9 -p1 -b .use_polkit
-%patch10 -p1 -b .usr_bin
-%endif
+%patch2 -p1 -b .mod_admin_extra
+%patch3 -p1 -b .fedora_specific
+%patch4 -p1 -b .so_lib_755
+%patch5 -p1 -b .false_security
+%patch6 -p1 -b .use_polkit
+%patch7 -p1 -b .use_bindir
+%patch8 -p1 -b .no_ver_check
+%patch9 -p1 -b .captcha_perms
+#%patch10 -p1 -b .systemd_notify
+
+tar xvf %{S:14}
 
 
 %build
-pushd src
 autoreconf -ivf
-%configure --enable-odbc --enable-pam
-# doesn't build on SMP currently
+
+# Disabled:  --enable-hipe --enable-roster-gateway-workaround --enable-transient_supervisors --enable-full-xml --enable-mssql --enable-tools --enable-riak
+%configure --enable-nif --enable-odbc --enable-mysql --enable-pgsql --enable-pam --enable-zlib --enable-json --enable-iconv --enable-debug --enable-http --enable-lager
 make
-popd
 %if 0%{?_with_hevea}
 pushd doc
 # remove pre-built docs
-rm -f dev.html features.html features.pdf guide.html guide.pdf
+rm -f dev.html features.html
+# See this link - http://thread.gmane.org/gmane.linux.redhat.fedora.devel/198954/focus=198957
+make release
 make html pdf
 popd
 %endif
 
 
 %install
-rm -rf %{buildroot}
-
-pushd src
 make install DESTDIR=%{buildroot}
-popd
 
 # fix example SSL certificate path to real one, which we created recently (see above)
-%{__perl} -pi -e 's!/path/to/ssl.pem!/etc/ejabberd/ejabberd.pem!g' %{buildroot}/etc/ejabberd/ejabberd.cfg
+%{__perl} -pi -e 's!/path/to/ssl.pem!/etc/ejabberd/ejabberd.pem!g' %{buildroot}/etc/ejabberd/ejabberd.yml
 
 # fix captcha path
-%{__perl} -pi -e 's!/lib/ejabberd/priv/bin/captcha.sh!%{_libdir}/%{name}/priv/bin/captcha.sh!g' %{buildroot}/etc/ejabberd/ejabberd.cfg
-
-mkdir -p %{buildroot}/var/log/ejabberd
-mkdir -p %{buildroot}/var/lib/ejabberd/spool
+%{__perl} -pi -e 's!/lib/ejabberd/priv/bin/captcha.sh!%{_libdir}/%{name}/priv/bin/captcha.sh!g' %{buildroot}/etc/ejabberd/ejabberd.yml
 
 install -D -p -m 0644 %{S:9} %{buildroot}%{_sysconfdir}/pam.d/ejabberdctl
 install -D -p -m 0644 %{S:11} %{buildroot}%{_sysconfdir}/pam.d/ejabberd
-%if 0%{?el5}
-# No password-auth PAM scheme in EL5 - see rhbz #758601
-sed -i -e "s,password-auth,system-auth,g" %{buildroot}%{_sysconfdir}/pam.d/ejabberd
-%endif
-
 
-%if 0%{?el5}%{?el6}
-# install init-script
-install -D -p -m 0755 %{S:1} %{buildroot}%{_initrddir}/ejabberd
-# install sysconfig file
-install -D -p -m 0644  %{S:3} %{buildroot}%{_sysconfdir}/sysconfig/ejabberd
-%else
 # install systemd entry
 install -D -m 0644 -p %{S:4} %{buildroot}%{_unitdir}/%{name}.service
 install -D -m 0644 -p %{S:5} %{buildroot}%{_tmpfilesdir}/%{name}.conf
-%endif
 
 # install config for logrotate
 install -D -p -m 0644  %{S:2} %{buildroot}%{_sysconfdir}/logrotate.d/ejabberd
 
-# create room for necessary data
+# create room for additional files (such as SQL schemas)
 install -d %{buildroot}%{_datadir}/%{name}
 # install sql-scripts for creating db schemes for various RDBMS
-install -p -m 0644 src/odbc/mssql2000.sql %{buildroot}%{_datadir}/%{name}
-install -p -m 0644 src/odbc/mssql2005.sql %{buildroot}%{_datadir}/%{name}
-install -p -m 0644 src/odbc/mysql.sql %{buildroot}%{_datadir}/%{name}
-install -p -m 0644 src/odbc/pg.sql %{buildroot}%{_datadir}/%{name}
-
-# Fix permissions for captcha script
-# In fact, we can also chown root:ejabberd here, but I'm not sure
-# that we should care about the possibility of reading by someone
-# for this *default* sript, which is not intended to be changed
-chmod 755 %{buildroot}%{_libdir}/%{name}/priv/bin/captcha.sh
-
-%if 0%{?el5}%{?el6}
-# Use usermode on old systems
-mkdir -p %{buildroot}%{_bindir}
-ln -s consolehelper %{buildroot}%{_bindir}/ejabberdctl
-install -D -p -m 0644 %{S:10} %{buildroot}%{_sysconfdir}/security/console.apps/ejabberdctl
-%else
-# Use polkit
+install -p -m 0644 sql/mssql2000.sql %{buildroot}%{_datadir}/%{name}
+install -p -m 0644 sql/mssql2005.sql %{buildroot}%{_datadir}/%{name}
+install -p -m 0644 sql/mssql2012.sql %{buildroot}%{_datadir}/%{name}
+install -p -m 0644 sql/mysql.sql %{buildroot}%{_datadir}/%{name}
+install -p -m 0644 sql/pg.sql %{buildroot}%{_datadir}/%{name}
+
+# Install polkit-related files
 install -D -p -m 0644 %{S:12} %{buildroot}%{_datadir}/polkit-1/actions/ejabberdctl.policy
 install -D -p -m 0644 %{S:13} %{buildroot}%{_datadir}/polkit-1/rules.d/51-ejabberdctl.rules
-%endif
-
-# Remove installed doc-files
-rm -rf %{buildroot}%{_defaultdocdir}
 
 
 %pre
@@ -293,25 +221,18 @@ if [ $1 -gt 1 ]; then
 
 	# fix cookie path (since ver. 2.1.0 cookie stored in /var/lib/ejabberd/spool
 	# rather than in /var/lib/ejabberd
-	if [ -f /var/lib/ejabberd/.erlang.cookie ]; then
-		cp -pu /var/lib/ejabberd/{,spool/}.erlang.cookie
+	if [ -f /var/lib/ejabberd/spool/.erlang.cookie ]; then
+		cp -pu /var/lib/ejabberd/{spool/,}.erlang.cookie
 		echo
-		echo The ejabberd cookie file was moved.
-		echo Please delete old one from /var/lib/ejabberd/.erlang.cookie
+		echo The ejabberd cookie file was moved again.
+		echo Please delete old one from /var/lib/ejabberd/spool/.erlang.cookie
 		echo
 	fi
 fi
 
 
 %post
-%if 0%{?el5}%{?el6}
-if [ $1 -eq 1 ]; then
-	# Initial installation
-	/sbin/chkconfig --add %{name} || :
-fi
-%else
 %systemd_post %{name}.service
-%endif
 
 # Create SSL certificate with default values if it doesn't exist
 (cd /etc/ejabberd
@@ -336,111 +257,56 @@ fi)
 
 
 %preun
-%if 0%{?el5}%{?el6}
-if [ $1 -eq 0 ]; then
-	# Package removal, not upgrade
-        /sbin/service %{name} stop >/dev/null 2>&1 || :
-        /sbin/chkconfig --del %{name} || :
-fi
-%else
 %systemd_preun %{name}.service
-%endif
 
 
 %postun
-%if 0%{?el5}%{?el6}
-if [ $1 -ge 1 ]; then
-	# Package upgrade, not uninstall
-	/sbin/service %{name} condrestart >/dev/null 2>&1
-fi
-%else
 %systemd_postun_with_restart %{name}.service
-%endif
-
-
-%clean
-rm -rf %{buildroot}
 
 
 %files
 %doc COPYING
 
 %attr(750,ejabberd,ejabberd) %dir %{_sysconfdir}/ejabberd
-%attr(640,ejabberd,ejabberd) %config(noreplace) %{_sysconfdir}/ejabberd/ejabberd.cfg
+%attr(640,ejabberd,ejabberd) %config(noreplace) %{_sysconfdir}/ejabberd/ejabberd.yml
 %attr(640,ejabberd,ejabberd) %config(noreplace) %{_sysconfdir}/ejabberd/ejabberdctl.cfg
 %attr(640,ejabberd,ejabberd) %config(noreplace) %{_sysconfdir}/ejabberd/inetrc
 
-%if 0%{?el5}%{?el6}
-%config(noreplace) %{_sysconfdir}/sysconfig/%{name}
-%{_initrddir}/%{name}
-%else
 %{_unitdir}/%{name}.service
 %{_tmpfilesdir}/%{name}.conf
-%endif
 
 %config(noreplace) %{_sysconfdir}/logrotate.d/%{name}
 %config(noreplace) %{_sysconfdir}/pam.d/%{name}
 %config(noreplace) %{_sysconfdir}/pam.d/ejabberdctl
-%if 0%{?el5}%{?el6}
-%{_sbindir}/ejabberdctl
-%config(noreplace) %{_sysconfdir}/security/console.apps/ejabberdctl
-%else
 %{_datadir}/polkit-1/actions/ejabberdctl.policy
 %{_datadir}/polkit-1/rules.d/51-ejabberdctl.rules
-%endif
 %{_bindir}/ejabberdctl
 
 %dir %{_libdir}/%{name}
 %dir %{_libdir}/%{name}/ebin
 %dir %{_libdir}/%{name}/include
-%dir %{_libdir}/%{name}/include/eldap
-%dir %{_libdir}/%{name}/include/mod_muc
-%dir %{_libdir}/%{name}/include/mod_proxy65
-%dir %{_libdir}/%{name}/include/mod_pubsub
-%dir %{_libdir}/%{name}/include/web
 %dir %{_libdir}/%{name}/priv
 %dir %{_libdir}/%{name}/priv/bin
 %dir %{_libdir}/%{name}/priv/lib
 %dir %{_libdir}/%{name}/priv/msgs
 
-%{_libdir}/%{name}/ebin/%{name}.app
+%{_libdir}/%{name}/ebin/*.app
 %{_libdir}/%{name}/ebin/*.beam
-%{_libdir}/%{name}/include/XmppAddr.hrl
-%{_libdir}/%{name}/include/adhoc.hrl
-%{_libdir}/%{name}/include/cyrsasl.hrl
-%{_libdir}/%{name}/include/ejabberd.hrl
-%{_libdir}/%{name}/include/ejabberd_commands.hrl
-%{_libdir}/%{name}/include/ejabberd_config.hrl
-%{_libdir}/%{name}/include/ejabberd_ctl.hrl
-%{_libdir}/%{name}/include/eldap/ELDAPv3.hrl
-%{_libdir}/%{name}/include/eldap/eldap.hrl
-%{_libdir}/%{name}/include/jlib.hrl
-%{_libdir}/%{name}/include/mod_muc/mod_muc_room.hrl
-%{_libdir}/%{name}/include/mod_privacy.hrl
-%{_libdir}/%{name}/include/mod_proxy65/mod_proxy65.hrl
-%{_libdir}/%{name}/include/mod_pubsub/pubsub.hrl
-%{_libdir}/%{name}/include/mod_roster.hrl
-%{_libdir}/%{name}/include/web/ejabberd_http.hrl
-%{_libdir}/%{name}/include/web/ejabberd_web_admin.hrl
-%{_libdir}/%{name}/include/web/http_bind.hrl
+%{_libdir}/%{name}/include/*.hrl
 %{_libdir}/%{name}/priv/bin/captcha.sh
 %attr(4750,root,ejabberd) %{_libdir}/%{name}/priv/bin/epam
-%{_libdir}/%{name}/priv/lib/ejabberd_zlib_drv.so
-%{_libdir}/%{name}/priv/lib/expat_erl.so
-%{_libdir}/%{name}/priv/lib/iconv_erl.so
-%{_libdir}/%{name}/priv/lib/sha_drv.so
-%{_libdir}/%{name}/priv/lib/stringprep_drv.so
-%{_libdir}/%{name}/priv/lib/tls_drv.so
+%{_libdir}/%{name}/priv/lib/*.so
+
 %{_libdir}/%{name}/priv/msgs/*.msg
 
 %dir %{_datadir}/%{name}
 %{_datadir}/%{name}/mssql2000.sql
 %{_datadir}/%{name}/mssql2005.sql
+%{_datadir}/%{name}/mssql2012.sql
 %{_datadir}/%{name}/mysql.sql
 %{_datadir}/%{name}/pg.sql
 
 %attr(750,ejabberd,ejabberd) %dir /var/lib/ejabberd
-%attr(750,ejabberd,ejabberd) %dir /var/lib/ejabberd/spool
 %attr(750,ejabberd,ejabberd) %dir /var/lock/ejabberdctl
 %attr(750,ejabberd,ejabberd) %dir /var/log/ejabberd
 
@@ -454,6 +320,14 @@ rm -rf %{buildroot}
 
 
 %changelog
+* Sat Aug 30 2014 Peter Lemenkov <lemenkov at gmail.com> - 14.07-1
+- Ver. 14.07
+- Dropped support for EPEL5, EPEL6
+- Dropped initial untested support for GSSAPI - nobody is interested in testing
+  and further developing this
+- Fixed https://bugzilla.redhat.com/1089475
+- Fixed https://bugzilla.redhat.com/1117450
+
 * Thu Aug 28 2014 Peter Lemenkov <lemenkov at gmail.com> - 2.1.13-10
 - Rebuild with Erlang 17.2.1
 
diff --git a/sources b/sources
index 4c10b8d..b1728e6 100644
--- a/sources
+++ b/sources
@@ -1 +1,2 @@
-2a7c3b711b4f7091f811c51b52beb735  ejabberd-v2.1.13.tar.gz
+a26b8acfc8fd15d94874befa06da15be  ejabberd-14.07.tar.gz
+0362024d73b2c8ee38246be5a168869b  ejabberd-src-deps.tar


More information about the scm-commits mailing list