diff options
author | fhajny <fhajny@pkgsrc.org> | 2009-12-15 13:30:54 +0000 |
---|---|---|
committer | fhajny <fhajny@pkgsrc.org> | 2009-12-15 13:30:54 +0000 |
commit | 602d76982e065bf85b6154ab1e0bf8fc93311fb9 (patch) | |
tree | 19e92835dcc4d779cfac4f09dfa2fc4b5d068aab /chat/ejabberd/patches | |
parent | e74fb0c2e038e283a8a7943f92417828a9eb3618 (diff) | |
download | pkgsrc-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-aa | 171 | ||||
-rw-r--r-- | chat/ejabberd/patches/patch-ac | 276 | ||||
-rw-r--r-- | chat/ejabberd/patches/patch-ad | 76 | ||||
-rw-r--r-- | chat/ejabberd/patches/patch-ae | 56 | ||||
-rw-r--r-- | chat/ejabberd/patches/patch-af | 25 | ||||
-rw-r--r-- | chat/ejabberd/patches/patch-ag | 205 | ||||
-rw-r--r-- | chat/ejabberd/patches/patch-ah | 50 | ||||
-rw-r--r-- | chat/ejabberd/patches/patch-ai | 158 |
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. |