Instant
Messaging with Jabber
Chris Josephes
Instant messaging, unlike email, is designed to facilitate immediate
communication. Client programs maintain a connection to the server,
so the chances of messages being spooled on an intermediary server
is unlikely. Most email environments consider message delivery within
five days as an acceptable timeframe (given the possibility of failures
on intermediary servers), and even when the message is finally delivered,
there is no expected timeframe as to when the message will actually
be read. Instant messaging is designed to only spool the message
if the recipient is not connected to the server, and most client
programs immediately alert the user when incoming messages arrive.
Instant messaging (IM) systems also include presence notification.
When users log on to their instant messaging servers, the servers
immediately update the online status of the users. This can help
users determine whether message recipients will be able to quickly
respond. Users can also manually set their availability status and
provide profile information in a user directory for other users
to view.
Addtionally, instant messaging applications usually use a chat-window
interface for communication between users. Once a communication
is started between two people, there is no need to issue reply commands
or to re-enter the address of the other user. One window or screen
contains a running transcript of a conversation between users.
In the corporate environment, the biggest benefit of instant messaging
is response time. A manager can communicate in real time with his
employees, find out whether business associates are reachable, organize
contacts into groups, and alert other users of his own availability.
It is best suited to quick running conversations that are relatively
short, but would involve multiple messages going back and forth
if done by traditional email.
The most popular instant messaging systems may be better described
as online services that are offered to customers for free or for
a low monthly fee. Using the instant messaging services of an outside
provider is like moving your internal email systems to Hotmail.
Most corporations aren't comfortable trusting their instant
messaging needs to an outside service for several reasons including:
- Security -- All IM traffic between employees would go outside
the corporate Internet connection to a central IM server and would
probably all be in plain text. No one likes the idea of risking
the exposure of company communications or files to possible packet
sniffers. Furthermore, with proprietary instant messaging services,
you may not be immediately aware of any security flaws the application
may have.
- No administration control -- If your provider's IM
servers go down, then you are relying on their administration
policies and procedures, in addition to their terms of service.
- Interoperability -- Instant messaging between different
systems is clunky at best, and some of the systems even try to
ensure that outside providers can't access their systems.
- Namespace control -- Because most of the major providers
claim more than a million users, it would be impossible to implement
a consistent user-naming scheme. For example, for the user "John
Adams", the userid "jadams" is already taken, and
so is "jadams1", and you would have to repeat the process
until you reach "jadams73".
- Client availability -- Some users run Windows, some run
Mac OS X, and some run UNIX. The chosen system would need to support
all platforms.
- User Privacy -- With buddy list searching, you risk exposing
your employee names in a public database any user could scan,
and with no namespace control, your users could expose internal
data.
- Provider Stability -- Will your chosen instant messaging
provider be in business a year from now?
Given these considerations, an internal instant messaging server
would be ideal. It should allow corporate employee to administer,
control the user accounts, keep all local traffic to the internal
network, and handle the different clients in the corporate environment.
Additionally, the system should ideally be free or at least inexpensive.
One platform that meets these requirements for instant messaging
is Jabber. Jabber is an open-source system that provides what users
expect in an instant messaging environment: messaging, presence
notification, user rosters, and ease of use. It also addresses security,
privacy, and central management issues. Jabber has an open-source
server available for UNIX, and several clients for a variety of
platforms including Windows, UNIX, Mac, and Java. Programming libraries
for Jabber are available in C++, Java, and Perl, so you can create
custom software that can incorporate Jabber features.
The principle of Jabber's design is to function as an XML
stream routing System and instant messaging happened to be the first
major application of its use. Because the protocol is based on XML,
it can be easily extended to add more features as necessary.
How Jabber Works
When users set up accounts on a Jabber server, their full Jabber
Identifier (or JID) is the handle they have chosen tied to the host
FQDN (just like email addresses). When user J. Adams signs onto
the server, his JID could be jadams@chat.example.com. Incoming
messages to "jadams" are addressed to that JID, and outgoing
messages use the JID as the "from" address.
A JID also contains a resource identifier at the end, such as
jadams@chat.example.com/laptop. This way, J. Adams can be
logged onto the server multiple times and the server will know which
client session to route the message to. The resource identifier
can be anything the users want it to be. Users usually set it to
a string that identifies their computers or what client programs
they are using. Most user clients are smart enough to automatically
append the correct resource to a JID, so end users don't need
to keep track of them.
End users can also communicate with other remote Jabber users
through server-to-server communication. If jadams@chat.example.com,
needs to communicate with bjones@chat.demo.com, the messages
are routed through the two servers.
Another aspect of server-to-server communication involves the
gateway abilities of Jabber. By compiling additional transport libraries,
the Jabber server can act as a gateway to other IM systems, such
as AOL, Yahoo, MSN, or even an IRC server. The local Jabber server
passes on the sign-on data to the remote service and tunnels traffic
from the user client to the outside server.
Communication Protocol
Almost everything Jabber does involves an XML stream or file.
When a Jabber client sends a message to the server, the contents
of the transmission look something like this:
<message to="bjones@chat.demo.com" from="jadams@chat.example.com">
<subject>Chip Pricing</subject>
<body>
Can you send me bulk pricing information on the Motorola MVIP302?
</body>
</message>
When J. Adams sends this message, it goes to his local Jabber server,
and from there is routed to the chat.demo.com server.
The protocol has three top-level XML elements: <message>
for communication between two JIDs, <presence> for
the exchange of availability information, and <iq>
for structured information exchanges that don't involve presence
or messages (such as authentication).
Jabber clients connect to the server using TCP port 5222. If you
do not have a Jabber client available, it is possible to connect
to the port using the telnet command and sending an XML stream
manually.
Installing Jabber
The latest version of the Jabber server is 1.4.1, which can be
downloaded from http://www.jabber.org. Before you download
it, be sure the following is installed on your system:
1. GNU make
2. The GNU Pthreads Library
3. The OpenSSL Library (if SSL encryption is desired)
The configuration and build of Jabber is relatively straightforward.
Run configure, then run gmake, and the system is ready.
When you build Jabber, keep your source directory intact. There
are always new shared libraries being created for Jabber, such as
gateway transports or authentication mechanisms. When you build
additional shared modules for your Jabber server, the Makefile
usually wants to read the platform-settings file that contains
the settings information on how your Jabber server was compiled.
The installation of the Jabber server may be different from other
software packages you have worked with before. There is no gmake
install process, and the documentation says that Jabber can
simply run from the directory in which it was compiled.
In reality, the Jabber server expects to run from the directory
it was compiled in because that directory gets passed as a macro
to the C compiler. When Jabber works with relative file paths, it
uses the compilation directory as a base path, even if the jabberd
executable is moved after compilation.
If you prefer to keep your source code and running software directories
separate, you can do one of the following:
1. Edit the configure script, and change JHOME='pwd'
to JHOME='/opt/jabber (or the final destination you
choose),
or
2. Run jabberd with the -H /opt/jabber command-line
option.
When you finish the build process, you will have one jabberd
executable, and five shared modules (dialback.so, dnsrv.so,
jsm.so, pthsock_client.so, and xdb_file.so).
An installed Jabber server will need a directory structure:
$ ls -lF /opt/jabber
dr-xr-x--- 2 jabber jabber 512 Sep 23 15:37 bin/
dr-xr-x--- 3 jabber jabber 512 Sep 23 11:42 etc/
dr-xr-x--- 2 jabber jabber 512 Sep 23 11:16 libexec/
drwxr-x--- 2 jabber jabber 512 Sep 23 11:42 logs/
drwxr-x--- 2 jabber jabber 512 Sep 30 07:53 run/
drwxr-x--- 4 jabber jabber 512 Sep 23 11:37 spool/
The directory permissions are not mandatory, but the example shows
how the layout can be hardened to prevent local untrusted users. If
you expect a high number of user profiles on your server, you may
want to move spool to /var/spool/jabber so your /opt
partition doesn't get out of hand. Here is what the directories
are used for:
bin/ jabberd binary,
etc/ config file(s), SSL keyfile(s)
libexec/ shared libraries
run/ pidfile
spool/ server and user data files
Jabber does not need any root privileges. It uses high-numbered TCP
ports, and it only writes to files under the server directory in which
it runs. To secure the Jabber server, create a separate high-numbered
UID/GID. Make your Jabber directory and all files beneath it owned
by this UID/GID.
If you later decide to compile new shared libraries (such as the
conferencing module, or the Yahoo transport), build the library
in your source directory, copy the shared library file to your server
directory, and make any necessary changes to your configuration
file.
DNS Setup
A simple Jabber server running basic client-server chatting will
require a host entry set up in DNS. A single A record like chat.example.com
or jabber.example.com will work.
Additional services may require additional A records, or CNAME
records that point back to the same host. Some Jabber transports
or modules are given a different hostname (such as msn.example.com
for the MSN gateway transport, or conference.example.com
for the conferencing module). This way, the server knows which module
needs to handle the incoming XML stream. The Jabber protocol is
similar to HTTP/1.1 because the server looks at the hostname passed
within the data itself, and not necessarily the destination IP of
the socket connection.
Configuration
Jabber uses a configuration file in XML format (see Listing 1).
A sample configuration file is included with the server distribution.
Most administrators use this file as a template and edit it to suit
their needs.
The root node of the file is the <jabber> element,
which contains all other nodes in the configuration. Underneath
<jabber> are the <service>, <io>,
<xdb>, <log>, and <pidfile>
elements. The example XML file with this article includes an overview
of each section of the file, and what most of the XML tags are responsible
for configuring.
The most common error in the jabber configuration file is invalid
XML markup. If the server fails to properly start up, and the error
message is non-specific, try running the server in debug mode with
the -D flag. If that doesn't provide enough information,
run the config file through an XML parser.
Administration
Most Jabber administration involves the setup of user accounts
or services running on the server. All of these tasks can be done
by hand, or in some cases, can be performed from a Jabber client.
The configuration file lets you define which JIDs belong to administrators
so you can receive administration notifications and send special
messages to special internal JIDs.
Startup/Shutdown
A simple startup/shutdown script must be written and placed in
the appropriate startup directory for the system. You can restart
the server by sending the HUP signal to the jabberd process,
but there are two drawbacks (as of version 1.4.1):
1. All users are logged off as the system restarts.
2. If the pidfile from the previous run still exists, jabberd
will complain and shut down immediately. The file must be removed
before sending the HUP signal.
The only real need to restart the server occurs when you make
a change in the config file or rotate any logfiles the process
writes to. Depending on your traffic levels, you may be able to
get by with a really long log rotation period (one week or more).
Spool File Modification
Local users on the server have an XML-formatted file containing
their client settings and roster information. Under the spool/
directory is a directory for each Jabber server (named by the FQDN
defined in the configuration file), and then each user information
file. Other services (e.g., like the Jabber User Directory) may
create other directories under spool/.
When Jabber needs to read a file, it keeps the data in memory,
so changes you make to a file won't be read until the server
is restarted. If you don't want to restart the server, the
alternative is to put a <timeout></timeout> element
under the <xdb_file> tag. The timeout element contains
a single integer that refers to the number of seconds the server
waits before it re-reads a file in the spool/ directory.
A timeout value of 0 means the server will never cache the data.
Sending Server-Wide Messages
There are four special JIDs an administrator can send a message
to:
[hostname]/announce/motd -- Announce the message of
the day.
[hostname]/announce/motd/update -- Update the MOTD,
and only send the update to users that haven't seen it.
[hostname]/announce/motd/delete -- Delete the MOTD.
[hostname]/announce/online -- Send to all current local
online users.
A Jabber administer of chat.example.com would address the
message to chat.example.com/announce/online to communicate
with all online users. Some Jabber clients won't allow a message
recipient that doesn't contain a "[user]@" in the JID.
In that case, you must use a client that will let you send raw XML
streams (such as WinJab), or develop a program that will send the
XML for you.
Jabber as an Admin Notification Tool
Most systems or network administrators have set up their environments
so they are automatically notified by email or pager when important
system events occur, such as when snmp traps are encountered or
when remote systems are no longer responsive. Depending on the seriousness
of the notification, Jabber may be better than email for relaying
important information. When programs such as Swatch send out an
email message, they usually pipe their standard output to Sendmail
or Qmail. Thus, the MTA is responsible for delivery of what could
be a very important notification. If the mail spool of that MTA
is already heavily loaded, or if the delivery of the message fails
due to the misconfiguration of another machine, the entire notification
process fails.
One alternative is to create a Jabber client program that can
send the message. Listing 2 is a Perl script that uses the Net::Jabber
modules to read the standard input and send a message to the JID
specified on the command line. It connects to the defined Jabber
server using an account set up explicitly for this program. It can
be used to send a quick Jabber message from the command line, or
it can be modified to be used in conjunction with the pipe
option in the swatch configuration file.
You can use this example to create even more complex clients,
such as a bot capable of receiving messages from users, or
a program that sends out mass broadcasts to users listed in its
internal roster. For more information, read the perldocs included
with the Net::Jabber modules.
Additional Resources
The Jabber user community is continually growing. Jabber Inc.
is busy forming partnerships for their commercial server, and there
is a large group of open-source contributors volunteering their
time to creating clients, documenting the protocol, and developing
the product.
The best resource for Jabber information is http://www.jabber.org,
which contains information on the server setup, the Jabber protocol,
and a CVS repository for the server and transport code. The Web
site http://www.jabbercentral.com is an advocacy site, listing
the latest news regarding Jabber and a list of user client programs.
The Jabber Inc. Web site is at http://www.jabber.com.
There is also a mailing list for Jabber administration at jadmin@jabber.org.
Archives of the list can be found at http://mailman.jabber.org/listinfo/jadmin.
If your Jabber server is working properly, you can log into the
jdev conference room on the server conference.jabber.org.
Conclusion
It may be early to speculate on the future of instant messaging,
but sooner or later large enterprises are going to have to decide
how they will bring this service to their users. In the past, the
only alternatives were internal groupware applications or the giant
public IM services offered by ISPs. Jabber is currently the only
solution that offers the advantages of an internal and external
system. Another benefit is that it's an open protocol that
has the backing of a corporation working to sell Jabber solutions
to large companies.
Some administrators reading this probably remember a time when
they had to deal with closed proprietary email environments. Jabber,
however, provides a system that has both the potential to become
a major standard in IM protocols, and has the backing of a large
existing user base.
Chris Josephes is currently self-employed as a systems engineer
in Minneapolis, Minnesota. He can be reached at: cpj1@visi.com.
|