301 lines
12 KiB
Markdown
301 lines
12 KiB
Markdown
BIBOUMI 1 "2014-06-02"
|
||
======================
|
||
|
||
NAME
|
||
----
|
||
|
||
biboumi - XMPP gateway to IRC
|
||
|
||
SYNOPSIS
|
||
--------
|
||
|
||
`biboumi` [`config_filename`]
|
||
|
||
DESCRIPTION
|
||
-----------
|
||
|
||
Biboumi is an XMPP gateway that connects to IRC servers and translates
|
||
between the two protocols. It can be used to access IRC channels using any
|
||
XMPP client as if these channels were XMPP MUCs.
|
||
|
||
OPTIONS
|
||
-------
|
||
|
||
Available options:
|
||
|
||
`config_filename`
|
||
|
||
Specify the file to read for configuration. See *CONFIG* section for more
|
||
details on its content.
|
||
|
||
CONFIG
|
||
------
|
||
|
||
The configuration file uses a simple format of the form
|
||
`"option=value"`. Here is a description of each possible option:
|
||
|
||
`hostname` (mandatory)
|
||
|
||
The hostname served by the XMPP gateway. This domain must be configured in
|
||
the XMPP server as an external component. See the manual for your XMPP
|
||
server for more information.
|
||
|
||
`password` (mandatory)
|
||
|
||
The password used to authenticate the XMPP component to your XMPP server.
|
||
This password must be configured in the XMPP server, associated with the
|
||
external component on *hostname*.
|
||
|
||
`admin`
|
||
|
||
The bare JID of the gateway administrator. This JID will have more
|
||
privileges than other standard users (the admin thus needs to check their
|
||
privileges), for example some administration ad-hoc commands will only be
|
||
available to that JID.
|
||
|
||
`log_file`
|
||
|
||
A filename into which logs are written. If none is provided, the logs are
|
||
written on standard output.
|
||
|
||
`log_level`
|
||
|
||
Indicate what type of log messages to write in the logs. Value can be
|
||
from 0 to 3. 0 is debug, 1 is info, 2 is warning, 3 is error. The
|
||
default is 0, but a more practical value for production use is 1.
|
||
|
||
The configuration can be re-read at runtime (you can for example change the
|
||
log level without having to restart biboumi) by sending SIGUSR1 or SIGUSR2
|
||
(see kill(1)) to the process.
|
||
|
||
USAGE
|
||
-----
|
||
|
||
When started, biboumi connects, without encryption (see *SECURITY*), to the
|
||
local XMPP server on the port `5347` and authenticates with the provided
|
||
password. Biboumi then serves the configured `hostname`: this means that
|
||
all XMPP stanza with a `to` JID on that domain will be forwarded to biboumi
|
||
by the XMPP server, and biboumi will only send messages coming from that
|
||
hostname.
|
||
|
||
When a user joins an IRC channel on an IRC server (see *Join an IRC
|
||
channel*), biboumi connects to the remote IRC server, sets the user’s nick
|
||
as requested, and then tries to join the specified channel. If the same
|
||
user subsequently tries to connect to an other channel on the same server,
|
||
the same IRC connection is used. If, however, an other user wants to join
|
||
an IRC channel on that same IRC server, biboumi opens a new connection to
|
||
that server. Biboumi connects once to each IRC server, for each user on it.
|
||
|
||
To cleanly shutdown the component, send a SIGINT or SIGTERM signal to it.
|
||
It will send messages to all connected IRC and XMPP servers to indicate a
|
||
reason why the users are being disconnected. Biboumi exits when the end of
|
||
communication is acknowledged by all IRC servers. If one or more IRC
|
||
servers do not respond, biboumi will only exit if it receives the same
|
||
signal again or if a 2 seconds delay has passed.
|
||
|
||
### Addressing
|
||
|
||
IRC entities are represented by XMPP JIDs. The domain part of the JID is
|
||
the domain served by biboumi, and the local part depends on the concerned
|
||
entity.
|
||
|
||
IRC channels and IRC users JIDs have a localpart formed like this:
|
||
`name`, the `'%'` separator and the `irc_server`.
|
||
|
||
If the IRC channel you want to adress starts with the `'#'` character (or
|
||
less frequently, but still valid, one of `'&'`, `'+'` or `'!'`), then you
|
||
must include it in the JID. Some other gateway implementations, as well as
|
||
some IRC clients, do not require them to be started by one of these
|
||
characters, adding an implicit `'#'` in that case. Biboumi does not do that
|
||
because this gets confusing when trying to understand the difference between
|
||
the channels *foo*, *#foo*, and *##foo*.
|
||
|
||
On XMPP, the node part of the JID can only be lowercase. On the other hand,
|
||
IRC nicknames are case-insensitive, this means that the nicknames toto,
|
||
Toto, tOtO and TOTO all represent the same IRC user. This means you can
|
||
talk to the user toto, and this will work.
|
||
|
||
Examples:
|
||
|
||
`#foo%irc.example.com@biboumi.example.com` is the #foo IRC channel, on the
|
||
irc.example.com IRC server, and this is served by the biboumi instance on
|
||
biboumi.example.com
|
||
|
||
`toto.example.com@biboumi.example.com` is the IRC user named toto, or TotO, etc.
|
||
|
||
If compiled with Libidn, an IRC user has a bare JID representing the
|
||
“hostname” provided by the IRC server. This JID can only be used to set IRC
|
||
modes (for example to ban a user based on its IP), or to identify user.
|
||
|
||
### Join an IRC channel
|
||
|
||
To join an IRC channel `#foo` on the IRC server `irc.example.com`,
|
||
join the XMPP MUC `#foo%irc.example.com@hostname`.
|
||
|
||
### Connect to an IRC server
|
||
|
||
The connection to the IRC server is automatically made when the user tries
|
||
to join any channel on that IRC server. The connection is closed whenever
|
||
the last channel on that server is left by the user. To be able to stay
|
||
connected to an IRC server without having to be in a real IRC channel,
|
||
biboumi provides a virtual channel on the jid
|
||
`%irc.example.com@biboumi.example.com`. For example if you want to join the
|
||
channel `#foo` on the server `irc.example.com`, but you need to authenticate
|
||
to a bot of the server before you’re allowed to join it, you can first join
|
||
the room `%irc.example.com@biboumi.example.com` (this will effectively
|
||
connect you to the IRC server without joining any room), then send your
|
||
authentication message to the user `bot%irc.example.com@biboumi.example.com"
|
||
and finally join the room `#foo%irc.example.com@biboumi.example.com`.
|
||
|
||
### Channel messages
|
||
|
||
On XMPP, unlike on IRC, the displayed order of the messages is the same for
|
||
all participants of a MUC. Biboumi can not however provide this feature, as
|
||
it cannot know whether the IRC server has received and forwarded the
|
||
messages to other users. This means that the order of the messages
|
||
displayed in your XMPP client may not be the same than the order on other
|
||
IRC users’.
|
||
|
||
### Nicknames
|
||
|
||
On IRC, nicknames are server-wide. This means that one user only has one
|
||
single nickname at one given time on all the channels of a server. This is
|
||
different from XMPP where a user can have a different nick on each MUC,
|
||
even if these MUCs are on the same server.
|
||
|
||
This means that the nick you choose when joining your first IRC channel on a
|
||
given IRC server will be your nickname in all other channels that you join
|
||
on that same IRC server.
|
||
If you explicitely change your nickname on one channel, your nickname will
|
||
be changed on all channels on the same server as well.
|
||
|
||
### Private messages
|
||
|
||
Private messages are handled differently on IRC and on XMPP. On IRC, you
|
||
talk directly to one server-user: toto on the channel #foo is the same user
|
||
as toto on the channel #bar (as long as these two channels are on the same
|
||
IRC server). Using biboumi, there is no way to receive a message from a
|
||
room participant (from a jid like
|
||
#test%irc.example.com@biboumi.example.com/nickname). Instead, private
|
||
messages are received from and sent to the user (using a jid like
|
||
nickname%irc.example.com@biboumi.example.com).
|
||
|
||
### Notices
|
||
|
||
Notices are received exactly like private messages. It is not possible to
|
||
send a notice.
|
||
|
||
### Kicks and bans
|
||
|
||
Kicks are transparently translated from one protocol to another. However
|
||
banning an XMPP participant has no effect. To ban an user you need to set a
|
||
mode +b on that user nick or host (see *MODES*) and then kick it.
|
||
|
||
### Encoding
|
||
|
||
On XMPP, the encoding is always `UTF-8`, whereas on IRC the encoding of
|
||
each message can be anything.
|
||
|
||
This means that biboumi has to convert everything coming from IRC into UTF-8
|
||
without knowing the encoding of the received messages. To do so, it checks
|
||
if each message is UTF-8 valid, if not it tries to convert from
|
||
`iso_8859-1` (because this appears to be the most common case, at least
|
||
on the channels I visit) to `UTF-8`. If that conversion fails at some
|
||
point, a placeholder character `'�'` is inserted to indicate this
|
||
decoding error.
|
||
|
||
Messages are always sent in UTF-8 over IRC, no conversion is done in that
|
||
direction.
|
||
|
||
### IRC modes
|
||
|
||
One feature that doesn’t exist on XMPP but does on IRC is the `modes`.
|
||
Although some of these modes have a correspondance in the XMPP world (for
|
||
example the `+o` mode on a user corresponds to the `moderator` role in
|
||
XMPP), it is impossible to map all these modes to an XMPP feature. To
|
||
circumvent this problem, biboumi provides a raw notification when modes are
|
||
changed, and lets the user change the modes directly.
|
||
|
||
To change modes, simply send a message starting with “`/mode`” followed by
|
||
the modes and the arguments you want to send to the IRC server. For example
|
||
“/mode +aho louiz”. Note that your XMPP client may interprete messages
|
||
begining with “/” like a command. To actually send a message starting with
|
||
a slash, you may need to start your message with “//mode” or “/say /mode”,
|
||
depending on your client.
|
||
|
||
When a mode is changed, the user is notified by a message coming from the
|
||
MUC bare JID, looking like “Mode #foo [+ov] [toto tutu]”. In addition, if
|
||
the mode change can be translated to an XMPP feature, the user will be
|
||
notified of this XMPP event as well. For example if a mode “+o toto” is
|
||
received, then toto’s role will be changed to moderator. The mapping
|
||
between IRC modes and XMPP features is as follow:
|
||
|
||
`+q`
|
||
|
||
Sets the participant’s role to `moderator` and its affiliation to `owner`.
|
||
|
||
`+a`
|
||
|
||
Sets the participant’s role to `moderator` and its affiliation to `owner`.
|
||
|
||
`+o`
|
||
|
||
Sets the participant’s role to `moderator` and its affiliation to `admin`.
|
||
|
||
`+h`
|
||
|
||
Sets the participant’s role to `moderator` and its affiliation to `member`.
|
||
|
||
`+v`
|
||
|
||
Sets the participant’s role to `participant` and its affiliation to `member`.
|
||
|
||
### Ad-hoc commands
|
||
|
||
Biboumi supports a few ad-hoc commands, as described in the XEP 0050.
|
||
|
||
- ping: Just respond “pong”
|
||
|
||
- hello: Provide a form, where the user enters their name, and biboumi
|
||
responds with a nice greeting.
|
||
|
||
- disconnect-user: Available to the administrator only. The user provides
|
||
a list of JIDs, and a quit message. All these users are disconnected
|
||
from all the IRC servers to which they were connected, using the
|
||
provided quit message. Sending SIGINT to biboumi is equivalent to using
|
||
this command by selecting all the connected JIDs and using the “Gateway
|
||
shutdown” quit message, except that biboumi does not exit when using
|
||
this ad-hoc command.
|
||
|
||
SECURITY
|
||
--------
|
||
|
||
Biboumi does not provide any encryption mechanism: connection to the XMPP
|
||
server MUST be made on localhost. The XMPP server is not supposed to accept
|
||
non-local connection from components, thus encryption is useless. IRC
|
||
SSL/TLS is also not yet implemented.
|
||
|
||
Biboumi also does not check if the received JIDs are properly formatted
|
||
using nodeprep. This must be done by the XMPP server to which biboumi is
|
||
directly connected.
|
||
|
||
Remember that the administrator of the gateway you use is able to view all
|
||
your IRC conversations, whether you’re using encryption or not. This is
|
||
exactly as if you were running your IRC client on someone else’s server.
|
||
|
||
Biboumi does not yet provide a way to ban users from connecting to it, has
|
||
no protection against flood or any sort of abuse that your users may cause
|
||
on the IRC servers. Some XMPP server however offer the possibility to
|
||
restrict what JID can access a gateway. Use that feature if you wish to
|
||
grant access to your biboumi instance only to a list of users.
|
||
|
||
AUTHORS
|
||
-------
|
||
|
||
This software and man page are both written by Florent Le Coz.
|
||
|
||
LICENSE
|
||
-------
|
||
|
||
Biboumi is released under the zlib license.
|