From b84f85ba8a1e95b42029520a1a4f4b4b28e3c998 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?=
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. ejabberd is designed to be a rock-solid and feature rich XMPP server. ejabberd is suitable for small deployments, whether they need to be scalable or not, as well as extremely big deployments.
+4.0.1 External
+
+
+
-Ejabberd 2.0.0 beta Developers Guide
Alexey Shchepin
- mailto:alexey@sevcom.net
- xmpp:aleksey@jabber.ru
+
+
-
+
+
+
+Ejabberd 2.0.0b1 Developers Guide
+Alexey Shchepin
+mailto:alexey@sevcom.net
+xmpp:aleksey@jabber.ru
+
+
+
+
+
-I can thoroughly recommend ejabberd for ease of setup –
-Kevin Smith, Current maintainer of the Psi project
-Contents
I can thoroughly recommend ejabberd for ease of setup –
+ Kevin Smith, Current maintainer of the Psi project
+
+
+Contents
+
+
+1 Key Features
+
+
+
+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.
+
+ejabberd is designed to be a rock-solid and feature rich XMPP server.
+
+ejabberd is suitable for small deployments, whether they need to be scalable or not, as well as extremely big deployments.
+
+
+
+1 Key Features
+
-
ejabberd is: -
+
Moreover, ejabberd comes with a wide range of other state-of-the-art features: -
A Jabber domain is served by one or more ejabberd nodes. These nodes can +
Each ejabberd node have following modules: -
This module is the main router of Jabber packets on each node. It routes +
This module routes packets which have a destination domain equal to this server
+manager.
+
+
+
+
This module routes packets to local users. It searches for what user resource
+session manager, else it is processed depending on it's content.
+
+
+
+
This module routes packets to other Jabber servers. First, it checks if an
+the packet is sent to session manager on that node.
+
+
+
+
Each XML stanza is represented as the following tuple: -
XMLElement = {xmlelement, Name, Attrs, [ElementOrCDATA]} +does not exist, then it is opened and registered.
+
+ + +4 Authentication
+ + + +4.0.1 External
+ + + +The external authentication script follows +the erlang port driver API.
+
+That script is supposed to do theses actions, in an infinite loop: +
+#!/usr/bin/python + +import sys +from struct import * + +def from_ejabberd(): + input_length = sys.stdin.read(2) + (size,) = unpack('>h', input_length) + return sys.stdin.read(size).split(':') + +def to_ejabberd(bool): + answer = 0 + if bool: + answer = 1 + token = pack('>hh', 2, answer) + sys.stdout.write(token) + sys.stdout.flush() + +def auth(username, server, password): + return True + +def isuser(username, server): + return True + +def setpass(username, server, password): + return True + +while True: + data = from_ejabberd() + success = False + if data[0] == "auth": + success = auth(data[1], data[2], data[3]) + elif data[0] == "isuser": + success = isuser(data[1], data[2]) + elif data[0] == "setpass": + success = setpass(data[1], data[2], data[3]) + to_ejabberd(success) ++ + +
+XMLElement = {xmlelement, Name, Attrs, [ElementOrCDATA]} Name = string() Attrs = [Attr] Attr = {Key, Val} @@ -183,30 +320,45 @@ does not exist, then it is opened and registered. -5 Module xml
element_to_string(El) -> string()
-El = XMLElement -Returns string representation of XML stanza El.
crypt(S) -> string()
-S = string() ++ + +
element_to_string(El) -> string()
++El = XMLElement +Returns string representation of XML stanza El.
crypt(S) -> string()
++S = string()Returns string which correspond to S with encoded XML special -characters.
remove_cdata(ECList) -> EList
-ECList = [ElementOrCDATA] + characters.
+
+
remove_cdata(ECList) -> EList
++ECList = [ElementOrCDATA] EList = [XMLElement] -EList is a list of all non-CDATA elements of ECList.
get_path_s(El, Path) -> Res
-El = XMLElement +EList is a list of all non-CDATA elements of ECList.
get_path_s(El, Path) -> Res
++El = XMLElement Path = [PathItem] PathItem = PathElem | PathAttr | PathCDATA PathElem = {elem, Name} @@ -215,56 +367,74 @@ PathCDATA = cdata Name = string() Res = string() | XMLElementIf Path is empty, then returns El. Else sequentially -consider elements of Path. Each element is one of: -
{elem, Name}
Name is name of subelement of
-El, if such element exists, then this element considered in
-following steps, else returns empty string.
-{attr, Name}
If El have attribute Name, then
-returns value of this attribute, else returns empty string.
-cdata
Returns CDATA of El.
-get_cdata/1, get_tag_cdata/1 + consider elements of Path. Each element is one of: +
{elem, Name}
Name is name of subelement of
+ El, if such element exists, then this element considered in
+ following steps, else returns empty string.
+ {attr, Name}
If El have attribute Name, then
+ returns value of this attribute, else returns empty string.
+ cdata
Returns CDATA of El.
+ + get_cdata/1, get_tag_cdata/1 get_attr/2, get_attr_s/2 get_tag_attr/2, get_tag_attr_s/2 get_subtag/2 -
parse_element(Str) -> XMLElement | {error, Err}
-Str = string() +
parse_element(Str) -> XMLElement | {error, Err}
++Str = string() Err = term()Parses Str using XML parser, returns either parsed element or error -tuple. -
The module gen_iq_handler
allows to easily write handlers for IQ packets
-of particular XML namespaces that addressed to server or to users bare JIDs.
In this module the following functions are defined: -
add_iq_handler(Component, Host, NS, Module, Function, Type)
-Component = Module = Function = atom() + tuple. +
gen_iq_handler
allows to easily write handlers for IQ packets
+of particular XML namespaces that addressed to server or to users bare JIDs.add_iq_handler(Component, Host, NS, Module, Function, Type)
++Component = Module = Function = atom() Host = NS = string() Type = no_queue | one_queue | parallelRegisters function
Module:Function
as handler for IQ packets on
-virtual host Host
that contain child of namespace NS
in
-Component
. Queueing discipline is Type
. There are at least
-two components defined:
-ejabberd_local
Handles packets that addressed to server JID;
-ejabberd_sm
Handles packets that addressed to users bare JIDs.
-remove_iq_handler(Component, Host, NS)
-Component = atom() + virtual hostHost
that contain child of namespaceNS
in +Component
. Queueing discipline isType
. There are at least + two components defined: +
ejabberd_local
Handles packets that addressed to server JID;
+ ejabberd_sm
Handles packets that addressed to users bare JIDs.
+ remove_iq_handler(Component, Host, NS)
++Component = atom() Host = NS = string()Removes IQ handler on virtual host
Host
for namespace NS
from
-Component
.
-Handler function must have the following type: -
Module:Function(From, To, IQ)
-From = To = jid() -
-module(mod_cputime).
+ Component
.
+
Module:Function(From, To, IQ)
++From = To = jid() +
+-module(mod_cputime). -behaviour(gen_mod). @@ -298,9 +468,14 @@ process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) -> [{"xmlns", ?NS_CPUTIME}], [{xmlelement, "cputime", [], [{xmlcdata, SCPUTime}]}]}]} end. --
-module(mod_echo). ++ + +
+-module(mod_echo). -behaviour(gen_mod). @@ -334,10 +509,10 @@ stop(Host) -> Proc = gen_mod:get_module_proc(Host, ?PROCNAME), Proc ! stop, {wait, Proc}. -+
This document was translated from LATEX by -HEVEA.+HEVEA.