Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/nioc/xmpp-bot

XMPP Bot is a tiny little bot making the link between XMPP conversations and webhooks.
https://github.com/nioc/xmpp-bot

chatbot muc webhook webhook-server webhook-service xmpp xmpp-bot

Last synced: 2 months ago
JSON representation

XMPP Bot is a tiny little bot making the link between XMPP conversations and webhooks.

Awesome Lists containing this project

README

        

# XMPP Bot

[![license: AGPLv3](https://img.shields.io/badge/license-AGPLv3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0)
[![GitHub release](https://img.shields.io/github/release/nioc/xmpp-bot.svg)](https://github.com/nioc/xmpp-bot/releases/latest)
[![Build Status](https://api.travis-ci.com/nioc/xmpp-bot.svg?branch=master)](https://app.travis-ci.com/github/nioc/xmpp-bot)
[![Coverage Status](https://coveralls.io/repos/github/nioc/xmpp-bot/badge.svg?branch=master)](https://coveralls.io/github/nioc/xmpp-bot?branch=master)

XMPP Bot is a tiny little bot making the link between XMPP conversations and webhooks.

User ⇄ XMPP client ⇄ XMPP Server ⇄ **XMPP Bot** ⇄ REST API

## Key features

- Call outgoing webhook on XMPP incoming messages from user chat or group chat (Multi-user chat "MUC"),
- Send message templates (with values to apply to variables in that template) to user or room (MUC) on incoming authorized (basic or bearer) webhook.

## Installation

An [Ansible role](/docs/ansible/xmpp-bot/README.md) is provided, but you can also use following commands:

- Install [Node.js](https://nodejs.org/):
```shell
curl -sL https://deb.nodesource.com/setup_10.x | bash -
apt-get install -y nodejs
```

- Install npm:
```shell
npm install npm@latest -g
```

- Clone repository:
```shell
git clone https://github.com/nioc/xmpp-bot.git /usr/local/bin/xmpp-bot/
```

- Install dependency:
```shell
cd /usr/local/bin/xmpp-bot/ && npm install --production
```

- Create run user (optionnal):
```
useradd -r -s /bin/false xmpp-bot
chown xmpp-bot:xmpp-bot /usr/local/bin/xmpp-bot -R
```

- Set [configuration](#configuration) in `/lib/config/config.json` (you can copy `config.json.dist`)

- Add systemd service from [model](/docs/xmpp-bot.service):
```shell
cp docs/xmpp-bot.service /etc/systemd/system/xmpp-bot.service
```

- Update systemd:
```shell
systemctl daemon-reload
```

- Start service:
```shell
systemctl start xmpp-bot
```

- Start service at boot:
```shell
systemctl enable xmpp-bot
```

- Add fail2ban filter from [model](/docs/xmpp-bot.conf) (optionnal):
```shell
cp docs/xmpp-bot.conf /etc/fail2ban/filter.d/xmpp-bot.conf
```
Add the jail (`/etc/fail2ban/jail.local`):
```properties
[xmpp-bot]
enabled = true
port = http,https
filter = xmpp-bot
logpath = /var/log/xmpp-bot/webhook.log
maxretry = 3
bantime = 21600 ; 6 hours
```

## Configuration

### Logger

- `level` log4js level (all < trace < debug < info < warn < error < fatal < mark < off)
- `file`, `console` and `stdout` define log appenders (see [log4js doc](https://log4js-node.github.io/log4js-node/appenders.html))

### Webhooks listener

- `path` and `port` define the listening endpoint
- `ssl` define key and certificat location and port used for exposing in https, make sure that user of the process is allowed to read cert
- `users` is an array of user/password for basic authentication
- `accessLog` define the listener logger

### XMPP Server

- `service` and `domain` define XMPP server
- `username` and `password` define XMPP "bot" user credentials
- `rooms` list rooms (and optionnal password) where bot will listen

### Incoming webhooks (list)

- `path` is the webhook key:a POST request on this path will trigger corresponding `action`
- `action` among enumeration:
- `send_xmpp_message` will send message (`message` in request body) to `destination` (from request body) ; if `destination` is found in `config.xmppServer.rooms` array, message will send as a groupchat). Request exemple:

```http
POST /webhooks/w1 HTTP/1.1
Host: domain.ltd:8000
Content-Type: application/json
Authorization: Basic dXNlcjE6cGFzczE=
Content-Length: 70

{
"destination":"[email protected]",
"message":"Hi, there something wrong."
}
```

- `send_xmpp_template` will send template with merged variables (using JMESPath) to `destination` (user or room if `type` set to `chat` or `groupchat`)

### XMPP hooks (list)

- `room` is the XMPP hook key: an incoming groupchat (or chat) from this room (or this user) will trigger corresponding `action`
- `action` among enumeration:
- `outgoing_webhook` will execute a request to corresponding webhook with `args` as webhook code

## FAQ

- *XMPP server is using a self signed certificate, how can i run service?*
You can allow insecure TLS connections and HTTPS requests by adding `Environment=NODE_TLS_REJECT_UNAUTHORIZED=0` in /usr/lib/systemd/system/xmpp-bot.service.

## Credits

- **[Nioc](https://github.com/nioc/)** - _Initial work_

See also the list of [contributors](https://github.com/nioc/xmpp-bot/contributors) to this project.

This project is powered by the following components:

- [xmpp.js](https://github.com/simple-xmpp/node-simple-xmpp) (ISC)
- [express](https://github.com/expressjs/express) (MIT)
- [body-parser](https://github.com/expressjs/body-parser) (MIT)
- [express-basic-auth](https://github.com/LionC/express-basic-auth) (MIT)
- [morgan](https://github.com/expressjs/morgan) (MIT)
- [jmespath.js](https://github.com/jmespath/jmespath.js) (Apache-2.0)
- [request](https://github.com/request/request) (Apache-2.0)
- [node-cleanup](https://github.com/jtlapp/node-cleanup) (MIT)
- [log4js-node](https://github.com/log4js-node/log4js-node) (Apache-2.0)

## License

This project is licensed under the GNU Affero General Public License v3.0 - see the [LICENSE](LICENSE.md) file for details