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

Overview

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]

Issues
  • 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::::
    _____________
    "
    _____________
    
    pending-response pending to fix 
    opened by lovetox 10
  • 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.

    opened by readyblue 10
  • 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.

    opened by JusticeN 9
  • 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)
    feature-request on-hold 
    opened by mmalesev 8
  • 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
    
    bug pending-response 
    opened by waveletlet 7
  • 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=
    
    opened by SamWhited 6
  • 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
    opened by Neustradamus 6
  • 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.

    opened by robzon 6
  • 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

    pending to fix 
    opened by Neustradamus 6
  • 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

    feature-request 
    opened by beppe9000 5
  • 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.

    opened by stevenroose 5
  • Support tls-exporter channel binding type

    Support tls-exporter channel binding type

    Checklist
    • [x] make test passes
    • [x] tests and/or benchmarks are included
    • [x] documentation is changed or added

    Affected core subsystem(s)

    • pkg/c2s
    • pkg/auth
    • pkg/transport

    Description of change

    This adds support for the tls-exporter channel binding type defined in the upcoming RFC 9266 (the RFC is not yet published, but at this stage only last minute editorial changes can be made and it is scheduled for publication). This enables channel binding support for TLS >= 1.3.

    EDIT: The RFC has been published.

    opened by SamWhited 4
  • send file/picture feature

    send file/picture feature

    Hi All

    I'd like to have the feature of sending picture or file to the chat session. Is there anybody working on this feature? Do you know which XEP we should implement for that?

    Thanks,Xu

    feature-request 
    opened by xu4wang 1
Releases(v0.61.0)
Owner
Miguel Ángel Ortuño
Miguel Ángel Ortuño
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

Tinode 9.1k Aug 1, 2022
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

Adam Langley 365 Jun 26, 2022
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

Centrifugal 6.3k Aug 4, 2022
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

Berty Technologies 5.8k Aug 1, 2022
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.

Rasmus 1.1k Jul 31, 2022
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)

Gotify 7.6k Aug 6, 2022
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

Emir Ribić 160 Jul 6, 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

Alankrit Joshi 0 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

SkunkWerks GmbH 3 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

Çağan 3 Jul 25, 2021
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

Fluux 271 Aug 4, 2022
纯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

null 133 Jul 12, 2022
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

OpenIM Corporation 8.8k Aug 2, 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.

OpenIM Corporation 8.8k Aug 4, 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

Mohammad Javad Hossieni 2 Dec 20, 2021
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

Tinode 9.1k Aug 1, 2022
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

Miguel Ángel Ortuño 1.3k Jul 27, 2022
A Discord bot for managing ephemeral roles based upon voice channel member presence.

ephemeral-roles A Discord bot for managing ephemeral roles based upon voice channel member presence. Quickstart Click on the Ephemeral Roles logo head

Eric Wohltman 64 Aug 2, 2022
tidal discord rich presence for windows

discordtidal Remember when Discord added a Spotify integration and all of your friends started having fun with it, but then being the weirdo you are,

Nick 12 Jun 1, 2022
A discord rich presence for MPD

mpdrp mpdrp is a Discord Rich Presence for the music application, MPD. It supports any platform that Discord supports, although I don't test on OSX, t

null 3 Aug 5, 2022
Discord rich presence for MPRIS music players.

Clematis Discord rich presence for MPRIS music players. Clematis provides a rich presence for MPRIS-supported music players. It will take information

sammyette 19 Jul 23, 2022
Multi-platform presence sharing

What's My Status? What's my status? is a command line utility that allows you to set your status on multiple platforms at once. Installation To instal

Jordan Garrison 2 May 18, 2022
Discord Rich Presence for MPD written in Go

mpdcord Installation Builds mpdcord locally and places the binary at $GOPATH/bin

null 3 Apr 15, 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 (mattermost not required!)

Wim 5k Jul 29, 2022
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.

Gabriel Iggy N. 9 May 21, 2022
A golang package to communicate with HipChat over XMPP

hipchat This is a abstraction in golang to Hipchat's implementation of XMPP. It communicates over TLS and requires zero knowledge of XML or the XMPP p

Dane Harrigan 110 Jan 12, 2022
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

Adam Langley 365 Jun 26, 2022
A golang package to communicate with HipChat over XMPP

hipchat This is a abstraction in golang to Hipchat's implementation of XMPP. It communicates over TLS and requires zero knowledge of XML or the XMPP p

Dane Harrigan 110 Jan 12, 2022
Gofra - Gofra, an XMPP bot engine written in Go

Gofra, an XMPP bot engine Gofra is a tiny XMPP bot engine written in Go. As of n

Xavi 2 Jul 13, 2022