summaryrefslogtreecommitdiff
path: root/chat/ejabberd/patches
diff options
context:
space:
mode:
authorfhajny <fhajny@pkgsrc.org>2009-12-15 13:30:54 +0000
committerfhajny <fhajny@pkgsrc.org>2009-12-15 13:30:54 +0000
commit602d76982e065bf85b6154ab1e0bf8fc93311fb9 (patch)
tree19e92835dcc4d779cfac4f09dfa2fc4b5d068aab /chat/ejabberd/patches
parente74fb0c2e038e283a8a7943f92417828a9eb3618 (diff)
downloadpkgsrc-602d76982e065bf85b6154ab1e0bf8fc93311fb9.tar.gz
Update ejabberd to 2.1.0.
Very brief list of additions: * Erlang/OTP R13 support * HTTP-Bind (BOSH) optimization and clean-up * LDAPS support * MUC rooms can require a CAPTCHA to join the room * PubSub: major improvements. Update to XEP version 1.12 * PEP and Caps: many improvements * Run commands with ejabberdctl or other frontends (XML-RPC, HTTP) * STUN server * XEPs like: XMPP Ping, Roster Versioning, Import/Export Format See full release note: http://www.process-one.net/en/ejabberd/release_notes/release_note_ejabberd_2.1.0
Diffstat (limited to 'chat/ejabberd/patches')
-rw-r--r--chat/ejabberd/patches/patch-aa171
-rw-r--r--chat/ejabberd/patches/patch-ac276
-rw-r--r--chat/ejabberd/patches/patch-ad76
-rw-r--r--chat/ejabberd/patches/patch-ae56
-rw-r--r--chat/ejabberd/patches/patch-af25
-rw-r--r--chat/ejabberd/patches/patch-ag205
-rw-r--r--chat/ejabberd/patches/patch-ah50
-rw-r--r--chat/ejabberd/patches/patch-ai158
8 files changed, 188 insertions, 829 deletions
diff --git a/chat/ejabberd/patches/patch-aa b/chat/ejabberd/patches/patch-aa
index 709c9038b30..7ae4e962592 100644
--- a/chat/ejabberd/patches/patch-aa
+++ b/chat/ejabberd/patches/patch-aa
@@ -1,34 +1,159 @@
-$NetBSD: patch-aa,v 1.4 2009/02/09 23:05:02 joerg Exp $
+$NetBSD: patch-aa,v 1.5 2009/12/15 13:30:54 fhajny Exp $
-Modified for pkgsrc
-
---- src/Makefile.in.orig 2008-08-27 12:37:52.000000000 +0300
+--- src/Makefile.in.orig 2009-11-06 19:53:19.000000000 +0000
+++ src/Makefile.in
-@@ -58,15 +58,15 @@ BEAMS = $(SOURCES:.erl=.beam)
+@@ -59,7 +59,7 @@ endif
+
+ INSTALL_EPAM=
+ ifeq (@pam@, pam)
+- INSTALL_EPAM=install -m 750 $(O_USER) epam $(PBINDIR)
++ INSTALL_EPAM=$(BSD_INSTALL_DATA) -m 750 $(O_USER) epam $(PBINDIR)
+ endif
+ prefix = @prefix@
+@@ -76,13 +76,13 @@ BEAMS = $(SOURCES:.erl=.beam)
DESTDIR =
--EJABBERDDIR = $(DESTDIR)@localstatedir@/lib/ejabberd
+ # /etc/ejabberd/
+-ETCDIR = $(DESTDIR)@sysconfdir@/ejabberd
++ETCDIR = $(DESTDIR)@prefix@/share/examples/ejabberd
+
+ # /sbin/
+ SBINDIR = $(DESTDIR)@sbindir@
+
+ # /lib/ejabberd/
+-EJABBERDDIR = $(DESTDIR)@libdir@/ejabberd
+EJABBERDDIR = $(DESTDIR)@prefix@/lib/erlang/lib/@DISTNAME@
- BEAMDIR = $(EJABBERDDIR)/ebin
--SPOOLDIR = $(EJABBERDDIR)/db
-+SPOOLDIR = @EJABBERD_VARDIR@/spool/ejabberd/db/$NODE
- PRIVDIR = $(EJABBERDDIR)/priv
- SODIR = $(PRIVDIR)/lib
- PBINDIR = $(PRIVDIR)/bin
+
+ # /share/doc/ejabberd
+ PACKAGE_TARNAME = @PACKAGE_TARNAME@
+@@ -108,13 +108,13 @@ SODIR = $(PRIVDIR)/lib
MSGSDIR = $(PRIVDIR)/msgs
+
+ # /var/lib/ejabberd/
+-SPOOLDIR = $(DESTDIR)@localstatedir@/lib/ejabberd
++SPOOLDIR = @EJABBERD_VARDIR@/spool/ejabberd/db/$NODE
+
+ # /var/lib/ejabberd/.erlang.cookie
+ COOKIEFILE = $(SPOOLDIR)/.erlang.cookie
+
+ # /var/log/ejabberd/
-LOGDIR = $(DESTDIR)@localstatedir@/log/ejabberd
--ETCDIR = $(DESTDIR)@sysconfdir@/ejabberd
+LOGDIR = $(DESTDIR)/@JABBERD_LOGDIR@
-+ETCDIR = $(DESTDIR)@prefix@/share/examples/ejabberd
- SBINDIR = $(DESTDIR)@sbindir@
- ifeq ($(shell uname),Darwin)
-@@ -114,7 +114,6 @@ install: all
- install -m 644 *.beam $(BEAMDIR)
+ # Assume Linux-style dynamic library flags
+ DYNAMIC_LIB_CFLAGS = -fpic -shared
+@@ -167,10 +167,10 @@ translations:
+ install: all
+ #
+ # Configuration files
+- install -d -m 750 $(G_USER) $(ETCDIR)
++ $(BSD_INSTALL_DATA_DIR) -m 750 $(G_USER) $(ETCDIR)
+ [ -f $(ETCDIR)/ejabberd.cfg ] \
+- && install -b -m 640 $(G_USER) ejabberd.cfg.example $(ETCDIR)/ejabberd.cfg-new \
+- || install -b -m 640 $(G_USER) ejabberd.cfg.example $(ETCDIR)/ejabberd.cfg
++ && $(BSD_INSTALL_DATA) -m 640 $(G_USER) ejabberd.cfg.example $(ETCDIR)/ejabberd.cfg-new \
++ || $(BSD_INSTALL_DATA) -m 640 $(G_USER) ejabberd.cfg.example $(ETCDIR)/ejabberd.cfg
+ sed -e "s*@rootdir@*@prefix@*" \
+ -e "s*@installuser@*@INSTALLUSER@*" \
+ -e "s*@LIBDIR@*@libdir@*" \
+@@ -180,13 +180,13 @@ install: all
+ -e "s*@erl@*@ERL@*" ejabberdctl.template \
+ > ejabberdctl.example
+ [ -f $(ETCDIR)/ejabberdctl.cfg ] \
+- && install -b -m 640 $(G_USER) ejabberdctl.cfg.example $(ETCDIR)/ejabberdctl.cfg-new \
+- || install -b -m 640 $(G_USER) ejabberdctl.cfg.example $(ETCDIR)/ejabberdctl.cfg
+- install -b -m 644 $(G_USER) inetrc $(ETCDIR)/inetrc
++ && $(BSD_INSTALL_DATA) -m 640 $(G_USER) ejabberdctl.cfg.example $(ETCDIR)/ejabberdctl.cfg-new \
++ || $(BSD_INSTALL_DATA) -m 640 $(G_USER) ejabberdctl.cfg.example $(ETCDIR)/ejabberdctl.cfg
++ $(BSD_INSTALL_DATA) -m 644 $(G_USER) inetrc $(ETCDIR)/inetrc
+ #
+ # Administration script
+- [ -d $(SBINDIR) ] || install -d -m 755 $(SBINDIR)
+- install -m 550 $(G_USER) ejabberdctl.example $(SBINDIR)/ejabberdctl
++ [ -d $(SBINDIR) ] || $(BSD_INSTALL_DATA_DIR) -m 755 $(SBINDIR)
++ $(BSD_INSTALL_DATA) -m 550 $(G_USER) ejabberdctl.example $(SBINDIR)/ejabberdctl
+ #
+ # Init script
+ sed -e "s*@ctlscriptpath@*$(SBINDIR)*" \
+@@ -194,54 +194,48 @@ install: all
+ > ejabberd.init
+ #
+ # Binary Erlang files
+- install -d $(BEAMDIR)
+- install -m 644 *.app $(BEAMDIR)
+- install -m 644 *.beam $(BEAMDIR)
++ $(BSD_INSTALL_DATA_DIR) $(BEAMDIR)
++ $(BSD_INSTALL_DATA) -m 644 *.app $(BEAMDIR)
++ $(BSD_INSTALL_DATA) -m 644 *.beam $(BEAMDIR)
rm -f $(BEAMDIR)/configure.beam
- install -m 644 *.app $(BEAMDIR)
-- install -d -m 750 $(SPOOLDIR)
- install -d $(SODIR)
- install -d $(PBINDIR)
- install -m 644 *.so $(SODIR)
+ #
+ # ejabberd header files
+- install -d $(INCLUDEDIR)
+- install -m 644 *.hrl $(INCLUDEDIR)
+- install -d $(INCLUDEDIR)/eldap/
+- install -m 644 eldap/*.hrl $(INCLUDEDIR)/eldap/
+- install -d $(INCLUDEDIR)/mod_muc/
+- install -m 644 mod_muc/*.hrl $(INCLUDEDIR)/mod_muc/
+- install -d $(INCLUDEDIR)/mod_proxy65/
+- install -m 644 mod_proxy65/*.hrl $(INCLUDEDIR)/mod_proxy65/
+- install -d $(INCLUDEDIR)/mod_pubsub/
+- install -m 644 mod_pubsub/*.hrl $(INCLUDEDIR)/mod_pubsub/
+- install -d $(INCLUDEDIR)/web/
+- install -m 644 web/*.hrl $(INCLUDEDIR)/web/
++ $(BSD_INSTALL_DATA_DIR) $(INCLUDEDIR)
++ $(BSD_INSTALL_DATA) -m 644 *.hrl $(INCLUDEDIR)
++ $(BSD_INSTALL_DATA_DIR) $(INCLUDEDIR)/eldap/
++ $(BSD_INSTALL_DATA) -m 644 eldap/*.hrl $(INCLUDEDIR)/eldap/
++ $(BSD_INSTALL_DATA_DIR) $(INCLUDEDIR)/mod_muc/
++ $(BSD_INSTALL_DATA) -m 644 mod_muc/*.hrl $(INCLUDEDIR)/mod_muc/
++ $(BSD_INSTALL_DATA_DIR) $(INCLUDEDIR)/mod_proxy65/
++ $(BSD_INSTALL_DATA) -m 644 mod_proxy65/*.hrl $(INCLUDEDIR)/mod_proxy65/
++ $(BSD_INSTALL_DATA_DIR) $(INCLUDEDIR)/mod_pubsub/
++ $(BSD_INSTALL_DATA) -m 644 mod_pubsub/*.hrl $(INCLUDEDIR)/mod_pubsub/
++ $(BSD_INSTALL_DATA_DIR) $(INCLUDEDIR)/web/
++ $(BSD_INSTALL_DATA) -m 644 web/*.hrl $(INCLUDEDIR)/web/
+ #
+ # Binary C programs
+- install -d $(PBINDIR)
+- install -m 750 $(O_USER) ../tools/captcha.sh $(PBINDIR)
++ $(BSD_INSTALL_SCRIPT_DIR) $(PBINDIR)
++ $(BSD_INSTALL_SCRIPT) -m 750 $(O_USER) ../tools/captcha.sh $(PBINDIR)
+ $(INSTALL_EPAM)
+ #
+ # Binary system libraries
+- install -d $(SODIR)
+- install -m 644 *.so $(SODIR)
++ $(BSD_INSTALL_LIB_DIR) $(SODIR)
++ $(BSD_INSTALL_LIB) -m 644 *.so $(SODIR)
+ #
+ # Translated strings
+- install -d $(MSGSDIR)
+- install -m 644 msgs/*.msg $(MSGSDIR)
+- #
+- # Spool directory
+- install -d -m 750 $(O_USER) $(SPOOLDIR)
+- $(CHOWN_COMMAND) -R @INSTALLUSER@ $(SPOOLDIR) >$(CHOWN_OUTPUT)
+- chmod -R 750 $(SPOOLDIR)
+- [ ! -f $(COOKIEFILE) ] || { $(CHOWN_COMMAND) @INSTALLUSER@ $(COOKIEFILE) >$(CHOWN_OUTPUT) ; chmod 400 $(COOKIEFILE) ; }
++ $(BSD_INSTALL_DATA_DIR) $(MSGSDIR)
++ $(BSD_INSTALL_DATA) -m 644 msgs/*.msg $(MSGSDIR)
+ #
+ # Log directory
+- install -d -m 750 $(O_USER) $(LOGDIR)
++ $(BSD_INSTALL_DATA_DIR) -m 750 $(O_USER) $(LOGDIR)
+ $(CHOWN_COMMAND) -R @INSTALLUSER@ $(LOGDIR) >$(CHOWN_OUTPUT)
+ chmod -R 750 $(LOGDIR)
+ #
+ # Documentation
+- install -d $(DOCDIR)
+- install ../doc/guide.html $(DOCDIR)
+- install ../doc/*.png $(DOCDIR)
+- install ../doc/*.txt $(DOCDIR)
++ $(BSD_INSTALL_DATA_DIR) $(DOCDIR)
++ $(BSD_INSTALL_DATA) ../doc/guide.html $(DOCDIR)
++ $(BSD_INSTALL_DATA) ../doc/*.png $(DOCDIR)
++ $(BSD_INSTALL_DATA) ../doc/*.txt $(DOCDIR)
+
+ uninstall: uninstall-binary
+
diff --git a/chat/ejabberd/patches/patch-ac b/chat/ejabberd/patches/patch-ac
deleted file mode 100644
index 4a90c5eca6e..00000000000
--- a/chat/ejabberd/patches/patch-ac
+++ /dev/null
@@ -1,276 +0,0 @@
-$NetBSD: patch-ac,v 1.4 2009/03/22 10:39:44 martti Exp $
-
-Modified to use IPv6/v4 patch (https://support.process-one.net/browse/EJAB-389)
-
---- doc/guide.tex.orig 2009-03-12 08:41:02.000000000 +0000
-+++ doc/guide.tex 2009-03-22 10:26:07.000000000 +0000
-@@ -713,34 +713,80 @@
- will listen and what services will be run on them. Each element of the list is a
- tuple with the following elements:
- \begin{itemize}
--\item Port number.
--\item Module that serves this port.
--\item Options to this module.
-+\item Port number. Optionally also the IP address.
-+\item Listening module that serves this port.
-+\item Options for the TCP socket and for the listening module.
- \end{itemize}
-
-+With the basic syntax the ports will listen on all IPv4 network addresses:
-+\begin{verbatim}
-+{listen, [
-+ {<port-number>, <module>, [<options>]},
-+ {<port-number>, <module>, [<options>]},
-+ ...
-+ {<port-number>, <module>, [<options>]}
-+ ]}.
-+\end{verbatim}
-+
-+It is possible to specify the IP address for a port using the full syntax:
-+\begin{verbatim}
-+ {{<port-number>, <ip-address>}, <module>, [<options>]}
-+\end{verbatim}
-+
-+
-+\makesubsubsection{listened-port}{Port Number and IP Address}
-+
-+The port number defines which port to listen for incoming connections.
-+It can be a Jabber/XMPP standard port
-+(see section \ref{firewall}) or any other valid port number.
-+
-+The IP address can be represented with a string
-+or an Erlang tuple with decimal or hexadecimal numbers.
-+The socket will listen only in that network interface.
-+It is possible to specify a generic address,
-+so \ejabberd{} will listen in all addresses.
-+Depending in the type of the IP address, IPv4 or IPv6 will be used.
-+
-+Some example values for IP address:
-+\begin{itemize}
-+\item \verb|"0.0.0.0"| to listen in all IPv4 network interfaces. This is the default value when no IP is specified.
-+\item \verb|"::"| to listen in all IPv6 network interfaces
-+\item \verb|"10.11.12.13"| is the IPv4 address \verb|10.11.12.13|
-+\item \verb|"::FFFF:127.0.0.1"| is the IPv6 address \verb|::FFFF:127.0.0.1/128|
-+\item \verb|{10, 11, 12, 13}| is the IPv4 address \verb|10.11.12.13|
-+\item \verb|{0, 0, 0, 0, 0, 65535, 32512, 1}| is the IPv6 address \verb|::FFFF:127.0.0.1/128|
-+\item \verb|{16#fdca, 16#8ab6, 16#a243, 16#75ef, 0, 0, 0, 1}| is the IPv6 address \verb|FDCA:8AB6:A243:75EF::1/128|
-+\end{itemize}
-+
-+
-+\makesubsubsection{listened-module}{Listening Module}
-+
- \ind{modules!ejabberd\_c2s}\ind{modules!ejabberd\_s2s\_in}\ind{modules!ejabberd\_service}\ind{modules!ejabberd\_http}\ind{protocols!XEP-0114: Jabber Component Protocol}
- The available modules, their purpose and the options allowed by each one are:
- \begin{description}
- \titem{\texttt{ejabberd\_c2s}}
- Handles c2s connections.\\
-- Options: \texttt{access}, \texttt{certfile}, \texttt{inet6},
-- \texttt{ip}, \texttt{max\_stanza\_size}, \texttt{shaper},
-+ Options: \texttt{access}, \texttt{certfile},
-+ \texttt{max\_stanza\_size}, \texttt{shaper},
- \texttt{starttls}, \texttt{starttls\_required}, \texttt{tls},
- \texttt{zlib}
- \titem{\texttt{ejabberd\_s2s\_in}}
- Handles incoming s2s connections.\\
-- Options: \texttt{inet6}, \texttt{ip}, \texttt{max\_stanza\_size}
-+ Options: \texttt{max\_stanza\_size}
- \titem{\texttt{ejabberd\_service}}
- Interacts with an \footahref{http://www.ejabberd.im/tutorials-transports}{external component}
- (as defined in the Jabber Component Protocol (\xepref{0114}).\\
-- Options: \texttt{access}, \texttt{hosts}, \texttt{inet6},
-- \texttt{ip}, \texttt{shaper}, \texttt{service\_check\_from}
-+ Options: \texttt{access}, \texttt{hosts},
-+ \texttt{shaper}, \texttt{service\_check\_from}
- \titem{\texttt{ejabberd\_http}}
- Handles incoming HTTP connections.\\
- Options: \texttt{certfile}, \texttt{http\_bind}, \texttt{http\_poll},
-- \texttt{inet6}, \texttt{ip}, \texttt{request\_handlers}, \texttt{tls}, \texttt{web\_admin}\\
-+ \texttt{request\_handlers}, \texttt{tls}, \texttt{web\_admin}\\
- \end{description}
-
-+
-+\makesubsubsection{listened-options}{Options}
-+
- This is a detailed description of each option allowed by the listening modules:
- \begin{description}
- \titem{\{access, <access rule>\}} \ind{options!access}This option defines
-@@ -786,12 +832,6 @@
- is also needed in the \Jabber{} client. Remark also that HTTP Polling can be
- interesting to host a web-based \Jabber{} client such as
- \footahref{http://jwchat.sourceforge.net/}{JWChat}.
-- \titem{inet6} \ind{options!inet6}\ind{IPv6}Set up the socket for IPv6 instead of IPv4.
-- Note: this option is not required for S2S outgoing connections,
-- because when ejabberd attempts to establish a S2S outgoing connection
-- it first tries IPv4, and if that fails it attempts with IPv6.
-- \titem{\{ip, IPAddress\}} \ind{options!ip}This option specifies which network
-- interface to listen for. For example \verb|{ip, {192, 168, 1, 1}}|.
- \titem{\{max\_stanza\_size, Size\}}
- \ind{options!max\_stanza\_size}This option specifies an
- approximate maximum size in bytes of XML stanzas. Approximate,
-@@ -839,7 +879,7 @@
- option will not affect connections (there will be no stream compression).
- \end{description}
-
--There are some additional global options:
-+There are some additional global options that can be specified in the ejabberd configuration file (outside \term{listen}):
- \begin{description}
- \titem{\{s2s\_use\_starttls, true|false\}}
- \ind{options!s2s\_use\_starttls}\ind{STARTTLS}This option defines whether to
-@@ -860,6 +900,8 @@
- Specified in seconds. The default value is 300 seconds (5 minutes).
- \end{description}
-
-+\makesubsubsection{listened-examples}{Examples}
-+
- For example, the following simple configuration defines:
- \begin{itemize}
- \item There are three domains. The default certificate file is \term{server.pem}.
-@@ -867,10 +909,10 @@
- \item Port 5222 listens for c2s connections with STARTTLS,
- and also allows plain connections for old clients.
- \item Port 5223 listens for c2s connections with the old SSL.
--\item Port 5269 listens for s2s connections with STARTTLS.
-+\item Port 5269 listens for s2s connections with STARTTLS. The socket is set for IPv6 instead of IPv4.
- \item Port 5280 listens for HTTP requests, and serves the HTTP Poll service.
- \item Port 5281 listens for HTTP requests, and serves the Web Admin using HTTPS as explained in
-- section~\ref{webadmin}.
-+ section~\ref{webadmin}. The socket only listens connections to the IP address 127.0.0.1.
- \end{itemize}
- \begin{verbatim}
- {hosts, ["example.com", "example.org", "example.net"]}.
-@@ -879,50 +921,52 @@
- {5222, ejabberd_c2s, [
- {access, c2s},
- {shaper, c2s_shaper},
-- starttls, {certfile, "/etc/ejabberd/server.pem"},
-+ starttls, {certfile, "@PKG_SYSCONFDIR@/server.pem"},
- {max_stanza_size, 65536}
- ]},
- {5223, ejabberd_c2s, [
- {access, c2s},
- {shaper, c2s_shaper},
-- tls, {certfile, "/etc/ejabberd/server.pem"},
-+ tls, {certfile, "@PKG_SYSCONFDIR@/server.pem"},
- {max_stanza_size, 65536}
- ]},
-- {5269, ejabberd_s2s_in, [
-- {shaper, s2s_shaper},
-- {max_stanza_size, 131072}
-- ]},
-+ {{5269, "::"}, ejabberd_s2s_in, [
-+ {shaper, s2s_shaper},
-+ {max_stanza_size, 131072}
-+ ]},
- {5280, ejabberd_http, [
- http_poll
- ]},
-- {5281, ejabberd_http, [
-- web_admin,
-- tls, {certfile, "/etc/ejabberd/server.pem"},
-- ]}
-+ {{5281, "127.0.0.1"}, ejabberd_http, [
-+ web_admin,
-+ tls, {certfile, "@PKG_SYSCONFDIR@/server.pem"},
-+ ]}
- ]
- }.
- {s2s_use_starttls, true}.
--{s2s_certfile, "/etc/ejabberd/server.pem"}.
--{domain_certfile, "example.com", "/etc/ejabberd/example_com.pem"}.
-+{s2s_certfile, "@PKG_SYSCONFDIR@/server.pem"}.
-+{domain_certfile, "example.com", "@PKG_SYSCONFDIR@/example_com.pem"}.
- \end{verbatim}
-
- In this example, the following configuration defines that:
- \begin{itemize}
--\item c2s connections are listened for on port 5222 and 5223 (SSL) and denied
-+\item c2s connections are listened for on port 5222 (all IPv4 addresses) and
-+ on port 5223 (SSL, IP 192.168.0.1 and fdca:8ab6:a243:75ef::1) and denied
- for the user called `\term{bad}'.
--\item s2s connections are listened for on port 5269 with STARTTLS for secured
-- traffic enabled.
-+\item s2s connections are listened for on port 5269 (all IPv4 addresses)
-+ with STARTTLS for secured traffic enabled.
- Incoming and outgoing connections of remote Jabber servers are denied,
- only two servers can connect: "jabber.example.org" and "example.com".
--\item Port 5280 is serving the Web Admin and the HTTP Polling service. Note
-+\item Port 5280 is serving the Web Admin and the HTTP Polling service
-+ in all the IPv4 addresses. Note
- that it is also possible to serve them on different ports. The second
- example in section~\ref{webadmin} shows how exactly this can be done.
- \item All users except for the administrators have a traffic of limit
- 1,000\,Bytes/second
- \item \ind{transports!AIM}The
- \footahref{http://www.ejabberd.im/pyaimt}{AIM transport}
-- \jid{aim.example.org} is connected to port 5233 with password
-- `\term{aimsecret}'.
-+ \jid{aim.example.org} is connected to port 5233 on localhost IP addresses
-+ (127.0.0.1 and ::1) with password `\term{aimsecret}'.
- \item \ind{transports!ICQ}The ICQ transport JIT (\jid{icq.example.org} and
- \jid{sms.example.org}) is connected to port 5234 with password
- `\term{jitsecret}'.
-@@ -950,13 +994,32 @@
- {access, c2s_shaper, [{none, admin},
- {normal, all}]}.
- {listen,
-- [{5222, ejabberd_c2s, [{access, c2s}, {shaper, c2s_shaper}]},
-- {5223, ejabberd_c2s, [{access, c2s},
-- ssl, {certfile, "/path/to/ssl.pem"}]},
-+ [{5222, ejabberd_c2s, [
-+ {access, c2s},
-+ {shaper, c2s_shaper}
-+ ]},
-+ {{5223, {192, 168, 0, 1}}, ejabberd_c2s, [
-+ {access, c2s},
-+ ssl, {certfile, "/path/to/ssl.pem"}
-+ ]},
-+ {{5223, {16#fdca, 16#8ab6, 16#a243, 16#75ef, 0, 0, 0, 1}},
-+ ejabberd_c2s, [
-+ {access, c2s},
-+ ssl, {certfile, "/path/to/ssl.pem"}
-+ ]},
- {5269, ejabberd_s2s_in, []},
-- {5280, ejabberd_http, [http_poll, web_admin]},
-- {5233, ejabberd_service, [{hosts, ["aim.example.org"],
-- [{password, "aimsecret"}]}]},
-+ {{5280, {0, 0, 0, 0}}, ejabberd_http, [
-+ http_poll,
-+ web_admin
-+ ]},
-+ {{5233, {127, 0, 0, 1}}, ejabberd_service, [
-+ {hosts, ["aim.example.org"],
-+ [{password, "aimsecret"}]}
-+ ]},
-+ {{5233, "::1"}, ejabberd_service, [
-+ {hosts, ["aim.example.org"],
-+ [{password, "aimsecret"}]}
-+ ]},
- {5234, ejabberd_service, [{hosts, ["icq.example.org", "sms.example.org"],
- [{password, "jitsecret"}]}]},
- {5235, ejabberd_service, [{hosts, ["msn.example.org"],
-@@ -3737,7 +3800,7 @@
- \item For security reasons, you can serve the Web Admin on a secured
- connection, on a port differing from the HTTP Polling interface, and bind it
- to the internal LAN IP. The Web Admin will be accessible by pointing your
-- web browser to \verb|https://192.168.1.1:5280/admin/|:
-+ web browser to \verb|https://192.168.1.1:5282/admin/|:
- \begin{verbatim}
-
- {hosts, ["example.org"]}.
-@@ -3745,9 +3808,13 @@
- {listen,
- [
- ...
-- {5270, ejabberd_http, [http_poll]},
-- {5280, ejabberd_http, [web_admin, {ip, {192, 168, 1, 1}},
-- tls, {certfile, "/usr/local/etc/server.pem"}]},
-+ {5280, ejabberd_http, [
-+ http_poll
-+ ]},
-+ {{5282, "192.168.1.1"}, ejabberd_http, [
-+ web_admin,
-+ tls, {certfile, "@PKG_SYSCONFDIR@/server.pem"}
-+ ]},
- ...
- ]}.
- \end{verbatim}
diff --git a/chat/ejabberd/patches/patch-ad b/chat/ejabberd/patches/patch-ad
index d12f8ecee51..c825dfc0e26 100644
--- a/chat/ejabberd/patches/patch-ad
+++ b/chat/ejabberd/patches/patch-ad
@@ -1,22 +1,16 @@
-$NetBSD: patch-ad,v 1.3 2009/03/22 10:39:44 martti Exp $
+$NetBSD: patch-ad,v 1.4 2009/12/15 13:30:54 fhajny Exp $
-Modified to use IPv6/v4 patch (https://support.process-one.net/browse/EJAB-389)
-
---- src/ejabberd.cfg.example.orig 2009-03-12 08:41:02.000000000 +0000
-+++ src/ejabberd.cfg.example 2009-03-22 10:27:16.000000000 +0000
-@@ -108,10 +108,9 @@
+--- src/ejabberd.cfg.example.orig 2009-11-06 19:53:19.000000000 +0000
++++ src/ejabberd.cfg.example
+@@ -109,7 +109,6 @@
[
{5222, ejabberd_c2s, [
-
%%
%% If TLS is compiled and you installed a SSL
-- %% certificate, put the correct path to the
-+ %% certificate, put the correct path to the
- %% file and uncomment this line:
- %%
- %%{certfile, "/path/to/ssl.pem"}, starttls,
-@@ -124,12 +123,12 @@
+ %% certificate, put the correct path to the
+@@ -125,12 +124,12 @@
%%
%% To enable the old SSL connection method in port 5223:
%%
@@ -35,59 +29,25 @@ Modified to use IPv6/v4 patch (https://support.process-one.net/browse/EJAB-389)
{5269, ejabberd_s2s_in, [
{shaper, s2s_shaper},
-@@ -139,14 +138,14 @@
+@@ -140,10 +139,10 @@
%%
%% ejabberd_service: Interact with external components (transports...)
%%
- %%{8888, ejabberd_service, [
-- %% {access, all},
-- %% {shaper_rule, fast},
-- %% {ip, {127, 0, 0, 1}},
-- %% {hosts, ["icq.example.org", "sms.example.org"],
-- %% [{password, "secret"}]
-- %% }
-- %% ]},
+ %%{{8888, "127.0.0.1"},
+ %% ejabberd_service, [
-+ %% {access, all},
-+ %% {shaper_rule, fast},
-+ %% {hosts, ["icq.example.org", "sms.example.org"],
-+ %% [{password, "secret"}]
-+ %% }
-+ %% ]},
-
- {5280, ejabberd_http, [
- http_poll,
-@@ -225,17 +224,26 @@
- %% List of LDAP servers:
- %%{ldap_servers, ["localhost"]}.
- %%
--%% LDAP attribute that holds user ID:
--%%{ldap_uids, [{"mail", "%u@mail.example.org"}]}.
-+%% Encryption of connection to LDAP servers:
-+%%{ldap_encrypt, tls}.
- %%
--%% Search base of LDAP directory:
--%%{ldap_base, "dc=example,dc=com"}.
-+%% Port connect to LDAP server:
-+%%{ldap_port, 636}.
+ %% {access, all},
+ %% {shaper_rule, fast},
+- %% {ip, {127, 0, 0, 1}},
+ %% {hosts, ["icq.example.org", "sms.example.org"],
+ %% [{password, "secret"}]
+ %% }
+@@ -465,7 +464,7 @@
%%
- %% LDAP manager:
--%%{ldap_rootdn, "dc=example,dc=com"}.
-+%%{ldap_rootdn, "dc=example,dc=com"}.
+ %% Full path to a script that generates the image.
%%
- %% Password to LDAP manager:
--%%{ldap_password, "******"}.
-+%%{ldap_password, "******"}.
-+%%
-+%% Search base of LDAP directory:
-+%%{ldap_base, "dc=example,dc=com"}.
-+%%
-+%% LDAP attribute that holds user ID:
-+%%{ldap_uids, [{"mail", "%u@mail.example.org"}]}.
-+%%
-+%% LDAP filter:
-+%%{ldap_filter, "(objectClass=shadowAccount)"}.
+-%%{captcha_cmd, "/lib/ejabberd/priv/bin/captcha.sh"}.
++%%{captcha_cmd, "@PREFIX@/lib/erlang/lib/@DISTNAME@/priv/bin/captcha.sh"}.
%%
- %% Anonymous login support:
+ %% Host part of the URL sent to the user.
diff --git a/chat/ejabberd/patches/patch-ae b/chat/ejabberd/patches/patch-ae
index aa65b1561cc..bf6f4fbbcda 100644
--- a/chat/ejabberd/patches/patch-ae
+++ b/chat/ejabberd/patches/patch-ae
@@ -1,38 +1,26 @@
-$NetBSD: patch-ae,v 1.3 2008/11/12 13:13:59 martti Exp $
+$NetBSD: patch-ae,v 1.4 2009/12/15 13:30:54 fhajny Exp $
-Modified for pkgsrc
-
---- src/ejabberdctl.template.orig 2008-08-27 12:37:52.000000000 +0300
+--- src/ejabberdctl.template.orig 2009-11-16 20:25:51.344260518 +0000
+++ src/ejabberdctl.template
-@@ -14,8 +14,8 @@ ERLANG_NODE=$NODE@$HOST
- ERL=@erl@
- ROOTDIR=@rootdir@
- EJABBERD_CONFIG_PATH=$ROOTDIR/etc/ejabberd/ejabberd.cfg
--LOGS_DIR=$ROOTDIR/var/log/ejabberd/
--EJABBERD_DB=$ROOTDIR/var/lib/ejabberd/db/$NODE
-+LOGS_DIR=@EJABBERD_LOGDIR@
-+EJABBERD_DB=@EJABBERD_VARDIR@/spool/ejabberd/db/$NODE
-
- # read custom configuration
- CONFIG=$ROOTDIR/etc/ejabberd/ejabberdctl.cfg
-@@ -43,16 +43,16 @@ NAME=-name
- ERLANG_OPTS="+K $POLL -smp $SMP +P $ERL_PROCESSES"
+@@ -43,10 +43,10 @@ if [ "$EJABBERDCTL_CONFIG_PATH" = "" ] ;
+ fi
+ [ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH"
+ if [ "$LOGS_DIR" = "" ] ; then
+- LOGS_DIR=@LOCALSTATEDIR@/log/ejabberd
++ LOGS_DIR=@EJABBERD_LOGDIR@
+ fi
+ if [ "$SPOOLDIR" = "" ] ; then
+- SPOOLDIR=@LOCALSTATEDIR@/lib/ejabberd
++ SPOOLDIR=@EJABBERD_DB@
+ fi
+ if [ "$EJABBERD_DOC_PATH" = "" ] ; then
+ EJABBERD_DOC_PATH=@DOCDIR@
+@@ -83,7 +83,7 @@ ERLANG_OPTS="+K $POLL -smp $SMP +P $ERL_
# define additional environment variables
--EJABBERD_EBIN=$ROOTDIR/var/lib/ejabberd/ebin
--EJABBERD_MSGS_PATH=$ROOTDIR/var/lib/ejabberd/priv/msgs
--EJABBERD_SO_PATH=$ROOTDIR/var/lib/ejabberd/priv/lib
-+EJABBERD_EBIN=$ROOTDIR/lib/erlang/lib/@DISTNAME@/ebin
-+EJABBERD_MSGS_PATH=$ROOTDIR/lib/erlang/lib/@DISTNAME@/priv/msgs
-+EJABBERD_SO_PATH=$ROOTDIR/lib/erlang/lib/@DISTNAME@/priv/lib
- EJABBERD_BIN_PATH=$ROOTDIR/var/lib/ejabberd/priv/bin
- EJABBERD_LOG_PATH=$LOGS_DIR/ejabberd.log
- SASL_LOG_PATH=$LOGS_DIR/sasl.log
- DATETIME=`date "+%Y%m%d-%H%M%S"`
- ERL_CRASH_DUMP=$LOGS_DIR/erl_crash_$DATETIME.dump
- ERL_INETRC=$ROOTDIR/etc/ejabberd/inetrc
--HOME=$ROOTDIR/var/lib/ejabberd
-+HOME=@EJABBERD_VARDIR@/spool/ejabberd/db/$NODE
-
- # export global variables
- export EJABBERD_CONFIG_PATH
+ if [ "$EJABBERDDIR" = "" ]; then
+- EJABBERDDIR=@LIBDIR@/ejabberd
++ EJABBERDDIR=@LIBDIR@/erlang/lib/@DISTNAME@
+ fi
+ if [ "$EJABBERD_EBIN_PATH" = "" ]; then
+ EJABBERD_EBIN_PATH=$EJABBERDDIR/ebin
diff --git a/chat/ejabberd/patches/patch-af b/chat/ejabberd/patches/patch-af
deleted file mode 100644
index ed0c27e215e..00000000000
--- a/chat/ejabberd/patches/patch-af
+++ /dev/null
@@ -1,25 +0,0 @@
-$NetBSD: patch-af,v 1.1 2008/11/12 13:13:59 martti Exp $
-
-Modified to use IPv6/v4 patch (https://support.process-one.net/browse/EJAB-389)
-
---- src/ejabberd_config.erl.orig 2008-08-27 12:37:52.000000000 +0300
-+++ src/ejabberd_config.erl
-@@ -140,8 +140,16 @@ process_term(Term, State) ->
- {host_config, Host, Terms} ->
- lists:foldl(fun(T, S) -> process_host_term(T, Host, S) end,
- State, Terms);
-- {listen, Val} ->
-- add_option(listen, Val, State);
-+ {listen, Listeners} ->
-+ Listeners2 =
-+ lists:map(
-+ fun({PortIP, Module, Opts}) ->
-+ {Port, IPT, _, _, OptsClean} =
-+ ejabberd_listener:parse_listener_portip(PortIP, Opts),
-+ {{Port, IPT}, Module, OptsClean}
-+ end,
-+ Listeners),
-+ add_option(listen, Listeners2, State);
- {language, Val} ->
- add_option(language, Val, State);
- {outgoing_s2s_port, Port} ->
diff --git a/chat/ejabberd/patches/patch-ag b/chat/ejabberd/patches/patch-ag
deleted file mode 100644
index b1eb395bb14..00000000000
--- a/chat/ejabberd/patches/patch-ag
+++ /dev/null
@@ -1,205 +0,0 @@
-$NetBSD: patch-ag,v 1.2 2009/02/03 12:07:26 martti Exp $
-
-Modified to use IPv6/v4 patch (https://support.process-one.net/browse/EJAB-389)
-
---- src/ejabberd_listener.erl.orig 2009-01-14 11:54:15.000000000 +0200
-+++ src/ejabberd_listener.erl 2009-02-03 08:21:35.000000000 +0200
-@@ -32,6 +32,7 @@
- init_ssl/4,
- start_listener/3,
- stop_listener/1,
-+ parse_listener_portip/2,
- add_listener/3,
- delete_listener/1
- ]).
-@@ -50,8 +51,7 @@
- undefined ->
- ignore;
- Ls ->
-- {ok, {{one_for_one, 10, 1},
-- lists:map(
-+ Ls2 = lists:map(
- fun({Port, Module, Opts}) ->
- {Port,
- {?MODULE, start, [Port, Module, Opts]},
-@@ -59,7 +59,20 @@
- brutal_kill,
- worker,
- [?MODULE]}
-- end, Ls)}}
-+ end, Ls),
-+ report_duplicated_portips(Ls),
-+ {ok, {{one_for_one, 10, 1}, Ls2}}
-+ end.
-+
-+report_duplicated_portips(L) ->
-+ LKeys = [Port || {Port, _, _} <- L],
-+ LNoDupsKeys = proplists:get_keys(L),
-+ case LKeys -- LNoDupsKeys of
-+ [] -> ok;
-+ Dups ->
-+ ?CRITICAL_MSG("In the ejabberd configuration there are duplicated "
-+ "Port number + IP address:~n ~p",
-+ [Dups])
- end.
-
-
-@@ -84,7 +97,11 @@
- end
- end.
-
--init(Port, Module, Opts) ->
-+init(PortIP, Module, Opts1) ->
-+ {Port, IPT, IPS, IPV, OptsClean} = parse_listener_portip(PortIP, Opts1),
-+ %% The first inet|inet6 and the last {ip, _} work,
-+ %% so overriding those in Opts
-+ Opts = [IPV | OptsClean] ++ [{ip, IPT}],
- SockOpts = lists:filter(fun({ip, _}) -> true;
- (inet6) -> true;
- (inet) -> true;
-@@ -103,11 +120,77 @@
- {ok, ListenSocket} ->
- accept(ListenSocket, Module, Opts);
- {error, Reason} ->
-- ?ERROR_MSG("Failed to open socket for ~p: ~p",
-- [{Port, Module, Opts}, Reason]),
-- error
-+ ReasonT = case Reason of
-+ eaddrnotavail -> "IP address not available: " ++ IPS;
-+ _ -> atom_to_list(Reason)
-+ end,
-+ ?ERROR_MSG("Failed to open socket:~n ~p~nReason: ~s",
-+ [{Port, Module, SockOpts}, ReasonT]),
-+ {error, ReasonT}
- end.
-
-+%% @spec (PortIP, Opts) -> {Port, IPT, IPS, IPV, OptsClean}
-+%% where
-+%% PortIP = Port | {Port, IPT | IPS}
-+%% Port = integer()
-+%% IPT = tuple()
-+%% IPS = string()
-+%% IPV = inet | inet6
-+%% Opts = [IPV | {ip, IPT} | atom() | tuple()]
-+%% OptsClean = [atom() | tuple()]
-+%% @doc Parse any kind of ejabberd listener specification.
-+%% The parsed options are returned in several formats.
-+%% OptsClean does not include inet/inet6 or ip options.
-+%% Opts can include the options inet6 and {ip, Tuple},
-+%% but they are only used when no IP address was specified in the PortIP.
-+%% The IP version (either IPv4 or IPv6) is inferred from the IP address type,
-+%% so the option inet/inet6 is only used when no IP is specified at all.
-+parse_listener_portip(PortIP, Opts) ->
-+ {IPOpt, Opts2} = strip_ip_option(Opts),
-+ {IPVOpt, OptsClean} = case lists:member(inet6, Opts2) of
-+ true -> {inet6, Opts2 -- [inet6]};
-+ false -> {inet, Opts2}
-+ end,
-+ {Port, IPT, IPS} = case PortIP of
-+ P when is_integer(P) ->
-+ T = get_ip_tuple(IPOpt, IPVOpt),
-+ S = inet_parse:ntoa(T),
-+ {P, T, S};
-+ {P, T} when is_integer(P) and is_tuple(T) ->
-+ S = inet_parse:ntoa(T),
-+ {P, T, S};
-+ {P, S} when is_integer(P) and is_list(S) ->
-+ [S | _] = string:tokens(S, "/"),
-+ {ok, T} = inet_parse:address(S),
-+ {P, T, S}
-+ end,
-+ IPV = case size(IPT) of
-+ 4 -> inet;
-+ 8 -> inet6
-+ end,
-+ {Port, IPT, IPS, IPV, OptsClean}.
-+
-+strip_ip_option(Opts) ->
-+ {IPL, OptsNoIP} = lists:partition(
-+ fun({ip, _}) -> true;
-+ (_) -> false
-+ end,
-+ Opts),
-+ case IPL of
-+ %% Only the first ip option is considered
-+ [{ip, T1} | _] when is_tuple(T1) ->
-+ {T1, OptsNoIP};
-+ [] ->
-+ {no_ip_option, OptsNoIP}
-+ end.
-+
-+get_ip_tuple(no_ip_option, inet) ->
-+ {0, 0, 0, 0};
-+get_ip_tuple(no_ip_option, inet6) ->
-+ {0, 0, 0, 0, 0, 0, 0, 0};
-+get_ip_tuple(IPOpt, _IPVOpt) ->
-+ IPOpt.
-+
- accept(ListenSocket, Module, Opts) ->
- case gen_tcp:accept(ListenSocket) of
- {ok, Socket} ->
-@@ -182,6 +265,7 @@
- end.
-
-
-+%% @spec (Port, Module, Opts) -> {ok, Pid} | {error, Error}
- start_listener(Port, Module, Opts) ->
- ChildSpec = {Port,
- {?MODULE, start, [Port, Module, Opts]},
-@@ -195,26 +279,49 @@
- supervisor:terminate_child(ejabberd_listeners, Port),
- supervisor:delete_child(ejabberd_listeners, Port).
-
--add_listener(Port, Module, Opts) ->
-+%% @spec (PortIP, Module, Opts) -> {ok, Pid} | {error, Error}
-+%% where
-+%% PortIP = {Port, IPT | IPS}
-+%% Port = integer()
-+%% IPT = tuple()
-+%% IPS = string()
-+%% IPV = inet | inet6
-+%% Module = atom()
-+%% Opts = [IPV | {ip, IPT} | atom() | tuple()]
-+%% @doc Add a listener and store in config if success
-+add_listener(PortIP, Module, Opts) ->
-+ case start_listener(PortIP, Module, Opts) of
-+ {ok, _Pid} ->
- Ports = case ejabberd_config:get_local_option(listen) of
- undefined ->
- [];
- Ls ->
- Ls
- end,
-- Ports1 = lists:keydelete(Port, 1, Ports),
-- Ports2 = [{Port, Module, Opts} | Ports1],
-+ Ports1 = lists:keydelete(PortIP, 1, Ports),
-+ Ports2 = [{PortIP, Module, Opts} | Ports1],
- ejabberd_config:add_local_option(listen, Ports2),
-- start_listener(Port, Module, Opts).
-+ ok;
-+ {error, {already_started, _Pid}} ->
-+ {error, {already_started, PortIP}};
-+ {error, Error} ->
-+ {error, Error}
-+ end.
-
--delete_listener(Port) ->
-+%% @spec (PortIP) -> ok
-+%% where
-+%% PortIP = {Port, IPT | IPS}
-+%% Port = integer()
-+%% IPT = tuple()
-+%% IPS = string()
-+delete_listener(PortIP) ->
- Ports = case ejabberd_config:get_local_option(listen) of
- undefined ->
- [];
- Ls ->
- Ls
- end,
-- Ports1 = lists:keydelete(Port, 1, Ports),
-+ Ports1 = lists:keydelete(PortIP, 1, Ports),
- ejabberd_config:add_local_option(listen, Ports1),
-- stop_listener(Port).
-+ stop_listener(PortIP).
-
diff --git a/chat/ejabberd/patches/patch-ah b/chat/ejabberd/patches/patch-ah
deleted file mode 100644
index fdbb14c16bb..00000000000
--- a/chat/ejabberd/patches/patch-ah
+++ /dev/null
@@ -1,50 +0,0 @@
-$NetBSD: patch-ah,v 1.2 2009/03/22 10:39:44 martti Exp $
-
-Modified to use IPv6/v4 patch (https://support.process-one.net/browse/EJAB-389)
-
---- src/mod_proxy65/mod_proxy65_service.erl.orig 2009-03-12 08:41:02.000000000 +0000
-+++ src/mod_proxy65/mod_proxy65_service.erl 2009-03-22 10:27:50.000000000 +0000
-@@ -52,6 +52,7 @@
- name,
- stream_addr,
- port,
-+ ip,
- acl
- }).
-
-@@ -69,14 +70,14 @@
- gen_server:start_link({local, Proc}, ?MODULE, [Host, Opts], []).
-
- init([Host, Opts]) ->
-- {IP, State} = parse_options(Host, Opts),
-- NewOpts = [Host, {ip, IP} | Opts],
-- ejabberd_listener:add_listener(State#state.port, mod_proxy65_stream, NewOpts),
-+ State = parse_options(Host, Opts),
-+ NewOpts = [Host | Opts],
-+ ejabberd_listener:add_listener({State#state.port, State#state.ip}, mod_proxy65_stream, NewOpts),
- ejabberd_router:register_route(State#state.myhost),
- {ok, State}.
-
--terminate(_Reason, #state{myhost=MyHost, port=Port}) ->
-- catch ejabberd_listener:delete_listener(Port),
-+terminate(_Reason, #state{myhost=MyHost, port=Port, ip=IP}) ->
-+ catch ejabberd_listener:delete_listener({Port, IP}),
- ejabberd_router:unregister_route(MyHost),
- ok.
-
-@@ -202,12 +203,13 @@
- end,
- StrIP = inet_parse:ntoa(IP),
- StreamAddr = [{"jid", MyHost}, {"host", StrIP}, {"port", integer_to_list(Port)}],
-- {IP, #state{myhost = MyHost,
-+ #state{myhost = MyHost,
- serverhost = ServerHost,
- name = Name,
- port = Port,
-+ ip = IP,
- stream_addr = StreamAddr,
-- acl = ACL}}.
-+ acl = ACL}.
-
- get_my_ip() ->
- {ok, MyHostName} = inet:gethostname(),
diff --git a/chat/ejabberd/patches/patch-ai b/chat/ejabberd/patches/patch-ai
deleted file mode 100644
index a77f5de2720..00000000000
--- a/chat/ejabberd/patches/patch-ai
+++ /dev/null
@@ -1,158 +0,0 @@
-$NetBSD: patch-ai,v 1.2 2009/03/22 10:39:44 martti Exp $
-
-Modified to use IPv6/v4 patch (https://support.process-one.net/browse/EJAB-389)
-
---- src/web/ejabberd_web_admin.erl.orig 2009-03-12 08:41:02.000000000 +0000
-+++ src/web/ejabberd_web_admin.erl 2009-03-22 10:28:12.000000000 +0000
-@@ -1805,15 +1805,21 @@
- ok;
- {'EXIT', _Reason} ->
- error;
-+ {is_added, ok} ->
-+ ok;
-+ {is_added, {error, Reason}} ->
-+ {error, io_lib:format("~p", [Reason])};
- _ ->
- nothing
- end,
-+ %% TODO: This sorting does not work when [{{Port, IP}, Module, Opts}]
- NewPorts = lists:sort(
- rpc:call(Node, ejabberd_config, get_local_option, [listen])),
- [?XC("h1", ?T("Listened Ports at ") ++ atom_to_list(Node))] ++
- case Res of
- ok -> [?CT("Submitted"), ?P];
- error -> [?CT("Bad format"), ?P];
-+ {error, ReasonT} -> [?CT("Problem: "), ?C(ReasonT), ?P];
- nothing -> []
- end ++
- [?XAE("form", [{"action", ""}, {"method", "post"}],
-@@ -2051,58 +2057,76 @@
- [?XE("thead",
- [?XE("tr",
- [?XCT("td", "Port"),
-+ ?XCT("td", "IP"),
- ?XCT("td", "Module"),
- ?XCT("td", "Options")
- ])]),
- ?XE("tbody",
- lists:map(
-- fun({Port, Module, Opts} = _E) ->
-- SPort = integer_to_list(Port),
-+ fun({PortIP, Module, Opts} = _E) ->
-+ {_Port, SPort, _TIP, SIP, SSPort, OptsClean} =
-+ get_port_data(PortIP, Opts),
- SModule = atom_to_list(Module),
- %%ID = term_to_id(E),
- ?XE("tr",
-- [?XC("td", SPort),
-- ?XE("td", [?INPUT("text", "module" ++ SPort,
-- SModule)]),
-- ?XE("td", [?INPUTS("text", "opts" ++ SPort,
-- term_to_string(Opts), "40")]),
-- ?XE("td", [?INPUTT("submit", "add" ++ SPort,
-+ [?XAE("td", [{"size", "6"}], [?C(SPort)]),
-+ ?XAE("td", [{"size", "15"}], [?C(SIP)]),
-+ ?XE("td", [?INPUTS("text", "module" ++ SSPort,
-+ SModule, "15")]),
-+ ?XE("td", [?INPUTS("text", "opts" ++ SSPort,
-+ term_to_string(OptsClean), "40")]),
-+ ?XE("td", [?INPUTT("submit", "add" ++ SSPort,
- "Update")]),
-- ?XE("td", [?INPUTT("submit", "delete" ++ SPort,
-+ ?XE("td", [?INPUTT("submit", "delete" ++ SSPort,
- "Delete")])
- ]
- )
- end, Ports) ++
- [?XE("tr",
- [?XE("td", [?INPUTS("text", "portnew", "", "6")]),
-- ?XE("td", [?INPUT("text", "modulenew", "")]),
-- ?XE("td", [?INPUTS("text", "optsnew", "", "40")]),
-+ ?XE("td", [?INPUTS("text", "ipnew", "0.0.0.0", "15")]),
-+ ?XE("td", [?INPUTS("text", "modulenew", "", "17")]),
-+ ?XE("td", [?INPUTS("text", "optsnew", "[]", "40")]),
- ?XAE("td", [{"colspan", "2"}],
- [?INPUTT("submit", "addnew", "Add New")])
- ]
- )]
- )]).
-
-+get_port_data(PortIP, Opts) ->
-+ {Port, IPT, IPS, _IPV, OptsClean} = ejabberd_listener:parse_listener_portip(PortIP, Opts),
-+ SPort = io_lib:format("~p", [Port]),
-+
-+ SSPort = lists:flatten(
-+ lists:map(
-+ fun(N) -> io_lib:format("~.16b", [N]) end,
-+ binary_to_list(crypto:md5(SPort++IPS)))),
-+ {Port, SPort, IPT, IPS, SSPort, OptsClean}.
-
- node_ports_parse_query(Node, Ports, Query) ->
- lists:foreach(
-- fun({Port, _Module1, _Opts1}) ->
-- SPort = integer_to_list(Port),
-- case lists:keysearch("add" ++ SPort, 1, Query) of
-+ fun({PortIP, _Module1, Opts1}) ->
-+ {Port, _SPort, TIP, _SIP, SSPort, _OptsClean} =
-+ get_port_data(PortIP, Opts1),
-+ case lists:keysearch("add" ++ SSPort, 1, Query) of
- {value, _} ->
-+ PortIP2 = {Port, TIP},
- {{value, {_, SModule}}, {value, {_, SOpts}}} =
-- {lists:keysearch("module" ++ SPort, 1, Query),
-- lists:keysearch("opts" ++ SPort, 1, Query)},
-+ {lists:keysearch("module" ++ SSPort, 1, Query),
-+ lists:keysearch("opts" ++ SSPort, 1, Query)},
- Module = list_to_atom(SModule),
- {ok, Tokens, _} = erl_scan:string(SOpts ++ "."),
- {ok, Opts} = erl_parse:parse_term(Tokens),
-- rpc:call(Node, ejabberd_listener, delete_listener, [Port]),
-- rpc:call(Node, ejabberd_listener, add_listener, [Port, Module, Opts]),
-- throw(submitted);
-+ rpc:call(Node, ejabberd_listener, delete_listener,
-+ [PortIP2]),
-+ R=rpc:call(Node, ejabberd_listener, add_listener,
-+ [PortIP2, Module, Opts]),
-+ throw({is_added, R});
- _ ->
-- case lists:keysearch("delete" ++ SPort, 1, Query) of
-+ case lists:keysearch("delete" ++ SSPort, 1, Query) of
- {value, _} ->
-- rpc:call(Node, ejabberd_listener, delete_listener, [Port]),
-+ rpc:call(Node, ejabberd_listener, delete_listener,
-+ [PortIP]),
- throw(submitted);
- _ ->
- ok
-@@ -2112,17 +2136,28 @@
- case lists:keysearch("addnew", 1, Query) of
- {value, _} ->
- {{value, {_, SPort}},
-+ {value, {_, STIP}}, %% It is a string that may represent a tuple
- {value, {_, SModule}},
- {value, {_, SOpts}}} =
- {lists:keysearch("portnew", 1, Query),
-+ lists:keysearch("ipnew", 1, Query),
- lists:keysearch("modulenew", 1, Query),
- lists:keysearch("optsnew", 1, Query)},
-- Port = list_to_integer(SPort),
-+ {ok, Toks, _} = erl_scan:string(SPort ++ "."),
-+ {ok, Port2} = erl_parse:parse_term(Toks),
-+ {ok, ToksIP, _} = erl_scan:string(STIP ++ "."),
-+ STIP2 = case erl_parse:parse_term(ToksIP) of
-+ {ok, IPTParsed} -> IPTParsed;
-+ {error, _} -> STIP
-+ end,
- Module = list_to_atom(SModule),
- {ok, Tokens, _} = erl_scan:string(SOpts ++ "."),
- {ok, Opts} = erl_parse:parse_term(Tokens),
-- rpc:call(Node, ejabberd_listener, add_listener, [Port, Module, Opts]),
-- throw(submitted);
-+ {Port2, _SPort, IP2, _SIP, _SSPort, OptsClean} =
-+ get_port_data({Port2, STIP2}, Opts),
-+ R=rpc:call(Node, ejabberd_listener, add_listener,
-+ [{Port2, IP2}, Module, OptsClean]),
-+ throw({is_added, R});
- _ ->
- ok
- end.