17.5 KB
Newer Older
louiz’'s avatar
louiz’ committed
BIBOUMI 1 "2014-06-02"
louiz’'s avatar
louiz’ committed
2 3 4 5 6


louiz’'s avatar
louiz’ committed
biboumi - XMPP gateway to IRC
louiz’'s avatar
louiz’ committed
8 9 10 11 12 13 14 15


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.

16 17 18 19 20

`biboumi` [`config_filename`]

louiz’'s avatar
louiz’ committed
21 22 23

Available command line options:
louiz’'s avatar
louiz’ committed
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41


  Specify the file to read for configuration. See *CONFIG* section for more
  details on its content.


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.
louiz’'s avatar
louiz’ committed
  For prosody, see
louiz’'s avatar
louiz’ committed
43 44 45 46 47 48 49

`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*.

50 51 52 53 54

  The TCP port to use to connect to the local XMPP component. The default
  value is 5347.

55 56

louiz’'s avatar
louiz’ committed
57 58 59 60
  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.

62 63 64 65

  If this option contains the hostname of an IRC server (for example, then biboumi will enforce the connexion to that IRC
66 67 68 69 70 71 72 73 74 75 76 77 78
  server only.  This means that a JID like "" must
  be used instead of "".  In that
  mode, the virtual channel (see *Connect to an IRC server*) is not
  available and you still need to use the ! separator to send message to an
  IRC user (for example "foo!" to send a message to
  foo), although the in-room JID still work as expected
  ("").  On the other hand, the '%' lose
  any meaning.  It can appear in the JID but will not be interpreted as a
  separator (thus the JID "" points to the
  channel named "#channel%hello" on the configured IRC server) This option
  can for example be used by an administrator that just wants to let their
  users join their own IRC server using an XMPP client, while forbidding
  access to any other IRC server.

80 81 82 83 84 85

 If this option is set to “false” (default is “true”), the users will not be
 able to use the ad-hoc commands that lets them configure their realname and

86 87 88 89 90 91 92 93 94 95 96 97 98

 If this option is set to “true”, the realname and username of each biboumi
 user will be extracted from their JID.  The realname is their bare JID, and
 the username is the node-part of their JID.  Note that if
 `realname_customization` is “true”, each user will still be able to
 customize their realname and username, this option just decides the default
 realname and username.

 If this option is set to “false” (the default value), the realname and
 username of each user will be set to the nick they used to connect to the
 IRC server.

99 100 101

  A filename into which logs are written.  If none is provided, the logs are
louiz’'s avatar
louiz’ committed
  written on standard output.
103 104 105


louiz’'s avatar
louiz’ committed
  Indicate what type of log messages to write in the logs.  Value can be
louiz’'s avatar
louiz’ committed
107 108
  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.

louiz’'s avatar
louiz’ committed
110 111 112 113
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.

louiz’'s avatar
louiz’ committed
114 115 116

louiz’'s avatar
louiz’ committed
117 118 119 120 121
Biboumi acts as a server, it should be run as a daemon that lives in the
background for as long as it is needed.  Note that biboumi does not
daemonize itself, this task should be done by your init system (SysVinit,
systemd, upstart).

louiz’'s avatar
louiz’ committed
When started, biboumi connects, without encryption (see *SECURITY*), to the
louiz’'s avatar
louiz’ committed
123 124 125 126 127
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
louiz’'s avatar
louiz’ committed

louiz’'s avatar
louiz’ committed
When a user joins an IRC channel on an IRC server (see *Join an IRC
louiz’'s avatar
louiz’ committed
130 131 132 133 134 135 136
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.

louiz’'s avatar
louiz’ committed
To cleanly shutdown the component, send a SIGINT or SIGTERM signal to it.
louiz’'s avatar
louiz’ committed
It will send messages to all connected IRC and XMPP servers to indicate a
louiz’'s avatar
louiz’ committed
139 140 141 142
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.
louiz’'s avatar
louiz’ committed

louiz’'s avatar
louiz’ committed
144 145 146
### Addressing

IRC entities are represented by XMPP JIDs.  The domain part of the JID is
louiz’'s avatar
louiz’ committed
147 148 149
the domain served by biboumi (the part after the `@`, in
the examples), and the local part (the part before the `@`) depends on the
concerned entity.
louiz’'s avatar
louiz’ committed

louiz’'s avatar
louiz’ committed
151 152
IRC channels have a local part formed like this:
louiz’'s avatar
louiz’ committed

louiz’'s avatar
louiz’ committed
154 155 156 157
If the IRC channel you want to adress starts with the `'#'` character (or an
other character, announced by the IRC server, like `'&'`, `'+'` 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
158 159
characters, adding an implicit `'#'` in that case.  Biboumi does not do that
because this gets confusing when trying to understand the difference between
louiz’'s avatar
louiz’ committed
160 161 162
the channels *#foo*, and *##foo*. Note that biboumi does not use the
presence of these special characters to identify an IRC channel, only the
presence of the separator `%` is used for that.
louiz’'s avatar
louiz’ committed

louiz’'s avatar
louiz’ committed
The channel name can also be empty (for example ``), in that
louiz’'s avatar
louiz’ committed
165 166 167
case this represents the virtual channel provided by biboumi.  See *Connect
to an IRC server* for more details.

168 169 170 171 172 173 174 175
There is two ways to address an IRC user, using a local part like this:
or by using the in-room address of the participant, like this:

The second JID is available only to be compatible with XMPP clients when the
user wants to send a private message to the participant `Nickname` in the
room ``.

louiz’'s avatar
louiz’ committed
177 178 179 180 181
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.

182 183 184 185 186 187
Also note that some IRC nicknames may contain characters that are not
allowed in the local part of a JID (for example '@').  If you need to send a
message to a nick containing such a character, you have to use a jid like
``, because the JID
`AnnoyingNickn@me!` would not work.

louiz’'s avatar
louiz’ committed
188 189 190 191 192 193

  `` is the #foo IRC channel, on the IRC server, and this is served by the biboumi instance on

louiz’'s avatar
louiz’ committed
  `toto!` is the IRC user named toto, or
louiz’'s avatar
louiz’ committed
195 196 197 198 199 200
  TotO, etc.

  `` is the IRC server

  `` is the virtual channel provided by
  biboumi, for the IRC server
louiz’'s avatar
louiz’ committed

louiz’'s avatar
louiz’ committed
202 203 204 205 206 207 208 209 210 211 212 213 214 215
Note: Some JIDs are valid but make no sense in the context of

  `!` is the empty-string nick on the server. It makes no sense to try to send messages to it.

  ``, or any other JID that does not contain an
  IRC server is invalid. Any message to that kind of JID will trigger an
  error, or will be ignored.

If compiled with Libidn, an IRC channel participant 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. It cannot be used to contact that user using biboumi.
louiz’'s avatar
louiz’ committed
216 217 218 219 220 221

### Join an IRC channel

To join an IRC channel `#foo` on the IRC server ``,
join the XMPP MUC ``.

