2019-06-08 10:16:20 -07:00
|
|
|
# Fluux XMPP
|
2015-12-29 02:49:43 -08:00
|
|
|
|
2019-11-29 08:13:18 -08:00
|
|
|
[![GoDoc](https://godoc.org/gosrc.io/xmpp?status.svg)](https://godoc.org/gosrc.io/xmpp) [![GoReportCard](https://goreportcard.com/badge/gosrc.io/xmpp)](https://goreportcard.com/report/fluux.io/xmpp) [![Coverage Status](https://coveralls.io/repos/github/FluuxIO/go-xmpp/badge.svg?branch=master)](https://coveralls.io/github/FluuxIO/go-xmpp?branch=master)
|
2016-02-15 09:39:12 -08:00
|
|
|
|
2018-01-01 09:12:33 -08:00
|
|
|
Fluux XMPP is a Go XMPP library, focusing on simplicity, simple automation, and IoT.
|
2015-12-29 02:49:43 -08:00
|
|
|
|
2019-06-18 00:01:07 -07:00
|
|
|
The goal is to make simple to write simple XMPP clients and components:
|
2015-12-29 02:49:43 -08:00
|
|
|
|
|
|
|
- For automation (like for example monitoring of an XMPP service),
|
2015-12-29 02:52:02 -08:00
|
|
|
- For building connected "things" by plugging them on an XMPP server,
|
2019-07-27 16:50:41 -07:00
|
|
|
- For writing simple chatbot to control a service or a thing,
|
2019-06-29 06:15:09 -07:00
|
|
|
- For writing XMPP servers components.
|
|
|
|
|
|
|
|
The library is designed to have minimal dependencies. For now, the library does not depend on any other library.
|
|
|
|
|
2019-07-15 03:18:35 -07:00
|
|
|
## Configuration and connection
|
|
|
|
|
|
|
|
### Allowing Insecure TLS connection during development
|
|
|
|
|
|
|
|
It is not recommended to disable the check for domain name and certificate chain. Doing so would open your client
|
|
|
|
to man-in-the-middle attacks.
|
|
|
|
|
|
|
|
However, in development, XMPP servers often use self-signed certificates. In that situation, it is better to add the
|
|
|
|
root CA that signed the certificate to your trusted list of root CA. It avoids changing the code and limit the risk
|
|
|
|
of shipping an insecure client to production.
|
|
|
|
|
|
|
|
That said, if you really want to allow your client to trust any TLS certificate, you can customize Go standard
|
|
|
|
`tls.Config` and set it in Config struct.
|
|
|
|
|
|
|
|
Here is an example code to configure a client to allow connecting to a server with self-signed certificate. Note the
|
|
|
|
`InsecureSkipVerify` option. When using this `tls.Config` option, all the checks on the certificate are skipped.
|
|
|
|
|
|
|
|
```go
|
|
|
|
config := xmpp.Config{
|
|
|
|
Address: "localhost:5222",
|
|
|
|
Jid: "test@localhost",
|
2019-10-01 01:59:55 -07:00
|
|
|
Credential: xmpp.Password("Test"),
|
|
|
|
TLSConfig: tls.Config{InsecureSkipVerify: true},
|
2019-07-15 03:18:35 -07:00
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2019-06-29 06:15:09 -07:00
|
|
|
## Supported specifications
|
|
|
|
|
|
|
|
### Clients
|
|
|
|
|
|
|
|
- [RFC 6120: XMPP Core](https://xmpp.org/rfcs/rfc6120.html)
|
|
|
|
- [RFC 6121: XMPP Instant Messaging and Presence](https://xmpp.org/rfcs/rfc6121.html)
|
|
|
|
|
|
|
|
### Components
|
|
|
|
|
2019-06-18 06:16:19 -07:00
|
|
|
- [XEP-0114: Jabber Component Protocol](https://xmpp.org/extensions/xep-0114.html)
|
|
|
|
- [XEP-0355: Namespace Delegation](https://xmpp.org/extensions/xep-0355.html)
|
|
|
|
- [XEP-0356: Privileged Entity](https://xmpp.org/extensions/xep-0356.html)
|
2015-12-29 02:52:02 -08:00
|
|
|
|
2020-01-09 06:33:11 -08:00
|
|
|
### Extensions
|
|
|
|
- [XEP-0060: Publish-Subscribe](https://xmpp.org/extensions/xep-0060.html)
|
|
|
|
Note : "6.5.4 Returning Some Items" requires support for [XEP-0059: Result Set Management](https://xmpp.org/extensions/xep-0059.html),
|
|
|
|
and is therefore not supported yet.
|
|
|
|
- [XEP-0004: Data Forms](https://xmpp.org/extensions/xep-0004.html)
|
|
|
|
- [XEP-0050: Ad-Hoc Commands](https://xmpp.org/extensions/xep-0050.html)
|
|
|
|
|
2019-11-04 07:36:45 -08:00
|
|
|
## Package overview
|
|
|
|
|
|
|
|
### Stanza subpackage
|
2019-06-29 05:53:14 -07:00
|
|
|
|
2019-06-29 06:09:05 -07:00
|
|
|
XMPP stanzas are basic and extensible XML elements. Stanzas (or sometimes special stanzas called 'nonzas') are used to
|
|
|
|
leverage the XMPP protocol features. During a session, a client (or a component) and a server will be exchanging stanzas
|
|
|
|
back and forth.
|
2019-06-29 05:53:14 -07:00
|
|
|
|
2019-06-29 06:09:05 -07:00
|
|
|
At a low-level, stanzas are XML fragments. However, Fluux XMPP library provides the building blocks to interact with
|
|
|
|
stanzas at a high-level, providing a Go-friendly API.
|
2019-06-29 05:53:14 -07:00
|
|
|
|
2019-06-29 06:09:05 -07:00
|
|
|
The `stanza` subpackage provides support for XMPP stream parsing, marshalling and unmarshalling of XMPP stanza. It is a
|
|
|
|
bridge between high-level Go structure and low-level XMPP protocol.
|
2019-06-29 05:53:14 -07:00
|
|
|
|
2019-06-29 06:09:05 -07:00
|
|
|
Parsing, marshalling and unmarshalling is automatically handled by Fluux XMPP client library. As a developer, you will
|
|
|
|
generally manipulates only the high-level structs provided by the stanza package.
|
2019-06-29 05:53:14 -07:00
|
|
|
|
2019-06-29 06:09:05 -07:00
|
|
|
The XMPP protocol, as the name implies is extensible. If your application is using custom stanza extensions, you can
|
|
|
|
implement your own extensions directly in your own application.
|
2019-06-29 05:53:14 -07:00
|
|
|
|
2019-06-29 06:09:05 -07:00
|
|
|
To learn more about the stanza package, you can read more in the
|
|
|
|
[stanza package documentation](https://github.com/FluuxIO/go-xmpp/blob/master/stanza/README.md).
|
2019-06-29 05:53:14 -07:00
|
|
|
|
2019-11-04 07:36:45 -08:00
|
|
|
### Router
|
|
|
|
|
|
|
|
TODO
|
|
|
|
|
|
|
|
### Getting IQ response from server
|
|
|
|
|
|
|
|
TODO
|
|
|
|
|
2019-06-18 06:01:21 -07:00
|
|
|
## Examples
|
2019-06-07 07:33:10 -07:00
|
|
|
|
2019-06-18 06:01:21 -07:00
|
|
|
We have several [examples](https://github.com/FluuxIO/go-xmpp/tree/master/_examples) to help you get started using
|
|
|
|
Fluux XMPP library.
|
|
|
|
|
|
|
|
Here is the demo "echo" client:
|
2019-06-07 07:33:10 -07:00
|
|
|
|
|
|
|
```go
|
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"log"
|
|
|
|
"os"
|
|
|
|
|
|
|
|
"gosrc.io/xmpp"
|
2019-06-26 08:14:52 -07:00
|
|
|
"gosrc.io/xmpp/stanza"
|
2019-06-07 07:33:10 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
config := xmpp.Config{
|
2019-10-29 06:39:58 -07:00
|
|
|
TransportConfiguration: xmpp.TransportConfiguration{
|
|
|
|
Address: "localhost:5222",
|
|
|
|
},
|
2019-06-07 07:33:10 -07:00
|
|
|
Jid: "test@localhost",
|
2020-01-09 06:33:11 -08:00
|
|
|
Credential: xmpp.Password("test"),
|
2019-06-29 05:58:59 -07:00
|
|
|
StreamLogger: os.Stdout,
|
2019-06-07 07:33:10 -07:00
|
|
|
Insecure: true,
|
2020-01-09 06:33:11 -08:00
|
|
|
// TLSConfig: tls.Config{InsecureSkipVerify: true},
|
2019-06-07 07:33:10 -07:00
|
|
|
}
|
|
|
|
|
2019-06-18 03:37:16 -07:00
|
|
|
router := xmpp.NewRouter()
|
2019-06-22 02:29:47 -07:00
|
|
|
router.HandleFunc("message", handleMessage)
|
2019-06-18 03:37:16 -07:00
|
|
|
|
2020-01-09 06:33:11 -08:00
|
|
|
client, err := xmpp.NewClient(config, router, errorHandler)
|
2019-06-07 07:33:10 -07:00
|
|
|
if err != nil {
|
|
|
|
log.Fatalf("%+v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// If you pass the client to a connection manager, it will handle the reconnect policy
|
|
|
|
// for you automatically.
|
2019-06-18 03:37:16 -07:00
|
|
|
cm := xmpp.NewStreamManager(client, nil)
|
|
|
|
log.Fatal(cm.Run())
|
|
|
|
}
|
2019-06-07 07:33:10 -07:00
|
|
|
|
2019-06-26 08:14:52 -07:00
|
|
|
func handleMessage(s xmpp.Sender, p stanza.Packet) {
|
|
|
|
msg, ok := p.(stanza.Message)
|
2019-06-18 03:37:16 -07:00
|
|
|
if !ok {
|
|
|
|
_, _ = fmt.Fprintf(os.Stdout, "Ignoring packet: %T\n", p)
|
|
|
|
return
|
2019-06-07 07:33:10 -07:00
|
|
|
}
|
2019-06-18 03:37:16 -07:00
|
|
|
|
|
|
|
_, _ = fmt.Fprintf(os.Stdout, "Body = %s - from = %s\n", msg.Body, msg.From)
|
2019-06-26 08:14:52 -07:00
|
|
|
reply := stanza.Message{Attrs: stanza.Attrs{To: msg.From}, Body: msg.Body}
|
2019-06-18 03:37:16 -07:00
|
|
|
_ = s.Send(reply)
|
2019-06-07 07:33:10 -07:00
|
|
|
}
|
2020-01-09 06:33:11 -08:00
|
|
|
|
|
|
|
func errorHandler(err error) {
|
|
|
|
fmt.Println(err.Error())
|
|
|
|
}
|
|
|
|
|
2019-06-07 07:33:10 -07:00
|
|
|
```
|
|
|
|
|
2019-06-27 00:47:08 -07:00
|
|
|
## Reference documentation
|
2018-12-26 09:59:40 -08:00
|
|
|
|
2019-06-27 00:47:08 -07:00
|
|
|
The code documentation is available on GoDoc: [gosrc.io/xmpp](https://godoc.org/gosrc.io/xmpp)
|