summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Lemenkov <lemenkov@gmail.com>2014-08-31 18:52:59 +0400
committerPeter Lemenkov <lemenkov@gmail.com>2014-08-31 18:52:59 +0400
commit145e11bc3af88258d588f8a21c394bafce40a27f (patch)
treeb9c4df7a9b595fbcc4b7d6bacdcf594a354d97f7
parent831c8ac8456cd5d617791a7930f3cca6cd9b07af (diff)
downloadejabberd-145e11bc3af88258d588f8a21c394bafce40a27f.tar.gz
ejabberd-145e11bc3af88258d588f8a21c394bafce40a27f.tar.xz
ejabberd-145e11bc3af88258d588f8a21c394bafce40a27f.zip
Ejabberd ver. 14.07
Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
-rw-r--r--.gitignore2
-rw-r--r--ejabberd-0001-Fix-PAM-service-example-name-to-match-actual-one.patch33
-rw-r--r--ejabberd-0002-Fixed-delays-in-s2s-connections.patch53
-rw-r--r--ejabberd-0002-Introducing-mod_admin_extra.patch (renamed from ejabberd-0003-Introducing-mod_admin_extra.patch)401
-rw-r--r--ejabberd-0003-Fedora-specific-changes-to-ejabberdctl.patch19
-rw-r--r--ejabberd-0004-Fedora-specific-changes-to-ejabberdctl.patch48
-rw-r--r--ejabberd-0004-Install-.so-objects-with-0755-permissions.patch19
-rw-r--r--ejabberd-0005-Clean-up-false-security-measure.patch19
-rw-r--r--ejabberd-0005-Install-.so-objects-with-0755-permissions.patch26
-rw-r--r--ejabberd-0006-Enable-polkit-support.patch16
-rw-r--r--ejabberd-0006-Support-SASL-GSSAPI-authentication-thanks-to-Mikael-.patch505
-rw-r--r--ejabberd-0007-Disable-INET_DIST_INTERFACE-by-default.patch26
-rw-r--r--ejabberd-0007-Install-into-BINDIR-instead-of-SBINDIR.patch45
-rw-r--r--ejabberd-0008-Clean-up-false-security-measure.patch26
-rw-r--r--ejabberd-0008-Disable-Erlang-version-check.patch38
-rw-r--r--ejabberd-0009-Enable-polkit-support.patch23
-rw-r--r--ejabberd-0009-Fix-permissions-for-captcha-script.patch19
-rw-r--r--ejabberd-0010-Enable-systemd-notification-if-available.patch18
-rw-r--r--ejabberd-0010-Install-into-BINDIR-instead-of-SBINDIR.patch50
-rw-r--r--ejabberd.init111
-rw-r--r--ejabberd.logrotate2
-rw-r--r--ejabberd.service9
-rw-r--r--ejabberd.spec280
-rw-r--r--ejabberd.sysconfig13
-rw-r--r--ejabberdctl.apps5
-rw-r--r--sources3
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@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@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-0002-Fixed-delays-in-s2s-connections.patch b/ejabberd-0002-Fixed-delays-in-s2s-connections.patch
deleted file mode 100644
index 8572111..0000000
--- a/ejabberd-0002-Fixed-delays-in-s2s-connections.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-From ec26218c6f2374f4e39e50c194150065cc5da275 Mon Sep 17 00:00:00 2001
-From: Sergei Golovan <sgolovan@nes.ru>
-Date: Tue, 16 Feb 2010 16:07:37 +0300
-Subject: [PATCH 02/10] Fixed delays in s2s connections.
-
-Patch by Sergei Golovan increases timeouts in S2S and removes horrible 5-minute
-delay between remote server connection attempts after a falure (in case of
-server is down it would be reasonable, but what happens much more often is a
-network split when the delay is inadmissible).
----
- src/ejabberd_s2s_in.erl | 2 +-
- src/ejabberd_s2s_out.erl | 5 +++--
- 2 files changed, 4 insertions(+), 3 deletions(-)
-
-diff --git a/src/ejabberd_s2s_in.erl b/src/ejabberd_s2s_in.erl
-index 6ae4f34..a54e9ab 100644
---- a/src/ejabberd_s2s_in.erl
-+++ b/src/ejabberd_s2s_in.erl
-@@ -414,7 +414,7 @@ stream_established({xmlstreamelement, El}, StateData) ->
- case {ejabberd_s2s:allow_host(LTo, LFrom),
- lists:member(LTo, ejabberd_router:dirty_get_all_domains())} of
- {true, true} ->
-- ejabberd_s2s_out:terminate_if_waiting_delay(LTo, LFrom),
-+ %%ejabberd_s2s_out:terminate_if_waiting_delay(LTo, LFrom),
- ejabberd_s2s_out:start(LTo, LFrom,
- {verify, self(),
- Key, StateData#state.streamid}),
-diff --git a/src/ejabberd_s2s_out.erl b/src/ejabberd_s2s_out.erl
-index 0dedb4c..9376d16 100644
---- a/src/ejabberd_s2s_out.erl
-+++ b/src/ejabberd_s2s_out.erl
-@@ -93,7 +93,7 @@
- [From, Host, Type])).
- -endif.
-
---define(FSMTIMEOUT, 30000).
-+-define(FSMTIMEOUT, 60000).
-
- %% We do not block on send anymore.
- -define(TCP_SEND_TIMEOUT, 15000).
-@@ -245,7 +245,8 @@ open_socket(init, StateData) ->
- NewStateData = StateData#state{bridge={Mod, Fun}},
- {next_state, relay_to_bridge, NewStateData};
- _ ->
-- wait_before_reconnect(StateData)
-+ %%wait_before_reconnect(StateData)
-+ {stop, normal, StateData}
- end
- end;
- open_socket(closed, StateData) ->
---
-1.8.3.1
-
diff --git a/ejabberd-0003-Introducing-mod_admin_extra.patch b/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@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@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@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@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@gmail.com>
+Date: Tue, 16 Feb 2010 16:30:05 +0300
+Subject: [PATCH] Fedora-specific changes to ejabberdctl
+
+Signed-off-by: Peter Lemenkov <lemenkov@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-Fedora-specific-changes-to-ejabberdctl.patch b/ejabberd-0004-Fedora-specific-changes-to-ejabberdctl.patch
deleted file mode 100644
index 20cf399..0000000
--- a/ejabberd-0004-Fedora-specific-changes-to-ejabberdctl.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From 2e72b2ac86fcbc5902555621422db36684d42385 Mon Sep 17 00:00:00 2001
-From: Peter Lemenkov <lemenkov@gmail.com>
-Date: Tue, 16 Feb 2010 16:30:05 +0300
-Subject: [PATCH 04/10] Fedora-specific changes to ejabberdctl
-
-Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
----
- src/ejabberdctl.template | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
-
-diff --git a/src/ejabberdctl.template b/src/ejabberdctl.template
-index 461ec1a..b298e01 100644
---- a/src/ejabberdctl.template
-+++ b/src/ejabberdctl.template
-@@ -9,10 +9,10 @@ ERL_MAX_ETS_TABLES=1400
-
- # define default environment variables
- NODE=ejabberd
--HOST=localhost
-+HOST=`hostname -s 2>/dev/null || echo "localhost"`
- ERLANG_NODE=$NODE@$HOST
- ERL=@erl@
--INSTALLUSER=@installuser@
-+INSTALLUSER=ejabberd
-
- # parse command line parameters
- ARGS=
-@@ -46,7 +46,7 @@ if [ "$LOGS_DIR" = "" ] ; then
- LOGS_DIR=@LOCALSTATEDIR@/log/ejabberd
- fi
- if [ "$SPOOLDIR" = "" ] ; then
-- SPOOLDIR=@LOCALSTATEDIR@/lib/ejabberd
-+ SPOOLDIR=@LOCALSTATEDIR@/lib/ejabberd/spool
- fi
- if [ "$EJABBERD_DOC_PATH" = "" ] ; then
- EJABBERD_DOC_PATH=@DOCDIR@
-@@ -62,7 +62,7 @@ EJID=`id -g $INSTALLUSER`
- EXEC_CMD="false"
- for GID in $GIDS; 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" -eq "$EJID" ] ; then
---
-1.8.3.1
-
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@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@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@gmail.com>
+Date: Wed, 17 Jul 2013 14:56:09 +0400
+Subject: [PATCH] Clean up false security measure
+
+Signed-off-by: Peter Lemenkov <lemenkov@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-0005-Install-.so-objects-with-0755-permissions.patch b/ejabberd-0005-Install-.so-objects-with-0755-permissions.patch
deleted file mode 100644
index af85b3c..0000000
--- a/ejabberd-0005-Install-.so-objects-with-0755-permissions.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From 75f9fdbe72c77c1521edc7402c0d27883dadf46c Mon Sep 17 00:00:00 2001
-From: Peter Lemenkov <lemenkov@gmail.com>
-Date: Sat, 12 Jun 2010 14:14:52 +0400
-Subject: [PATCH 05/10] Install *.so objects with 0755 permissions
-
-Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
----
- src/Makefile.in | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/Makefile.in b/src/Makefile.in
-index 42af5b2..64ed856 100644
---- a/src/Makefile.in
-+++ b/src/Makefile.in
-@@ -237,7 +237,7 @@ install: all
- #
- # Binary system libraries
- install -d $(SODIR)
-- install -m 644 *.so $(SODIR)
-+ install -m 755 *.so $(SODIR)
- #
- # Translated strings
- install -d $(MSGSDIR)
---
-1.8.3.1
-
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@gmail.com>
+Date: Wed, 17 Jul 2013 14:51:04 +0400
+Subject: [PATCH] Enable polkit support
+
+Signed-off-by: Peter Lemenkov <lemenkov@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-0006-Support-SASL-GSSAPI-authentication-thanks-to-Mikael-.patch b/ejabberd-0006-Support-SASL-GSSAPI-authentication-thanks-to-Mikael-.patch
deleted file mode 100644
index a9b4dda..0000000
--- a/ejabberd-0006-Support-SASL-GSSAPI-authentication-thanks-to-Mikael-.patch
+++ /dev/null
@@ -1,505 +0,0 @@
-From e49dbaca001a3d311a2f8a8e878c5b8b6fc385c0 Mon Sep 17 00:00:00 2001
-From: Badlop <badlop@process-one.net>
-Date: Thu, 15 Apr 2010 17:20:16 +0200
-Subject: [PATCH 06/10] Support SASL GSSAPI authentication (thanks to Mikael
- Magnusson)(EJAB-831)
-
----
- src/cyrsasl.erl | 71 +++++++++++++++-----
- src/cyrsasl.hrl | 15 +++++
- src/cyrsasl_anonymous.erl | 6 +-
- src/cyrsasl_digest.erl | 6 +-
- src/cyrsasl_gssapi.erl | 166 ++++++++++++++++++++++++++++++++++++++++++++++
- src/cyrsasl_plain.erl | 6 +-
- src/cyrsasl_scram.erl | 5 +-
- src/ejabberd_c2s.erl | 12 +++-
- src/ejabberd_socket.erl | 19 ++++++
- 9 files changed, 281 insertions(+), 25 deletions(-)
- create mode 100644 src/cyrsasl.hrl
- create mode 100644 src/cyrsasl_gssapi.erl
-
-diff --git a/src/cyrsasl.erl b/src/cyrsasl.erl
-index 9d1377f..802c679 100644
---- a/src/cyrsasl.erl
-+++ b/src/cyrsasl.erl
-@@ -30,21 +30,36 @@
- -export([start/0,
- register_mechanism/3,
- listmech/1,
-- server_new/7,
-+ server_new/8,
- server_start/3,
- server_step/2]).
-
-+-include("cyrsasl.hrl").
- -include("ejabberd.hrl").
-
-+%% @type saslmechanism() = {sasl_mechanism, Mechanism, Module, Require_Plain}
-+%% Mechanism = string()
-+%% Module = atom()
-+%% Require_Plain = bool().
-+%% Registry entry of a supported SASL mechanism.
-+
- -record(sasl_mechanism, {mechanism, module, password_type}).
---record(sasl_state, {service, myname, realm,
-- get_password, check_password, check_password_digest,
-- mech_mod, mech_state}).
-+
-+%% @type saslstate() = {sasl_state, Service, Myname, Mech_Mod, Mech_State, Params}
-+%% Service = string()
-+%% Myname = string()
-+%% Mech_Mod = atom()
-+%% Mech_State = term().
-+%% Params = term().
-+%% State of this process.
-+
-+-record(sasl_state, {service, myname,
-+ mech_mod, mech_state, params}).
-
- -export([behaviour_info/1]).
-
- behaviour_info(callbacks) ->
-- [{mech_new, 4}, {mech_step, 2}];
-+ [{mech_new, 1}, {mech_step, 2}];
- behaviour_info(_Other) ->
- undefined.
-
-@@ -56,8 +71,30 @@ start() ->
- cyrsasl_digest:start([]),
- cyrsasl_scram:start([]),
- cyrsasl_anonymous:start([]),
-+ maybe_try_start_gssapi(),
- ok.
-
-+maybe_try_start_gssapi() ->
-+ case os:getenv("KRB5_KTNAME") of
-+ false ->
-+ ok;
-+ _String ->
-+ try_start_gssapi()
-+ end.
-+
-+try_start_gssapi() ->
-+ case code:load_file(esasl) of
-+ {module, _Module} ->
-+ cyrsasl_gssapi:start([]);
-+ {error, What} ->
-+ ?ERROR_MSG("Support for GSSAPI not started because esasl.beam was not found: ~p", [What])
-+ end.
-+
-+%% @spec (Mechanism, Module, Require_Plain) -> true
-+%% Mechanism = string()
-+%% Module = atom()
-+%% Require_Plain = bool()
-+
- register_mechanism(Mechanism, Module, PasswordType) ->
- ets:insert(sasl_mechanism,
- #sasl_mechanism{mechanism = Mechanism,
-@@ -119,24 +156,28 @@ listmech(Host) ->
- filter_anonymous(Host, Mechs).
-
- server_new(Service, ServerFQDN, UserRealm, _SecFlags,
-- GetPassword, CheckPassword, CheckPasswordDigest) ->
-+ GetPassword, CheckPassword, CheckPasswordDigest, Socket) ->
-+ Params = #sasl_params{
-+ host = ServerFQDN,
-+ realm = UserRealm,
-+ get_password = GetPassword,
-+ check_password = CheckPassword,
-+ check_password_digest= CheckPasswordDigest,
-+ socket = Socket
-+ },
-+
- #sasl_state{service = Service,
- myname = ServerFQDN,
-- realm = UserRealm,
-- get_password = GetPassword,
-- check_password = CheckPassword,
-- check_password_digest= CheckPasswordDigest}.
-+ params = Params}.
-+
-
- server_start(State, Mech, ClientIn) ->
- case lists:member(Mech, listmech(State#sasl_state.myname)) of
- true ->
- case ets:lookup(sasl_mechanism, Mech) of
- [#sasl_mechanism{module = Module}] ->
-- {ok, MechState} = Module:mech_new(
-- State#sasl_state.myname,
-- State#sasl_state.get_password,
-- State#sasl_state.check_password,
-- State#sasl_state.check_password_digest),
-+ {ok, MechState} =
-+ Module:mech_new(State#sasl_state.params),
- server_step(State#sasl_state{mech_mod = Module,
- mech_state = MechState},
- ClientIn);
-diff --git a/src/cyrsasl.hrl b/src/cyrsasl.hrl
-new file mode 100644
-index 0000000..b4cc3e3
---- /dev/null
-+++ b/src/cyrsasl.hrl
-@@ -0,0 +1,15 @@
-+%% @type saslparams() = {sasl_params, Host, Realm, GetPassword, CheckPassword, CheckPasswordDigest}
-+%% Host = string()
-+%% Realm = string()
-+%% GetPassword = function()
-+%% CheckPassword = function()
-+%% CheckPasswordDigest = any().
-+%% Parameters for SASL.
-+
-+-record(sasl_params, {
-+ host,
-+ realm,
-+ get_password,
-+ check_password,
-+ check_password_digest,
-+ socket}).
-diff --git a/src/cyrsasl_anonymous.erl b/src/cyrsasl_anonymous.erl
-index cb0b1e3..085e98c 100644
---- a/src/cyrsasl_anonymous.erl
-+++ b/src/cyrsasl_anonymous.erl
-@@ -27,7 +27,9 @@
-
- -module(cyrsasl_anonymous).
-
---export([start/1, stop/0, mech_new/4, mech_step/2]).
-+-export([start/1, stop/0, mech_new/1, mech_step/2]).
-+
-+-include("cyrsasl.hrl").
-
- -behaviour(cyrsasl).
-
-@@ -40,7 +42,7 @@ start(_Opts) ->
- stop() ->
- ok.
-
--mech_new(Host, _GetPassword, _CheckPassword, _CheckPasswordDigest) ->
-+mech_new(#sasl_params{host=Host}) ->
- {ok, #state{server = Host}}.
-
- mech_step(State, _ClientIn) ->
-diff --git a/src/cyrsasl_digest.erl b/src/cyrsasl_digest.erl
-index 557e498..e4199f8 100644
---- a/src/cyrsasl_digest.erl
-+++ b/src/cyrsasl_digest.erl
-@@ -29,10 +29,11 @@
-
- -export([start/1,
- stop/0,
-- mech_new/4,
-+ mech_new/1,
- mech_step/2]).
-
- -include("ejabberd.hrl").
-+-include("cyrsasl.hrl").
-
- -behaviour(cyrsasl).
-
-@@ -47,7 +48,8 @@ start(_Opts) ->
- stop() ->
- ok.
-
--mech_new(Host, GetPassword, _CheckPassword, CheckPasswordDigest) ->
-+mech_new(#sasl_params{host=Host, get_password=GetPassword,
-+ check_password_digest=CheckPasswordDigest}) ->
- {ok, #state{step = 1,
- nonce = randoms:get_string(),
- host = Host,
-diff --git a/src/cyrsasl_gssapi.erl b/src/cyrsasl_gssapi.erl
-new file mode 100644
-index 0000000..11d9955
---- /dev/null
-+++ b/src/cyrsasl_gssapi.erl
-@@ -0,0 +1,166 @@
-+%%%----------------------------------------------------------------------
-+%%% File : cyrsasl_gssapi.erl
-+%%% Author : Mikael Magnusson <mikma@users.sourceforge.net>
-+%%% Purpose : GSSAPI SASL mechanism
-+%%% Created : 1 June 2007 by Mikael Magnusson <mikma@users.sourceforge.net>
-+%%% Id : $Id: $
-+%%%----------------------------------------------------------------------
-+%%%
-+%%% Copyright (C) 2007-2009 Mikael Magnusson <mikma@users.sourceforge.net>
-+%%%
-+%%% Permission is hereby granted, free of charge, to any person
-+%%% obtaining a copy of this software and associated documentation
-+%%% files (the "Software"), to deal in the Software without
-+%%% restriction, including without limitation the rights to use, copy,
-+%%% modify, merge, publish, distribute, sublicense, and/or sell copies
-+%%% of the Software, and to permit persons to whom the Software is
-+%%% furnished to do so, subject to the following conditions:
-+%%%
-+%%% The above copyright notice and this permission notice shall be
-+%%% included in all copies or substantial portions of the Software.
-+%%%
-+%%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-+%%% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+%%% MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-+%%% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-+%%% BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-+%%% ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-+%%% CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-+%%% SOFTWARE.
-+%%%
-+
-+%%%
-+%%% configuration options:
-+%%% {sasl_realm, "<Kerberos realm>"}.
-+%%%
-+%%% environment variables:
-+%%% KRB5_KTNAME
-+%%%
-+
-+-module(cyrsasl_gssapi).
-+-author('mikma@users.sourceforge.net').
-+-vsn('$Revision: $ ').
-+
-+-export([start/1,
-+ stop/0,
-+ mech_new/1,
-+ mech_step/2]).
-+
-+-include("ejabberd.hrl").
-+-include("cyrsasl.hrl").
-+
-+-behaviour(cyrsasl).
-+
-+-define(SERVER, ?MODULE).
-+-define(SERVICE, "xmpp").
-+
-+-record(state, {sasl,
-+ needsmore=true,
-+ step=0,
-+ host,
-+ realm,
-+ authid,
-+ authzid,
-+ authrealm,
-+ error}).
-+
-+start(_Opts) ->
-+ ChildSpec =
-+ {?SERVER,
-+ {esasl, start_link, [{local, ?SERVER}]},
-+ transient,
-+ 1000,
-+ worker,
-+ [esasl]},
-+
-+ case supervisor:start_child(ejabberd_sup, ChildSpec) of
-+ {ok, _Pid} ->
-+ cyrsasl:register_mechanism("GSSAPI", ?MODULE, false);
-+ {error, Error} = E ->
-+ ?ERROR_MSG("esasl failed: ~p", [Error]),
-+ E
-+ end.
-+
-+
-+stop() ->
-+ catch esasl:stop(?SERVER),
-+ supervisor:terminate_child(ejabberd_sup, ?SERVER),
-+ supervisor:delete_child(ejabberd_sup, ?SERVER).
-+
-+mech_new(#sasl_params{host=Host, realm=Realm, socket=Socket}) ->
-+ case ejabberd_socket:gethostname(Socket) of
-+ {ok, FQDN} ->
-+ ?DEBUG("mech_new ~p ~p ~p~n", [Host, Realm, FQDN]),
-+ case esasl:server_start(?SERVER, "GSSAPI", ?SERVICE, FQDN) of
-+ {ok, Sasl} ->
-+ {ok, #state{sasl=Sasl,host=Host,realm=Realm}};
-+ {error, {gsasl_error, Error}} ->
-+ {ok, Str} = esasl:str_error(?SERVER, Error),
-+ ?DEBUG("esasl error: ~p", [Str]),
-+ {ok, #state{needsmore=error,error="internal-server-error"}};
-+ {error, Error} ->
-+ ?DEBUG("esasl error: ~p", [Error]),
-+ {ok, #state{needsmore=error,error="internal-server-error"}}
-+ end;
-+ {error, Error} ->
-+ ?DEBUG("gethostname error: ~p", [Error]),
-+ {ok, #state{needsmore=error,error="internal-server-error"}}
-+ end.
-+
-+mech_step(State, ClientIn) when is_list(ClientIn) ->
-+ catch do_step(State, ClientIn).
-+
-+do_step(#state{needsmore=error,error=Error}=_State, _) ->
-+ {error, Error};
-+do_step(#state{needsmore=false}=State, _) ->
-+ check_user(State);
-+do_step(#state{needsmore=true,sasl=Sasl,step=Step}=State, ClientIn) ->
-+ ?DEBUG("mech_step~n", []),
-+ case esasl:step(Sasl, list_to_binary(ClientIn)) of
-+ {ok, RspAuth} ->
-+ ?DEBUG("ok~n", []),
-+ {ok, Display_name} = esasl:property_get(Sasl, gssapi_display_name),
-+ {ok, Authzid} = esasl:property_get(Sasl, authzid),
-+ {Authid, [$@ | Auth_realm]} =
-+ lists:splitwith(fun(E)->E =/= $@ end, Display_name),
-+ State1 = State#state{authid=Authid,
-+ authzid=Authzid,
-+ authrealm=Auth_realm},
-+ handle_step_ok(State1, binary_to_list(RspAuth));
-+ {needsmore, RspAuth} ->
-+ ?DEBUG("needsmore~n", []),
-+ if (Step > 0) and (ClientIn =:= []) and (RspAuth =:= <<>>) ->
-+ {error, "not-authorized"};
-+ true ->
-+ {continue, binary_to_list(RspAuth),
-+ State#state{step=Step+1}}
-+ end;
-+ {error, _} ->
-+ {error, "not-authorized"}
-+ end.
-+
-+handle_step_ok(State, []) ->
-+ check_user(State);
-+handle_step_ok(#state{step=Step}=State, RspAuth) ->
-+ ?DEBUG("continue~n", []),
-+ {continue, RspAuth, State#state{needsmore=false,step=Step+1}}.
-+
-+check_user(#state{authid=Authid,authzid=Authzid,
-+ authrealm=Auth_realm,host=Host,realm=Realm}) ->
-+ if Realm =/= Auth_realm ->
-+ ?DEBUG("bad realm ~p (expected ~p)~n",[Auth_realm, Realm]),
-+ throw({error, "not-authorized"});
-+ true ->
-+ ok
-+ end,
-+
-+ case ejabberd_auth:is_user_exists(Authid, Host) of
-+ false ->
-+ ?DEBUG("bad user ~p~n",[Authid]),
-+ throw({error, "not-authorized"});
-+ true ->
-+ ok
-+ end,
-+
-+ ?DEBUG("GSSAPI authenticated ~p ~p~n", [Authid, Authzid]),
-+ {ok, [{username, Authid}, {authzid, Authzid}]}.
-diff --git a/src/cyrsasl_plain.erl b/src/cyrsasl_plain.erl
-index 7192cd1..7bf41b3 100644
---- a/src/cyrsasl_plain.erl
-+++ b/src/cyrsasl_plain.erl
-@@ -27,7 +27,9 @@
- -module(cyrsasl_plain).
- -author('alexey@process-one.net').
-
---export([start/1, stop/0, mech_new/4, mech_step/2, parse/1]).
-+-export([start/1, stop/0, mech_new/1, mech_step/2, parse/1]).
-+
-+-include("cyrsasl.hrl").
-
- -behaviour(cyrsasl).
-
-@@ -40,7 +42,7 @@ start(_Opts) ->
- stop() ->
- ok.
-
--mech_new(_Host, _GetPassword, CheckPassword, _CheckPasswordDigest) ->
-+mech_new(#sasl_params{check_password = CheckPassword}) ->
- {ok, #state{check_password = CheckPassword}}.
-
- mech_step(State, ClientIn) ->
-diff --git a/src/cyrsasl_scram.erl b/src/cyrsasl_scram.erl
-index dc671b2..d65cc6f 100644
---- a/src/cyrsasl_scram.erl
-+++ b/src/cyrsasl_scram.erl
-@@ -29,10 +29,11 @@
-
- -export([start/1,
- stop/0,
-- mech_new/4,
-+ mech_new/1,
- mech_step/2]).
-
- -include("ejabberd.hrl").
-+-include("cyrsasl.hrl").
-
- -behaviour(cyrsasl).
-
-@@ -48,7 +49,7 @@ start(_Opts) ->
- stop() ->
- ok.
-
--mech_new(_Host, GetPassword, _CheckPassword, _CheckPasswordDigest) ->
-+mech_new(#sasl_params{get_password=GetPassword}) ->
- {ok, #state{step = 2, get_password = GetPassword}}.
-
- mech_step(#state{step = 2} = State, ClientIn) ->
-diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
-index ed26400..11ae5dd 100644
---- a/src/ejabberd_c2s.erl
-+++ b/src/ejabberd_c2s.erl
-@@ -305,9 +305,16 @@ wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
- send_header(StateData, Server, "1.0", DefaultLang),
- case StateData#state.authenticated of
- false ->
-+ Realm =
-+ case ejabberd_config:get_local_option({sasl_realm, Server}) of
-+ undefined ->
-+ "";
-+ Realm0 ->
-+ Realm0
-+ end,
- SASLState =
- cyrsasl:server_new(
-- "jabber", Server, "", [],
-+ "jabber", Server, Realm, [],
- fun(U) ->
- ejabberd_auth:get_password_with_authmodule(
- U, Server)
-@@ -319,7 +326,8 @@ wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
- fun(U, P, D, DG) ->
- ejabberd_auth:check_password_with_authmodule(
- U, Server, P, D, DG)
-- end),
-+ end,
-+ StateData#state.socket),
- Mechs = lists:map(
- fun(S) ->
- {xmlelement, "mechanism", [],
-diff --git a/src/ejabberd_socket.erl b/src/ejabberd_socket.erl
-index 836e7d9..59e4034 100644
---- a/src/ejabberd_socket.erl
-+++ b/src/ejabberd_socket.erl
-@@ -44,9 +44,11 @@
- get_peer_certificate/1,
- get_verify_result/1,
- close/1,
-+ gethostname/1,
- sockname/1, peername/1]).
-
- -include("ejabberd.hrl").
-+-include_lib("kernel/include/inet.hrl").
-
- -record(socket_state, {sockmod, socket, receiver}).
-
-@@ -228,6 +230,23 @@ peername(#socket_state{sockmod = SockMod, socket = Socket}) ->
- SockMod:peername(Socket)
- end.
-
-+gethostname(#socket_state{socket = Socket} = State) ->
-+ ?DEBUG("gethostname ~p~n", [Socket]),
-+
-+ case sockname(State) of
-+ {ok, {Addr, _Port}} ->
-+ case inet:gethostbyaddr(Addr) of
-+ {ok, HostEnt} when is_record(HostEnt, hostent) ->
-+ ?DEBUG("gethostname result ~p~n",
-+ [HostEnt#hostent.h_name]),
-+ {ok, HostEnt#hostent.h_name};
-+ {error, _Reason} = E ->
-+ E
-+ end;
-+ {error, _Reason} = E ->
-+ E
-+ end.
-+
- %%====================================================================
- %% Internal functions
- %%====================================================================
---
-1.8.3.1
-
diff --git a/ejabberd-0007-Disable-INET_DIST_INTERFACE-by-default.patch b/ejabberd-0007-Disable-INET_DIST_INTERFACE-by-default.patch
deleted file mode 100644
index d0d1d40..0000000
--- a/ejabberd-0007-Disable-INET_DIST_INTERFACE-by-default.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From a8910615b82e7af8cb32916792970de0b53e5872 Mon Sep 17 00:00:00 2001
-From: Peter Lemenkov <lemenkov@gmail.com>
-Date: Sat, 18 Jun 2011 23:24:28 +0400
-Subject: [PATCH 07/10] Disable INET_DIST_INTERFACE by default
-
-Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
----
- src/ejabberdctl.cfg.example | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/ejabberdctl.cfg.example b/src/ejabberdctl.cfg.example
-index b72058a..5ee43cf 100644
---- a/src/ejabberdctl.cfg.example
-+++ b/src/ejabberdctl.cfg.example
-@@ -59,7 +59,7 @@
- #
- # Default: {127,0,0,1}
- #
--INET_DIST_INTERFACE={127,0,0,1}
-+#INET_DIST_INTERFACE={127,0,0,1}
-
- #.
- #' ERL_EPMD_ADDRESS: IP addresses where epmd listens for connections
---
-1.8.3.1
-
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@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@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-Clean-up-false-security-measure.patch b/ejabberd-0008-Clean-up-false-security-measure.patch
deleted file mode 100644
index a44f130..0000000
--- a/ejabberd-0008-Clean-up-false-security-measure.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From c827055ee650243c2af546753743f692ae0fe758 Mon Sep 17 00:00:00 2001
-From: Peter Lemenkov <lemenkov@gmail.com>
-Date: Wed, 17 Jul 2013 14:56:09 +0400
-Subject: [PATCH 08/10] Clean up false security measure
-
-Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
----
- src/Makefile.in | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/Makefile.in b/src/Makefile.in
-index 64ed856..1a1fa41 100644
---- a/src/Makefile.in
-+++ b/src/Makefile.in
-@@ -202,7 +202,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)*" \
---
-1.8.3.1
-
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@gmail.com>
+Date: Sat, 30 Aug 2014 12:21:45 +0400
+Subject: [PATCH] Disable Erlang version check
+
+Signed-off-by: Peter Lemenkov <lemenkov@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@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-Enable-polkit-support.patch b/ejabberd-0009-Enable-polkit-support.patch
deleted file mode 100644
index fd31fd1..0000000
--- a/ejabberd-0009-Enable-polkit-support.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From f2420ac96bb52eeb5a01111cabb4f5580db42142 Mon Sep 17 00:00:00 2001
-From: Peter Lemenkov <lemenkov@gmail.com>
-Date: Wed, 17 Jul 2013 14:51:04 +0400
-Subject: [PATCH 09/10] Enable polkit support
-
-Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
----
- src/ejabberdctl.template | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/ejabberdctl.template b/src/ejabberdctl.template
-index b298e01..fa6c5c2 100644
---- a/src/ejabberdctl.template
-+++ b/src/ejabberdctl.template
-@@ -1,4 +1,4 @@
--#!/bin/sh
-+#!/usr/bin/pkexec /bin/sh
-
- # define default configuration
- POLL=true
---
-1.8.3.1
-
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@gmail.com>
+Date: Sun, 31 Aug 2014 13:21:48 +0400
+Subject: [PATCH] Fix permissions for captcha script
+
+Signed-off-by: Peter Lemenkov <lemenkov@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@gmail.com>
+Date: Sun, 31 Aug 2014 16:08:17 +0400
+Subject: [PATCH] Enable systemd notification if available
+
+Signed-off-by: Peter Lemenkov <lemenkov@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-0010-Install-into-BINDIR-instead-of-SBINDIR.patch b/ejabberd-0010-Install-into-BINDIR-instead-of-SBINDIR.patch
deleted file mode 100644
index 3868b01..0000000
--- a/ejabberd-0010-Install-into-BINDIR-instead-of-SBINDIR.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From 729db839b762a472444bacff22a1cb8870635272 Mon Sep 17 00:00:00 2001
-From: Peter Lemenkov <lemenkov@gmail.com>
-Date: Wed, 17 Jul 2013 14:53:49 +0400
-Subject: [PATCH 10/10] Install into BINDIR instead of SBINDIR
-
-Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
----
- src/Makefile.in | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/src/Makefile.in b/src/Makefile.in
-index 1a1fa41..1578183 100644
---- a/src/Makefile.in
-+++ b/src/Makefile.in
-@@ -92,7 +92,7 @@ DESTDIR =
- ETCDIR = $(DESTDIR)@sysconfdir@/ejabberd
-
- # /sbin/
--SBINDIR = $(DESTDIR)@sbindir@
-+BINDIR = $(DESTDIR)@bindir@
-
- # /lib/ejabberd/
- EJABBERDDIR = $(DESTDIR)@libdir@/ejabberd
-@@ -201,11 +201,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
-@@ -273,7 +273,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
---
-1.8.3.1
-
diff --git a/ejabberd.init b/ejabberd.init
deleted file mode 100644
index 71cadea..0000000
--- a/ejabberd.init
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/bin/bash
-#
-# ejabberd Start and stop ejabberd.
-
-# chkconfig: - 40 60
-# description: ejabberd
-# processname: ejabberd
-# pidfile: /var/run/ejabberd.pid
-
-### BEGIN INIT INFO
-# Provides: ejabberd
-# Required-Start: network
-# Required-Stop: network
-# Default-Start:
-# Default-Stop: 0 1 6
-# Short-Description: Start and stop ejabberd
-# Description: A distributed, fault-tolerant Jabber/XMPP server
-### END INIT INFO
-
-. /etc/rc.d/init.d/functions
-
-if [ -r /etc/sysconfig/ejabberd ]; then
- . /etc/sysconfig/ejabberd
-fi
-
-if [ ! "$CONFIG_FILE" ]; then
- CONFIG_FILE=/etc/ejabberd/ejabberd.cfg
-fi
-
-# we're using symlinked consolehelper to check user's rights
-progctl=/usr/bin/ejabberdctl
-
-start() {
- echo -n $"Starting ejabberd: "
- if [ "$ULIMIT_MAX_FILES" ]; then
- ulimit -n $ULIMIT_MAX_FILES
- fi
-
- # check whether ejabberd was already started
- if $progctl status > /dev/null 2>&1 ; then
- echo -n "already running" && warning && echo
- return 0
- fi
-
- daemon $progctl start --config $CONFIG_FILE \
- --ctl-config /etc/ejabberd/ejabberdctl.cfg \
- --logs "/var/log/ejabberd" \
- --spool "/var/lib/ejabberd/spool" \
- 2>/dev/null
- RETVAL=$?
- [ $RETVAL -eq 0 ] && touch /var/lock/subsys/ejabberd
- echo
-
- # it takes some time to actually start necessary nodes
- sleep 5
-
- return $RETVAL
-}
-
-stop() {
- # Stop daemons.
- echo -n "Shutting down ejabberd: "
-
- # check whether ejabberd was already stopped
- if ! $progctl status > /dev/null 2>&1 ; then
- echo -n "already stopped" && warning && echo
- return 0
- fi
-
- daemon $progctl stop 2>/dev/null
- RETVAL=$?
- [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/ejabberd
- echo
-
- # it takes some time to actually stop necessary nodes
- sleep 5
-
- return $RETVAL
-}
-
-restart() {
- stop
- sleep 5
- start
-}
-
-# See how we were called.
-case "$1" in
- start)
- start
- ;;
- stop)
- stop
- ;;
- restart|force-reload)
- restart
- ;;
- condrestart|try-restart)
- [ -f /var/lock/subsys/ejabberd ] && restart || :
- ;;
- status)
- $progctl status
- ;;
- *)
- echo "Usage: ejabberd {start|stop|restart|force-reload|condrestart|try-restart|status}"
- exit 2
-esac
-
-exit $?
-
-
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@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@gmail.com> - 2.1.13-10
- Rebuild with Erlang 17.2.1
diff --git a/ejabberd.sysconfig b/ejabberd.sysconfig
deleted file mode 100644
index 20a8a7a..0000000
--- a/ejabberd.sysconfig
+++ /dev/null
@@ -1,13 +0,0 @@
-## Settings for ejabberd
-
-## Where should ejabberd find its configuration file?
-#
-CONFIG_FILE=/etc/ejabberd/ejabberd.cfg
-
-## ULIMIT_MAX_FILES alters the number of files that ejabberd is
-## allowed to have open at once. If it is unset the system default
-## (usually 1024) will be used. ejabberd will want over twice as many
-## open files as it has active connections, so if you have a few
-## hundred or more users you will want to set this.
-#
-ULIMIT_MAX_FILES=1024
diff --git a/ejabberdctl.apps b/ejabberdctl.apps
deleted file mode 100644
index 30eab2c..0000000
--- a/ejabberdctl.apps
+++ /dev/null
@@ -1,5 +0,0 @@
-USER=root
-PROGRAM=/usr/sbin/ejabberdctl
-SESSION=yes
-FALLBACK=no
-GUI=no
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