Compare commits

...

46 Commits

Author SHA1 Message Date
Christophe Romain 1ca2ba865e fixing 1324 commit issue on tagged versions
SVN Revision: 1326
2008-05-16 14:23:37 +00:00
Mickaël Rémond 4613080337 * Adding experimental branch.
SVN Revision: 1324
2008-05-14 17:49:23 +00:00
Christophe Romain d62cd3a128 added 1.1.3 tag for package generation
SVN Revision: 784
2007-06-15 15:23:26 +00:00
Mickaël Rémond 9d594d1bd8 * Adding missing ejabberd-1.1.3 tag.
SVN Revision: 783
2007-06-15 07:29:07 +00:00
Christophe Romain f3f4b5d5c8 make install does not overwrites existing ejabberd.cfg anymore, ejabberd.cfg-new created instead
SVN Revision: 756
2007-04-30 07:08:01 +00:00
Christophe Romain 310916549c VERSION define fixed to 1.1.3
SVN Revision: 755
2007-04-30 06:48:38 +00:00
Mickaël Rémond 6f2b330f68 * Tabs change.
SVN Revision: 720
2007-02-02 14:35:53 +00:00
Christophe Romain 0f89876ccf release notes and changelog entry added
SVN Revision: 719
2007-02-02 14:27:20 +00:00
Christophe Romain 85a7a306ff security bugfix
SVN Revision: 718
2007-02-02 10:58:40 +00:00
Mickaël Rémond fcc4adcde5 * src/release_notes_1.1.2.txt: Fixed hanging paragraph
SVN Revision: 653
2006-09-27 20:41:02 +00:00
Mickaël Rémond 8515833954 * Added release note to documentation.
SVN Revision: 650
2006-09-27 17:29:45 +00:00
Mickaël Rémond 7e948fbbac * doc/release_notes_1.1.2.txt: Fixed typos and rephrasing.
SVN Revision: 648
2006-09-27 16:22:09 +00:00
Mickaël Rémond de306d0364 * doc/release_notes_1.1.2.txt: Minor fixes.
SVN Revision: 647
2006-09-27 13:34:18 +00:00
Mickaël Rémond 7214549508 * doc/guide.tex: Fixed Latexish typos.
SVN Revision: 646
2006-09-27 13:09:50 +00:00
Mickaël Rémond 4cb24c3e6a * doc/release_notes_1.1.2.txt: Draft release notes.
SVN Revision: 645
2006-09-26 17:17:31 +00:00
Mickaël Rémond 16c2d399e9 * src/msgs/pl.msg: Updated (thanks to Andrzej Smyk).
SVN Revision: 644
2006-09-26 14:07:35 +00:00
Mickaël Rémond 54d05f64ba Improvement coming from trunk (SVN #633):
* src/ejabberd_s2s.erl: Added incoming-s2s-number and
outgoing-s2s-number ejabberdctl commands

SVN Revision: 643
2006-09-26 11:12:03 +00:00
Mickaël Rémond 2a542e9e09 * src/mod_muc/mod_muc_room.erl: Minor english update.
* src/msgs/pl.msg: Likewise.
* src/msgs/uk.msg: Likewise.
* src/msgs/pt-br.msg: Likewise.
* src/msgs/cs.msg: Likewise.
* src/msgs/ru.msg: Likewise.
* src/msgs/es.msg: Likewise.
* src/msgs/fr.msg: Likewise.
* src/msgs/de.msg: Likewise.
* src/msgs/nl.msg: Likewise.

SVN Revision: 641
2006-09-26 10:48:05 +00:00
Mickaël Rémond d9487135c0 * src/msgs/pt-br.msg: Updated Brazilian translation (thanks to
Renato Botelho) and clean-up.

SVN Revision: 640
2006-09-26 10:31:53 +00:00
Mickaël Rémond 539000bf62 * src/msgs/de.msg: Updated German translation (thanks to Nikolaus
Polak).

SVN Revision: 639
2006-09-25 22:06:37 +00:00
Mickaël Rémond 4646bf818a * src/ejabberd.app: Version update for ejabberd 1.1.2.
SVN Revision: 638
2006-09-25 20:53:55 +00:00
Mickaël Rémond 751fbec0b6 ChangeLog typo
SVN Revision: 637
2006-09-25 15:36:17 +00:00
Mickaël Rémond 37f56859e7 * src/msgs/pl.msg: Updated German translation (thanks to Zbyszek
Zolkiewski).

SVN Revision: 636
2006-09-25 15:19:09 +00:00
Mickaël Rémond 9d7006dfa2 * src/msgs/de.msg: Updated German translation (thanks to Marvin
Preuss).

SVN Revision: 635
2006-09-25 14:41:33 +00:00
Mickaël Rémond b2acdac5fa * src/msgs/nl.msg: Updated Dutch translation (thanks to Sander
Devrieze).

SVN Revision: 634
2006-09-25 14:30:44 +00:00
Mickaël Rémond 5d4093b8ac * src/msgs/cs.msg: Updated Czech translation and removed unused
strings.

SVN Revision: 632
2006-09-25 10:47:52 +00:00
Mickaël Rémond 6a3afa778b * doc/introduction.tex: Minor doc updates for release 1.1.2.
SVN Revision: 630
2006-09-25 07:55:43 +00:00
Mickaël Rémond d574757de4 * src/msgs/es.msg: Updated Spanish translation (thanks to Badlop).
SVN Revision: 628
2006-09-24 15:44:24 +00:00
Mickaël Rémond 5b9526d998 * src/eldap/eldap_filter: Forgot to add eldap_filter.erl in ejabberd-1.1.2 branch
SVN Revision: 627
2006-09-24 15:31:21 +00:00
Mickaël Rémond 79f5d2772e * src/mod_muc/mod_muc_room.erl: Strings update (thanks to
Serguei Golovan).
* src/msgs/ru.msg: Updated Russian translation (thanks to
Serguei Golovan).
* src/msgs/uk.msg: Updated Ukrainian translation (thanks to
Serguei Golovan).
* src/msgs/fr.msg: Update French translation.

SVN Revision: 626
2006-09-24 14:45:12 +00:00
Mickaël Rémond 78aeb15aac * src/doc/guide.html: Minor W3C compliance fix in an Hevea
generated URL.

SVN Revision: 625
2006-09-24 12:35:47 +00:00
Mickaël Rémond d786782a0f * src/doc/features.html: Added to be consistent (guide.html is in the
repository to make Latex optional, but still allow access to the doc).
* src/ejabberd.hrl: Updated to version 1.1.2.

SVN Revision: 624
2006-09-24 09:39:04 +00:00
Mickaël Rémond ccfcfa49fa Improvement coming from trunk (SVN #622):
* src/eldap/eldap.erl: Enable the keepalive socket option (thanks
to Evgeniy Khramtsov)
* src/ejabberd_auth_ldap.erl: Now uses two LDAP connections
(thanks to Evgeniy Khramtsov)
* src/eldap/eldap_filter.erl: Bugfix (thanks to Evgeniy Khramtsov)
* src/mod_vcard_ldap.erl: Likewise

SVN Revision: 623
2006-09-23 09:52:53 +00:00
Mickaël Rémond e734ad1682 * src/msgs/cs.msg: Added Czech translation (thanks to Milos Svasek).
SVN Revision: 622
2006-09-23 09:20:19 +00:00
Mickaël Rémond 4ea5e493ea * src/mod_muc/mod_muc.erl: Component name is now more user
friendly (thanks to Badlop).
* src/mod_irc/mod_irc.erl: Likewise.
* src/mod_pubsub/mod_pubsub.erl: Likewise.

SVN Revision: 620
2006-09-22 17:01:16 +00:00
Mickaël Rémond d31ab5ca13 * src/msgs/fr.msg: updated French translation.
SVN Revision: 619
2006-09-22 09:25:47 +00:00
Mickaël Rémond 1632aec61e Improvement coming from trunk (SVN #617):
* doc/guide.tex: Large improvements for ejabberd 1.1.2 (thanks to Sander
Devrieze)
* doc/version.tex: Likewise.
* doc/features.tex: Likewise.
* doc/Makefile: Likewise.
* doc/dev.tex: Likewise.

SVN Revision: 618
2006-09-22 09:16:31 +00:00
Mickaël Rémond 8583e3f9be Bugfixes coming from trunk (SVN #607):
* doc/guide.tex: Minor fix on index generation.

SVN Revision: 616
2006-09-22 08:42:41 +00:00
Mickaël Rémond 23b78b0f0c Improvement coming from trunk (SVN #606):
* doc/guide.tex: Updated (thanks to Evgeniy Khramtsov)
* src/ejabberd_auth_ldap.erl: Better LDAP support (thanks to
Evgeniy Khramtsov)
* src/mod_vcard_ldap.erl: Likewise
* src/eldap/eldap_filter.erl: Likewise

SVN Revision: 615
2006-09-22 08:36:09 +00:00
Mickaël Rémond 677a6004cf Improvement coming from trunk (SVN #605):
* src/odbc/mssql.sql: Removed unused fields.

SVN Revision: 614
2006-09-22 08:08:37 +00:00
Mickaël Rémond ec668cd85a Update coming from trunk (SVN #604):
* src/ejd2odbc.erl: Updated

SVN Revision: 613
2006-09-22 08:05:50 +00:00
Mickaël Rémond 0b660a42f4 Bugfixes coming from trunk (SVN #603):
* src/mod_muc/mod_muc_log.erl: bugfix.

SVN Revision: 612
2006-09-22 07:58:58 +00:00
Mickaël Rémond 8c8c7b1e3f Improvement coming from trunk (SVN #602):
* src/mod_muc/mod_muc_log.erl: Fixed html special characters
escaping, added new image buttons, chatroom titles now point to
xmpp: URIs (thanks to Badlop)

SVN Revision: 611
2006-09-22 07:35:55 +00:00
Mickaël Rémond 4211540272 Improvement coming from trunk (SVN #601):
* src/mod_muc/mod_muc.erl: It is now possible to configure the
MUC room history feature. A new option has been added in ejabberd muc
module configuration (history_size) to define the size of the history.
0 is used to disable the feature.
* src/mod_muc/mod_muc_room.erl: Likewise.
* doc/guide.tex: Likewise.

SVN Revision: 610
2006-09-22 07:25:18 +00:00
Mickaël Rémond 6bdabb0c3b Bugfixes coming from trunk (SVN #599):
* src/mod_shared_roster.erl: Bugfix
* src/mod_roster_odbc.erl: Bugfix

SVN Revision: 609
2006-09-22 07:13:42 +00:00
Mickaël Rémond 647acc7768 Created ejabberd-1.1.2 branch to prepare release.
SVN Revision: 608
2006-09-22 07:05:56 +00:00
42 changed files with 6155 additions and 2835 deletions
+146
View File
@@ -1,3 +1,149 @@
2007-02-02 Christophe Romain <christophe.romain@process-one.net>
* doc/release_notes_1.1.3.txt: Creation.
* src/mod_roster_odbc.erl: Security bugfix.
2006-09-27 Mickael Remond <mickael.remond@process-one.net>
* doc/release_notes_1.1.2.txt: Minor fixes.
* doc/guide.tex: Fixed Latexish typos.
2006-09-26 Mickael Remond <mickael.remond@process-one.net>
* doc/release_notes_1.1.2.txt: Draft release notes.
* src/msgs/pl.msg: Updated (thanks to Andrzej Smyk).
* src/ejabberd_s2s.erl: Added incoming-s2s-number and
outgoing-s2s-number ejabberdctl commands
* src/mod_muc/mod_muc_room.erl: Minor english update.
* src/msgs/pl.msg: Likewise.
* src/msgs/uk.msg: Likewise.
* src/msgs/pt-br.msg: Likewise.
* src/msgs/cs.msg: Likewise.
* src/msgs/ru.msg: Likewise.
* src/msgs/es.msg: Likewise.
* src/msgs/fr.msg: Likewise.
* src/msgs/de.msg: Likewise.
* src/msgs/nl.msg: Likewise.
* src/msgs/pt-br.msg: Updated Brazilian translation (thanks to
Renato Botelho) and clean-up.
2006-09-25 Mickael Remond <mickael.remond@process-one.net>
* src/msgs/de.msg: Updated German translation (thanks to Nikolaus
Polak).
* src/ejabberd.app: Version update for ejabberd 1.1.2.
* src/msgs/pl.msg: Updated Polish translation (thanks to Zbyszek
Zolkiewski).
* src/msgs/de.msg: Updated German translation (thanks to Marvin
Preuss).
* src/msgs/nl.msg: Updated Dutch translation (thanks to Sander
Devrieze).
* src/msgs/cs.msg: Updated Czech translation and removed unused
strings.
* doc/introduction.tex: Minor doc updates for release 1.1.2.
2006-09-24 Mickael Remond <mickael.remond@process-one.net>
* src/msgs/es.msg: Updated Spanish translation (thanks to Badlop).
* src/mod_muc/mod_muc_room.erl: Strings update (thanks to Serguei
Golovan).
* src/msgs/ru.msg: Updated Russian translation (thanks to Serguei
Golovan).
* src/msgs/uk.msg: Updated Ukrainian translation (thanks to Serguei
Golovan).
* src/msgs/fr.msg: Updated French translation.
* src/doc/guide.html: Minor W3C compliance fix in an Hevea
generated URL.
* src/doc/features.html: Added to be consistent (guide.html is in the
repository to make Latex optional, but still allow access to the doc).
2006-09-23 Mickael Remond <mickael.remond@process-one.net>
* src/ejabberd.hrl: Updated to version 1.1.2
2006-09-23 Alexey Shchepin <alexey@sevcom.net>
* src/eldap/eldap.erl: Enable the keepalive socket option (thanks
to Evgeniy Khramtsov)
* src/ejabberd_auth_ldap.erl: Now uses two LDAP connections
(thanks to Evgeniy Khramtsov)
* src/eldap/eldap_filter.erl: Bugfix (thanks to Evgeniy Khramtsov)
* src/mod_vcard_ldap.erl: Likewise
2006-09-22 Mickael Remond <mickael.remond@process-one.net>
* src/msgs/cs.msg: Added Czech translation (thanks to Milos Svasek).
* src/mod_muc/mod_muc.erl: Component name is now more user friendly
(thanks to Badlop).
* src/mod_irc/mod_irc.erl: Likewise.
* src/mod_pubsub/mod_pubsub.erl: Likewise.
* src/msgs/fr.msg: updated French translation.
* doc/guide.tex: Large improvements for ejabberd 1.1.2 (thanks to
Sander Devrieze)
* doc/version.tex: Likewise.
* doc/features.tex: Likewise.
* doc/Makefile: Likewise.
* doc/dev.tex: Likewise.
2006-09-14 Mickael Remond <mickael.remond@process-one.net>
* doc/guide.tex: Minor fix on index generation.
2006-09-14 Alexey Shchepin <alexey@sevcom.net>
* doc/guide.tex: Updated (thanks to Evgeniy Khramtsov)
* src/ejabberd_auth_ldap.erl: Better LDAP support (thanks to
Evgeniy Khramtsov)
* src/mod_vcard_ldap.erl: Likewise
* src/eldap/eldap_filter.erl: Likewise
2006-09-11 Mickael Remond <mickael.remond@process-one.net>
* src/odbc/mssql.sql: Removed unused fields.
2006-09-10 Alexey Shchepin <alexey@sevcom.net>
* src/ejd2odbc.erl: Updated
* src/mod_muc/mod_muc_log.erl: Fixed html special characters
escaping, added new image buttons, chatroom titles now point to
xmpp: URIs (thanks to Badlop)
2006-09-05 Mickael Remond <mickael.remond@process-one.net>
* src/mod_muc/mod_muc.erl: It is now possible to configure the MUC room
history feature. A new option has been added in ejabberd muc module
configuration (history_size) to define the size of the history. 0 is
used to disable the feature.
* src/mod_muc/mod_muc_room.erl: Likewise.
* doc/guide.tex: Likewise.
2006-09-05 Alexey Shchepin <alexey@sevcom.net>
* src/mod_shared_roster.erl: Bugfix
* src/mod_roster_odbc.erl: Bugfix
2006-09-03 Mickael Remond <mickael.remond@process-one.net>
* src/odbc/odbc_queries.erl: Support for Microsoft SQL Server as a
+4 -7
View File
@@ -27,16 +27,13 @@ clean:
rm -f *.toc
guide.html: guide.tex
hevea guide.tex
hevea guide.tex
hevea -fix -noiso -pedantic guide.tex
dev.html: dev.tex
hevea dev.tex
hevea dev.tex
hevea -fix -noiso -pedantic dev.tex
features.html: features.tex
hevea features.tex
hevea features.tex
hevea -fix -noiso -pedantic features.tex
guide.pdf: guide.tex
pdflatex guide.tex
+36 -45
View File
@@ -4,7 +4,7 @@
<HEAD>
<TITLE>Ejabberd 1.1.1 Developers Guide</TITLE>
<TITLE>Ejabberd 1.1.2 Developers Guide</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<META name="GENERATOR" content="hevea 1.08">
@@ -22,7 +22,7 @@ BLOCKQUOTE{margin-left:4ex;margin-right:4ex;text-align:left;}
</HEAD>
<BODY >
<!--HEVEA command line is: hevea dev.tex -->
<!--HEVEA command line is: hevea -fix -noiso -pedantic dev.tex -->
<!--HTMLHEAD-->
<!--ENDHTML-->
<!--PREFIX <ARG ></ARG>-->
@@ -34,7 +34,7 @@ BLOCKQUOTE{margin-left:4ex;margin-right:4ex;text-align:left;}
<TABLE CLASS="title">
<TR><TD>
<H1 CLASS="titlemain">Ejabberd 1.1.1 Developers Guide</H1>
<H1 CLASS="titlemain">Ejabberd 1.1.2 Developers Guide</H1>
<H3 CLASS="titlerest">Alexey Shchepin<BR>
<A HREF="mailto:alexey@sevcom.net"><TT>mailto:alexey@sevcom.net</TT></A><BR>
<A HREF="xmpp:aleksey@jabber.ru"><TT>xmpp:aleksey@jabber.ru</TT></A></H3></TD>
@@ -42,7 +42,7 @@ BLOCKQUOTE{margin-left:4ex;margin-right:4ex;text-align:left;}
<BR>
<DIV CLASS="center">
<IMG SRC="logo.png">
<IMG SRC="logo.png" ALT="logo.png">
<BR>
@@ -61,49 +61,50 @@ BLOCKQUOTE{margin-left:4ex;margin-right:4ex;text-align:left;}
<A HREF="#htoc2">1.1&nbsp;&nbsp;Key Features</A>
<LI CLASS="li-toc"><A HREF="#htoc3">1.2&nbsp;&nbsp;Additional Features</A>
</UL>
<LI CLASS="li-toc"><A HREF="#htoc4">2&nbsp;&nbsp;How it works</A>
<LI CLASS="li-toc"><A HREF="#htoc4">2&nbsp;&nbsp;How it Works</A>
<UL CLASS="toc"><LI CLASS="li-toc">
<A HREF="#htoc5">2.1&nbsp;&nbsp;Router</A>
<LI CLASS="li-toc"><A HREF="#htoc6">2.2&nbsp;&nbsp;Local Router</A>
<LI CLASS="li-toc"><A HREF="#htoc7">2.3&nbsp;&nbsp;Session Manager</A>
<LI CLASS="li-toc"><A HREF="#htoc8">2.4&nbsp;&nbsp;S2S Manager</A>
</UL>
<LI CLASS="li-toc"><A HREF="#htoc9">3&nbsp;&nbsp;XML representation</A>
<LI CLASS="li-toc"><A HREF="#htoc9">3&nbsp;&nbsp;XML Representation</A>
<LI CLASS="li-toc"><A HREF="#htoc10">4&nbsp;&nbsp;Module <TT>xml</TT></A>
<LI CLASS="li-toc"><A HREF="#htoc11">5&nbsp;&nbsp;Module <TT>xml_stream</TT></A>
<LI CLASS="li-toc"><A HREF="#htoc12">6&nbsp;&nbsp;<TT>ejabberd</TT> modules</A>
<LI CLASS="li-toc"><A HREF="#htoc12">6&nbsp;&nbsp;Modules</A>
<UL CLASS="toc"><LI CLASS="li-toc">
<A HREF="#htoc13">6.1&nbsp;&nbsp;gen_mod behaviour</A>
<LI CLASS="li-toc"><A HREF="#htoc14">6.2&nbsp;&nbsp;Module gen_iq_handler</A>
<LI CLASS="li-toc"><A HREF="#htoc15">6.3&nbsp;&nbsp;Services</A>
<A HREF="#htoc13">6.1&nbsp;&nbsp;Module gen_iq_handler</A>
<LI CLASS="li-toc"><A HREF="#htoc14">6.2&nbsp;&nbsp;Services</A>
</UL>
</UL>
<!--TOC section Introduction-->
<H2 CLASS="section"><A NAME="htoc1">1</A>&nbsp;&nbsp;Introduction</H2><!--SEC END -->
<H2 CLASS="section"><A NAME="htoc1">1</A>&nbsp;&nbsp;<A NAME="intro">Introduction</A></H2><!--SEC END -->
<A NAME="sec:intr"></A>
<A NAME="sec:intro"></A>
<TT>ejabberd</TT> is a free (GPL) distributed fault-tolerant Jabber/XMPP server and is mainly written in <A HREF="http://www.erlang.org/">Erlang</A>.<BR>
<TT>ejabberd</TT> is a free and open source instant messaging server written in <A HREF="http://www.erlang.org/">Erlang</A>.<BR>
<BR>
<TT>ejabberd</TT> is designed to be a stable, standards compliant, and feature rich Jabber/XMPP server.<BR>
<TT>ejabberd</TT> is cross-platform, distributed, fault-tolerant, and based on open standards to achieve real-time communication.<BR>
<BR>
<TT>ejabberd</TT> is suitable for small servers, whether they need to be scalable or not, as well as extremely big servers.<BR>
<TT>ejabberd</TT> is designed to be a rock-solid and feature rich XMPP server.<BR>
<BR>
<TT>ejabberd</TT> is suitable for small deployments, whether they need to be scalable or not, as well as extremely big deployments.<BR>
<BR>
<!--TOC subsection Key Features-->
<H3 CLASS="subsection"><A NAME="htoc2">1.1</A>&nbsp;&nbsp;Key Features</H3><!--SEC END -->
<H3 CLASS="subsection"><A NAME="htoc2">1.1</A>&nbsp;&nbsp;<A NAME="keyfeatures">Key Features</A></H3><!--SEC END -->
<A NAME="sec:keyfeatures"></A>
<TT>ejabberd</TT> is:
<UL CLASS="itemize"><LI CLASS="li-itemize">
Multiplatform: <TT>ejabberd</TT> runs under Microsoft Windows and Unix derived systems such as Linux, FreeBSD and NetBSD.<BR>
Cross-platform: <TT>ejabberd</TT> runs under Microsoft Windows and Unix derived systems such as Linux, FreeBSD and NetBSD.<BR>
<BR>
<LI CLASS="li-itemize">Distributed: You can run <TT>ejabberd</TT> on a cluster of machines and all of them will serve the same Jabber domain(s). When you need more capacity you can simply add a new cheap node to your cluster. Accordingly, you do not need to buy an expensive high-end machine to support tens of thousands concurrent users.<BR>
<BR>
<LI CLASS="li-itemize">Fault-tolerant: You can deploy an <TT>ejabberd</TT> cluster so that all the information required for a properly working service will be replicated permanently on all nodes. This means that if one of the nodes crashes, the others will continue working without disruption. In addition, nodes also can be added or replaced &#8220;on the fly&#8221;.<BR>
<LI CLASS="li-itemize">Fault-tolerant: You can deploy an <TT>ejabberd</TT> cluster so that all the information required for a properly working service will be replicated permanently on all nodes. This means that if one of the nodes crashes, the others will continue working without disruption. In addition, nodes also can be added or replaced `on the fly'.<BR>
<BR>
<LI CLASS="li-itemize">Administrator Friendly: <TT>ejabberd</TT> is built on top of the Open Source Erlang. As a result you do not need to install an external database, an external web server, amongst others because everything is already included, and ready to run out of the box. Other administrator benefits include:
<UL CLASS="itemize"><LI CLASS="li-itemize">
@@ -118,23 +119,23 @@ Comprehensive documentation.
<BR>
<LI CLASS="li-itemize">Internationalized: <TT>ejabberd</TT> leads in internationalization. Hence it is very well suited in a globalized world. Related features are:
<UL CLASS="itemize"><LI CLASS="li-itemize">
Translated in 11 languages.
Translated in 12 languages.
<LI CLASS="li-itemize">Support for <A HREF="http://www.ietf.org/rfc/rfc3490.txt">IDNA</A>.
</UL><BR>
<BR>
<LI CLASS="li-itemize">Open Standards: <TT>ejabberd</TT> is the first Open Source Jabber server claiming to fully comply to the XMPP standard.
<UL CLASS="itemize"><LI CLASS="li-itemize">
Fully XMPP compliant
<LI CLASS="li-itemize">XML-based protocol
Fully XMPP compliant.
<LI CLASS="li-itemize">XML-based protocol.
<LI CLASS="li-itemize"><A HREF="http://ejabberd.jabber.ru/protocols">Many JEPs supported</A>.
</UL></UL>
<!--TOC subsection Additional Features-->
<H3 CLASS="subsection"><A NAME="htoc3">1.2</A>&nbsp;&nbsp;Additional Features</H3><!--SEC END -->
<H3 CLASS="subsection"><A NAME="htoc3">1.2</A>&nbsp;&nbsp;<A NAME="addfeatures">Additional Features</A></H3><!--SEC END -->
<A NAME="sec:addfeatures"></A>
Besides common Jabber server features, <TT>ejabberd</TT> comes with a wide range of other features:
Moreover, <TT>ejabberd</TT> comes with a wide range of other state-of-the-art features:
<UL CLASS="itemize"><LI CLASS="li-itemize">
Modular
<UL CLASS="itemize"><LI CLASS="li-itemize">
@@ -152,12 +153,12 @@ SASL and STARTTLS for c2s and s2s connections.
Native MySQL support.
<LI CLASS="li-itemize">Native PostgreSQL support.
<LI CLASS="li-itemize">Mnesia.
<LI CLASS="li-itemize">ODBC data storage support.
<LI CLASS="li-itemize">Microsoft SQL Server support (via ODBC).
<LI CLASS="li-itemize">ODBC data storage support.
<LI CLASS="li-itemize">Microsoft SQL Server support.
</UL>
<LI CLASS="li-itemize">Authentication
<UL CLASS="itemize"><LI CLASS="li-itemize">
LDAP and ODBC.
LDAP and ODBC.
<LI CLASS="li-itemize">External Authentication script.
<LI CLASS="li-itemize">Internal Authentication.
</UL>
@@ -170,14 +171,14 @@ Compressing XML streams with Stream Compression (<A HREF="http://www.jabber.org/
<LI CLASS="li-itemize"><A HREF="http://www.jabber.org/jeps/jep-0045.html">Multi-User Chat</A> module with logging.
<LI CLASS="li-itemize">Users Directory based on users vCards.
<LI CLASS="li-itemize"><A HREF="http://www.jabber.org/jeps/jep-0060.html">Publish-Subscribe</A> component.
<LI CLASS="li-itemize">Support for virtual hosting.
<LI CLASS="li-itemize">Support for virtual hosting.
<LI CLASS="li-itemize"><A HREF="http://www.jabber.org/jeps/jep-0025.html">HTTP Polling</A> service.
<LI CLASS="li-itemize">IRC transport.
</UL>
</UL>
<!--TOC section How it works-->
<!--TOC section How it Works-->
<H2 CLASS="section"><A NAME="htoc4">2</A>&nbsp;&nbsp;How it works</H2><!--SEC END -->
<H2 CLASS="section"><A NAME="htoc4">2</A>&nbsp;&nbsp;How it Works</H2><!--SEC END -->
<A NAME="sec:howitworks"></A>
A Jabber domain is served by one or more <TT>ejabberd</TT> nodes. These nodes can
@@ -235,9 +236,9 @@ routes the packet to S2S manager on that node, if it is open on this node, then
it is routed to the process that serves this connection, and if a connection
does not exist, then it is opened and registered.<BR>
<BR>
<!--TOC section XML representation-->
<!--TOC section XML Representation-->
<H2 CLASS="section"><A NAME="htoc9">3</A>&nbsp;&nbsp;XML representation</H2><!--SEC END -->
<H2 CLASS="section"><A NAME="htoc9">3</A>&nbsp;&nbsp;XML Representation</H2><!--SEC END -->
<A NAME="sec:xmlrepr"></A>
Each XML stanza is represented as the following tuple:
@@ -325,21 +326,14 @@ Err = term()
</PRE>Parses <TT>Str</TT> using XML parser, returns either parsed element or error
tuple.
</DL>
<!--TOC section <TT>ejabberd</TT> modules-->
<!--TOC section Modules-->
<H2 CLASS="section"><A NAME="htoc12">6</A>&nbsp;&nbsp;<TT>ejabberd</TT> modules</H2><!--SEC END -->
<H2 CLASS="section"><A NAME="htoc12">6</A>&nbsp;&nbsp;Modules</H2><!--SEC END -->
<A NAME="sec:emods"></A>
<!--TOC subsection gen_mod behaviour-->
<H3 CLASS="subsection"><A NAME="htoc13">6.1</A>&nbsp;&nbsp;gen_mod behaviour</H3><!--SEC END -->
<A NAME="sec:genmod"></A>
TBD<BR>
<BR>
<!--TOC subsection Module gen_iq_handler-->
<H3 CLASS="subsection"><A NAME="htoc14">6.2</A>&nbsp;&nbsp;Module gen_iq_handler</H3><!--SEC END -->
<H3 CLASS="subsection"><A NAME="htoc13">6.1</A>&nbsp;&nbsp;Module gen_iq_handler</H3><!--SEC END -->
<A NAME="sec:geniqhandl"></A>
The module <CODE>gen_iq_handler</CODE> allows to easily write handlers for IQ packets
@@ -408,12 +402,9 @@ process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) -&gt;
</PRE>
<!--TOC subsection Services-->
<H3 CLASS="subsection"><A NAME="htoc15">6.3</A>&nbsp;&nbsp;Services</H3><!--SEC END -->
<H3 CLASS="subsection"><A NAME="htoc14">6.2</A>&nbsp;&nbsp;Services</H3><!--SEC END -->
<A NAME="sec:services"></A>
TBD<BR>
<BR>
TODO: use <CODE>proc_lib</CODE>
<PRE CLASS="verbatim">
-module(mod_echo).
+16 -9
View File
@@ -29,24 +29,31 @@
%% Modules
\newcommand{\module}[1]{\texttt{#1}}
\newcommand{\modadhoc}{\module{mod\_adhoc}}
\newcommand{\modannounce}{\module{mod\_announce}}
\newcommand{\modconfigure}{\module{mod\_configure}}
\newcommand{\moddisco}{\module{mod\_disco}}
\newcommand{\modecho}{\module{mod\_echo}}
\newcommand{\modirc}{\module{mod\_irc}}
\newcommand{\modlast}{\module{mod\_last}}
\newcommand{\modlastodbc}{\module{mod\_last\_odbc}}
\newcommand{\modmuc}{\module{mod\_muc}}
\newcommand{\modecho}{\module{mod\_echo}}
\newcommand{\modmuclog}{\module{mod\_muc\_log}}
\newcommand{\modoffline}{\module{mod\_offline}}
\newcommand{\modofflineodbc}{\module{mod\_offline\_odbc}}
\newcommand{\modprivacy}{\module{mod\_privacy}}
\newcommand{\modprivate}{\module{mod\_private}}
\newcommand{\modpubsub}{\module{mod\_pubsub}}
\newcommand{\modregister}{\module{mod\_register}}
\newcommand{\modroster}{\module{mod\_roster}}
\newcommand{\modrosterodbc}{\module{mod\_roster\_odbc}}
\newcommand{\modservicelog}{\module{mod\_service\_log}}
\newcommand{\modsharedroster}{\module{mod\_shared\_roster}}
\newcommand{\modstats}{\module{mod\_stats}}
\newcommand{\modtime}{\module{mod\_time}}
\newcommand{\modvcard}{\module{mod\_vcard}}
\newcommand{\modvcardldap}{\module{mod\_vcard\_ldap}}
\newcommand{\modvcardodbc}{\module{mod\_vcard\_odbc}}
\newcommand{\modversion}{\module{mod\_version}}
%% Title page
@@ -89,7 +96,7 @@
% Input introduction.tex
\input{introduction}
\section{How it works}
\section{How it Works}
\label{sec:howitworks}
@@ -150,7 +157,7 @@ does not exist, then it is opened and registered.
\section{XML representation}
\section{XML Representation}
\label{sec:xmlrepr}
Each XML stanza is represented as the following tuple:
@@ -254,14 +261,14 @@ Err = term()
\end{description}
\section{\ejabberd{} modules}
\section{Modules}
\label{sec:emods}
\subsection{gen\_mod behaviour}
\label{sec:genmod}
%\subsection{gen\_mod behaviour}
%\label{sec:genmod}
TBD
%TBD
\subsection{Module gen\_iq\_handler}
\label{sec:geniqhandl}
@@ -345,10 +352,10 @@ process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) ->
\subsection{Services}
\label{sec:services}
TBD
%TBD
TODO: use \verb|proc_lib|
%TODO: use \verb|proc_lib|
\begin{verbatim}
-module(mod_echo).
+163
View File
@@ -0,0 +1,163 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<HTML>
<HEAD>
<TITLE>Ejabberd 1.1.2 Feature Sheet</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<META name="GENERATOR" content="hevea 1.08">
<STYLE type="text/css">
.toc{list-style:none;}
.title{margin:auto;text-align:center}
.center{text-align:center;margin-left:auto;margin-right:auto;}
.flushleft{text-align:left;margin-left:0ex;margin-right:auto;}
.flushright{text-align:right;margin-left:auto;margin-right:0ex;}
DIV TABLE{margin-left:inherit;margin-right:inherit;}
PRE{text-align:left;margin-left:0ex;margin-right:auto;}
BLOCKQUOTE{margin-left:4ex;margin-right:4ex;text-align:left;}
.part{margin:auto;text-align:center}
SPAN{width:20%; float:right; text-align:left; margin-left:auto;}
</STYLE>
</HEAD>
<BODY >
<!--HEVEA command line is: hevea -fix -noiso -pedantic features.tex -->
<!--HTMLHEAD-->
<!--ENDHTML-->
<!--PREFIX <ARG ></ARG>-->
<!--CUT DEF section 1 -->
<BR>
<BR>
<A NAME="titlepage"></A>
<TABLE CLASS="title">
<TR><TD>
<H1 CLASS="titlemain">Ejabberd 1.1.2 Feature Sheet</H1>
<H3 CLASS="titlerest">Sander Devrieze<BR>
<A HREF="mailto:s.devrieze@pandora.be"><TT>mailto:s.devrieze@pandora.be</TT></A><BR>
<A HREF="xmpp:sander@devrieze.dyndns.org"><TT>xmpp:sander@devrieze.dyndns.org</TT></A></H3></TD>
</TR></TABLE><BR>
<BR>
<DIV CLASS="center">
<IMG SRC="logo.png" ALT="logo.png">
<BR>
<BR>
</DIV>
<BLOCKQUOTE CLASS="quotation"><FONT COLOR="#921700"><I>I can thoroughly recommend ejabberd for ease of setup &ndash;
Kevin Smith, Current maintainer of the Psi project</I></FONT></BLOCKQUOTE>
<!--TOC section Introduction-->
<H2 CLASS="section"><A NAME="intro">Introduction</A></H2><!--SEC END -->
<A NAME="sec:intro"></A>
<BLOCKQUOTE CLASS="quotation"><FONT COLOR="#921700"><I>I just tried out ejabberd and was impressed both by ejabberd itself and the language it is written in, Erlang. &mdash;
Joeri</I></FONT></BLOCKQUOTE>
<TT>ejabberd</TT> is a <B><FONT SIZE=4><FONT COLOR="#001376">free and open source</FONT></FONT></B> instant messaging server written in <A HREF="http://www.erlang.org/">Erlang</A>.<BR>
<BR>
<TT>ejabberd</TT> is <B><FONT SIZE=4><FONT COLOR="#001376">cross-platform</FONT></FONT></B>, distributed, fault-tolerant, and based on open standards to achieve real-time communication.<BR>
<BR>
<TT>ejabberd</TT> is designed to be a <B><FONT SIZE=4><FONT COLOR="#001376">rock-solid and feature rich</FONT></FONT></B> XMPP server.<BR>
<BR>
<TT>ejabberd</TT> is suitable for small deployments, whether they need to be <B><FONT SIZE=4><FONT COLOR="#001376">scalable</FONT></FONT></B> or not, as well as extremely big deployments.<BR>
<BR>
<!--TOC subsection Key Features-->
<H3 CLASS="subsection"><A NAME="keyfeatures">Key Features</A></H3><!--SEC END -->
<A NAME="sec:keyfeatures"></A>
<BLOCKQUOTE CLASS="quotation"><FONT COLOR="#921700"><I>Erlang seems to be tailor-made for writing stable, robust servers. &mdash;
Peter Saint-Andr&eacute;, Executive Director of the Jabber Software Foundation</I></FONT></BLOCKQUOTE>
<TT>ejabberd</TT> is:
<UL CLASS="itemize"><LI CLASS="li-itemize">
<B><FONT SIZE=4><FONT COLOR="#001376">Cross-platform:</FONT></FONT></B> <TT>ejabberd</TT> runs under Microsoft Windows and Unix derived systems such as Linux, FreeBSD and NetBSD.<BR>
<BR>
<LI CLASS="li-itemize"><B><FONT SIZE=4><FONT COLOR="#001376">Distributed:</FONT></FONT></B> You can run <TT>ejabberd</TT> on a cluster of machines and all of them will serve the same Jabber domain(s). When you need more capacity you can simply add a new cheap node to your cluster. Accordingly, you do not need to buy an expensive high-end machine to support tens of thousands concurrent users.<BR>
<BR>
<LI CLASS="li-itemize"><B><FONT SIZE=4><FONT COLOR="#001376">Fault-tolerant:</FONT></FONT></B> You can deploy an <TT>ejabberd</TT> cluster so that all the information required for a properly working service will be replicated permanently on all nodes. This means that if one of the nodes crashes, the others will continue working without disruption. In addition, nodes also can be added or replaced `on the fly'.<BR>
<BR>
<LI CLASS="li-itemize"><B><FONT SIZE=4><FONT COLOR="#001376">Administrator Friendly:</FONT></FONT></B> <TT>ejabberd</TT> is built on top of the Open Source Erlang. As a result you do not need to install an external database, an external web server, amongst others because everything is already included, and ready to run out of the box. Other administrator benefits include:
<UL CLASS="itemize"><LI CLASS="li-itemize">
Comprehensive documentation.
<LI CLASS="li-itemize">Straightforward installers for Linux, Mac OS X, and Windows.<FONT COLOR="#FFAA00"><SPAN STYLE="font-variant:small-caps">improved</SPAN></FONT>
<LI CLASS="li-itemize">Web interface for administration tasks.
<LI CLASS="li-itemize">Shared Roster Groups.
<LI CLASS="li-itemize">Command line administration tool.<FONT COLOR="#FFAA00"><SPAN STYLE="font-variant:small-caps">improved</SPAN></FONT>
<LI CLASS="li-itemize">Can integrate with existing authentication mechanisms.
<LI CLASS="li-itemize">Capability to send announce messages.
</UL><BR>
<BR>
<LI CLASS="li-itemize"><B><FONT SIZE=4><FONT COLOR="#001376">Internationalized:</FONT></FONT></B> <TT>ejabberd</TT> leads in internationalization. Hence it is very well suited in a globalized world. Related features are:
<UL CLASS="itemize"><LI CLASS="li-itemize">
Translated in 12 languages.<FONT COLOR="#FFAA00"><SPAN STYLE="font-variant:small-caps">improved</SPAN></FONT>
<LI CLASS="li-itemize">Support for <A HREF="http://www.ietf.org/rfc/rfc3490.txt">IDNA</A>.
</UL><BR>
<BR>
<LI CLASS="li-itemize"><B><FONT SIZE=4><FONT COLOR="#001376">Open Standards:</FONT></FONT></B> <TT>ejabberd</TT> is the first Open Source Jabber server claiming to fully comply to the XMPP standard.
<UL CLASS="itemize"><LI CLASS="li-itemize">
Fully XMPP compliant.
<LI CLASS="li-itemize">XML-based protocol.
<LI CLASS="li-itemize"><A HREF="http://ejabberd.jabber.ru/protocols">Many JEPs supported</A>.
</UL></UL>
<!--TOC subsection Additional Features-->
<H3 CLASS="subsection"><A NAME="addfeatures">Additional Features</A></H3><!--SEC END -->
<A NAME="sec:addfeatures"></A>
<BLOCKQUOTE CLASS="quotation"><FONT COLOR="#921700"><I>ejabberd is making inroads to solving the "buggy incomplete server" problem &mdash;
Justin Karneges, Founder of the Psi and the Delta projects</I></FONT></BLOCKQUOTE>
Moreover, <TT>ejabberd</TT> comes with a wide range of other state-of-the-art features:
<UL CLASS="itemize"><LI CLASS="li-itemize">
Modular
<UL CLASS="itemize"><LI CLASS="li-itemize">
Load only the modules you want.
<LI CLASS="li-itemize">Extend <TT>ejabberd</TT> with your own custom modules.
</UL>
<LI CLASS="li-itemize">Security
<UL CLASS="itemize"><LI CLASS="li-itemize">
SASL and STARTTLS for c2s and s2s connections.
<LI CLASS="li-itemize">STARTTLS and Dialback s2s connections.
<LI CLASS="li-itemize">Web interface accessible via HTTPS secure access.
</UL>
<LI CLASS="li-itemize">Databases
<UL CLASS="itemize"><LI CLASS="li-itemize">
Native MySQL support.
<LI CLASS="li-itemize">Native PostgreSQL support.
<LI CLASS="li-itemize">Mnesia.
<LI CLASS="li-itemize">ODBC data storage support.
<LI CLASS="li-itemize">Microsoft SQL Server support.<FONT COLOR="red"><SPAN STYLE="font-variant:small-caps">new</SPAN></FONT>
</UL>
<LI CLASS="li-itemize">Authentication
<UL CLASS="itemize"><LI CLASS="li-itemize">
LDAP and ODBC.<FONT COLOR="#FFAA00"><SPAN STYLE="font-variant:small-caps">improved</SPAN></FONT>
<LI CLASS="li-itemize">External Authentication script.
<LI CLASS="li-itemize">Internal Authentication.
</UL>
<LI CLASS="li-itemize">Others
<UL CLASS="itemize"><LI CLASS="li-itemize">
Compressing XML streams with Stream Compression (<A HREF="http://www.jabber.org/jeps/jep-0138.html">JEP-0138</A>).
<LI CLASS="li-itemize">Interface with networks such as AIM, ICQ and MSN.
<LI CLASS="li-itemize">Statistics via Statistics Gathering (<A HREF="http://www.jabber.org/jeps/jep-0039.html">JEP-0039</A>).
<LI CLASS="li-itemize">IPv6 support both for c2s and s2s connections.
<LI CLASS="li-itemize"><A HREF="http://www.jabber.org/jeps/jep-0045.html">Multi-User Chat</A> module with logging.<FONT COLOR="#FFAA00"><SPAN STYLE="font-variant:small-caps">improved</SPAN></FONT>
<LI CLASS="li-itemize">Users Directory based on users vCards.
<LI CLASS="li-itemize"><A HREF="http://www.jabber.org/jeps/jep-0060.html">Publish-Subscribe</A> component.
<LI CLASS="li-itemize">Support for virtual hosting.
<LI CLASS="li-itemize"><A HREF="http://www.jabber.org/jeps/jep-0025.html">HTTP Polling</A> service.
<LI CLASS="li-itemize">IRC transport.
</UL>
</UL>
<!--HTMLFOOT-->
<!--ENDHTML-->
<!--FOOTER-->
<HR SIZE=2><BLOCKQUOTE CLASS="quote"><EM>This document was translated from L<sup>A</sup>T<sub>E</sub>X by
</EM><A HREF="http://pauillac.inria.fr/~maranget/hevea/index.html"><EM>H<FONT SIZE=2><sup>E</sup></FONT>V<FONT SIZE=2><sup>E</sup></FONT>A</EM></A><EM>.</EM></BLOCKQUOTE></BODY>
</HTML>
+10 -8
View File
@@ -9,7 +9,7 @@
Feature\ Sheet,pdfauthor=Sander\
Devrieze,pdfsubject=ejabberd,pdfkeywords=ejabberd]{hyperref}
\usepackage{verbatim}
\usepackage{xcolor}
\usepackage{color}
%% Index
% Remove the index anchors from the HTML version to save size and bandwith.
@@ -49,11 +49,14 @@
% Options
\newcommand{\marking}[1]{\textbf{\begin{large}\textcolor{ejblue}{#1}\end{large}}} % Marking enabled
\newcommand{\quoting}[2][yozhik]{\begin{quotation}\textcolor{#1}{\textit{#2}}\end{quotation}} % Quotes enabled
\newcommand{\new}{\begin{latexonly}\marginpar{\textcolor{red}{\textsc{new}}}\end{latexonly}} % Highlight new features
\newcommand{\improved}{\begin{latexonly}\marginpar{\textcolor{orange}{\textsc{improved}}}\end{latexonly}} % Highlight improved features
\newcommand{\moreinfo}[1]{} % Hide details
\newcommand{\new}{\marginpar{\textcolor{red}{\textsc{new}}}} % Highlight new features
\newcommand{\improved}{\marginpar{\textcolor{orange}{\textsc{improved}}}} % Highlight improved features
\setcounter{secnumdepth}{-1} % Disable section numbering
%% To by-pass errors in the HTML version.
\newstyle{SPAN}{width:20\%; float:right; text-align:left; margin-left:auto;}
\definecolor{orange} {cmyk}{0.000,0.333,1.000,0.000}
%% Footnotes
\begin{latexonly}
\global\parskip=9pt plus 3pt minus 1pt
@@ -67,7 +70,7 @@
%% Fancy header
\fancyhf{}
\pagestyle{fancy}
\rhead{\textcolor{ejblue}{The expandable Jabber daemon.}}
\rhead{\textcolor{ejblue}{The Expandable Jabber Daemon.}}
\renewcommand{\headrule}{{\color{ejblue}%
\hrule width\headwidth height\headrulewidth \vskip-\headrulewidth}}
\lhead{\setlength{\unitlength}{-6mm}
@@ -85,7 +88,7 @@
\begin{document}
\label{sec:titlepage}
\label{titlepage}
\begin{titlepage}
\maketitle{}
@@ -107,9 +110,8 @@
% the same identifier".
\begin{latexonly}
\setcounter{page}{2}
\end{latexonly}
\pagecolor{ejgreenwhite}
\end{latexonly}
% Input introduction.tex
\input{introduction}
+1976 -1129
View File
File diff suppressed because it is too large Load Diff
+1699 -949
View File
File diff suppressed because it is too large Load Diff
+40 -35
View File
@@ -1,25 +1,31 @@
\section{Introduction}
\label{sec:intr}
\section{\aname{intro}{Introduction}}
\label{sec:intro}
\quoting{I just tried out ejabberd and was impressed both by ejabberd itself and the language it is written in, Erlang. --
\quoting{I just tried out ejabberd and was impressed both by ejabberd itself and the language it is written in, Erlang. ---
Joeri}
\ejabberd{} is a free (GPL) distributed fault-tolerant \Jabber{}/XMPP server and is mainly written in \footahref{http://www.erlang.org/}{Erlang}.
%ejabberd is a free and open source instant messaging server written in Erlang. ejabberd is cross-platform, distributed, fault-tolerant, and based on open standards to achieve real-time communication (Jabber/XMPP).
\ejabberd{} is designed to be a \marking{stable}, \marking{standards compliant}, and \marking{\mbox{feature rich}} \Jabber{}/XMPP server.
\ejabberd{} is a \marking{free and open source} instant messaging server written in \footahref{http://www.erlang.org/}{Erlang}.
\ejabberd{} is suitable for small servers, whether they need to be scalable or not, as well as extremely big servers.
\ejabberd{} is \marking{cross-platform}, distributed, fault-tolerant, and based on open standards to achieve real-time communication.
%\subsection{Layout with example deployment (title needs a better name)}
\ejabberd{} is designed to be a \marking{rock-solid and feature rich} XMPP server.
\ejabberd{} is suitable for small deployments, whether they need to be \marking{scalable} or not, as well as extremely big deployments.
%\subsection{\aname{layout}{Layout with example deployment (title needs a better name)}}
%\label{sec:layout}
%In this section there will be a graphical overview like these:\\
%\verb|http://www.tipic.com/var/timp/timp_dep.gif| \\
%\verb|http://www.jabber.com/images/jabber_Com_Platform.jpg| \\
%\verb|http://www.antepo.com/files/OPN45systemdatasheet.pdf| \\
%Some small images of Jabber clients that are known to work greatly with ejabberd. Less text!!!
%A page full with names of Jabber client that are known to work with ejabberd. \begin{tiny}tiny font\end{tiny}
%\subsection{Try It Today}
%\subsection{\aname{trytoday}{Try It Today}}
%\label{sec:trytoday}
%(Not sure if I will include/finish this section for the next version.)
@@ -32,42 +38,42 @@ Joeri}
%\end{itemize}
\newpage
\subsection{Key Features}
\subsection{\aname{keyfeatures}{Key Features}}
\label{sec:keyfeatures}
\ind{features!key features}
\quoting{Erlang seems to be tailor-made for writing stable, robust servers. --
\quoting{Erlang seems to be tailor-made for writing stable, robust servers. ---
Peter Saint-Andr\'e, Executive Director of the Jabber Software Foundation}
\ejabberd{} is:
\begin{itemize}
\item \marking{Multiplatform:} \ejabberd{} runs under Microsoft Windows and Unix derived systems such as Linux, FreeBSD and NetBSD.
\item \marking{Cross-platform:} \ejabberd{} runs under Microsoft Windows and Unix derived systems such as Linux, FreeBSD and NetBSD.
\item \marking{Distributed:} You can run \ejabberd{} on a cluster of machines and all of them will serve the same \Jabber{} domain(s). When you need more capacity you can simply add a new cheap node to your cluster. Accordingly, you do not need to buy an expensive high-end machine to support tens of thousands concurrent users.
\item \marking{Fault-tolerant:} You can deploy an \ejabberd{} cluster so that all the information required for a properly working service will be replicated permanently on all nodes. This means that if one of the nodes crashes, the others will continue working without disruption. In addition, nodes also can be added or replaced ``on the fly''.
\item \marking{Fault-tolerant:} You can deploy an \ejabberd{} cluster so that all the information required for a properly working service will be replicated permanently on all nodes. This means that if one of the nodes crashes, the others will continue working without disruption. In addition, nodes also can be added or replaced `on the fly'.
\item \marking{Administrator Friendly:} \ejabberd{} is built on top of the Open Source Erlang. As a result you do not need to install an external database, an external web server, amongst others because everything is already included, and ready to run out of the box. Other administrator benefits include:
\begin{itemize}
\item Comprehensive documentation.\moreinfo{ --- You can start in the \footahref{http://ejabberd.jabber.ru/book}{ejabberd Book}.}
\item Straightforward installers for Linux, Mac OS X, and Windows.\improved{}\moreinfo{ --- (\footahref{http://ejabberd.jabber.ru/screenshots-linux-installer}{Screenshots}).}
\item Web interface for administration tasks.\moreinfo{ --- With HTTPS secure access. \footahref{http://ejabberd.jabber.ru/online-demo-webadmin}{Demo}.}
\item Shared Roster Groups.\moreinfo{ --- The administrator can setup a common list of \Jabber{} users for all users on the server. Those users are virtually added to all rosters. They cannot be removed, but can be renamed or moved into different roster groups. Does not require client implementation. Not related to \jepref{0144} (Roster Item Exchange).\footahref{http://ejabberd.jabber.ru/screenshots-shared-roster-groups}{Screenshots})}
\item Command line administration tool.\improved{}\moreinfo{ --- Some basic administration tasks can be acomplished using the command line: register/remove users, backup/restore database, amongst others (\footahref{http://ejabberd.jabber.ru/screenshots-administration#ejabberdctl}{Screenshots}).}
\item Comprehensive documentation.
\item Straightforward installers for Linux, Mac OS X, and Windows.\improved{}
\item Web interface for administration tasks.
\item Shared Roster Groups.
\item Command line administration tool.\improved{}
\item Can integrate with existing authentication mechanisms.
\item Capability to send announce messages.\improved{}
\item Capability to send announce messages.
\end{itemize}
\item \marking{Internationalized:} \ejabberd{} leads in internationalization. Hence it is very well suited in a globalized world. Related features are:
\begin{itemize}
\item Translated in 11 languages.\moreinfo{ --- More information is available \footahref{http://ejabberd.jabber.ru/localization}{here}.}
\item Translated in 12 languages.\improved{}
\item Support for \footahref{http://www.ietf.org/rfc/rfc3490.txt}{IDNA}.
\end{itemize}
\item \marking{Open Standards:} \ejabberd{} is the first Open Source Jabber server claiming to fully comply to the XMPP standard.
\begin{itemize}
\item Fully XMPP compliant \moreinfo{ --- ejabberd is fully compliant with XMPP Core 1.0 and XMPP IM 1.0. Check the \footahref{http://ejabberd.jabber.ru/protocols}{supported protocols}.}
\item XML-based protocol
\item Fully XMPP compliant.
\item XML-based protocol.
\item \footahref{http://ejabberd.jabber.ru/protocols}{Many JEPs supported}.
\end{itemize}
@@ -75,52 +81,51 @@ Peter Saint-Andr\'e, Executive Director of the Jabber Software Foundation}
\newpage
\subsection{Additional Features}
\subsection{\aname{addfeatures}{Additional Features}}
\label{sec:addfeatures}
\ind{features!additional features}
\quoting{ejabberd is making inroads to solving the "buggy incomplete server" problem --
\quoting{ejabberd is making inroads to solving the "buggy incomplete server" problem ---
Justin Karneges, Founder of the Psi and the Delta projects}
Besides common \Jabber{} server features, \ejabberd{} comes with a wide range of other features:
Moreover, \ejabberd{} comes with a wide range of other state-of-the-art features:
\begin{itemize}
\item Modular
\begin{itemize}
\item Load only the modules you want.
\item Extend \ejabberd{} with your own custom modules.\moreinfo{ --- A list of contributed modules and patches is available on the \footahref{http://ejabberd.jabber.ru/contributions}{contributions page}.}
\item Extend \ejabberd{} with your own custom modules.
\end{itemize}
\item Security
\begin{itemize}
\item SASL and STARTTLS for c2s and s2s connections.\improved{}
\item SASL and STARTTLS for c2s and s2s connections.
\item STARTTLS and Dialback s2s connections.
\item Web interface accessible via HTTPS secure access.
\end{itemize}
\item Databases
\begin{itemize}
\item Native MySQL support.\new{}
\item Native MySQL support.
\item Native PostgreSQL support.
\item Mnesia.
\item ODBC data storage support. \moreinfo{ --- ODBC requests can be load
balanced between several connections.}
\item Microsoft SQL Server support (via ODBC).\new{}
\item ODBC data storage support.
\item Microsoft SQL Server support.\new{}
\end{itemize}
\item Authentication
\begin{itemize}
\item LDAP and ODBC. \moreinfo{ --- Accounts can authenticate in a LDAP server.}
\item LDAP and ODBC.\improved{}
\item External Authentication script.
\item Internal Authentication.
\end{itemize}
\item Others
\begin{itemize}
\item Compressing XML streams with Stream Compression (\jepref{0138}).\new{}
\item Compressing XML streams with Stream Compression (\jepref{0138}).
\item Interface with networks such as AIM, ICQ and MSN.
\item Statistics via Statistics Gathering (\jepref{0039}).
\item IPv6 support both for c2s and s2s connections.
\item \tjepref{0045}{Multi-User Chat} module with logging.\improved{}
\item Users Directory based on users vCards.
\item \tjepref{0060}{Publish-Subscribe} component.
\item Support for virtual hosting. \moreinfo{ --- Several \Jabber{} hosts can be hosted on the same \ejabberd{} instance. As simple as adding a new domain name to the list of hosts in the configuration file.}
\item Support for virtual hosting.
\item \tjepref{0025}{HTTP Polling} service.
\item IRC transport.\improved{}
\item IRC transport.
\end{itemize}
\end{itemize}
+119
View File
@@ -0,0 +1,119 @@
Release Notes
ejabberd 1.1.2
27 September 2006
This document describes the main changes in ejabberd 1.1.2.
This version is a major improvement over ejabberd 1.1.1, improving the
overall behaviour of the server in many areas. Users of ejabberd 1.1.1
should upgrade to this new release for improved robustness and compliance.
ejabberd can be downloaded from the Process-one website:
http://www.process-one.net/en/projects/ejabberd/
Detailed information can be found in the Feature Sheet and in the
Installation and Operation Guide which are both available on the
Process-one website:
http://www.process-one.net/en/projects/ejabberd/docs.html
ejabberd includes 44 improvements. A complete list of changes can be
retrieved from:
http://redir.process-one.net/ejabberd-1.1.2
Recent changes include:
LDAP Improvements
- Major improvements have been made on the LDAP module. It is now more
flexible and more robust.
HTTP Polling Fixes
- The HTTP polling modules have been fixed and improved: the connections are
closed properly and polled messages cannot be lost anymore.
Roster Management Improvement
- Roster management improvements increase reliability, especially in cases
where users are on different servers.
- Shared rosters are more reliable.
Improved Robustness
- It is now possible to limit the number of opened connections for a single
user.
Relational databases
- Database support: Microsoft SQL Server is now officially supported in ODBC
mode.
Publish-Subscribe Improvement
- Restricting node creation with a dedicated ACL rule is now possible.
Localization
- A Czech translation has been added.
- Translations have been updated.
Binary Installer
- New binary installer for Windows including all requirements.
- Improved installers for Linux and MacOSX (PowerPC)
XMPP Compliancy
- Some protocol compliance fix have been added, after the Portland XMPP
Interop Meeting in July.
Miscelanous
- MUC have been improved (logging rendering).
- The command line tool ejabberdctl has been improved.
- The build chain has been improved, including MacOSX support.
- The documentation has been improved and updated to describe the new
features.
Bugfixes
- Anonymous login bugfixes.
- Please refer to the ChangeLog file supplied with this release regarding
all improvements in ejabberd.
Installation Notes
Supported Erlang Version
- You need at least Erlang/OTP R9C-2 to run ejabberd 1.1.2.
- The recommanded version is Erlang/OTP R10B-10.
- Erlang/OTP R11B has not yet been fully certified for ejabberd.
Installation
Installers are provided for Microsoft Windows, Linux/x86 and MacOSX/PPC.
They can be retrieved from:
http://www.process-one.net/en/projects/ejabberd/download.html
Migration Notes
- Before any migration, ejabberd system and database must be properly
backed up.
- The relational database schema has changed between version 1.1.1 and
1.1.2. An "askmessage" column needs to be added in the "rosterusers" table
to perform the migration.
References
Contributed tutorials and documents of interest are:
- Migration from other XMPP servers to ejabberd:
http://ejabberd.jabber.ru/migrate-to-ejabberd
- Transport configuration for connecting to other networks:
http://ejabberd.jabber.ru/tutorials-transports
- Frequently Asked Questions:
http://ejabberd.jabber.ru/faq
END
+50
View File
@@ -0,0 +1,50 @@
Release Notes
ejabberd 1.1.3
2 February 2007
This document describes the change in ejabberd 1.1.3.
This version is a security improvement over ejabberd 1.1.2, solving
the mod_roster_odbc SQL injection issue.
Users of ejabberd 1.1.2 that are using mod_roster_odbc MUST upgrade to
this new release.
ejabberd can be downloaded from the Process-one website:
http://www.process-one.net/en/ejabberd/
Detailed information can be found in the Feature Sheet and in the
Installation and Operation Guide which are both available on the
Process-one website:
http://www.process-one.net/en/ejabberd/docs.html
Installation Notes
Supported Erlang Version
- You need at least Erlang/OTP R9C-2 to run ejabberd 1.1.3.
- The recommanded version is Erlang/OTP R11B-3.
Installation
Installers are provided for Microsoft Windows, Linux/x86 and MacOSX/PPC.
They can be retrieved from:
http://www.process-one.net/en/ejabberd/download.html
Migration Notes
- Before any migration, ejabberd system and database must be properly
backed up.
References
Contributed tutorials and documents of interest are:
- Migration from other XMPP servers to ejabberd:
http://ejabberd.jabber.ru/migrate-to-ejabberd
- Transport configuration for connecting to other networks:
http://ejabberd.jabber.ru/tutorials-transports
- Frequently Asked Questions:
http://ejabberd.jabber.ru/faq
END
+1 -1
View File
@@ -1,2 +1,2 @@
% Define ejabberd version here.
\newcommand{\version}{1.1.1}
\newcommand{\version}{1.1.2}
+1 -1
View File
@@ -89,7 +89,7 @@ install: all
install -d $(MSGSDIR)
install -m 644 msgs/*.msg $(MSGSDIR)
install -d $(ETCDIR)
install -b -m 644 ejabberd.cfg.example $(ETCDIR)/ejabberd.cfg
[ -f $(ETCDIR)/ejabberd.cfg ] && install -b -m 644 ejabberd.cfg.example $(ETCDIR)/ejabberd.cfg-new || install -b -m 644 ejabberd.cfg.example $(ETCDIR)/ejabberd.cfg
install -d $(LOGDIR)
clean: clean-recursive clean-local
+1 -1
View File
@@ -2,7 +2,7 @@
{application, ejabberd,
[{description, "ejabberd"},
{vsn, "1.1.1"},
{vsn, "1.1.2"},
{modules, [acl,
configure,
cyrsasl,
+1 -1
View File
@@ -6,7 +6,7 @@
%%% Id : $Id$
%%%----------------------------------------------------------------------
-define(VERSION, "1.1.1").
-define(VERSION, "1.1.3").
%-define(ejabberd_debug, true).
%-define(DBGFSM, true).
+299 -62
View File
@@ -10,8 +10,21 @@
-author('alexey@sevcom.net').
-vsn('$Revision$ ').
-behaviour(gen_server).
%% gen_server callbacks
-export([init/1,
handle_info/2,
handle_call/3,
handle_cast/2,
terminate/2,
code_change/3
]).
%% External exports
-export([start/1,
stop/1,
start_link/1,
set_password/3,
check_password/3,
check_password/5,
@@ -29,39 +42,90 @@
-include("ejabberd.hrl").
-include("eldap/eldap.hrl").
-record(state, {host,
eldap_id,
bind_eldap_id,
servers,
port,
dn,
password,
base,
uidattr,
uidattr_format,
ufilter,
sfilter,
dn_filter,
dn_filter_attrs
}).
%% Unused callbacks.
handle_cast(_Request, State) ->
{noreply, State}.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
handle_info(_Info, State) ->
{noreply, State}.
%% -----
%%%----------------------------------------------------------------------
%%% API
%%%----------------------------------------------------------------------
start(Host) ->
LDAPServers = ejabberd_config:get_local_option({ldap_servers, Host}),
RootDN = ejabberd_config:get_local_option({ldap_rootdn, Host}),
Password = ejabberd_config:get_local_option({ldap_password, Host}),
eldap:start_link(get_eldap_id(Host, ejabberd),
LDAPServers, 389, RootDN, Password),
eldap:start_link(get_eldap_id(Host, ejabberd_bind),
LDAPServers, 389, RootDN, Password),
Proc = gen_mod:get_module_proc(Host, ?MODULE),
ChildSpec = {
Proc, {?MODULE, start_link, [Host]},
permanent, 1000, worker, [?MODULE]
},
supervisor:start_child(ejabberd_sup, ChildSpec).
stop(Host) ->
Proc = gen_mod:get_module_proc(Host, ?MODULE),
gen_server:call(Proc, stop),
supervisor:terminate_child(ejabberd_sup, Proc),
supervisor:delete_child(ejabberd_sup, Proc).
start_link(Host) ->
Proc = gen_mod:get_module_proc(Host, ?MODULE),
gen_server:start_link({local, Proc}, ?MODULE, Host, []).
terminate(_Reason, State) ->
ejabberd_ctl:unregister_commands(
State#state.host,
[{"registered-users", "list all registered users"}],
ejabberd_auth, ctl_process_get_registered).
init(Host) ->
State = parse_options(Host),
eldap:start_link(State#state.eldap_id,
State#state.servers,
State#state.port,
State#state.dn,
State#state.password),
eldap:start_link(State#state.bind_eldap_id,
State#state.servers,
State#state.port,
State#state.dn,
State#state.password),
ejabberd_ctl:register_commands(
Host,
[{"registered-users", "list all registered users"}],
ejabberd_auth, ctl_process_get_registered),
ok.
{ok, State}.
-define(REPLY_TIMEOUT, 10000).
plain_password_required() ->
true.
check_password(User, Server, Password) ->
case find_user_dn(User, Server) of
false ->
Proc = gen_mod:get_module_proc(Server, ?MODULE),
case catch gen_server:call(Proc,
{check_pass, User, Password}, ?REPLY_TIMEOUT) of
{'EXIT', _} ->
false;
DN ->
LServer = jlib:nameprep(Server),
case eldap:bind(get_eldap_id(LServer, ejabberd_bind),
DN, Password) of
ok ->
true;
_ ->
false
end
Result ->
Result
end.
check_password(User, Server, Password, _StreamID, _Digest) ->
@@ -77,31 +141,13 @@ dirty_get_registered_users() ->
get_vh_registered_users(?MYNAME).
get_vh_registered_users(Server) ->
LServer = jlib:nameprep(Server),
Attr = ejabberd_config:get_local_option({ldap_uidattr, LServer}),
Filter = eldap:present(Attr),
Base = ejabberd_config:get_local_option({ldap_base, LServer}),
case eldap:search(get_eldap_id(LServer, ejabberd),
[{base, Base},
{filter, Filter},
{attributes, [Attr]}]) of
#eldap_search_result{entries = Es} ->
lists:flatmap(
fun(E) ->
case lists:keysearch(Attr, 1, E#eldap_entry.attributes) of
{value, {_, [U]}} ->
case jlib:nodeprep(U) of
error ->
[];
LU ->
[{LU, LServer}]
end;
_ ->
[]
end
end, Es);
_ ->
[]
Proc = gen_mod:get_module_proc(Server, ?MODULE),
case catch gen_server:call(Proc,
get_vh_registered_users, ?REPLY_TIMEOUT) of
{'EXIT', _} ->
[];
Result ->
Result
end.
get_password(_User, _Server) ->
@@ -111,11 +157,13 @@ get_password_s(_User, _Server) ->
"".
is_user_exists(User, Server) ->
case find_user_dn(User, Server) of
false ->
Proc = gen_mod:get_module_proc(Server, ?MODULE),
case catch gen_server:call(Proc,
{is_user_exists, User}, ?REPLY_TIMEOUT) of
{'EXIT', _} ->
false;
_DN ->
true
Result ->
Result
end.
remove_user(_User, _Server) ->
@@ -124,25 +172,214 @@ remove_user(_User, _Server) ->
remove_user(_User, _Server, _Password) ->
not_allowed.
%%%----------------------------------------------------------------------
%%% Internal functions
%%%----------------------------------------------------------------------
handle_call({check_pass, User, Password}, _From, State) ->
Reply = case find_user_dn(User, State) of
false ->
false;
DN ->
case eldap:bind(State#state.bind_eldap_id, DN, Password) of
ok -> true;
_ -> false
end
end,
{reply, Reply, State};
find_user_dn(User, Server) ->
LServer = jlib:nameprep(Server),
Attr = ejabberd_config:get_local_option({ldap_uidattr, LServer}),
Filter = eldap:equalityMatch(Attr, User),
Base = ejabberd_config:get_local_option({ldap_base, LServer}),
case eldap:search(get_eldap_id(LServer, ejabberd),
[{base, Base},
{filter, Filter},
{attributes, []}]) of
#eldap_search_result{entries = [E | _]} ->
E#eldap_entry.object_name;
handle_call(get_vh_registered_users, _From, State) ->
UA = State#state.uidattr,
UAF = State#state.uidattr_format,
Eldap_ID = State#state.eldap_id,
Server = State#state.host,
SortedDNAttrs = usort_attrs(State#state.dn_filter_attrs),
Reply = case eldap_filter:parse(State#state.sfilter) of
{ok, EldapFilter} ->
case eldap:search(Eldap_ID, [{base, State#state.base},
{filter, EldapFilter},
{attributes, SortedDNAttrs}]) of
#eldap_search_result{entries = Entries} ->
lists:flatmap(
fun(#eldap_entry{attributes = Attrs,
object_name = DN}) ->
case is_valid_dn(DN, Attrs, State) of
false -> [];
_ ->
case get_ldap_attr(UA, Attrs) of
"" -> [];
User ->
case get_user_part(User, UAF) of
{ok, U} ->
case jlib:nodeprep(U) of
error -> [];
LU -> [{LU, jlib:nameprep(Server)}]
end;
_ -> []
end
end
end
end, Entries);
_ ->
[]
end;
_ ->
[]
end,
{reply, Reply, State};
handle_call({is_user_exists, User}, _From, State) ->
Reply = case find_user_dn(User, State) of
false -> false;
_DN -> true
end,
{reply, Reply, State};
handle_call(stop, _From, State) ->
{stop, normal, ok, State};
handle_call(_Request, _From, State) ->
{reply, bad_request, State}.
find_user_dn(User, State) ->
DNAttrs = usort_attrs(State#state.dn_filter_attrs),
case eldap_filter:parse(State#state.ufilter, [{"%u", User}]) of
{ok, Filter} ->
case eldap:search(State#state.eldap_id, [{base, State#state.base},
{filter, Filter},
{attributes, DNAttrs}]) of
#eldap_search_result{entries = [#eldap_entry{attributes = Attrs,
object_name = DN} | _]} ->
is_valid_dn(DN, Attrs, State);
_ ->
false
end;
_ ->
false
end.
get_eldap_id(Host, Name) ->
atom_to_list(gen_mod:get_module_proc(Host, Name)).
is_valid_dn(DN, _, #state{dn_filter = undefined}) ->
DN;
is_valid_dn(DN, Attrs, State) ->
DNAttrs = State#state.dn_filter_attrs,
UA = State#state.uidattr,
UAF = State#state.uidattr_format,
Values = [{"%s", get_ldap_attr(Attr, Attrs), 1} || Attr <- DNAttrs],
SubstValues = case get_ldap_attr(UA, Attrs) of
"" -> Values;
S ->
case get_user_part(S, UAF) of
{ok, U} -> [{"%u", U} | Values];
_ -> Values
end
end ++ [{"%d", State#state.host}, {"%D", DN}],
case eldap_filter:parse(State#state.dn_filter, SubstValues) of
{ok, EldapFilter} ->
case eldap:search(State#state.eldap_id, [
{base, State#state.base},
{filter, EldapFilter},
{attributes, ["dn"]}]) of
#eldap_search_result{entries = [_|_]} ->
DN;
_ ->
false
end;
_ ->
false
end.
%%%----------------------------------------------------------------------
%%% Auxiliary functions
%%%----------------------------------------------------------------------
get_user_part(String, Pattern) ->
F = fun(S, P) ->
First = string:str(P, "%u"),
TailLength = length(P) - (First+1),
string:sub_string(S, First, length(S) - TailLength)
end,
case catch F(String, Pattern) of
{'EXIT', _} ->
{error, badmatch};
Result ->
case regexp:sub(Pattern, "%u", Result) of
{ok, String, _} -> {ok, Result};
_ -> {error, badmatch}
end
end.
case_insensitive_match(X, Y) ->
X1 = stringprep:tolower(X),
Y1 = stringprep:tolower(Y),
if
X1 == Y1 -> true;
true -> false
end.
get_ldap_attr(LDAPAttr, Attributes) ->
Res = lists:filter(
fun({Name, _}) ->
case_insensitive_match(Name, LDAPAttr)
end, Attributes),
case Res of
[{_, [Value|_]}] -> Value;
_ -> ""
end.
usort_attrs(Attrs) when is_list(Attrs) ->
lists:usort(Attrs);
usort_attrs(_) ->
[].
parse_options(Host) ->
Eldap_ID = atom_to_list(gen_mod:get_module_proc(Host, ?MODULE)),
Bind_Eldap_ID = atom_to_list(gen_mod:get_module_proc(Host, bind_ejabberd_auth_ldap)),
LDAPServers = ejabberd_config:get_local_option({ldap_servers, Host}),
LDAPPort = case ejabberd_config:get_local_option({ldap_port, Host}) of
undefined -> 389;
P -> P
end,
RootDN = case ejabberd_config:get_local_option({ldap_rootdn, Host}) of
undefined -> "";
RDN -> RDN
end,
Password = case ejabberd_config:get_local_option({ldap_password, Host}) of
undefined -> "";
Pass -> Pass
end,
UIDAttr = case ejabberd_config:get_local_option({ldap_uidattr, Host}) of
undefined -> "uid";
UA -> UA
end,
UIDAttrFormat = case ejabberd_config:get_local_option({ldap_uidattr_format, Host}) of
undefined -> "%u";
UAF -> UAF
end,
SubFilter = "(" ++ UIDAttr ++ "=" ++ UIDAttrFormat ++ ")",
UserFilter = case ejabberd_config:get_local_option({ldap_filter, Host}) of
undefined -> SubFilter;
"" -> SubFilter;
F -> "(&" ++ SubFilter ++ F ++ ")"
end,
SearchFilter = eldap_filter:do_sub(UserFilter, [{"%u", "*"}]),
LDAPBase = ejabberd_config:get_local_option({ldap_base, Host}),
{DNFilter, DNFilterAttrs} =
case ejabberd_config:get_local_option({ldap_dn_filter, Host}) of
undefined -> {undefined, undefined};
{DNF, DNFA} -> {DNF, DNFA}
end,
#state{host = Host,
eldap_id = Eldap_ID,
bind_eldap_id = Bind_Eldap_ID,
servers = LDAPServers,
port = LDAPPort,
dn = RootDN,
password = Password,
base = LDAPBase,
uidattr = UIDAttr,
uidattr_format = UIDAttrFormat,
ufilter = UserFilter,
sfilter = SearchFilter,
dn_filter = DNFilter,
dn_filter_attrs = DNFilterAttrs
}.
+4 -3
View File
@@ -1354,7 +1354,7 @@ presence_update(From, Packet, StateData) ->
get_priority_from_presence(OldPresence)
end,
NewPriority = get_priority_from_presence(Packet),
update_priority(NewPriority, StateData),
update_priority(NewPriority, Packet, StateData),
FromUnavail = (StateData#state.pres_last == undefined) or
StateData#state.pres_invis,
?DEBUG("from unavail = ~p~n", [FromUnavail]),
@@ -1633,12 +1633,13 @@ roster_change(IJID, ISubscription, StateData) ->
end.
update_priority(Pri, StateData) ->
update_priority(Priority, Packet, StateData) ->
ejabberd_sm:set_presence(StateData#state.sid,
StateData#state.user,
StateData#state.server,
StateData#state.resource,
Pri).
Priority,
Packet).
get_priority_from_presence(PresencePacket) ->
case xml:get_subtag(PresencePacket, "priority") of
+19 -1
View File
@@ -19,7 +19,9 @@
get_key/1,
try_register/1,
remove_connection/1,
dirty_get_connections/0]).
dirty_get_connections/0,
ctl_process/2
]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
@@ -27,6 +29,7 @@
-include("ejabberd.hrl").
-include("jlib.hrl").
-include("ejabberd_ctl.hrl").
-record(s2s, {fromto, pid, key}).
-record(state, {}).
@@ -112,6 +115,10 @@ init([]) ->
{attributes, record_info(fields, s2s)}]),
mnesia:add_table_copy(s2s, node(), ram_copies),
mnesia:subscribe(system),
ejabberd_ctl:register_commands(
[{"incoming-s2s-number", "print number of incoming s2s connections on the node"},
{"outgoing-s2s-number", "print number of outgoing s2s connections on the node"}],
?MODULE, ctl_process),
{ok, #state{}}.
%%--------------------------------------------------------------------
@@ -240,6 +247,17 @@ find_connection(From, To) ->
send_element(Pid, El) ->
Pid ! {send_element, El}.
ctl_process(_Val, ["incoming-s2s-number"]) ->
N = length(supervisor:which_children(ejabberd_s2s_in_sup)),
io:format("~p~n", [N]),
{stop, ?STATUS_SUCCESS};
ctl_process(_Val, ["outgoing-s2s-number"]) ->
N = length(supervisor:which_children(ejabberd_s2s_out_sup)),
io:format("~p~n", [N]),
{stop, ?STATUS_SUCCESS};
ctl_process(Val, _Args) ->
Val.
update_tables() ->
case catch mnesia:table_info(s2s, attributes) of
[fromto, node, key] ->
+5 -3
View File
@@ -18,7 +18,7 @@
bounce_offline_message/3,
disconnect_removed_user/2,
get_user_resources/2,
set_presence/5,
set_presence/6,
unset_presence/5,
close_session_unset_presence/5,
dirty_get_sessions_list/0,
@@ -101,8 +101,10 @@ get_user_resources(User, Server) ->
[element(3, S#session.usr) || S <- clean_session_list(Ss)]
end.
set_presence(SID, User, Server, Resource, Priority) ->
set_session(SID, User, Server, Resource, Priority).
set_presence(SID, User, Server, Resource, Priority, Presence) ->
set_session(SID, User, Server, Resource, Priority),
ejabberd_hooks:run(set_presence_hook, jlib:nameprep(Server),
[User, Server, Resource, Presence]).
unset_presence(SID, User, Server, Resource, Status) ->
set_session(SID, User, Server, Resource, undefined),
+4 -2
View File
@@ -74,7 +74,7 @@ export_roster(Server, Output) ->
" and jid='", SJID, "';"
"insert into rosterusers("
" username, jid, nick, "
" subscription, ask, "
" subscription, ask, askmessage, "
" server, subscribe, type) "
" values ", ItemVals, ";"
"delete from rostergroups "
@@ -271,7 +271,8 @@ output(LServer, IO, SQL) ->
record_to_string(#roster{usj = {User, Server, JID},
name = Name,
subscription = Subscription,
ask = Ask}) ->
ask = Ask,
askmessage = AskMessage}) ->
Username = ejabberd_odbc:escape(User),
SJID = ejabberd_odbc:escape(jlib:jid_to_string(JID)),
Nick = ejabberd_odbc:escape(Name),
@@ -295,6 +296,7 @@ record_to_string(#roster{usj = {User, Server, JID},
"'", Nick, "',"
"'", SSubscription, "',"
"'", SAsk, "',"
"'", AskMessage, "',"
"'N', '', 'item')"].
groups_to_string(#roster{usj = {User, Server, JID},
+2 -1
View File
@@ -12,7 +12,8 @@ OUTDIR = ..
EFLAGS = -I .. -pz ..
OBJS = \
$(OUTDIR)/eldap.beam \
$(OUTDIR)/ELDAPv3.beam
$(OUTDIR)/ELDAPv3.beam \
$(OUTDIR)/eldap_filter.beam
all: $(OBJS)
+2 -1
View File
@@ -6,7 +6,8 @@ EFLAGS = -I .. -pz ..
OBJS = \
$(OUTDIR)\eldap.beam \
$(OUTDIR)\ELDAPv3.beam
$(OUTDIR)\ELDAPv3.beam \
$(OUTDIR)\eldap_filter.beam
ALL : $(OBJS)
+1 -1
View File
@@ -808,7 +808,7 @@ polish([], Res, Ref) ->
%%-----------------------------------------------------------------------
connect_bind(S) ->
Host = next_host(S#eldap.host, S#eldap.hosts),
TcpOpts = [{packet, asn1}, {active, true}, binary],
TcpOpts = [{packet, asn1}, {active, true}, {keepalive, true}, binary],
case gen_tcp:connect(Host, S#eldap.port, TcpOpts) of
{ok, Socket} ->
case bind_request(Socket, S) of
+285
View File
@@ -0,0 +1,285 @@
%%%====================================================
%%% File: eldap_filter.erl
%%% Purpose: Converts String Representation of
%%% LDAP Search Filter (RFC 2254)
%%% to eldap's representation of filter
%%% Author: Evgeniy Khramtsov <xramtsov@gmail.com>
%%% License: GPL
%%%====================================================
-module(eldap_filter).
-author('xram@jabber.ru').
%%%======================
%%% Export functions
%%%======================
-export([parse/1,
parse/2,
do_sub/2
]).
%%%-------------------------------------------------------------------------
%%% Arity: parse/1
%%% Function: parse(RFC2254_Filter) -> {ok, EldapFilter} |
%%% {error, bad_filter}
%%%
%%% RFC2254_Filter = string().
%%%
%%% Description: Converts String Representation of LDAP Search Filter (RFC 2254)
%%% to eldap's representation of filter.
%%%
%%% Example:
%%% > eldap_filter:parse("(&(!(uid<=100))(mail=*))").
%%%
%%% {ok,{'and',[{'not',{lessOrEqual,{'AttributeValueAssertion',"uid","100"}}},
%%% {present,"mail"}]}}
%%%-------------------------------------------------------------------------
parse(RFC2254_Filter) ->
parse(RFC2254_Filter, []).
%%%-------------------------------------------------------------------------
%%% Arity: parse/2
%%% Function: parse(RFC2254_Filter, [SubstValue |...]) ->
%%% {ok, EldapFilter} |
%%% {error, bad_filter} |
%%% {error, bad_regexp} |
%%% {error, max_substitute_recursion}
%%%
%%% SubstValue = {RegExp, Value} | {RegExp, Value, N},
%%% RFC2254_Filter = RegExp = Value = string(),
%%% N = integer().
%%%
%%% Description: The same as parse/1, but substitutes N or all occurences
%%% of RegExp with Value *after* parsing.
%%%
%%% Example:
%%% > eldap_filter:parse(
%%% "(|(mail=%u@%d)(jid=%u@%d))",
%%% [{"%u", "xramtsov"},{"%d","gmail.com"}]).
%%%
%%% {ok,{'or',[{equalityMatch,{'AttributeValueAssertion',
%%% "mail",
%%% "xramtsov@gmail.com"}},
%%% {equalityMatch,{'AttributeValueAssertion',
%%% "jid",
%%% "xramtsov@gmail.com"}}]}}
%%%--------------------------------------------------------------------------
parse(RFC2254_Filter, ListOfSubValues) ->
case catch convert_filter(parse_filter(RFC2254_Filter), ListOfSubValues) of
[EldapFilter] when is_tuple(EldapFilter) ->
{ok, EldapFilter};
{regexp, Error} ->
{error, Error};
_ ->
{error, bad_filter}
end.
%%%==========================
%%% Internal functions
%%%==========================
%%%----------------------
%%% split/1,4
%%%----------------------
split(Filter) ->
split(Filter, 0, [], []).
split([], _, _, Result) ->
Result;
split([H|T], Num, Rest, Result) ->
NewNum = case H of
$( -> Num + 1;
$) -> Num - 1;
_ -> Num
end,
if
NewNum == 0 ->
X = Rest++[H],
LenX = length(X),
if
LenX > 2 ->
split(T, 0, [], Result ++ [lists:sublist(X, 2, LenX-2)]);
true ->
split(T, 0, Rest, Result)
end;
true ->
split(T, NewNum, Rest++[H], Result)
end.
%%%-----------------------
%%% parse_filter/1
%%%-----------------------
parse_filter(Filter) ->
case Filter of
[$! | T] ->
{'not', parse_filter(T)};
[$| | T] ->
{'or', parse_filter(T)};
[$& | T] ->
{'and', parse_filter(T)};
[$( | _] ->
parse_filter(split(Filter));
[List | _] when is_list(List) ->
[parse_filter(X) || X <- Filter];
_ ->
Filter
end.
%%%--------------------
%%% convert_filter/2
%%%--------------------
convert_filter({'not', [Val | _]}, Replace) ->
eldap:'not'(convert_filter(Val, Replace));
convert_filter({'or', Vals}, Replace) ->
eldap:'or'([convert_filter(X, Replace) || X <- Vals]);
convert_filter({'and', Vals}, Replace) ->
eldap:'and'([convert_filter(X, Replace) || X <- Vals]);
convert_filter([H|_] = Filter, Replace) when is_integer(H) ->
parse_attr(Filter, Replace);
convert_filter(Filter, Replace) when is_list(Filter) ->
[convert_filter(X, Replace) || X <- Filter].
%%%-----------------
%%% parse_attr/2,3
%%%-----------------
parse_attr(Attr, ListOfSubValues) ->
{Action, [_|_] = Name, [_|_] = Value} = split_attribute(Attr),
parse_attr(Action, {Name, Value}, ListOfSubValues).
parse_attr(approx, {Name, Value}, ListOfSubValues) ->
NewValue = do_sub(Value, ListOfSubValues),
eldap:approxMatch(Name, NewValue);
parse_attr(greater, {Name, Value}, ListOfSubValues) ->
NewValue = do_sub(Value, ListOfSubValues),
eldap:greaterOrEqual(Name, NewValue);
parse_attr(less, {Name, Value}, ListOfSubValues) ->
NewValue = do_sub(Value, ListOfSubValues),
eldap:lessOrEqual(Name, NewValue);
parse_attr(equal, {Name, Value}, ListOfSubValues) ->
{ok, RegSList} = regexp:split(remove_extra_asterisks(Value), "[*]"),
Pattern = case [do_sub(X, ListOfSubValues) || X <- RegSList] of
[Head | Tail] when Tail /= [] ->
{Head, lists:sublist(Tail, length(Tail)-1), lists:last(Tail)};
R ->
R
end,
case Pattern of
[V] ->
eldap:equalityMatch(Name, V);
{[], [], []} ->
eldap:present(Name);
{"", Any, ""} ->
eldap:substrings(Name, [{any, X} || X<-Any]);
{H, Any, ""} ->
eldap:substrings(Name, [{initial, H}]++[{any, X} || X<-Any]);
{"", Any, T} ->
eldap:substrings(Name, [{any, X} || X<-Any]++[{final, T}]);
{H, Any, T} ->
eldap:substrings(Name, [{initial, H}]++[{any, X} || X<-Any]++[{final, T}])
end;
parse_attr(_, _, _) ->
false.
%%%--------------------
%%% do_sub/2,3
%%%--------------------
-define(MAX_RECURSION, 100).
do_sub(S, []) ->
S;
do_sub([], _) ->
[];
do_sub(S, [{RegExp, New} | T]) ->
Result = do_sub(S, {RegExp, replace_amps(New)}, 1),
do_sub(Result, T);
do_sub(S, [{RegExp, New, Times} | T]) ->
Result = do_sub(S, {RegExp, replace_amps(New), Times}, 1),
do_sub(Result, T).
do_sub(S, {RegExp, New}, Iter) ->
case regexp:sub(S, RegExp, New) of
{ok, NewS, 0} ->
NewS;
{ok, NewS, _} when Iter =< ?MAX_RECURSION ->
do_sub(NewS, {RegExp, New}, Iter+1);
{ok, _, _} when Iter > ?MAX_RECURSION ->
throw({regexp, max_substitute_recursion});
_ ->
throw({regexp, bad_regexp})
end;
do_sub(S, {_, _, N}, _) when N<1 ->
S;
do_sub(S, {RegExp, New, Times}, Iter) ->
case regexp:sub(S, RegExp, New) of
{ok, NewS, 0} ->
NewS;
{ok, NewS, _} when Iter < Times ->
do_sub(NewS, {RegExp, New, Times}, Iter+1);
{ok, NewS, _} ->
NewS;
_ ->
throw({regexp, bad_regexp})
end.
remove_extra_asterisks(String) ->
{Res, _} = lists:foldl(
fun(X, {Acc, Last}) ->
case X of
$* when Last==$* ->
{Acc, X};
_ ->
{Acc ++ [X], X}
end
end,
{"", ""}, String),
Res.
replace_amps(String) ->
lists:foldl(
fun(X, Acc) ->
if
X == $& ->
Acc ++ "\\&";
true ->
Acc ++ [X]
end
end,
"", String).
split_attribute(String) ->
split_attribute(String, "", $0).
split_attribute([], _, _) ->
{error, "", ""};
split_attribute([H|Tail], Acc, Last) ->
case H of
$= when Last==$> ->
{greater, lists:sublist(Acc, 1, length(Acc)-1), Tail};
$= when Last==$< ->
{less, lists:sublist(Acc, 1, length(Acc)-1), Tail};
$= when Last==$~ ->
{approx, lists:sublist(Acc, 1, length(Acc)-1), Tail};
$= when Last==$: ->
{equal, lists:sublist(Acc, 1, length(Acc)-1), Tail};
$= ->
{equal, Acc, Tail};
_ ->
split_attribute(Tail, Acc++[H], H)
end.
+1 -1
View File
@@ -291,7 +291,7 @@ iq_disco() ->
[{xmlelement, "identity",
[{"category", "conference"},
{"type", "irc"},
{"name", "ejabberd/mod_irc"}], []},
{"name", "IRC Transport"}], []},
{xmlelement, "feature",
[{"var", ?NS_MUC}], []},
{xmlelement, "feature",
+17 -11
View File
@@ -36,7 +36,7 @@
-record(muc_online_room, {name_host, pid}).
-record(muc_registered, {us_host, nick}).
-record(state, {host, server_host, access}).
-record(state, {host, server_host, access, history_size}).
-define(PROCNAME, ejabberd_mod_muc).
@@ -148,14 +148,17 @@ init([Host, Opts]) ->
Access = gen_mod:get_opt(access, Opts, all),
AccessCreate = gen_mod:get_opt(access_create, Opts, all),
AccessAdmin = gen_mod:get_opt(access_admin, Opts, none),
HistorySize = gen_mod:get_opt(history_size, Opts, 20),
catch ets:new(muc_online_room, [named_table,
public,
{keypos, #muc_online_room.name_host}]),
ejabberd_router:register_route(MyHost),
load_permanent_rooms(MyHost, Host, {Access, AccessCreate, AccessAdmin}),
load_permanent_rooms(MyHost, Host, {Access, AccessCreate, AccessAdmin},
HistorySize),
{ok, #state{host = MyHost,
server_host = Host,
access = {Access, AccessCreate, AccessAdmin}}}.
access = {Access, AccessCreate, AccessAdmin},
history_size = HistorySize}}.
%%--------------------------------------------------------------------
%% Function: %% handle_call(Request, From, State) -> {reply, Reply, State} |
@@ -187,8 +190,9 @@ handle_cast(_Msg, State) ->
handle_info({route, From, To, Packet},
#state{host = Host,
server_host = ServerHost,
access = Access} = State) ->
case catch do_route(Host, ServerHost, Access, From, To, Packet) of
access = Access,
history_size = HistorySize} = State) ->
case catch do_route(Host, ServerHost, Access, HistorySize, From, To, Packet) of
{'EXIT', Reason} ->
?ERROR_MSG("~p", [Reason]);
_ ->
@@ -239,11 +243,11 @@ stop_supervisor(Host) ->
supervisor:terminate_child(ejabberd_sup, Proc),
supervisor:delete_child(ejabberd_sup, Proc).
do_route(Host, ServerHost, Access, From, To, Packet) ->
do_route(Host, ServerHost, Access, HistorySize, From, To, Packet) ->
{AccessRoute, _AccessCreate, _AccessAdmin} = Access,
case acl:match_rule(ServerHost, AccessRoute, From) of
allow ->
do_route1(Host, ServerHost, Access, From, To, Packet);
do_route1(Host, ServerHost, Access, HistorySize, From, To, Packet);
_ ->
{xmlelement, _Name, Attrs, _Els} = Packet,
Lang = xml:get_attr_s("xml:lang", Attrs),
@@ -254,7 +258,7 @@ do_route(Host, ServerHost, Access, From, To, Packet) ->
end.
do_route1(Host, ServerHost, Access, From, To, Packet) ->
do_route1(Host, ServerHost, Access, HistorySize, From, To, Packet) ->
{_AccessRoute, AccessCreate, AccessAdmin} = Access,
{Room, _, Nick} = jlib:jid_tolower(To),
{xmlelement, Name, Attrs, _Els} = Packet,
@@ -379,7 +383,8 @@ do_route1(Host, ServerHost, Access, From, To, Packet) ->
?DEBUG("MUC: open new room '~s'~n", [Room]),
{ok, Pid} = mod_muc_room:start(
Host, ServerHost, Access,
Room, From, Nick),
Room, HistorySize, From,
Nick),
ets:insert(
muc_online_room,
#muc_online_room{name_host = {Room, Host},
@@ -411,7 +416,7 @@ do_route1(Host, ServerHost, Access, From, To, Packet) ->
load_permanent_rooms(Host, ServerHost, Access) ->
load_permanent_rooms(Host, ServerHost, Access, HistorySize) ->
case catch mnesia:dirty_select(
muc_room, [{#muc_room{name_host = {'_', Host}, _ = '_'},
[],
@@ -427,6 +432,7 @@ load_permanent_rooms(Host, ServerHost, Access) ->
ServerHost,
Access,
Room,
HistorySize,
R#muc_room.opts),
ets:insert(
muc_online_room,
@@ -440,7 +446,7 @@ iq_disco_info() ->
[{xmlelement, "identity",
[{"category", "conference"},
{"type", "text"},
{"name", "ejabberd/mod_muc"}], []},
{"name", "Chatrooms"}], []},
{xmlelement, "feature", [{"var", ?NS_MUC}], []},
{xmlelement, "feature", [{"var", ?NS_REGISTER}], []},
{xmlelement, "feature", [{"var", ?NS_VCARD}], []}].
+192 -23
View File
@@ -179,10 +179,10 @@ add_to_log2(text, {Nick, Packet}, Room, Opts, State) ->
{false, false} ->
ok;
{false, SubEl} ->
Message = {body, htmlize(xml:get_tag_cdata(SubEl))},
Message = {body, xml:get_tag_cdata(SubEl)},
add_message_to_log(Nick, Message, Room, Opts, State);
{SubEl, _} ->
Message = {subject, htmlize(xml:get_tag_cdata(SubEl))},
Message = {subject, xml:get_tag_cdata(SubEl)},
add_message_to_log(Nick, Message, Room, Opts, State)
end;
@@ -238,16 +238,24 @@ get_timestamp_daydiff(TimeStamp, Daydiff) ->
{Date2, HMS}.
% Try to close the previous day log, if it exists
close_previous_log(Fn) ->
close_previous_log(Fn, Images_dir) ->
case file:read_file_info(Fn) of
{ok, _} ->
{ok, F} = file:open(Fn, [append]),
fw(F, "<div class=\"legend\">ejabberd/mod_muc log<span class=\"w3c\"><a href=\"http://validator.w3.org/check?uri=referer\"><img src=\"http://www.w3.org/Icons/valid-xhtml10\" alt=\"Valid XHTML 1.0 Transitional\" height=\"31\" width=\"88\" /></a> <a href=\"http://jigsaw.w3.org/css-validator/\"><img style=\"border:0;width:88px;height:31px\" src=\"http://jigsaw.w3.org/css-validator/images/vcss\" alt=\"Valid CSS!\" /></a></span></div></body></html>"),
%fw(F, "<div class=\"legend\">ejabberd/mod_muc log<span class=\"w3c\">"),
fw(F, "<div class=\"legend\">"),
fw(F, " <a href=\"http://ejabberd.jabber.ru\"><img style=\"border:0\" src=\"~s/powered-by-ejabberd.png\" alt=\"Powered by ejabberd\"/></a>", [Images_dir]),
fw(F, " <a href=\"http://www.erlang.org/\"><img style=\"border:0\" src=\"~s/powered-by-erlang.png\" alt=\"Powered by Erlang\"/></a>", [Images_dir]),
fw(F, "<span class=\"w3c\">"),
fw(F, " <a href=\"http://validator.w3.org/check?uri=referer\"><img style=\"border:0;width:88px;height:31px\" src=\"~s/valid-xhtml10.png\" alt=\"Valid XHTML 1.0 Transitional\" /></a>", [Images_dir]),
fw(F, " <a href=\"http://jigsaw.w3.org/css-validator/\"><img style=\"border:0;width:88px;height:31px\" src=\"~s/vcss.png\" alt=\"Valid CSS!\"/></a>", [Images_dir]),
fw(F, "</span></div></body></html>"),
file:close(F);
_ -> ok
end.
add_message_to_log(Nick, Message, RoomJID, Opts, State) ->
add_message_to_log(Nick1, Message, RoomJID, Opts, State) ->
Nick = htmlize(Nick1),
#state{out_dir = OutDir,
dir_type = DirType,
css_file = CSSFile,
@@ -286,7 +294,14 @@ add_message_to_log(Nick, Message, RoomJID, Opts, State) ->
put_header(F, Room, Datestring, CSSFile, Lang,
HourOffset, DatePrev, DateNext, TopLink),
close_previous_log(FnYesterday)
Images_dir = filename:join([OutDir, "images"]),
file:make_dir(Images_dir),
create_image_files(Images_dir),
Images_url = case DirType of
subdirs -> "../../../images";
plain -> "../images"
end,
close_previous_log(FnYesterday, Images_url)
end,
% Build message
@@ -304,33 +319,33 @@ add_message_to_log(Nick, Message, RoomJID, Opts, State) ->
[Nick, ?T("leaves the room")]);
{leave, Reason} ->
io_lib:format("<font class=\"ml\">~s ~s: ~s</font><br/>",
[Nick, ?T("leaves the room"), Reason]);
[Nick, ?T("leaves the room"), htmlize(Reason)]);
{kickban, "307", ""} ->
io_lib:format("<font class=\"mk\">~s ~s</font><br/>",
[Nick, ?T("has been kicked")]);
{kickban, "307", Reason} ->
io_lib:format("<font class=\"mk\">~s ~s: ~s</font><br/>",
[Nick, ?T("has been kicked"), Reason]);
[Nick, ?T("has been kicked"), htmlize(Reason)]);
{kickban, "301", ""} ->
io_lib:format("<font class=\"mb\">~s ~s</font><br/>",
[Nick, ?T("has been banned")]);
{kickban, "301", Reason} ->
io_lib:format("<font class=\"mb\">~s ~s: ~s</font><br/>",
[Nick, ?T("has been banned"), Reason]);
[Nick, ?T("has been banned"), htmlize(Reason)]);
{nickchange, OldNick} ->
io_lib:format("<font class=\"mnc\">~s ~s ~s</font><br/>",
[OldNick, ?T("is now known as"), Nick]);
{subject, T} ->
io_lib:format("<font class=\"msc\">~s~s~s</font><br/>",
[Nick, ?T(" has set the subject to: "), T]);
[Nick, ?T(" has set the subject to: "), htmlize(T)]);
{body, T} ->
case regexp:first_match(T, "^/me\s") of
{match, _, _} ->
io_lib:format("<font class=\"mne\">~s ~s</font><br/>",
[Nick, string:substr(T, 5)]);
[Nick, string:substr(htmlize(T), 5)]);
nomatch ->
io_lib:format("<font class=\"mn\">&lt;~s&gt;</font> ~s<br/>",
[Nick, T])
[Nick, htmlize(T)])
end
end,
{Hour, Minute, Second} = Time,
@@ -391,6 +406,160 @@ make_dir_rec(Dir) ->
file:make_dir(Dir)
end.
% {ok, F1}=file:open("valid-xhtml10.png", [read]).
% {ok, F1b}=file:read(F1, 1000000).
% c("../../ejabberd/src/jlib.erl").
% jlib:encode_base64(F1b).
image_base64("powered-by-erlang.png") ->
"iVBORw0KGgoAAAANSUhEUgAAAGUAAAAfCAYAAAD+xQNoAAADN0lEQVRo3u1a"
"P0waURz+rjGRRQ+nUyRCYmJyDPTapDARaSIbTUjt1gVSh8ZW69aBAR0cWLSx"
"CXWp59LR1jbdqKnGxoQuRZZrSYyHEVM6iZMbHewROA7u3fHvkr5vOn737vcu"
"33ffu9/vcQz+gef5Cij6CkmSGABgFEH29r5SVvqIsTEOHo8HkiQxDBXEOjg9"
"PcHc3BxuUSqsI8jR0REAUFGsCCoKFYWCBAN6AxyO0Z7cyMXFb6oGqSgAsIrJ"
"ut9hMQlvdNbUhKWshLd3HtTF4jihShgVpRaBxKKmIGX5HL920/hz/BM2+zAm"
"pn2YioQaxnECj0BiEYcrG0Tzzc8/rfudSm02jaVSm9Vr1MdG8rSKKXlJ7lHr"
"fjouCut2IrC82BDPbe/gc+xlXez7KxEz63H4lmIN473Rh8Si1BKhRY6aEJI8"
"pLmbjSPN0xOnBBILmg5RC6Lg28preKOzsNmHG8R1Bf0o7GdMucUslDy1pJLG"
"2sndVVG0lq3c9vum4zmBR1kuwiYMN5ybmCYXxQg57ThFOTYznzpPO+IQi+IK"
"+jXjg/YhuIJ+cIIHg+wQJoJ+2N3jYN3Olvk4ge/IU98spne+FfGtlslm16nn"
"a8fduntfDscoVjGJqUgIjz686ViFUdjP4N39x9Xq638viZVtlq2tLXKncLf5"
"ticuZSWU5XOUshJKxxKtfdtdvs4OyNb/68urKvlluYizgwwu5SLK8jllu1t9"
"ihYOlzdwdpBBKSvh+vKKzHkCj1JW3y1m+hSj13WjqOiJKK0qpXKhSFxJAYBv"
"KYaZ9TjWRu4SiWi2LyDtb6wghGmn5HfTml16ILGA/G5al2DW7URYTFYrOU7g"
"icQ020sYqYDM9CbdgqFd4vzHL03JfvLjk6ZgADAVCSEsJvHsdL+utNYrm2uf"
"ZDVZSkzPKaQkW8kthpyS297BvRdRzR6DdTurJbPy9Ov1K6xr3HBPQuIMowR3"
"asegUyDuU9SuUG+dmIGyZ0b7FBN9St3WunyC5yMsrVv7uXzRP58s/qKn6C4q"
"lQoVxVIvd4YBwzBUFKs6ZaD27U9hEdcAN98Sx2IxykafIYrizbfESoB+dd9/"
"KF/d/wX3cJvREzl1vAAAAABJRU5ErkJggg==";
image_base64("valid-xhtml10.png") ->
"iVBORw0KGgoAAAANSUhEUgAAAFgAAAAfCAMAAAEjEcpEAAACiFBMVEUAAADe"
"5+fOezmtra3ejEKlhELvvWO9WlrehELOe3vepaWclHvetVLGc3PerVKcCAj3"
"vVqUjHOUe1JjlL0xOUpjjL2UAAC91ueMrc7vrVKlvdbW3u+EpcbO3ufO1ucY"
"WpSMKQi9SiF7e3taWkoQEAiMczkQSoxaUkpzc3O1lEoICACEazEhGAgIAACE"
"YzFra2utjELWcznGnEr/7+9jY2POazHOYzGta2NShLVrlL05OUqctdacCADG"
"a2ucAADGpVqUtc61ORg5OTmlUikYGAiUezl7YzEYEAiUczkxMTG9nEqtIRDe"
"3t4AMXu9lEoQCACMazEAKXspKSmljFrW1ta1jELOzs7n7/fGxsa9pVqEOSkp"
"Y5xznL29tZxahLXOpVr/99ZrY1L/79ZjUiljSikAOYTvxmMAMYScezmchFqU"
"czGtlFp7c2utjFqUlJStxt73///39/9Ce61CSkq9xsZznMbW5+9Cc62MjIxC"
"Qkrv9/fv7/fOzsbnlErWjIz/3mtCORhza1IpIRBzWjH/1mtCMRhzY1L/zmvn"
"vVpSQiHOpVJrUinntVr3zmOEc1L3xmNaWlq1nFo5QkrGWim1lFoISpRSUlK1"
"zt4hWpwASoz///////8xa6WUaykAQoxKe61KSkp7nMbWtWPe5+9jWlL39/f3"
"9/fWrWNCQkLera3nvWPv7+85MRjntWPetVp7c1IxKRCUlHtKORh7a1IxIRCU"
"jHtaSiHWrVIpIQhzWinvvVpaQiH/1mPWpVKMe1L/zmP/xmNrUiGErc4YGBj/"
"73PG1ucQWpT/53O9nFoQUpS1SiEQEBC9zt69vb05c6UISoxSUko5a6UICAhS"
"SkohUpS1tbXetWMAQoSUgD+kAAAA2HRSTlP/////////iP9sSf//dP//////"
"//////////////////////////////////////////8M////////////ef//"
"////////////////////////////////////////////////////////////"
"//////////////////////9d////////////////////////////////////"
"AP//////////////CP//RP//////////////////////////////////////"
"//////////////////////9xPp1gAAAFvUlEQVR42pVWi18URRwfy7vsYUba"
"iqBRBFmICUQGVKcZckQeaRJQUCLeycMSfKGH0uo5NELpIvGQGzokvTTA85VH"
"KTpbRoeJnPno/p1+M7t3txj20e/Nzu7Ofve7v/k9Zg4Vc+wRQMW0eyLx1ZSA"
"NeBDxVmxZZSwEUYkGAewm1eIBOMRvhv1UA+q8KXIVuxGdCelFYwxAnxOrxgb"
"Y8Ti1t4VA0QHYz4x3FnVC8OVLXv9fkKGSWDoW/4lG6VbdtBblesOs+MjmEmz"
"JKNIJWFEfEQTCWNPFKvcKEymjLO1b8bwYQd1hCiiDCl5KsrDCIlhj4fSuvcp"
"fSpgJmyv6dzeZv+nMPx3dhbt94II07/JZliEtm1N2RIYPkTYshwYm245a/zk"
"WjJwcyFh6ZIcYxxmqiaDSYxhOhFUsqngi3Fzcj3ljdYDNE9uzA1YD/5MhnzW"
"1KRqF7mYG8jFYXLcfLpjOe2LA0fuGqQrQHl10sdK0sFcFSOSlzF0BgXQH9h3"
"QZDBI0ccNEhftjXuippBDD2/eMRiETmwwNEYHyqhdDyo22w+3QHuNbdve5a7"
"eOkHmDVJ0ixNmfbz1h0qo/Q6GuSB2wQJQbpOjOQAl7woWSRJ0m2ewhvAOUiY"
"YtZtaZL0CZZmtmVOQttLfr/dbveLZodrfrL7W75wG/JjqkQxoNTtNsTKELQp"
"QL6/D5loaSmyTT8TUhsmi8iFA0hZiyltf7OiNKdarRm5w2So2lTNdPLuIzR+"
"AiLj8VTRJaj0LmX4VhJ27f/VJV/yycilWPOrk8NkXi7Qqmj5bHqVZlJKZIRk"
"1wFzKrt0WUbnXMPJ1fk4TJ5oWBA61p1V76DeIs0MX+s3GxRlA1vtw83KhgNp"
"hc1nyErLO5zcvbOsrq+scbZnpzc6QVFPenLwGxmC+BOfYI+DN55QYddh4Q/N"
"E/yGYYj4TOGNngQavAZnzzTovEA+kcMJ+247uYexNA+4Fsvjmuv662jsWxPZ"
"x2xg890bYMYnTgya7bjmCiEY0qgJ0vMF3c+NoFdPyzxz6V3Uxs3AOWCDchRv"
"OsQtBrbFsrT2fhHEc7ByGzu/dA4IO0A3HdfeP9yMqAwP6NPEb6cbwn0PWVU1"
"7/FDBQh/CPIrbfcg027IZrsAT/Bf3FNWyn9RSR4cvvwn3e4HFmYPDl/thYcR"
"Vi8qPEoXVUWBl6FTBFTtnqmKKg5wnlF4wZ1yeLv7TiwXKektE+iDBNicWEyL"
"pnFhfDkpJc3q2khSPyQBbE0dMJnOoDzTwGsI7cdyMkL5gWqUjCF6Txst/twx"
"Cv1WzzHoy21ZDQ1xnuDzdPDWR4knr14v0tYn3IxaMFFdiMOlEOJHw1jOQ4sW"
"t5rQopRkXZhMEi7pmeDCVWBlfUKwhMZ7rsF6elKsvbwiKxgxIdewa3ErsaYo"
"mCVZFYJb0GUu3JqGUNoplBxYiYby8vLBFWef+Cri4/I1sbQ/1OtYTrNtdXS+"
"rSe7kQ52eSObL99/iErCWUjCy5W4JLygmCouGfG9x9fmx17XhBuDCaOerbt5"
"38erta7TFktLvdHghZcCbcPQO33zIJG9kxF5hoVXnzTzRz0r5js8oTj6uyPk"
"GRf346HOLcasgFexueNUWFPtuFKzjoSFYYedhwVlhsRVYWWJpltv1XPQT1Rl"
"0bjZIBlb1XujVDzY/Kj4k6Ku3+Z0jo1owjVzDpFTXe1juvBSWNFmNWGZy8Lv"
"zUl5PN4JCwyNDzbQ0aAj4Zrjz0FatGJJYhvq4j7mGSpvytGFlZtHf2C4o/28"
"Zu8z7wo7eYPfXysnF0i9NnPh1t1zR7VBb9GqaOXhtTmHQdgMFXE+Z608cnpO"
"DdZdjL+TuDY44Q38kJXHhccWLoOd9uv1AwwvO+48uu+faCSJPJ1bmy6Thyvp"
"ivBmYWgjxPDPAp7JTemY/yGKFEiRt/jG/2P79s8KCwoLCgoLC/khUBA5F0Sf"
"QZ+RYfpNE/4Xosmq7jsZAJsAAAAASUVORK5CYII=";
image_base64("vcss.png") ->
"iVBORw0KGgoAAAANSUhEUgAAAFgAAAAfCAMAAABUFvrSAAABKVBMVEUAAAAj"
"Ix8MR51ZVUqAdlmdnZ3ejEWLDAuNjY1kiMG0n2d9fX19Ghfrp1FtbW3y39+3"
"Ph6lIRNdXV2qJBFcVUhcVUhPT0/dsmpUfLr57+/u7u4/PDWZAACZAADOp1Gd"
"GxG+SyTgvnNdSySzk16+mkuxw+BOS0BOS0DOzs7MzMy4T09RRDwsJBG+vr73"
"wV6fkG6eCQRFcLSurq6/X1+ht9nXfz5sepHuwV59ZTHetFjQ2+wMCQQ2ZK5t"
"WCsmWajsz8+Sq9NMPh4hVaY8MRj///////////////////////9MTEyOp9Lu"
"8vhXU1A8PDyjOSTBz+YLRJ2rLy8sLCwXTaKujEUcHByDn82dfz7/zGafDw+f"
"Dw+zRSlzlMcMDAyNcji1tbXf5vIcFgvATJOjAAAAY3RSTlP/8///////////"
"//////8A//////P/////ov//8//////////////z///T//////////+i////"
"//////////8w/////6IA/xAgMP//////////8/////////8w0/////////+z"
"ehebAAACkUlEQVR42u2VfVPTQBDG19VqC6LY+lKrRIxFQaFSBPuSvhBPF8SI"
"UZK2J5Yav/+HcO8uZdLqTCsU/nKnyWwvk1/unnt2D9ZmH+8/cMAaTRFy+ng6"
"9/yiwC/+gy8R3McGv5zHvGJEGAdR4eBgi1IbZwevIEZE24pFtBtzG1Q4AoD5"
"zvw5pEDcJvIQV/TE3/l+H9GnNJwcdABS5wAbFQLMqI98/UReoAaOTlaJsp0z"
"aHx7LwZvY0BUR2xpWTzqam0gzY8KGzG4MhBCNGucha4QbpETy+Yk/BP85nt7"
"34AjpQLTsE4ZFpf/dnkUCglXVNYB+OfUZJHvAqAoa45OeuPgm4+Xjtv7xm4N"
"7PMV4C61+Mrz3H2WImm3ATiWrAiwZRWcUA5Ej4dgIEMxDv6yxHHcNuAutnjv"
"2HZ1NeuycoVPh0mwC834zZC9Ao5dkZZKwLVGwT+WdLw0YOZ1saEkUDoT+QGW"
"KZ0E2xpcrPakVW2KXwyUtYEtlEAj3GXD/fYwrryAdeiyGqidQSw1eqtJcA8c"
"Zq4zXqhPuCBYE1fKJjh/5X6MwRm9c2xf7WVdLf5oSdt64esVIwVAKC1HJ2ol"
"i8vj3L0YzC4zjkMagt+arDAs6bApbL1RVlWIqrJbreqKZmh4y6VR7rAJeUYD"
"VRj9VqRXkErpJ9lbEwtE83KlIfeG4p52t7zWIMO1XcaGz54uUyet+hBM7BXX"
"DS8Xc5+8Gmmbu1xwSoGIokA3oTptQecQ4Iimm/Ew7jwbPfMi3TM91T9XVIGo"
"+W9xC8oWpugVCXLuwXijjxJ3r/6PjX7nlFua8QmyM+TO/Gja2TTc2Z95C5ua"
"ewGH6cJi6bJO6Z+TY276eH3tbgy+/3ly3Js+rj66osG/AV5htgaQ9SeRAAAA"
"AElFTkSuQmCC";
image_base64("powered-by-ejabberd.png") ->
"iVBORw0KGgoAAAANSUhEUgAAAGUAAAAfCAMAAADJG/NaAAAAw1BMVEUAAAAj"
"BgYtBAM5AwFCAAAYGAJNAABcAABIDQ5qAAAoJRV7AACFAAAoKSdJHByLAAAw"
"Lwk1NQA1MzFJKyo4NxtDQQBEQT5KSCxSTgBSUBlgQ0JYSEpZWQJPUU5hYABb"
"W0ZiYClcW1poaCVwbQRpaDhzYWNsakhuZ2VrbFZ8dwCEgAB3dnd4d2+OjACD"
"hYKcmACJi4iQkpWspgCYmJm5swCmqazEwACwsbS4ub3X0QLExsPLyszW1Nnc"
"3ODm5ugMBwAWAwPHm1IFAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJ"
"cEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfVCRQOBA7VBkCMAAACcElEQVRI"
"x72WjXKiMBSFQalIFbNiy1pdrJZaRVYR5deGwPs/VRNBSBB2OjvQO0oYjPfj"
"5J6bCcdx8i2UldxKcDhk1HbIPwFBF/kHKJfjPSVAyIRHF9rRZ4sUX3EDdWOv"
"1+u2tESaavpnYTbv9zvd0WwDy3/QcGQXlH5uTxB1l07MJlRpsUei0JF6Qi+O"
"HyGK7ijXxPklHe/umIllim3iUBMJDIEULxxPP0TVWhhKJoN9fUpdmQLteV8a"
"DgEAg9gIcTjL4F4L+r4WVKEF+rbJdwYYAoQHY+oQjnGootyKwxapoi73WkyF"
"FySQBv988naEEp4+YMMec5VUCQDJTscEy7Kc0HsLmqNE7rovDjMpIHHGYeid"
"Xn4TQcaxMYqP3RV3C8oCl2WvrlSPaNpGZadRnmPGCk8ylM2okAJ4i9TEe1Ke"
"rsXxSl6jUt5uayiIodirtcKLOaWblj50wiyMv1F9lm9TUDArGAD0FmEpvCUs"
"VoZy6dW81Fg0aDaHogQa36ekAPG5DDGsbdZrGsrzZUnzvBo1I2tLmuL69kSi"
"tAweyHKN9b3leDfQMnu3nIIKWfmXnqGVKedJT6QpICbJvf2f8aOsvn68v+k7"
"/cwUQdPoxaMoRTnKFHNlKsKQphCTOa84u64vpi8bH31CqsbF6lSONRTkTyQG"
"Arq49/fEvjBwz4eDS2/JpaXRNOoXRD/VmOrDVTJJRIZCTLav3VrqbPvP3vdd"
"uGEhQJzilncbpSA4F3vsihErO+dayv/sY5/yRE0GDEXCu2VoNiMlo5i+P2Kl"
"gMEvTNk2eYa5XEyh12Ex17Z8vzQUR3KEPbYd6XG87eC4Ly75RneS5ZYHAAAA"
"AElFTkSuQmCC".
create_image_files(Images_dir) ->
Filenames = [
"powered-by-ejabberd.png",
"powered-by-erlang.png",
"valid-xhtml10.png",
"vcss.png"
],
lists:foreach(
fun(Filename) ->
Filename_full = filename:join([Images_dir, Filename]),
{ok, F} = file:open(Filename_full, [write]),
Image = jlib:decode_base64(image_base64(Filename)),
io:format(F, "~s", [Image]),
file:close(F)
end,
Filenames),
ok.
fw(F, S, O) -> io:format(F, S ++ "~n", O).
fw(F, S) -> fw(F, S, []).
@@ -399,19 +568,19 @@ put_header(F, Room, Date, CSSFile, Lang, Hour_offset, Date_prev, Date_next, Top_
fw(F, "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"~s\" lang=\"~s\">", [Lang, Lang]),
fw(F, "<head>"),
fw(F, "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />"),
fw(F, "<title>~s - ~s</title>", [Room#room.title, Date]),
fw(F, "<title>~s - ~s</title>", [htmlize(Room#room.title), Date]),
put_header_css(F, CSSFile),
put_header_script(F),
fw(F, "</head>"),
fw(F, "<body>"),
{Top_url, Top_text} = Top_link,
fw(F, "<div style=\"text-align: right;\"><a style=\"color: #AAAAAA; font-family: monospace; text-decoration: none; font-weight: bold;\" href=\"~s\">~s</a></div>", [Top_url, Top_text]),
fw(F, "<div class=\"roomtitle\"><a class=\"roomtitle\" href=\"xmpp:~s?join\">~s</a></div>", [Room#room.jid, Room#room.title]),
fw(F, "<div class=\"roomtitle\">~s</div>", [htmlize(Room#room.title)]),
fw(F, "<a class=\"roomjid\" href=\"xmpp:~s?join\">~s</a>", [Room#room.jid, Room#room.jid]),
fw(F, "<div class=\"logdate\">~s<span class=\"w3c\"><a class=\"nav\" href=\"~s\">&lt;</a> <a class=\"nav\" href=\".\/\">^</a> <a class=\"nav\" href=\"~s\">&gt;</a></span></div>", [Date, Date_prev, Date_next]),
case {Room#room.subject_author, Room#room.subject} of
case {htmlize(Room#room.subject_author), htmlize(Room#room.subject)} of
{"", ""} -> ok;
{SuA, Su} -> fw(F, "<div class=\"roomsubject\">~s~s~s</div>", [SuA, ?T(" has set the subject to: "), htmlize(Su)])
{SuA, Su} -> fw(F, "<div class=\"roomsubject\">~s~s~s</div>", [SuA, ?T(" has set the subject to: "), Su])
end,
RoomConfig = roomconfig_to_string(Room#room.config, Lang),
put_room_config(F, RoomConfig, Lang),
@@ -436,7 +605,7 @@ put_header_css(F, false) ->
fw(F, ".mne {color: #AA0099;}"),
fw(F, "a.nav {color: #AAAAAA; font-family: monospace; letter-spacing: 3px; text-decoration: none;}"),
fw(F, "div.roomtitle {border-bottom: #224466 solid 3pt; margin-left: 20pt;}"),
fw(F, "a.roomtitle {color: #336699; font-size: 24px; font-weight: bold; font-family: sans-serif; letter-spacing: 3px; text-decoration: none;}"),
fw(F, "div.roomtitle {color: #336699; font-size: 24px; font-weight: bold; font-family: sans-serif; letter-spacing: 3px; text-decoration: none;}"),
fw(F, "a.roomjid {color: #336699; font-size: 24px; font-weight: bold; font-family: sans-serif; letter-spacing: 3px; margin-left: 20pt; text-decoration: none;}"),
fw(F, "div.logdate {color: #663399; font-size: 20px; font-weight: bold; font-family: sans-serif; letter-spacing: 2px; border-bottom: #224466 solid 1pt; margin-left:80pt; margin-top:20px;}"),
fw(F, "div.roomsubject {color: #336699; font-size: 18px; font-family: sans-serif; margin-left: 80pt; margin-bottom: 10px;}"),
@@ -485,11 +654,11 @@ htmlize(S1) ->
S2_list).
htmlize2(S1) ->
S2 = element(2, regexp:gsub(S1, "<", "\\&lt;")),
S3 = element(2, regexp:gsub(S2, ">", "\\&gt;")),
S4 = element(2, regexp:gsub(S3, "(http|ftp)://.[^ ]*", "<a href=\"&\">&</a>")),
%element(2, regexp:gsub(S4, " ", "\\&nbsp;")).
S4.
S2 = element(2, regexp:gsub(S1, "\\&", "\\&amp;")),
S3 = element(2, regexp:gsub(S2, "<", "\\&lt;")),
S4 = element(2, regexp:gsub(S3, ">", "\\&gt;")),
S5 = element(2, regexp:gsub(S4, "(http|ftp)://.[^ ]*", "<a href=\"&\">&</a>")),
S5.
get_room_info(RoomJID, Opts) ->
Title =
@@ -544,7 +713,7 @@ roomconfig_to_string(Options, Lang) ->
T ->
case Opt of
password -> "<div class=\"rcoe\">" ++ OptText ++ "</div>";
title -> "<div class=\"rcot\">" ++ ?T("Room title") ++ ": \"" ++ T ++ "\"</div>";
title -> "<div class=\"rcot\">" ++ ?T("Room title") ++ ": \"" ++ htmlize(T) ++ "\"</div>";
_ -> "\"" ++ T ++ "\""
end
end,
+22 -16
View File
@@ -14,10 +14,10 @@
%% External exports
-export([start_link/6,
start_link/5,
-export([start_link/7,
start_link/6,
start/7,
start/6,
start/5,
route/4]).
%% gen_fsm callbacks
@@ -85,22 +85,22 @@
%%%----------------------------------------------------------------------
%%% API
%%%----------------------------------------------------------------------
start(Host, ServerHost, Access, Room, Creator, Nick) ->
start(Host, ServerHost, Access, Room, HistorySize, Creator, Nick) ->
Supervisor = gen_mod:get_module_proc(ServerHost, ejabberd_mod_muc_sup),
supervisor:start_child(
Supervisor, [Host, ServerHost, Access, Room, Creator, Nick]).
Supervisor, [Host, ServerHost, Access, Room, HistorySize, Creator, Nick]).
start(Host, ServerHost, Access, Room, Opts) ->
start(Host, ServerHost, Access, Room, HistorySize, Opts) ->
Supervisor = gen_mod:get_module_proc(ServerHost, ejabberd_mod_muc_sup),
supervisor:start_child(
Supervisor, [Host, ServerHost, Access, Room, Opts]).
Supervisor, [Host, ServerHost, Access, Room, HistorySize, Opts]).
start_link(Host, ServerHost, Access, Room, Creator, Nick) ->
gen_fsm:start_link(?MODULE, [Host, ServerHost, Access, Room, Creator, Nick],
start_link(Host, ServerHost, Access, Room, HistorySize, Creator, Nick) ->
gen_fsm:start_link(?MODULE, [Host, ServerHost, Access, Room, HistorySize, Creator, Nick],
?FSMOPTS).
start_link(Host, ServerHost, Access, Room, Opts) ->
gen_fsm:start_link(?MODULE, [Host, ServerHost, Access, Room, Opts],
start_link(Host, ServerHost, Access, Room, HistorySize, Opts) ->
gen_fsm:start_link(?MODULE, [Host, ServerHost, Access, Room, HistorySize, Opts],
?FSMOPTS).
%%%----------------------------------------------------------------------
@@ -114,20 +114,22 @@ start_link(Host, ServerHost, Access, Room, Opts) ->
%% ignore |
%% {stop, StopReason}
%%----------------------------------------------------------------------
init([Host, ServerHost, Access, Room, Creator, _Nick]) ->
init([Host, ServerHost, Access, Room, HistorySize, Creator, _Nick]) ->
State = set_affiliation(Creator, owner,
#state{host = Host,
server_host = ServerHost,
access = Access,
room = Room,
history = lqueue_new(HistorySize),
jid = jlib:make_jid(Room, Host, ""),
just_created = true}),
{ok, normal_state, State};
init([Host, ServerHost, Access, Room, Opts]) ->
init([Host, ServerHost, Access, Room, HistorySize, Opts]) ->
State = set_opts(Opts, #state{host = Host,
server_host = ServerHost,
access = Access,
room = Room,
history = lqueue_new(HistorySize),
jid = jlib:make_jid(Room, Host, "")}),
{ok, normal_state, State}.
@@ -1372,6 +1374,10 @@ lqueue_new(Max) ->
len = 0,
max = Max}.
%% If the message queue limit is set to 0, do not store messages.
lqueue_in(_Item, LQ = #lqueue{max = 0}) ->
LQ;
%% Otherwise, rotate messages in the queue store.
lqueue_in(Item, #lqueue{queue = Q1, len = Len, max = Max}) ->
Q2 = queue:in(Item, Q1),
if
@@ -2131,7 +2137,7 @@ get_config(Lang, StateData, From) ->
end),
{xmlelement, "field",
[{"type", "list-single"},
{"label", translate:translate(Lang, "Who may discover real JIDs?")},
{"label", translate:translate(Lang, "Present real JIDs to")},
{"var", "muc#roomconfig_whois"}],
[{xmlelement, "value", [], [{xmlcdata,
if Config#config.anonymous ->
@@ -2139,9 +2145,9 @@ get_config(Lang, StateData, From) ->
true ->
"anyone"
end}]},
{xmlelement, "option", [{"label", "Moderators only"}],
{xmlelement, "option", [{"label", translate:translate(Lang, "moderators only")}],
[{xmlelement, "value", [], [{xmlcdata, "moderators"}]}]},
{xmlelement, "option", [{"label", "Anyone"}],
{xmlelement, "option", [{"label", translate:translate(Lang, "anyone")}],
[{xmlelement, "value", [], [{xmlcdata, "anyone"}]}]}]},
?BOOLXFIELD("Make room members-only",
"muc#roomconfig_membersonly",
+1 -1
View File
@@ -318,7 +318,7 @@ iq_disco_info(SNode) ->
[{xmlelement, "identity",
[{"category", "pubsub"},
{"type", "generic"},
{"name", "ejabberd/mod_pubsub"}], []},
{"name", "Publish-Subscribe"}], []},
{xmlelement, "feature", [{"var", ?NS_PUBSUB}], []},
{xmlelement, "feature", [{"var", ?NS_PUBSUB_EVENT}], []},
{xmlelement, "feature", [{"var", ?NS_PUBSUB_OWNER}], []},
+6 -6
View File
@@ -141,11 +141,10 @@ get_user_roster(Acc, {LUser, LServer}) ->
R ->
SJID = jlib:jid_to_string(R#roster.jid),
Groups = lists:flatmap(
fun({S, G}) ->
case jlib:jid_tolower(S) of
SJID -> [G];
_ -> []
end
fun({S, G}) when S == SJID ->
[G];
(_) ->
[]
end, JIDGroups),
[R#roster{groups = Groups}]
end
@@ -822,12 +821,13 @@ record_to_string(#roster{us = {User, _Server},
in -> "I";
none -> "N"
end,
SAskMessage = ejabberd_odbc:escape(AskMessage),
["'", Username, "',"
"'", SJID, "',"
"'", Nick, "',"
"'", SSubscription, "',"
"'", SAsk, "',"
"'", AskMessage, "',"
"'", SAskMessage, "',"
"'N', '', 'item'"].
groups_to_string(#roster{us = {User, _Server},
+2 -1
View File
@@ -332,7 +332,8 @@ get_user_displayed_groups(US) ->
[Group || Group <- DisplayedGroups1, is_group_enabled(Host, Group)].
is_user_in_group(US, Group, Host) ->
case mnesia:match_object(#sr_user{us=US, group_host={Group, Host}}) of
case catch mnesia:dirty_match_object(
#sr_user{us=US, group_host={Group, Host}}) of
[] -> false;
_ -> true
end.
+553 -341
View File
File diff suppressed because it is too large Load Diff
+397
View File
@@ -0,0 +1,397 @@
% $Id$
% Czech translation
% Authors: Milos Svasek [DuxforD] from openheads.net
% jlib.hrl
{"No resource provided", "Nebyl poskytnutý žádny zdroj"}.
% mod_configure.erl
{"Choose storage type of tables", "Vyberte typ úložiště pro tabulky"}.
{"RAM copy", "Kopie RAM"}.
{"RAM and disc copy", "Kopie RAM a disku"}.
{"Disc only copy", "Jen kopie disku"}.
{"Remote copy", "Vzdálená kopie"}.
{"Stop Modules at ", "Zastavit moduly na "}.
{"Choose modules to stop", "Vyberte moduly, které mají být zastavené"}.
{"Start Modules at ", "Spustit moduly na "}.
{"Enter list of {Module, [Options]}", "Vložte seznam modulů {Modul, [Parametre]}"}.
{"List of modules to start", "Seznam modulů, které mají být spuštěné"}.
{"Backup to File at ", "Záloha do souboru na "}.
{"Enter path to backup file", "Zadajte cestu k souboru se zálohou"}.
{"Path to File", "Cesta k souboru"}.
{"Restore Backup from File at ", "Obnovit zálohu ze souboru na "}.
{"Dump Backup to Text File at ", "Uložit zálohu do textového souboru na "}.
{"Enter path to text file", "Zadajte cestu k textovému souboru"}.
{"Import User from File at ", "Importovat uživatele ze souboru na "}.
{"Enter path to jabberd1.4 spool file", "Zadejte cestu k spool souboru jabberd1.4"}.
{"Import Users from Dir at ", "Importovat uživatele z adresáře na "}.
{"Enter path to jabberd1.4 spool dir", "Zadejte cestu k jabberd1.4 spool adresáři"}.
{"Path to Dir", "Cesta k adresáři"}.
{"Hostname Configuration", "Konfigurace jména serveru"}.
{"Choose host name", "Vyberte jméno serveru"}.
{"Host name", "Jméno serveru"}.
{"Access Control List Configuration", "Konfigurace seznamu přístupových práv (ACL)"}.
{"Access control lists", "Seznamy přístupových práv (ACL)"}.
{"Access Configuration", "Konfigurace přístupů"}.
{"Access rules", "Pravidla přístupů"}.
{"Remove Users", "Odstranit uživatele"}.
{"Choose users to remove", "Vybrat uživatele, kteří budou odstraněni"}.
{"Administration of ", "Administrace "}.
{"Action on user", "Akce aplikovaná na uživatele"}.
{"Edit Properties", "Upravit vlastnosti"}.
{"Remove User", "Odstranit uživatele"}.
% mod_disco.erl
{"Configuration", "Konfigurace"}.
{"Online Users", "Online uživatelé"}.
{"All Users", "Všichni uživatelé"}.
{"To ~s", "Pre ~s"}.
{"From ~s", "Od ~s"}.
{"Running Nodes", "Bežící uzly"}.
{"Stopped Nodes", "Zastavené uzly"}.
{"Host Name", "Jméno serveru"}.
{"Access Control Lists", "Seznamy přístupových práv (ACL)"}.
{"Access Rules", "Pravidla přístupů"}.
{"Remove Users", "Odstranit uživatele"}.
{"Modules", "Moduly"}.
{"Start Modules", "Spustit moduly"}.
{"Stop Modules", "Zastavit moduly"}.
{"Backup Management", "Správa zálohování"}.
{"Backup", "Zálohovat"}.
{"Restore", "Obnovit"}.
{"Dump to Text File", "Uložit do textového souboru"}.
{"Import File", "Import souboru"}.
{"Import Directory", "Import adresáře"}.
% mod_register.erl
{"Choose a username and password to register with this server",
"Zadejte jméno uživatele a heslo pro registraci na tomto serveru"}.
% mod_vcard.erl
{"You need an x:data capable client to search",
"K vyhledávání potřebujete klienta podporujícího x:data"}.
{"Search users in ", "Hledat uživatele v "}.
{"Fill in fields to search for any matching Jabber User",
"Vyplňte políčka pro vyhledávání Jabber uživatele"}.
{"User", "Uživatel: "}.
{"Full Name", "Celé jméno: "}.
{"Name", "Jméno: "}.
{"Middle Name", "Prostřední jméno: "}.
{"Family Name", "Příjmení: "}.
{"Nickname", "Přezdívka: "}.
{"Birthday", "Datum narození: "}.
{"Country", "Země: "}.
{"City", "Město: "}.
{"Organization Name", "Název firmy: "}.
{"Organization Unit", "Oddělení: "}.
% mod_muc/mod_muc.erl
{"You need an x:data capable client to register nickname",
"K registraci přezdívky potřebujete klienta podporujícího z x:data"}.
{"Nickname Registration at ", "Registrace prezdívky na "}.
{"Enter nickname you want to register", "Zadajte prezdívku, kterou chete zaregistrovat"}.
{"Only service administrators are allowed to send service messages",
"Pouze správci služby mají povolené odesílání servisních zpráv"}.
{"Conference room does not exist", "Konferenční místnost neexistuje"}.
{"Access denied by service policy", "Přístup byl zamítnutý nastavením služby"}.
{"Specified nickname is already registered", "Zadaná prezdívka je již registrována"}.
% mod_muc/mod_muc_room.erl
{" has set the subject to: ", "změnil(a) téma na: "}.
{"You need an x:data capable client to configure room",
"Ke konfiguraci místnosti potřebujete klienta podporujícího z x:data"}.
{"Configuration for ", "Konfigurace pre "}.
{"Room title", "Název místnosti"}.
{"Password", "Heslo"}.
{"Only moderators and participants are allowed to change subject in this room",
"Jen moderátoři a účastníci mají povoleno měnit téma této místnosti"}.
{"Only moderators are allowed to change subject in this room",
"Jen moderátoři mají povoleno měnit téma místnosti"}.
{"Visitors are not allowed to send messages to all occupants",
"Návštevníci nemají povoleno zsílat zprávy všem přihlášeným do konference"}.
{"Only occupants are allowed to send messages to the conference",
"Jen členové mají povolené zasílat správy do konference"}.
{"It is not allowed to send normal messages to the conference",
"Není povoleno odesílat normální zprávy do konference"}.
{"It is not allowed to send private messages to the conference",
"Není povoleno odesílat soukromé zprávy do konference"}.
{"Improper message type", "Nesprávný typ zprávy"}.
{"Nickname is already in use by another occupant", "Prezdívka je již používána jiným členem"}.
{"Nickname is registered by another person", "Prezdívka je registrována jinou osobou"}.
{"It is not allowed to send private messages of type \"groupchat\"",
"Není dovoleno odeslání soukromé zprávy typu \"Skupinová zpráva\" "}.
{"Recipient is not in the conference room", "Příjemce se nenachází v konferenční místnosti"}.
{"Only occupants are allowed to send queries to the conference",
"Jen členové mohou odesílat požadavky (query) do konference"}.
{"Queries to the conference members are not allowed in this room",
"Požadavky (queries) na členy konference nejsou v této místnosti povolené"}.
{"You have been banned from this room", "Byl jste vyloučen z této místnosti"}.
{"Membership required to enter this room", "Pro vstup do místnosti musíte být členem"}.
{"Password required to enter this room", "Pro vstup do místnosti musíte zadat heslo"}.
{"Incorrect password", "Nesprávne heslo"}.
{"Administrator privileges required", "Jsou potřebná práva administrátora"}.
{"Moderator privileges required", "Jsou potřebná práva moderátora"}.
{"JID ~s is invalid", "JID ~s je neplatné"}.
{"Nickname ~s does not exist in the room", "Prezdívka ~s v místnosti neexistuje"}.
{"Invalid affiliation: ~s", "Neplatné přiřazení: ~s"}.
{"Invalid role: ~s", "Neplatná role: ~s"}.
{"Owner privileges required", "Jsou vyžadována práva vlastníka"}.
{"private, ", "soukromá, "}.
{"Present real JIDs to", "Zjisti skutečné JIDy pro"}.
{"moderators only", "pouze pro moderátory"}.
{"anyone", "každý"}.
% mod_irc/mod_irc.erl
{"You need an x:data capable client to configure mod_irc settings",
"Pro konfiguraci mod_irc potřebujete klienta podporujícího x:data"}.
{"Registration in mod_irc for ", "Registrace do mod_irc na "}.
{"Enter username and encodings you wish to use for connecting to IRC servers",
"Vložte jméno uživatele a kódování, které chcete používat při připojení na IRC server"}.
{"IRC Username", "IRC prezdívka"}.
{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].",
"Příklad: [{\"irc.freenode.net\",\"utf-8\"}, {\irc.freenode.net\", \"iso8859-2\"}]."}.
{"Encodings", "Kódování"}.
% web/ejabberd_web_admin.erl
{"Users", "Uživatelé"}.
{"Nodes", "Uzly"}.
{"Statistics", "Statistiky"}.
{"Submitted", "Odeslané"}.
{"CPU Time:", "Čas procesoru"}.
{"Delete Selected", "Smazat vybrané"}.
{"Submit", "Odeslat"}.
{"~s access rule configuration", "~s konfigurace pravidla přístupu"}.
{"Node not found", "Uzel nenalezen"}.
{"Add New", "Přidat nový"}.
{"Change Password", "Změnit heslo"}.
{"Connected Resources:", "Připojené zdroje:"}.
{"Password:", "Heslo:"}.
{"None", "Nic"}.
{"Node ", "Uzel "}.
{"Restart", "Restart"}.
{"Stop", "Stop"}.
{"Name", "Jméno"}.
{"Storage Type", "Typ úložiště"}.
{"Size", "Velikost"}.
{"Memory", "Paměť"}.
{"OK", "OK"}.
{"Listened Ports at ", "Otevřené porty na "}.
{"Port", "Port"}.
{"Module", "Modul"}.
{"Options", "Nastavení"}.
{"Update", "Aktualizovat"}.
{"Delete", "Smazat"}.
{"Add User", "Přidat uživatele"}.
{"Last Activity", "Poslední aktivita"}.
{"Never", "Nikdy"}.
{"Time", "Čas"}.
{"From", "Od"}.
{"To", "Pro"}.
{"Packet", "Paket"}.
{"Roster", "Seznam kontaktů"}.
{"Nickname", "Prezdívka"}.
{"Subscription", "Přihlášení"}.
{"Pending", "Čekající"}.
{"Groups", "Skupiny"}.
{"Remove", "Odstranit"}.
{"User ", "Uživatel "}.
{"Roster of ", "Seznam kontaktů "}.
{"Shared Roster", "Sdílený seznam kontaktů"}.
{"Online", "Online"}.
{"Validate", "Ověřit"}.
{"Name:", "Jméno:"}.
{"Description:", "Popis:"}.
{"Members:", "Členové:"}.
{"Displayed Groups:", "Zobrazené skupiny:"}.
{"Group ", "Skupina "}.
{"Period: ", "Čas:"}.
{"Last month", "Poslední měsíc"}.
{"Last year", "Poslední rok"}.
{"All activity", "Všechny aktivity"}.
{"Show Ordinary Table", "Zobrazit bežnou tabulku"}.
{"Show Integral Table", "Zobrazit kompletní tabulku"}.
{"Start", "Start"}.
{"Modules at ", "Moduly na "}.
{"Virtual Hosts", "Virtuální servery"}.
{"ejabberd virtual hosts", "Ejabberd virtuální servery"}.
{"Host", "Server"}.
{"ejabberd Web Interface", "Ejabberd Web rozhraní"}.
% mod_vcard_odbc.erl
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)",
"Pro vyhledání Jabber uživatele vyplňte formulář (přidejte znak * na konec, pro vyhledání podřetězce)"}.
% ejabberd_c2s.erl
{"Use of STARTTLS required", "Je vyžadováno STARTTLS."}.
{"Replaced by new connection", "Nahrazeno novým spojením"}.
% mod_pubsub/mod_pubsub.erl
{[], " "}.
{"Node Creator", "Majitel uzlu"}.
{"Deliver payloads with event notifications", "Doručovat náklad s upozorněním na událost"}.
{"Notify subscribers when the node configuration changes", "Upozornit členy na změnu nastavení uzlu"}.
{"Notify subscribers when the node is deleted", "Upozornit členy na smazaní uzlu"}.
{"Notify subscribers when items are removed from the node", "Upozornit členy na odstranění položek z uzlu"}.
{"Persist items to storage", "Uložit položky natrvalo do úložiště"}.
{"Max # of items to persist", "Maximální počet položek, které je možné natrvalo uložit"}.
{"Whether to allow subscriptions", "Povolit přihlašování"}.
{"Specify the subscriber model", "Specifikovat přihlašovací model"}.
{"Specify the publisher model", "Specifikovat model pro publikování"}.
{"Max payload size in bytes", "Maximální náklad v bajtech"}.
{"Send items to new subscribers", "Odeslat položky novým uživatelům"}.
{"Only deliver notifications to available users", "Doručovat upozornení jen aktuálně přihlášeným uživatelům"}.
{"Specify the current subscription approver", "Zadat současného schvalovatele přihlášení "}.
% mod_irc/mod_irc.erl
{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.",
"Pokud chcete zadat jiné kódování pro IRC servery, vyplňte seznam s hodnotami ve formátě '{\"irc server\",\"encoding\"}'. Předvolené kódování pro tuto službu je \"~s\"."}.
% mod_muc/mod_muc.erl
{"Room creation is denied by service policy", "Vytváranie miestnosti nie je povolené"}.
% /usr/home/src/ejabberd/ejabberd/src/mod_vcard_odbc.erl
{"Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin",
"Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin"}.
{"Email", "E-mail"}.
{"ejabberd vCard module\nCopyright (c) 2003-2006 Alexey Shchepin",
"Ejabberd vCard modul\nCopyright (c) 2003-2006 Alexey Shchepin"}.
{"Search Results for ", "Hledat výsledky pro "}.
{"Jabber ID", "Jabber ID"}.
% /usr/home/src/ejabberd/ejabberd/src/mod_adhoc.erl
{"Commands", "Příkazy"}.
{"Ping", "Ping"}.
{"Pong", "Pong"}.
% /usr/home/src/ejabberd/ejabberd/src/ejabberd_c2s.erl
{"Replaced by new connection", "Nahrazeno novým spojením"}.
% /usr/home/src/ejabberd/ejabberd/src/mod_announce.erl
{"Really delete message of the day?", "Skutečně smazat správu dne?"}.
{"Subject", "Předmět"}.
{"Message body", "Tělo zprávy"}.
{"No body provided for announce message", "Zpráva neobsahuje text"}.
{"Announcements", "Oznámení"}.
{"Send announcement to all users", "Odeslat seznam všech uživatelů"}.
{"Send announcement to all online users", "Odeslat seznam všech online uživatelů"}.
{"Send announcement to all online users on all hosts", "Odeslat seznam všech online uživatelů na všech serverech"}.
{"Set message of the day and send to online users", "Nastavit zprávu dne a odeslat jí online uživatelům"}.
{"Update message of the day (don't send)", "Aktualizovat zprávu dne (neodesíelat)"}.
{"Delete message of the day", "Smazat zprávu dne"}.
% /usr/home/src/ejabberd/ejabberd/src/mod_configure.erl
{"Database", "Databáze"}.
{"Outgoing s2s Connections", "Odchozí s2s spojení"}.
{"Import Users From jabberd 1.4 Spool Files", "Importovat uživatelů z jabber 1.4 spool souborů"}.
{"Database Tables Configuration at ", "Konfigurace databázových tabulek "}.
% /usr/home/src/ejabberd/ejabberd/src/mod_pubsub/mod_pubsub.erl
{"ejabberd pub/sub module\nCopyright (c) 2003-2006 Alexey Shchepin",
"ejabberd pub/sub modul\nCopyright (c) 2003-2006 Alexey Shchepin"}.
% /usr/home/src/ejabberd/ejabberd/src/web/ejabberd_web_admin.erl
{"ejabberd Web Interface", "Ejabberd Web rozhraní"}.
{"Administration", "Administrace"}.
{"ejabberd (c) 2002-2006 Alexey Shchepin, 2004-2006 Process One",
"Ejabberd (c) 2002-2006 Alexey Shchepin, 2004-2006 Process One"}.
{"(Raw)", "(Zdroj)"}.
{"Bad format", "Nesprávný formát"}.
{"Raw", "Zdroj"}.
{"Users Last Activity", "Poslední aktivita uživatele"}.
{"Registered Users", "Registrovaní uživatelé"}.
{"Offline Messages", "Offline zprávy"}.
{"Registered Users:", "Registrovaní živatelé:"}.
{"Authenticated Users:", "Ověření uživatelé:"}.
{"Online Users:", "Online uživatelé:"}.
{"Outgoing s2s Connections:", "Odchozí s2s spojení:"}.
{"Outgoing s2s Servers:", "Odchozí s2s servery:"}.
{"Offline Messages:", "Offline zprávy"}.
{"~s's Offline Messages Queue", "~s Offline zpráv"}.
{"Add Jabber ID", "Přidat JID"}.
{"No Data", "Žádná data"}.
{"Listened Ports", "Otevřené porty"}.
{"RPC Call Error", "Chyba RPC volání"}.
{"Database Tables at ", "Databázové tabulky na "}.
{"Backup of ", "Záloha na "}.
{"Remark that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.",
"Podotýkáme, že tato nastavení budou zálohované do zabudované databáze Mnesia. Pokud používáte ODBC modul, musíte zálohovat vaší SQL databázi separátně."}.
{"Store binary backup:", "Uložit binární zálohu:"}.
{"Restore binary backup immediately:", "Okamžitě obnovit binární zálohu:"}.
{"Restore binary backup after next ejabberd restart (requires less memory):",
"Obnovit binární zálohu při následujícím restartu Ejabberd (vyžaduje méně paměti)"}.
{"Store plain text backup:", "Uložit zálohu do textového souboru:"}.
{"Restore plain text backup immediately:", "Okamžitě obnovit zálohu z textového souboru:"}.
{"Statistics of ~p", "Statistiky ~p"}.
{"Uptime:", "Čas běhu"}.
{"Transactions Commited:", "Transakce potvrzena"}.
{"Transactions Aborted:", "Transakce zrušena"}.
{"Transactions Restarted:", "Transakce restartována"}.
{"Transactions Logged:", "Transakce zaznamenána"}.
{"Update ", "Aktualizovat "}.
{"Update plan", "Aktualizovat plán"}.
{"Updated modules", "Aktualizované moduly"}.
{"Update script", "Aktualizované skripty"}.
{"Low level update script", "Nízkoúrovňový aktualizační skript"}.
{"Script check", "Kontrola skriptu"}.
{"Not Found", "Nenalezeno"}.
{"Shared Roster Groups", "Skupiny pro zdílený seznam kontaktů"}.
% /usr/home/src/ejabberd/ejabberd/src/mod_irc/mod_irc.erl
{"ejabberd IRC module\nCopyright (c) 2003-2006 Alexey Shchepin", "Ejabberd IRC modul\nCopyright (c) 2003-2006 Alexey Shchepin"}.
% /usr/home/src/ejabberd/ejabberd/src/mod_muc/mod_muc_log.erl
{"Chatroom configuration modified", "Nastavení diskuzní místnosti bylo změněno"}.
{"joins the room", "vstoupil(a) do místnosti"}.
{"leaves the room", "opustil(a) místnost"}.
{"has been kicked", "byl(a) vyhozen(á) z místnosti"}.
{"has been banned", "byl(a) zablokován(a)"}.
{"is now known as", "se přejmenoval(a) na"}.
{"Monday", "Pondělí"}.
{"Tuesday", "Úterý"}.
{"Wednesday", "Středa"}.
{"Thursday", "Čtvrtek"}.
{"Friday", "Pátek"}.
{"Saturday", "Sobota"}.
{"Sunday", "Neděle"}.
{"January", "Leden"}.
{"February", "Únor"}.
{"March", "Březen"}.
{"April", "Duben"}.
{"May", "Květen"}.
{"June", "Červen"}.
{"July", "Červenec"}.
{"August", "Srpen"}.
{"September", "Září"}.
{"October", "říjen"}.
{"November", "Listopad"}.
{"December", "Prosinec"}.
{"Room Configuration", "Nastavení místnosti"}.
% /usr/home/src/ejabberd/ejabberd/src/mod_muc/mod_muc.erl
{"You must fill in field \"Nickname\" in the form",
"Musíte vyplnit políčko \"Prezdívka\" ve formuláři"}.
{"ejabberd MUC module\nCopyright (c) 2003-2006 Alexey Shchepin",
"Ejabberd MUC modul\nCopyright (c) 2003-2006 Alexey Shchepin"}.
% /usr/home/src/ejabberd/ejabberd/src/mod_muc/mod_muc_room.erl
{"This room is not anonymous", "Tato místnost není anonymní"}.
{"Make room persistent", "Nastavit místnost jako stálou"}.
{"Make room public searchable", "Nastavit místnost jako veřejně prohldávatelnou"}.
{"Make participants list public", "Nastavit seznam účastníků jako veřejný"}.
{"Make room password protected", "Chránit místnost heslem"}.
{"Make room members-only", "Nastavit místnost jen pro členy"}.
{"Make room moderated", "Nastavit místnost jako moderovanou"}.
{"Default users as participants", "Uživatelé jsou implicitně členy"}.
{"Allow users to change subject", "Povolit uživatelům měnit téma této místnosti"}.
{"Allow users to send private messages", "Povolit uživatelům odesíelat soukromé zprávy"}.
{"Allow users to query other users", "Povolit uživatelům odesíela požadavky (query) ostatním uživatelům"}.
{"Allow users to send invites", "povolit uživatelům posíelání pozvánek"}.
{"Enable logging", "Zapnout ukládání historie"}.
{"Description", "Popis"}.
{"Number of occupants", "Počet účastníků"}.
% Local Variables:
% mode: erlang
% End:
+3 -4
View File
@@ -236,9 +236,6 @@
{"Group ", "Gruppe "}.
{"ejabberd Web Interface", "ejabberd Web Interface"}.
% mod_vcard_ldap.erl
{"Given Name", "Vorname"}.
% ejabberd_c2s.erl
{"Use of STARTTLS required", "Verwendung von STARTTLS erforderlich"}.
{"Replaced by new connection", "Durch neue Verbindung ersetzt"}.
@@ -352,7 +349,6 @@
{"Make room public searchable", "Raum öffentlich durchsuchbar machen"}.
{"Make participants list public", "Teilnehmerliste öffentlich machen"}.
{"Make room password protected", "Raum passwortgeschützt machen"}.
{"Make room semianonymous", "Raum semi-anonym machen"}.
{"Make room members-only", "Raum members-only machen"}.
{"Make room moderated", "Raum modieriert machen"}.
{"Default users as participants", "Standartbenutzer als Teilnehmer"}.
@@ -363,6 +359,9 @@
{"Enable logging", "Log-Funktion aktivieren"}.
{"Description", "Beschreibung"}.
{"Number of occupants", "Anzahl der Teilnehmer"}.
{"Present real JIDs to", "Echte Jabber IDs anzeigen für"}.
{"moderators only", "nur Moderatoren"}.
{"anyone", "jeden"}.
% Local Variables:
% mode: erlang
+4 -3
View File
@@ -135,7 +135,7 @@
{"Make participants list public", "La lista de participantes es pública"}.
{"Make room persistent", "Sala permanente"}.
{"Make room moderated", "Sala moderada"}.
{"Default users as participants", "Los usuarios on participantes por defecto"}.
{"Default users as participants", "Los usuarios son participantes por defecto"}.
{"Make room members-only", "Sala sólo para miembros"}.
{"Allow users to send invites", "Permitir a los usuarios enviar invitaciones"}.
{"Make room password protected", "Proteger la sala con contraseña"}.
@@ -167,9 +167,11 @@
{"Invalid role: ~s", "Rol no válido: ~s"}.
{"Owner privileges required", "Se requieren privilegios de propietario de la sala"}.
{"private, ", "privado"}.
{"Make room semianonymous", "Hacer la sala semianónima"}.
{"Description", "Descripción"}.
{"Number of occupants", "Número de ocupantes"}.
{"Present real JIDs to", "Los JID reales pueden verlos"}.
{"moderators only", "solo moderadores"}.
{"anyone", "cualquiera"}.
% mod_muc/mod_muc_log.erl
{"Chatroom configuration modified", "Configuración de la sala modificada"}.
@@ -320,7 +322,6 @@
{"Replaced by new connection", "Reemplazado por una nueva conexión"}.
% mod_vcard_ldap.erl
{"Given Name", "Nombre dado"}.
{"Fill in fields to search for any matching Jabber User", "Rellena campos para buscar usuarios Jabber que concuerden"}.
% mod_adhoc.erl
+3 -2
View File
@@ -74,7 +74,6 @@
% src/mod_vcard_ldap.erl
{"Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin", "Serveur Jabber Erlang\nCopyright (c) 2002-2006 Alexey Shchepin"}.
{"Given Name", "Prénom"}.
{"ejabberd vCard module\nCopyright (c) 2003-2006 Alexey Shchepin", "Module vCard ejabberd\nCopyright (c) 2003-2006 Alexey Shchepin"}.
{"Email", "Email"}.
{"Search Results for ", "Résultats de recherche pour "}.
@@ -213,7 +212,6 @@
{"Make room public searchable", "Rendre le salon public"}.
{"Make participants list public", "Rendre la liste des participants publique"}.
{"Make room password protected", "Protéger le salon par mot de passe"}.
{"Make room semianonymous", "Rendre le salon semi-anonyme"}.
{"Make room members-only", "Réserver le salon aux membres uniquement"}.
{"Make room moderated", "Rendre le salon modéré"}.
{"Default users as participants", "Les utilisateurs sont par défaut participant"}.
@@ -224,6 +222,9 @@
{"Enable logging", "Activer l'archivage"}.
{"Description", "Description"}.
{"Number of occupants", "Nombre d'occupants"}.
{"Present real JIDs to", "Rendre le JID réel visible pour"}.
{"moderators only", "modérateurs seulement"}.
{"anyone", "tout le monde"}.
% mod_irc/mod_irc.erl
{"ejabberd IRC module\nCopyright (c) 2003-2006 Alexey Shchepin", "Module IRC ejabberd\nCopyright (c) 2003-2006 Alexey Shchepin"}.
+3 -2
View File
@@ -7,7 +7,6 @@
{"Fill in fields to search for any matching Jabber User", "Vul de velden in om te zoeken naar Jabber-gebruikers op deze server"}.
{"User", "Gebruiker"}.
{"Full Name", "Volledige naam"}.
{"Given Name", "Voornaam"}.
{"Middle Name", "Tussennaam"}.
{"Family Name", "Achternaam"}.
{"Nickname", "Bijnaam"}.
@@ -168,7 +167,6 @@
{"Make room public searchable", "Chatruimte doorzoekbaar maken"}.
{"Make participants list public", "Deelnemerslijst publiek maken"}.
{"Make room password protected", "Chatruimte beveiligen met een wachtwoord"}.
{"Make room semianonymous", "Chatruimte gedeeltelijk anoniem maken"}.
{"Make room members-only", "Chatruimte enkel toegankelijk maken voor leden"}.
{"Make room moderated", "Chatruimte gemodereerd maken"}.
{"Default users as participants", "Gebruikers standaard instellen als deelnemers"}.
@@ -180,6 +178,9 @@
{"You need an x:data capable client to configure room", "U hebt een client nodig die x:data ondersteunt om deze chatruimte in te stellen"}.
{"Description", "Beschrijving"}.
{"Number of occupants", "Aantal aanwezigen"}.
{"Present real JIDs to", "Jabber ID's kunnen achterhaald worden door"}.
{"moderators only", "moderators"}.
{"anyone", "iedereen"}.
% mod_irc/mod_irc.erl
{"ejabberd IRC module\nCopyright (c) 2003-2006 Alexey Shchepin", "ejabberd's IRC-module\nCopyright (c) 2003-2006 Alexey Shchepin"}.
+54 -92
View File
@@ -43,7 +43,6 @@
{"Configuration", "Konfiguracja"}.
{"Online Users", "Użytkownicy zalogowani"}.
{"All Users", "Wszyscy użytkownicy"}.
{"Outgoing S2S connections", "Wychodzące połączenia S2S"}.
{"To ~s", "Do ~s"}.
{"From ~s", "Z ~s"}.
{"Running Nodes", "Uruchomione gałęzie"}.
@@ -52,12 +51,10 @@
{"Access Control Lists", "Lista dostępowa"}.
{"Access Rules", "Zasady dostępu"}.
{"Remove Users", "Usuń użytkowników"}.
{"DB", "DB"}.
{"Modules", "Moduły"}.
{"Start Modules", "Uruchom moduły"}.
{"Stop Modules", "Zatrzymaj moduły"}.
{"Backup Management", "Zarządzanie kopiami zapasowymi"}.
{"Import users from jabberd1.4 spool files", "Importowanie użytkowników z plikow spoool serwera jabberd1.4"}.
{"Backup", "Tworzenie kopii"}.
{"Restore", "Odtwarzanie kopii"}.
{"Dump to Text File", "Zrzucanie do pliku tekstowego"}.
@@ -74,7 +71,6 @@
{"Search users in ", "Wyszukaj użytkowników w "}.
{"Fill in fields to search for any matching Jabber User",
"Wypełnij pola aby znaleźdź pasujących użytkowników Jabbera"}.
{"Results of search in ", "Wyniki wyszukiwania w "}.
{"User", "Użytkownik: "}.
{"Full Name", "Pełna nazwa: "}.
@@ -85,7 +81,6 @@
{"Birthday", "Data urodzenia: "}.
{"Country", "Państwo: "}.
{"City", "Miasto: "}.
{"email", "E-Mail: "}.
{"Organization Name", "Nazwa organizacji: "}.
{"Organization Unit", "Dział: "}.
@@ -98,7 +93,6 @@
"Jedynie administrator może wysyłać wiadomości serwisowe"}.
{"Conference room does not exist", "Pokój konferencyjny nie istnieje"}.
{"Access denied by service policy", "Dostęp zabroniony przez zabezpieczenia serwera"}.
{"You must fill in field \"nick\" in the form", "Musisz wypełnić pole \"nick\" w formularzu"}.
{"Specified nickname is already registered", "Podany nick jest już zarejestrowany"}.
% mod_muc/mod_muc_room.erl
@@ -107,25 +101,7 @@
"Potrzebujesz klienta kompatybilnego z x:data aby skonfigurować pokój"}.
{"Configuration for ", "Konfiguracja dla "}.
{"Room title", "Tytuł pokoju"}.
{"Allow users to change subject?", "Zezwolić użytkownikom na zmianę tematu?"}.
{"Allow users to query other users?",
"Zezwolić użytkownikom na zapraszanie innych użytkowników?"}.
{"Allow users to send private messages?",
"Zezwolić użytkownikom na wysyłanie prywatnych wiadomości?"}.
{"Make room public searchable?", "Uczynić pokój wyszukiwalnym publicznie?"}.
{"Make participants list public?", "Uczynic obecnych wyszukiwalnymi publicznie?"}.
{"Make room persistent?", "Uczynić pokój trwałym?"}.
{"Make room moderated?", "Uczynić pokój moderowanym?"}.
{"Default users as members?",
"Domyślni użytkownicy jako członkowie?"}.
{"Make room members only?",
"Uczynić pokój tylko dla członków?"}.
{"Allow users to send invites?",
"Pozwolić użytkownikom na wysyłanie zaproszeń?"}.
{"Make room password protected?", "Czy zabezpieczyć pokój hasłem?"}.
{"Password", "Hasło"}.
{"Make room anonymous?", "Uczynić pokój anonimowym?"}.
{"Enable logging?", "Włączyć logowanie?"}.
{"Only moderators and participants are allowed to change subject in this room",
"Tylko moderatorzy i wlasciciele mogą zmienić temat tego pokoju"}.
{"Only moderators are allowed to change subject in this room",
@@ -160,6 +136,10 @@
{"Invalid role: ~s", "Nieprawidłowa rola: ~s"}.
{"Owner privileges required", "Wymagane uprawnienia właściciela "}.
{"private, ", "prywatny, "}.
{"Present real JIDs to", "Kto może widzieć prawdziwe JID-y?"}.
{"moderators only", "tylko moderatorzy"}.
{"anyone", "wszyscy"}.
% mod_irc/mod_irc.erl
{"You need an x:data capable client to configure mod_irc settings",
@@ -173,91 +153,55 @@
{"Encodings", "Kodowania"}.
% web/ejabberd_web_admin.erl
{"ejabberd administration", "Administracja serwerem Ejabberd"}.
{"Users", "Użytkownicy"}.
{"Nodes", "Gałęzie"}.
{"Statistics", "Statystyki"}.
{"(raw)", "(raw)"}.
{"submitted", "przesłane"}.
{"bad format", "zły format"}.
{"raw", "raw"}.
{"ejabberd access control lists configuration", "Lista konfiguracyjna dostępu do serwera EJabberd"}.
{"Delete Selected", "Usuń zaznaczone"}.
{"Submit", "Wprowadź"}.
{"ejabberd access rules configuration", "Konfiguracja zasad dostępu do serwera EJabberd"}.
{"~s access rule configuration", "~s konfiguracja zasad dostępu"}.
{"ejabberd users", "Użytkownicy EJabberd"}.
{"ejabberd stats", "Statystyki EJabberd"}.
{"Node not found", "Gałąź nie znaleziona"}.
{"Add New", "Dodaj nowe"}.
{"Registered users", "Zarejestrowani użytkownicy"}.
{"Online users", "Użytkownicy online"}.
{"Outgoing S2S servers", "Sewery zewnętrzne S2S"}.
{"Change Password", "Zmień hasło"}.
{"Connected Resources:", "Zasoby podłączone"}.
{"Password:", "Hasło:"}.
{"None", "Brak"}.
{"Node ", "Gałąź "}.
{"DB Management", "Zarządzanie bazą danych"}.
{"Listened Ports Management", "Zarządzanie portami nasłuchującymi"}.
{"Restart", "Restart"}.
{"Stop", "Stop"}.
{"RPC call error", "Błąd RPC"}.
{"DB Tables at ", "Tabele bazy danych "}.
{"Name", "Nazwa"}.
{"Storage Type", "Typ bazy"}.
{"Size", "Wielkość"}.
{"Memory", "Pamięć"}.
{"Backup Management at ", "Zarządzanie kopiami zapasowymi "}.
{"Store a backup in a file", "Zachowaj kopie zapasowa w pliku "}.
{"OK", "OK"}.
{"Restore a backup from a file", "Odtwórz kopię zapasową z pliku"}.
{"Install a database fallback from a file", "Przywróć zapisaną kopię z pliku"}.
{"Dump a database in a text file", "Zrzuć bazę danych do pliku tekstowego"}.
{"Restore a database from a text file", "Odtwórz bazę danych z pliku tekstowego"}.
{"Listened Ports at ", "Porty nasłuchujące "}.
{"~p statistics", "~p statystyka"}.
{"Uptime", "Uptime"}.
{"CPU Time", "Czas procesora"}.
{"Transactions commited", "Tarnsakcje rozpoczęte"}.
{"Transactions aborted", "Transakcje anulowane"}.
{"Transactions restarted", "Transakcje zrestartowane"}.
{"Transactions logged", "Transakcje logowane"}.
{"Port", "Port"}.
{"Module", "Moduł"}.
{"Options", "Opcje"}.
{"Update", "Aktualizacja"}.
{"Delete", "Usuń"}.
{"Add User", "Dodaj użytkownika"}.
{"Offline messages", "Wiadomości offline"}.
{"Last Activity", "Ostatnia aktywność"}.
{"Never", "Nigdy"}.
{"~s offline messages queue", "~s wiadomości offline w kolejce"}.
{"Time", "Czas"}.
{"From", "Od"}.
{"To", "Do"}.
{"Packet", "Pakiet "}.
{"Offline messages:", "Wiadomości offline: "}.
{"Roster", "Roster "}.
{"Nickname", "Nick "}.
{"Subscription", "Subskrypcja "}.
{"Pending", "Oczekiwanie "}.
{"Groups", "Grupy "}.
{"Remove", "Usuń "}.
{"Add JID", "Dodaj JID "}.
{"User ", "Użytkownik "}.
{"Roster of ", "Roster "}.
{"Shared Roster", "Roster współdzielony"}.
{"Online", "Dostępny"}.
{"Validate", "Zatwierdź"}.
{"Not found", "Nie znaleziony"}.
{"Shared roster groups", "Grupy rosterów współdzielonych"}.
{"Name:", "Nazwa:"}.
{"Description:", "Opis:"}.
{"Members:", "Członkowie:"}.
{"Displayed Groups:", "Wyświetlane grupy:"}.
{"Group ", "Grupa "}.
{"Users last activity", "Ostatnia aktywność użytkowników"}.
{"Period: ", "Przedział czasu "}.
{"Last month", "Ostatni miesiąc"}.
{"Last year", "Ostatni rok"}.
@@ -265,35 +209,23 @@
{"Show Ordinary Table", "Pokaż zwykłą tabelę"}.
{"Show Integral Table", "Pokaż tabelę całkowitą"}.
{"Start", "Start"}.
{"Modules Management", "Zarządzanie modułami"}.
{"Modules at ", "Moduły na "}.
{"No data", "Brak danych"}.
{"Virtual Hosts", "Wirtualne hosty"}.
{"ejabberd virtual hosts", "wirtualne hosty ejabberda"}.
{"Host", "Host"}.
{"ejabberd Web Interface", ""}.
% mod_vcard_odbc.erl
{"Erlang Jabber Server\nCopyright (c) 2002-2005 Alexey Shchepin", "Erlang Jabber Server\nCopyright (c) 2002-2005 Alexey Shchepin"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)", "Wypełnij formularz aby wyszukać pasujących użytkowników Jabbera (dodaj * na koniec pola aby dopasować)"}.
{"ejabberd vCard module\nCopyright (c) 2003-2005 Alexey Shchepin", "ejabberd vCard module\nCopyright (c) 2003-2005 Alexey Shchepin"}.
{"JID", "JID"}.
% ejabberd_c2s.erl
{"Use of STARTTLS required", "Wymagane użycie STARTTLS"}.
{"Replaced by new connection", ""}.
% mod_configure.erl
{"DB Tables Configuration at ", "Konfiguracja tabel bazy dla "}.
% mod_vcard_ldap.erl
{"Given Name", "Nadana nazwa"}.
% mod_pubsub/mod_pubsub.erl
{"ejabberd pub/sub module\nCopyright (c) 2003-2005 Alexey Shchepin", "ejabberd pub/sub module\nCopyright (c) 2003-2005 Alexey Shchepin"}.
{[], " "}.
{"Node Creator", "Tworzenie gałęzi"}.
{"Deliver payloads with event notifications", "Do?cz zawarto? publikowanego przedmiotu podczas wysy?nia powiadomienia o publikacji"}.
{"Deliver payloads with event notifications", "Dołącz zawartość publikowanego przedmiotu podczas wysyłania powiadomienia o publikacji"}.
{"Notify subscribers when the node configuration changes", "Informuj subskrybentów gdy konfiguracja gałęzi się zmieni"}.
{"Notify subscribers when the node is deleted", "Informuj subskrybentów gdy gałąż zostanie wykasowana"}.
{"Notify subscribers when items are removed from the node", "Informuj subskrybentów kiedy zostaną z gałęzi usunięte jakieś elementy"}.
@@ -302,36 +234,23 @@
{"Whether to allow subscriptions", "Czy pozwolić na subskrypcje"}.
{"Specify the subscriber model", "Oznacz model subskrybenta"}.
{"Specify the publisher model", "Oznacz model publikującego"}.
{"Max payload size in bytes", "Maksymalna wielko? powiadomienia w bajtach"}.
{"Max payload size in bytes", "Maksymalna wielkość powiadomienia w bajtach"}.
{"Send items to new subscribers", "Wysyłaj rzeczy do nowych subskrybentów"}.
{"Only deliver notifications to available users", "Dostarczaj notyfikacje tylko do osiągalnych użytkowników"}.
{"Specify the current subscription approver", "Wyznacz aprobującego obecne subskrypcje "}.
% web/ejabberd_web_admin.erl
{"ejabberd (c) 2002-2005 Alexey Shchepin, 2004-2005 Process One", "ejabberd (c) 2002-2005 Alexey Shchepin, 2004-2005 Process One"}.
{"(raw)", "(raw)"}.
{"raw", "raw"}.
{"Authenticated users", "Użytkownicy zautoryzowani"}.
% mod_irc/mod_irc.erl
{"ejabberd IRC module\nCopyright (c) 2003-2005 Alexey Shchepin", "ejabberd IRC module\nCopyright (c) 2003-2005 Alexey Shchepin"}.
{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.", "Jeśli chcesz ustawić inne kodowanie dla serwerów IRC, wypełnij tą listę wartościami w formacie '{\"irc server\",\"encoding\"}'. Jako domyślne ten serwis używa kodowania \"~s\"."}.
% mod_muc/mod_muc.erl
{"Room creation is denied by service policy", "Tworzenie pokoju jest zabronione przez polisę"}.
{"ejabberd MUC module\nCopyright (c) 2003-2005 Alexey Shchepin", "ejabberd MUC module\nCopyright (c) 2003-2005 Alexey Shchepin"}.
% Local Variables:
% mode: erlang
% End:
% /usr/home/src/ejabberd/ejabberd/src/mod_vcard_odbc.erl
{"Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin", ""}.
{"Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin", "Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin"}.
{"Email", ""}.
{"ejabberd vCard module\nCopyright (c) 2003-2006 Alexey Shchepin", ""}.
{"ejabberd vCard module\nCopyright (c) 2003-2006 Alexey Shchepin", "Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin"}.
{"Search Results for ", "Wyniki wyszukiwania dla "}.
{"Jabber ID", ""}.
{"Jabber ID", "Jabber ID"}.
% /usr/home/src/ejabberd/ejabberd/src/mod_adhoc.erl
{"Commands", "Polecenia"}.
@@ -450,8 +369,7 @@
{"Make room public searchable", "Pozwól wyszukiwać pokój"}.
{"Make participants list public", "Upublicznij listę uczestników"}.
{"Make room password protected", "Zabezpiecz pokój hasłem"}.
{"Make room semianonymous", "Utwórz pokój pół-nieznanym"}.
{"Make room members-only", "Utwórz pokój tylko dla członków"}.
{"Make room members-only", "Utwórz pokój tylko dla uczestnikóww"}.
{"Make room moderated", "Moderuj pokój"}.
{"Default users as participants", "Domyślni użytkownicy jako uczestnicy"}.
{"Allow users to change subject", "Pozwól użytkownikom zmienić tytuł pokoju"}.
@@ -461,3 +379,47 @@
{"Enable logging", "Włącz logowanie"}.
{"Description", "Opis"}.
{"Number of occupants", "Liczba uczestników"}.
% mod_vcard_ldap.erl
{"Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin", "Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin"}.
{"ejabberd vCard module\nCopyright (c) 2003-2006 Alexey Shchepin", "ejabberd vCard module\nCopyright (c) 2003-2006 Alexey Shchepin"}.
{"Jabber ID", "Jabber ID"}.
% ./mod_presence.erl
{"You need an x:data capable client to register presence", "Potrzebujesz klinta kompatybilnego z x:data aby zarejestrować widoczność "}.
{"Presence registration at ", "Rejestracja widoczności na "}.
{"What presence features do you want to register?", "Jakie usługi widoczności chcesz zarejestrować?"}.
{"Raw XML", ""}.
{"Specified presence is already registered", "Określona widoczność już jest zarejestrowana"}.
{"You must fill in field \"Xml\" in the form", "Musisz wypełnić w formularzu pole \"XML\""}.
{"You must fill in field \"Icon\" in the form", "Musisz wypełnić w formularzu pole \"Icon\""}.
{"ejabberd presence module\nCopyright (c) 2006 Igor Goryachev", ""}.
% ./mod_presence/mod_presence.erl
{"Raw XML export", "Eksport XML do raw"}.
{"Allow icon export", "Pozwól na eksport ikon"}.
% ./mod_stats2file.erl
{"CPUtime", "Czas procesora"}.
% ./mod_vcard_odbc.erl
{"Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin", ""}.
{"Email", ""}.
{"ejabberd vCard module\nCopyright (c) 2003-2006 Alexey Shchepin", ""}.
{"Jabber ID", ""}.
% ./mod_pubsub/mod_pubsub.erl
{"ejabberd pub/sub module\nCopyright (c) 2003-2006 Alexey Shchepin", ""}.
% ./web/ejabberd_web_admin.erl
{"ejabberd (c) 2002-2006 Alexey Shchepin, 2004-2006 Process One", ""}.
{"(Raw)", ""}.
{"Raw", ""}.
{"Low level update script", "Skrypt aktualizacyjny niskiego poziomu"}.
% ./mod_irc/mod_irc.erl
{"ejabberd IRC module\nCopyright (c) 2003-2006 Alexey Shchepin", ""}.
% ./mod_muc/mod_muc.erl
{"ejabberd MUC module\nCopyright (c) 2003-2006 Alexey Shchepin", ""}.
+6 -67
View File
@@ -47,15 +47,12 @@
{"Backup", "Salvar cópia de segurança"}.
{"Backup Management", "Gestão de copia de segurança"}.
{"Configuration", "Configuração"}.
{"DB", "BD"}.
{"Dump to Text File", "Exportar para arquivo de texto"}.
{"From ~s", "De ~s"}.
{"Import Directory", "Importar diretório"}.
{"Import File", "Importar arquivo"}.
{"Import users from jabberd1.4 spool files", "Importar usuários a partir de arquivos da spool do jabberd1.4"}.
{"Modules", "Módulos"}.
{"Online Users", "Usuários conectados"}.
{"Outgoing S2S connections", "Conexões S2S de saída"}.
{"Remove Users", "Remover usuários"}.
{"Restore", "Restaurar"}.
{"Running Nodes", "Nos em execução"}.
@@ -74,7 +71,6 @@
{"City", "Cidade"}.
{"Country","País"}.
{"ejabberd vCard module\nCopyright (c) 2003-2006 Alexey Shchepin", "Módulo vCard para ejabberd\nCopyright (c) 2002-2006 Alexey Shchepin"}.
{"email", "e-mail"}.
{"Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin", "Servidor Jabber em Erlang\nCopyright (c) 2002-2006 Alexey Shchepin"}.
{"Family Name", "Nome de família"}.
{"Fill in fields to search for any matching Jabber User", "Preencha os campos para procurar usuários Jabber coincidentes"}.
@@ -85,7 +81,6 @@
{"Nickname", "Nick"}.
{"Organization Name", "Nome da organização"}.
{"Organization Unit", "Unidade da organização"}.
{"Results of search in ", "Resultados da busca em "}.
{"Search users in ", "Procurar usuários em "}.
{"User", "Usuário"}.
{"You need an x:data capable client to search", "Necessitas um cliente com suporte de x:data para poder buscar"}.
@@ -110,19 +105,11 @@
{"Whether to allow subscriptions", "Permitir subscrições"}.
% mod_muc/mod_muc.erl
{"Allow users to change subject?", "Permitir aos usuários mudar o tópico?"}.
{"Allow users to query other users?", "Permitir aos usuários consultar outros usuários?"}.
{"Allow users to send invites?", "Permitir que os usuários enviem convites?"}.
{"Allow users to send private messages?", "Permitir que os usuários enviem mensagens privadas?"}.
{"Default users as members?", "Os usuários padrão são membros?"}.
{"Enable logging?", "Salvar históricos?"}.
{"Access denied by service policy", "Aceso denegado por la política do serviço"}.
{"Conference room does not exist", "La sala de conferencias não existe"}.
{"ejabberd MUC module\nCopyright (c) 2003-2006 Alexey Shchepin", "Módulo de MUC para ejabbed\nCopyright (c) 2002-2006 Alexey Shchepin"}.
{"Enter nickname you want to register", "Introduza o apelido que quer registrar"}.
{"Incorrect password", "Senha incorreta"}.
{"Make room anonymous?", "Tornar a sala anônima?"}.
{"Make room password protected?", "Proteger a sala com senha?"}.
{"Nickname is already in use by another occupant", "O apelido já está em uso por outro ocupante"}.
{"Nickname is registered by another person", "O apelido já está registrado por outra pessoa"}.
{"Nickname Registration at ", "Registro do apelido em "}.
@@ -131,18 +118,11 @@
{"Password", "Senha"}.
{"Room creation is denied by service policy", "Se te a denegado criar la sala por política do serviço"}.
{"Specified nickname is already registered", "O apelido especificado já está registrado"}.
{"You must fill in field \"nick\" in the form", "Deve preencher o campo \"apelido\" no formulário"}.
{"You need an x:data capable client to register nickname", "Necessitas um cliente com suporte de x:data para poder registrar o nick"}.
% mod_muc/mod_muc_room.erl
{"Administrator privileges required", "Se necessita privilégios de administrador"}.
{"Allow users to change subject?", "Permitir aos usuários cambiar o assunto"}.
{"Allow users to query other users?", "Permitir aos usuários consultar a outros usuários"}.
{"Allow users to send invites?", "Permitir aos usuários enviar convides"}.
{"Allow users to send private messages?", "Permitir aos usuários enviar mensagens privados"}.
{"Configuration for ", "Configuração para "}.
{"Default users as members?", "Os usuários são membros por defeito"}.
{"Enable logging?", "Guardar históricos"}.
{" has set the subject to: ", " a posto o assunto: "}.
{"Improper message type", "Tipo de mensagem incorreto"}.
{"Incorrect password", "Senha incorreta"}.
@@ -152,13 +132,6 @@
{"It is not allowed to send private messages of type \"groupchat\"", "No está permitido enviar mensagens privados do tipo \"groupchat\""}.
{"It is not allowed to send private messages to the conference", "Impedir o envio de mensagens privados a la sala"}.
{"JID ~s is invalid", "O JID ~s não es válido"}.
{"Make participants list public?", "Fazer pública la lista de participantes"}.
{"Make room anonymous?", "Fazer anônima la sala"}.
{"Make room members only?", "Fazer la sala solo para membros"}.
{"Make room moderated?", "Fazer la sala moderada"}.
{"Make room password protected?", "Proteger la sala com senha"}.
{"Make room persistent?", "Fazer la sala permanente"}.
{"Make room public searchable?", "Fazer a sala publicamente visível"}.
{"Membership required to enter this room", "Necessitas ser membro de esta sala para poder entrar"}.
{"Moderator privileges required", "Se necessita privilégios de moderador"}.
{"Nickname is already in use by another occupant", "O nick já está sendo usado por outro ocupante"}.
@@ -192,91 +165,57 @@
% web/ejabberd_web_admin.erl
{"Add JID", "Adicionar JID"}.
{"Add New", "Adicionar novo"}.
{"Add User", "Adicionar usuário"}.
{"All activity", "Toda la atividade"}.
{"Backup Management at ", "Gestão de copia de segurança em "}.
{"bad format", "mal formato"}.
{"Change Password", "Mudar senha"}.
{"Connected Resources:", "Recursos conectados:"}.
{"CPU Time", "Tempo de processador consumido"}.
{"DB Management", "Gestão do BD"}.
{"DB Tables at ", "Tabelas do BD em "}.
{"Delete", "Eliminar"}.
{"Delete Selected", "Remover os selecionados"}.
{"Dump a database in a text file", "Exportar uma Base de Dados para um arquivo de texto"}.
{"ejabberd access control lists configuration", "Configuração das Listas de Controle de Acesso do ejabberd"}.
{"ejabberd access rules configuration", "Configuração de las Regras de Aceso de ejabberd"}.
{"ejabberd administration", "Administração de ejabberd"}.
{"ejabberd (c) 2002-2006 Alexey Shchepin, 2004-2006 Process One", "ejabberd (c) 2002-2006 Alexey Shchepin, 2004-2006 Process One"}.
{"ejabberd stats", "Estatísticas de ejabberd"}.
{"ejabberd users", "Usuários do ejabberd"}.
{"ejabberd virtual hosts", "Maquinas virtuais de ejabberd"}.
{"From", "De"}.
{"Group ", "Grupo "}.
{"Groups", "Grupos"}.
{"Host", "Máquina"}.
{"Install a database fallback from a file", "Instalar uma recuperação de BD a partir de um arquivo"}.
{"JID", "JID"}.
{"Last Activity", "Última atividade"}.
{"Last month", "Último mês"}.
{"Last year", "Último ano"}.
{"Listened Ports at ", "Portas de escuta em "}.
{"Listened Ports Management", "Gestão dos portas de escuta"}.
{"Members:", "Miembros:"}.
{"Memory", "Memória"}.
{"Module", "Módulo"}.
{"Modules at ", "Módulos em "}.
{"Modules Management", "Gestão de módulos"}.
{"Name:", "Nome:"}.
{"Name", "Nome"}.
{"Never", "Nunca"}.
{"Nickname", "Apelido"}.
{"Online", "Conectado"}.
{"Online users", "Usuários conectados"}.
{"Options", "Opções"}.
{"Outgoing S2S servers", "Servidores conectados"}.
{"Packet", "Pacote"}.
{"Password:", "Senha:"}.
{"Pending", "Pendente"}.
{"Period: ", "Período: "}.
{"Port", "Porta"}.
{"~p statistics", "Estatísticas de ~p"}.
{"(raw)", "(cru)"}.
{"raw", "cru"}.
{"Registered users", "Usuários registrados"}.
{"Remove", "Borrar"}.
{"Restart", "Reiniciar"}.
{"Restore a backup from a file", "Recuperar uma cópia de segurança a partir do arquivo"}.
{"Restore a database from a text file", "Restaurar uma Base de Dados a partir de um arquivo de texto"}.
{"Roster", "Lista de contatos"}.
{"Roster of ", "Lista de contatos de "}.
{"RPC call error", "Erro em la chamada RPC"}.
{"~s access rule configuration", "Configuração da Regra de Acesso ~s"}.
{"Shared roster groups", "Grupos compartilhado"}.
{"Shared Roster", "Lista de contatos compartilhada"}.
{"Show Integral Table", "Mostrar Tabela Integral"}.
{"Show Ordinary Table", "Mostrar Tabela Ordinária"}.
{"Size", "Tamanho"}.
{"~s offline messages queue", "~s cola de mensagens diferidos"}.
{"Start", "Iniciar"}.
{"Statistics", "Estatísticas"}.
{"Stop", "Parar"}.
{"Storage Type", "Tipo de armazenamento"}.
{"Store a backup in a file", "Armazenar uma cópia de segurança no arquivo"}.
{"Submit", "Enviar"}.
{"submitted", "enviado"}.
{"Subscription", "Subscrição"}.
{"Time", "Fecha"}.
{"To", "Para"}.
{"Transactions aborted", "Transações abortadas"}.
{"Transactions commited", "Transações realizadas"}.
{"Transactions logged", "Transações armazenadas"}.
{"Transactions restarted", "Transações reiniciadas"}.
{"Update", "Atualizar"}.
{"Uptime", "Tempo de funcionamento"}.
{"Users last activity", "Última atividades dos usuários"}.
{"Users", "Usuários"}.
{"User ", "Usuário"}.
{"Validate", "Validar"}.
@@ -288,8 +227,7 @@
% mod_vcard_ldap.erl
{"Fill in fields to search for any matching Jabber User", "Preencha campos para buscar usuários Jabber que concordem"}.
{"Given Name", "Nome dado"}.
{"JID", "JID"}.
% mod_adhoc.erl
@@ -384,8 +322,6 @@
{"Description:", "Descrição:"}.
{"Displayed Groups:", "Grupos Indicados"}.
% mod_irc/mod_irc.erl
% mod_muc/mod_muc_log.erl
{"Chatroom configuration modified", "Configuração da sala de bate-papo modificada"}.
{"joins the room", "Entrar na sala"}.
@@ -424,7 +360,6 @@
{"Make room public searchable", "Tornar sala pública possível de ser encontrada"}.
{"Make participants list public", "Tornar pública a lista de participantes"}.
{"Make room password protected", "Tornar protegida a senha da sala"}.
{"Make room semianonymous", "Tornar sala semi-anônima"}.
{"Make room members-only", "Tornar sala apenas para membros"}.
{"Make room moderated", "Tornar a sala moderada"}.
{"Default users as participants", "Usuários padrões como participantes"}.
@@ -435,6 +370,10 @@
{"Enable logging", "Permitir criação de logs"}.
{"Description", "Descrição"}.
{"Number of occupants", "Número de participantes"}.
{"Present real JIDs to", "Tornar o JID real visível por"}.
{"moderators only", "apenas moderadores"}.
{"anyone", "qualquer um"}.
{"is now known as", "é agora conhecido como"}.
% Local Variables:
% mode: erlang
+4 -2
View File
@@ -159,7 +159,7 @@
"Вы должны заполнить поле \"Псевдоним\" в форме"}.
{"Specified nickname is already registered", "Указанный псевдоним уже зарегистрирован"}.
% /home/sergei/src/ejabberd/ejabberd/src/mod_muc/mod_muc_log.erl
% mod_muc/mod_muc_log.erl
{"Chatroom configuration modified", "Конфигурация комнаты изменилась"}.
{"joins the room", "вошёл(а) в комнату"}.
{"leaves the room", "вышел(а) из комнаты"}.
@@ -211,7 +211,9 @@
"Разрешить пользователям посылать приглашения"}.
{"Make room password protected", "Сделать комнату защищённой паролем"}.
{"Password", "Пароль"}.
{"Make room semianonymous", "Сделать комнату полуанонимной"}.
{"Present real JIDs to", "Сделать реальные JID участников видимыми"}.
{"moderators only", "только модераторам"}.
{"anyone", "всем участникам"}.
{"Enable logging", "Включить журналирование"}.
{"Only moderators and participants are allowed to change subject in this room",
"Только модераторы и участники могут изменять тему в этой комнате"}.
+3 -1
View File
@@ -210,7 +210,9 @@
"Дозволити користувачам надсилати запрошення"}.
{"Make room password protected", "Зробити кімнату захищеною паролем"}.
{"Password", "Пароль"}.
{"Make room semianonymous", "Зробити кімнату напіванонімною"}.
{"Present real JIDs to", "Зробити реальні JID учасників видимими"}.
{"moderators only", "тільки модераторам"}.
{"anyone", "всім учасникам"}.
{"Enable logging", "Включити журнал роботи"}.
{"Only moderators and participants are allowed to change subject in this room",
"Тільки модератори та учасники можуть змінювати тему в цій кімнаті"}.
-2
View File
@@ -88,7 +88,6 @@ CREATE TABLE [dbo].[last] (
[username] [varchar] (250) NOT NULL ,
[seconds] [varchar] (50) NOT NULL ,
[state] [varchar] (100) NULL ,
[Modify_Date] [datetime] NULL
) ON [PRIMARY]
GO
@@ -118,7 +117,6 @@ CREATE TABLE [dbo].[spool] (
[xml] [text] NULL ,
[notifyprocessed] [bit] NULL ,
[created] [datetime] NULL ,
[MustDelete] [bit] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO