Instant messaging server for the Extensible Messaging and Presence Protocol (XMPP).

jackal

An XMPP server written in Go.

Build Status Go Report Card Godoc Releases LICENSE Docker Pulls Join the chat at https://gitter.im/jackal-im/jackal

About

jackal is a free, open-source, high performance XMPP server which aims to be known for its stability, simple configuration and low resource consumption.

Features

jackal supports the following features:

  • Customizable
  • Enforced SSL/TLS
  • Stream compression (zlib)
  • Database connectivity for storing offline messages and user settings (PostgreSQL 9.5+)
  • Clustering capabilities (ectd 3.4+)
  • Expose prometheus metrics
  • Cross-platform (OS X, Linux)

Installing

Getting Started

To start using jackal, install Go 1.16+ and run the following commands:

$ go get -d github.com/ortuman/jackal
$ cd $GOPATH/src/github.com/ortuman/jackal
$ make install installctl

This will fetch the code and install jackal and jackalctl binaries into your $GOPATH/bin path.

By default the application will try to locate service configuration at config.yaml, but alternatively you can specify a custom configuration path either through command line.

$ jackal --config=/your-custom-path/your-config.yaml

or environment variable:

$ env JACKAL_CONFIG_FILE=/your-custom-path/your-config.yaml jackal

PostgreSQL database creation

Create a user and a database for that user:

CREATE ROLE jackal WITH LOGIN PASSWORD 'password';
CREATE DATABASE jackal;
GRANT ALL PRIVILEGES ON DATABASE jackal TO jackal;

Download lastest version of the PostgreSQL schema from jackal Github repository.

wget https://raw.githubusercontent.com/ortuman/jackal/master/sql/postgres.up.psql

Run the postgres script file to create database schema:

psql --user jackal --password -f sql/postgres.up.psql

Configure jackal to use PostgreSQL by editing the configuration file:

storage:
  type: pgsql
  pgsql:
    host: 127.0.0.1:5432
    user: jackal
    password: password
    database: jackal

That's it!

Your database is now ready to connect with jackal.

Creating jackal user

After completing database setup you will have to register a new user to be able to login. To do so, you can use jackal command-line tool to create a new user proving name and password.

jackalctl user add <user>:<password>

Clustering

The purpose of clustering is to be able to use several servers for fault-tolerance and scalability.

Since jackal is a distributed system, it needs a distributed data store like etcd to share its state across the entire cluster.

To properly run jackal in clustering mode make sure to add a cluster section configuration in each of your service nodes.

Here's an example of how this section should look like:

cluster:
  etcd:
    endpoints:
      - http://:
      - http://:
      ...
  port: your-cluster-node-port # default is 14369

Note the defined port value will be used to perform cluster node communication, so make sure is reachable within your internal network.

Server extensibility

The purpose of the extensibility framework is to provide an interface between jackal server and third-party external modules, thus offering the possibility of extending the functionality of the service for particular use cases. Extensibility API is almost exclusively based on gRPC and its definition can be at jackal proto definitions repository.

Here's a list of all extendable server components:

Run jackal in Docker

The Docker deployment framework supports easy installation and configuration of jackal server.

You need to have Docker installed on your system before you can use a jackal Docker image. See Install Docker for instructions.

Download the jackal Docker image from the official Docker Hub library with this command:

docker pull ortuman/jackal:latest

Start a new jackal Docker container with custom configuration.

docker run --name=jackal \
   --mount type=bind,src=/path-on-host-machine/my-custom-config.yaml,dst=/jackal/config.yaml \
   -d ortuman/jackal:latest

Supported Specifications

Join and Contribute

The jackal developer community is vital to improving jackal future releases.

Contributions of all kinds are welcome: reporting issues, updating documentation, fixing bugs, improving unit tests, sharing ideas, and any other tips that may help the jackal community.

Code of Conduct

Help us keep jackal open and inclusive. Please read and follow our Code of Conduct.

Licensing

jackal is licensed under the Apache 2 License. See LICENSE for the full license text.

Contact

If you have any suggestion or question:

Miguel Ángel Ortuño, JID: [email protected], email: [email protected]

Owner
Miguel Ángel Ortuño
Miguel Ángel Ortuño
Comments
  • Server does not send enough data per packet

    Server does not send enough data per packet

    testable on wormhole.chat

    There seems to be a bug in the way the server sends stanzas, often it sends only small parts of a stanza

    <
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    iq
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    type
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    ="
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    result
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    "
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    id
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    ="
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    72bfa1e8-7cfe-45ae-a9d8-bc25a6fd551b
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    "
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    from
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    ="
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    [email protected]
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    "
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    to
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    ="
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    [email protected]/gajim.4JHK9BLI
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    "
    _____________
    
  • error code 503 on sending the message

    error code 503 on sending the message

    This was spotted on Xabber client, when two buddies communicate. From certain point only one of them is able to send the messages , the other one is getting error and cannot send any more message. Subscription is both,both in the DB.

    error-503-red-cross.txt

    Still cannot reproduce what possibly could cause this issue.

  • XEP-0045 - Multi-User Chat support (#58)

    XEP-0045 - Multi-User Chat support (#58)

    Specification described in XEP-0045 Implementation notes:

    • no support for the legacy groupchat 1.0 protocol
    • no chat logging or chat history available on the server side
    • no explicit room nickname reservation or registering with a room (any occupant with affiliation is automatically registered and the nickname is reserved)
    • no timer for the instant room creation (client has to either explicitly create an instant room or create a reserved room)
    • no support for adding admins and owners through the room configuration form (it is messy and error prone)
  • Why Jackal? Why a new XMPP Server

    Why Jackal? Why a new XMPP Server

    Hello everyone, I am searching for a xmpp server for my new project. And I just want to know the reason why you decide to create a new XMPP server even if there are already good existing one. I am just starting with xmpp so I am not an expert.

    What is the advantage of Jackal in comparison to the others like ejabberd or openfire?

    Thanks in advance.

  • s2s lookup error

    s2s lookup error

    jackal can't find a server, even though dig shows it resolves correctly.

    2019-03-11 23:51:42 💥 [ERR] s2s/server:94 - lookup _xmpp-server._tcp.riotcat.org on 9.9.9.9:53: no such host
    
    # dig riotcat.org
    
    ; <<>> DiG 9.10.3-P4-Debian <<>> riotcat.org
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59702
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;riotcat.org.			IN	A
    
    ;; ANSWER SECTION:
    riotcat.org.		3586	IN	A	87.106.127.220
    
    ;; Query time: 0 msec
    ;; SERVER: 9.9.9.9#53(9.9.9.9)
    ;; WHEN: Mon Mar 11 23:52:57 UTC 2019
    ;; MSG SIZE  rcvd: 56
    

    The error is consistent, I can't get any kind of connection to that server at all.

    This isn't a global issue, I can successfully connect to other servers and send messages to users on them. According to compliance.conversations.im, the remote server is running Prosody 0.11.

    Then when I was checking logs for more errors, I found that a server I can successfully communicate on is also returning the same error occasionally (2019-03-12 01:54:52 💥 [ERR] s2s/server:94 - lookup _xmpp-server._tcp.chat.404.city on 9.9.9.9:53: no such host). The remote server with the intermittent error is running ejabberd 18.12.1-2~bpo9+1.

    Maybe it's something I can tweak in the config? s2s section of jackal.yml is the same as in the example:

    s2s:
        dial_timeout: 15
        dialback_secret: s3cr3tf0rd14lb4ck
        max_stanza_size: 131072
    
        transport:
          bind_addr: 0.0.0.0
          port: 5269
          keep_alive: 600
    
  • Failing build due to changed dependency

    Failing build due to changed dependency

    The build is currently failing due to a checksum mismatch:

    verifying github.com/jackal-xmpp/[email protected]: checksum mismatch
            downloaded: h1:xhx6XS5VLqgMQec0qp0yQE53+9dttsL7SjQKBXnJmcQ=
            go.sum:     h1:zwcW3PwR6uF9h52myAPNQt5YmbyuIpDvyDStUobclOc=
    
  • Please add SCRAM-SHA-512(-PLUS) again and there is the SCRAM-SHA3-512(-PLUS)

    Please add SCRAM-SHA-512(-PLUS) again and there is the SCRAM-SHA3-512(-PLUS)

    Following the removal of SCRAM-SHA-512(-PLUS), I request you the addition and there is SCRAM-SHA3-512(-PLUS) in the same time.

    SCRAM-SHA-512(-PLUS):

    • https://tools.ietf.org/html/draft-melnikov-scram-sha-512

    SCRAM-SHA3-512(-PLUS):

    • https://tools.ietf.org/html/draft-melnikov-scram-sha3-512
  • Support for PostgreSQL

    Support for PostgreSQL

    This makes jackal work with PostgreSQL, but it's far from perfect. It's a bunch of switch statements in places where database-specific queries are needed. While this should be ok-ish for now, I see a need for a bigger overhaul of the storage code to better support multiple database engines. I'd be happy to discuss and work on this some more.

  • Update the logo

    Update the logo

    I have seen a beautiful logo but the XMPP logo has been updated last year, can you update it too? https://github.com/ortuman/jackal/blob/master/doc/gopher.png

    Source: https://commons.wikimedia.org/wiki/File:XMPP_logo.svg

  • how to manage users from an external script ?

    how to manage users from an external script ?

    I would like to use an external server to provide authentication. Is there builtin support in jackal for any of these protocols? If not, has this been attempted before?

    If managing authentication externally is not feasible I was thinking of creating a php script exposing an HTTP API on the jackal server for the other server to manage users (create/disable/enable/set password).

    What is the best way to tackle this without heavy modifications to both systems?

    Thanks

  • Track dependencies with dep

    Track dependencies with dep

    Makes it easier for developers to get started, plus makes sure we're all working with the same version of every dependency.

    Simply use dep ensure when you pull in a change of Gopkg.lock.

  • Add development section to README

    Add development section to README

    Checklist
    • [x] documentation is changed or added

    Description of change

    Improved README adding a development section.

    The idea is to use this section to present knowledge helping user to contribute to the codebase.

  • Docker-compose doesn't work

    Docker-compose doesn't work

    • Version: 0.62.3
    • Platform: Ubuntu 20.04
    • Docker Version: 20.10.19
    • Docker-compose Version: 1.29.1

    docker-compose doesn't work out of the box.

    Running the command sudo docker-compose -f dockerfiles/docker-compose.yml up the jackal service fails to start with this log message

    jackal_1  | exec ./wait-for-it.sh: exec format error
    
  • Digging into logger configuration

    Digging into logger configuration

    • Version: 0.63.2

    The file config/example.config.yaml presents a section about logger

    #logger:
    #  level: "debug"
    #  output_path: "jackal.log"
    

    Looking the source code output_path configuration is not present.

    In the code the part about logger configuration is here https://github.com/ortuman/jackal/blob/4d04d68f95d1fa5191d50ccf8104bbab31d7103b/pkg/jackal/config.go#L45

    In detail this struct

    type LoggerConfig struct {
    	Level  string `fig:"level" default:"debug"`
    	Format string `fig:"format"`
    }
    

    and it defines a format field never used.

    Is this situation a typo? What the code should do ?

  • VoIP

    VoIP

    A VoIP feature would be very useful.

    Is your feature request related to a problem? Please describe. I am looking for a XMPP server in Go which has both instant messaging and VoIP feature to create a full scale communication app.

    Describe the solution you'd like A VoIP feature would be great. This would enable voice chatting on Jackal as well.

    Describe alternatives you've considered We could potentially try using SIP to handle all data transfer. And also add voice/video chat as well.

Instant messaging platform. Backend in Go. Clients: Swift iOS, Java Android, JS webapp, scriptable command line; chatbots
Instant messaging platform. Backend in Go. Clients: Swift iOS, Java Android, JS webapp, scriptable command line; chatbots

Tinode Instant Messaging Server Instant messaging server. Backend in pure Go (license GPL 3.0), client-side binding in Java, Javascript, and Swift, as

Jan 6, 2023
An XMPP client with OTR support

xmpp-client setup go get github.com/agl/xmpp-client (If you don't have Go already installed then see below.) xmpp-client use xmpp-client is a simple

Sep 3, 2022
Scalable real-time messaging server in language-agnostic way
Scalable real-time messaging server in language-agnostic way

Centrifugo is a scalable real-time messaging server in language-agnostic way. Centrifugo works in conjunction with application backend written in any

Jan 1, 2023
Berty is a secure peer-to-peer messaging app that works with or without internet access, cellular data or trust in the network
Berty is a secure peer-to-peer messaging app that works with or without internet access, cellular data or trust in the network

?? Berty is a secure peer-to-peer messaging app that works with or without internet access, cellular data or trust in the network Introduction Berty i

Dec 29, 2022
Async peer communication protocol & library
Async peer communication protocol & library

Gotalk exists to make it easy for programs to talk with one another over the internet, like a web app coordinating with a web server, or a bunch of programs dividing work amongst each other.

Jan 5, 2023
A simple server for sending and receiving messages in real-time per WebSocket. (Includes a sleek web-ui)
A simple server for sending and receiving messages in real-time per WebSocket. (Includes a sleek web-ui)

A simple server for sending and receiving messages in real-time per WebSocket. (Includes a sleek web-ui)

Jan 9, 2023
Self hosted live chat server written in Go

goch is a self-hosted live-chat server written in Go. It allows you to run a live-chat software on your own infrastructure. You can create multip

Dec 11, 2022
Simple TCP-based chat server

hub-server Simple TCP-based chat server. Client can be found: https://github.com/alankritjoshi/hub-client Setup go run server.go 1234 How it works Use

Oct 25, 2021
command-line tool to publish, subscribe, and process messages for AMQP 0.9.1 compliant message brokers

Bunny A BSD licenced, go-powered CLI tool for publishing and subscribing to RabbitMQ

Sep 11, 2021
A basic presence tracker, that sends messages when the provided user's presence changed, written with discordgo

presenceTracker A basic presence tracker, that sends messages when the provided user's presence changed, written with discordgo Just put the User ID t

Oct 12, 2022
Fluux XMPP is a Go XMPP library, focusing on simplicity, simple automation, and IoT.

Fluux XMPP is a Go XMPP library, focusing on simplicity, simple automation, and IoT. The goal is to make simple to write simple XMPP client

Dec 14, 2022
纯Go编写的IM,完全自定义协议的高性能即时通讯服务(High-performance instant messaging service with fully customizable protocol)
纯Go编写的IM,完全自定义协议的高性能即时通讯服务(High-performance instant messaging service with fully customizable protocol)

LiMaoIM (Everything so easy) This project is a simple and easy to use, powerful performance, simple design concept instant messaging service, fully cu

Dec 5, 2022
Open-IM-Server is open source instant messaging Server.Backend in Go.
Open-IM-Server is open source instant messaging Server.Backend in Go.

Open-IM-Server Open-IM-Server: Open source Instant Messaging Server Instant messaging server. Backend in pure Golang, wire transport protocol is JSON

Jan 2, 2023
Open-IM-Server is open source instant messaging Server.Backend in Go.
Open-IM-Server is open source instant messaging Server.Backend in Go.

Open-IM-Server is open source instant messaging Server.Backend in Go.

Dec 31, 2022
Instant messaging platform. Backend in Go and Client in Flutter

Seemer Messaging Server Instant messaging server. Backend in pure Go (license GPL 3.0), client-side binding in Flutter as well as gRPC client support

Nov 28, 2022
Instant messaging platform. Backend in Go. Clients: Swift iOS, Java Android, JS webapp, scriptable command line; chatbots
Instant messaging platform. Backend in Go. Clients: Swift iOS, Java Android, JS webapp, scriptable command line; chatbots

Tinode Instant Messaging Server Instant messaging server. Backend in pure Go (license GPL 3.0), client-side binding in Java, Javascript, and Swift, as

Jan 6, 2023
An XMPP server written in Go (Golang).

jackal An XMPP server written in Go. About jackal is a free, open-source, high performance XMPP server which aims to be known for its stability, simpl

Dec 29, 2022
CoreRAD is an extensible and observable IPv6 Neighbor Discovery Protocol router advertisement daemon. Apache 2.0 Licensed.
CoreRAD is an extensible and observable IPv6 Neighbor Discovery Protocol router advertisement daemon. Apache 2.0 Licensed.

CoreRAD CoreRAD is an extensible and observable IPv6 Neighbor Discovery Protocol router advertisement daemon. Apache 2.0 Licensed. To get started with

Nov 14, 2022
Bridge between mattermost, IRC, gitter, xmpp, slack, discord, telegram, rocketchat, twitch, ssh-chat, zulip, whatsapp, keybase, matrix, microsoft teams, nextcloud, mumble, vk and more with REST API
Bridge between mattermost, IRC, gitter, xmpp, slack, discord, telegram, rocketchat, twitch, ssh-chat, zulip, whatsapp, keybase, matrix, microsoft teams, nextcloud, mumble, vk and more with REST API

bridge between mattermost, IRC, gitter, xmpp, slack, discord, telegram, rocketchat, twitch, ssh-chat, zulip, whatsapp, keybase, matrix, microsoft teams, nextcloud, mumble, vk and more with REST API (mattermost not required!)

Jan 4, 2023
Powered by Matterbridge, MatterAMXX is a plugin for AMXX that allows simple bridging between your game servers, Mattermost, IRC, XMPP, Gitter, Slack, Discord, Telegram, and more.
Powered by Matterbridge, MatterAMXX is a plugin for AMXX that allows simple bridging between your game servers, Mattermost, IRC, XMPP, Gitter, Slack, Discord, Telegram, and more.

Powered by Matterbridge, MatterAMXX is a plugin for AMXX that allows simple bridging between your game servers, Mattermost, IRC, XMPP, Gitter, Slack, Discord, Telegram, and more.

Dec 27, 2022