Skip to content

DinoThor/PyJabber

Repository files navigation

PyJabber

Python 3.8 to 3.12

Build Status Coverage Status Documentation Status Monthly downloads Total downloads

PyJabber is a server for Jabber/XMPP entirely written in Python, with minimal reliance on external libraries.
It strives to provide a simple, lightweight, and comprehensible codebase, featuring a modular structure that facilitates extension through the implementation of necessary XEPs for specific use cases.
While initially designed to fulfill the requirements of the multi-agent system SPADE, it can be easily customized to suit any other purpose.

Installation

pip install pyjabber

Quick start

Python program

The process of starting the server returns a coroutine, leaving it to the user to set up the required environment. The simplest approach is to use the asyncio.run function.

from pyjabber import Server

my_server = Server()
asyncio.run(my_server.start())

This allows PyJabber to be treated as a regular task and integrated seamlessly into an asynchronous application.

import asyncio
from pyjabber.server import Server

async def counter():
  while True:
    await asyncio.sleep(1)
    print(f"Hello World")

async def launch():
  my_server = Server()
  await asyncio.gather(my_server.start(), counter())

asyncio.run(launch())

CLI

The CLI launcher provides access to all the configuration options available in the programmatic version (when launched from a Python script).

$ pyjabber --help
Usage: pyjabber [OPTIONS]

Options:
  --host TEXT                Host name  [default: localhost]
  --client_port INTEGER      Server-to-client port  [default: 5222]
  --server_port INTEGER      Server-to-server port  [default: 5269]
  --server_out_port INTEGER  Server-to-server port (Out coming connection)
                             [default: 5269]
  --family [ipv4|ipv6]       (ipv4 / ipv6)  [default: ipv4]
  --tls1_3                   Enables TLSv1_3
  --timeout INTEGER          Timeout for connection  [default: 60]
  --database_path TEXT       Path for database file  [default: Current workdir]
  --database_purge           Restore database file to default state (empty)
  -v, --verbose              Show verbose debug level: -v level 1, -vv level
                             2, -vvv level 3, -vvvv level 4
  --log_path TEXT            Path to log dumpfile
  -D, --debug                Enables debug mode in Asyncio
  --help                     Show this message and exit.

And to launch a default profile

$ pyjabber
2024-12-18 09:03:22.880 - INFO: Starting server...
2024-12-18 09:03:22.881 - INFO: Client domain => localhost
2024-12-18 09:03:22.881 - INFO: Server is listening clients on [('127.0.0.1', 5222), ('158.42.155.44', 5222)]
2024-12-18 09:03:22.881 - INFO: Serving admin webpage on http://localhost:9090
2024-12-18 09:03:22.881 - INFO: Server is listening servers on [('0.0.0.0', 5269)]
2024-12-18 09:03:22.881 - INFO: Server started...

Features

  Status Description
TLS Implemented v1.2 + v1.3. Localhost certificate included
SASL Implemented PLAIN, EXTERNAL (s2s)
Roster Implemented CRUD avaliable
Presence Implemented (local bound) Subscribe, Unsubscribed, Initial presence and Unavailable

Plugins

  Status Description
XEP-0004 IMPLEMENTED Dataforms
XEP-0030 IMPLEMENTED Service Discovery
XEP-0060 IMPLEMENTED Pubsub
XEP-0077 IMPLEMENTED In Band Registration
XEP-0199 IMPLEMENTED Ping