aboutsummaryrefslogtreecommitdiff
path: root/doc/guide.tex
diff options
context:
space:
mode:
Diffstat (limited to 'doc/guide.tex')
-rw-r--r--doc/guide.tex6494
1 files changed, 0 insertions, 6494 deletions
diff --git a/doc/guide.tex b/doc/guide.tex
deleted file mode 100644
index 9817dc229..000000000
--- a/doc/guide.tex
+++ /dev/null
@@ -1,6494 +0,0 @@
-\documentclass[a4paper,10pt]{book}
-
-%% Packages
-\usepackage{float}
-\usepackage{graphics}
-\usepackage{hevea}
-\usepackage[pdftex,colorlinks,unicode,urlcolor=blue,linkcolor=blue,
- pdftitle=Ejabberd\ Installation\ and\ Operation\ Guide,pdfauthor=ProcessOne,pdfsubject=ejabberd,pdfkeywords=ejabberd,
- pdfpagelabels=false]{hyperref}
-\usepackage{makeidx}
-%\usepackage{showidx} % Only for verifying the index entries.
-\usepackage{verbatim}
-\usepackage{geometry}
-\usepackage{fancyhdr}
-
-\pagestyle{fancy} %Forces the page to use the fancy template
-\renewcommand{\chaptermark}[1]{\markboth{\textbf{\thechapter}.\ \emph{#1}}{}}
-\renewcommand{\sectionmark}[1]{\markright{\thesection\ \boldmath\textbf{#1}\unboldmath}}
-\fancyhf{}
-\fancyhead[LE,RO]{\textbf{\thepage}} %Displays the page number in bold in the header,
- % to the left on even pages and to the right on odd pages.
-\fancyhead[RE]{\nouppercase{\leftmark}} %Displays the upper-level (chapter) information---
- % as determined above---in non-upper case in the header, to the right on even pages.
-\fancyhead[LO]{\rightmark} %Displays the lower-level (section) information---as
- % determined above---in the header, to the left on odd pages.
-\renewcommand{\headrulewidth}{0.5pt} %Underlines the header. (Set to 0pt if not required).
-\renewcommand{\footrulewidth}{0.5pt} %Underlines the footer. (Set to 0pt if not required).
-
-%% Index
-\makeindex
-% Remove the index anchors from the HTML version to save size and bandwith.
-\newcommand{\ind}[1]{\begin{latexonly}\index{#1}\end{latexonly}}
-\newcommand{\makechapter}[2]{ \aname{#1}{} \chapter{\ahrefloc{#1}{#2}} \label{#1} }
-\newcommand{\makesection}[2]{ \aname{#1}{} \section{\ahrefloc{#1}{#2}} \label{#1} }
-\newcommand{\makesubsection}[2]{ \aname{#1}{} \subsection{\ahrefloc{#1}{#2}} \label{#1} }
-\newcommand{\makesubsubsection}[2]{ \aname{#1}{} \subsubsection{\ahrefloc{#1}{#2}} \label{#1} }
-\newcommand{\makeparagraph}[2]{ \aname{#1}{} \paragraph{\ahrefloc{#1}{#2}} \label{#1} }
-
-%% Images
-\newcommand{\logoscale}{0.7}
-\newcommand{\imgscale}{0.58}
-\newcommand{\insimg}[1]{\insscaleimg{\imgscale}{#1}}
-\newcommand{\insscaleimg}[2]{
- \imgsrc{#2}{}
- \begin{latexonly}
- \scalebox{#1}{\includegraphics{#2}}
- \end{latexonly}
-}
-
-%% Various
-\newcommand{\bracehack}{\def\{{\char"7B}\def\}{\char"7D}}
-\newcommand{\titem}[1]{\item[\bracehack\texttt{#1}]}
-\newcommand{\ns}[1]{\texttt{#1}}
-\newcommand{\jid}[1]{\texttt{#1}}
-\newcommand{\option}[1]{\texttt{#1}}
-\newcommand{\poption}[1]{{\bracehack\texttt{#1}}}
-\newcommand{\node}[1]{\texttt{#1}}
-\newcommand{\term}[1]{\texttt{#1}}
-\newcommand{\shell}[1]{\texttt{#1}}
-\newcommand{\ejabberd}{\texttt{ejabberd}}
-\newcommand{\Jabber}{Jabber}
-\newcommand{\XMPP}{XMPP}
-\newcommand{\esyntax}[1]{\begin{description}\titem{#1}\end{description}}
-
-%% Modules
-\newcommand{\module}[1]{\texttt{#1}}
-\newcommand{\modadhoc}{\module{mod\_adhoc}}
-\newcommand{\modannounce}{\module{mod\_announce}}
-\newcommand{\modclientstate}{\module{mod\_client\_state}}
-\newcommand{\modblocking}{\module{mod\_blocking}}
-\newcommand{\modcaps}{\module{mod\_caps}}
-\newcommand{\modcarboncopy}{\module{mod\_carboncopy}}
-\newcommand{\modconfigure}{\module{mod\_configure}}
-\newcommand{\moddisco}{\module{mod\_disco}}
-\newcommand{\modecho}{\module{mod\_echo}}
-\newcommand{\modfailban}{\module{mod\_fail2ban}}
-\newcommand{\modhttpbind}{\module{mod\_http\_bind}}
-\newcommand{\modhttpfileserver}{\module{mod\_http\_fileserver}}
-\newcommand{\modirc}{\module{mod\_irc}}
-\newcommand{\modlast}{\module{mod\_last}}
-\newcommand{\modmuc}{\module{mod\_muc}}
-\newcommand{\modmuclog}{\module{mod\_muc\_log}}
-\newcommand{\modoffline}{\module{mod\_offline}}
-\newcommand{\modping}{\module{mod\_ping}}
-\newcommand{\modprescounter}{\module{mod\_pres\_counter}}
-\newcommand{\modprivacy}{\module{mod\_privacy}}
-\newcommand{\modprivate}{\module{mod\_private}}
-\newcommand{\modproxy}{\module{mod\_proxy65}}
-\newcommand{\modpubsub}{\module{mod\_pubsub}}
-\newcommand{\modpubsubodbc}{\module{mod\_pubsub\_odbc}}
-\newcommand{\modregister}{\module{mod\_register}}
-\newcommand{\modregisterweb}{\module{mod\_register\_web}}
-\newcommand{\modroster}{\module{mod\_roster}}
-\newcommand{\modservicelog}{\module{mod\_service\_log}}
-\newcommand{\modsharedroster}{\module{mod\_shared\_roster}}
-\newcommand{\modsharedrosterldap}{\module{mod\_shared\_roster\_ldap}}
-\newcommand{\modsic}{\module{mod\_sic}}
-\newcommand{\modsip}{\module{mod\_sip}}
-\newcommand{\modstats}{\module{mod\_stats}}
-\newcommand{\modtime}{\module{mod\_time}}
-\newcommand{\modvcard}{\module{mod\_vcard}}
-\newcommand{\modvcardldap}{\module{mod\_vcard\_ldap}}
-\newcommand{\modvcardxupdate}{\module{mod\_vcard\_xupdate}}
-\newcommand{\modversion}{\module{mod\_version}}
-
-%% Contributed modules
-%\usepackage{ifthen}
-%\newboolean{modhttpbind}
-%\newcommand{\modhttpbind}{\module{mod\_http\_bind}}
-%\include{contributed_modules}
-%
-% Then in the document you can input the partial tex file with:
-%\ifthenelse{\boolean{modhttpbind}}{\input{mod_http_bind.tex}}{}
-
-%% Common options
-\newcommand{\iqdiscitem}[1]{\titem{iqdisc: Discipline} \ind{options!iqdisc}This specifies
-the processing discipline for #1 IQ queries (see section~\ref{modiqdiscoption}).}
-\newcommand{\hostitem}[1]{
- \titem{host: HostName} \ind{options!host} This option defines the Jabber ID of the
- service. If the \texttt{host} option is not specified, the Jabber ID will be the
- hostname of the virtual host with the prefix `\jid{#1.}'. The keyword "@HOST@"
- is replaced at start time with the real virtual host name.
-}
-\newcommand{\dbtype}{\titem{db\_type: internal|odbc} \ind{options!dbtype}
- Define the type of storage where the module will create the tables and store user information.
- The default is to store in the internal Mnesia database.
- If \term{odbc} value is defined, make sure you have defined the database, see~\ref{database}.
-}
-
-%% Title page
-\include{version}
-\newlength{\larg}
-\setlength{\larg}{14.5cm}
-\title{
-{\rule{\larg}{1mm}}\vspace{7mm}
-\begin{tabular}{r}
- {\huge {\bf ejabberd \version\ }} \\
- \\
- {\huge Installation and Operation Guide}
-\end{tabular}\\
-\vspace{2mm}
-{\rule{\larg}{1mm}}
-\begin{latexonly}
-\vspace{2mm} \\
-\vspace{5.5cm}
-\end{latexonly}
-}
-\begin{latexonly}
-\author{\begin{tabular}{p{13.7cm}}
-ejabberd Development Team
-\end{tabular}}
-\date{}
-\end{latexonly}
-
-
-%% Options
-\newcommand{\marking}[1]{#1} % Marking disabled
-\newcommand{\quoting}[2][yozhik]{} % Quotes disabled
-%\newcommand{\new}{\marginpar{\textsc{new}}} % Highlight new features
-%\newcommand{\improved}{\marginpar{\textsc{improved}}} % Highlight improved features
-
-%% To by-pass errors in the HTML version:
-\newstyle{.SPAN}{width:20\%; float:right; text-align:left; margin-left:auto;}
-\newstyle{H1.titlemain HR}{display:none;}
-\newstyle{TABLE.title}{border-top:1px solid grey;border-bottom:1px solid grey; background: \#efefef}
-\newstyle{H1.chapter A, H2.section A, H3.subsection A, H4.subsubsection A, H5.paragraph A}
- {color:\#000000; text-decoration:none;}
-\newstyle{H1.chapter, H2.section, H3.subsection, H4.subsubsection, H5.paragraph}
- {border-top: 1px solid grey; background: \#efefef; padding: 0.5ex}
-\newstyle{pre.verbatim}{margin:1ex 2ex;border:1px dashed lightgrey;background-color:\#f9f9f9;padding:0.5ex;}
-\newstyle{.dt-description}{margin:0ex 2ex;}
-\newstyle{table[border="1"]}{border-collapse:collapse;margin-bottom:1em;}
-\newstyle{table[border="1"] td}{border:1px solid \#aaa;padding:2px}
-% Don't display <hr> before and after tables or images:
-\newstyle{BLOCKQUOTE.table DIV.center DIV.center HR}{display:none;}
-\newstyle{BLOCKQUOTE.figure DIV.center DIV.center HR}{display:none;}
-
-%% Footnotes
-\begin{latexonly}
-\global\parskip=9pt plus 3pt minus 1pt
-\global\parindent=0pt
-\gdef\ahrefurl#1{\href{#1}{\texttt{#1}}}
-\gdef\footahref#1#2{#2\footnote{\href{#1}{\texttt{#1}}}}
-\end{latexonly}
-\newcommand{\txepref}[2]{\footahref{http://xmpp.org/extensions/xep-#1.html}{#2}}
-\newcommand{\xepref}[1]{\txepref{#1}{XEP-#1}}
-
-\begin{document}
-
-\label{titlepage}
-\begin{titlepage}
- \maketitle{}
-
-%% Commenting. Breaking clean layout for now:
-%% \begin{center}
-%% {\insscaleimg{\logoscale}{logo.png}
-%% \par
-%% }
-%% \end{center}
-
-%% \begin{quotation}\textit{I can thoroughly recommend ejabberd for ease of setup ---
-%% Kevin Smith, Current maintainer of the Psi project}\end{quotation}
-
-\end{titlepage}
-
-% Set the page counter to 2 so that the titlepage and the second page do not
-% have the same page number. This fixes the PDFLaTeX warning "destination with
-% the same identifier".
-\begin{latexonly}
-\setcounter{page}{2}
-\end{latexonly}
-
-\label{toc}
-\tableofcontents{}
-
-% Input introduction.tex
-\input{introduction}
-
-\makechapter{installing}{Installing \ejabberd{}}
-
-\makesection{install.binary}{Installing \ejabberd{} with Binary Installer}
-
-Probably the easiest way to install an \ejabberd{} instant messaging server
-is using the binary installer published by ProcessOne.
-The binary installers of released \ejabberd{} versions
-are available in the ProcessOne \ejabberd{} downloads page:
-\ahrefurl{http://www.process-one.net/en/ejabberd/downloads}
-
-The installer will deploy and configure a full featured \ejabberd{}
-server and does not require any extra dependencies.
-
-In *nix systems, remember to set executable the binary installer before starting it. For example:
-\begin{verbatim}
-chmod +x ejabberd-2.0.0_1-linux-x86-installer.bin
-./ejabberd-2.0.0_1-linux-x86-installer.bin
-\end{verbatim}
-
-\ejabberd{} can be started manually at any time,
-or automatically by the operating system at system boot time.
-
-To start and stop \ejabberd{} manually,
-use the desktop shortcuts created by the installer.
-If the machine doesn't have a graphical system, use the scripts 'start'
-and 'stop' in the 'bin' directory where \ejabberd{} is installed.
-
-The Windows installer also adds ejabberd as a system service,
-and a shortcut to a debug console for experienced administrators.
-If you want ejabberd to be started automatically at boot time,
-go to the Windows service settings and set ejabberd to be automatically started.
-Note that the Windows service is a feature still in development,
-and for example it doesn't read the file ejabberdctl.cfg.
-
-On a *nix system, if you want ejabberd to be started as daemon at boot time,
-copy \term{ejabberd.init} from the 'bin' directory to something like \term{/etc/init.d/ejabberd}
-(depending on your distribution).
-Create a system user called \term{ejabberd},
-give it write access to the directories \term{database/} and \term{logs/}, and set that as home;
-the script will start the server with that user.
-Then you can call \term{/etc/inid.d/ejabberd start} as root to start the server.
-
-When ejabberd is started, the processes that are started in the system
-are \term{beam} or \term{beam.smp}, and also \term{epmd}.
-In Microsoft Windows, the processes are \term{erl.exe} and \term{epmd.exe}.
-For more information regarding \term{epmd} consult the section \ref{epmd}.
-
-If \term{ejabberd} doesn't start correctly in Windows,
-try to start it using the shortcut in desktop or start menu.
-If the window shows error 14001, the solution is to install:
-"Microsoft Visual C++ 2005 SP1 Redistributable Package".
-You can download it from
-\footahref{http://www.microsoft.com/}{www.microsoft.com}.
-Then uninstall \ejabberd{} and install it again.
-
-If \term{ejabberd} doesn't start correctly and a crash dump is generated,
-there was a severe problem.
-You can try starting \term{ejabberd} with
-the script \term{bin/live.bat} in Windows,
-or with the command \term{bin/ejabberdctl live} in other Operating Systems.
-This way you see the error message provided by Erlang
-and can identify what is exactly the problem.
-
-The \term{ejabberdctl} administration script is included in the \term{bin} directory.
-Please refer to the section~\ref{ejabberdctl} for details about \term{ejabberdctl},
-and configurable options to fine tune the Erlang runtime system.
-
-\makesection{install.os}{Installing \ejabberd{} with Operating System Specific Packages}
-
-Some Operating Systems provide a specific \ejabberd{} package adapted to
-the system architecture and libraries.
-It usually also checks dependencies
-and performs basic configuration tasks like creating the initial
-administrator account. Some examples are Debian and Gentoo. Consult the
-resources provided by your Operating System for more information.
-
-Usually those packages create a script like \term{/etc/init.d/ejabberd}
-to start and stop \ejabberd{} as a service at boot time.
-
-\makesection{install.cean}{Installing \ejabberd{} with CEAN}
-
-\footahref{http://cean.process-one.net/}{CEAN}
-(Comprehensive Erlang Archive Network) is a repository that hosts binary
-packages from many Erlang programs, including \ejabberd{} and all its dependencies.
-The binaries are available for many different system architectures, so this is an
-alternative to the binary installer and Operating System's \ejabberd{} packages.
-
-You will have to create your own \ejabberd{} start
-script depending of how you handle your CEAN installation.
-The default \term{ejabberdctl} script is located
-into \ejabberd{}'s priv directory and can be used as an example.
-
-\makesection{installation}{Installing \ejabberd{} from Source Code}
-\ind{install}
-
-The canonical form for distribution of \ejabberd{} stable releases is the source code package.
-Compiling \ejabberd{} from source code is quite easy in *nix systems,
-as long as your system have all the dependencies.
-
-\makesubsection{installreq}{Requirements}
-\ind{installation!requirements}
-
-To compile \ejabberd{} on a `Unix-like' operating system, you need:
-\begin{itemize}
-\item GNU Make
-\item GCC
-\item Libexpat 1.95 or higher
-\item Erlang/OTP R15B or higher.
-\item Libyaml 0.1.4 or higher
-\item OpenSSL 0.9.8 or higher, for STARTTLS, SASL and SSL encryption.
-\item Zlib 1.2.3 or higher, for Stream Compression support (\xepref{0138}). Optional.
-\item PAM library. Optional. For Pluggable Authentication Modules (PAM). See section \ref{pam}.
-\item GNU Iconv 1.8 or higher, for the IRC Transport (mod\_irc). Optional. Not needed on systems with GNU Libc. See section \ref{modirc}.
-\item ImageMagick's Convert program. Optional. For CAPTCHA challenges. See section \ref{captcha}.
-\end{itemize}
-
-\makesubsection{download}{Download Source Code}
-\ind{install!download}
-
-Released versions of \ejabberd{} are available in the ProcessOne \ejabberd{} downloads page:
-\ahrefurl{http://www.process-one.net/en/ejabberd/downloads}
-
-\ind{Git repository}
-Alternatively, the latest development source code can be retrieved from the Git repository using the commands:
-\begin{verbatim}
-git clone git://github.com/processone/ejabberd.git ejabberd
-cd ejabberd
-./autogen.sh
-\end{verbatim}
-
-
-\makesubsection{compile}{Compile}
-\ind{install!compile}
-
-To compile \ejabberd{} execute the commands:
-\begin{verbatim}
-./configure
-make
-\end{verbatim}
-
-The build configuration script allows several options.
-To get the full list run the command:
-\begin{verbatim}
-./configure --help
-\end{verbatim}
-
-Some options that you may be interested in modifying:
-\begin{description}
- \titem{--prefix=/}
- Specify the path prefix where the files will be copied when running
- the \term{make install} command.
-
- \titem{--enable-user[=USER]}
- Allow this normal system user to execute the ejabberdctl script
- (see section~\ref{ejabberdctl}),
- read the configuration files,
- read and write in the spool directory,
- read and write in the log directory.
- The account user and group must exist in the machine
- before running \term{make install}.
- This account doesn't need an explicit HOME directory, because
- \term{/var/lib/ejabberd/} will be used by default.
-
- \titem{--enable-pam}
- Enable the PAM authentication method (see section \ref{pam}).
-
- \titem{--enable-mssql}
- Required if you want to use an external database.
- See section~\ref{database} for more information.
-
- \titem{--enable-tools}
- Enable the use of development tools.
-
- \titem{--enable-mysql}
- Enable MySQL support (see section \ref{odbc}).
-
- \titem{--enable-pgsql}
- Enable PostgreSQL support (see section \ref{odbc}).
-
- \titem{--enable-zlib}
- Enable Stream Compression (XEP-0138) using zlib.
-
- \titem{--enable-iconv}
- Enable iconv support. This is needed for \term{mod\_irc} (see seciont \ref{modirc}).
-
- \titem{--enable-debug}
- Compile with \term{+debug\_info} enabled.
-
- \titem{--enable-full-xml}
- Enable the use of XML based optimisations.
- It will for example use CDATA to escape characters in the XMPP stream.
- Use this option only if you are sure your XMPP clients include a fully compliant XML parser.
-
- \titem{--disable-transient-supervisors}
- Disable the use of Erlang/OTP supervision for transient processes.
-
- \titem{--enable-nif}
- Replaces some critical Erlang functions with equivalents written in C to improve performance.
-\end{description}
-
-\makesubsection{install}{Install}
-\ind{install!install}
-
-To install \ejabberd{} in the destination directories, run the command:
-\begin{verbatim}
-make install
-\end{verbatim}
-Note that you probably need administrative privileges in the system
-to install \term{ejabberd}.
-
-The files and directories created are, by default:
-\begin{description}
- \titem{/etc/ejabberd/} Configuration directory:
- \begin{description}
- \titem{ejabberd.yml} ejabberd configuration file
- \titem{ejabberdctl.cfg} Configuration file of the administration script
- \titem{inetrc} Network DNS configuration file
- \end{description}
- \titem{/lib/ejabberd/}
- \begin{description}
- \titem{ebin/} Erlang binary files (*.beam)
- \titem{include/} Erlang header files (*.hrl)
- \titem{priv/} Additional files required at runtime
- \begin{description}
- \titem{bin/} Executable programs
- \titem{lib/} Binary system libraries (*.so)
- \titem{msgs/} Translation files (*.msgs)
- \end{description}
- \end{description}
- \titem{/sbin/ejabberdctl} Administration script (see section~\ref{ejabberdctl})
- \titem{/share/doc/ejabberd/} Documentation of ejabberd
- \titem{/var/lib/ejabberd/} Spool directory:
- \begin{description}
- \titem{.erlang.cookie} Erlang cookie file (see section \ref{cookie})
- \titem{acl.DCD, ...} Mnesia database spool files (*.DCD, *.DCL, *.DAT)
- \end{description}
- \titem{/var/log/ejabberd/} Log directory (see section~\ref{logfiles}):
- \begin{description}
- \titem{ejabberd.log} ejabberd service log
- \titem{erlang.log} Erlang/OTP system log
- \end{description}
-\end{description}
-
-
-\makesubsection{start}{Start}
-\ind{install!start}
-
-You can use the \term{ejabberdctl} command line administration script to start and stop \ejabberd{}.
-If you provided the configure option \term{--enable-user=USER} (see \ref{compile}),
-you can execute \term{ejabberdctl} with either that system account or root.
-
-Usage example:
-\begin{verbatim}
-ejabberdctl start
-
-ejabberdctl status
-The node ejabberd@localhost is started with status: started
-ejabberd is running in that node
-
-ejabberdctl stop
-\end{verbatim}
-
-If \term{ejabberd} doesn't start correctly and a crash dump is generated,
-there was a severe problem.
-You can try starting \term{ejabberd} with
-the command \term{ejabberdctl live}
-to see the error message provided by Erlang
-and can identify what is exactly the problem.
-
-Please refer to the section~\ref{ejabberdctl} for details about \term{ejabberdctl},
-and configurable options to fine tune the Erlang runtime system.
-
-If you want ejabberd to be started as daemon at boot time,
-copy \term{ejabberd.init} to something like \term{/etc/init.d/ejabberd}
-(depending on your distribution).
-Create a system user called \term{ejabberd};
-it will be used by the script to start the server.
-Then you can call \term{/etc/inid.d/ejabberd start} as root to start the server.
-
-\makesubsection{bsd}{Specific Notes for BSD}
-\ind{install!bsd}
-
-The command to compile \ejabberd{} in BSD systems is:
-\begin{verbatim}
-gmake
-\end{verbatim}
-
-
-\makesubsection{solaris}{Specific Notes for Sun Solaris}
-\ind{install!solaris}
-
-You need to have \term{GNU install},
-but it isn't included in Solaris.
-It can be easily installed if your Solaris system
-is set up for \footahref{http://www.blastwave.org/}{blastwave.org}
-package repository.
-Make sure \term{/opt/csw/bin} is in your \term{PATH} and run:
-\begin{verbatim}
-pkg-get -i fileutils
-\end{verbatim}
-
-If that program is called \term{ginstall},
-modify the \ejabberd{} \term{Makefile} script to suit your system,
-for example:
-\begin{verbatim}
-cat Makefile | sed s/install/ginstall/ > Makefile.gi
-\end{verbatim}
-And finally install \ejabberd{} with:
-\begin{verbatim}
-gmake -f Makefile.gi ginstall
-\end{verbatim}
-
-
-\makesubsection{windows}{Specific Notes for Microsoft Windows}
-\ind{install!windows}
-
-\makesubsubsection{windowsreq}{Requirements}
-
-To compile \ejabberd{} on a Microsoft Windows system, you need:
-\begin{itemize}
-\item MS Visual C++ 6.0 Compiler
-\item \footahref{http://www.erlang.org/download.html}{Erlang/OTP R11B-5}
-\item \footahref{http://sourceforge.net/project/showfiles.php?group\_id=10127\&package\_id=11277}{Expat 2.0.0 or higher}
-\item
-\footahref{http://www.gnu.org/software/libiconv/}{GNU Iconv 1.9.2}
-(optional)
-\item \footahref{http://www.slproweb.com/products/Win32OpenSSL.html}{Shining Light OpenSSL 0.9.8d or higher}
-(to enable SSL connections)
-\item \footahref{http://www.zlib.net/}{Zlib 1.2.3 or higher}
-\end{itemize}
-
-
-\makesubsubsection{windowscom}{Compilation}
-
-We assume that we will try to put as much library as possible into \verb|C:\sdk\| to make it easier to track what is install for \ejabberd{}.
-
-\begin{enumerate}
-\item Install Erlang emulator (for example, into \verb|C:\sdk\erl5.5.5|).
-\item Install Expat library into \verb|C:\sdk\Expat-2.0.0|
- directory.
-
- Copy file \verb|C:\sdk\Expat-2.0.0\Libs\libexpat.dll|
- to your Windows system directory (for example, \verb|C:\WINNT| or
- \verb|C:\WINNT\System32|)
-\item Build and install the Iconv library into the directory
- \verb|C:\sdk\GnuWin32|.
-
- Copy file \verb|C:\sdk\GnuWin32\bin\lib*.dll| to your
- Windows system directory (more installation instructions can be found in the
- file README.woe32 in the iconv distribution).
-
- Note: instead of copying libexpat.dll and iconv.dll to the Windows
- directory, you can add the directories
- \verb|C:\sdk\Expat-2.0.0\Libs| and
- \verb|C:\sdk\GnuWin32\bin| to the \verb|PATH| environment
- variable.
-\item Install OpenSSL in \verb|C:\sdk\OpenSSL| and add \verb|C:\sdk\OpenSSL\lib\VC| to your path or copy the binaries to your system directory.
-\item Install ZLib in \verb|C:\sdk\gnuWin32|. Copy
- \verb|C:\sdk\GnuWin32\bin\zlib1.dll| to your system directory. If you change your path it should already be set after libiconv install.
-\item Make sure the you can access Erlang binaries from your path. For example: \verb|set PATH=%PATH%;"C:\sdk\erl5.6.5\bin"|
-\item Depending on how you end up actually installing the library you might need to check and tweak the paths in the file configure.erl.
-\item While in the directory \verb|ejabberd\src| run:
-\begin{verbatim}
-configure.bat
-nmake -f Makefile.win32
-\end{verbatim}
-\item Edit the file \verb|ejabberd\src\ejabberd.yml| and run
-\begin{verbatim}
-werl -s ejabberd -name ejabberd
-\end{verbatim}
-\end{enumerate}
-
-%TODO: how to compile database support on windows?
-
-
-\makesection{initialadmin}{Create an XMPP Account for Administration}
-
-You need an XMPP account and grant him administrative privileges
-to enter the \ejabberd{} Web Admin:
-\begin{enumerate}
-\item Register an XMPP account on your \ejabberd{} server, for example \term{admin1@example.org}.
- There are two ways to register an XMPP account:
- \begin{enumerate}
- \item Using \term{ejabberdctl}\ind{ejabberdctl} (see section~\ref{ejabberdctl}):
-\begin{verbatim}
-ejabberdctl register admin1 example.org FgT5bk3
-\end{verbatim}
- \item Using an XMPP client and In-Band Registration (see section~\ref{modregister}).
- \end{enumerate}
-\item Edit the \ejabberd{} configuration file to give administration rights to the XMPP account you created:
-\begin{verbatim}
-acl:
- admin:
- user:
- - "admin1": "example.org"
-access:
- configure:
- admin: allow
-\end{verbatim}
- You can grant administrative privileges to many XMPP accounts,
- and also to accounts in other XMPP servers.
-\item Restart \ejabberd{} to load the new configuration.
-\item Open the Web Admin (\verb|http://server:port/admin/|) in your
- favourite browser. Make sure to enter the \emph{full} JID as username (in this
- example: \jid{admin1@example.org}. The reason that you also need to enter the
- suffix, is because \ejabberd{}'s virtual hosting support.
-\end{enumerate}
-
-\makesection{upgrade}{Upgrading \ejabberd{}}
-
-To upgrade an ejabberd installation to a new version,
-simply uninstall the old version, and then install the new one.
-Of course, it is important that the configuration file
-and Mnesia database spool directory are not removed.
-
-\ejabberd{} automatically updates the Mnesia table definitions at startup when needed.
-If you also use an external database for storage of some modules,
-check if the release notes of the new ejabberd version
-indicates you need to also update those tables.
-
-
-\makechapter{configure}{Configuring \ejabberd{}}
-\ind{configuration file}
-
-\makesection{basicconfig}{Basic Configuration}
-
-The configuration file will be loaded the first time you start \ejabberd{}.
-The configuration file name MUST have ``.yml'' extension. This helps ejabberd
-to differentiate between the new and legacy file formats (see section~\ref{oldconfig}).
-
-Note that \ejabberd{} never edits the configuration file.
-
-The configuration file is written in
-\footahref{http://en.wikipedia.org/wiki/YAML}{YAML}.
-However, different scalars are treated as different types:
-\begin{itemize}
-\item unquoted or single-quoted strings. The type is called \verb|atom()|
- in this document.
- Examples: \verb|dog|, \verb|'Jupiter'|, \verb|'3.14159'|, \verb|YELLOW|.
-\item numeric literals. The type is called \verb|integer()|, \verb|float()| or,
- if both are allowed, \verb|number()|.
- Examples: \verb|3|, \verb|-45.0|, \verb|.0|
-\item double-quoted or folded strings. The type is called \verb|string()|.
- Examples of a double-quoted string:
- \verb|"Lizzard"|, \verb|"orange"|, \verb|"3.14159"|.
- Examples of a folded string:
-\begin{verbatim}
-> Art thou not Romeo,
- and a Montague?
-\end{verbatim}
-\begin{verbatim}
-| Neither, fair saint,
- if either thee dislike.
-\end{verbatim}
-For associative arrays ("mappings") and lists you can use both outline
-indentation and compact syntax (aka ``JSON style''). For example, the following is equivalent:
-\begin{verbatim}
-{param1: ["val1", "val2"], param2: ["val3", "val4"]}
-\end{verbatim}
-and
-\begin{verbatim}
-param1:
- - "val1"
- - "val2"
-param2:
- - "val3"
- - "val4"
-\end{verbatim}
-Note that both styles are used in this document.
-\end{itemize}
-
-\makesubsection{oldconfig}{Legacy Configuration File}
-In previous \ejabberd{} version the configuration file should be written
-in Erlang terms. The format is still supported, but it is highly recommended
-to convert it to the new YAML format using \term{convert\_to\_yaml} command
-from \term{ejabberdctl} (see~\ref{ejabberdctl} and \ref{list-eja-commands} for details).
-
-If you want to specify some options using the old Erlang format,
-you can set them in an additional cfg file, and include it using
-the \option{include\_config\_file} option, see \ref{includeconfigfile}
-for the option description and a related example in \ref{accesscommands}.
-
-If you just want to provide an erlang term inside an option,
-you can use the \term{"> erlangterm."} syntax for embedding erlang terms in a YAML file, for example:
-\begin{verbatim}
-modules:
- mod_cron:
- tasks:
- - time: 10
- units: seconds
- module: mnesia
- function: info
- arguments: "> []."
- - time: 3
- units: seconds
- module: ejabberd_auth
- function: try_register
- arguments: "> [\"user1\", \"localhost\", \"pass\"]."
-\end{verbatim}
-
-\makesubsection{hostnames}{Host Names}
-\ind{options!hosts}\ind{host names}
-
-The option \option{hosts} defines a list containing one or more domains that
-\ejabberd{} will serve.
-
-The syntax is:
-\esyntax{[HostName]}
-
-Examples:
-\begin{itemize}
-\item Serving one domain:
-\begin{verbatim}
-hosts: ["example.org"]
-\end{verbatim}
-\item Serving three domains:
-\begin{verbatim}
-hosts:
- - "example.net"
- - "example.com"
- - "jabber.somesite.org"
-\end{verbatim}
-\end{itemize}
-
-\makesubsection{virtualhost}{Virtual Hosting}
-\ind{virtual hosting}\ind{virtual hosts}\ind{virtual domains}
-
-Options can be defined separately for every virtual host using the
-\term{host\_config} option.
-
-The syntax is: \ind{options!host\_config}
-\esyntax{\{HostName: [Option, ...]\}}
-
-Examples:
-\begin{itemize}
-\item Domain \jid{example.net} is using the internal authentication method while
- domain \jid{example.com} is using the \ind{LDAP}LDAP server running on the
- domain \jid{localhost} to perform authentication:
-\begin{verbatim}
-host_config:
- "example.net"
- auth_method: internal
- "example.com":
- auth_method: ldap
- ldap_servers:
- - "localhost"
- ldap_uids:
- - "uid"
- ldap_rootdn: "dc=localdomain"
- ldap_rootdn: "dc=example,dc=com"
- ldap_password: ""
-\end{verbatim}
-\item Domain \jid{example.net} is using \ind{odbc}ODBC to perform authentication
- while domain \jid{example.com} is using the LDAP servers running on the domains
- \jid{localhost} and \jid{otherhost}:
-\begin{verbatim}
-host_config:
- "example.net":
- auth_method: odbc
- odbc_type: odbc
- odbc_server: "DSN=ejabberd;UID=ejabberd;PWD=ejabberd"
- "example.com":
- auth_method: ldap
- ldap_servers:
- - "localhost"
- - "otherhost"
- ldap_uids:
- - "uid"
- ldap_rootdn: "dc=localdomain"
- ldap_rootdn: "dc=example,dc=com"
- ldap_password: ""
-\end{verbatim}
-\end{itemize}
-
-To define specific ejabberd modules in a virtual host,
-you can define the global \term{modules} option with the common modules,
-and later add specific modules to certain virtual hosts.
-To accomplish that, instead of defining each option in \term{host\_config}
-use \term{append\_host\_config} with the same syntax.
-
-In this example three virtual hosts have some similar modules, but there are also
-other different modules for some specific virtual hosts:
-\begin{verbatim}
-## This ejabberd server has three vhosts:
-hosts:
- - "one.example.org"
- - "two.example.org"
- - "three.example.org"
-
-## Configuration of modules that are common to all vhosts
-modules:
- mod_roster: {}
- mod_configure: {}
- mod_disco: {}
- mod_private: {}
- mod_time: {}
- mod_last: {}
- mod_version: {}
-
-## Add some modules to vhost one:
-append_host_config:
- "one.example.org":
- modules:
- mod_echo:
- host: "echo-service.one.example.org"
- mod_http_bind: {}
- mod_logxml: {}
-
-## Add a module just to vhost two:
-append_host_config:
- "two.example.org":
- modules:
- mod_echo:
- host: "mirror.two.example.org"
-\end{verbatim}
-
-\makesubsection{listened}{Listening Ports}
-\ind{options!listen}
-
-The option \option{listen} defines for which ports, addresses and network protocols \ejabberd{}
-will listen and what services will be run on them. Each element of the list is an
-associative array with the following elements:
-\begin{itemize}
-\item Port number. Optionally also the IP address and/or a transport protocol.
-\item Listening module that serves this port.
-\item Options for the TCP socket and for the listening module.
-\end{itemize}
-
-The option syntax is:
-\esyntax{[Listener, ...]}
-Example:
-\begin{verbatim}
-listen:
- -
- port: 5222
- module: ejabberd_c2s
- starttls: true
- certfile: "/path/to/certfile.pem"
- -
- port: 5269
- module: ejabberd_s2s_in
- transport: tcp
-\end{verbatim}
-
-\makesubsubsection{listened-port}{Port Number, IP Address and Transport Protocol}
-
-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 as a string.
-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.
-When not specified the IP address, it will listen on all IPv4 network addresses.
-
-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|
-\end{itemize}
-
-The transport protocol can be \term{tcp} or \term{udp}.
-Default is \term{tcp}.
-
-
-\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{ciphers}, \texttt{protocol\_options}
- \texttt{max\_ack\_queue}, \texttt{max\_fsm\_queue},
- \texttt{max\_stanza\_size}, \texttt{resend\_on\_timeout},
- \texttt{resume\_timeout}, \texttt{shaper},
- \texttt{starttls}, \texttt{starttls\_required},
- \texttt{stream\_management}, \texttt{tls},
- \texttt{zlib}, \texttt{tls\_compression}
- \titem{\texttt{ejabberd\_s2s\_in}}
- Handles incoming s2s connections.\\
- Options: \texttt{max\_stanza\_size}, \texttt{shaper}, \texttt{tls\_compression}
- \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{max\_fsm\_queue},
- \texttt{service\_check\_from}, \texttt{shaper\_rule}
- \titem{\texttt{ejabberd\_sip}}
- Handles SIP requests as defined in
- \footahref{http://tools.ietf.org/html/rfc3261}{RFC 3261}.\\
- Options: \texttt{certfile}, \texttt{tls}
- \titem{\texttt{ejabberd\_stun}}
- Handles STUN/TURN requests as defined in
- \footahref{http://tools.ietf.org/html/rfc5389}{RFC 5389} and
- \footahref{http://tools.ietf.org/html/rfc5766}{RFC 5766}.\\
- Options: \texttt{certfile}, \texttt{tls}, \texttt{use\_turn}, \texttt{turn\_ip},
- \texttt{turn\_port\_range}, \texttt{turn\_max\_allocations},
- \texttt{turn\_max\_permissions}, \texttt{shaper}, \texttt{server\_name},
- \texttt{auth\_realm}, \texttt{auth\_type}
- \titem{\texttt{ejabberd\_http}}
- Handles incoming HTTP connections.\\
- Options: \texttt{captcha}, \texttt{certfile}, \texttt{default\_host}, \texttt{http\_bind}, \texttt{http\_poll},
- \texttt{request\_handlers}, \texttt{tls}, \texttt{tls\_compression}, \texttt{trusted\_proxies}, \texttt{web\_admin}\\
- \titem{\texttt{ejabberd\_xmlrpc}}
- Handles XML-RPC requests to execute ejabberd commands (\ref{eja-commands}).\\
- Options: \texttt{access\_commands}, \texttt{maxsessions}, \texttt{timeout}.\\
- You can find option explanations, example configuration in old and new format,
- and example calls in several languages in the old
- \footahref{http://www.ejabberd.im/ejabberd\_xmlrpc}{ejabberd\_xmlrpc documentation}.
-\end{description}
-
-
-\makesubsubsection{listened-options}{Options}
-
-This is a detailed description of each option allowed by the listening modules:
-\begin{description}
- \titem{access: AccessName} \ind{options!access}This option defines
- access to the port. The default value is \term{all}.
- \titem{backlog: Value} \ind{options!backlog}The backlog value
- defines the maximum length that the queue of pending connections may
- grow to. This should be increased if the server is going to handle
- lots of new incoming connections as they may be dropped if there is
- no space in the queue (and ejabberd was not able to accept them
- immediately). Default value is 5.
- \titem{captcha: true|false} \ind{options!http-captcha}
- Simple web page that allows a user to fill a CAPTCHA challenge (see section \ref{captcha}).
- \titem{certfile: Path} Full path to a file containing the default SSL certificate.
- To define a certificate file specific for a given domain, use the global option \term{domain\_certfile}.
- \titem{ciphers: Ciphers} OpenSSL ciphers list in the same format accepted by
- `\verb|openssl ciphers|' command.
- \titem{protocol\_options: ProtocolOpts} \ind{options!protocol\_options}
- List of general options relating to SSL/TLS. These map to
- \footahref{https://www.openssl.org/docs/ssl/SSL\_CTX\_set\_options.html}{OpenSSL's set\_options()}.
- For a full list of options available in ejabberd,
- \footahref{https://github.com/processone/tls/blob/master/c\_src/options.h}{see the source}.
- The default entry is: \verb|"no_sslv2"|
- \titem{default\_host: undefined|HostName\}}
- If the HTTP request received by ejabberd contains the HTTP header \term{Host}
- with an ambiguous virtual host that doesn't match any one defined in ejabberd (see \ref{hostnames}),
- then this configured HostName is set as the request Host.
- The default value of this option is: \term{undefined}.
- \titem{hosts: \{Hostname: [HostOption, ...]\}}\ind{options!hosts}
- The external Jabber component that connects to this \term{ejabberd\_service}
- can serve one or more hostnames.
- As \term{HostOption} you can define options for the component;
- currently the only allowed option is the password required to the component
- when attempt to connect to ejabberd: \poption{password: Secret}.
- Note that you cannot define in a single \term{ejabberd\_service} components of
- different services: add an \term{ejabberd\_service} for each service,
- as seen in an example below.
- \titem{http\_bind: true|false} \ind{options!http\_bind}\ind{protocols!XEP-0206: HTTP Binding}\ind{JWChat}\ind{web-based XMPP client}
- This option enables HTTP Binding (\xepref{0124} and \xepref{0206}) support. HTTP Bind
- enables access via HTTP requests to \ejabberd{} from behind firewalls which
- do not allow outgoing sockets on port 5222.
-
- Remember that you must also install and enable the module mod\_http\_bind.
-
- If HTTP Bind is enabled, it will be available at
- \verb|http://server:port/http-bind/|. Be aware that support for HTTP Bind
- is also needed in the \XMPP{} client. Remark also that HTTP Bind can be
- interesting to host a web-based \XMPP{} client such as
- \footahref{http://jwchat.sourceforge.net/}{JWChat}
- (check the tutorials to install JWChat with ejabberd and an
- \footahref{http://www.ejabberd.im/jwchat-localserver}{embedded local web server}
- or \footahref{http://www.ejabberd.im/jwchat-apache}{Apache}).
- \titem{http\_poll: true|false} \ind{options!http\_poll}\ind{protocols!XEP-0025: HTTP Polling}\ind{JWChat}\ind{web-based XMPP client}
- This option enables HTTP Polling (\xepref{0025}) support. HTTP Polling
- enables access via HTTP requests to \ejabberd{} from behind firewalls which
- do not allow outgoing sockets on port 5222.
-
- If HTTP Polling is enabled, it will be available at
- \verb|http://server:port/http-poll/|. Be aware that support for HTTP Polling
- is also needed in the \XMPP{} client. Remark also that HTTP Polling can be
- interesting to host a web-based \XMPP{} client such as
- \footahref{http://jwchat.sourceforge.net/}{JWChat}.
-
- The maximum period of time to keep a client session active without
- an incoming POST request can be configured with the global option
- \term{http\_poll\_timeout}. The default value is five minutes.
- The option can be defined in \term{ejabberd.yml}, expressing the time
- in seconds: \verb|{http_poll_timeout, 300}.|
- \titem{max\_ack\_queue: Size}
- This option specifies the maximum number of unacknowledged stanzas
- queued for possible retransmission if \term{stream\_management} is
- enabled. When the limit is exceeded, the client session is
- terminated. This option can be specified for \term{ejabberd\_c2s}
- listeners. The allowed values are positive integers and
- \term{infinity}. Default value: \term{500}.
- \titem{max\_fsm\_queue: Size}
- This option specifies the maximum number of elements in the queue of the FSM
- (Finite State Machine).
- Roughly speaking, each message in such queues represents one XML
- stanza queued to be sent into its relevant outgoing stream. If queue size
- reaches the limit (because, for example, the receiver of stanzas is too slow),
- the FSM and the corresponding connection (if any) will be terminated
- and error message will be logged.
- The reasonable value for this option depends on your hardware configuration.
- However, there is no much sense to set the size above 1000 elements.
- This option can be specified for \term{ejabberd\_service} and
- \term{ejabberd\_c2s} listeners,
- or also globally for \term{ejabberd\_s2s\_out}.
- If the option is not specified for \term{ejabberd\_service} or
- \term{ejabberd\_c2s} listeners,
- the globally configured value is used.
- The allowed values are integers and 'undefined'.
- Default value: 'undefined'.
- \titem{max\_stanza\_size: Size}
- \ind{options!max\_stanza\_size}This option specifies an
- approximate maximum size in bytes of XML stanzas. Approximate,
- because it is calculated with the precision of one block of read
- data. For example \verb|{max_stanza_size, 65536}|. The default
- value is \term{infinity}. Recommended values are 65536 for c2s
- connections and 131072 for s2s connections. s2s max stanza size
- must always much higher than c2s limit. Change this value with
- extreme care as it can cause unwanted disconnect if set too low.
- \titem{request\_handlers: \{Path: Module\}} To define one or several handlers that will serve HTTP requests.
- The Path is a string; so the URIs that start with that Path will be served by Module.
- For example, if you want \term{mod\_foo} to serve the URIs that start with \term{/a/b/},
- and you also want \term{mod\_http\_bind} to serve the URIs \term{/http-bind/},
- use this option:
-\begin{verbatim}
-request_handlers:
- /"a"/"b": mod_foo
- /"http-bind": mod_http_bind
-\end{verbatim}
- \titem{resend\_on\_timeout: true|false|if\_offline}
- If \term{stream\_management} is enabled and this option is set to
- \term{true}, any stanzas that weren't acknowledged by the client
- will be resent on session timeout. This behavior might often be
- desired, but could have unexpected results under certain
- circumstances. For example, a message that was sent to two resources
- might get resent to one of them if the other one timed out.
- Therefore, the default value for this option is \term{false}, which
- tells ejabberd to generate an error message instead. As an
- alternative, the option may be set to \term{if\_offline}. In this
- case, unacknowledged stanzas are resent only if no other resource is
- online when the session times out. Otherwise, error messages are
- generated. The option can be specified for \term{ejabberd\_c2s}
- listeners.
- \titem{resume\_timeout: Seconds}
- This option configures the number of seconds until a session times
- out if the connection is lost. During this period of time, a client
- may resume the session if \term{stream\_management} is enabled. This
- option can be specified for \term{ejabberd\_c2s} listeners. Setting
- it to \term{0} effectively disables session resumption. The default
- value is \term{300}.
- \titem{service\_check\_from: true|false}
- \ind{options!service\_check\_from}
- This option can be used with \term{ejabberd\_service} only.
- \xepref{0114} requires that the domain must match the hostname of the component.
- If this option is set to \term{false}, \ejabberd{} will allow the component
- to send stanzas with any arbitrary domain in the 'from' attribute.
- Only use this option if you are completely sure about it.
- The default value is \term{true}, to be compliant with \xepref{0114}.
- \titem{shaper: none|ShaperName} \ind{options!shaper}This option defines a
- shaper for the port (see section~\ref{shapers}). The default value
- is \term{none}.
- \titem{shaper\_rule: none|ShaperRule} \ind{options!shaperrule}This option defines a
- shaper rule for the \term{ejabberd\_service} (see section~\ref{shapers}). The recommended value
- is \term{fast}.
- \titem{starttls: true|false} \ind{options!starttls}\ind{STARTTLS}This option
- specifies that STARTTLS encryption is available on connections to the port.
- You should also set the \option{certfile} option.
- You can define a certificate file for a specific domain using the global option \option{domain\_certfile}.
- \titem{starttls\_required: true|false} \ind{options!starttls\_required}This option
- specifies that STARTTLS encryption is required on connections to the port.
- No unencrypted connections will be allowed.
- You should also set the \option{certfile} option.
- You can define a certificate file for a specific domain using the global option \option{domain\_certfile}.
- \titem{stream\_management: true|false}
- Setting this option to \term{false} disables ejabberd's support for
- Stream Management (\xepref{0198}). It can be specified for
- \term{ejabberd\_c2s} listeners. The default value is \term{true}.
- \titem{timeout: Integer} \ind{options!timeout}
- Timeout of the connections, expressed in milliseconds.
- Default: 5000
- \titem{tls: true|false} \ind{options!tls}\ind{TLS}This option specifies that traffic on
- the port will be encrypted using SSL immediately after connecting.
- This was the traditional encryption method in the early Jabber software,
- commonly on port 5223 for client-to-server communications.
- But this method is nowadays deprecated and not recommended.
- The preferable encryption method is STARTTLS on port 5222, as defined
- \footahref{http://xmpp.org/rfcs/rfc6120.html\#tls}{RFC 6120: XMPP Core},
- which can be enabled in \ejabberd{} with the option \term{starttls}.
- If this option is set, you should also set the \option{certfile} option.
- The option \term{tls} can also be used in \term{ejabberd\_http} to support HTTPS.
- \titem{tls\_compression: true|false}
- Whether to enable or disable TLS compression. The default value is \term{true}.
- \titem{trusted\_proxies: all | [IpString]} \ind{options!trusted\_proxies}
- Specify what proxies are trusted when an HTTP request contains the header \term{X-Forwarded-For}
- You can specify \term{all} to allow all proxies, or specify a list of IPs in string format.
- The default value is: \term{["127.0.0.1"]}
- \titem{web\_admin: true|false} \ind{options!web\_admin}\ind{web admin}This option
- enables the Web Admin for \ejabberd{} administration which is available
- at \verb|http://server:port/admin/|. Login and password are the username and
- password of one of the registered users who are granted access by the
- `configure' access rule.
- \titem{zlib: true|false} \ind{options!zlib}\ind{protocols!XEP-0138: Stream Compression}\ind{Zlib}This
- option specifies that Zlib stream compression (as defined in \xepref{0138})
- is available on connections to the port.
-\end{description}
-
-There are some additional global options that can be specified in the ejabberd configuration file (outside \term{listen}):
-\begin{description}
- \titem{s2s\_use\_starttls: false|optional|required|required\_trusted}
- \ind{options!s2s\_use\_starttls}\ind{STARTTLS}This option defines if
- s2s connections don't use STARTTLS encryption; if STARTTLS can be used optionally;
- if STARTTLS is required to establish the connection;
- or if STARTTLS is required and the remote certificate must be valid and trusted.
- The default value is to not use STARTTLS: \term{false}.
- \titem{s2s\_certfile: Path} \ind{options!s2s\_certificate}Full path to a
- file containing a SSL certificate.
- \titem{domain\_certfile: Path} \ind{options!domain\_certfile}
- Full path to the file containing the SSL certificate for a specific domain.
- \titem{s2s\_ciphers: Ciphers} \ind{options!s2s\_ciphers} OpenSSL ciphers list
- in the same format accepted by `\verb|openssl ciphers|' command.
- \titem{s2s\_protocol\_options: ProtocolOpts} \ind{options!s2s\_protocol\_options}
- List of general options relating to SSL/TLS. These map to
- \footahref{https://www.openssl.org/docs/ssl/SSL\_CTX\_set\_options.html}{OpenSSL's set\_options()}.
- For a full list of options available in ejabberd,
- \footahref{https://github.com/processone/tls/blob/master/c\_src/options.h}{see the source}.
- The default entry is: \verb|"no_sslv2"|
- \titem{outgoing\_s2s\_families: [Family, ...]} \ind{options!outgoing\_s2s\_families}
- Specify which address families to try, in what order.
- By default it first tries connecting with IPv4, if that fails it tries using IPv6.
- \titem{outgoing\_s2s\_timeout: Timeout} \ind{options!outgoing\_s2s\_timeout}
- The timeout in milliseconds for outgoing S2S connection attempts.
- \titem{s2s\_dns\_timeout: Timeout} \ind{options!s2s\_dns\_timeout}
- The timeout in seconds for DNS resolving. The default value is \term{10}.
- \titem{s2s\_dns\_retries: Number} \ind{options!s2s\_dns\_retries}
- DNS resolving retries in seconds. The default value is \term{2}.
- \titem{s2s\_policy: Access} \ind{options!s2s\_policy}
- The policy for incoming and outgoing s2s connections to other XMPP servers.
- The default value is \term{all}.
- \titem{s2s\_max\_retry\_delay: Seconds} \ind{options!s2s\_max\_retry\_delay}
- The maximum allowed delay for retry to connect after a failed connection attempt.
- Specified in seconds. The default value is 300 seconds (5 minutes).
- \titem{s2s\_tls\_compression: true|false}
- Whether to enable or disable TLS compression for s2s connections.
- The default value is \term{true}.
- \titem{max\_fsm\_queue: Size}
- This option specifies the maximum number of elements in the queue of the FSM
- (Finite State Machine).
- Roughly speaking, each message in such queues represents one XML
- stanza queued to be sent into its relevant outgoing stream. If queue size
- reaches the limit (because, for example, the receiver of stanzas is too slow),
- the FSM and the corresponding connection (if any) will be terminated
- and error message will be logged.
- The reasonable value for this option depends on your hardware configuration.
- However, there is no much sense to set the size above 1000 elements.
- This option can be specified for \term{ejabberd\_service} and
- \term{ejabberd\_c2s} listeners,
- or also globally for \term{ejabberd\_s2s\_out}.
- If the option is not specified for \term{ejabberd\_service} or
- \term{ejabberd\_c2s} listeners,
- the globally configured value is used.
- The allowed values are integers and 'undefined'.
- Default value: 'undefined'.
- \titem{route\_subdomains: local|s2s}
- Defines if ejabberd must route stanzas directed to subdomains locally (compliant with
- \footahref{http://xmpp.org/rfcs/rfc6120.html\#rules-local}{RFC 6120 Local Domain rules}),
- or to foreign server using S2S (compliant with
- \footahref{http://xmpp.org/rfcs/rfc6120.html\#rules-remote}{RFC 6120 Remote Domain rules}).
-\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}.
-However, the c2s and s2s connections to the domain \term{example.com} use the file \term{example\_com.pem}.
-\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. The socket is set for IPv6 instead of IPv4.
-\item Port 3478 listens for STUN requests over UDP.
-\item Port 5280 listens for HTTP requests, and serves the HTTP Poll service.
-\item Port 5281 listens for HTTP requests, using HTTPS to serve HTTP-Bind (BOSH) and the Web Admin as explained in
- 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"
-
-listen:
- -
- port: 5222
- module: ejabberd_c2s
- access: c2s
- shaper: c2s_shaper
- starttls: true
- certfile: "/etc/ejabberd/server.pem"
- max_stanza_size: 65536
- -
- port: 5223
- module: ejabberd_c2s
- access: c2s
- shaper: c2s_shaper
- tls: true
- certfile: "/etc/ejabberd/server.pem"
- max_stanza_size: 65536
- -
- port: 5269
- ip: "::"
- module: ejabberd_s2s_in
- shaper: s2s_shaper
- max_stanza_size: 131072
- -
- port: 3478
- transport: udp
- module: ejabberd_stun
- -
- port: 5280
- module: ejabberd_http
- http_poll: true
- -
- port: 5281
- ip: "127.0.0.1"
- module: ejabberd_http
- web_admin: true
- http_bind: true
- tls: true
- certfile: "/etc/ejabberd/server.pem"
-
-s2s_use_starttls: optional
-s2s_certfile: "/etc/ejabberd/server.pem"
-host_config:
- "example.com":
- domain_certfile: "/etc/ejabberd/example_com.pem"
-outgoing_s2s_families:
- - ipv4
- - ipv6
-outgoing_s2s_timeout: 10000
-\end{verbatim}
-
-In this example, the following configuration defines that:
-\begin{itemize}
-\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 (all IPv4 addresses)
- with STARTTLS for secured traffic strictly required, and the certificates are verified.
- Incoming and outgoing connections of remote XMPP 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
- 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 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}'.
-\item \ind{transports!MSN}The
- \footahref{http://www.ejabberd.im/pymsnt}{MSN transport}
- \jid{msn.example.org} is connected to port 5235 with password
- `\term{msnsecret}'.
-\item \ind{transports!Yahoo}The
- \footahref{http://www.ejabberd.im/yahoo-transport-2}{Yahoo! transport}
- \jid{yahoo.example.org} is connected to port 5236 with password
- `\term{yahoosecret}'.
-\item \ind{transports!Gadu-Gadu}The \footahref{http://www.ejabberd.im/jabber-gg-transport}{Gadu-Gadu transport} \jid{gg.example.org} is
- connected to port 5237 with password `\term{ggsecret}'.
-\item \ind{transports!email notifier}The
- \footahref{http://www.ejabberd.im/jmc}{Jabber Mail Component}
- \jid{jmc.example.org} is connected to port 5238 with password
- `\term{jmcsecret}'.
-\item The service custom has enabled the special option to avoiding checking the \term{from} attribute in the packets send by this component. The component can send packets in behalf of any users from the server, or even on behalf of any server.
-\end{itemize}
-\begin{verbatim}
-acl:
- blocked:
- user: "bad"
- trusted_servers:
- server:
- - "example.com"
- - "jabber.example.org"
- xmlrpc_bot:
- user:
- - "xmlrpc-robot": "example.org"
-shaper:
- normal: 1000
-access:
- c2s:
- blocked: deny
- all: allow
- c2s_shaper:
- admin: none
- all: normal
- xmlrpc_access:
- xmlrpc_bot: allow
- s2s:
- trusted_servers: allow
- all: deny
-s2s_certfile: "/path/to/ssl.pem"
-s2s_access: s2s
-s2s_use_starttls: required_trusted
-listen:
- -
- port: 5222
- module: ejabberd_c2s
- shaper: c2s_shaper
- access: c2s
- -
- ip: "192.168.0.1"
- port: 5223
- module: ejabberd_c2s
- certfile: "/path/to/ssl.pem"
- tls: true
- access: c2s
- -
- ip: "FDCA:8AB6:A243:75EF::1"
- port: 5223
- module: ejabberd_c2s
- certfile: "/path/to/ssl.pem"
- tls: true
- access: c2s
- -
- port: 5269
- module: ejabberd_s2s_in
- -
- port: 5280
- module: ejabberd_http
- web_admin: true
- http_poll: true
- -
- port: 4560
- module: ejabberd_xmlrpc
- -
- ip: "127.0.0.1"
- port: 5233
- module: ejabberd_service
- hosts:
- "aim.example.org":
- password: "aimsecret"
- -
- ip: "::1"
- port: 5233
- module: ejabberd_service
- hosts:
- "aim.example.org":
- password: "aimsecret"
- -
- port: 5234
- module: ejabberd_service
- hosts:
- "icq.example.org":
- password: "jitsecret"
- "sms.example.org":
- password: "jitsecret"
- -
- port: 5235
- module: ejabberd_service
- hosts:
- "msn.example.org":
- password: "msnsecret"
- -
- port: 5236
- module: ejabberd_service
- hosts:
- "yahoo.example.org":
- password: "yahoosecret"
- -
- port: 5237
- module: ejabberd_service
- hosts:
- "gg.example.org":
- password: "ggsecret"
- -
- port: 5238
- module: ejabberd_service
- hosts:
- "jmc.example.org":
- password: "jmcsecret"
- -
- port: 5239
- module: ejabberd_service
- service_check_from: false
- hosts:
- "custom.example.org":
- password: "customsecret"
-\end{verbatim}
-Note, that for services based in \ind{jabberd14}jabberd14 or \ind{WPJabber}WPJabber
-you have to make the transports log and do \ind{XDB}XDB by themselves:
-\begin{verbatim}
- <!--
- You have to add elogger and rlogger entries here when using ejabberd.
- In this case the transport will do the logging.
- -->
-
- <log id='logger'>
- <host/>
- <logtype/>
- <format>%d: [%t] (%h): %s</format>
- <file>/var/log/jabber/service.log</file>
- </log>
-
- <!--
- Some XMPP server implementations do not provide
- XDB services (for example, jabberd2 and ejabberd).
- xdb_file.so is loaded in to handle all XDB requests.
- -->
-
- <xdb id="xdb">
- <host/>
- <load>
- <!-- this is a lib of wpjabber or jabberd14 -->
- <xdb_file>/usr/lib/jabber/xdb_file.so</xdb_file>
- </load>
- <xdb_file xmlns="jabber:config:xdb_file">
- <spool><jabberd:cmdline flag='s'>/var/spool/jabber</jabberd:cmdline></spool>
- </xdb_file>
- </xdb>
-\end{verbatim}
-
-\makesubsection{auth}{Authentication}
-\ind{authentication}\ind{options!auth\_method}
-
-The option \option{auth\_method} defines the authentication methods that are used
-for user authentication. The syntax is:
-\esyntax{[Method, ...]}
-
-The following authentication methods are supported by \ejabberd{}:
-\begin{itemize}
-\item internal (default) --- See section~\ref{internalauth}.
-\item external --- See section~\ref{extauth}.
-\item ldap --- See section~\ref{ldap}.
-\item odbc --- See section~\ref{odbc}.
-\item anonymous --- See section~\ref{saslanonymous}.
-\item pam --- See section~\ref{pam}.
-\end{itemize}
-
-Account creation is only supported by internal, external and odbc methods.
-
-The option \option{resource\_conflict} defines the action when a client attempts to
-login to an account with a resource that is already connected.
-The option syntax is:
-\esyntax{resource\_conflict: setresource|closenew|closeold}
-The possible values match exactly the three possibilities described in
-\footahref{http://tools.ietf.org/html/rfc6120\#section-7.7.2.2}{XMPP Core: section 7.7.2.2}.
-The default value is \term{closeold}.
-If the client uses old Jabber Non-SASL authentication (\xepref{0078}),
-then this option is not respected, and the action performed is \term{closeold}.
-
-The option \option{fqdn} allows you to define the Fully Qualified Domain Name
-of the machine, in case it isn't detected automatically.
-The FQDN is used to authenticate some clients that use the DIGEST-MD5 SASL mechanism.
-The option syntax is:
-\esyntax{fqdn: undefined|FqdnString|[FqdnString]}
-
-The option \option{disable\_sasl\_mechanisms} specifies a list of SASL
-mechanisms that should \emph{not} be offered to the client. The mechanisms can
-be listed as lowercase or uppercase strings. The option syntax is:
-\esyntax{disable\_sasl\_mechanisms: [Mechanism, ...]}
-
-\makesubsubsection{internalauth}{Internal}
-\ind{internal authentication}\ind{Mnesia}
-
-\ejabberd{} uses its internal Mnesia database as the default authentication method.
-The value \term{internal} will enable the internal authentication method.
-
-The option \term{auth\_password\_format: plain|scram}
-defines in what format the users passwords are stored:
-\begin{description}
- \titem{plain}
- The password is stored as plain text in the database.
- This is risky because the passwords can be read if your database gets compromised.
- This is the default value.
- This format allows clients to authenticate using:
- the old Jabber Non-SASL (\xepref{0078}), \term{SASL PLAIN},
- \term{SASL DIGEST-MD5}, and \term{SASL SCRAM-SHA-1}.
-
- \titem{scram}
- The password is not stored, only some information that allows to verify the hash provided by the client.
- It is impossible to obtain the original plain password from the stored information;
- for this reason, when this value is configured it cannot be changed to \term{plain} anymore.
- This format allows clients to authenticate using: \term{SASL PLAIN} and \term{SASL SCRAM-SHA-1}.
-\end{description}
-
-Examples:
-\begin{itemize}
-\item To use internal authentication on \jid{example.org} and LDAP
- authentication on \jid{example.net}:
-\begin{verbatim}
-host_config:
- "example.org":
- auth_method: [internal]
- "example.net":
- auth_method: [ldap]
-\end{verbatim}
-\item To use internal authentication with hashed passwords on all virtual hosts:
-\begin{verbatim}
-auth_method: internal
-auth_password_format: scram
-\end{verbatim}
-\end{itemize}
-
-\makesubsubsection{extauth}{External Script}
-\ind{external authentication}
-
-In this authentication method, when \ejabberd{} starts,
-it start a script, and calls it to perform authentication tasks.
-
-The server administrator can write the external authentication script
-in any language.
-The details on the interface between ejabberd and the script are described
-in the \term{ejabberd Developers Guide}.
-There are also \footahref{http://www.ejabberd.im/extauth}{several example authentication scripts}.
-
-These are the specific options:
-\begin{description}
- \titem{extauth\_program: PathToScript}
- Indicate in this option the full path to the external authentication script.
- The script must be executable by ejabberd.
-
- \titem{extauth\_instances: Integer}
- Indicate how many instances of the script to run simultaneously to serve authentication in the virtual host.
- The default value is the minimum number: 1.
-
- \titem{extauth\_cache: false|CacheTimeInteger}
- The value \term{false} disables the caching feature, this is the default.
- The integer \term{0} (zero) enables caching for statistics, but doesn't use that cached information to authenticate users.
- If another integer value is set, caching is enabled both for statistics and for authentication:
- the CacheTimeInteger indicates the number of seconds that ejabberd can reuse
- the authentication information since the user last disconnected,
- to verify again the user authentication without querying again the extauth script.
- Note: caching should not be enabled in a host if internal auth is also enabled.
- If caching is enabled, \term{mod\_last} must be enabled also in that vhost.
-\end{description}
-
-This example sets external authentication, the extauth script, enables caching for 10 minutes,
-and starts three instances of the script for each virtual host defined in ejabberd:
-\begin{verbatim}
-auth_method: [external]
-extauth_program: "/etc/ejabberd/JabberAuth.class.php"
-extauth_cache: 600
-extauth_instances: 3
-\end{verbatim}
-
-
-\makesubsubsection{saslanonymous}{Anonymous Login and SASL Anonymous}
-\ind{sasl anonymous}\ind{anonymous login}
-
-The \term{anonymous} authentication method enables two modes for anonymous authentication:
-\begin{description}
-\titem{Anonymous login:} This is a standard login, that use the
- classical login and password mechanisms, but where password is
- accepted or preconfigured for all anonymous users. This login is
- compliant with SASL authentication, password and digest non-SASL
- authentication, so this option will work with almost all XMPP
- clients
-
-\titem{SASL Anonymous:} This is a special SASL authentication
- mechanism that allows to login without providing username or
- password (see \xepref{0175}). The main advantage of SASL Anonymous
- is that the protocol was designed to give the user a login. This is
- useful to avoid in some case, where the server has many users
- already logged or registered and when it is hard to find a free
- username. The main disavantage is that you need a client that
- specifically supports the SASL Anonymous protocol.
-\end{description}
-
-%TODO: introduction; tell what people can do with this
-The anonymous authentication method can be configured with the following
-options. Remember that you can use the \term{host\_config} option to set virtual
-host specific options (see section~\ref{virtualhost}).
-
-\begin{description}
-\titem{allow\_multiple\_connections: false|true} This option is only used
- when the anonymous mode is
- enabled. Setting it to \term{true} means that the same username can be taken
- multiple times in anonymous login mode if different resource are used to
- connect. This option is only useful in very special occasions. The default
- value is \term{false}.
-\titem{anonymous\_protocol: login\_anon | sasl\_anon | both}
- \term{login\_anon} means that the anonymous login method will be used.
- \term{sasl\_anon} means that the SASL Anonymous method will be used.
- \term{both} means that SASL Anonymous and login anonymous are both enabled.
-\end{description}
-
-Those options are defined for each virtual host with the \term{host\_config}
-parameter (see section~\ref{virtualhost}).
-
-Examples:
-\begin{itemize}
-\item To enable anonymous login on all virtual hosts:
-\begin{verbatim}
-auth_method: [anonymous]
-anonymous_protocol: login_anon
-\end{verbatim}
-\item Similar as previous example, but limited to \jid{public.example.org}:
-\begin{verbatim}
-host_config:
- "public.example.org":
- auth_method: [anonymous]
- anonymous_protoco: login_anon
-\end{verbatim}
-\item To enable anonymous login and internal authentication on a virtual host:
-\begin{verbatim}
-host_config:
- "public.example.org":
- auth_method:
- - internal
- - anonymous
- anonymous_protocol: login_anon
-\end{verbatim}
-\item To enable SASL Anonymous on a virtual host:
-\begin{verbatim}
-host_config:
- "public.example.org":
- auth_method: [anonymous]
- anonymous_protocol: sasl_anon
-\end{verbatim}
-\item To enable SASL Anonymous and anonymous login on a virtual host:
-\begin{verbatim}
-host_config:
- "public.example.org":
- auth_method: [anonymous]
- anonymous_protocol: both
-\end{verbatim}
-\item To enable SASL Anonymous, anonymous login, and internal authentication on
-a virtual host:
-\begin{verbatim}
-host_config:
- "public.example.org":
- auth_method:
- - internal
- - anonymous
- anonymous_protocol: both
-\end{verbatim}
-\end{itemize}
-
-There are more configuration examples and XMPP client example stanzas in
-\footahref{http://www.ejabberd.im/Anonymous-users-support}{Anonymous users support}.
-
-
-\makesubsubsection{pam}{PAM Authentication}
-\ind{PAM authentication}\ind{Pluggable Authentication Modules}
-
-\ejabberd{} supports authentication via Pluggable Authentication Modules (PAM).
-PAM is currently supported in AIX, FreeBSD, HP-UX, Linux, Mac OS X, NetBSD and Solaris.
-PAM authentication is disabled by default, so you have to configure and compile
-\ejabberd{} with PAM support enabled:
-\begin{verbatim}
-./configure --enable-pam && make install
-\end{verbatim}
-
-Options:
-\begin{description}
-\titem{pam\_service: Name}\ind{options!pam\_service}This option defines the PAM service name.
-Default is \term{"ejabberd"}. Refer to the PAM documentation of your operation system
-for more information.
-\titem{pam\_userinfotype: username|jid}\ind{options!pam\_userinfotype}
-This option defines what type of information about the user ejabberd
-provides to the PAM service: only the username, or the user JID.
-Default is \term{username}.
-\end{description}
-
-Example:
-\begin{verbatim}
-auth_method: [pam]
-pam_service: "ejabberd"
-\end{verbatim}
-
-Though it is quite easy to set up PAM support in \ejabberd{}, PAM itself introduces some
-security issues:
-
-\begin{itemize}
-\item To perform PAM authentication \ejabberd{} uses external C-program called
-\term{epam}. By default, it is located in \verb|/var/lib/ejabberd/priv/bin/|
-directory. You have to set it root on execution in the case when your PAM module
-requires root privileges (\term{pam\_unix.so} for example). Also you have to grant access
-for \ejabberd{} to this file and remove all other permissions from it.
-Execute with root privileges:
-\begin{verbatim}
-chown root:ejabberd /var/lib/ejabberd/priv/bin/epam
-chmod 4750 /var/lib/ejabberd/priv/bin/epam
-\end{verbatim}
-\item Make sure you have the latest version of PAM installed on your system.
-Some old versions of PAM modules cause memory leaks. If you are not able to use the latest
-version, you can \term{kill(1)} \term{epam} process periodically to reduce its memory
-consumption: \ejabberd{} will restart this process immediately.
-\item \term{epam} program tries to turn off delays on authentication failures.
-However, some PAM modules ignore this behavior and rely on their own configuration options.
-You can create a configuration file \term{ejabberd.pam}.
-This example shows how to turn off delays in \term{pam\_unix.so} module:
-\begin{verbatim}
-#%PAM-1.0
-auth sufficient pam_unix.so likeauth nullok nodelay
-account sufficient pam_unix.so
-\end{verbatim}
-That is not a ready to use configuration file: you must use it
-as a hint when building your own PAM configuration instead. Note that if you want to disable
-delays on authentication failures in the PAM configuration file, you have to restrict access
-to this file, so a malicious user can't use your configuration to perform brute-force
-attacks.
-\item You may want to allow login access only for certain users. \term{pam\_listfile.so}
-module provides such functionality.
-\item If you use \term{pam\_winbind} to authorise against a Windows Active Directory,
-then \term{/etc/nsswitch.conf} must be configured to use \term{winbind} as well.
-\end{itemize}
-
-\makesubsection{accessrules}{Access Rules}
-\ind{access rules}\ind{ACL}\ind{Access Control List}
-
-\makesubsubsection{ACLDefinition}{ACL Definition}
-\ind{ACL}\ind{options!acl}\ind{ACL}\ind{Access Control List}
-
-Access control in \ejabberd{} is performed via Access Control Lists (ACLs). The
-declarations of ACLs in the configuration file have the following syntax:
-\esyntax{acl: \{ ACLName: \{ ACLType: ACLValue \} \}}
-
-\term{ACLType: ACLValue} can be one of the following:
-\begin{description}
-\titem{all} Matches all JIDs. Example:
-\begin{verbatim}
-acl:
- world: all
-\end{verbatim}
-\titem{user: Username} Matches the user with the name
- \term{Username} at the first virtual host. Example:
-\begin{verbatim}
-acl:
- admin:
- user: "yozhik"
-\end{verbatim}
-\titem{user: \{Username: Server\}} Matches the user with the JID
- \term{Username@Server} and any resource. Example:
-\begin{verbatim}
-acl:
- admin:
- user:
- "yozhik": "example.org"
-\end{verbatim}
-\titem{server: Server} Matches any JID from server
- \term{Server}. Example:
-\begin{verbatim}
-acl:
- exampleorg:
- server: "example.org"
-\end{verbatim}
-\titem{resource: Resource} Matches any JID with a resource
- \term{Resource}. Example:
-\begin{verbatim}
-acl:
- mucklres:
- resource: "muckl"
-\end{verbatim}
-\titem{shared\_group: Groupname} Matches any member of a Shared Roster Group with name \term{Groupname} in the virtual host. Example:
-\begin{verbatim}
-acl:
- techgroupmembers:
- shared_group: "techteam"
-\end{verbatim}
-\titem{shared\_group: \{Groupname: Server\}} Matches any member of a Shared Roster Group with name \term{Groupname} in the virtual host \term{Server}. Example:
-\begin{verbatim}
-acl:
- techgroupmembers:
- shared_group:
- "techteam": "example.org"
-\end{verbatim}
-\titem{ip: Network} Matches any IP address from the \term{Network}. Example:
-\begin{verbatim}
-acl:
- loopback:
- ip:
- - "127.0.0.0/8"
- - "::1"
-\end{verbatim}
-\titem{user\_regexp: Regexp} Matches any local user with a name that
- matches \term{Regexp} on local virtual hosts. Example:
-\begin{verbatim}
-acl:
- tests:
- user_regexp: "^test[0-9]*$"
-\end{verbatim}
-%$
-\titem{user\_regexp: \{Regexp: Server\}} Matches any user with a name
- that matches \term{Regexp} at server \term{Server}. Example:
-\begin{verbatim}
-acl:
- tests:
- user_regexp:
- "^test": "example.org"
-\end{verbatim}
-\titem{server\_regexp: Regexp} Matches any JID from the server that
- matches \term{Regexp}. Example:
-\begin{verbatim}
-acl:
- icq:
- server_regexp: "^icq\\."
-\end{verbatim}
-\titem{resource\_regexp: Regexp} Matches any JID with a resource that
- matches \term{Regexp}. Example:
-\begin{verbatim}
-acl:
- icq:
- resource_regexp: "^laptop\\."
-\end{verbatim}
-\titem{node\_regexp: \{UserRegexp: ServerRegexp\}} Matches any user
- with a name that matches \term{UserRegexp} at any server that matches
- \term{ServerRegexp}. Example:
-\begin{verbatim}
-acl:
- yozhik:
- node_regexp:
- "^yozhik$": "^example.(com|org)$"
-\end{verbatim}
-\titem{user\_glob: Glob\}}
-\titem{user\_glob: \{Glob: Server\}}
-\titem{server\_glob: Glob}
-\titem{resource\_glob: Glob}
-\titem{node\_glob: \{UserGlob: ServerGlob\}} This is the same as
- above. However, it uses shell glob patterns instead of regexp. These patterns
- can have the following special characters:
- \begin{description}
- \titem{*} matches any string including the null string.
- \titem{?} matches any single character.
- \titem{[...]} matches any of the enclosed characters. Character
- ranges are specified by a pair of characters separated by a \term{`-'}.
- If the first character after \term{`['} is a \term{`!'}, any
- character not enclosed is matched.
- \end{description}
-\end{description}
-
-The following \term{ACLName} are pre-defined:
-\begin{description}
-\titem{all} Matches any JID.
-\titem{none} Matches no JID.
-\end{description}
-
-\makesubsubsection{AccessRights}{Access Rights}
-\ind{access}\ind{ACL}\ind{options!acl}\ind{ACL}\ind{Access Control List}
-
-An entry allowing or denying access to different services.
-The syntax is:
-\esyntax{access: \{ AccessName: \{ ACLName: allow|deny \} \}}
-
-When a JID is checked to have access to \term{Accessname}, the server
-sequentially checks if that JID matches any of the ACLs that are named in the
-first elements of the tuples in the list. If it matches, the second element of
-the first matched tuple is returned, otherwise the value `\term{deny}' is
-returned.
-
-If you define specific Access rights in a virtual host,
-remember that the globally defined Access rights have precedence over those.
-This means that, in case of conflict, the Access granted or denied in the global server is used
-and the Access of a virtual host doesn't have effect.
-
-Example:
-\begin{verbatim}
-access:
- configure:
- admin: allow
- something
- badmans: deny
- all: allow
-\end{verbatim}
-
-The following \term{AccessName} are pre-defined:
-\begin{description}
-\titem{all} Always returns the value `\term{allow}'.
-\titem{none} Always returns the value `\term{deny}'.
-\end{description}
-
-\makesubsubsection{configmaxsessions}{Limiting Opened Sessions with ACL}
-\ind{options!max\_user\_sessions}
-
-The special access \term{max\_user\_sessions} specifies the maximum
-number of sessions (authenticated connections) per user. If a user
-tries to open more sessions by using different resources, the first
-opened session will be disconnected. The error \term{session replaced}
-will be sent to the disconnected session. The value for this option
-can be either a number, or \term{infinity}. The default value is
-\term{infinity}.
-
-The syntax is:
-\esyntax{\{ max\_user\_sessions: \{ ACLName: MaxNumber \} \}}
-
-This example limits the number of sessions per user to 5 for all users, and to 10 for admins:
-\begin{verbatim}
-access:
- max_user_sessions:
- admin: 10
- all: 5
-\end{verbatim}
-
-\makesubsubsection{configmaxs2sconns}{Several connections to a remote XMPP server with ACL}
-\ind{options!max\_s2s\_connections}
-
-The special access \term{max\_s2s\_connections} specifies how many
-simultaneous S2S connections can be established to a specific remote XMPP server.
-The default value is \term{1}.
-There's also available the access \term{max\_s2s\_connections\_per\_node}.
-
-The syntax is:
-\esyntax{\{ max\_s2s\_connections: \{ ACLName: MaxNumber \} \}}
-
-Examples:
-\begin{itemize}
-\item Allow up to 3 connections with each remote server:
-\begin{verbatim}
-access:
- max_s2s_connections:
- all: 3
-\end{verbatim}
-\end{itemize}
-
-\makesubsection{shapers}{Shapers}
-\ind{options!shaper}\ind{shapers}\ind{traffic speed}
-
-Shapers enable you to limit connection traffic.
-The syntax is:
-\esyntax{shaper: \{ ShaperName: Rate \}}
-where \term{Rate} stands for the maximum allowed incoming rate in bytes per
-second.
-When a connection exceeds this limit, \ejabberd{} stops reading from the socket
-until the average rate is again below the allowed maximum.
-
-Examples:
-\begin{itemize}
-\item To define a shaper named `\term{normal}' with traffic speed limited to
-1,000\,bytes/second:
-\begin{verbatim}
-shaper:
- normal: 1000
-\end{verbatim}
-\item To define a shaper named `\term{fast}' with traffic speed limited to
-50,000\,bytes/second:
-\begin{verbatim}
-shaper:
- fast: 50000
-\end{verbatim}
-\end{itemize}
-
-\makesubsection{language}{Default Language}
-\ind{options!language}\ind{language}
-
-The option \option{language} defines the default language of server strings that
-can be seen by \XMPP{} clients. If a \XMPP{} client does not support
-\option{xml:lang}, the specified language is used.
-
-The option syntax is:
-\esyntax{language: Language}
-
-The default value is \term{en}.
-In order to take effect there must be a translation file
-\term{Language.msg} in \ejabberd{}'s \term{msgs} directory.
-
-For example, to set Russian as default language:
-\begin{verbatim}
-language: "ru"
-\end{verbatim}
-
-Appendix \ref{i18ni10n} provides more details about internationalization and localization.
-
-
-\makesubsection{captcha}{CAPTCHA}
-\ind{options!captcha}\ind{captcha}
-
-Some \ejabberd{} modules can be configured to require a CAPTCHA challenge on certain actions.
-If the client does not support CAPTCHA Forms (\xepref{0158}),
-a web link is provided so the user can fill the challenge in a web browser.
-
-An example script is provided that generates the image
-using ImageMagick's Convert program.
-
-The configurable options are:
-\begin{description}
- \titem{captcha\_cmd: Path}
- Full path to a script that generates the image.
- The default value disables the feature: \term{undefined}
- \titem{captcha\_host: ProtocolHostPort}
- ProtocolHostPort is a string with the host, and optionally the Protocol and Port number.
- It must identify where ejabberd listens for CAPTCHA requests.
- The URL sent to the user is formed by: \term{Protocol://Host:Port/captcha/}
- The default value is: protocol \term{http}, the first hostname configured, and port \term{80}.
- If you specify a port number that does not match exactly an ejabberd listener
- (because you are using a reverse proxy or other port-forwarding tool),
- then you must specify the transfer protocol, as seen in the example below.
-\end{description}
-
-Additionally, an \term{ejabberd\_http} listener must be enabled with the \term{captcha} option.
-See section \ref{listened-module}.
-
-Example configuration:
-\begin{verbatim}
-hosts: ["example.org"]
-
-captcha_cmd: "/lib/ejabberd/priv/bin/captcha.sh"
-captcha_host: "example.org:5280"
-## captcha_host: "https://example.org:443"
-## captcha_host: "http://example.com"
-
-listen:
- ...
- -
- port: 5280
- module: ejabberd_http
- captcha: true
- ...
-\end{verbatim}
-
-\makesubsection{stun}{STUN and TURN}
-\ind{options!stun}\ind{stun}
-
-\ejabberd{} is able to act as a stand-alone STUN/TURN server
-(\footahref{http://tools.ietf.org/html/rfc5389}{RFC 5389}/\footahref{http://tools.ietf.org/html/rfc5766}{RFC 5766}). In that role \ejabberd{} helps clients with ICE (\footahref{http://tools.ietf.org/html/rfc5245}{RFC 5245}) or Jingle ICE (\xepref{0176}) support to discover their external addresses and ports and to relay media traffic when it is impossible to establish direct
-peer-to-peer connection.
-
-You should configure \term{ejabberd\_stun} listening module as described in \ref{listened} section.
-The specific configurable options are:
-\begin{description}
- \titem{tls: true|false}
- If enabled, \option{certfile} option must be set, otherwise \ejabberd{}
- will not be able to accept TLS connections. Obviously, this option
- makes sense for \term{tcp} transport only. The default is \term{false}.
- \titem{certfile: Path}
- Path to the certificate file. Only makes sense when \option{tls} is set.
- \titem{use\_turn: true|false}
- Enables/disables TURN (media relay) functionality. The default is \term{false}.
- \titem{turn\_ip: String}
- The IPv4 address advertised by your TURN server. The address should not be NAT'ed
- or firewalled. There is not default, so you should set this option explicitly.
- Implies \term{use\_turn}.
- \titem{turn\_min\_port: Integer}
- Together with \option{turn\_max\_port} forms port range to allocate from.
- The default is 49152. Implies \term{use\_turn}.
- \titem{turn\_max\_port: Integer}
- Together with \option{turn\_min\_port} forms port range to allocate from.
- The default is 65535. Implies \term{use\_turn}.
- \titem{turn\_max\_allocations: Integer|infinity}
- Maximum number of TURN allocations available from the particular IP address.
- The default value is 10. Implies \term{use\_turn}.
- \titem{turn\_max\_permissions: Integer|infinity}
- Maximum number of TURN permissions available from the particular IP address.
- The default value is 10. Implies \term{use\_turn}.
- \titem{auth\_type: user|anonymous}
- Which authentication type to use for TURN allocation requests. When type \term{user}
- is set, ejabberd authentication backend is used. For \term{anonymous} type
- no authentication is performed (not recommended for public services).
- The default is \term{user}. Implies \term{use\_turn}.
- \titem{auth\_realm: String}
- When \option{auth\_type} is set to \term{user} and you have several virtual
- hosts configured you should set this option explicitly to the virtual host
- you want to serve on this particular listening port. Implies \term{use\_turn}.
- \titem{shaper: Atom}
- For \term{tcp} transports defines shaper to use. The default is \term{none}.
- \titem{server\_name: String}
- Defines software version to return with every response. The default is the
- STUN library version.
-\end{description}
-
-Example configuration with disabled TURN functionality (STUN only):
-\begin{verbatim}
-listen:
- ...
- -
- port: 3478
- transport: udp
- module: ejabberd_stun
- -
- port: 3478
- module: ejabberd_stun
- -
- port: 5349
- module: ejabberd_stun
- certfile: "/etc/ejabberd/server.pem"
- ...
-\end{verbatim}
-
-Example configuration with TURN functionality. Note that STUN is always
-enabled if TURN is enabled. Here, only UDP section is shown:
-\begin{verbatim}
-listen:
- ...
- -
- port: 3478
- transport: udp
- use_turn: true
- turn_ip: "10.20.30.1"
- module: ejabberd_stun
- ...
-\end{verbatim}
-
-You also need to configure DNS SRV records properly so clients can easily discover a
-STUN/TURN server serving your XMPP domain. Refer to section
-\footahref{http://tools.ietf.org/html/rfc5389\#section-9}{DNS Discovery of a Server}
-of \footahref{http://tools.ietf.org/html/rfc5389}{RFC 5389} and section
-\footahref{http://tools.ietf.org/html/rfc5766\#section-6}{Creating an Allocation}
-of \footahref{http://tools.ietf.org/html/rfc5766}{RFC 5766} for details.
-
-Example DNS SRV configuration for STUN only:
-\begin{verbatim}
-_stun._udp IN SRV 0 0 3478 stun.example.com.
-_stun._tcp IN SRV 0 0 3478 stun.example.com.
-_stuns._tcp IN SRV 0 0 5349 stun.example.com.
-\end{verbatim}
-
-And you should also add these in the case if TURN is enabled:
-\begin{verbatim}
-_turn._udp IN SRV 0 0 3478 turn.example.com.
-_turn._tcp IN SRV 0 0 3478 turn.example.com.
-_turns._tcp IN SRV 0 0 5349 turn.example.com.
-\end{verbatim}
-
-\makesubsection{sip}{SIP}
-\ind{options!sip}\ind{sip}
-
-\ejabberd{} has built-in SIP support. In order to activate it you need to add
-listeners for it, configure DNS properly and enable \modsip{} for
-the desired virtual host.
-
-To add a listener you should configure \term{ejabberd\_sip} listening module as
-described in \ref{listened} section. If option \option{tls} is specified, option
-\option{certfile} must be specified as well, otherwise incoming TLS connections would fail.
-
-Example configuration with standard ports
-(as per \footahref{http://tools.ietf.org/html/rfc3261}{RFC 3261}):
-\begin{verbatim}
-listen:
- ...
- -
- port: 5060
- transport: udp
- module: ejabberd_sip
- -
- port: 5060
- module: ejabberd_sip
- -
- port: 5061
- module: ejabberd_sip
- tls: true
- certfile: "/etc/ejabberd/server.pem"
- ...
-\end{verbatim}
-
-Note that there is no StartTLS support in SIP and \footahref{http://en.wikipedia.org/wiki/Server\_Name\_Indication}{SNI} support is somewhat tricky, so for TLS you have to configure
-different virtual hosts on different ports if you have different certificate files for them.
-
-Next you need to configure DNS SIP records for your virtual domains.
-Refer to \footahref{http://tools.ietf.org/html/rfc3263}{RFC 3263} for the detailed explanation.
-Simply put, you should add NAPTR and SRV records for your domains.
-Skip NAPTR configuration if your DNS provider doesn't support this type of records.
-It's not fatal, however, highly recommended.
-
-Example configuration of NAPTR records:
-\begin{verbatim}
-example.com IN NAPTR 10 0 "s" "SIPS+D2T" "" _sips._tcp.example.com.
-example.com IN NAPTR 20 0 "s" "SIP+D2T" "" _sip._tcp.example.com.
-example.com IN NAPTR 30 0 "s" "SIP+D2U" "" _sip._udp.example.com.
-\end{verbatim}
-
-Example configuration of SRV records with standard ports
-(as per \footahref{http://tools.ietf.org/html/rfc3261}{RFC 3261}):
-\begin{verbatim}
-_sip._udp IN SRV 0 0 5060 sip.example.com.
-_sip._tcp IN SRV 0 0 5060 sip.example.com.
-_sips._tcp IN SRV 0 0 5061 sip.example.com.
-\end{verbatim}
-
-\makesubsection{includeconfigfile}{Include Additional Configuration Files}
-\ind{options!includeconfigfile}\ind{includeconfigfile}
-
-The option \option{include\_config\_file} in a configuration file instructs \ejabberd{} to include other configuration files immediately.
-
-The basic syntax is:
-\esyntax{include\_config\_file: [Filename]}
-It is possible to specify suboptions using the full syntax:
-\esyntax{include\_config\_file: \{ Filename: [Suboption, ...] \}}
-
-The filename can be indicated either as an absolute path,
-or relative to the main \ejabberd{} configuration file.
-It isn't possible to use wildcards.
-The file must exist and be readable.
-
-The allowed suboptions are:
-\begin{description}
- \titem{disallow: [Optionname, ...]} Disallows the usage of those options in the included configuration file.
- The options that match this criteria are not accepted.
- The default value is an empty list: \term{[]}
- \titem{allow\_only: [Optionname, ...]} Allows only the usage of those options in the included configuration file.
- The options that do not match this criteria are not accepted.
- The default value is: \term{all}
-\end{description}
-
-This is a basic example:
-\begin{verbatim}
-include_config_file: "/etc/ejabberd/additional.yml"
-\end{verbatim}
-
-In this example, the included file is not allowed to contain a \term{listen} option.
-If such an option is present, the option will not be accepted.
-The file is in a subdirectory from where the main configuration file is.
-\begin{verbatim}
-include_config_file:
- "./example.org/additional_not_listen.yml":
- disallow: [listen]
-\end{verbatim}
-
-In this example, \term{ejabberd.yml} defines some ACL and Access rules,
-and later includes another file with additional rules:
-\begin{verbatim}
-acl:
- admin:
- user:
- - "admin": "localhost"
-access:
- announce:
- admin: allow
-include_config_file:
- "/etc/ejabberd/acl_and_access.yml":
- allow_only:
- - acl
- - access
-\end{verbatim}
-and content of the file \term{acl\_and\_access.yml} can be, for example:
-\begin{verbatim}
-acl:
- admin:
- user:
- - "bob": "localhost"
- - "jan": "localhost"
-\end{verbatim}
-
-
-\makesubsection{optionmacros}{Option Macros in Configuration File}
-\ind{options!optionmacros}\ind{optionmacros}
-
-In the \ejabberd{} configuration file,
-it is possible to define a macro for a value
-and later use this macro when defining an option.
-
-A macro is defined with this syntax:
-\esyntax{define\_macro: \{ 'MACRO': Value \}}
-The \term{MACRO} must be surrounded by single quotation marks,
-and all letters in uppercase; check the examples bellow.
-The \term{value} can be any valid arbitrary Erlang term.
-
-The first definition of a macro is preserved,
-and additional definitions of the same macro are forgotten.
-
-Macros are processed after
-additional configuration files have been included,
-so it is possible to use macros that
-are defined in configuration files included before the usage.
-
-It isn't possible to use a macro in the definition
-of another macro.
-
-This example shows the basic usage of a macro:
-\begin{verbatim}
-define_macro:
- 'LOG_LEVEL_NUMBER': 5
-loglevel: 'LOG_LEVEL_NUMBER'
-\end{verbatim}
-The resulting option interpreted by \ejabberd{} is: \term{loglevel: 5}.
-
-This example shows that values can be any arbitrary Erlang term:
-\begin{verbatim}
-define_macro:
- 'USERBOB':
- user:
- - "bob": "localhost"
-acl:
- admin: 'USERBOB'
-\end{verbatim}
-The resulting option interpreted by \ejabberd{} is:
-\begin{verbatim}
-acl:
- admin:
- user:
- - "bob": "localhost"
-\end{verbatim}
-This complex example:
-\begin{verbatim}
-define_macro:
- 'NUMBER_PORT_C2S': 5222
- 'NUMBER_PORT_HTTP': 5280
-listen:
- -
- port: 'NUMBER_PORT_C2S'
- module: ejabberd_c2s
- -
- port: 'NUMBER_PORT_HTTP'
- module: ejabberd_http
-\end{verbatim}
-produces this result after being interpreted:
-\begin{verbatim}
-listen:
- -
- port: 5222
- module: ejabberd_c2s
- -
- port: 5280
- module: ejabberd_http
-\end{verbatim}
-\makesection{database}{Database and LDAP Configuration}
-\ind{database}
-%TODO: this whole section is not yet 100% optimized
-
-\ejabberd{} uses its internal Mnesia database by default. However, it is
-possible to use a relational database, key-value storage or an LDAP server to store persistent,
-long-living data. \ejabberd{} is very flexible: you can configure different
-authentication methods for different virtual hosts, you can configure different
-authentication mechanisms for the same virtual host (fallback), you can set
-different storage systems for modules, and so forth.
-
-The following databases are supported by \ejabberd{}:
-\begin{itemize}
-%%\item \footahref{http://www.microsoft.com/sql/}{Microsoft SQL Server}
-\item \footahref{http://www.erlang.org/doc/apps/mnesia/index.html}{Mnesia}
-\item \footahref{http://www.mysql.com/}{MySQL}
-\item \footahref{http://en.wikipedia.org/wiki/Open\_Database\_Connectivity}{Any ODBC compatible database}
-\item \footahref{http://www.postgresql.org/}{PostgreSQL}
-\item \footahref{http://basho.com/riak/}{Riak}
-\end{itemize}
-
-The following LDAP servers are tested with \ejabberd{}:
-\begin{itemize}
-\item \footahref{http://www.microsoft.com/activedirectory/}{Active Directory}
- (see section~\ref{ad})
-\item \footahref{http://www.openldap.org/}{OpenLDAP}
-\item \footahref{http://www.communigate.com/}{CommuniGate Pro}
-\item Normally any LDAP compatible server should work; inform us about your
- success with a not-listed server so that we can list it here.
-\end{itemize}
-
-Important note about virtual hosting:
-if you define several domains in ejabberd.yml (see section \ref{hostnames}),
-you probably want that each virtual host uses a different configuration of database, authentication and storage,
-so that usernames do not conflict and mix between different virtual hosts.
-For that purpose, the options described in the next sections
-must be set inside a \term{host\_config} for each vhost (see section \ref{virtualhost}).
-For example:
-\begin{verbatim}
-host_config:
- "public.example.org":
- odbc_type: pgsql
- odbc_server: "localhost"
- odbc_database: "database-public-example-org"
- odbc_username: "ejabberd"
- odbc_password: "password"
- auth_method: [odbc]
-\end{verbatim}
-
-
-\makesubsection{odbc}{ODBC}\ind{odbc}
-
-The actual database access is defined in the options with \term{odbc\_} prefix. The
-values are used to define if we want to use ODBC, or one of the two native
-interface available, PostgreSQL or MySQL.
-
-The following paramaters are available:
-\begin{description}
- \titem{odbc\_type: mysql | pgsql | odbc} The type of an ODBC connection.
- The default is \term{odbc}.
- \titem{odbc\_server: String} A hostname of the ODBC server. The default is
- \term{``localhost''}.
- \titem{odbc\_port: Port} The port where the ODBC server is accepting connections.
- The option is only valid for \term{mysql} and \term{pgsql}. The default is
- \term{3306} and \term{5432} respectively.
- \titem{odbc\_database: String} The database name. The default is \term{``ejabberd''}.
- The option is only valid for \term{mysql} and \term{pgsql}.
- \titem{odbc\_username: String} The username. The default is \term{``ejabberd''}.
- The option is only valid for \term{mysql} and \term{pgsql}.
- \titem{odbc\_password: String} The password. The default is empty string.
- The option is only valid for \term{mysql} and \term{pgsql}.
- \titem{odbc\_pool\_size: N} By default \ejabberd{} opens 10 connections to
- the database for each virtual host. You can change this number by using this option.
- \titem{odbc\_keepalive\_interval: N} You can configure an interval to
- make a dummy SQL request to keep alive the connections to the database.
- The default value is 'undefined', so no keepalive requests are made.
- Specify in seconds: for example 28800 means 8 hours.
- \titem{odbc\_start\_interval: N} If the connection to the database fails,
- \ejabberd{} waits 30 seconds before retrying.
- You can modify this interval with this option.
-\end{description}
-
-Example of plain ODBC connection:
-\begin{verbatim}
-odbc_server: "DSN=database;UID=ejabberd;PWD=password"
-\end{verbatim}
-
-Example of MySQL connection:
-\begin{verbatim}
-odbc_type: mysql
-odbc_server: "server.company.com"
-odbc_port: 3306 # the default
-odbc_database: "mydb"
-odbc_username: "user1"
-odbc_password: "**********"
-odbc_pool_size: 5
-\end{verbatim}
-
-\makesubsubsection{odbcstorage}{Storage}
-\ind{ODBC!storage}
-
-An ODBC compatible database also can be used to store information into from
-several \ejabberd{}
-modules. See section~\ref{modoverview} to see which modules can be used with
-relational databases like MySQL. To enable storage to your database, just make
-sure that your database is running well (see previous sections), and add the
-module option \term{db\_type: odbc}.
-
-\makesubsection{ldap}{LDAP}
-\ind{databases!LDAP}
-
-\ejabberd{} has built-in LDAP support. You can authenticate users against LDAP
-server and use LDAP directory as vCard storage.
-
-Usually \ejabberd{} treats LDAP as a read-only storage:
-it is possible to consult data, but not possible to
-create accounts or edit vCard that is stored in LDAP.
-However, it is possible to change passwords if \module{mod\_register} module is enabled
-and LDAP server supports
-\footahref{http://tools.ietf.org/html/rfc3062}{RFC 3062}.
-
-
-\makesubsubsection{ldapconnection}{Connection}
-
-Two connections are established to the LDAP server per vhost,
-one for authentication and other for regular calls.
-
-Parameters:
-\begin{description}
-\titem{ldap\_servers: [Servers, ...]} \ind{options!ldap\_server}List of IP addresses or DNS names of your
-LDAP servers. This option is required.
-\titem{ldap\_encrypt: none|tls} \ind{options!ldap\_encrypt}Type of connection encryption to the LDAP server.
-Allowed values are: \term{none}, \term{tls}.
-The value \term{tls} enables encryption by using LDAP over SSL.
-Note that STARTTLS encryption is not supported.
-The default value is: \term{none}.
-\titem{ldap\_tls\_verify: false|soft|hard} \ind{options!ldap\_tls\_verify}
-This option specifies whether to verify LDAP server certificate or not when TLS is enabled.
-When \term{hard} is enabled \ejabberd{} doesn't proceed if a certificate is invalid.
-When \term{soft} is enabled \ejabberd{} proceeds even if check fails.
-The default is \term{false} which means no checks are performed.
-\titem{ldap\_tls\_cacertfile: Path} \ind{options!ldap\_tls\_cacertfile}
-Path to file containing PEM encoded CA certificates. This option is needed
-(and required) when TLS verification is enabled.
-\titem{ldap\_tls\_depth: Number} \ind{options!ldap\_tls\_depth}
-Specifies the maximum verification depth when TLS verification is enabled,
-i.e. how far in a chain of certificates the verification process can proceed
-before the verification is considered to fail.
-Peer certificate = 0, CA certificate = 1, higher level CA certificate = 2, etc.
-The value 2 thus means that a chain can at most contain peer cert,
-CA cert, next CA cert, and an additional CA cert. The default value is 1.
-\titem{ldap\_port: Number} \ind{options!ldap\_port}Port to connect to your LDAP server.
-The default port is~389 if encryption is disabled; and 636 if encryption is enabled.
-If you configure a value, it is stored in \ejabberd{}'s database.
-Then, if you remove that value from the configuration file,
-the value previously stored in the database will be used instead of the default port.
-\titem{ldap\_rootdn: RootDN} \ind{options!ldap\_rootdn}Bind DN. The default value
- is~\term{""} which means `anonymous connection'.
-\titem{ldap\_password: Password} \ind{options!ldap\_password}Bind password. The default
- value is \term{""}.
-\titem{ldap\_deref\_aliases: never|always|finding|searching} \ind{options!ldap\_deref\_aliases} Whether or not to dereference aliases. The default is \term{never}.
-\end{description}
-
-Example:
-\begin{verbatim}
-auth_method: [ldap]
-ldap_servers:
- - "ldap1.example.org"
-ldap_port: 389
-ldap_rootdn: "cn=Manager,dc=domain,dc=org"
-ldap_password: "**********"
-\end{verbatim}
-
-\makesubsubsection{ldapauth}{Authentication}
-
-You can authenticate users against an LDAP directory.
-Note that current LDAP implementation does not support SASL authentication.
-
-Available options are:
-
-\begin{description}
-\titem{ldap\_base: Base}\ind{options!ldap\_base}LDAP base directory which stores
- users accounts. This option is required.
- \titem{ldap\_uids: [ ldap\_uidattr | \{ldap\_uidattr: ldap\_uidattr\_format\} ]}\ind{options!ldap\_uids}
- LDAP attribute which holds a list of attributes to use as alternatives for getting the JID.
- The default attributes are \term{[\{"uid", "\%u"\}]}.
- The attributes are of the form:
- \term{[\{ldap\_uidattr\}]} or \term{[\{ldap\_uidattr, ldap\_uidattr\_format\}]}.
- You can use as many comma separated attributes as needed.
- The values for \term{ldap\_uidattr} and
- \term{ldap\_uidattr\_format} are described as follow:
- \begin{description}
- \titem{ldap\_uidattr}\ind{options!ldap\_uidattr}LDAP attribute which holds
- the user's part of a JID. The default value is \term{"uid"}.
- \titem{ldap\_uidattr\_format}\ind{options!ldap\_uidattr\_format}Format of
- the \term{ldap\_uidattr} variable. The format \emph{must} contain one and
- only one pattern variable \term{"\%u"} which will be replaced by the
- user's part of a JID. For example, \term{"\%u@example.org"}. The default
- value is \term{"\%u"}.
- \end{description}
- \titem{ldap\_filter: Filter}\ind{options!ldap\_filter}\ind{protocols!RFC 4515:
- LDAP String Representation of Search Filters}
- \footahref{http://tools.ietf.org/html/rfc4515}{RFC 4515} LDAP filter. The
- default Filter value is: \term{undefined}. Example:
- \term{"(\&(objectClass=shadowAccount)(memberOf=Jabber Users))"}. Please, do
- not forget to close brackets and do not use superfluous whitespaces. Also you
- \emph{must not} use \option{ldap\_uidattr} attribute in filter because this
- attribute will be substituted in LDAP filter automatically.
- \titem{ldap\_dn\_filter: \{ Filter: FilterAttrs \}}\ind{options!ldap\_dn\_filter}
- This filter is applied on the results returned by the main filter. This filter
- performs additional LDAP lookup to make the complete result. This is useful
- when you are unable to define all filter rules in \term{ldap\_filter}. You
- can define \term{"\%u"}, \term{"\%d"}, \term{"\%s"} and \term{"\%D"} pattern
- variables in Filter: \term{"\%u"} is replaced by a user's part of a JID,
- \term{"\%d"} is replaced by the corresponding domain (virtual host),
- all \term{"\%s"} variables are consecutively replaced by values of FilterAttrs
- attributes and \term{"\%D"} is replaced by Distinguished Name. By default
- \term{ldap\_dn\_filter} is undefined.
- Example:
-\begin{verbatim}
-ldap_dn_filter:
- "(&(name=%s)(owner=%D)(user=%u@%d))": ["sn"]
-\end{verbatim}
- Since this filter makes additional LDAP lookups, use it only in the
- last resort: try to define all filter rules in \term{ldap\_filter} if possible.
- \titem{\{ldap\_local\_filter, Filter\}}\ind{options!ldap\_local\_filter}
- If you can't use \term{ldap\_filter} due to performance reasons
- (the LDAP server has many users registered),
- you can use this local filter.
- The local filter checks an attribute in ejabberd,
- not in LDAP, so this limits the load on the LDAP directory.
- The default filter is: \term{undefined}.
- Example values:
-\begin{verbatim}
-{ldap_local_filter, {notequal, {"accountStatus",["disabled"]}}}.
-{ldap_local_filter, {equal, {"accountStatus",["enabled"]}}}.
-{ldap_local_filter, undefined}.
-\end{verbatim}
-
-\end{description}
-
-\makesubsubsection{ldapexamples}{Examples}
-
-\makeparagraph{ldapcommonexample}{Common example}
-
-Let's say \term{ldap.example.org} is the name of our LDAP server. We have
-users with their passwords in \term{"ou=Users,dc=example,dc=org"} directory.
-Also we have addressbook, which contains users emails and their additional
-infos in \term{"ou=AddressBook,dc=example,dc=org"} directory.
-The connection to the LDAP server is encrypted using TLS,
-and using the custom port 6123.
-Corresponding authentication section should looks like this:
-
-\begin{verbatim}
-## Authentication method
-auth_method: [ldap]
-## DNS name of our LDAP server
-ldap_servers: ["ldap.example.org"]
-## Bind to LDAP server as "cn=Manager,dc=example,dc=org" with password "secret"
-ldap_rootdn: "cn=Manager,dc=example,dc=org"
-ldap_password: "secret"
-ldap_encrypt: tls
-ldap_port: 6123
-## Define the user's base
-ldap_base: "ou=Users,dc=example,dc=org"
-## We want to authorize users from 'shadowAccount' object class only
-ldap_filter: "(objectClass=shadowAccount)"
-\end{verbatim}
-
-Now we want to use users LDAP-info as their vCards. We have four attributes
-defined in our LDAP schema: \term{"mail"} --- email address, \term{"givenName"}
---- first name, \term{"sn"} --- second name, \term{"birthDay"} --- birthday.
-Also we want users to search each other. Let's see how we can set it up:
-
-\begin{verbatim}
-modules:
- ...
- mod_vcard_ldap:
- ## We use the same server and port, but want to bind anonymously because
- ## our LDAP server accepts anonymous requests to
- ## "ou=AddressBook,dc=example,dc=org" subtree.
- ldap_rootdn: ""
- ldap_password: ""
- ## define the addressbook's base
- ldap_base: "ou=AddressBook,dc=example,dc=org"
- ## uidattr: user's part of JID is located in the "mail" attribute
- ## uidattr_format: common format for our emails
- ldap_uids:
- "mail": "%u@mail.example.org"
- ## We have to define empty filter here, because entries in addressbook does not
- ## belong to shadowAccount object class
- ldap_filter: ""
- ## Now we want to define vCard pattern
- ldap_vcard_map:
- "NICKNAME": {"%u": []} # just use user's part of JID as his nickname
- "GIVEN": {"%s": ["givenName"]}
- "FAMILY": {"%s": ["sn"]}
- "FN": {"%s, %s": ["sn", "givenName"]}, # example: "Smith, John"
- "EMAIL": {"%s": ["mail"]}
- "BDAY": {"%s": ["birthDay"]}]}
- ## Search form
- ldap_search_fields:
- "User": "%u"
- "Name": "givenName"
- "Family Name": "sn"
- "Email": "mail"
- "Birthday": "birthDay"
- ## vCard fields to be reported
- ## Note that JID is always returned with search results
- ldap_search_reported:
- "Full Name": "FN"
- "Nickname": "NICKNAME"
- "Birthday": "BDAY"
- ...
-\end{verbatim}
-
-Note that \modvcardldap{} module checks for the existence of the user before
-searching in his information in LDAP.
-
-
-\makeparagraph{ad}{Active Directory}
-\ind{databases!Active Directory}
-
-Active Directory is just an LDAP-server with predefined attributes. A sample
-configuration is shown below:
-
-\begin{verbatim}
-auth_method: [ldap]
-ldap_servers: ["office.org"] # List of LDAP servers
-ldap_base: "DC=office,DC=org" # Search base of LDAP directory
-ldap_rootdn: "CN=Administrator,CN=Users,DC=office,DC=org" # LDAP manager
-ldap_password: "*******" # Password to LDAP manager
-ldap_uids: ["sAMAccountName"]
-ldap_filter: "(memberOf=*)"
-
-modules:
- ...
- mod_vcard_ldap:
- ldap_vcard_map:
- "NICKNAME": {"%u", []}
- "GIVEN": {"%s", ["givenName"]}
- "MIDDLE": {"%s", ["initials"]}
- "FAMILY": {"%s", ["sn"]}
- "FN": {"%s", ["displayName"]}
- "EMAIL": {"%s", ["mail"]}
- "ORGNAME": {"%s", ["company"]}
- "ORGUNIT": {"%s", ["department"]}
- "CTRY": {"%s", ["c"]}
- "LOCALITY": {"%s", ["l"]}
- "STREET": {"%s", ["streetAddress"]}
- "REGION": {"%s", ["st"]}
- "PCODE": {"%s", ["postalCode"]}
- "TITLE": {"%s", ["title"]}
- "URL": {"%s", ["wWWHomePage"]}
- "DESC": {"%s", ["description"]}
- "TEL": {"%s", ["telephoneNumber"]}]}
- ldap_search_fields:
- "User": "%u"
- "Name": "givenName"
- "Family Name": "sn"
- "Email": "mail"
- "Company": "company"
- "Department": "department"
- "Role": "title"
- "Description": "description"
- "Phone": "telephoneNumber"
- ldap_search_reported:
- "Full Name": "FN"
- "Nickname": "NICKNAME"
- "Email": "EMAIL"
- ...
-\end{verbatim}
-
-\makesubsection{riak}{Riak}
-\ind{databases!Riak}
-
-\footahref{http://basho.com/riak/}{Riak} is a distributed NoSQL key-value data store.
-The actual database access is defined in the options with \term{riak\_} prefix.
-
-\makesubsubsection{riakconnection}{Connection}
-\ind{riak!connection}
-
-The following paramaters are available:
-\begin{description}
- \titem{riak\_server: String} A hostname of the Riak server. The default is
- \term{``localhost''}.
- \titem{riak\_port: Port} The port where the Riak server is accepting connections.
- The defalt is 8087.
- \titem{riak\_pool\_size: N} By default \ejabberd{} opens 10 connections to
- the Riak server. You can change this number by using this option.
- \titem{riak\_start\_interval: N} If the connection to the Riak server fails,
- \ejabberd{} waits 30 seconds before retrying.
- You can modify this interval with this option.
-\end{description}
-
-Example configuration:
-\begin{verbatim}
-riak_server: "riak.server.com"
-riak_port: 9097
-\end{verbatim}
-
-\makesubsubsection{riakstorage}{Storage}
-\ind{riak!storage}
-
-Several \ejabberd{} modules can be used to store information in Riak database.
-Refer to the corresponding module documentation to see if it supports such
-ability. To enable storage to Riak database, just make
-sure that your database is running well (see the next section), and add the
-module option \term{db\_type: riak}.
-
-\makesubsubsection{riakconfiguration}{Riak Configuration}
-\ind{riak!configuration}
-
-First, you need to configure Riak to use
-\footahref{http://en.wikipedia.org/wiki/LevelDB}{LevelDB} as a database backend.
-
-If you are using Riak 2.x and higher, configure \term{storage\_backend} option
-of \term{/etc/riak/riak.conf} as follows:
-\begin{verbatim}
-...
-storage_backend = leveldb
-...
-\end{verbatim}
-
-If you are using Riak 1.4.x and older, configure \term{storage\_backend} option
-of \term{/etc/riak/app.config} in the section \term{riak\_kv} as follows:
-\begin{verbatim}
-...
- {riak_kv, [
- ...
- {storage_backend, riak_kv_eleveldb_backend},
-...
-\end{verbatim}
-
-Second, Riak should be pointed to \ejabberd{} Erlang binary files (*.beam).
-As described in \ref{install}, by default those are located
-in \term{/lib/ejabberd/ebin} directory. So you
-should add the following to \term{/etc/riak/vm.args}:
-\begin{verbatim}
-...
-## Path to ejabberd beams in order to make map/reduce
--pz /lib/ejabberd/ebin
-...
-\end{verbatim}
-Important notice: make sure Riak has at least read access to that directory.
-Otherwise its startup will likely fail.
-
-\makesection{modules}{Modules Configuration}
-\ind{modules}
-
-The option \term{modules} defines the list of modules that will be loaded after
-\ejabberd{}'s startup. Each entry in the list is a tuple in which the first
-element is the name of a module and the second is a list of options for that
-module.
-
-The syntax is:
-\esyntax{modules: \{ ModuleName: ModuleOptions \}}
-
-Examples:
-\begin{itemize}
-\item In this example only the module \modecho{} is loaded and no module
- options are specified between the square brackets:
-\begin{verbatim}
-modules:
- mod_echo: {}
-\end{verbatim}
-\item In the second example the modules \modecho{}, \modtime{}, and
- \modversion{} are loaded without options.
-\begin{verbatim}
-modules:
- mod_echo: {}
- mod_time: {}
- mod_version: {}
-\end{verbatim}
-\end{itemize}
-
-\makesubsection{modoverview}{Modules Overview}
-\ind{modules!overview}\ind{XMPP compliancy}
-
-The following table lists all modules included in \ejabberd{}.
-
-\begin{table}[H]
- \centering
- \begin{tabular}{|l|l|l|}
- \hline {\bf Module} & {\bf Feature} & {\bf Dependencies} \\
- \hline
- \hline \modadhoc{} & Ad-Hoc Commands (\xepref{0050}) & \\
- \hline \ahrefloc{modannounce}{\modannounce{}} & Manage announcements & recommends \modadhoc{} \\
- \hline \modblocking{} & Simple Communications Blocking (\xepref{0191}) & \modprivacy{} \\
- \hline \modcaps{} & Entity Capabilities (\xepref{0115}) & \\
- \hline \modcarboncopy{} & Message Carbons (\xepref{0280}) & \\
- \hline \ahrefloc{modclientstate}{\modclientstate{}} & Filter stanzas for inactive clients & \\
- \hline \modconfigure{} & Server configuration using Ad-Hoc & \modadhoc{} \\
- \hline \ahrefloc{moddisco}{\moddisco{}} & Service Discovery (\xepref{0030}) & \\
- \hline \ahrefloc{modecho}{\modecho{}} & Echoes XMPP stanzas & \\
- \hline \ahrefloc{modfail2ban}{\modfailban{}} & Bans IPs that show the malicious signs & \\
- \hline \ahrefloc{modhttpbind}{\modhttpbind{}} & XMPP over Bosh service (HTTP Binding) & \\
- \hline \ahrefloc{modhttpfileserver}{\modhttpfileserver{}} & Small HTTP file server & \\
- \hline \ahrefloc{modirc}{\modirc{}} & IRC transport & \\
- \hline \ahrefloc{modlast}{\modlast{}} & Last Activity (\xepref{0012}) & \\
- \hline \ahrefloc{modmuc}{\modmuc{}} & Multi-User Chat (\xepref{0045}) & \\
- \hline \ahrefloc{modmuclog}{\modmuclog{}} & Multi-User Chat room logging & \modmuc{} \\
- \hline \ahrefloc{modoffline}{\modoffline{}} & Offline message storage (\xepref{0160}) & \\
- \hline \ahrefloc{modping}{\modping{}} & XMPP Ping and periodic keepalives (\xepref{0199}) & \\
- \hline \ahrefloc{modprescounter}{\modprescounter{}} & Detect presence subscription flood & \\
- \hline \ahrefloc{modprivacy}{\modprivacy{}} & Blocking Communication (\xepref{0016}) & \\
- \hline \ahrefloc{modprivate}{\modprivate{}} & Private XML Storage (\xepref{0049}) & \\
- \hline \ahrefloc{modproxy}{\modproxy{}} & SOCKS5 Bytestreams (\xepref{0065}) & \\
- \hline \ahrefloc{modpubsub}{\modpubsub{}} & Pub-Sub (\xepref{0060}), PEP (\xepref{0163}) & \modcaps{} \\
- \hline \ahrefloc{modpubsub}{\modpubsubodbc{}} & Pub-Sub (\xepref{0060}), PEP (\xepref{0163}) & supported DB (*) and \modcaps{} \\
- \hline \ahrefloc{modregister}{\modregister{}} & In-Band Registration (\xepref{0077}) & \\
- \hline \ahrefloc{modregisterweb}{\modregisterweb{}} & Web for Account Registrations & \\
- \hline \ahrefloc{modroster}{\modroster{}} & Roster management (XMPP IM) & \\
- \hline \ahrefloc{modservicelog}{\modservicelog{}} & Copy user messages to logger service & \\
- \hline \ahrefloc{modsharedroster}{\modsharedroster{}} & Shared roster management & \modroster{} \\
- \hline \ahrefloc{modsharedrosterldap}{\modsharedrosterldap{}} & LDAP Shared roster management & \modroster{} \\
- \hline \ahrefloc{modsic}{\modsic{}} & Server IP Check (\xepref{0279}) & \\
- \hline \ahrefloc{modsip}{\modsip{}} & SIP Registrar/Proxy (\footahref{http://tools.ietf.org/html/rfc3261}{RFC 3261}) & \term{ejabberd\_sip} \\
- \hline \ahrefloc{modstats}{\modstats{}} & Statistics Gathering (\xepref{0039}) & \\
- \hline \ahrefloc{modtime}{\modtime{}} & Entity Time (\xepref{0202}) & \\
- \hline \ahrefloc{modvcard}{\modvcard{}} & vcard-temp (\xepref{0054}) & \\
- \hline \ahrefloc{modvcardldap}{\modvcardldap{}} & vcard-temp (\xepref{0054}) & LDAP server \\
- \hline \ahrefloc{modvcardxupdate}{\modvcardxupdate{}} & vCard-Based Avatars (\xepref{0153}) & \modvcard{} \\
- \hline \ahrefloc{modversion}{\modversion{}} & Software Version (\xepref{0092}) & \\
- \hline
- \end{tabular}
-\end{table}
-
-\begin{itemize}
-\item (*) This module requires a supported database. For a list of supported databases, see section~\ref{database}.
-\end{itemize}
-
-You can see which database backend each module needs by looking at the suffix:
-\begin{itemize}
-\item No suffix, this means that the module uses Erlang's built-in database
- Mnesia as backend, Riak key-value store or ODBC database (see~\ref{database}).
-\item `\_ldap', this means that the module needs an LDAP server as backend.
-\end{itemize}
-
-You can find more
-\footahref{http://www.ejabberd.im/contributions}{contributed modules} on the
-\ejabberd{} website. Please remember that these contributions might not work or
-that they can contain severe bugs and security leaks. Therefore, use them at
-your own risk!
-
-
-\makesubsection{modcommonoptions}{Common Options}
-
-The following options are used by many modules. Therefore, they are described in
-this separate section.
-
-\makesubsubsection{modiqdiscoption}{\option{iqdisc}}
-\ind{options!iqdisc}
-
-Many modules define handlers for processing IQ queries of different namespaces
-to this server or to a user (e.\,g.\ to \jid{example.org} or to
-\jid{user@example.org}). This option defines processing discipline for
-these queries.
-
-The syntax is:
-\esyntax{iqdisc: Value}
-
-Possible \term{Value} are:
-\begin{description}
-\titem{no\_queue} All queries of a namespace with this processing discipline are
- processed directly. This means that the XMPP connection that sends this IQ query gets blocked:
- no other packets can be processed
- until this one has been completely processed. Hence this discipline is not
- recommended if the processing of a query can take a relatively long time.
-\titem{one\_queue} In this case a separate queue is created for the processing
- of IQ queries of a namespace with this discipline. In addition, the processing
- of this queue is done in parallel with that of other packets. This discipline
- is most recommended.
-\titem{N} N separate queues are created to process the
- queries. The queries are thus processed in parallel, but in a
- controlled way.
-\titem{parallel} For every packet with this discipline a separate Erlang process
- is spawned. Consequently, all these packets are processed in parallel.
- Although spawning of Erlang process has a relatively low cost, this can break
- the server's normal work, because the Erlang emulator has a limit on the
- number of processes (32000 by default).
-\end{description}
-
-Example:
-\begin{verbatim}
-modules:
- ...
- mod_time:
- iqdisc: no_queue
- ...
-\end{verbatim}
-
-\makesubsubsection{modhostoption}{\option{host}}
-\ind{options!host}
-
-This option defines the Jabber ID of a service provided by an \ejabberd{} module.
-
-The syntax is:
-\esyntax{host: HostName}
-
-If you include the keyword "@HOST@" in the HostName,
-it is replaced at start time with the real virtual host string.
-
-This example configures
-the \ind{modules!\modecho{}}echo module to provide its echoing service
-in the Jabber ID \jid{mirror.example.org}:
-\begin{verbatim}
-modules:
- ...
- mod_echo:
- host: "mirror.example.org"
- ...
-\end{verbatim}
-
-However, if there are several virtual hosts and this module is enabled in all of them,
-the "@HOST@" keyword must be used:
-\begin{verbatim}
-modules:
- ...
- mod_echo:
- host: "mirror.@HOST@"
- ...
-\end{verbatim}
-
-\makesubsection{modannounce}{\modannounce{}}
-\ind{modules!\modannounce{}}\ind{MOTD}\ind{message of the day}\ind{announcements}
-
-This module enables configured users to broadcast announcements and to set
-the message of the day (MOTD).
-Configured users can perform these actions with a
-\XMPP{} client either using Ad-hoc commands
-or sending messages to specific JIDs.
-
-The Ad-hoc commands are listed in the Server Discovery.
-For this feature to work, \modadhoc{} must be enabled.
-
-The specific JIDs where messages can be sent are listed bellow.
-The first JID in each entry will apply only to the specified virtual host
-\jid{example.org}, while the JID between brackets will apply to all virtual
-hosts in ejabberd.
-\begin{description}
-\titem{example.org/announce/all (example.org/announce/all-hosts/all)} The
- message is sent to all registered users. If the user is online and connected
- to several resources, only the resource with the highest priority will receive
- the message. If the registered user is not connected, the message will be
- stored offline in assumption that \ind{modules!\modoffline{}}offline storage
- (see section~\ref{modoffline}) is enabled.
-\titem{example.org/announce/online (example.org/announce/all-hosts/online)}The
- message is sent to all connected users. If the user is online and connected
- to several resources, all resources will receive the message.
-\titem{example.org/announce/motd (example.org/announce/all-hosts/motd)}The
- message is set as the message of the day (MOTD) and is sent to users when they
- login. In addition the message is sent to all connected users (similar to
- \term{announce/online}).
-\titem{example.org/announce/motd/update (example.org/announce/all-hosts/motd/update)}
- The message is set as message of the day (MOTD) and is sent to users when they
- login. The message is \emph{not sent} to any currently connected user.
-\titem{example.org/announce/motd/delete (example.org/announce/all-hosts/motd/delete)}
- Any message sent to this JID removes the existing message of the day (MOTD).
-\end{description}
-
-Options:
-\begin{description}
-\dbtype
-\titem{access: AccessName} \ind{options!access}This option specifies who is allowed to
- send announcements and to set the message of the day (by default, nobody is
- able to send such messages).
-\end{description}
-
-Examples:
-\begin{itemize}
-\item Only administrators can send announcements:
-\begin{verbatim}
-access:
- announce:
- admin: allow
-
-modules:
- ...
- mod_adhoc: {}
- mod_announce:
- access: announce
- ...
-\end{verbatim}
-\item Administrators as well as the direction can send announcements:
-\begin{verbatim}
-acl:
- direction:
- user:
- "big_boss": "example.org"
- "assistant": "example.org"
- admin:
- user:
- "admin": "example.org"
-access:
- announce:
- admin: allow
- direction: allow
-
-modules:
- ...
- mod_adhoc: {}
- mod_announce:
- access: announce
- ...
-\end{verbatim}
-\end{itemize}
-
-Note that \modannounce{} can be resource intensive on large
-deployments as it can broadcast lot of messages. This module should be
-disabled for instances of \ejabberd{} with hundreds of thousands users.
-
-\makesubsection{modclientstate}{\modclientstate{}}
-\ind{modules!\modclientstate{}}\ind{Client State Indication}
-\ind{protocols!XEP-0352: Client State Indication}
-
-This module allows for queueing or dropping certain types of stanzas
-when a client indicates that the user is not actively using the client
-at the moment (see \xepref{0352}). This can save bandwidth and
-resources.
-
-Options:
-\begin{description}
-\titem{drop\_chat\_states: true|false} \ind{options!drop\_chat\_states}
- Drop most "standalone" Chat State Notifications (as defined in
- \xepref{0085}) while a client indicates inactivity. The default value
- is \term{false}.
-\titem{queue\_presence: true|false} \ind{options!queue\_presence}
- While a client is inactive, queue presence stanzas that indicate
- (un)availability. The latest queued stanza of each contact is
- delivered as soon as the client becomes active again. The default
- value is \term{false}.
-\end{description}
-
-Example:
-\begin{verbatim}
-modules:
- ...
- mod_client_state:
- drop_chat_states: true
- queue_presence: true
- ...
-\end{verbatim}
-
-\makesubsection{moddisco}{\moddisco{}}
-\ind{modules!\moddisco{}}
-\ind{protocols!XEP-0030: Service Discovery}
-\ind{protocols!XEP-0011: Jabber Browsing}
-\ind{protocols!XEP-0094: Agent Information}
-\ind{protocols!XEP-0157: Contact Addresses for XMPP Services}
-
-This module adds support for Service Discovery (\xepref{0030}). With
-this module enabled, services on your server can be discovered by
-\XMPP{} clients. Note that \ejabberd{} has no modules with support
-for the superseded Jabber Browsing (\xepref{0011}) and Agent Information
-(\xepref{0094}). Accordingly, \XMPP{} clients need to have support for
-the newer Service Discovery protocol if you want them be able to discover
-the services you offer.
-
-Options:
-\begin{description}
-\iqdiscitem{Service Discovery (\ns{http://jabber.org/protocol/disco\#items} and
- \ns{http://jabber.org/protocol/disco\#info})}
-\titem{extra\_domains: [Domain, ...]} \ind{options!extra\_domains}With this option,
- you can specify a list of extra domains that are added to the Service Discovery item list.
-\titem{server\_info: [ \{ modules: Modules, name: Name, urls: [URL, ...] \} ]} \ind{options!server\_info}
- Specify additional information about the server,
- as described in Contact Addresses for XMPP Services (\xepref{0157}).
- \term{Modules} can be the keyword `all',
- in which case the information is reported in all the services;
- or a list of \ejabberd{} modules,
- in which case the information is only specified for the services provided by those modules.
- Any arbitrary \term{Name} and \term{URL} can be specified, not only contact addresses.
-\end{description}
-
-Examples:
-\begin{itemize}
-\item To serve a link to the Jabber User Directory on \jid{jabber.org}:
-\begin{verbatim}
-modules:
- ...
- mod_disco:
- extra_domains: ["users.jabber.org"]
- ...
-\end{verbatim}
-\item To serve a link to the transports on another server:
-\begin{verbatim}
-modules:
- ...
- mod_disco:
- extra_domains:
- - "icq.example.com"
- - "msn.example.com"
- ...
-\end{verbatim}
-\item To serve a link to a few friendly servers:
-\begin{verbatim}
-modules:
- ...
- mod_disco:
- extra_domains:
- - "example.org"
- - "example.com"
- ...
-\end{verbatim}
-\item With this configuration, all services show abuse addresses,
-feedback address on the main server,
-and admin addresses for both the main server and the vJUD service:
-\begin{verbatim}
-modules:
- ...
- mod_disco:
- server_info:
- -
- modules: all
- name: "abuse-addresses"
- urls: ["mailto:abuse@shakespeare.lit"]
- -
- modules: [mod_muc]
- name: "Web chatroom logs"
- urls: ["http://www.example.org/muc-logs"]
- -
- modules: [mod_disco]
- name: "feedback-addresses"
- urls:
- - "http://shakespeare.lit/feedback.php"
- - "mailto:feedback@shakespeare.lit"
- - "xmpp:feedback@shakespeare.lit"
- -
- modules:
- - mod_disco
- - mod_vcard
- name: "admin-addresses"
- urls:
- - "mailto:xmpp@shakespeare.lit"
- - "xmpp:admins@shakespeare.lit"
- ...
-\end{verbatim}
-\end{itemize}
-
-\makesubsection{modecho}{\modecho{}}
-\ind{modules!\modecho{}}\ind{debugging}
-
-This module simply echoes any \XMPP{}
-packet back to the sender. This mirror can be of interest for
-\ejabberd{} and \XMPP{} client debugging.
-
-Options:
-\begin{description}
-\hostitem{echo}
-\end{description}
-
-Example: Mirror, mirror, on the wall, who is the most beautiful
- of them all?
-\begin{verbatim}
-modules:
- ...
- mod_echo:
- host: "mirror.example.org"
- ...
-\end{verbatim}
-
-\makesubsection{modfail2ban}{\modfailban{}}
-\ind{modules!\modfailban{}}\ind{modfail2ban}
-
-The module bans IPs that show the malicious signs. Currently only C2S authentication
-failures are detected.
-
-Available options:
-\begin{description}
- \titem{c2s\_auth\_ban\_lifetime: Seconds} The lifetime of the IP ban caused by too
- many C2S authentication failures. The default is 3600, i.e. one hour.
- \titem{c2s\_max\_auth\_failures: Integer} The number of C2S authentication failures to
- trigger the IP ban. The default is 20.
-\end{description}
-
-Example:
-\begin{verbatim}
-modules:
- ...
- mod_fail2ban:
- c2s_auth_block_lifetime: 7200
- c2s_max_auth_failures: 50
- ...
-\end{verbatim}
-
-\makesubsection{modhttpbind}{\modhttpbind{}}
-\ind{modules!\modhttpbind{}}\ind{modhttpbind}
-
-This module implements XMPP over Bosh (formerly known as HTTP Binding)
-as defined in \xepref{0124} and \xepref{0206}.
-It extends ejabberd's built in HTTP service with a configurable
-resource at which this service will be hosted.
-
-To use HTTP-Binding, enable the module:
-\begin{verbatim}
-modules:
- ...
- mod_http_bind: {}
- ...
-\end{verbatim}
-and add \verb|http_bind| in the HTTP service. For example:
-\begin{verbatim}
-listen:
- ...
- -
- port: 5280
- module: ejabberd_http
- http_bind: true
- http_poll: true
- web_admin: true
- ...
-\end{verbatim}
-With this configuration, the module will serve the requests sent to
-\verb|http://example.org:5280/http-bind/|
-Remember that this page is not designed to be used by web browsers,
-it is used by XMPP clients that support XMPP over Bosh.
-
-If you want to set the service in a different URI path or use a different module,
-you can configure it manually using the option \verb|request_handlers|.
-For example:
-\begin{verbatim}
-listen:
- ...
- -
- port: 5280
- module: ejabberd_http
- request_handlers:
- "/http-bind": mod_http_bind
- http_poll: true
- web_admin: true
- ...
-\end{verbatim}
-
-Options:
-\begin{description}
- \titem{\{max\_inactivity, Seconds\}} \ind{options!max\_inactivity}
- Define the maximum inactivity period in seconds.
- Default value is 30 seconds.
- For example, to set 50 seconds:
-\begin{verbatim}
-modules:
- ...
- mod_http_bind:
- max_inactivity: 50
- ...
-\end{verbatim}
-\end{description}
-
-
-\makesubsection{modhttpfileserver}{\modhttpfileserver{}}
-\ind{modules!\modhttpfileserver{}}\ind{modhttpfileserver}
-
-This simple module serves files from the local disk over HTTP.
-
-Options:
-\begin{description}
- \titem{docroot: Path} \ind{options!docroot}
- Directory to serve the files.
- \titem{accesslog: Path} \ind{options!accesslog}
- File to log accesses using an Apache-like format.
- No log will be recorded if this option is not specified.
- \titem{directory\_indices: [Index, ...]} \ind{options!directoryindices}
- Indicate one or more directory index files, similarly to Apache's
- DirectoryIndex variable. When a web request hits a directory
- instead of a regular file, those directory indices are looked in
- order, and the first one found is returned.
- \titem{custom\_headers: \{Name: Value\}} \ind{options!customheaders}
- Indicate custom HTTP headers to be included in all responses.
- Default value is: \term{[]}
- \titem{content\_types: \{Name: Type\}} \ind{options!contenttypes}
- Specify mappings of extension to content type.
- There are several content types already defined,
- with this option you can add new definitions, modify or delete existing ones.
- To delete an existing definition, simply define it with a value: `undefined'.
- \titem{default\_content\_type: Type} \ind{options!defaultcontenttype}
- Specify the content type to use for unknown extensions.
- Default value is `application/octet-stream'.
-\end{description}
-
-This example configuration will serve the files from
-the local directory \verb|/var/www|
-in the address \verb|http://example.org:5280/pub/archive/|.
-In this example a new content type \term{ogg} is defined,
-\term{png} is redefined, and \term{jpg} definition is deleted.
-To use this module you must enable it:
-\begin{verbatim}
-modules:
- ...
- mod_http_fileserver:
- docroot: "/var/www"
- accesslog: "/var/log/ejabberd/access.log"
- directory_indices:
- - "index.html"
- - "main.htm"
- custom_headers:
- "X-Powered-By": "Erlang/OTP"
- "X-Fry": "It's a widely-believed fact!"
- content_types:
- ".ogg": "audio/ogg"
- ".png": "image/png"
- ".jpg": undefined
- default_content_type: "text/html"
- ...
-\end{verbatim}
-And define it as a handler in the HTTP service:
-\begin{verbatim}
-listen:
- ...
- -
- port: 5280
- module: ejabberd_http
- request_handlers:
- ...
- "/pub/archive": mod_http_fileserver
- ...
- ...
-\end{verbatim}
-
-\makesubsection{modirc}{\modirc{}}
-\ind{modules!\modirc{}}\ind{IRC}
-
-This module is an IRC transport that can be used to join channels on IRC
-servers.
-
-End user information:
-\ind{protocols!groupchat 1.0}\ind{protocols!XEP-0045: Multi-User Chat}
-\begin{itemize}
-\item A \XMPP{} client with `groupchat 1.0' support or Multi-User
- Chat support (\xepref{0045}) is necessary to join IRC channels.
-\item An IRC channel can be joined in nearly the same way as joining a
- \XMPP{} Multi-User Chat room. The difference is that the room name will
- be `channel\%\jid{irc.example.org}' in case \jid{irc.example.org} is
- the IRC server hosting `channel'. And of course the host should point
- to the IRC transport instead of the Multi-User Chat service.
-\item You can register your nickame by sending `IDENTIFY password' to \\
- \jid{nickserver!irc.example.org@irc.jabberserver.org}.
-\item Entering your password is possible by sending `LOGIN nick password' \\
- to \jid{nickserver!irc.example.org@irc.jabberserver.org}.
-\item The IRC transport provides Ad-Hoc Commands (\xepref{0050})
- to join a channel, and to set custom IRC username and encoding.
-\item When using a popular \XMPP{} server, it can occur that no
- connection can be achieved with some IRC servers because they limit the
- number of connections from one IP.
-\end{itemize}
-
-Options:
-\begin{description}
-\hostitem{irc}
-\dbtype
-\titem{access: AccessName} \ind{options!access}This option can be used to specify who
- may use the IRC transport (default value: \term{all}).
-\titem{default\_encoding: Encoding} \ind{options!defaultencoding}Set the default IRC encoding.
- Default value: \term{"iso8859-1"}
-\end{description}
-
-Examples:
-\begin{itemize}
-\item In the first example, the IRC transport is available on (all) your
- virtual host(s) with the prefix `\jid{irc.}'. Furthermore, anyone is
- able to use the transport. The default encoding is set to "iso8859-15".
-\begin{verbatim}
-modules:
- ...
- mod_irc:
- access: all
- default_encoding: "iso8859-15"
- ...
-\end{verbatim}
-\item In next example the IRC transport is available with JIDs with prefix \jid{irc-t.net}.
- Moreover, the transport is only accessible to two users
- of \term{example.org}, and any user of \term{example.com}:
-\begin{verbatim}
-acl:
- paying_customers:
- user:
- - "customer1": "example.org"
- - "customer2": "example.org"
- server: "example.com"
-
-access:
- irc_users:
- paying_customers: allow
- all: deny
-
-modules:
- ...
- mod_irc:
- access: irc_users
- host: "irc.example.net"
- ...
-\end{verbatim}
-\end{itemize}
-
-\makesubsection{modlast}{\modlast{}}
-\ind{modules!\modlast{}}\ind{protocols!XEP-0012: Last Activity}
-
-This module adds support for Last Activity (\xepref{0012}). It can be used to
-discover when a disconnected user last accessed the server, to know when a
-connected user was last active on the server, or to query the uptime of the
-\ejabberd{} server.
-
-Options:
-\begin{description}
-\iqdiscitem{Last activity (\ns{jabber:iq:last})}
-\dbtype
-\end{description}
-
-\makesubsection{modmuc}{\modmuc{}}
-\ind{modules!\modmuc{}}\ind{protocols!XEP-0045: Multi-User Chat}\ind{conferencing}
-
-This module provides a Multi-User Chat (\xepref{0045}) service.
-Users can discover existing rooms, join or create them.
-Occupants of a room can chat in public or have private chats.
-
-Some of the features of Multi-User Chat:
-\begin{itemize}
-\item Sending public and private messages to room occupants.
-\item Inviting other users to a room.
-\item Setting a room subject.
-\item Creating password protected rooms.
-\item Kicking and banning occupants.
-\end{itemize}
-
-The MUC service allows any Jabber ID to register a nickname,
-so nobody else can use that nickname in any room in the MUC service.
-To register a nickname, open the Service Discovery in your
-XMPP client and register in the MUC service.
-
-This module supports clustering and load
-balancing. One module can be started per cluster node. Rooms are
-distributed at creation time on all available MUC module
-instances. The multi-user chat module is clustered but the rooms
-themselves are not clustered nor fault-tolerant: if the node managing a
-set of rooms goes down, the rooms disappear and they will be recreated
-on an available node on first connection attempt.
-
-Module options:
-\begin{description}
-\hostitem{conference}
-\dbtype
-\titem{access: AccessName} \ind{options!access}You can specify who is allowed to use
- the Multi-User Chat service. By default everyone is allowed to use it.
-\titem{access\_create: AccessName} \ind{options!access\_create}To configure who is
- allowed to create new rooms at the Multi-User Chat service, this option can be used.
- By default any account in the local ejabberd server is allowed to create rooms.
-\titem{access\_persistent: AccessName} \ind{options!access\_persistent}To configure who is
- allowed to modify the 'persistent' room option.
- By default any account in the local ejabberd server is allowed to modify that option.
-\titem{access\_admin: AccessName} \ind{options!access\_admin}This option specifies
- who is allowed to administrate the Multi-User Chat service. The default
- value is \term{none}, which means that only the room creator can
- administer his room.
- The administrators can send a normal message to the service JID,
- and it will be shown in all active rooms as a service message.
- The administrators can send a groupchat message to the JID of an active room,
- and the message will be shown in the room as a service message.
-\titem{history\_size: Size} \ind{options!history\_size}A small history of
- the current discussion is sent to users when they enter the
- room. With this option you can define the number of history messages
- to keep and send to users joining the room. The value is an
- integer. Setting the value to \term{0} disables the history feature
- and, as a result, nothing is kept in memory. The default value is
- \term{20}. This value is global and thus affects all rooms on the
- service.
-\titem{max\_users: Number} \ind{options!max\_users} This option defines at
- the service level, the maximum number of users allowed per
- room. It can be lowered in each room configuration but cannot be
- increased in individual room configuration. The default value is
- 200.
-\titem{max\_users\_admin\_threshold: Number}
- \ind{options!max\_users\_admin\_threshold} This option defines the
- number of service admins or room owners allowed to enter the room when
- the maximum number of allowed occupants was reached. The default limit
- is 5.
-\titem{max\_user\_conferences: Number}
- \ind{options!max\_user\_conferences} This option defines the maximum
- number of rooms that any given user can join. The default value
- is 10. This option is used to prevent possible abuses. Note that
- this is a soft limit: some users can sometimes join more conferences
- in cluster configurations.
-\titem{max\_room\_id: Number} \ind{options!max\_room\_id}
- This option defines the maximum number of characters that Room ID
- can have when creating a new room.
- The default value is to not limit: \term{infinity}.
-\titem{max\_room\_name: Number} \ind{options!max\_room\_name}
- This option defines the maximum number of characters that Room Name
- can have when configuring the room.
- The default value is to not limit: \term{infinity}.
-\titem{max\_room\_desc: Number} \ind{options!max\_room\_desc}
- This option defines the maximum number of characters that Room Description
- can have when configuring the room.
- The default value is to not limit: \term{infinity}.
-\titem{min\_message\_interval: Number} \ind{options!min\_message\_interval}
- This option defines the minimum interval between two messages send
- by an occupant in seconds. This option is global and valid for all
- rooms. A decimal value can be used. When this option is not defined,
- message rate is not limited. This feature can be used to protect a
- MUC service from occupant abuses and limit number of messages that will
- be broadcasted by the service. A good value for this minimum message
- interval is 0.4 second. If an occupant tries to send messages faster, an
- error is send back explaining that the message has been discarded
- and describing the reason why the message is not acceptable.
-\titem{min\_presence\_interval: Number}
- \ind{options!min\_presence\_interval} This option defines the
- minimum of time between presence changes coming from a given occupant in
- seconds. This option is global and valid for all rooms. A
- decimal value can be used. When this option is not defined, no
- restriction is applied. This option can be used to protect a MUC
- service for occupants abuses. If an occupant tries
- to change its presence more often than the specified interval, the
- presence is cached by \ejabberd{} and only the last presence is
- broadcasted to all occupants in the room after expiration of the
- interval delay. Intermediate presence packets are silently
- discarded. A good value for this option is 4 seconds.
-\titem{default\_room\_options: \{OptionName: OptionValue\}} \ind{options!default\_room\_options}
- This module option allows to define the desired default room options.
- Note that the creator of a room can modify the options of his room
- at any time using an XMPP client with MUC capability.
- The available room options and the default values are:
- \begin{description}
- \titem{allow\_change\_subj: true|false} Allow occupants to change the subject.
- \titem{allow\_private\_messages: true|false} Occupants can send private messages to other occupants.
- \titem{allow\_private\_messages\_from\_visitors: anyone|moderators|nobody} Visitors can send private messages to other occupants.
- \titem{allow\_query\_users: true|false} Occupants can send IQ queries to other occupants.
- \titem{allow\_user\_invites: false|true} Allow occupants to send invitations.
- \titem{allow\_visitor\_nickchange: true|false} Allow visitors to
- change nickname.
- \titem{allow\_visitor\_status: true|false} Allow visitors to send
- status text in presence updates. If disallowed, the \term{status}
- text is stripped before broadcasting the presence update to all
- the room occupants.
- \titem{anonymous: true|false} The room is anonymous:
- occupants don't see the real JIDs of other occupants.
- Note that the room moderators can always see the real JIDs of the occupants.
- \titem{captcha\_protected: false}
- When a user tries to join a room where he has no affiliation (not owner, admin or member),
- the room requires him to fill a CAPTCHA challenge (see section \ref{captcha})
- in order to accept her join in the room.
- \titem{logging: false|true} The public messages are logged using \term{mod\_muc\_log}.
- \titem{max\_users: 200} Maximum number of occupants in the room.
- \titem{members\_by\_default: true|false} The occupants that enter the room are participants by default, so they have 'voice'.
- \titem{members\_only: false|true} Only members of the room can enter.
- \titem{moderated: true|false} Only occupants with 'voice' can send public messages.
- \titem{password: "roompass123"} Password of the room. You may want to enable the next option too.
- \titem{password\_protected: false|true} The password is required to enter the room.
- \titem{persistent: false|true} The room persists even if the last participant leaves.
- \titem{public: true|false} The room is public in the list of the MUC service, so it can be discovered.
- \titem{public\_list: true|false} The list of participants is public, without requiring to enter the room.
- \titem{title: "Room Title"} A human-readable title of the room.
- \end{description}
- All of those room options can be set to \term{true} or \term{false},
- except \term{password} and \term{title} which are strings,
- and \term{max\_users} that is integer.
-\end{description}
-
-Examples:
-\begin{itemize}
-\item In the first example everyone is allowed to use the Multi-User Chat
- service. Everyone will also be able to create new rooms but only the user
- \jid{admin@example.org} is allowed to administrate any room. In this
- example he is also a global administrator. When \jid{admin@example.org}
- sends a message such as `Tomorrow, the \XMPP{} server will be moved
- to new hardware. This will involve service breakdowns around 23:00 UMT.
- We apologise for this inconvenience.' to \jid{conference.example.org},
- it will be displayed in all active rooms. In this example the history
- feature is disabled.
-\begin{verbatim}
-acl:
- admin:
- user:
- - "admin": "example.org"
-
-access:
- muc_admin:
- admin: allow
-
-modules:
- ...
- mod_muc:
- access: all
- access_create: all
- access_admin: muc_admin
- history_size: 0
- ...
-\end{verbatim}
-\item In the second example the Multi-User Chat service is only accessible by
- paying customers registered on our domains and on other servers. Of course
- the administrator is also allowed to access rooms. In addition, he is the
- only authority able to create and administer rooms. When
- \jid{admin@example.org} sends a message such as `Tomorrow, the \Jabber{}
- server will be moved to new hardware. This will involve service breakdowns
- around 23:00 UMT. We apologise for this inconvenience.' to
- \jid{conference.example.org}, it will be displayed in all active rooms. No
- \term{history\_size} option is used, this means that the feature is enabled
- and the default value of 20 history messages will be send to the users.
-\begin{verbatim}
-acl:
- paying_customers:
- user:
- - "customer1": "example.net"
- - "customer2": "example.com"
- - "customer3": "example.org"
- admin:
- user:
- - "admin": "example.org"
-
-access:
- muc_admin
- admin: allow
- all: deny
- muc_access:
- paying_customers: allow
- admin: allow
- all: deny
-
-modules:
- ...
- mod_muc:
- access: muc_access
- access_create: muc_admin
- access_admin: muc_admin
- ...
-\end{verbatim}
-
-\item In the following example, MUC anti abuse options are used. An
-occupant cannot send more than one message every 0.4 seconds and cannot
-change its presence more than once every 4 seconds.
-The length of Room IDs and Room Names are limited to 20 characters,
-and Room Description to 300 characters. No ACLs are
-defined, but some user restriction could be added as well:
-
-\begin{verbatim}
-modules:
- ...
- mod_muc:
- min_message_interval: 0.4
- min_presence_interval: 4
- max_room_id: 20
- max_room_name: 20
- max_room_desc: 300
- ...
-\end{verbatim}
-
-\item This example shows how to use \option{default\_room\_options} to make sure
- the newly created rooms have by default those options.
-\begin{verbatim}
-modules:
- ...
- mod_muc:
- access: muc_access
- access_create: muc_admin
- default_room_options:
- allow_change_subj: false
- allow_query_users: true
- allow_private_messages: true
- members_by_default: false
- title: "New chatroom"
- anonymous: false
- access_admin: muc_admin
- ...
-\end{verbatim}
-\end{itemize}
-
-\makesubsection{modmuclog}{\modmuclog{}}
-\ind{modules!\modmuclog{}}
-
-This module enables optional logging of Multi-User Chat (MUC) public conversations to
-HTML. Once you enable this module, users can join a room using a MUC capable
-XMPP client, and if they have enough privileges, they can request the
-configuration form in which they can set the option to enable room logging.
-
-Features:
-\begin{itemize}
-\item Room details are added on top of each page: room title, JID,
- author, subject and configuration.
-\item \ind{protocols!RFC 5122: Internationalized Resource Identifiers (IRIs) and Uniform Resource Identifiers (URIs) for the Extensible Messaging and Presence Protocol (XMPP)}
- The room JID in the generated HTML is a link to join the room (using
- \footahref{http://xmpp.org/rfcs/rfc5122.html}{XMPP URI}).
-\item Subject and room configuration changes are tracked and displayed.
-\item Joins, leaves, nick changes, kicks, bans and `/me' are tracked and
- displayed, including the reason if available.
-\item Generated HTML files are XHTML 1.0 Transitional and CSS compliant.
-\item Timestamps are self-referencing links.
-\item Links on top for quicker navigation: Previous day, Next day, Up.
-\item CSS is used for style definition, and a custom CSS file can be used.
-\item URLs on messages and subjects are converted to hyperlinks.
-\item Timezone used on timestamps is shown on the log files.
-\item A custom link can be added on top of each page.
-\end{itemize}
-
-Options:
-\begin{description}
-\titem{access\_log: AccessName}\ind{options!access\_log}
- This option restricts which occupants are allowed to enable or disable room
- logging. The default value is \term{muc\_admin}. Note for this default setting
- you need to have an access rule for \term{muc\_admin} in order to take effect.
-\titem{cssfile: false|URL}\ind{options!cssfile}
- With this option you can set whether the HTML files should have a custom CSS
- file or if they need to use the embedded CSS file. Allowed values are
- \term{false} and an URL to a CSS file. With the first value, HTML files will
- include the embedded CSS code. With the latter, you can specify the URL of the
- custom CSS file (for example: \term{"http://example.com/my.css"}). The default value
- is \term{false}.
-\titem{dirname: room\_jid|room\_name}\ind{options!dirname}
- Allows to configure the name of the room directory.
- Allowed values are \term{room\_jid} and \term{room\_name}.
- With the first value, the room directory name will be the full room JID.
- With the latter, the room directory name will be only the room name,
- not including the MUC service name.
- The default value is \term{room\_jid}.
-\titem{dirtype: subdirs|plain}\ind{options!dirtype}
- The type of the created directories can be specified with this option. Allowed
- values are \term{subdirs} and \term{plain}. With the first value,
- subdirectories are created for each year and month. With the latter, the
- names of the log files contain the full date, and there are no subdirectories.
- The default value is \term{subdirs}.
-\titem{file\_format: html|plaintext}\ind{options!file\_format}
- Define the format of the log files:
- \term{html} stores in HTML format,
- \term{plaintext} stores in plain text.
- The default value is \term{html}.
-\titem{file\_permissions: \{mode: Mode, group: Group\}}\ind{options!file\_permissions}
- Define the permissions that must be used when creating the log files:
- the number of the mode, and the numeric id of the group that will own the files.
- The default value is \term{\{644, 33\}}.
-\titem{outdir: Path}\ind{options!outdir}
- This option sets the full path to the directory in which the HTML files should
- be stored. Make sure the \ejabberd{} daemon user has write access on that
- directory. The default value is \term{"www/muc"}.
-\titem{spam\_prevention: true|false}\ind{options!spam\_prevention}
- To prevent spam, the \term{spam\_prevention} option adds a special attribute
- to links that prevent their indexation by search engines. The default value
- is \term{true}, which mean that nofollow attributes will be added to user
- submitted links.
-\titem{timezone: local|universal}\ind{options!timezone}
- The time zone for the logs is configurable with this option. Allowed values
- are \term{local} and \term{universal}. With the first value, the local time,
- as reported to Erlang by the operating system, will be used. With the latter,
- GMT/UTC time will be used. The default value is \term{local}.
-\titem{top\_link: \{URL: Text\}}\ind{options!top\_link}
- With this option you can customize the link on the top right corner of each
- log file. The default value is \term{\{"/", "Home"\}}.
-\end{description}
-
-Examples:
-\begin{itemize}
-\item In the first example any room owner can enable logging, and a
- custom CSS file will be used (http://example.com/my.css). The names
- of the log files will contain the full date, and there will be no
- subdirectories. The log files will be stored in /var/www/muclogs, and the
- time zone will be GMT/UTC. Finally, the top link will be
- \verb|<a href="http://www.jabber.ru/">Jabber.ru</a>|.
-\begin{verbatim}
-access:
- muc:
- all: allow
-
-modules:
- ...
- mod_muc_log:
- access_log: muc
- cssfile: "http://example.com/my.css"
- dirtype: plain
- dirname: room_jid
- outdir: "/var/www/muclogs"
- timezone: universal
- spam_prevention: true
- top_link:
- "http://www.jabber.ru/": "Jabber.ru"
- ...
-\end{verbatim}
- \item In the second example only \jid{admin1@example.org} and
- \jid{admin2@example.net} can enable logging, and the embedded CSS file will be
- used. The names of the log files will only contain the day (number),
- and there will be subdirectories for each year and month. The log files will
- be stored in /var/www/muclogs, and the local time will be used. Finally, the
- top link will be the default \verb|<a href="/">Home</a>|.
-\begin{verbatim}
-acl:
- admin:
- user:
- - "admin1": "example.org"
- - "admin2": "example.net"
-access:
- muc_log:
- admin: allow
- all: deny
-
-modules:
- ...
- mod_muc_log:
- access_log: muc_log
- cssfile: false
- dirtype: subdirs
- file_permissions:
- mode: 644
- group: 33
- outdir: "/var/www/muclogs"
- timezone: local
- ...
-\end{verbatim}
-\end{itemize}
-
-\makesubsection{modoffline}{\modoffline{}}
-\ind{modules!\modoffline{}}
-
-This module implements offline message storage (\xepref{0160}).
-This means that all messages
-sent to an offline user will be stored on the server until that user comes
-online again. Thus it is very similar to how email works. Note that
-\term{ejabberdctl}\ind{ejabberdctl} has a command to delete expired messages
-(see section~\ref{ejabberdctl}).
-
-\begin{description}
- \dbtype
- \titem{access\_max\_user\_messages: AccessName}\ind{options!access\_max\_user\_messages}
- This option defines which access rule will be enforced to limit
- the maximum number of offline messages that a user can have (quota).
- When a user has too many offline messages, any new messages that he receive are discarded,
- and a resource-constraint error is returned to the sender.
- The default value is \term{max\_user\_offline\_messages}.
- Then you can define an access rule with a syntax similar to
- \term{max\_user\_sessions} (see \ref{configmaxsessions}).
- \titem{store\_empty\_body: true|false}\ind{options!store\_empty\_body} Whether or not
- to store messages with empty \term{<body/>} element. The default value is \term{true}.
-\end{description}
-
-This example allows power users to have as much as 5000 offline messages,
-administrators up to 2000,
-and all the other users up to 100.
-\begin{verbatim}
-acl:
- admin:
- user:
- - "admin1": "localhost"
- - "admin2": "example.org"
- poweruser:
- user:
- - "bob": "example.org"
- - "jane": "example.org"
-
-access:
- max_user_offline_messages:
- poweruser: 5000
- admin: 2000
- all: 100
-
-modules:
- ...
- mod_offline:
- access_max_user_messages: max_user_offline_messages
- ...
-\end{verbatim}
-
-\makesubsection{modping}{\modping{}}
-\ind{modules!\modping{}}
-
-This module implements support for XMPP Ping (\xepref{0199}) and periodic keepalives.
-When this module is enabled ejabberd responds correctly to
-ping requests, as defined in the protocol.
-
-Configuration options:
-\begin{description}
- \titem{send\_pings: true|false}\ind{options!send\_pings}
- If this option is set to \term{true}, the server sends pings to connected clients
- that are not active in a given interval \term{ping\_interval}.
- This is useful to keep client connections alive or checking availability.
- By default this option is disabled.
- % because it is mostly not needed and consumes resources.
- \titem{ping\_interval: Seconds}\ind{options!ping\_interval}
- How often to send pings to connected clients, if the previous option is enabled.
- If a client connection does not send or receive any stanza in this interval,
- a ping request is sent to the client.
- The default value is 60 seconds.
- \titem{timeout\_action: none|kill}\ind{options!timeout\_action}
- What to do when a client does not answer to a server ping request in less than 32 seconds.
- % Those 32 seconds are defined in ejabberd_local.erl: -define(IQ_TIMEOUT, 32000).
- The default is to do nothing.
-\end{description}
-
-This example enables Ping responses, configures the module to send pings
-to client connections that are inactive for 4 minutes,
-and if a client does not answer to the ping in less than 32 seconds, its connection is closed:
-\begin{verbatim}
-modules:
- ...
- mod_ping:
- send_pings: true
- ping_interval: 240
- timeout_action: kill
- ...
-\end{verbatim}
-
-\makesubsection{modprescounter}{\modprescounter{}}
-\ind{modules!\modprescounter{}}
-
-This module detects flood/spam in presence subscription stanza traffic.
-If a user sends or receives more of those stanzas in a time interval,
-the exceeding stanzas are silently dropped, and warning is logged.
-
-Configuration options:
-\begin{description}
- \titem{count: StanzaNumber}\ind{options!count}
- The number of subscription presence stanzas
- (subscribe, unsubscribe, subscribed, unsubscribed)
- allowed for any direction (input or output)
- per time interval.
- Please note that two users subscribing to each other usually generate
- 4 stanzas, so the recommended value is 4 or more.
- The default value is: 5.
- \titem{interval: Seconds}\ind{options!interval}
- The time interval defined in seconds.
- The default value is 60.
-\end{description}
-
-This example enables the module, and allows up to 5 presence subscription stanzas
-to be sent or received by the users in 60 seconds:
-\begin{verbatim}
-modules:
- ...
- mod_pres_counter:
- count: 5
- interval: 60
- ...
-\end{verbatim}
-
-\makesubsection{modprivacy}{\modprivacy{}}
-\ind{modules!\modprivacy{}}\ind{Blocking Communication}\ind{Privacy Rules}\ind{protocols!XEP-0016: Privacy Lists}
-
-This module implements \footahref{http://www.xmpp.org/extensions/xep-0016.html}{XEP-0016: Privacy Lists}.
-If end users have support for it in their \XMPP{} client, they will be able to:
-\begin{quote}
-\begin{itemize}
-\item Retrieving one's privacy lists.
-\item Adding, removing, and editing one's privacy lists.
-\item Setting, changing, or declining active lists.
-\item Setting, changing, or declining the default list (i.e., the list that
- is active by default).
-\item Allowing or blocking messages based on JID, group, or subscription type
- (or globally).
-\item Allowing or blocking inbound presence notifications based on JID, group,
- or subscription type (or globally).
-\item Allowing or blocking outbound presence notifications based on JID, group,
- or subscription type (or globally).
-\item Allowing or blocking IQ stanzas based on JID, group, or subscription type
- (or globally).
-\item Allowing or blocking all communications based on JID, group, or
- subscription type (or globally).
-\end{itemize}
-\end{quote}
-
-Options:
-\begin{description}
-\iqdiscitem{Blocking Communication (\ns{jabber:iq:privacy})}
-\dbtype
-\end{description}
-
-\makesubsection{modprivate}{\modprivate{}}
-\ind{modules!\modprivate{}}\ind{protocols!XEP-0049: Private XML Storage}\ind{protocols!XEP-0048: Bookmark Storage}
-
-This module adds support for Private XML Storage (\xepref{0049}):
-\begin{quote}
-Using this method, XMPP entities can store private data on the server and
-retrieve it whenever necessary. The data stored might be anything, as long as
-it is valid XML. One typical usage for this namespace is the server-side storage
-of client-specific preferences; another is Bookmark Storage (\xepref{0048}).
-\end{quote}
-
-Options:
-\begin{description}
-\iqdiscitem{Private XML Storage (\ns{jabber:iq:private})}
-\dbtype
-\end{description}
-
-\makesubsection{modproxy}{\modproxy{}}
-\ind{modules!\modversion{}}\ind{protocols!XEP-0065: SOCKS5 Bytestreams}
-
-This module implements SOCKS5 Bytestreams (\xepref{0065}).
-It allows \ejabberd{} to act as a file transfer proxy between two
-XMPP clients.
-
-Options:
-\begin{description}
-\hostitem{proxy}
-\titem{name: Text}\ind{options!name}Defines Service Discovery name of the service.
-Default is \term{"SOCKS5 Bytestreams"}.
-\titem{ip: IP}\ind{options!ip}This option specifies which network interface
-to listen for. Default is an IP address of the service's DNS name, or,
-if fails, \verb|"127.0.0.1"|.
-\titem{port: Number}\ind{options!port}This option defines port to listen for
-incoming connections. Default is~7777.
-\titem{hostname: HostName}\ind{options!hostname}Defines a hostname advertised
-by the service when establishing a session with clients. This is useful when
-you run the service behind a NAT. The default is the value of \term{ip} option.
-Examples: \term{"proxy.mydomain.org"}, \term{"200.150.100.50"}. Note that
-not all clients understand domain names in stream negotiation,
-so you should think twice before setting domain name in this option.
-\titem{auth\_type: anonymous|plain}\ind{options!auth\_type}SOCKS5 authentication type.
-Possible values are \term{anonymous} and \term{plain}. Default is
-\term{anonymous}.
-\titem{access: AccessName}\ind{options!access}Defines ACL for file transfer initiators.
-Default is \term{all}.
-\titem{max\_connections: Number}\ind{options!max\_connections}Maximum number of
-active connections per file transfer initiator. No limit by default.
-\titem{shaper: none|ShaperName}\ind{options!shaper}This option defines shaper for
-the file transfer peers. Shaper with the maximum bandwidth will be selected.
-Default is \term{none}.
-\end{description}
-
-Examples:
-\begin{itemize}
-\item The simpliest configuration of the module:
-\begin{verbatim}
-modules:
- ...
- mod_proxy65: {}
- ...
-\end{verbatim}
-\item More complicated configuration.
-\begin{verbatim}
-acl:
- admin:
- user:
- - "admin": "example.org"
- proxy_users:
- server:
- - "example.org"
-
-access:
- proxy65_access:
- proxy_users: allow
- all: deny
- proxy65_shaper:
- admin: none
- proxy_users: proxyrate
-
-shaper:
- proxyrate: 10240
-
-modules:
- ...
- mod_proxy65:
- host: "proxy1.example.org"
- name: "File Transfer Proxy"
- ip: "200.150.100.1"
- port: 7778
- max_connections: 5
- access: proxy65_access
- shaper: proxy65_shaper
- ...
-\end{verbatim}
-\end{itemize}
-
-\makesubsection{modpubsub}{\modpubsub{}}
-\ind{modules!\modpubsub{}}\ind{protocols!XEP-0060: Publish-Subscribe}
-
-This module offers a Publish-Subscribe Service (\xepref{0060}).
-The functionality in \modpubsub{} can be extended using plugins.
-The plugin that implements PEP (Personal Eventing via Pubsub) (\xepref{0163})
-is enabled in the default ejabberd configuration file,
-and it requires \modcaps{}.
-
-Options:
-\begin{description}
-\hostitem{pubsub}
- If you use \modpubsubodbc, please ensure the prefix contains only one dot,
- for example `\jid{pubsub.}', or `\jid{publish.}',.
-\titem{access\_createnode: AccessName} \ind{options!access\_createnode}
- This option restricts which users are allowed to create pubsub nodes using
- ACL and ACCESS.
- By default any account in the local ejabberd server is allowed to create pubsub nodes.
-\titem{max\_items\_node: MaxItems} \ind{options!max\_items\_node}
- Define the maximum number of items that can be stored in a node.
- Default value is 10.
-\titem{plugins: [ Plugin, ...]} \ind{options!plugins}
- To specify which pubsub node plugins to use.
- The first one in the list is used by default.
- If this option is not defined, the default plugins list is: \term{["flat"]}.
- PubSub clients can define which plugin to use when creating a node:
- add \term{type='plugin-name'} attribute to the \term{create} stanza element.
-\titem{nodetree: Nodetree} \ind{options!nodetree}
- To specify which nodetree to use.
- If not defined, the default pubsub nodetree is used: "tree".
- Only one nodetree can be used per host, and is shared by all node plugins.
-
- The "virtual" nodetree does not store nodes on database.
- This saves resources on systems with tons of nodes.
- If using the "virtual" nodetree,
- you can only enable those node plugins:
- ["flat","pep"] or ["flat"];
- any other plugins configuration will not work.
- Also, all nodes will have the defaut configuration,
- and this can not be changed.
- Using "virtual" nodetree requires to start from a clean database,
- it will not work if you used the default "tree" nodetree before.
-
- The "dag" nodetree provides experimental support for PubSub Collection Nodes (\xepref{0248}).
- In that case you should also add "dag" node plugin as default, for example:
- \term{plugins: ["dag","flat","hometree","pep"]}
-\titem{ignore\_pep\_from\_offline: false|true} \ind{options!ignore\_pep\_from\_offline}
- To specify whether or not we should get last published PEP items
- from users in our roster which are offline when we connect. Value is true or false.
- If not defined, pubsub assumes true so we only get last items of online contacts.
-\titem{last\_item\_cache: false|true} \ind{options!last\_item\_cache}
- To specify whether or not pubsub should cache last items. Value is true
- or false. If not defined, pubsub do not cache last items. On systems with not so many nodes,
- caching last items speeds up pubsub and allows to raise user connection rate. The cost is memory
- usage, as every item is stored in memory.
-\titem{pep\_mapping: \{Key, Value\}} \ind{pep\_mapping}
- This allow to define a Key-Value list to choose defined node plugins on given PEP namespace.
- The following example will use node\_tune instead of node\_pep for every PEP node with tune namespace:
-\begin{verbatim}
-modules:
- ...
- mod_pubsub:
- pep_mapping:
- "http://jabber.org/protocol/tune": "tune"
- ...
-\end{verbatim}
-%\titem{served\_hosts} \ind{options!served\_hosts}
-% This option allows to create additional pubsub virtual hosts in a single module instance.
-\end{description}
-
-Example of configuration that uses flat nodes as default, and allows use of flat, nodetree and pep nodes:
-\begin{verbatim}
-modules:
- ...
- mod_pubsub:
- access_createnode: pubsub_createnode
- plugins:
- - "flat"
- - "hometree"
- - "pep"
- ...
-\end{verbatim}
-
-Using ODBC database requires using mod\_pubsub\_odbc without option changes. Only flat, hometree and pep plugins supports ODBC.
-The following example shows previous configuration with ODBC usage:
-\begin{verbatim}
-modules:
- ...
- mod_pubsub_odbc:
- access_createnode: pubsub_createnode
- plugins:
- - "flat"
- - "hometree"
- - "pep"
- ...
-\end{verbatim}
-
-\makesubsection{modregister}{\modregister{}}
-\ind{modules!\modregister{}}\ind{protocols!XEP-0077: In-Band Registration}\ind{public registration}
-
-This module adds support for In-Band Registration (\xepref{0077}). This protocol
-enables end users to use a \XMPP{} client to:
-\begin{itemize}
-\item Register a new account on the server.
-\item Change the password from an existing account on the server.
-\item Delete an existing account on the server.
-\end{itemize}
-
-
-Options:
-\begin{description}
-\titem{access: AccessName} \ind{options!access}
- Specify rules to restrict what usernames can be registered and unregistered.
- If a rule returns `deny' on the requested username,
- registration and unregistration of that user name is denied.
- There are no restrictions by default.
-\titem{access\_from: AccessName} \ind{options!access\_from}By default, \ejabberd{}
-doesn't allow to register new accounts from s2s or existing c2s sessions. You can
-change it by defining access rule in this option. Use with care: allowing registration
-from s2s leads to uncontrolled massive accounts creation by rogue users.
-\titem{captcha\_protected: false|true} \ind{options!captcha\_protected}
-Protect registrations with CAPTCHA (see section \ref{captcha}). The default is \term{false}.
-\titem{ip\_access: AccessName} \ind{options!ip\_access}
- Define rules to allow or deny account registration depending
- on the IP address of the XMPP client. The \term{AccessName} should be
- of type \term{ip}. The default value is \term{all}.
-\titem{password\_strength: Entropy} \ind{options!password\_strength}
-This option sets the minimum informational entropy for passwords. The value \term{Entropy}
-is a number of bits of entropy. The recommended minimum is 32 bits.
-The default is 0, i.e. no checks are performed.
-\titem{welcome\_message: \{subject: Subject, body: Body\}}
- \ind{options!welcomem} Set a welcome message that
- is sent to each newly registered account. The first string is the subject, and
- the second string is the message body.
-\titem{registration\_watchers: [ JID, ...]} \ind{options!rwatchers}This option defines a
- list of JIDs which will be notified each time a new account is registered.
-\iqdiscitem{In-Band Registration (\ns{jabber:iq:register})}
-\end{description}
-
-This module reads also another option defined globally for the server:
-\term{registration\_timeout: Timeout}. \ind{options!registratimeout}
-This option limits the frequency of registration from a given IP or username.
-So, a user that tries to register a new account from the same IP address or JID during
-this number of seconds after his previous registration
-will receive an error \term{resource-constraint} with the explanation:
-``Users are not allowed to register accounts so quickly''.
-The timeout is expressed in seconds, and it must be an integer.
-To disable this limitation,
-instead of an integer put a word like: \term{infinity}.
-Default value: 600 seconds.
-
-Examples:
-\begin{itemize}
-\item Next example prohibits the registration of too short account names,
-and allows to create accounts only to clients of the local network:
-\begin{verbatim}
-acl:
- loopback:
- ip:
- - "127.0.0.0/8"
- - "::1"
- shortname:
- user_glob:
- - "?"
- - "??"
- ## The same using regexp:
- ##user_regexp: "^..?$"
-
-access:
- mynetworks:
- loopback: allow
- all: deny
- register:
- shortname: deny
- all: allow
-
-modules:
- mod_register:
- ip_access: mynetworks
- access: register
-\end{verbatim}
-\item This configuration prohibits usage of In-Band Registration
- to create or delete accounts,
- but allows existing accounts to change the password:
-\begin{verbatim}
-access:
- register:
- all: deny
-
-modules:
- ...
- mod_register:
- access: register
- ...
-\end{verbatim}
-\item
- This configuration disables all In-Band Registration
- functionality: create, delete accounts and change password:
-\begin{verbatim}
-modules:
- ...
- ## mod_register:
- ## access: register
- ...
-\end{verbatim}
-\item Define the welcome message and two registration watchers.
-Also define a registration timeout of one hour:
-\begin{verbatim}
-registration_timeout: 3600
-modules:
- ...
- mod_register:
- welcome_message:
- subject: "Welcome!"
- body: |-
- Hi.
- Welcome to this Jabber server.
- Check http://www.jabber.org
-
- Bye
- registration_watchers:
- - "admin1@example.org"
- - "boss@example.net"
- ...
-\end{verbatim}
-\end{itemize}
-
-\makesubsection{modregisterweb}{\modregisterweb{}}
-\ind{modules!\modregisterweb{}}
-
-This module provides a web page where people can:
-\begin{itemize}
-\item Register a new account on the server.
-\item Change the password from an existing account on the server.
-\item Delete an existing account on the server.
-\end{itemize}
-
-This module supports CAPTCHA image to register a new account.
-To enable this feature, configure the options captcha\_cmd and captcha\_host.
-
-Options:
-\begin{description}
-\titem{registration\_watchers: [ JID, ...]} \ind{options!rwatchers}This option defines a
- list of JIDs which will be notified each time a new account is registered.
-\end{description}
-
-This example configuration shows how to enable the module and the web handler:
-\begin{verbatim}
-hosts:
- - "localhost"
- - "example.org"
- - "example.com"
-listen:
- ...
- -
- port: 5281
- module: ejabberd_http
- register: true
- certfile: "/etc/ejabberd/certificate.pem"
- tls: true
- ...
-
-modules:
- ...
- mod_register_web: {}
- ...
-\end{verbatim}
-
-For example, the users of the host \term{example.org} can visit the page:
-\ns{https://example.org:5281/register/}
-It is important to include the last / character in the URL,
-otherwise the subpages URL will be incorrect.
-
-\makesubsection{modroster}{\modroster{}}
-\ind{modules!\modroster{}}\ind{roster management}\ind{protocols!RFC 6121: XMPP IM}
-
-This module implements roster management as defined in
-\footahref{http://tools.ietf.org/html/rfc6121\#section-2}{RFC 6121: XMPP IM}.
-It also supports Roster Versioning (\xepref{0237}).
-
-Options:
-\begin{description}
-\iqdiscitem{Roster Management (\ns{jabber:iq:roster})}
-\dbtype
- \titem{versioning: false|true} \ind{options!versioning}Enables
- Roster Versioning.
- This option is disabled by default.
- \titem{store\_current\_id: false|true} \ind{options!storecurrentid}
- If this option is enabled, the current version number is stored on the database.
- If disabled, the version number is calculated on the fly each time.
- Enabling this option reduces the load for both ejabberd and the database.
- This option does not affect the client in any way.
- This option is only useful if Roster Versioning is enabled.
- This option is disabled by default.
- Important: if you use \modsharedroster{} or \modsharedrosterldap{},
- you must disable this option.
- \titem{access} \ind{options!access}
- This option can be configured to specify rules to restrict roster management.
- If a rule returns `deny' on the requested user name,
- that user cannot modify his personal roster:
- not add/remove/modify contacts,
- or subscribe/unsubscribe presence.
- By default there aren't restrictions.
- \titem{managers} \ind{options!managers}
- List of remote entities that can manage users rosters using Remote Roster Management
- (\xepref{0321}).
- The protocol sections implemented are:
- \term{4.2. The remote entity requests current user's roster}.
- \term{4.3. The user updates roster}.
- \term{4.4. The remote entity updates the user's roster}.
- A remote entity cab only get or modify roster items that have the same domain as the entity.
- Default value is: \term{[]}.
-\end{description}
-
-This example configuration enables Roster Versioning with storage of current id.
-The ICQ and MSN transports can get ICQ and MSN contacts, add them, or remove them for any local account:
-\begin{verbatim}
-modules:
- ...
- mod_roster:
- versioning: true
- store_current_id: true
- managers:
- - "icq.example.org"
- - "msn.example.org"
- ...
-\end{verbatim}
-
-With this example configuration, only admins can manage their rosters;
-everybody else cannot modify the roster:
-\begin{verbatim}
-acl:
- admin:
- user:
- - "sarah": "example.org"
-access:
- roster:
- admin: allow
-
-modules:
- ...
- mod_roster:
- access: roster
- ...
-\end{verbatim}
-
-\makesubsection{modservicelog}{\modservicelog{}}
-\ind{modules!\modservicelog{}}\ind{message auditing}\ind{Bandersnatch}
-
-This module adds support for logging end user packets via a \XMPP{} message
-auditing service such as
-\footahref{http://www.funkypenguin.info/project/bandersnatch/}{Bandersnatch}. All user
-packets are encapsulated in a \verb|<route/>| element and sent to the specified
-service(s).
-
-Options:
-\begin{description}
-\titem{loggers: [Names, ...]} \ind{options!loggers}With this option a (list of) service(s)
- that will receive the packets can be specified.
-\end{description}
-
-Examples:
-\begin{itemize}
-\item To log all end user packets to the Bandersnatch service running on
- \jid{bandersnatch.example.com}:
-\begin{verbatim}
-modules:
- ...
- mod_service_log:
- loggers: ["bandersnatch.example.com"]
- ...
-\end{verbatim}
-\item To log all end user packets to the Bandersnatch service running on
- \jid{bandersnatch.example.com} and the backup service on
- \jid{bandersnatch.example.org}:
-\begin{verbatim}
-modules:
- ...
- mod_service_log:
- loggers:
- - "bandersnatch.example.com"
- - "bandersnatch.example.org"
- ...
-\end{verbatim}
-\end{itemize}
-
-\makesubsection{modsharedroster}{\modsharedroster{}}
-\ind{modules!\modsharedroster{}}\ind{shared roster groups}
-
-This module enables you to create shared roster groups. This means that you can
-create groups of people that can see members from (other) groups in their
-rosters. The big advantages of this feature are that end users do not need to
-manually add all users to their rosters, and that they cannot permanently delete
-users from the shared roster groups.
-A shared roster group can have members from any XMPP server,
-but the presence will only be available from and to members
-of the same virtual host where the group is created.
-
-Options:
-\begin{description}
-\dbtype
-\end{description}
-
-Shared roster groups can be edited \emph{only} via the Web Admin. Each group
-has a unique identification and the following parameters:
-\begin{description}
-\item[Name] The name of the group, which will be displayed in the roster.
-\item[Description] The description of the group. This parameter does not affect
- anything.
-\item[Members] A list of JIDs of group members, entered one per line in
- the Web Admin.
- The special member directive \term{@all@}
- represents all the registered users in the virtual host;
- which is only recommended for a small server with just a few hundred users.
- The special member directive \term{@online@}
- represents the online users in the virtual host.
-\item[Displayed groups]
- A list of groups that will be in the rosters of this group's members.
- A group of other vhost can be identified with \term{groupid@vhost}
-\end{description}
-
-Examples:
-\begin{itemize}
-\item Take the case of a computer club that wants all its members seeing each
- other in their rosters. To achieve this, they need to create a shared roster
- group similar to next table:
-\begin{table}[H]
- \centering
- \begin{tabular}{|l|l|}
- \hline Identification& Group `\texttt{club\_members}'\\
- \hline Name& Club Members\\
- \hline Description& Members from the computer club\\
- \hline Members&
- {\begin{tabular}{l}
- \jid{member1@example.org}\\
- \jid{member2@example.org}\\
- \jid{member3@example.org}
- \end{tabular}
- }\\
- \hline Displayed groups& \texttt{club\_members}\\
- \hline
- \end{tabular}
-\end{table}
-\item In another case we have a company which has three divisions: Management,
- Marketing and Sales. All group members should see all other members in their
- rosters. Additionally, all managers should have all marketing and sales people
- in their roster. Simultaneously, all marketeers and the whole sales team
- should see all managers. This scenario can be achieved by creating shared
- roster groups as shown in the following table:
-\begin{table}[H]
- \centering
- \begin{tabular}{|l|l|l|l|}
- \hline Identification&
- Group `\texttt{management}'&
- Group `\texttt{marketing}'&
- Group `\texttt{sales}'\\
- \hline Name& Management& Marketing& Sales\\
- \hline Description& \\
- Members&
- {\begin{tabular}{l}
- \jid{manager1@example.org}\\
- \jid{manager2@example.org}\\
- \jid{manager3@example.org}\\
- \jid{manager4@example.org}
- \end{tabular}
- }&
- {\begin{tabular}{l}
- \jid{marketeer1@example.org}\\
- \jid{marketeer2@example.org}\\
- \jid{marketeer3@example.org}\\
- \jid{marketeer4@example.org}
- \end{tabular}
- }&
- {\begin{tabular}{l}
- \jid{saleswoman1@example.org}\\
- \jid{salesman1@example.org}\\
- \jid{saleswoman2@example.org}\\
- \jid{salesman2@example.org}
- \end{tabular}
- }\\
- \hline Displayed groups&
- {\begin{tabular}{l}
- \texttt{management}\\
- \texttt{marketing}\\
- \texttt{sales}
- \end{tabular}
- }&
- {\begin{tabular}{l}
- \texttt{management}\\
- \texttt{marketing}
- \end{tabular}
- }&
- {\begin{tabular}{l}
- \texttt{management}\\
- \texttt{sales}
- \end{tabular}
- }\\
- \hline
- \end{tabular}
-\end{table}
-\end{itemize}
-
-\makesubsection{modsharedrosterldap}{\modsharedrosterldap{}}
-\ind{modules!\modsharedrosterldap{}}\ind{shared roster groups ldap}
-
-This module lets the server administrator
-automatically populate users' rosters (contact lists) with entries based on
-users and groups defined in an LDAP-based directory.
-
-\makesubsubsection{msrlconfigparams}{Configuration parameters}
-
-The module accepts the following configuration parameters. Some of them, if
-unspecified, default to the values specified for the top level of
-configuration. This lets you avoid specifying, for example, the bind password,
-in multiple places.
-
-\makeparagraph{msrlfilters}{Filters}
-
-These parameters specify LDAP filters used to query for shared roster information.
-All of them are run against the \verb|ldap_base|.
-
-\begin{description}
-
- \titem{{\tt ldap\_rfilter}}
- So called ``Roster Filter''. Used to find names of all ``shared roster'' groups.
- See also the \verb|ldap_groupattr| parameter.
- If unspecified, defaults to the top-level parameter of the same name.
- You {\em must} specify it in some place in the configuration, there is no default.
-
- \titem{{\tt ldap\_ufilter}}
- ``User Filter'' -- used for retrieving the human-readable name of roster
- entries (usually full names of people in the roster).
- See also the parameters \verb|ldap_userdesc| and \verb|ldap_useruid|.
- If unspecified, defaults to the top-level parameter of the same name.
- If that one also is unspecified, then the filter is assembled from values of
- other parameters as follows (\verb|[ldap_SOMETHING]| is used to mean ``the
- value of the configuration parameter {\tt ldap\_SOMETHING}''):
-
-\begin{verbatim}
-(&(&([ldap_memberattr]=[ldap_memberattr_format])([ldap_groupattr]=%g))[ldap_filter])
-\end{verbatim}
-
- Subsequently {\tt \%u} and {\tt \%g} are replaced with a {\tt *}. This means
- that given the defaults, the filter sent to the LDAP server is would be
- \verb|(&(memberUid=*)(cn=*))|. If however the {\tt ldap\_memberattr\_format}
- is something like \verb|uid=%u,ou=People,o=org|, then the filter will be
- \verb|(&(memberUid=uid=*,ou=People,o=org)(cn=*))|.
-
- \titem{{\tt ldap\_gfilter}}
- ``Group Filter'' -- used when retrieving human-readable name (a.k.a.
- ``Display Name'') and the members of a group.
- See also the parameters \verb|ldap_groupattr|, \verb|ldap_groupdesc| and \verb|ldap_memberattr|.
- If unspecified, defaults to the top-level parameter of the same name.
- If that one also is unspecified, then the filter is constructed exactly in the
- same way as {\tt User Filter}.
-
- \titem{{\tt ldap\_filter}}
- Additional filter which is AND-ed together with {\tt User Filter} and {\tt
- Group Filter}.
- If unspecified, defaults to the top-level parameter of the same name. If that
- one is also unspecified, then no additional filter is merged with the other
- filters.
-\end{description}
-
-Note that you will probably need to manually define the {\tt User} and {\tt
-Group Filter}s (since the auto-assembled ones will not work) if:
-\begin{itemize}
-\item your {\tt ldap\_memberattr\_format} is anything other than a simple {\tt \%u},
-\item {\bf and} the attribute specified with {\tt ldap\_memberattr} does not support substring matches.
-\end{itemize}
-An example where it is the case is OpenLDAP and {\tt (unique)MemberName} attribute from the {\tt groupOf(Unique)Names} objectClass.
-A symptom of this problem is that you will see messages such as the following in your {\tt slapd.log}:
-\begin{verbatim}
-get_filter: unknown filter type=130
-filter="(&(?=undefined)(?=undefined)(something=else))"
-\end{verbatim}
-
-\makesubsubsection{msrlattrs}{Attributes}
-
-These parameters specify the names of the attributes which hold interesting data
-in the entries returned by running filters specified in
-section~\ref{msrlfilters}.
-
-\begin{description}
- \titem{{\tt ldap\_groupattr}}
- The name of the attribute that holds the group name, and that is used to differentiate between them.
- Retrieved from results of the ``Roster Filter'' and ``Group Filter''.
- Defaults to {\tt cn}.
-
- \titem{{\tt ldap\_groupdesc}}
- The name of the attribute which holds the human-readable group name in the
- objects you use to represent groups.
- Retrieved from results of the ``Group Filter''.
- Defaults to whatever {\tt ldap\_groupattr} is set.
-
- \titem{{\tt ldap\_memberattr}}
- The name of the attribute which holds the IDs of the members of a group.
- Retrieved from results of the ``Group Filter''.
- Defaults to {\tt memberUid}.
-
- The name of the attribute differs depending on the {\tt objectClass} you use
- for your group objects, for example:
- \begin{description}
- \item{{\tt posixGroup}} $\rightarrow{}$ {\tt memberUid}
- \item{{\tt groupOfNames}} $\rightarrow{}$ {\tt member}
- \item{{\tt groupOfUniqueNames}} $\rightarrow{}$ {\tt uniqueMember}
- \end{description}
-
- \titem{{\tt ldap\_userdesc}}
- The name of the attribute which holds the human-readable user name.
- Retrieved from results of the ``User Filter''.
- Defaults to {\tt cn}.
-
- \titem{{\tt ldap\_useruid}}
- The name of the attribute which holds the ID of a roster item. Value of this
- attribute in the roster item objects needs to match the ID retrieved from the
- {\tt ldap\_memberattr} attribute of a group object.
- Retrieved from results of the ``User Filter''.
- Defaults to {\tt cn}.
-\end{description}
-
-\makesubsubsection{msrlcontrolparams}{Control parameters}
-
-These paramters control the behaviour of the module.
-
-\begin{description}
-
- \titem{{\tt ldap\_memberattr\_format}}
- A globbing format for extracting user ID from the value of the attribute named by
- \verb|ldap_memberattr|.
- Defaults to {\tt \%u}, which means that the whole value is the member ID. If
- you change it to something different, you may also need to specify the User
- and Group Filters manually --- see section~\ref{msrlfilters}.
-
- \titem{{\tt ldap\_memberattr\_format\_re}}
- A regex for extracting user ID from the value of the attribute named by
- \verb|ldap_memberattr|.
-
- An example value {\tt "CN=($\backslash{}\backslash{}$w*),(OU=.*,)*DC=company,DC=com"} works for user IDs such as the following:
- \begin{itemize}
- \item \texttt{CN=Romeo,OU=Montague,DC=company,DC=com}
- \item \texttt{CN=Abram,OU=Servants,OU=Montague,DC=company,DC=com}
- \item \texttt{CN=Juliet,OU=Capulet,DC=company,DC=com}
- \item \texttt{CN=Peter,OU=Servants,OU=Capulet,DC=company,DC=com}
- \end{itemize}
-
- In case:
- \begin{itemize}
- \item the option is unset,
- \item or the {\tt re} module in unavailable in the current Erlang environment,
- \item or the regular expression does not compile,
- \end{itemize}
- then instead of a regular expression, a simple format specified by {\tt
- ldap\_memberattr\_format} is used. Also, in the last two cases an error
- message is logged during the module initialization.
-
- Also, note that in all cases {\tt ldap\_memberattr\_format} (and {\em not} the
- regex version) is used for constructing the default ``User/Group Filter'' ---
- see section~\ref{msrlfilters}.
-
- \titem{{\tt ldap\_auth\_check}}
- Whether the module should check (via the ejabberd authentication subsystem)
- for existence of each user in the shared LDAP roster. See
- section~\ref{msrlconfigroster} form more information. Set to {\tt off} if you
- want to disable the check.
- Defaults to {\tt on}.
-
- \titem{{\tt ldap\_user\_cache\_validity}}
- Number of seconds for which the cache for roster item full names is considered
- fresh after retrieval. 300 by default. See section~\ref{msrlconfigroster} on
- how it is used during roster retrieval.
-
- \titem{{\tt ldap\_group\_cache\_validity}}
- Number of seconds for which the cache for group membership is considered
- fresh after retrieval. 300 by default. See section~\ref{msrlconfigroster} on
- how it is used during roster retrieval.
-\end{description}
-
-\makesubsubsection{msrlconnparams}{Connection parameters}
-
-The module also accepts the connection parameters, all of which default to the
-top-level parameter of the same name, if unspecified. See~\ref{ldapconnection}
-for more information about them.
-
-\makesubsubsection{msrlconfigroster}{Retrieving the roster}
-
-When the module is called to retrieve the shared roster for a user, the
-following algorithm is used:
-
-\begin{enumerate}
-\item \label{step:rfilter} A list of names of groups to display is created: the {\tt Roster Filter}
-is run against the base DN, retrieving the values of the attribute named by
-{\tt ldap\_groupattr}.
-
-\item Unless the group cache is fresh (see the {\tt
-ldap\_group\_cache\_validity} option), it is refreshed:
-
- \begin{enumerate}
- \item Information for all groups is retrieved using a single query: the {\tt
- Group Filter} is run against the Base DN, retrieving the values of attributes
- named by {\tt ldap\_groupattr} (group ID), {\tt ldap\_groupdesc} (group
- ``Display Name'') and {\tt ldap\_memberattr} (IDs of group members).
-
- \item group ``Display Name'', read from the attribute named by {\tt
- ldap\_groupdesc}, is stored in the cache for the given group
-
- \item the following processing takes place for each retrieved value of
- attribute named by {\tt ldap\_memberattr}:
- \begin{enumerate}
- \item the user ID part of it is extracted using {\tt
- ldap\_memberattr\_format(\_re)},
-
- \item then (unless {\tt ldap\_auth\_check} is set to {\tt off}) for each
- found user ID, the module checks (using the \ejabberd{} authentication
- subsystem) whether such user exists in the given virtual host. It is
- skipped if the check is enabled and fails.
-
- This step is here for historical reasons. If you have a tidy DIT and
- properly defined ``Roster Filter'' and ``Group Filter'', it is safe to
- disable it by setting {\tt ldap\_auth\_check} to {\tt off} --- it will
- speed up the roster retrieval.
-
- \item the user ID is stored in the list of members in the cache for the
- given group
- \end{enumerate}
- \end{enumerate}
-
-\item For each item (group name) in the list of groups retrieved in step~\ref{step:rfilter}:
-
- \begin{enumerate}
- \item the display name of a shared roster group is retrieved from the group
- cache
-
- \item for each IDs of users which belong to the group, retrieved from the
- group cache:
-
- \begin{enumerate}
- \item the ID is skipped if it's the same as the one for which we are
- retrieving the roster. This is so that the user does not have himself in
- the roster.
-
- \item the display name of a shared roster user is retrieved:
- \begin{enumerate}
- \item first, unless the user name cache is fresh (see the {\tt
- ldap\_user\_cache\_validity} option), it is refreshed by running the
- {\tt User Filter}, against the Base DN, retrieving the values of
- attributes named by {\tt ldap\_useruid} and {\tt ldap\_userdesc}.
- \item then, the display name for the given user ID is retrieved from the
- user name cache.
- \end{enumerate}
- \end{enumerate}
-
- \end{enumerate}
-
-\end{enumerate}
-
-\makesubsubsection{msrlconfigexample}{Configuration examples}
-
-Since there are many possible
-\footahref{http://en.wikipedia.org/wiki/Directory\_Information\_Tree}{DIT}
-layouts, it will probably be easiest to understand how to configure the module
-by looking at an example for a given DIT (or one resembling it).
-
-\makeparagraph{msrlconfigexampleflat}{Flat DIT}
-
-This seems to be the kind of DIT for which this module was initially designed.
-Basically there are just user objects, and group membership is stored in an
-attribute individually for each user. For example in a layout shown in
-figure~\ref{fig:msrl-dit-flat}, the group of each user is stored in its {\tt
-ou} attribute.
-
-\begin{figure}[htbp]
- \centering
- \insscaleimg{0.4}{msrl-dit-flat.png}
- \caption{Flat DIT graph}
- \label{fig:msrl-dit-flat}
-\end{figure}
-
-Such layout has a few downsides, including:
-\begin{itemize}
-\item information duplication -- the group name is repeated in every member object
-\item difficult group management -- information about group members is not
- centralized, but distributed between member objects
-\item inefficiency -- the list of unique group names has to be computed by iterating over all users
-\end{itemize}
-
-This however seems to be a common DIT layout, so the module keeps supporting it.
-You can use the following configuration\ldots
-\begin{verbatim}
-modules:
- ...
- mod_shared_roster_ldap:
- ldap_base: "ou=flat,dc=nodomain"
- ldap_rfilter: "(objectClass=inetOrgPerson)"
- ldap_groupattr: "ou"
- ldap_memberattr: "cn"
- ldap_filter: "(objectClass=inetOrgPerson)"
- ldap_userdesc: "displayName"
- ...
-\end{verbatim}
-
-\ldots to be provided with a roster as shown in figure~\ref{fig:msrl-roster-flat} upon connecting as user {\tt czesio}.
-
-\begin{figure}[htbp]
- \centering
- \insscaleimg{1}{msrl-roster-flat.png}
- \caption{Roster from flat DIT}
- \label{fig:msrl-roster-flat}
-\end{figure}
-
-\makeparagraph{msrlconfigexampledeep}{Deep DIT}
-
-This type of DIT contains distinctly typed objects for users and groups -- see figure~\ref{fig:msrl-dit-deep}.
-They are shown separated into different subtrees, but it's not a requirement.
-
-\begin{figure}[htbp]
- \centering
- \insscaleimg{0.35}{msrl-dit-deep.png}
- \caption{Example ``deep'' DIT graph}
- \label{fig:msrl-dit-deep}
-\end{figure}
-
-If you use the following example module configuration with it:
-\begin{verbatim}
-modules:
- ...
- mod_shared_roster_ldap:
- ldap_base: "ou=deep,dc=nodomain"
- ldap_rfilter: "(objectClass=groupOfUniqueNames)"
- ldap_filter: ""
- ldap_gfilter: "(&(objectClass=groupOfUniqueNames)(cn=%g))"
- ldap_groupdesc: "description"
- ldap_memberattr: "uniqueMember"
- ldap_memberattr_format: "cn=%u,ou=people,ou=deep,dc=nodomain"
- ldap_ufilter: "(&(objectClass=inetOrgPerson)(cn=%u))"
- ldap_userdesc: "displayName"
- ...
-\end{verbatim}
-
-\ldots and connect as user {\tt czesio}, then \ejabberd{} will provide you with
-the roster shown in figure~\ref{fig:msrl-roster-deep}.
-
-\begin{figure}[htbp]
- \centering
- \insscaleimg{1}{msrl-roster-deep.png}
- \caption{Example roster from ``deep'' DIT}
- \label{fig:msrl-roster-deep}
-\end{figure}
-
-\makesubsection{modsic}{\modsic{}}
-\ind{modules!\modstats{}}\ind{protocols!XEP-0279: Server IP Check}
-
-This module adds support for Server IP Check (\xepref{0279}). This protocol
-enables a client to discover its external IP address.
-
-Options:
-\begin{description}
-\iqdiscitem{\ns{urn:xmpp:sic:0}}
-\end{description}
-
-\makesubsection{modsip}{\modsip{}}
-\ind{modules!\modsip{}}
-This module adds SIP proxy/registrar support for the corresponding virtual host.
-Note that it is not enough to just load this module only. You should also configure
-listeners and DNS records properly. See section \ref{sip} for the full explanation.
-
-Example configuration:
-\begin{verbatim}
-modules:
- ...
- mod_sip: {}
- ...
-\end{verbatim}
-
-Options:
-\begin{description}
-\titem{record\_route: SIP\_URI}\ind{options!record\_route}When the option
-\term{always\_record\_route} is set or when SIP outbound
-is utilized \footahref{http://tools.ietf.org/html/rfc5626}{RFC 5626},
-\ejabberd{} inserts \term{Record-Route} header field with this \term{SIP\_URI}
-into a SIP message. The default is SIP URI constructed from the virtual host.
-\titem{always\_record\_route: true|false}\ind{options!always\_record\_route}
-Always insert \term{Record-Route} header into SIP messages. This approach allows
-to bypass NATs/firewalls a bit more easily. The default is \term{true}.
-\titem{routes: [SIP\_URI]}\ind{options!routes}You can set a list of SIP URIs of routes
-pointing to this proxy server. The default is a list of a SIP URI constructed
-from the virtual host.
-\titem{flow\_timeout\_udp: Seconds}For SIP outbound UDP connections set a keep-alive
-timer to \term{Seconds}. The default is 29.
-\titem{flow\_timeout\_tcp: Seconds}For SIP outbound TCP connections set a keep-alive
-timer to \term{Seconds}. The default is 120.
-\titem{via: [\{type: Type, host: Host, port: Port\}]}\ind{options!via}With
-this option for every \term{Type} you can specify \term{Host} and \term{Port}
-to set in \term{Via} header of outgoing SIP messages, where \term{Type} can be
-\term{udp}, \term{tcp} or \term{tls}. \term{Host} is a string and \term{Port} is
-a non negative integer. This is useful if you're running your server in a non-standard
-network topology.
-\end{description}
-Example complex configuration:
-\begin{verbatim}
-modules:
- ...
- mod_sip:
- always_record_route: false
- record_route: sip:example.com;lr
- routes:
- - sip:example.com;lr
- - sip:sip.example.com;lr
- flow_timeout_udp: 30
- flow_timeout_tcp: 130
- via:
- -
- type: tls
- host: "sip-tls.example.com"
- port: 5061
- -
- type: tcp
- host: "sip-tcp.example.com"
- port: 5060
- -
- type: udp
- host: "sip-udp.example.com"
- port: 5060
- ...
-\end{verbatim}
-
-\makesubsection{modstats}{\modstats{}}
-\ind{modules!\modstats{}}\ind{protocols!XEP-0039: Statistics Gathering}\ind{statistics}
-
-This module adds support for Statistics Gathering (\xepref{0039}). This protocol
-allows you to retrieve next statistics from your \ejabberd{} deployment:
-\begin{itemize}
-\item Total number of registered users on the current virtual host (users/total).
-\item Total number of registered users on all virtual hosts (users/all-hosts/total).
-\item Total number of online users on the current virtual host (users/online).
-\item Total number of online users on all virtual hosts (users/all-hosts/online).
-\end{itemize}
-
-Options:
-\begin{description}
-\iqdiscitem{Statistics Gathering (\ns{http://jabber.org/protocol/stats})}
-\end{description}
-
-As there are only a small amount of clients (for \ind{Tkabber}example
-\footahref{http://tkabber.jabber.ru/}{Tkabber}) and software libraries with
-support for this XEP, a few examples are given of the XML you need to send
-in order to get the statistics. Here they are:
-\begin{itemize}
-\item You can request the number of online users on the current virtual host
- (\jid{example.org}) by sending:
-\begin{verbatim}
-<iq to='example.org' type='get'>
- <query xmlns='http://jabber.org/protocol/stats'>
- <stat name='users/online'/>
- </query>
-</iq>
-\end{verbatim}
-\item You can request the total number of registered users on all virtual hosts
- by sending:
-\begin{verbatim}
-<iq to='example.org' type='get'>
- <query xmlns='http://jabber.org/protocol/stats'>
- <stat name='users/all-hosts/total'/>
- </query>
-</iq>
-\end{verbatim}
-\end{itemize}
-
-\makesubsection{modtime}{\modtime{}}
-\ind{modules!\modtime{}}\ind{protocols!XEP-0202: Entity Time}
-
-This module features support for Entity Time (\xepref{0202}). By using this XEP,
-you are able to discover the time at another entity's location.
-
-Options:
-\begin{description}
-\iqdiscitem{Entity Time (\ns{jabber:iq:time})}
-\end{description}
-
-\makesubsection{modvcard}{\modvcard{}}
-\ind{modules!\modvcard{}}\ind{JUD}\ind{Jabber User Directory}\ind{vCard}\ind{protocols!XEP-0054: vcard-temp}
-
-This module allows end users to store and retrieve their vCard, and to retrieve
-other users vCards, as defined in vcard-temp (\xepref{0054}). The module also
-implements an uncomplicated \Jabber{} User Directory based on the vCards of
-these users. Moreover, it enables the server to send its vCard when queried.
-
-Options:
-\begin{description}
-\hostitem{vjud}
-\iqdiscitem{\ns{vcard-temp}}
-\dbtype
-\titem{search: true|false}\ind{options!search}This option specifies whether the search
- functionality is enabled or not
- If disabled, the option \term{host} will be ignored and the
- \Jabber{} User Directory service will not appear in the Service Discovery item
- list. The default value is \term{true}.
-\titem{matches: infinity|Number}\ind{options!matches}With this option, the number of reported
- search results can be limited. If the option's value is set to \term{infinity},
- all search results are reported. The default value is \term{30}.
-\titem{allow\_return\_all: false|true}\ind{options!allow\_return\_all}This option enables
- you to specify if search operations with empty input fields should return all
- users who added some information to their vCard. The default value is
- \term{false}.
-\titem{search\_all\_hosts, true|false}\ind{options!search\_all\_hosts}If this option is set
- to \term{true}, search operations will apply to all virtual hosts. Otherwise
- only the current host will be searched. The default value is \term{true}.
- This option is available in \modvcard when using Mnesia, but not when using ODBC storage.
-\end{description}
-
-Examples:
-\begin{itemize}
-\item In this first situation, search results are limited to twenty items,
- every user who added information to their vCard will be listed when people
- do an empty search, and only users from the current host will be returned:
-\begin{verbatim}
-modules:
- ...
- mod_vcard:
- search: true
- matches: 20
- allow_return_all: true
- search_all_hosts: false
- ...
-\end{verbatim}
-\item The second situation differs in a way that search results are not limited,
- and that all virtual hosts will be searched instead of only the current one:
-\begin{verbatim}
-modules:
- ...
- mod_vcard:
- search: true
- matches: infinity
- allow_return_all: true
- ...
-\end{verbatim}
-\end{itemize}
-
-\makesubsection{modvcardldap}{\modvcardldap{}}
-\ind{modules!\modvcardldap{}}\ind{JUD}\ind{Jabber User Directory}\ind{vCard}\ind{protocols!XEP-0054: vcard-temp}
-
-%TODO: verify if the referrers to the LDAP section are still correct
-
-\ejabberd{} can map LDAP attributes to vCard fields. This behaviour is
-implemented in the \modvcardldap{} module. This module does not depend on the
-authentication method (see~\ref{ldapauth}).
-
-Usually \ejabberd{} treats LDAP as a read-only storage:
-it is possible to consult data, but not possible to
-create accounts or edit vCard that is stored in LDAP.
-However, it is possible to change passwords if \module{mod\_register} module is enabled
-and LDAP server supports
-\footahref{http://tools.ietf.org/html/rfc3062}{RFC 3062}.
-
-The \modvcardldap{} module has
-its own optional parameters. The first group of parameters has the same
-meaning as the top-level LDAP parameters to set the authentication method:
-\option{ldap\_servers}, \option{ldap\_port}, \option{ldap\_rootdn},
-\option{ldap\_password}, \option{ldap\_base}, \option{ldap\_uids},
-\option{ldap\_deref\_aliases} and \option{ldap\_filter}.
-See section~\ref{ldapauth} for detailed information
-about these options. If one of these options is not set, \ejabberd{} will look
-for the top-level option with the same name.
-
-The second group of parameters
-consists of the following \modvcardldap{}-specific options:
-
-\begin{description}
-\hostitem{vjud}
-\iqdiscitem{\ns{vcard-temp}}
-\titem{search: true|false}\ind{options!search}This option specifies whether the search
- functionality is enabled (value: \term{true}) or disabled (value:
- \term{false}). If disabled, the option \term{host} will be ignored and the
- \Jabber{} User Directory service will not appear in the Service Discovery item
- list. The default value is \term{true}.
-\titem{matches: infinity|Number}\ind{options!matches}With this option, the number of reported
- search results can be limited. If the option's value is set to \term{infinity},
- all search results are reported. The default value is \term{30}.
-\titem{ldap\_vcard\_map: \{ Name: \{Pattern, LDAPattributes\}, ...\}} \ind{options!ldap\_vcard\_map}
- With this option you can set the table that maps LDAP attributes to vCard fields.
- \ind{protocols!RFC 2426: vCard MIME Directory Profile}
- \term{Name} is the type name of the vCard as defined in
- \footahref{http://tools.ietf.org/html/rfc2426}{RFC 2426}.
- \term{Pattern} is a string which contains pattern variables
- \term{"\%u"}, \term{"\%d"} or \term{"\%s"}.
- \term{LDAPattributes} is the list containing LDAP attributes.
- The pattern variables
- \term{"\%s"} will be sequentially replaced
- with the values of LDAP attributes from \term{List\_of\_LDAP\_attributes},
- \term{"\%u"} will be replaced with the user part of a JID,
- and \term{"\%d"} will be replaced with the domain part of a JID.
- The default is:
-\begin{verbatim}
-"NICKNAME": {"%u": []}
-"FN": {"%s": ["displayName"]}
-"LAST": {"%s": ["sn"]}
-"FIRST": {"%s": ["givenName"]}
-"MIDDLE": {"%s": ["initials"]}
-"ORGNAME": {"%s": ["o"]}
-"ORGUNIT": {"%s": ["ou"]}
-"CTRY": {"%s": ["c"]}
-"LOCALITY": {"%s": ["l"]}
-"STREET": {"%s": ["street"]}
-"REGION": {"%s": ["st"]}
-"PCODE": {"%s": ["postalCode"]}
-"TITLE": {"%s": ["title"]}
-"URL": {"%s": ["labeleduri"]}
-"DESC": {"%s": ["description"]}
-"TEL": {"%s": ["telephoneNumber"]}
-"EMAIL": {"%s": ["mail"]}
-"BDAY": {"%s": ["birthDay"]}
-"ROLE": {"%s": ["employeeType"]}
-"PHOTO": {"%s": ["jpegPhoto"]}
-\end{verbatim}
-\titem{ldap\_search\_fields: \{ Name: Attribute, ...\}}\ind{options!ldap\_search\_fields}This option
- defines the search form and the LDAP attributes to search within.
- \term{Name} is the name of a search form
- field which will be automatically translated by using the translation
- files (see \term{msgs/*.msg} for available words). \term{Attribute} is the
- LDAP attribute or the pattern \term{"\%u"}. The default is:
-\begin{verbatim}
-"User": "%u"
-"Full Name": "displayName"
-"Given Name": "givenName"
-"Middle Name": "initials"
-"Family Name": "sn"
-"Nickname": "%u"
-"Birthday": "birthDay"
-"Country": "c"
-"City": "l"
-"Email": "mail"
-"Organization Name": "o"
-"Organization Unit": "ou"
-\end{verbatim}
-\titem{ldap\_search\_reported: \{ SearchField: VcardField, ...\}}\ind{options!ldap\_search\_reported}This option
- defines which search fields should be reported.
- \term{SearchField} is the name of a search form
- field which will be automatically translated by using the translation
- files (see \term{msgs/*.msg} for available words). \term{VcardField} is the
- vCard field name defined in the \option{ldap\_vcard\_map} option. The default
- is:
-\begin{verbatim}
-"Full Name": "FN"
-"Given Name": "FIRST"
-"Middle Name": "MIDDLE"
-"Family Name": "LAST"
-"Nickname": "NICKNAME"
-"Birthday": "BDAY"
-"Country": "CTRY"
-"City": "LOCALITY"
-"Email": "EMAIL"
-"Organization Name": "ORGNAME"
-"Organization Unit": "ORGUNIT"
-\end{verbatim}
-\end{description}
-
-%TODO: this examples still should be organised better
-Examples:
-\begin{itemize}
-\item
-
-Let's say \term{ldap.example.org} is the name of our LDAP server. We have
-users with their passwords in \term{"ou=Users,dc=example,dc=org"} directory.
-Also we have addressbook, which contains users emails and their additional
-infos in \term{"ou=AddressBook,dc=example,dc=org"} directory. Corresponding
-authentication section should looks like this:
-
-\begin{verbatim}
-## authentication method
-auth_method: ldap
-## DNS name of our LDAP server
-ldap_servers:
- - "ldap.example.org"
-## We want to authorize users from 'shadowAccount' object class only
-ldap_filter: "(objectClass=shadowAccount)"
-\end{verbatim}
-
-Now we want to use users LDAP-info as their vCards. We have four attributes
-defined in our LDAP schema: \term{"mail"} --- email address, \term{"givenName"}
---- first name, \term{"sn"} --- second name, \term{"birthDay"} --- birthday.
-Also we want users to search each other. Let's see how we can set it up:
-
-\begin{verbatim}
-modules:
- mod_vcard_ldap:
- ## We use the same server and port, but want to bind anonymously because
- ## our LDAP server accepts anonymous requests to
- ## "ou=AddressBook,dc=example,dc=org" subtree.
- ldap_rootdn: ""
- ldap_password: ""
- ## define the addressbook's base
- ldap_base: "ou=AddressBook,dc=example,dc=org"
- ## uidattr: user's part of JID is located in the "mail" attribute
- ## uidattr_format: common format for our emails
- ldap_uids: {"mail": "%u@mail.example.org"}
- ## Now we want to define vCard pattern
- ldap_vcard_map:
- "NICKNAME": {"%u": []} # just use user's part of JID as his nickname
- "FIRST": {"%s": ["givenName"]}
- "LAST": {"%s": ["sn"]}
- "FN": {"%s, %s": ["sn", "givenName"]} # example: "Smith, John"
- "EMAIL": {"%s": ["mail"]}
- "BDAY": {"%s": ["birthDay"]}
- ## Search form
- ldap_search_fields:
- "User": "%u"
- "Name": "givenName"
- "Family Name": "sn"
- "Email": "mail"
- "Birthday": "birthDay"
- ## vCard fields to be reported
- ## Note that JID is always returned with search results
- ldap_search_reported:
- "Full Name": "FN"
- "Nickname": "NICKNAME"
- "Birthday": "BDAY"
-\end{verbatim}
-
-Note that \modvcardldap{} module checks an existence of the user before
-searching his info in LDAP.
-
-\item \term{ldap\_vcard\_map} example:
-\begin{verbatim}
-ldap_vcard_map:
- "NICKNAME": {"%u": []} # just use user's part of JID as his nickname
- "FN": {"%s": ["displayName"]}
- "CTRY": {"Russia": []}
- "EMAIL": {"%u@%d": []}
- "DESC": {"%s\n%s": ["title", "description"]}
-\end{verbatim}
-\item \term{ldap\_search\_fields} example:
-\begin{verbatim}
-ldap_search_fields:
- "User": "uid"
- "Full Name": "displayName"
- "Email": "mail"
-\end{verbatim}
-\item \term{ldap\_search\_reported} example:
-\begin{verbatim}
-ldap_search_reported:
- "Full Name": "FN"
- "Email": "EMAIL"
- "Birthday": "BDAY"
- "Nickname": "NICKNAME"
-\end{verbatim}
-\end{itemize}
-
-\makesubsection{modvcardxupdate}{\modvcardxupdate{}}
-\ind{modules!\modvcardxupdate{}}\ind{protocols!XEP-0153: vCard-Based Avatars}
-
-The user's client can store an avatar in the user vCard.
-The vCard-Based Avatars protocol (\xepref{0153})
-provides a method for clients to inform the contacts what is the avatar hash value.
-However, simple or small clients may not implement that protocol.
-
-If this module is enabled, all the outgoing client presence stanzas get automatically
-the avatar hash on behalf of the client.
-So, the contacts receive the presence stanzas with the Update Data described
-in \xepref{0153} as if the client would had inserted it itself.
-If the client had already included such element in the presence stanza,
-it is replaced with the element generated by ejabberd.
-
-By enabling this module, each vCard modification produces a hash recalculation,
-and each presence sent by a client produces hash retrieval and a
-presence stanza rewrite.
-For this reason, enabling this module will introduce a computational overhead
-in servers with clients that change frequently their presence.
-
-Options:
-\begin{description}
-\dbtype
-\end{description}
-
-\makesubsection{modversion}{\modversion{}}
-\ind{modules!\modversion{}}\ind{protocols!XEP-0092: Software Version}
-
-This module implements Software Version (\xepref{0092}). Consequently, it
-answers \ejabberd{}'s version when queried.
-
-Options:
-\begin{description}
-\titem{show\_os: true|false}\ind{options!showos}Should the operating system be revealed or not.
- The default value is \term{true}.
-\iqdiscitem{Software Version (\ns{jabber:iq:version})}
-\end{description}
-
-\makechapter{manage}{Managing an \ejabberd{} Server}
-
-
-\makesection{ejabberdctl}{\term{ejabberdctl}}
-
-With the \term{ejabberdctl} command line administration script
-you can execute \term{ejabberdctl commands} (described in the next section, \ref{ectl-commands})
-and also many general \term{ejabberd commands} (described in section \ref{eja-commands}).
-This means you can start, stop and perform many other administrative tasks
-in a local or remote \ejabberd{} server (by providing the argument \term{--node NODENAME}).
-
-The \term{ejabberdctl} script can be configured in the file \term{ejabberdctl.cfg}.
-This file includes detailed information about each configurable option. See section \ref{erlangconfiguration}.
-
-The \term{ejabberdctl} script returns a numerical status code.
-Success is represented by \term{0},
-error is represented by \term{1},
-and other codes may be used for specific results.
-This can be used by other scripts to determine automatically
-if a command succeeded or failed,
-for example using: \term{echo \$?}
-
-If you use Bash, you can get Bash completion by copying the file \term{tools/ejabberdctl.bc}
-to the directory \term{/etc/bash\_completion.d/} (in Debian, Ubuntu, Fedora and maybe others).
-
-\makesubsection{ectl-commands}{ejabberdctl Commands}
-
-When \term{ejabberdctl} is executed without any parameter,
-it displays the available options. If there isn't an \ejabberd{} server running,
-the available parameters are:
-\begin{description}
-\titem{start} Start \ejabberd{} in background mode. This is the default method.
-\titem{debug} Attach an Erlang shell to an already existing \ejabberd{} server. This allows to execute commands interactively in the \ejabberd{} server.
-\titem{live} Start \ejabberd{} in live mode: the shell keeps attached to the started server, showing log messages and allowing to execute interactive commands.
-\end{description}
-
-If there is an \ejabberd{} server running in the system,
-\term{ejabberdctl} shows the \term{ejabberdctl commands} described bellow
-and all the \term{ejabberd commands} available in that server (see \ref{list-eja-commands}).
-
-The \term{ejabberdctl commands} are:
-\begin{description}
-\titem{help} Get help about ejabberdctl or any available command. Try \term{ejabberdctl help help}.
-\titem{status} Check the status of the \ejabberd{} server.
-\titem{stop} Stop the \ejabberd{} server.
-\titem{restart} Restart the \ejabberd{} server.
-\titem{mnesia} Get information about the Mnesia database.
-\end{description}
-
-The \term{ejabberdctl} script can be restricted to require authentication
-and execute some \term{ejabberd commands}; see \ref{accesscommands}.
-
-If account \term{robot1@example.org} is registered in \ejabberd{} with password \term{abcdef}
-(which MD5 is E8B501798950FC58AAD83C8C14978E),
-and your old-format configuration file contains this setting:
-\begin{verbatim}
-{hosts, ["example.org"]}.
-{acl, bots, {user, "robot1", "example.org"}}.
-{access, ctlaccess, [{allow, bots}]}.
-{ejabberdctl_access_commands, [ {ctlaccess, [registered_users, register], []} ]}.
-\end{verbatim}
-then you can do this in the shell:
-\begin{verbatim}
-$ ejabberdctl registered_users example.org
-Error: no_auth_provided
-$ ejabberdctl --auth robot1 example.org abcdef registered_users example.org
-robot1
-testuser1
-testuser2
-\end{verbatim}
-
-
-\makesubsection{erlangconfiguration}{Erlang Runtime System}
-
-\ejabberd{} is an Erlang/OTP application that runs inside an Erlang runtime system.
-This system is configured using environment variables and command line parameters.
-The \term{ejabberdctl} administration script uses many of those possibilities.
-You can configure some of them with the file \term{ejabberdctl.cfg},
-which includes detailed description about them.
-This section describes for reference purposes
-all the environment variables and command line parameters.
-
-The environment variables:
-\begin{description}
- \titem{EJABBERD\_CONFIG\_PATH}
- Path to the ejabberd configuration file.
- \titem{EJABBERD\_MSGS\_PATH}
- Path to the directory with translated strings.
- \titem{EJABBERD\_LOG\_PATH}
- Path to the ejabberd service log file.
- \titem{EJABBERD\_SO\_PATH}
- Path to the directory with binary system libraries.
- \titem{EJABBERD\_DOC\_PATH}
- Path to the directory with ejabberd documentation.
- \titem{EJABBERD\_PID\_PATH}
- Path to the PID file that ejabberd can create when started.
- \titem{HOME}
- Path to the directory that is considered \ejabberd{}'s home.
- This path is used to read the file \term{.erlang.cookie}.
- \titem{ERL\_CRASH\_DUMP}
- Path to the file where crash reports will be dumped.
- \titem{ERL\_EPMD\_ADDRESS}
- IP address where epmd listens for connections (see section \ref{epmd}).
- \titem{ERL\_INETRC}
- Indicates which IP name resolution to use.
- If using \term{-sname}, specify either this option or \term{-kernel inetrc filepath}.
- \titem{ERL\_MAX\_PORTS}
- Maximum number of simultaneously open Erlang ports.
- \titem{ERL\_MAX\_ETS\_TABLES}
- Maximum number of ETS and Mnesia tables.
-\end{description}
-
-The command line parameters:
-\begin{description}
- \titem{-sname ejabberd}
- The Erlang node will be identified using only the first part
- of the host name, i.\,e. other Erlang nodes outside this domain cannot contact
- this node. This is the preferable option in most cases.
- \titem{-name ejabberd}
- The Erlang node will be fully identified.
- This is only useful if you plan to setup an \ejabberd{} cluster with nodes in different networks.
- \titem{-kernel inetrc '"/etc/ejabberd/inetrc"'}
- Indicates which IP name resolution to use.
- If using \term{-sname}, specify either this option or \term{ERL\_INETRC}.
- \titem{-kernel inet\_dist\_listen\_min 4200 inet\_dist\_listen\_min 4210}
- Define the first and last ports that \term{epmd} (section \ref{epmd}) can listen to.
- \titem{-kernel inet\_dist\_use\_interface "\{ 127,0,0,1 \}"}
- Define the IP address where this Erlang node listens for other nodes
- connections (see section \ref{epmd}).
- \titem{-detached}
- Starts the Erlang system detached from the system console.
- Useful for running daemons and background processes.
- \titem{-noinput}
- Ensures that the Erlang system never tries to read any input.
- Useful for running daemons and background processes.
- \titem{-pa /var/lib/ejabberd/ebin}
- Specify the directory where Erlang binary files (*.beam) are located.
- \titem{-s ejabberd}
- Tell Erlang runtime system to start the \ejabberd{} application.
- \titem{-mnesia dir '"/var/lib/ejabberd/"'}
- Specify the Mnesia database directory.
- \titem{-sasl sasl\_error\_logger \{file, "/var/log/ejabberd/erlang.log"\}}
- Path to the Erlang/OTP system log file.
- SASL here means ``System Architecture Support Libraries''
- not ``Simple Authentication and Security Layer''.
- \titem{+K [true|false]}
- Kernel polling.
- \titem{-smp [auto|enable|disable]}
- SMP support.
- \titem{+P 250000}
- Maximum number of Erlang processes.
- \titem{-remsh ejabberd@localhost}
- Open an Erlang shell in a remote Erlang node.
- \titem{-hidden}
- The connections to other nodes are hidden (not published).
- The result is that this node is not considered part of the cluster.
- This is important when starting a temporary \term{ctl} or \term{debug} node.
-\end{description}
-Note that some characters need to be escaped when used in shell scripts, for instance \verb|"| and \verb|{}|.
-You can find other options in the Erlang manual page (\shell{erl -man erl}).
-
-\makesection{eja-commands}{\ejabberd{} Commands}
-
-An \term{ejabberd command} is an abstract function identified by a name,
-with a defined number and type of calling arguments and type of result
-that is registered in the \term{ejabberd\_commands} service.
-Those commands can be defined in any Erlang module and executed using any valid frontend.
-
-\ejabberd{} includes two frontends to execute \term{ejabberd commands}: the script \term{ejabberdctl} (\ref{ejabberdctl})
-and the \term{ejabberd\_xmlrpc} listener (\ref{listened-module}).
-Other known frontends that can be installed to execute ejabberd commands in different ways are:
-\term{mod\_rest} (HTTP POST service),
-\term{mod\_shcommands} (ejabberd WebAdmin page).
-
-\makesubsection{list-eja-commands}{List of ejabberd Commands}
-
-\ejabberd{} includes a few ejabberd Commands by default as listed below.
-When more modules are installed, new commands may be available in the frontends.
-
-The easiest way to get a list of the available commands, and get help for them is to use
-the ejabberdctl script:
-\begin{verbatim}
-$ ejabberdctl help
-Usage: ejabberdctl [--node nodename] [--auth user host password] command [options]
-
-Available commands in this ejabberd node:
- backup file Store the database to backup file
- connected_users List all established sessions
- connected_users_number Get the number of established sessions
- ...
-\end{verbatim}
-
-The commands included in ejabberd by default are:
-\begin{description}
-\titem{stop\_kindly delay announcement} Inform users and rooms, wait, and stop the server.
- Provide the delay in seconds, and the announcement quoted.
-\titem{registered\_vhosts} List all registered vhosts in SERVER
-\titem{reopen\_log} Reopen the log files after they were renamed.
- If the old files were not renamed before calling this command,
- they are automatically renamed to \term{"*-old.log"}. See section \ref{logfiles}.
-\titem {convert\_to\_yaml /etc/ejabberd/ejabberd.cfg /etc/ejabberd/ejabberd-converted.yml}
- Convert an old ejabberd.cfg file to the YAML syntax in a new file.
-\titem {backup ejabberd.backup}
- Store internal Mnesia database to a binary backup file.
-\titem {restore ejabberd.backup}
- Restore immediately from a binary backup file the internal Mnesia database.
- This will consume a lot of memory if you have a large database,
- so better use \term{install\_fallback}.
-\titem {install\_fallback ejabberd.backup}
- The binary backup file is installed as fallback:
- it will be used to restore the database at the next ejabberd start.
- This means that, after running this command, you have to restart ejabberd.
- This command requires less memory than \term{restore}.
-\titem {dump ejabberd.dump}
- Dump internal Mnesia database to a text file dump.
-\titem {load ejabberd.dump}
- Restore immediately from a text file dump.
- This is not recommended for big databases, as it will consume much time,
- memory and processor. In that case it's preferable to use \term{backup} and \term{install\_fallback}.
-\titem{import\_piefxis, export\_piefxis, export\_piefxis\_host} \ind{migrate between servers}
- These options can be used to migrate accounts
- using \xepref{0227} formatted XML files
- from/to other Jabber/XMPP servers
- or move users of a vhost to another ejabberd installation.
- See also \footahref{https://support.process-one.net/doc/display/MESSENGER/ejabberd+migration+kit}{ejabberd migration kit}.
-\titem{import\_file, import\_dir} \ind{migration from other software}
- These options can be used to migrate accounts
- using jabberd1.4 formatted XML files.
- from other Jabber/XMPP servers
- There exist tutorials to
- \footahref{http://www.ejabberd.im/migrate-to-ejabberd}{migrate from other software to ejabberd}.
-\titem{set\_master nodename}
- Set master node of the clustered Mnesia tables.
- If you provide as nodename "self", this node will be set as its own master.
-\titem{mnesia\_change\_nodename oldnodename newnodename oldbackup newbackup}
- Change the erlang node name in a backup file
-\titem{export2odbc virtualhost directory} \ind{export mnesia data to SQL files}
- Export virtual host information from Mnesia tables to SQL files.
-\titem{update\_list} List modified modules that can be updated
-\titem{update module} Update the given module, or use the keyword: all
-\titem{reload\_config} Reload ejabberd configuration file into memory
-\titem{delete\_expired\_messages} This option can be used to delete old messages
- in offline storage. This might be useful when the number of offline messages
- is very high.
-\titem{delete\_old\_messages days} Delete offline messages older than the given days.
-\titem{incoming\_s2s\_number} Number of incoming s2s connections on the node
-\titem{outgoing\_s2s\_number} Number of outgoing s2s connections on the node
-\titem{register user host password} Register an account in that domain with the given password.
-\titem{unregister user host} Unregister the given account.
-\titem{registered\_users host} List all registered users in HOST
-\titem{connected\_users} List all established sessions
-\titem{connected\_users\_number} Get the number of established sessions
-\titem{user\_resources user host} List user's connected resources
-\titem{kick\_user user host} Disconnect user's active sessions
-
-\end{description}
-
-\makesubsection{accesscommands}{Restrict Execution with AccessCommands}
-
-The frontends can be configured to restrict access to certain commands
-using the \term{AccessCommands}.
-In that case, authentication information must be provided.
-
-This option allows quite complex settings, so it does not use the YAML format,
-instead it uses the Erlang format.
-If you want to set that option,
-then you must move the frontend definition to another config file
-and include it using the \term{include\_config\_file} option
-(see section~\ref{includeconfigfile} and the example below).
-
-In each frontend the \term{AccessCommands} option is defined
-in a different place. But in all cases the option syntax is the same:
-\begin{verbatim}
-AccessCommands = [ {Access, CommandNames, Arguments}, ...]
-Access = atom()
-CommandNames = all | [CommandName]
-CommandName = atom()
-Arguments = [ {ArgumentName, ArgumentValue}, ...]
-ArgumentName = atom()
-ArgumentValue = any()
-\end{verbatim}
-
-The default value is to not define any restriction: \term{[]}.
-The authentication information is provided when executing a command,
-and is Username, Hostname and Password of a local XMPP account
-that has permission to execute the corresponding command.
-This means that the account must be registered in the local ejabberd,
-because the information will be verified.
-
-When one or several access restrictions are defined and the
-authentication information is provided,
-each restriction is verified until one matches completely:
-the account matches the Access rule,
-the command name is listed in CommandNames,
-and the provided arguments do not contradict Arguments.
-
-As an example to understand the syntax, let's suppose those options:
-\begin{verbatim}
-{hosts, ["example.org"]}.
-{acl, bots, {user, "robot1", "example.org"}}.
-{access, commaccess, [{allow, bots}]}.
-\end{verbatim}
-
-This list of access restrictions allows only \term{robot1@example.org} to execute all commands:
-\begin{verbatim}
-[{commaccess, all, []}]
-\end{verbatim}
-
-See another list of restrictions (the corresponding ACL and ACCESS are not shown):
-\begin{verbatim}
-[
- %% This bot can execute all commands:
- {bot, all, []},
- %% This bot can only execute the command 'dump'. No argument restriction:
- {bot_backups, [dump], []}
- %% This bot can execute all commands,
- %% but if a 'host' argument is provided, it must be "example.org":
- {bot_all_example, all, [{host, "example.org"}]},
- %% This bot can only execute the command 'register',
- %% and if argument 'host' is provided, it must be "example.org":
- {bot_reg_example, [register], [{host, "example.org"}]},
- %% This bot can execute the commands 'register' and 'unregister',
- %% if argument host is provided, it must be "test.org":
- {_bot_reg_test, [register, unregister], [{host, "test.org"}]}
-]
-\end{verbatim}
-
-In summary, you put the frontends configurations in a CFG file using Erlang format, for example a file called \term{additional.cfg}:
-\begin{verbatim}
-{ejabberdctl_access_commands, [ {ctlaccess, [registered_users, register], []} ]}.
-
-{listen, [
- {4560, ejabberd_xmlrpc, [{maxsessions, 10}, {timeout, 5000},
- {access_commands, [
- {ctlaccess, [registered_users], [{host, "localhost"}]}
- ]}
- ]}
- ]}.
-
-{modules, [
- {mod_rest, [
- {allowed_ips, [ {127,0,0,1}, {192,168,1,12} ]},
- {allowed_destinations, [ "nolan@localhost", "admin@example.com" ]},
- {allowed_stanza_types, [ "message", "presence", "iq" ]},
- {access_commands, [
- {ctlaccess, [registered_users], [{host, "localhost"}]}
- ]}
- ]}
- ]}.
-\end{verbatim}
-and then add this line at the end of your main ejabberd configuration file, usually called \term{ejabberd.yml}:
-\begin{verbatim}
-include_config_file: "/etc/ejabberd/additional.cfg"
-\end{verbatim}
-
-\makesection{webadmin}{Web Admin}
-\ind{web admin}
-
-The \ejabberd{} Web Admin allows to administer most of \ejabberd{} using a web browser.
-
-This feature is enabled by default:
-a \term{ejabberd\_http} listener with the option \term{web\_admin} (see
-section~\ref{listened}) is included in the listening ports. Then you can open
-\verb|http://server:port/admin/| in your favourite web browser. You
-will be asked to enter the username (the \emph{full} \Jabber{} ID) and password
-of an \ejabberd{} user with administrator rights. After authentication
-you will see a page similar to figure~\ref{fig:webadmmain}.
-
-\begin{figure}[htbp]
- \centering
- \insimg{webadmmain.png}
- \caption{Top page from the Web Admin}
- \label{fig:webadmmain}
-\end{figure}
-Here you can edit access restrictions, manage users, create backups,
-manage the database, enable/disable ports listened for, view server
-statistics,\ldots
-
-The access rule \term{configure} determines what accounts can access the Web Admin and modify it.
-The access rule \term{webadmin\_view} is to grant only view access: those accounts can browse the Web Admin with read-only access.
-
-Example configurations:
-\begin{itemize}
-\item You can serve the Web Admin on the same port as the
- \ind{protocols!XEP-0025: HTTP Polling}HTTP Polling interface. In this example
- you should point your web browser to \verb|http://example.org:5280/admin/| to
- administer all virtual hosts or to
- \verb|http://example.org:5280/admin/server/example.com/| to administer only
- the virtual host \jid{example.com}. Before you get access to the Web Admin
- you need to enter as username, the JID and password from a registered user
- that is allowed to configure \ejabberd{}. In this example you can enter as
- username `\jid{admin@example.net}' to administer all virtual hosts (first
- URL). If you log in with `\jid{admin@example.com}' on \\
- \verb|http://example.org:5280/admin/server/example.com/| you can only
- administer the virtual host \jid{example.com}.
- The account `\jid{reviewer@example.com}' can browse that vhost in read-only mode.
-\begin{verbatim}
-acl:
- admin:
- user:
- - "admin": "example.net"
-
-host_config:
- "example.com":
- acl:
- admin:
- user:
- - "admin": "example.com"
- viewers:
- user:
- - "reviewer": "example.com"
-
-access:
- configure:
- admin: allow
- webadmin_view:
- viewers: allow
-
-hosts:
- - "example.org"
-
-listen:
- ...
- -
- port: 5280
- module: ejabberd_http
- web_admin: true
- http_poll: true
- ...
-\end{verbatim}
-\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:5282/admin/|:
-\begin{verbatim}
-hosts:
- - "example.org"
-listen:
- ...
- -
- port: 5280
- module: ejabberd_http
- http_poll: true
- -
- ip: "192.168.1.1"
- port: 5282
- module: ejabberd_http
- certfile: "/usr/local/etc/server.pem"
- tls: true
- web_admin: true
- ...
-\end{verbatim}
-\end{itemize}
-
-Certain pages in the ejabberd Web Admin contain a link to a related
-section in the ejabberd Installation and Operation Guide.
-In order to view such links, a copy in HTML format of the Guide must
-be installed in the system.
-The file is searched by default in
-\term{"/share/doc/ejabberd/guide.html"}.
-The directory of the documentation can be specified in
-the environment variable \term{EJABBERD\_DOC\_PATH}.
-See section \ref{erlangconfiguration}.
-
-
-\makesection{adhoccommands}{Ad-hoc Commands}
-
-If you enable \modconfigure\ and \modadhoc,
-you can perform several administrative tasks in \ejabberd{}
-with an XMPP client.
-The client must support Ad-Hoc Commands (\xepref{0050}),
-and you must login in the XMPP server with
-an account with proper privileges.
-
-
-\makesection{changeerlangnodename}{Change Computer Hostname}
-
-\ejabberd{} uses the distributed Mnesia database.
-Being distributed, Mnesia enforces consistency of its file,
-so it stores the name of the Erlang node in it (see section \ref{nodename}).
-The name of an Erlang node includes the hostname of the computer.
-So, the name of the Erlang node changes
-if you change the name of the machine in which \ejabberd{} runs,
-or when you move \ejabberd{} to a different machine.
-
-You have two ways to use the old Mnesia database in an ejabberd with new node name:
-put the old node name in \term{ejabberdctl.cfg},
-or convert the database to the new node name.
-
-Those example steps will backup, convert and load the Mnesia database.
-You need to have either the old Mnesia spool dir or a backup of Mnesia.
-If you already have a backup file of the old database, you can go directly to step 5.
-You also need to know the old node name and the new node name.
-If you don't know them, look for them by executing \term{ejabberdctl}
-or in the ejabberd log files.
-
-Before starting, setup some variables:
-\begin{verbatim}
-OLDNODE=ejabberd@oldmachine
-NEWNODE=ejabberd@newmachine
-OLDFILE=/tmp/old.backup
-NEWFILE=/tmp/new.backup
-\end{verbatim}
-
-\begin{enumerate}
-\item Start ejabberd enforcing the old node name:
-\begin{verbatim}
-ejabberdctl --node $OLDNODE start
-\end{verbatim}
-
-\item Generate a backup file:
-\begin{verbatim}
-ejabberdctl --node $OLDNODE backup $OLDFILE
-\end{verbatim}
-
-\item Stop the old node:
-\begin{verbatim}
-ejabberdctl --node $OLDNODE stop
-\end{verbatim}
-
-\item Make sure there aren't files in the Mnesia spool dir. For example:
-\begin{verbatim}
-mkdir /var/lib/ejabberd/oldfiles
-mv /var/lib/ejabberd/*.* /var/lib/ejabberd/oldfiles/
-\end{verbatim}
-
-\item Start ejabberd. There isn't any need to specify the node name anymore:
-\begin{verbatim}
-ejabberdctl start
-\end{verbatim}
-
-\item Convert the backup to new node name:
-\begin{verbatim}
-ejabberdctl mnesia_change_nodename $OLDNODE $NEWNODE $OLDFILE $NEWFILE
-\end{verbatim}
-
-\item Install the backup file as a fallback:
-\begin{verbatim}
-ejabberdctl install_fallback $NEWFILE
-\end{verbatim}
-
-\item Stop ejabberd:
-\begin{verbatim}
-ejabberdctl stop
-\end{verbatim}
-You may see an error message in the log files, it's normal, so don't worry:
-\begin{verbatim}
-Mnesia(ejabberd@newmachine):
-** ERROR ** (ignoring core)
-** FATAL ** A fallback is installed and Mnesia must be restarted.
- Forcing shutdown after mnesia_down from ejabberd@newmachine...
-\end{verbatim}
-
-\item Now you can finally start ejabberd:
-\begin{verbatim}
-ejabberdctl start
-\end{verbatim}
-
-\item Check that the information of the old database is available: accounts, rosters...
-After you finish, remember to delete the temporary backup files from public directories.
-\end{enumerate}
-
-
-\makechapter{secure}{Securing \ejabberd{}}
-
-\makesection{firewall}{Firewall Settings}
-\ind{firewall}\ind{ports}\ind{SASL}\ind{TLS}\ind{clustering!ports}
-
-You need to take the following TCP ports in mind when configuring your firewall:
-\begin{table}[H]
- \centering
- \begin{tabular}{|l|l|}
- \hline {\bf Port} & {\bf Description} \\
- \hline \hline 5222& Standard port for Jabber/XMPP client connections, plain or STARTTLS.\\
- \hline 5223& Standard port for Jabber client connections using the old SSL method.\\
- \hline 5269& Standard port for Jabber/XMPP server connections.\\
- \hline 4369& EPMD (section \ref{epmd}) listens for Erlang node name requests.\\
- \hline port range& Used for connections between Erlang nodes. This range is configurable (see section \ref{epmd}).\\
- \hline
- \end{tabular}
-\end{table}
-
-\makesection{epmd}{epmd}
-
-\footahref{http://www.erlang.org/doc/man/epmd.html}{epmd (Erlang Port Mapper Daemon)}
-is a small name server included in Erlang/OTP
-and used by Erlang programs when establishing distributed Erlang communications.
-\ejabberd{} needs \term{epmd} to use \term{ejabberdctl} and also when clustering \ejabberd{} nodes.
-This small program is automatically started by Erlang, and is never stopped.
-If \ejabberd{} is stopped, and there aren't any other Erlang programs
-running in the system, you can safely stop \term{epmd} if you want.
-
-\ejabberd{} runs inside an Erlang node.
-To communicate with \ejabberd{}, the script \term{ejabberdctl} starts a new Erlang node
-and connects to the Erlang node that holds \ejabberd{}.
-In order for this communication to work,
-\term{epmd} must be running and listening for name requests in the port 4369.
-You should block the port 4369 in the firewall in such a way that
-only the programs in your machine can access it.
-or configure the option \term{ERL\_EPMD\_ADDRESS} in the file \term{ejabberdctl.cfg}.
-
-If you build a cluster of several \ejabberd{} instances,
-each \ejabberd{} instance is called an \ejabberd{} node.
-Those \ejabberd{} nodes use a special Erlang communication method to
-build the cluster, and EPMD is again needed listening in the port 4369.
-So, if you plan to build a cluster of \ejabberd{} nodes
-you must open the port 4369 for the machines involved in the cluster.
-Remember to block the port so Internet doesn't have access to it.
-
-Once an Erlang node solved the node name of another Erlang node using EPMD and port 4369,
-the nodes communicate directly.
-The ports used in this case by default are random,
-but can be configured in the file \term{ejabberdctl.cfg}.
-The Erlang command-line parameter used internally is, for example:
-\begin{verbatim}
-erl ... -kernel inet_dist_listen_min 4370 inet_dist_listen_max 4375
-\end{verbatim}
-It is also possible to configure in \term{ejabberdctl.cfg}
-the network interface where the Erlang node will listen and accept connections.
-The Erlang command-line parameter used internally is, for example:
-\begin{verbatim}
-erl ... -kernel inet_dist_use_interface "{127,0,0,1}"
-\end{verbatim}
-
-
-\makesection{cookie}{Erlang Cookie}
-
-The Erlang cookie is a string with numbers and letters.
-An Erlang node reads the cookie at startup from the command-line parameter \term{-setcookie}.
-If not indicated, the cookie is read from the cookie file \term{\$HOME/.erlang.cookie}.
-If this file does not exist, it is created immediately with a random cookie.
-Two Erlang nodes communicate only if they have the same cookie.
-Setting a cookie on the Erlang node allows you to structure your Erlang network
-and define which nodes are allowed to connect to which.
-
-Thanks to Erlang cookies, you can prevent access to the Erlang node by mistake,
-for example when there are several Erlang nodes running different programs in the same machine.
-
-Setting a secret cookie is a simple method
-to difficult unauthorized access to your Erlang node.
-However, the cookie system is not ultimately effective
-to prevent unauthorized access or intrusion to an Erlang node.
-The communication between Erlang nodes are not encrypted,
-so the cookie could be read sniffing the traffic on the network.
-The recommended way to secure the Erlang node is to block the port 4369.
-
-
-\makesection{nodename}{Erlang Node Name}
-
-An Erlang node may have a node name.
-The name can be short (if indicated with the command-line parameter \term{-sname})
-or long (if indicated with the parameter \term{-name}).
-Starting an Erlang node with -sname limits the communication between Erlang nodes to the LAN.
-
-Using the option \term{-sname} instead of \term{-name} is a simple method
-to difficult unauthorized access to your Erlang node.
-However, it is not ultimately effective to prevent access to the Erlang node,
-because it may be possible to fake the fact that you are on another network
-using a modified version of Erlang \term{epmd}.
-The recommended way to secure the Erlang node is to block the port 4369.
-
-
-\makesection{secure-files}{Securing Sensitive Files}
-
-\ejabberd{} stores sensitive data in the file system either in plain text or binary files.
-The file system permissions should be set to only allow the proper user to read,
-write and execute those files and directories.
-
-\begin{description}
- \titem{ejabberd configuration file: /etc/ejabberd/ejabberd.yml}
- Contains the JID of administrators
- and passwords of external components.
- The backup files probably contain also this information,
- so it is preferable to secure the whole \term{/etc/ejabberd/} directory.
- \titem{ejabberd service log: /var/log/ejabberd/ejabberd.log}
- Contains IP addresses of clients.
- If the loglevel is set to 5, it contains whole conversations and passwords.
- If a logrotate system is used, there may be several log files with similar information,
- so it is preferable to secure the whole \term{/var/log/ejabberd/} directory.
- \titem{Mnesia database spool files in /var/lib/ejabberd/}
- The files store binary data, but some parts are still readable.
- The files are generated by Mnesia and their permissions cannot be set directly,
- so it is preferable to secure the whole \term{/var/lib/ejabberd/} directory.
- \titem{Erlang cookie file: /var/lib/ejabberd/.erlang.cookie}
- See section \ref{cookie}.
-\end{description}
-
-
-\makechapter{clustering}{Clustering}
-\ind{clustering}
-
-\makesection{howitworks}{How it Works}
-\ind{clustering!how it works}
-
-A \XMPP{} domain is served by one or more \ejabberd{} nodes. These nodes can
-be run on different machines that are connected via a network. They all
-must have the ability to connect to port 4369 of all another nodes, and must
-have the same magic cookie (see Erlang/OTP documentation, in other words the
-file \term{\~{}ejabberd/.erlang.cookie} must be the same on all nodes). This is
-needed because all nodes exchange information about connected users, s2s
-connections, registered services, etc\ldots
-
-Each \ejabberd{} node has the following modules:
-\begin{itemize}
-\item router,
-\item local router,
-\item session manager,
-\item s2s manager.
-\end{itemize}
-
-\makesubsection{router}{Router}
-\ind{clustering!router}
-
-This module is the main router of \XMPP{} packets on each node. It
-routes them based on their destination's domains. It uses a global
-routing table. The domain of the packet's destination is searched in the
-routing table, and if it is found, the packet is routed to the
-appropriate process. If not, it is sent to the s2s manager.
-
-\makesubsection{localrouter}{Local Router}
-\ind{clustering!local router}
-
-This module routes packets which have a destination domain equal to
-one of this server's host names. If the destination JID has a non-empty user
-part, it is routed to the session manager, otherwise it is processed depending
-on its content.
-
-\makesubsection{sessionmanager}{Session Manager}
-\ind{clustering!session manager}
-
-This module routes packets to local users. It looks up to which user
-resource a packet must be sent via a presence table. Then the packet is
-either routed to the appropriate c2s process, or stored in offline
-storage, or bounced back.
-
-\makesubsection{s2smanager}{s2s Manager}
-\ind{clustering!s2s manager}
-
-This module routes packets to other \XMPP{} servers. First, it
-checks if an opened s2s connection from the domain of the packet's
-source to the domain of the packet's destination exists. If that is the case,
-the s2s manager routes the packet to the process
-serving this connection, otherwise a new connection is opened.
-
-\makesection{cluster}{Clustering Setup}
-\ind{clustering!setup}
-
-Suppose you already configured \ejabberd{} on one machine named (\term{first}),
-and you need to setup another one to make an \ejabberd{} cluster. Then do
-following steps:
-
-\begin{enumerate}
-\item Copy \verb|~ejabberd/.erlang.cookie| file from \term{first} to
- \term{second}.
-
- (alt) You can also add `\verb|-setcookie content_of_.erlang.cookie|'
- option to all `\shell{erl}' commands below.
-
-\item On \term{second} run the following command as the \ejabberd{} daemon user,
- in the working directory of \ejabberd{}:
-
-\begin{verbatim}
-erl -sname ejabberd \
- -mnesia dir '"/var/lib/ejabberd/"' \
- -mnesia extra_db_nodes "['ejabberd@first']" \
- -s mnesia
-\end{verbatim}
-
- This will start Mnesia serving the same database as \node{ejabberd@first}.
- You can check this by running the command `\verb|mnesia:info().|'. You
- should see a lot of remote tables and a line like the following:
-
- Note: the Mnesia directory may be different in your system.
- To know where does ejabberd expect Mnesia to be installed by default,
- call \ref{ejabberdctl} without options and it will show some help,
- including the Mnesia database spool dir.
-
-\begin{verbatim}
-running db nodes = [ejabberd@first, ejabberd@second]
-\end{verbatim}
-
-
-\item Now run the following in the same `\shell{erl}' session:
-
-\begin{verbatim}
-mnesia:change_table_copy_type(schema, node(), disc_copies).
-\end{verbatim}
-
- This will create local disc storage for the database.
-
- (alt) Change storage type of the \term{scheme} table to `RAM and disc
- copy' on the second node via the Web Admin.
-
-
-\item Now you can add replicas of various tables to this node with
- `\verb|mnesia:add_table_copy|' or
- `\verb|mnesia:change_table_copy_type|' as above (just replace
- `\verb|schema|' with another table name and `\verb|disc_copies|'
- can be replaced with `\verb|ram_copies|' or
- `\verb|disc_only_copies|').
-
- Which tables to replicate is very dependant on your needs, you can get
- some hints from the command `\verb|mnesia:info().|', by looking at the
- size of tables and the default storage type for each table on 'first'.
-
- Replicating a table makes lookups in this table faster on this node.
- Writing, on the other hand, will be slower. And of course if machine with one
- of the replicas is down, other replicas will be used.
-
- Also \footahref{http://www.erlang.org/doc/apps/mnesia/Mnesia\_chap5.html\#5.3}
- {section 5.3 (Table Fragmentation) of Mnesia User's Guide} can be helpful.
- % The above URL needs update every Erlang release!
-
- (alt) Same as in previous item, but for other tables.
-
-
-\item Run `\verb|init:stop().|' or just `\verb|q().|' to exit from
- the Erlang shell. This probably can take some time if Mnesia has not yet
- transfered and processed all data it needed from \term{first}.
-
-
-\item Now run \ejabberd{} on \term{second} with a configuration similar as
- on \term{first}: you probably do not need to duplicate `\verb|acl|'
- and `\verb|access|' options because they will be taken from
- \term{first}; and \verb|mod_irc| should be
- enabled only on one machine in the cluster.
-\end{enumerate}
-
-You can repeat these steps for other machines supposed to serve this
-domain.
-
-\makesection{servicelb}{Service Load-Balancing}
-\ind{component load-balancing}
-
-% This section never had content, should it?
-% \makesubsection{componentlb}{Components Load-Balancing}
-
-\makesubsection{domainlb}{Domain Load-Balancing Algorithm}
-\ind{options!domain\_balancing}
-
-\ejabberd{} includes an algorithm to load balance the components that are plugged on an \ejabberd{} cluster. It means that you can plug one or several instances of the same component on each \ejabberd{} cluster and that the traffic will be automatically distributed.
-
-The default distribution algorithm try to deliver to a local instance of a component. If several local instances are available, one instance is chosen randomly. If no instance is available locally, one instance is chosen randomly among the remote component instances.
-
-If you need a different behaviour, you can change the load balancing behaviour with the option \option{domain\_balancing}. The syntax of the option is the following:
-\esyntax{domain\_balancing: BalancingCriteria}
-
-Several balancing criteria are available:
-\begin{itemize}
-\item \term{destination}: the full JID of the packet \term{to} attribute is used.
-\item \term{source}: the full JID of the packet \term{from} attribute is used.
-\item \term{bare\_destination}: the bare JID (without resource) of the packet \term{to} attribute is used.
-\item \term{bare\_source}: the bare JID (without resource) of the packet \term{from} attribute is used.
-\end{itemize}
-
-If the value corresponding to the criteria is the same, the same component instance in the cluster will be used.
-
-\makesubsection{lbbuckets}{Load-Balancing Buckets}
-\ind{options!domain\_balancing\_component\_number}
-
-When there is a risk of failure for a given component, domain balancing can cause service trouble. If one component is failing the service will not work correctly unless the sessions are rebalanced.
-
-In this case, it is best to limit the problem to the sessions handled by the failing component. This is what the \term{domain\_balancing\_component\_number} option does, making the load balancing algorithm not dynamic, but sticky on a fix number of component instances.
-
-The syntax is:
-\esyntax{domain\_balancing\_component\_number: Number}
-
-
-
-% TODO
-% See also the section about ejabberdctl!!!!
-%\section{Backup and Restore}
-%\label{backup}
-%\ind{backup}
-
-\makechapter{debugging}{Debugging}
-\ind{debugging}
-
-\makesection{logfiles}{Log Files}
-
-An \ejabberd{} node writes three log files:
-\begin{description}
- \titem{ejabberd.log} is the ejabberd service log, with the messages reported by \ejabberd{} code
- \titem{error.log} is the file accumulating error messages from \term{ejabberd.log}
- \titem{crash.log} is the Erlang/OTP log, with the crash messages reported by Erlang/OTP using SASL (System Architecture Support Libraries)
-\end{description}
-
-The option \term{loglevel} modifies the verbosity of the file ejabberd.log. The syntax:
-\begin{description}
- \titem{loglevel: Level} The standard form to set a global log level.
-\end{description}
-
-The possible \term{Level} are:
-\begin{description}
- \titem{0} No ejabberd log at all (not recommended)
- \titem{1} Critical
- \titem{2} Error
- \titem{3} Warning
- \titem{4} Info
- \titem{5} Debug
-\end{description}
-For example, the default configuration is:
-\begin{verbatim}
-loglevel: 4
-\end{verbatim}
-
-Option \term{log\_rate\_limit} is useful if you want to protect the logging
-mechanism from being overloaded by excessive amount of log messages.
-The syntax is:
-\begin{description}
- \titem{log\_rate\_limit: N} Where N is a maximum number of log messages per second.
- The default value is 100.
-\end{description}
-When the limit is reached the similar warning message is logged:
-\begin{verbatim}
-lager_error_logger_h dropped 800 messages in the last second that exceeded the limit of 100 messages/sec
-\end{verbatim}
-
-By default \ejabberd{} rotates the log files when they get grown above a certain size.
-The exact value is controlled by \term{log\_rotate\_size} option.
-The syntax is:
-\begin{description}
- \titem{log\_rotate\_size: N} Where N is the maximum size of a log file in bytes.
- The default value is 10485760 (10Mb).
-\end{description}
-
-\ejabberd{} can also rotates the log files at given date interval.
-The exact value is controlled by \term{log\_rotate\_date} option.
-The syntax is:
-\begin{description}
- \titem{log\_rotate\_date: D} Where D is a string with syntax is taken from the syntax newsyslog uses in newsyslog.conf.
- The default value is \term{""} (no rotation triggered by date).
-\end{description}
-
-However, you can rotate the log files manually.
-For doing this, set \term{log\_rotate\_size} option to 0 and \term{log\_rotate\_date}
-to empty list, then, when you need to rotate the files, rename and then reopen them.
-The ejabberdctl command \term{reopen-log}
-(please refer to section \ref{ectl-commands})
-reopens the log files,
-and also renames the old ones if you didn't rename them.
-
-The option \term{log\_rotate\_count} defines the number of rotated files to keep
-by \term{reopen-log} command.
-Every such file has a numeric suffix. The exact format is:
-\begin{description}
- \titem{log\_rotate\_count: N} The default value is 1,
- which means only \term{ejabberd.log.0}, \term{error.log.0}
- and \term{crash.log.0} will be kept.
-\end{description}
-
-\makesection{debugconsole}{Debug Console}
-
-The Debug Console is an Erlang shell attached to an already running \ejabberd{} server.
-With this Erlang shell, an experienced administrator can perform complex tasks.
-
-This shell gives complete control over the \ejabberd{} server,
-so it is important to use it with extremely care.
-There are some simple and safe examples in the article
-\footahref{http://www.ejabberd.im/interconnect-erl-nodes}{Interconnecting Erlang Nodes}
-
-To exit the shell, close the window or press the keys: control+c control+c.
-
-
-\makesection{watchdog}{Watchdog Alerts}
-\ind{debugging!watchdog}
-
-\ejabberd{} includes a watchdog mechanism that may be useful to developers
-when troubleshooting a problem related to memory usage.
-If a process in the \ejabberd{} server consumes more memory than the configured threshold,
-a message is sent to the XMPP accounts defined with the option
-\term{watchdog\_admins}
-\ind{options!watchdog\_admins} in the \ejabberd{} configuration file.
-
-The syntax is:
-\esyntax{watchdog\_admins: [JID, ...]}
-
-The memory consumed is measured in \term{words}:
-a word on 32-bit architecture is 4 bytes,
-and a word on 64-bit architecture is 8 bytes.
-The threshold by default is 1000000 words.
-This value can be configured with the option \term{watchdog\_large\_heap},
-or in a conversation with the watchdog alert bot.
-
-The syntax is:
-\esyntax{watchdog\_large\_heap: Number}
-
-Example configuration:
-\begin{verbatim}
-watchdog_admins:
- - "admin2@localhost"
- - "admin2@example.org"
-watchdog_large_heap: 30000000
-\end{verbatim}
-
-To remove watchdog admins, remove them in the option.
-To remove all watchdog admins, set the option with an empty list:
-\begin{verbatim}
-watchdog_admins: []
-\end{verbatim}
-
-\appendix{}
-
-\makechapter{i18ni10n}{Internationalization and Localization}
-\ind{xml:lang}\ind{internationalization}\ind{localization}\ind{i18n}\ind{l10n}
-
-The source code of \ejabberd{} supports localization.
-The translators can edit the
-\footahref{http://www.gnu.org/software/gettext/}{gettext} .po files
-using any capable program (KBabel, Lokalize, Poedit...) or a simple text editor.
-
-Then gettext
-is used to extract, update and export those .po files to the .msg format read by \ejabberd{}.
-To perform those management tasks, in the \term{src/} directory execute \term{make translations}.
-The translatable strings are extracted from source code to generate the file \term{ejabberd.pot}.
-This file is merged with each .po file to produce updated .po files.
-Finally those .po files are exported to .msg files, that have a format easily readable by \ejabberd{}.
-
-All built-in modules support the \texttt{xml:lang} attribute inside IQ queries.
-Figure~\ref{fig:discorus}, for example, shows the reply to the following query:
-\begin{verbatim}
-<iq id='5'
- to='example.org'
- type='get'
- xml:lang='ru'>
- <query xmlns='http://jabber.org/protocol/disco#items'/>
-</iq>
-\end{verbatim}
-
-\begin{figure}[htbp]
- \centering
- \insimg{discorus.png}
- \caption{Service Discovery when \texttt{xml:lang='ru'}}
- \label{fig:discorus}
-\end{figure}
-
-The Web Admin also supports the \verb|Accept-Language| HTTP header.
-
-\begin{figure}[htbp]
- \centering
- \insimg{webadmmainru.png}
- \caption{Web Admin showing a virtual host when the web browser provides the
- HTTP header `Accept-Language: ru'}
- \label{fig:webadmmainru}
-\end{figure}
-
-
-\makechapter{releasenotes}{Release Notes}
-\ind{release notes}
-
-Release notes are available from \footahref{http://www.process-one.net/en/ejabberd/release\_notes/}{ejabberd Home Page}
-
-\makechapter{acknowledgements}{Acknowledgements}
-
-Thanks to all people who contributed to this guide:
-\begin{itemize}
-\item Alexey Shchepin (\ahrefurl{xmpp:aleksey@jabber.ru})
-\item Badlop (\ahrefurl{xmpp:badlop@jabberes.org})
-\item Evgeniy Khramtsov (\ahrefurl{xmpp:xram@jabber.ru})
-\item Florian Zumbiehl (\ahrefurl{xmpp:florz@florz.de})
-\item Ludovic Bocquet (\ahrefurl{xmpp:lbocquet@jabber.org})
-\item Marcin Owsiany (\ahrefurl{xmpp:marcin.owsiany@gmail.com})
-\item Michael Grigutsch (\ahrefurl{xmpp:migri@jabber.i-pobox.net})
-\item Mickael Remond (\ahrefurl{xmpp:mremond@process-one.net})
-\item Sander Devrieze (\ahrefurl{xmpp:s.devrieze@gmail.com})
-\item Sergei Golovan (\ahrefurl{xmpp:sgolovan@nes.ru})
-\item Vsevolod Pelipas (\ahrefurl{xmpp:vsevoload@jabber.ru})
-\end{itemize}
-
-
-\makechapter{copyright}{Copyright Information}
-
-Ejabberd Installation and Operation Guide.\\
-Copyright \copyright{} 2003 --- 2015 ProcessOne
-
-This document is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This document is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this document; if not, write to the Free Software Foundation, Inc., 51 Franklin
-Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-%TODO: a glossary describing common terms
-%\makesection{glossary}{Glossary}
-%\ind{glossary}
-
-%\begin{description}
-%\titem{c2s}
-%\titem{s2s}
-%\titem{STARTTLS}
-%\titem{XEP} (\XMPP{} Extension Protocol)
-%\titem{Resource}
-%\titem{Roster}
-%\titem{Transport}
-%\titem{JID} (\Jabber{} ID) <Wikipedia>
-%\titem{JUD} (\Jabber{} User Directory)
-%\titem{vCard} <Wikipedia>
-%\titem{Publish-Subscribe}
-%\titem{Namespace}
-%\titem{Erlang} <Wikipedia>
-%\titem{Fault-tolerant}
-%\titem{Distributed} <Wikipedia>
-%\titem{Node} <Wikipedia>
-%\titem{Tuple} <Wikipedia>
-%\titem{Regular Expression}
-%\titem{ACL} (Access Control List) <Wikipedia>
-%\titem{IPv6} <Wikipedia>
-%\titem{XMPP}
-%\titem{LDAP} (Lightweight Directory Access Protocol) <Wikipedia>
-%\titem{ODBC} (Open Database Connectivity) <Wikipedia>
-%\titem{Virtual Hosting} <Wikipedia>
-
-%\end{description}
-
-
-
-% Remove the index from the HTML version to save size and bandwith.
-\begin{latexonly}
-\printindex
-\end{latexonly}
-
-\end{document}