The send_update_presence/4 function already checked whether the room is
overcrowded before calling send_update_presence1/4, so there's no need
to have send_new_presence/4 perform the same check.
XEP-0313 says: "A MUC archive MUST check that the user requesting the
archive has the right to enter it at the time of the query [...]. In
the case of open MUC rooms, the MUC archives can generally be accessed
by any users [...] who do not have an affiliation of 'outcast'".
If the "resend_on_timeout" option is set to 'if_offline' and a pending
stream management session is terminated because a new session is opened
by the same resource (while no other resource is online), resend
unacknowledged messages rather than bouncing error messages.
Include the occupant JID with MUC MAM messages if the room is not
anonymous, and also when the MAM user sent the MUC message himself (not
just in the case where he is a room moderator).
Strip any pre-existing <x/> tags which have an <item/> child with a
'jid' attribute from MUC MAM messages. This way, if such a tag exists,
clients can be sure it was added by mod_mam.
If a stream management session times out for a user who appears to be
using MAM, drop any unacknowledged messages rather than resending or
bouncing them. This avoids duplicates or bogus error messages.
However, this is only done if the new mod_mam option "assume_mam_usage"
is set to 'if_enabled' or 'on_request'. In the former case, a user is
assumed to be using MAM if archiving is enabled for his account. In the
latter case, MAM usage is assumed only if archiving was explicitly
requested by the client, or if archiving was enabled by means of
mod_mam's "request_activates_archiving" option.
Sort the messages retrieved from an Mnesia archive before selecting the
subset limited by the <max/> value. This makes sure the desired subset
of messages is sent to the client.
If the client doesn't specify a maximum number of messages to retrieve
per page, set a limit of 50 messages. If the client specifies a limit
larger than 250, cap the number to 250 messages.
These limits aren't enforced for MAM v0.2 requests though, as that
version of the XEP doesn't require clients to support RSM. The newer
revisions say that "a server MAY place a reasonable limit on how many
stanzas may be pushed to a client in one request. Whether or not the
client query included a <set/> element, the server MAY simply return its
limited results, modifying the <set/> element it returns appropriately."
If an <index/> is specified in the MAM request, reject the request
rather than ignoring the desired index and returning wrong results.
XEP-0059 says that the server "MAY return a <feature-not-implemented/>
error."
Make sure the binary comparison performed when clients use message UIDs
to page through Mnesia archives yields correct results even if the
specified UIDs don't have the same number of digits as the UIDs of the
stored messages. This way, MAM will continue to work as expected after
migrating from mod_mam_mnesia to mod_mam.
The new "delete_old_mam_messages" command allows for purging all MAM
messages of the specified type older than the specified number of days.
(Currently only implemented for Mnesia archives.)
Enabling "request_activates_archiving" tells mod_mam not to store any
messages for a user until his client issued a MAM request, regardless of
mod_mam's "default" option. Once a MAM request is issued, messages are
archived as usual.
If a message stanza is blocked as per XEP-0016 or XEP-0191, return an
error only if the type of the blocked message is "normal" or "chat".
This makes sure users won't be kicked from MUC rooms when blocking other
participants.
Closes#897.
Don't just use the "put_url" domain name, but also any path components
of the specified URL, to generate a mod_http_upload process name. This
way, a single domain name can be used for multiple virtual hosts by
specifying a "put_url" such as "https://example.com/@HOST@/".
Use <stanza-id/> elements instead of <delay/> tags to check for messages
resent by the stream management code. The <stanza-id/> element is
preferable, as it is added by mod_mam itself.
This option make 'rebar get-deps' command to always fetch latest versions
of deps that are developed together with ejabberd instead of using frozen
commit/branch/tag.
Specifying "--enable-nif" or "--disable-nif" when running ejabberd's
configure script has no effect anymore: NIF support is enabled by
default and can only be disabled by building the p1_xml dependency with
"--disable-nif".
As per XEP-0313 version 0.2 and newer, advertise the MAM feature in the
service discovery information for the bare account (or MUC room) JID.
Some clients check the server's discovery information instead, so we'll
continue to advertise the feature there as well.
Mysql 'utf8' do not support 4-bytes UTF8 chars.
Characters like 'KISS MARK' (U+1F48B) causes mysql
to cut the string at that point.
There is utf8mb4 encoding available on newer mysql
versions that do support 4-bytes utf8. But for storing
stanzas, that doesn't need to be indexed or searched or
inspected in any way, it was easier to use BLOB
(the bytes stored are utf8 encoded anyway, like all XMPP),
and avoids the need to redefine indexes (as allowed size
is shorter on utf8mb4) or having mixed utf8 and utf8mb4
encodings on the same table.
Make sure the "reopen_log" command really just reopens log files without
also rotating them. For rotating log files, the new "rotate_log"
command can be used.
When sending the room subject to a new participant, always use the
occupant JID that corresponds to the subject author as the 'from'
address. It was already done this way when the subject was sent as part
of the room history.
Log an [info] message if a PUT request looks like the specified
"put_url" contains a path component that doesn't match the
"request_handlers" path, as in the following configuration:
listen:
-
module: ejabberd_http
port: 5444
request_handlers:
"/": mod_http_upload
modules:
mod_http_upload:
put_url: "http://example.com/path/"
Let identify/1 return 'pass' when it failed to identify the file type,
as this doesn't (necessarily) indicate an error condition. This also
makes it consistent with the return value of convert/2.
The mod_http_upload_quota module attempts to delete a directory whenever
it removes a file from that directory. However, if thumbnail creation
is enabled, directories will often contain two files. Therefore, don't
log an info (but only a debug) message if directory removal fails.
Don't log an error (but only a debug) message if ImageMagick fails to
indentify the file type for thumbnail creation. The image might be
encrypted, or it could be a non-image file.
Closes#809.
mod_http_upload_quota implements two features:
- When a "hard quota" is exceeded during a file upload, old files are
removed until the disk usage equals or falls below the "soft quota".
- Once a day, all uploaded files (and directories) older than a
configurable number of days are deleted.
The stop/1 function now terminates stream management sessions
immediately, just as it does for other sessions. The new
ejabberd_c2s:close/1 function can be used to close the socket without
terminating the stream management session, like stop/1 did before.
Our new nif xml parser don't handle this gracefully, so we better don't
call it that way.
This is only triggered on old style ssl sockets, where ssl layer must
be activated early, before association between socket and c2s is
established
When an XEP-0198 session times out, always return an error for
unacknowledged IQ stanzas, and always drop presence stanzas. That is,
the "resend_on_timeout" option no longer applies to those stanzas types,
but only to messages.
In the past, the "resume_timeout" option defined both the default resume
timeout and the maximum resume timeout clients are permitted to request.
Admins might want to allow clients to request a timeout value that's
larger than the default, though. This can now be done by specifying the
"max_resume_timeout" option.
Before this having listeners on same port for both tcp and udp would after
config merging step left only one of them.
Many thanks to Holger Weiß for noticing this.
With this commit, arguments change in two commands:
* destroy_room: does not require Host argument
* send_direct_invitation: instead of Room, now requires Name and Service
- catch exceptions
- do ets:give_away for multicastp table on init
- don't send multicasts to itself
- don't check user@server for multicast support
- handle empty disco items
- ignore cdata in <addresses/>
- properly check for subdomains
This is a convenience reverse of make_jid/1. It allows extracting the jid parts
without relying on using the jid record structure, to abstract details.
Don't carbon-copy messages of type "normal" that don't have a body
element as an immediate subtag. Those messages are usually generated by
clients or servers (as opposed to messages written by humans). This
includes MAM messages, for example.
Check for the <no-storage/> and <no-permanent-storage/> hints in
addition to <no-store/> and <no-permanent-store/>. XEP-0334 (0.1)
mentions both variants, and unfortunately, both of them are in use.
Either contributed module include dependencies this way
deps/
dep1/
src/
include/
dep1/
src/
include/
Or includes rebar.config or rebar.config.script:
In this case, only git is supported (if git command available)
and ext_mod checkout code in deps directory.
In both case, only basic built procedure is supported. ext_mod
does not do more than bare compilation like this:
erlc -I include src/*erl
Let mod_pubsub send last items whenever a contact updates the entity
capabilities. This was already done for remote contacts and is now also
done for local contacts.
During login, clients might receive a relatively large number of stanzas
in one go. For some users, the default value of the "max_ack_queue"
option turned out to be too small in that situation.
Generated the mix.exs file through configure is not possible when using mix, as
it does not run configure after having downloaded the dependencies.
#621
Previous versions of XEP-0045 suggested sending a warning message to new
occupants of a non-anonymous MUC room. The current revision (1.25) says
that a status code of "100" must be returned with the user's initial
presence, instead. We already do this (in addition to generating the
warning message).
Receiving the warning message each time the client joins the room can
become annoying, especially when reconnections occur frequently (e.g.,
on mobile devices). So, we omit it, now.
Specify settings that make sense with current ejabberd versions, and use
the YAML configuration format. Also, specify the "urn:xmpp:microblog:0"
namespace, as that's the microblogging node name currently defined by
XEP-0277.
Don't just check whether the full JID is subscribed when a node
subscription is required to list or publish items. If the bare JID is
subscribed, these requests are now also accepted.
Let send_text/2 and (therefore) send_element/2 return {error, Reason}
instead of error for consistency, and let send_stanza_and_ack_req/2
interpret any non-ok value as an error. (EJAB-1739)
In addition to factorize how the mnesia dir option is given to erl
commands, it allows one to set extra mnesia options via the
MNESIA_OPTIONS environment variable.
As a small optimization, avoid running the 'roster_get' hook in the
(common) case where a client requests service discovery information for
its own bare JID.
Don't swap the sending and receiving JIDs while checking whether the
client that requested service discovery information for a bare account
JID is a subscribed contact.
Make sure the server processed the slave's active request after the
previous test stanzas were received by the slave and before the final
Chat State notification is sent by the master.
For couple years browsers did limit ability to change cookies from js
for different domains, this made http_poll connections practically not
usuable. I don't think this module is used at all so it's time to put it
to rest.
Old style websocket do use binaries for transferring data to C2S, so when
we buffer that data we need to handle it different than list of #xml structs
used by new style connections.
This fixes github issue #515.
RFC 6455 says that the client's opening handshake includes an Upgrade
header field "containing the value 'websocket', treated as an ASCII
case-insensitive value."
Closes#510.
Previous commits were done with:
for i in `git log --reverse --date-order --format=%h mod_admin_extra.erl`; do git format-patch -1 $i; cat 00* >>patch; rm 00*; done
Then editing patch to remove unneeded files and fix path.
As per RFC 6121, deliver headline messages that were sent to a bare JID
to all resources with a non-negative priority, not just to those with
the highest priority. If no such resource is available, discard them
silently.
As per XEP-0016 and XEP-0191, return a service-unavailable error when an
incoming message was blocked by a privacy list. This lets the user
appear offline to the contact.
The jlib:rsm_decode/1 function sets the 'max' and/or 'index' elements of
the returned 'rsm_in' record to 'error' if the parsed strings cannot be
converted to integer values.
This is a preliminary version that is tested to work with the packaging
branch of ejabberd-modules repository
This version lacks automatic configuration include at runtime
As per version 1.25 of XEP-0045, use the room JID as the 'from' address
for <delay/> elements also when the room is non-anonymous, and specify
the original JID of the sender as an XEP-0033-style tag instead.
Closes#465.
Before generating a carbon copy for a resource, make sure it's actually
available. This handles the case where, for some reason, the
'unset_presence_hook' wasn't called during logout of a resource. Carbon
copies sent to that resource would otherwise be re-routed to another
resource (which might've received a copy of that message already).
If the "captcha_host" is specified without "http://" or "https://"
prefix, ejabberd_captcha tries to figure out the protocol automatically.
Fix the code that parses the listener configuration in order to do that.
Allow temporary processes to perform some final actions when shutting
down. For example, moc_muc_room:terminate/3 fails to send 'unavailable'
presence to the room participants when killed immediately.
Let add_message_type/2 accept the type as an atom, and let the function
handle the 'normal' message type. This doesn't change the behavior, but
avoids some code duplication.
As a small optimization, use io:format's "B" control sequence to format
integers. We don't need to let Erlang figure out the data type if we
already know it.
Include fractions of a second with XEP-0203 <delay/> timestamps, as
specified in XEP-0082.
Old timestamp: 2014-05-19T11:55:00Z
New timestamp: 2014-05-19T11:55:00.123Z
When an unacknowledged stanza is resent from the Stream Management
queue, add a timestamp so that the receiving client can display the time
at which the stanza was originally sent.
Provide a simpler interface for adding <delay/> and <x/> timestamps to
stanzas. This also makes sure that only one <delay/> tag and one <x/>
tag is added to a given stanza.
When a contact becomes available, usually both the 'caps_update' hook
and the 'presence_probe_hook' are called. For remote contacts, both
hooks triggered PEP notifications, so each item was sent twice. Fix
this by ignoring the 'presence_probe_hook' for remote contacts.
When a config relative path specified, get_absolute_path would not
return an absolute path. The patch fixed it using current working
home as base directory.
Signed-off-by: Gu Feng <flygoast@126.com>
When a remote subscriber becomes available, send him the last published
PEP items, as we do for local subscribers.
However, the current implementation depends on a running ejabberd_c2s
process of the publisher to send items to remote subscribers. So, for
those, the behavior is always like it is for local subscribers when
"ignore_pep_from_offline" is set to "true".
A while back, mod_pubsub was modified to address EJAB-1456. However,
the change was only partially applied to mod_pubsub_odbc. This commit
adds the remaining part.
When multiple resources have the same (highest) priority, the session
manager routes messages sent to their bare JID to each of these
resources. When another resource has a lower priority but receives
carbon copies, make sure it won't receive multiple copies of such
messages.
According to XEP-0054, if no vCard exists, the server MUST return a stanza
error (which SHOULD be <item-not-found/>) or an IQ-result containing an
empty <vCard/> element.
Signed-off-by: Gu Feng <flygoast@126.com>
Terminate the ejabberd_c2s process immediately once stanza queue
overflow is detected. This makes sure the FSM won't process additional
stanzas before terminating if the recipient is flooded.
Don't offer the CSI stream feature when mod_client_state isn't actually
configured to filter stanzas. This makes sure clients won't send CSI
tags that end up being ignored.
The "ldap_deref_aliases" option has accidentally been renamed to
"deref_aliases". Revert that change (but accept both names for a
while), so that the option name now matches the documentation again.
If "resend_on_timeout" is set to "if_offline", resend unacknowledged
stanzas only if no other resource is online when the session times out.
In other words, allow for sending them to offline storage, but nowhere
else.
When Stream Management is enabled and a gen_tcp:send/2 call fails, go
into the 'wait_for_resume' state immediately. This makes sure that
gen_tcp:send/2 won't be called again, which might avoid an Erlang issue
where gen_tcp:send/2 apparently hangs despite 'send_timeout' (and
'send_timeout_close') being set.
Make sure persistent rooms are stored to the database. Without this
change, a room got lost if the 'persistent' flag was handed over to
mod_muc:create_room/5 and the server was then restartet before any
activity took place in that room.
Produce a proper error message instead of crashing when the JID encoded
in the 'previd' value of a <resume/> request is different from the
authenticated JID.
Generate an [info] message that logs whether an incoming s2s connection
is authenticated using the SASL EXTERNAL mechanism or via Server
Dialback. While at it, also mention whether TLS is enabled.
On Linux, su(1)'s "-p" flag makes sure the following environment
variables are preserved: $HOME, $SHELL, $USER, and $LOGNAME. The flag
isn't portable, and since we don't set HOME=$SPOOLDIR anymore, there's
no reason to preserve these variables anyway.
Without "-p", we also don't need to set HOME=$INSTALLUSER_HOME, as su(1)
now does that for us.
to do so, we remove configure script from repository.
it must be generated with autotools.
for developpers not using autotools, we include the configure script in
release source tarball, which in generated with correct version string.
Use plain POSIX shell syntax to match ".yml" configuration file names.
This is also slightly more correct, as it matches ".yml" only at the
*end* of the file name.
If a listener is started or stopped via ejabberd_listener:add_listener/3
or ejabberd_listener:delete_listener/3, the configuration for all
listener modules is updated using the Module:transform_listen_option/2
function for each listener module that exports such a function.
However, for listener modules that don't provide that function (such as
ejabberd_stun), all but one option was dropped. This is now fixed.
The issue could be triggered e.g. by enabling mod_proxy65 in the modules
section.
An earlier version of XEP-0280 specified the <received/> and <sent/>
tags to be siblings of the <forwarded/> element, whereas the current
version mandates them to be parents of <forwarded/>. The mod_carboncopy
module supports both variants. However, the check that makes sure
clients won't receive a copy of the messages they sent didn't work for
the old-style schema. This is now fixed.
Log one instead of three [info] messages when XEP-0280 (Message Carbons)
support is enabled or disabled successfully. On failure, log an
additional [warning].
On stanza queue overflow, pass a message to self() using the exclamation
mark operator instead of send_all_state_event/2. This allows for
reusing the existing handler for 'kick' events.
On queue overflow, terminate the c2s session instead of just dropping
items from the queue. This makes sure all stanzas are either delivered
or bounced.
When the FSM goes into the 'wait_for_resume' state, let fsm_next_state/2
take care of updating #state.mgmt_state and of writing the log line.
This doesn't change the behavior, but simplifies the code.
The 'previd' value provided by the client during a session resume
request includes the client's JID and ejabberd's session ID. If there
is a session for the requested JID but with a different session ID,
resumption should fail, but that session shouldn't be closed. This
commit makes sure the latter won't happen.
In practice, this will only make a difference in odd corner cases.
If stream management is enabled, don't exit the c2s process when
ejabberd_socket:send/2 fails, but close the socket instead. This gives
the client a chance to resume the session.
Thanks go to Matthias Rieber for reporting the issue, providing detailed
logs, and testing the fix.
Only the child elements of <iq/> stanzas are qualified by the namespaces
in question, not the <iq/> stanzas themselves.
This change just clarifies the code. It doesn't alter the behaviour, as
those <iq/> stanzas are handed over to jlib:iq_to_xml/1, and that
function ignores the 'xmlns' attribute anyway.
Regarding "extauth_cache", the guide says: "The integer 0 (zero) enables
caching for statistics, but doesn't use that cached information to
authenticate users." Make sure the cached password isn't used even if
the user is currently logged in with another resource.
Only stanzas are subject to stream management, so when XEP-0198 support
is enabled, we must distinguish them from non-stanza elements. This
commit adds a send_packet/2 function that can be used in place of
send_stanza/2 or send_element/2 whenever a packet is delivered that
might or might not be a stanza.
If the client says that it handled more stanzas than we sent (due to a
bug in the client's or in our code), increase our outgoing stanza count
accordingly. There's no point in sticking to the old value even if it
was correct, as the client surely won't fix its count during the current
session.
Do not log a warning (but only a debug message) if the client sends an
invalid </a> packet. Some clients do that occasionally, and there's
nothing server admininistrators could do about that.
There are corner cases where certain clients acknowledge more stanzas
than they received. Nothing really bad will happen in those cases, and
server administrators can't do anything about such issues anyway.
Due to timing issues, ejabberd_c2s might receive stream elements from
the client while the session is waiting for stream resumption. Those
elements are now accepted.
Log an informational message when a session goes into the pending state
(waiting for resumption) after the connection was lost. Administrators
may well be interested in this state change when looking into issues.
Suggest specifying 'localhost' as host name part of the MySQL test
account name. Otherwise, the anonymous user that is usually created by
default for 'localhost' would take precedence for local connections due
to the more specific host name.
Don't print the following message if an ejabberd command expects binary
string arguments: "This command cannot be executed using ejabberdctl.
Try ejabberd_xmlrpc."
Handle "s2s_use_starttls: required_trusted" the same way for outgoing
s2s connections as for incoming connections. That is, check the remote
server's certificate (including the host name) and abort the connection
if verification fails.
Don't try to look up and close outgoing connections to a given server
when aborting incoming connections from that server due to certificate
verification errors. The ejabberd_s2s:find_connection/2 call actually
created one or more *new* connections if less than 'max_s2s_connections'
connections were found. Then, no more than one of those possibly new
connections were stopped by the ejabberd_s2s_out:stop_connection/1 call.
It's not really necessary to bother with outgoing connections at all,
here.
Prior to this commit, ejabberd handled certificate authentication for
incoming s2s connections like this:
1. Verify the certificate without checking the host name. On failure,
behave according to 's2s_use_starttls'. On success:
2. Offer SASL EXTERNAL.
3. If the remote server chooses SASL EXTERNAL, compare the authorization
identity against the certificate host name(s). On failure, abort the
connection unconditionally.
ejabberd now does this instead:
1. Verify the certificate and compare the certificate host name(s)
against the 'from' attribute of the stream header. On failure,
behave according to 's2s_use_starttls'. On success:
2. Offer SASL EXTERNAL.
3. If the remote server chooses SASL EXTERNAL, ignore the authorization
identity (if any) and consider the peer authenticated.
The old behavior was suggested by previous versions of XEP-0178, the new
behavior is suggested by the current version 1.1.
As the version string is auto-generated from the git-describe(1) output,
the configure script may need to be regenerated even if configure.ac
wasn't modified.
Don't log a "configuration problem" message if "extauth_cache: false" is
explicitly specified, as that's a valid configuration setting as per the
documentation.
As the session manager handles messages sent to unavailable resources
just like messages sent to bare JIDs, mod_carboncopy must do that, too.
That is, forward them only to those carbon-copy-enabled resources that
don't have a top priority, in order to avoid duplicates.
On connection timeout, drop any messages that were forwarded by some
encapsulating protocol, such as XEP-0280 carbon copies or XEP-0313
archive messages. Bouncing or resending them could easily lead to
unexpected results.
Implement the optional session resumption feature described in XEP-0198.
A client that supports this feature may now resume the previous session
(within a configurable number of seconds) if the connection was lost.
During resumption, ejabberd will retransmit any stanzas that hadn't been
acknowledged by the client.
Implement partial support for XEP-0198: Stream Management. After
successful negotiation of this feature, the server requests an ACK for
each stanza transmitted to the client and responds to ACK requests
issued by the client. On session termination, the server re-routes any
unacknowledged stanzas. The length of the pending queue can be limited
by setting the "max_ack_queue" option to some integer value (default:
500). XEP-0198 support can be disabled entirely by setting the
"stream_management" option to false (default: true).
So far, stream management is implemented only for c2s connections, and
the optional stream resumption feature also described in XEP-0198 is not
(yet) supported.
This addition was originally based on a patch provided by Magnus Henoch
and updated by Grzegorz Grasza. Their code implements an early draft of
XEP-0198 for some previous version of ejabberd. It has since been
rewritten almost entirely.
Fix configure's --{enable,disable}-transient_supervisors option: Make
sure it's enabled with --enable and disabled with --disable, not the
other way round. This also makes --disable the default setting, as
documented.
By calling:
ejd2odbc:export_pubsub("localhost","/tmp/aa.txt").
it will generate SQL files like these:
/tmp/pubsub_item.txt
/tmp/pubsub_node.txt
/tmp/pubsub_state.txt
Conflicts:
src/ejabberd_admin.erl
src/ejd2odbc.erl
<ANAME="intro"></A></P><P><TT>ejabberd</TT> is a free and open source instant messaging server written in <AHREF="http://www.erlang.org/">Erlang/OTP</A>.</P><P><TT>ejabberd</TT> is cross-platform, distributed, fault-tolerant, and based on open standards to achieve real-time communication.</P><P><TT>ejabberd</TT> is designed to be a rock-solid and feature rich XMPP server.</P><P><TT>ejabberd</TT> is suitable for small deployments, whether they need to be scalable or not, as well as extremely big deployments.</P><!--TOC section Key Features-->
<H2CLASS="section"><!--SEC ANCHOR --><ANAME="htoc1">1</A>  Key Features</H2><!--SEC END --><P>
<ANAME="keyfeatures"></A>
</P><P><TT>ejabberd</TT> is:
</P><ULCLASS="itemize"><LICLASS="li-itemize">
Cross-platform: <TT>ejabberd</TT> runs under Microsoft Windows and Unix derived systems such as Linux, FreeBSD and NetBSD.</LI><LICLASS="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.</LI><LICLASS="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’.</LI><LICLASS="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:
<ULCLASS="itemize"><LICLASS="li-itemize">
Comprehensive documentation.
</LI><LICLASS="li-itemize">Straightforward installers for Linux, Mac OS X, and Windows. </LI><LICLASS="li-itemize">Web Administration.
</LI><LICLASS="li-itemize">Shared Roster Groups.
</LI><LICLASS="li-itemize">Command line administration tool. </LI><LICLASS="li-itemize">Can integrate with existing authentication mechanisms.
</LI><LICLASS="li-itemize">Capability to send announce messages.
</LI></UL></LI><LICLASS="li-itemize">Internationalized: <TT>ejabberd</TT> leads in internationalization. Hence it is very well suited in a globalized world. Related features are:
<ULCLASS="itemize"><LICLASS="li-itemize">
Translated to 25 languages. </LI><LICLASS="li-itemize">Support for <AHREF="http://www.ietf.org/rfc/rfc3490.txt">IDNA</A>.
</LI></UL></LI><LICLASS="li-itemize">Open Standards: <TT>ejabberd</TT> is the first Open Source Jabber server claiming to fully comply to the XMPP standard.
</LI><LICLASS="li-itemize">ODBC data storage support.
</LI><LICLASS="li-itemize">Microsoft SQL Server support. </LI></UL>
</LI><LICLASS="li-itemize">Authentication
<ULCLASS="itemize"><LICLASS="li-itemize">
Internal Authentication.
</LI><LICLASS="li-itemize">PAM, LDAP and ODBC. </LI><LICLASS="li-itemize">External Authentication script.
</LI></UL>
</LI><LICLASS="li-itemize">Others
<ULCLASS="itemize"><LICLASS="li-itemize">
Support for virtual hosting.
</LI><LICLASS="li-itemize">Compressing XML streams with Stream Compression (<AHREF="http://www.xmpp.org/extensions/xep-0138.html">XEP-0138</A>).
</LI><LICLASS="li-itemize">Statistics via Statistics Gathering (<AHREF="http://www.xmpp.org/extensions/xep-0039.html">XEP-0039</A>).
</LI><LICLASS="li-itemize">IPv6 support both for c2s and s2s connections.
</LI><LICLASS="li-itemize"><AHREF="http://www.xmpp.org/extensions/xep-0045.html">Multi-User Chat</A> module with support for clustering and HTML logging. </LI><LICLASS="li-itemize">Users Directory based on users vCards.
</LI><LICLASS="li-itemize"><AHREF="http://www.xmpp.org/extensions/xep-0060.html">Publish-Subscribe</A> component with support for <AHREF="http://www.xmpp.org/extensions/xep-0163.html">Personal Eventing via Pubsub</A>.
</LI><LICLASS="li-itemize">Support for web clients: <AHREF="http://www.xmpp.org/extensions/xep-0025.html">HTTP Polling</A> and <AHREF="http://www.xmpp.org/extensions/xep-0206.html">HTTP Binding (BOSH)</A> services.
</LI><LICLASS="li-itemize">IRC transport.
</LI><LICLASS="li-itemize">Component support: interface with networks such as AIM, ICQ and MSN installing special tranports.
</LI></UL>
</LI></UL><!--TOC section How it Works-->
<H2CLASS="section"><!--SEC ANCHOR --><ANAME="htoc3">3</A>  How it Works</H2><!--SEC END --><P>
<ANAME="howitworks"></A></P><P>A XMPP domain is served by one or more <TT>ejabberd</TT> nodes. These nodes can
be run on different machines that are connected via a network. They all must
have the ability to connect to port 4369 of all another nodes, and must have
the same magic cookie (see Erlang/OTP documentation, in other words the file
<TT>~ejabberd/.erlang.cookie</TT> must be the same on all nodes). This is
needed because all nodes exchange information about connected users, S2S
connections, registered services, etc…</P><P>Each <TT>ejabberd</TT> node have following modules:
</P><ULCLASS="itemize"><LICLASS="li-itemize">
router;
</LI><LICLASS="li-itemize">local router.
</LI><LICLASS="li-itemize">session manager;
</LI><LICLASS="li-itemize">S2S manager;
</LI></UL><!--TOC subsection Router-->
<H3CLASS="subsection"><!--SEC ANCHOR --><ANAME="htoc4">3.1</A>  Router</H3><!--SEC END --><P>This module is the main router of XMPP packets on each node. It routes
them based on their destinations domains. It has two tables: local and global
routes. First, domain of packet destination searched in local table, and if it
found, then the packet is routed to appropriate process. If no, then it
searches in global table, and is routed to the appropriate <TT>ejabberd</TT> node or
process. If it does not exists in either tables, then it sent to the S2S
manager.</P><!--TOC subsection Local Router-->
<H3CLASS="subsection"><!--SEC ANCHOR --><ANAME="htoc5">3.2</A>  Local Router</H3><!--SEC END --><P>This module routes packets which have a destination domain equal to this server
name. If destination JID has a non-empty user part, then it routed to the
session manager, else it is processed depending on it’s content.</P><!--TOC subsection Session Manager-->
<H3CLASS="subsection"><!--SEC ANCHOR --><ANAME="htoc6">3.3</A>  Session Manager</H3><!--SEC END --><P>This module routes packets to local users. It searches for what user resource
packet must be sent via presence table. If this resource is connected to
this node, it is routed to C2S process, if it connected via another node, then
the packet is sent to session manager on that node.</P><!--TOC subsection S2S Manager-->
<H3CLASS="subsection"><!--SEC ANCHOR --><ANAME="htoc7">3.4</A>  S2S Manager</H3><!--SEC END --><P>This module routes packets to other XMPP servers. First, it checks if an
open S2S connection from the domain of the packet source to the domain of
packet destination already exists. If it is open on another node, then it
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.</P><!--TOC section Authentication-->
<H2CLASS="section"><!--SEC ANCHOR --><ANAME="htoc8">4</A>  Authentication</H2><!--SEC END --><!--TOC subsubsection External-->
<H4CLASS="subsubsection"><!--SEC ANCHOR --><ANAME="htoc9">4.0.1</A>  External</H4><!--SEC END --><P>
<ANAME="externalauth"></A>
</P><P>The external authentication script follows
<AHREF="http://www.erlang.org/doc/tutorial/c_portdriver.html">the erlang port driver API</A>.</P><P>That script is supposed to do theses actions, in an infinite loop:
</P><ULCLASS="itemize"><LICLASS="li-itemize">
read from stdin: AABBBBBBBBB.....
<ULCLASS="itemize"><LICLASS="li-itemize">
A: 2 bytes of length data (a short in network byte order)
</LI><LICLASS="li-itemize">B: a string of length found in A that contains operation in plain text
operation are as follows:
<ULCLASS="itemize"><LICLASS="li-itemize">
auth:User:Server:Password (check if a username/password pair is correct)
</LI><LICLASS="li-itemize">isuser:User:Server (check if it’s a valid user)
</PRE>Returns string representation of XML stanza <TT>El</TT>.</DD><DTCLASS="dt-description"></DT><DDCLASS="dd-description"><CODE>crypt(S) -> string()</CODE>
<PRECLASS="verbatim">S = string()
</PRE>Returns string which correspond to <TT>S</TT> with encoded XML special
</PRE><TT>EList</TT> is a list of all non-CDATA elements of ECList.</DD><DTCLASS="dt-description"></DT><DDCLASS="dd-description"><CODE>get_path_s(El, Path) -> Res</CODE>
<PRECLASS="verbatim">El = XMLElement
Path = [PathItem]
PathItem = PathElem | PathAttr | PathCDATA
PathElem = {elem, Name}
PathAttr = {attr, Name}
PathCDATA = cdata
Name = string()
Res = string() | XMLElement
</PRE>If <TT>Path</TT> is empty, then returns <TT>El</TT>. Else sequentially
consider elements of <TT>Path</TT>. Each element is one of:
<DLCLASS="description"><DTCLASS="dt-description">
</DT><DDCLASS="dd-description"><CODE>{elem, Name}</CODE><TT>Name</TT> is name of subelement of
<TT>El</TT>, if such element exists, then this element considered in
following steps, else returns empty string.
</DD><DTCLASS="dt-description"></DT><DDCLASS="dd-description"><CODE>{attr, Name}</CODE> If <TT>El</TT> have attribute <TT>Name</TT>, then
returns value of this attribute, else returns empty string.
</DD><DTCLASS="dt-description"></DT><DDCLASS="dd-description"><CODE>cdata</CODE> Returns CDATA of <TT>El</TT>.
</DIV><BLOCKQUOTECLASS="quotation"><FONTCOLOR="#921700"><I>I can thoroughly recommend ejabberd for ease of setup –
Kevin Smith, Current maintainer of the Psi project</I></FONT></BLOCKQUOTE><P>Introduction
<ANAME="intro"></A></P><BLOCKQUOTECLASS="quotation"><FONTCOLOR="#921700"><I>I just tried out ejabberd and was impressed both by ejabberd itself and the language it is written in, Erlang. —
Joeri</I></FONT></BLOCKQUOTE><P><TT>ejabberd</TT> is a <B><FONTSIZE=4><FONTCOLOR="#001376">free and open source</FONT></FONT></B> instant messaging server written in <AHREF="http://www.erlang.org/">Erlang/OTP</A>.</P><P><TT>ejabberd</TT> is <B><FONTSIZE=4><FONTCOLOR="#001376">cross-platform</FONT></FONT></B>, distributed, fault-tolerant, and based on open standards to achieve real-time communication.</P><P><TT>ejabberd</TT> is designed to be a <B><FONTSIZE=4><FONTCOLOR="#001376">rock-solid and feature rich</FONT></FONT></B> XMPP server.</P><P><TT>ejabberd</TT> is suitable for small deployments, whether they need to be <B><FONTSIZE=4><FONTCOLOR="#001376">scalable</FONT></FONT></B> or not, as well as extremely big deployments.</P><!--TOC section Key Features-->
<H2CLASS="section"><!--SEC ANCHOR --><ANAME="htoc1"></A>Key Features</H2><!--SEC END --><P>
<ANAME="keyfeatures"></A>
</P><BLOCKQUOTECLASS="quotation"><FONTCOLOR="#921700"><I>Erlang seems to be tailor-made for writing stable, robust servers. —
Peter Saint-André, Executive Director of the Jabber Software Foundation</I></FONT></BLOCKQUOTE><P><TT>ejabberd</TT> is:
</P><ULCLASS="itemize"><LICLASS="li-itemize">
<B><FONTSIZE=4><FONTCOLOR="#001376">Cross-platform:</FONT></FONT></B><TT>ejabberd</TT> runs under Microsoft Windows and Unix derived systems such as Linux, FreeBSD and NetBSD.</LI><LICLASS="li-itemize"><B><FONTSIZE=4><FONTCOLOR="#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.</LI><LICLASS="li-itemize"><B><FONTSIZE=4><FONTCOLOR="#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’.</LI><LICLASS="li-itemize"><B><FONTSIZE=4><FONTCOLOR="#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:
<ULCLASS="itemize"><LICLASS="li-itemize">
Comprehensive documentation.
</LI><LICLASS="li-itemize">Straightforward installers for Linux, Mac OS X, and Windows. </LI><LICLASS="li-itemize">Web Administration.
</LI><LICLASS="li-itemize">Shared Roster Groups.
</LI><LICLASS="li-itemize">Command line administration tool. </LI><LICLASS="li-itemize">Can integrate with existing authentication mechanisms.
</LI><LICLASS="li-itemize">Capability to send announce messages.
</LI></UL></LI><LICLASS="li-itemize"><B><FONTSIZE=4><FONTCOLOR="#001376">Internationalized:</FONT></FONT></B><TT>ejabberd</TT> leads in internationalization. Hence it is very well suited in a globalized world. Related features are:
<ULCLASS="itemize"><LICLASS="li-itemize">
Translated to 25 languages. </LI><LICLASS="li-itemize">Support for <AHREF="http://www.ietf.org/rfc/rfc3490.txt">IDNA</A>.
</LI></UL></LI><LICLASS="li-itemize"><B><FONTSIZE=4><FONTCOLOR="#001376">Open Standards:</FONT></FONT></B><TT>ejabberd</TT> is the first Open Source Jabber server claiming to fully comply to the XMPP standard.
<H2CLASS="section"><!--SEC ANCHOR --><ANAME="htoc2"></A>Additional Features</H2><!--SEC END --><P>
<ANAME="addfeatures"></A>
</P><BLOCKQUOTECLASS="quotation"><FONTCOLOR="#921700"><I>ejabberd is making inroads to solving the "buggy incomplete server" problem —
Justin Karneges, Founder of the Psi and the Delta projects</I></FONT></BLOCKQUOTE><P>Moreover, <TT>ejabberd</TT> comes with a wide range of other state-of-the-art features:
</P><ULCLASS="itemize"><LICLASS="li-itemize">
Modular
<ULCLASS="itemize"><LICLASS="li-itemize">
Load only the modules you want.
</LI><LICLASS="li-itemize">Extend <TT>ejabberd</TT> with your own custom modules.
</LI></UL>
</LI><LICLASS="li-itemize">Security
<ULCLASS="itemize"><LICLASS="li-itemize">
SASL and STARTTLS for c2s and s2s connections.
</LI><LICLASS="li-itemize">STARTTLS and Dialback s2s connections.
</LI><LICLASS="li-itemize">Web Admin accessible via HTTPS secure access.
</LI><LICLASS="li-itemize">ODBC data storage support.
</LI><LICLASS="li-itemize">Microsoft SQL Server support. </LI></UL>
</LI><LICLASS="li-itemize">Authentication
<ULCLASS="itemize"><LICLASS="li-itemize">
Internal Authentication.
</LI><LICLASS="li-itemize">PAM, LDAP and ODBC. </LI><LICLASS="li-itemize">External Authentication script.
</LI></UL>
</LI><LICLASS="li-itemize">Others
<ULCLASS="itemize"><LICLASS="li-itemize">
Support for virtual hosting.
</LI><LICLASS="li-itemize">Compressing XML streams with Stream Compression (<AHREF="http://www.xmpp.org/extensions/xep-0138.html">XEP-0138</A>).
</LI><LICLASS="li-itemize">Statistics via Statistics Gathering (<AHREF="http://www.xmpp.org/extensions/xep-0039.html">XEP-0039</A>).
</LI><LICLASS="li-itemize">IPv6 support both for c2s and s2s connections.
</LI><LICLASS="li-itemize"><AHREF="http://www.xmpp.org/extensions/xep-0045.html">Multi-User Chat</A> module with support for clustering and HTML logging. </LI><LICLASS="li-itemize">Users Directory based on users vCards.
</LI><LICLASS="li-itemize"><AHREF="http://www.xmpp.org/extensions/xep-0060.html">Publish-Subscribe</A> component with support for <AHREF="http://www.xmpp.org/extensions/xep-0163.html">Personal Eventing via Pubsub</A>.
</LI><LICLASS="li-itemize">Support for web clients: <AHREF="http://www.xmpp.org/extensions/xep-0025.html">HTTP Polling</A> and <AHREF="http://www.xmpp.org/extensions/xep-0206.html">HTTP Binding (BOSH)</A> services.
</LI><LICLASS="li-itemize">IRC transport.
</LI><LICLASS="li-itemize">Component support: interface with networks such as AIM, ICQ and MSN installing special tranports.
</LI></UL>
</LI></UL><!--CUT END -->
<!--HTMLFOOT-->
<!--ENDHTML-->
<!--FOOTER-->
<HRSIZE=2><BLOCKQUOTECLASS="quote"><EM>This document was translated from L<sup>A</sup>T<sub>E</sub>X by
%% TODO: improve the feature sheet with a nice table to highlight new features.
\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 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 a \marking{free and open source} instant messaging server written in \footahref{http://www.erlang.org/}{Erlang/OTP}.
\ejabberd{} is \marking{cross-platform}, distributed, fault-tolerant, and based on open standards to achieve real-time communication.
\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{Layout with example deployment (title needs a better name)}
%\label{layout}
%In this section there will be a graphical overview like these:\\
%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}
%\label{trytoday}
%(Not sure if I will include/finish this section for the next version.)
%\begin{itemize}
%\item Erlang REPOS
%\item Packages in distributions
%\item Windows binary
%\item source tar.gz
%\item Migration from Jabberd14 (and so also Jabberd2 because you can migrate from version 2 back to 14) and Jabber Inc. XCP possible.
%\end{itemize}
\newpage
\section{Key Features}
\label{keyfeatures}
\ind{features!key features}
\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{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{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.
\item Straightforward installers for Linux, Mac OS X, and Windows. %%\improved{}
\item Web Administration.
\item Shared Roster Groups.
\item Command line administration tool. %%\improved{}
\item Can integrate with existing authentication mechanisms.
\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 to 25 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.
{"Exclude Jabber IDs from CAPTCHA challenge","Excloure Jabber IDs de la comprovació CAPTCHA"}.
{"Export all tables as SQL queries to a file:","Exporta totes les taules a un fitxer SQL:"}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Exportar dades de tots els usuaris del servidor a arxius PIEFXIS (XEP-0227):"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Exportar dades d'usuaris d'un host a arxius PIEFXIS (XEP-0227):"}.
{"Failed to extract JID from your voice request approval","No s'ha pogut extraure el JID de la teva aprovació de petició de veu"}.
@@ -139,6 +144,7 @@
{"Import Users from Dir at ","Importar usuaris des del directori en "}.
{"Import Users From jabberd14 Spool Files","Importar usuaris de jabberd14"}.
{"Improper message type","Tipus de missatge incorrecte"}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","No està permés enviar missatges d'error a la sala. El participant (~s) ha enviat un missatge d'error (~s) i ha sigut expulsat de la sala"}.
{"It is not allowed to send private messages","No està permés enviar missatges privats"}.
{"It is not allowed to send private messages of type \"groupchat\"","No està permés enviar missatges del tipus \"groupchat\""}.
{"It is not allowed to send private messages to the conference","No està permès l'enviament de missatges privats a la sala"}.
@@ -172,6 +179,7 @@
{"Listened Ports at ","Ports a la escolta en "}.
{"Listened Ports","Ports a l'escolta"}.
{"List of modules to start","Llista de mòduls a iniciar"}.
{"List of rooms","Llista de sales"}.
{"Low level update script","Script d'actualització de baix nivell"}.
{"Make participants list public","Crear una llista de participants pública"}.
{"Make room CAPTCHA protected","Crear una sala protegida per CAPTCHA"}.
@@ -192,26 +200,29 @@
{"Message body","Missatge"}.
{"Middle Name","Segon nom"}.
{"Minimum interval between voice requests (in seconds)","Interval mínim entre peticions de veu (en segons)"}.
{"Moderator","Moderador"}.
{"Moderator privileges required","Es necessita tenir privilegis de moderador"}.
{"moderators only","només moderadors"}.
{"Modified modules","Mòduls modificats"}.
{"Module","Mòdul"}.
{"Modules at ","Mòduls en "}.
{"Modules at ~p","Mòduls en ~p"}.
{"Modules","Mòduls"}.
{"Monday","Dilluns"}.
{"Multicast","Multicast"}.
{"Multi-User Chat","Multi-Usuari Converses"}.
{"Name:","Nom:"}.
{"Name","Nom"}.
{"Never","Mai"}.
{"New Password:","Nova Contrasenya:"}.
{"Nickname","Nickname"}.
{"Nickname Registration at ","Registre del Nickname en "}.
{"Nickname ~s does not exist in the room","El Nickname ~s no existeix a la sala"}.
{"Nickname Registration at ","Registre del sobrenom en "}.
{"Nickname ~s does not exist in the room","El sobrenom ~s no existeix a la sala"}.
{"Nickname","Sobrenom"}.
{"nobody","ningú"}.
{"No body provided for announce message","No hi ha proveedor per al missatge anunci"}.
{"No Data","No hi ha dades"}.
{"Node ID","ID del Node"}.
{"Node ","Node "}.
{"Node not found","Node no trobat"}.
{"Node ~p","Node ~p"}.
{"Nodes","Nodes"}.
{"No limit","Sense Llímit"}.
{"None","Cap"}.
@@ -233,6 +244,7 @@
{"Online Users","Usuaris conectats"}.
{"Online Users:","Usuaris en línia:"}.
{"Only deliver notifications to available users","Sols enviar notificacions als usuaris disponibles"}.
{"Only members may query archives of this room","Només membres poden consultar l'arxiu de missatges d'aquesta sala"}.
{"Only moderators and participants are allowed to change the subject in this room","Només els moderadors i participants poden canviar l'assumpte d'aquesta sala"}.
{"Only moderators are allowed to change the subject in this room","Només els moderadors poden canviar l'assumpte d'aquesta sala"}.
{"Only moderators can approve voice requests","Només els moderadors poden aprovar les peticions de veu"}.
{"Outgoing s2s Servers:","Servidors d'eixida de s2s"}.
{"Owner privileges required","Es requerixen privilegis de propietari de la sala"}.
{"Packet","Paquet"}.
{"Participant","Participant"}.
{"Password ~b","Contrasenya ~b"}.
{"Password:","Contrasenya:"}.
{"Password","Contrasenya"}.
@@ -256,9 +268,12 @@
{"Path to File","Ruta al fitxer"}.
{"Pending","Pendent"}.
{"Period: ","Període: "}.
{"Permanent rooms","Sales permanents"}.
{"Persist items to storage","Persistir elements al guardar"}.
{"Ping","Ping"}.
{"Please note 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.","Recorda que aquestes opcions només fan còpia de seguretat de la base de dades Mnesia. Si estàs utilitzant el mòdul d'ODBC també deus de fer una còpia de seguretat de la base de dades de SQL a part."}.
{"Please specify file name.","Per favor especifica el nom del fitxer."}.
{"Please specify file size.","Per favor especifica la mida del fitxer."}.
{"Please, wait for a while before sending new voice request","Si us plau, espera una mica abans d'enviar una nova petició de veu"}.
{"Pong","Pong"}.
{"Port ~b","Port ~b"}.
@@ -276,6 +291,7 @@
{"Really delete message of the day?","Segur que vols eliminar el missatge del dia?"}.
{"Recipient is not in the conference room","El receptor no està en la sala de conferència"}.
{"Register a Jabber account","Registrar un compte Jabber"}.
{"Registered nicknames","Sobrenoms registrats"}.
{"Registered Users:","Usuaris registrats:"}.
{"Registered Users","Usuaris registrats"}.
{"Register","Registrar"}.
@@ -293,6 +309,7 @@
{"Restore binary backup immediately:","Restaurar una còpia de seguretat binària ara mateix."}.
{"Restore plain text backup immediately:","Restaurar una còpia de seguretat en format de text pla ara mateix:"}.
{"Restore","Restaurar"}.
{"Roles for which Presence is Broadcasted","Rols per als que sí se difon la seua presencia"}.
{"Room Configuration","Configuració de la sala"}.
{"Room creation is denied by service policy","Se t'ha denegat el crear la sala per política del servei"}.
{"Room description","Descripció de la sala:"}.
@@ -316,6 +333,7 @@
{"September","Setembre"}.
{"Server ~b","Servidor ~b"}.
{"Server:","Servidor:"}.
{"Server","Servidor"}.
{"Set message of the day and send to online users","Configurar el missatge del dia i enviar a tots els usuaris"}.
{"Set message of the day on all hosts and send to online users","Escriure missatge del dia en tots els hosts i enviar-ho als usuaris connectats"}.
{"Shared Roster Groups","Grups de contactes compartits"}.
@@ -323,7 +341,7 @@
{"Show Ordinary Table","Mostrar Taula Ordinaria"}.
{"Shut Down Service","Apager el Servei"}.
{"~s invites you to the room ~s","~s et convida a la sala ~s"}.
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Alguns clients Jabber poden emmagatzemar la teva contrasenya al teu ordinador. Fes servir aquesta característica només si saps que el teu ordinador és segur."}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Alguns clients Jabber poden emmagatzemar la teva contrasenya al teu ordinador. Fes servir aquesta característica només si saps que el teu ordinador és segur."}.
{"Specify the access model","Especificar el model d'accés"}.
{"Specify the event message type","Especifica el tipus de missatge d'event"}.
{"Specify the publisher model","Especificar el model del publicant"}.
@@ -357,19 +375,19 @@
{"There was an error changing the password: ","Hi ha hagut un error canviant la contrasenya: "}.
{"There was an error creating the account: ","Hi ha hagut un error creant el compte: "}.
{"There was an error deleting the account: ","Hi ha hagut un error esborrant el compte: "}.
{"This IP address is blacklisted in ~s","Esta adreça IP està a la llista negra en ~s"}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Això no distingeix majúscules de minúscules: macbeth es el mateix que MacBeth i Macbeth."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Aquesta pàgina permet crear un compte Jabber en aquest servidor Jabber. El teu JID (Jabber IDentifier; Identificador Jabber) tindrà aquesta forma: usuari@servidor. Si us plau, llegeix amb cura les instruccions per emplenar correctament els camps."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Aquesta pàgina permet anul·lar el registre d'un compte Jabber en aquest servidor Jabber."}.
{"This participant is kicked from the room because he sent an error message","Aquest participant ha sigut expulsat de la sala perque ha enviat un missatge d'error"}.
{"This participant is kicked from the room because he sent an error message to another participant","Aquest participant ha sigut expulsat de la sala perque ha enviat un missatge erroni a un altre participant"}.
{"This participant is kicked from the room because he sent an error presence","Aquest participant ha sigut expulsat de la sala perque ha enviat un error de presencia"}.
{"This room is not anonymous","Aquesta sala no és anònima"}.
{"Thursday","Dijous"}.
{"Time","Data"}.
{"Time delay","Temps de retard"}.
{"Too many CAPTCHA requests","Massa peticions de CAPTCHA"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Massa autenticacions (~p) han fallat des d'aquesta adreça IP (~s). L'adreça serà desbloquejada en ~s UTC"}.
{"Too many unacked stanzas","Massa missatges sense haver reconegut la seva recepció"}.
{"To","Per a"}.
{"To ~s","A ~s"}.
{"Total rooms","Nombre total de sales"}.
{"Traffic rate limit is exceeded","El llímit de tràfic ha sigut sobrepassat"}.
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","Není povoleno posílat chybové zprávy do konference. Účastník (~s) odeslal chybovou zprávu (~s) a byl vyhozen z konference."}.
{"It is not allowed to send private messages","Je zakázáno posílat soukromé zprávy"}.
{"It is not allowed to send private messages of type \"groupchat\"","Není dovoleno odeslání soukromé zprávy typu \"skupinová zpráva\" "}.
{"It is not allowed to send private messages to the conference","Není povoleno odesílat soukromé zprávy do konference"}.
@@ -172,6 +179,7 @@
{"Listened Ports at ","Otevřené porty na "}.
{"Listened Ports","Otevřené porty"}.
{"List of modules to start","Seznam modulů, které mají být spuštěné"}.
{"Make participants list public","Nastavit seznam účastníků jako veřejný"}.
{"Make room CAPTCHA protected","Chránit místnost pomocí CAPTCHA"}.
@@ -192,13 +200,16 @@
{"Message body","Tělo zprávy"}.
{"Middle Name","Druhé jméno"}.
{"Minimum interval between voice requests (in seconds)","Minimální interval mezi žádostmi o voice práva (v sekundách)"}.
{"Moderator","Moderátor"}.
{"Moderator privileges required","Potřebujete práva moderátora"}.
{"moderators only","moderátorům"}.
{"Modified modules","Aktualizované moduly"}.
{"Module","Modul"}.
{"Modules at ","Moduly na "}.
{"Modules at ~p","Moduly v ~p"}.
{"Modules","Moduly"}.
{"Monday","Pondělí"}.
{"Multicast","Multicast"}.
{"Multi-User Chat","Víceuživatelský chat"}.
{"Name:","Jméno:"}.
{"Name","Jméno"}.
{"Never","Nikdy"}.
@@ -211,8 +222,8 @@
{"No Data","Žádná data"}.
{"Node ID","ID uzlu"}.
{"Node not found","Uzel nenalezen"}.
{"Node ~p","Uzel ~p"}.
{"Nodes","Uzly"}.
{"Node ","Uzel "}.
{"No limit","Bez limitu"}.
{"None","Nic"}.
{"No resource provided","Nebyl poskytnut žádný zdroj"}.
@@ -233,6 +244,7 @@
{"Online Users:","Online uživatelé:"}.
{"Online Users","Online uživatelé"}.
{"Only deliver notifications to available users","Doručovat upozornění jen právě přihlášeným uživatelům"}.
{"Only members may query archives of this room","Pouze moderátoři mají povoleno měnit téma místnosti"}.
{"Only moderators and participants are allowed to change the 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 the subject in this room","Jen moderátoři mají povoleno měnit téma místnosti"}.
{"Only moderators can approve voice requests","Pouze moderátoři mohou schválit žádosti o voice práva"}.
{"Owner privileges required","Jsou vyžadována práva vlastníka"}.
{"Packet","Paket"}.
{"Participant","Účastník"}.
{"Password ~b","Heslo ~b"}.
{"Password:","Heslo:"}.
{"Password","Heslo"}.
@@ -256,9 +268,12 @@
{"Path to File","Cesta k souboru"}.
{"Pending","Čekající"}.
{"Period: ","Čas: "}.
{"Permanent rooms","Stálých konferencí"}.
{"Persist items to storage","Uložit položky natrvalo do úložiště"}.
{"Ping","Ping"}.
{"Please note 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álohována do zabudované databáze Mnesia. Pokud používáte ODBC modul, musíte zálohovat svoji SQL databázi samostatně."}.
{"Please specify file name.","Zvolit jméno souboru."}.
{"Please specify file size.","Zvolit velikost souboru."}.
{"Please, wait for a while before sending new voice request","Prosím, počkejte chvíli před posláním nové žádosti o voice práva"}.
{"Pong","Pong"}.
{"Port ~b","Port ~b"}.
@@ -276,6 +291,7 @@
{"Really delete message of the day?","Skutečně smazat zprávu dne?"}.
{"Recipient is not in the conference room","Příjemce se nenachází v konferenční místnosti"}.
{"Register a Jabber account","Zaregistrujte si účet Jabberu"}.
{"~s invites you to the room ~s","~s vás zve do místnosti ~s"}.
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Někteří klienti umí uložit vaše heslo na disk počítače. Tuto funkci používejte, pouze pokud věříte zabezpečení svého počítače."}.
{"Some Jabber clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Někteří klienti umí uložit vaše heslo na disk počítače. Tuto funkci používejte, pouze pokud věříte zabezpečení svého počítače."}.
{"Specify the access model","Uveďte přístupový model"}.
{"Specify the event message type","Zvolte typ zpráv pro události"}.
{"Specify the publisher model","Specifikovat model pro publikování"}.
@@ -357,19 +375,19 @@
{"There was an error changing the password: ","Při změně hesla došlo k chybě: "}.
{"There was an error creating the account: ","Při vytváření účtu došlo k chybě."}.
{"There was an error deleting the account: ","Při mazání účtu došlo k chybě: "}.
{"This IP address is blacklisted in ~s","IP adresa je blokována na ~s"}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Zde nezáleží na velikosti písmen: macbeth je stejný jako MacBeth a Macbeth."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Na této stránce si můžete vytvořit účet na tomto serveru Jabberu. Vaše JID (Jabber IDentifikátor) bude mít tvar: uživatelskéjméno@server. Přečtěte si prosím pozorně instrukce pro vyplnění údajů."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Zde můžete zrušit registraci účtu na tomto serveru Jabberu."}.
{"This participant is kicked from the room because he sent an error message","Tento účastník byl vyhozen, protože odeslal chybovou zprávu"}.
{"This participant is kicked from the room because he sent an error message to another participant","Tento účastník byl vyhozen, protože odeslal chybovou zprávu jinému účastníkovi"}.
{"This participant is kicked from the room because he sent an error presence","Tento účastník byl vyhozen, protože odeslal chybový status"}.
{"This room is not anonymous","Tato místnost není anonymní"}.
{"Thursday","Čtvrtek"}.
{"Time","Čas"}.
{"Time delay","Časový posun"}.
{"Too many CAPTCHA requests","Přiliš mnoho CAPTCHA žádostí"}.
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Příliš mnoho (~p) chybných pokusů o přihlášení z této IP adresy (~s). Adresa bude zablokována do ~s UTC"}.
{"Too many unacked stanzas","Příliš mnoho nepotvrzených stanz"}.
{"To","Pro"}.
{"To ~s","Pro ~s"}.
{"Total rooms","Celkem konferencí"}.
{"Traffic rate limit is exceeded","Byl překročen limit"}.
{"Unregister a Jabber account","Zrušte registraci účtu Jabberu"}.
{"Unregister","Zrušit registraci"}.
{"Update ","Aktualizovat "}.
{"Update","Aktualizovat"}.
{"Update message of the day (don't send)","Aktualizovat zprávu dne (neodesílat)"}.
{"Update message of the day on all hosts (don't send)","Aktualizovat zprávu dne pro všechny hostitele (neodesílat)"}.
{"Update ~p","Aktualizovat ~p"}.
{"Update plan","Aktualizovat plán"}.
{"Update script","Aktualizované skripty"}.
{"Uptime:","Čas běhu:"}.
@@ -391,14 +409,15 @@
{"User JID","Jabber ID uživatele"}.
{"User Management","Správa uživatelů"}.
{"Username:","Uživatelské jméno:"}.
{"User ~s",""}.
{"Users are not allowed to register accounts so quickly","Je zakázáno registrovat účty v tak rychlém sledu"}.
{"Users Last Activity","Poslední aktivita uživatele"}.
{"Users","Uživatelé"}.
{"User ","Uživatel "}.
{"User","Uživatel"}.
{"Validate","Ověřit"}.
{"vCard User Search","Hledání uživatelů podle vizitek"}.
{"Virtual Hosts","Virtuální hostitelé"}.
{"Visitor","Návštěvník"}.
{"Visitors are not allowed to change their nicknames in this room","Návštěvníkům této místnosti je zakázáno měnit přezdívku"}.
{"Visitors are not allowed to send messages to all occupants","Návštevníci nemají povoleno zasílat zprávy všem účastníkům konference"}.
{"Voice requests are disabled in this conference","Voice žádosti jsou v této konferenci zakázány"}.
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.