222 223 224 225 226 227 228
### 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
louiz’'s avatar
louiz’ committed
``.  For example if you want to join the
channel `#foo` on the server ``, but you need to authenticate
louiz’'s avatar
louiz’ committed
231 232 233
to a bot of the server before you’re allowed to join it, you can first join
the room `` (this will effectively
connect you to the IRC server without joining any room), then send your
authentication message to the user `bot!`
louiz’'s avatar
louiz’ committed
and finally join the room ``.

louiz’'s avatar
louiz’ committed
237 238 239 240 241 242
### 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
louiz’'s avatar
louiz’ committed
243 244
displayed in your XMPP client may not be the same than the order on other
IRC users’.
louiz’'s avatar
louiz’ committed

louiz’'s avatar
louiz’ committed
246 247 248 249 250 251 252
### List channels

You can list the IRC channels on a given IRC server by sending an XMPP disco
items request on the IRC server JID.  The number of channels on some servers
is huge, and biboumi does not (yet) support result set management (XEP 0059)
so the result stanza may be very big.

louiz’'s avatar
louiz’ committed
253 254 255 256
### 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
louiz’'s avatar
louiz’ committed
different from XMPP where a user can have a different nick on each MUC,
louiz’'s avatar
louiz’ committed
258 259 260 261 262 263 264 265 266 267 268 269
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
louiz’'s avatar
louiz’ committed
as toto on the channel #bar (as long as these two channels are on the same
271 272 273
IRC server).  By default you will receive private messages from the “global”
user (aka nickname!, unless you
previously sent a message to an in-room participant (something like
louiz’'s avatar
louiz’ committed
\, in which case future
messages from that same user will be received from that same “in-room” JID.
louiz’'s avatar
louiz’ committed
276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307

### 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

### 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
louiz’'s avatar
louiz’ committed
308 309
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
louiz’'s avatar
louiz’ committed
310 311 312
circumvent this problem, biboumi provides a raw notification when modes are
changed, and lets the user change the modes directly.

louiz’'s avatar
louiz’ committed
313 314 315 316 317 318
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.
louiz’'s avatar
louiz’ committed
319 320 321 322 323 324 325 326

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:

louiz’'s avatar
louiz’ committed
327 328 329 330

  Sets the participant’s role to `moderator` and its affiliation to `owner`.

331 332 333 334

  Sets the participant’s role to `moderator` and its affiliation to `owner`.

louiz’'s avatar
louiz’ committed
335 336

  Sets the participant’s role to `moderator` and its affiliation to  `admin`.
louiz’'s avatar
louiz’ committed

louiz’'s avatar
louiz’ committed

  Sets the participant’s role to `moderator` and its affiliation to  `member`.
louiz’'s avatar
louiz’ committed
342 343 344


  Sets the participant’s role to `participant` and its affiliation to `member`.
louiz’'s avatar
louiz’ committed

347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368
Similarly, when a biboumi user changes some participant's affiliation or role, biboumi translates that in an IRC mode change.

Affiliation set to `none`

  Sets mode to -vhoaq

Affiliation set to `member`

  Sets mode to +v-hoaq

Role set to `moderator`

  Sets mode to +h-oaq

Affiliation set to `admin`

  Sets mode to +o-aq

Affiliation set to `owner`

  Sets mode to +a-q

louiz’'s avatar
louiz’ committed
369 370 371 372 373 374 375 376 377
### 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.

378 379 380 381 382 383 384
  - disconnect-user: Only available to the administrator. The user provides
    a list of JIDs, and a quit message. All the selected 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.
louiz’'s avatar
louiz’ committed

louiz’'s avatar
louiz’ committed
386 387 388 389 390 391 392 393 394 395 396 397 398 399
### Raw IRC messages

Biboumi tries to support as many IRC features as possible, but doesn’t
handle everything yet (or ever).  In order to let the user send any
arbitrary IRC message, biboumi forwards any XMPP message received on an IRC
Server JID (see *ADDRESSING*) as a raw command to that IRC server.

For example, to WHOIS the user Foo on the server, a user can
send the message “WHOIS Foo” to “”.

The message will be forwarded as is, without any modification appart from
adding "\r\n" at the end (to make it a valid IRC message).  You need to have
a little bit of understanding of the IRC protocol to use this feature.

louiz’'s avatar
louiz’ committed
400 401 402

403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428
The connection to the XMPP server can only be made on localhost.  The
XMPP server is not supposed to accept non-local connections from components.
Thus, encryption is not used to connect to the local XMPP server because it
is useless.

If compiled with the Botan library, biboumi can use TLS when communicating
with the IRC serveres.  It will first try ports 6697 and 6670 and use TLS if
it succeeds, if connection fails on both these ports, the connection is
established on port 6667 without any encryption.

Biboumi 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

Note if you use a biboumi that you have no control on: 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.  Only use
biboumi if you trust its administrator (or, better, if you are the
administrator) or if you don’t intend to have any private conversation.

Biboumi does not 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 trusted users.
louiz’'s avatar
louiz’ committed
429 430 431 432


louiz’'s avatar
louiz’ committed
433 434 435 436 437 438
This software and man page are both written by Florent Le Coz.


Biboumi is released under the zlib license.