Skip to content
Native Go XMPP library
Go Other
  1. Go 99.7%
  2. Other 0.3%
Branch: master
Clone or download
Latest commit 6aa1e66 Nov 8, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
_examples Fix issues after refactor Nov 8, 2019
cmd Update go.sum file Nov 4, 2019
stanza Fix failing tests Nov 4, 2019
.gitignore Ignore directory where I put private notes Jun 18, 2019
CHANGELOG.md Preparing v0.2.0 Changelog before version release Nov 4, 2019
CODE_OF_CONDUCT.md Add CoC and contribution guide Jan 21, 2019
CONTRIBUTING.md Add CoC and contribution guide Jan 21, 2019
Dockerfile Update test platform to go1.13 Oct 29, 2019
LICENSE Moving XMPP library to Fluux project Jan 1, 2018
README.md Add placeholder in README for routing packets and get IQ responses Nov 4, 2019
auth.go Add X-OAUTH2 authentication and example Oct 1, 2019
backoff.go Add constants (enumlike) for stanza types and simplify packet creation ( Jun 22, 2019
backoff_test.go Add constants (enumlike) for stanza types and simplify packet creation ( Jun 22, 2019
cert_checker.go Create a new stream after StartTLS Oct 28, 2019
client.go Fix issues after refactor Nov 8, 2019
client_internal_test.go Fixes issue with unescaped character % Sep 27, 2019
client_test.go Move address into transport config Oct 28, 2019
codecov.yml Disable Codecov comments on PR May 31, 2019
codeship-services.yml Add Codecov support Jan 1, 2018
codeship-steps.yml Workaround Codeship coverage upload report issues Jan 2, 2018
codeship.env.encrypted Add missing codecov token Jan 1, 2018
component.go Fix issues after refactor Nov 8, 2019
component_test.go fix stream management for component + add test Sep 2, 2019
config.go Comments clean-up Nov 4, 2019
conn_error.go With go modules, we should be able to remove import comments Jun 18, 2019
doc.go Add constants (enumlike) for stanza types and simplify packet creation ( Jun 22, 2019
go.mod Always add an id to IQ queries Nov 4, 2019
go.sum Always add an id to IQ queries Nov 4, 2019
jid.go With go modules, we should be able to remove import comments Jun 18, 2019
jid_test.go With go modules, we should be able to remove import comments Jun 18, 2019
network.go Adding tests and always use brackets in IPV6 addresses Jun 26, 2019
network_test.go Improves IPV6 examples Jun 26, 2019
router.go Use a channel based API for SendIQ Nov 4, 2019
router_test.go Fix failing tests Nov 4, 2019
session.go Only try startTls if the connection is not secure Oct 28, 2019
stream_logger.go Comments clean-up Nov 4, 2019
stream_manager.go Fix issues after refactor Nov 8, 2019
tcp_server_mock.go With go modules, we should be able to remove import comments Jun 18, 2019
test.sh Add test (and refactor them) for PR#15 (#18) Feb 10, 2019
transport.go Comments clean-up Nov 4, 2019
websocket_transport.go Increase size of XML decoder internal buffers Nov 4, 2019
xmpp_transport.go Fix issues after refactor Nov 8, 2019

README.md

Fluux XMPP

Codeship Status for FluuxIO/xmpp GoDoc GoReportCard codecov

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

The goal is to make simple to write simple XMPP clients and components:

  • For automation (like for example monitoring of an XMPP service),
  • For building connected "things" by plugging them on an XMPP server,
  • For writing simple chatbot to control a service or a thing,
  • For writing XMPP servers components.

The library is designed to have minimal dependencies. For now, the library does not depend on any other library.

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.

config := xmpp.Config{
	Address:      "localhost:5222",
	Jid:          "test@localhost",
	Credential:   xmpp.Password("Test"),
	TLSConfig:    tls.Config{InsecureSkipVerify: true},
}

Supported specifications

Clients

Components

Package overview

Stanza subpackage

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.

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.

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.

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.

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.

To learn more about the stanza package, you can read more in the stanza package documentation.

Router

TODO

Getting IQ response from server

TODO

Examples

We have several examples to help you get started using Fluux XMPP library.

Here is the demo "echo" client:

package main

import (
	"fmt"
	"log"
	"os"

	"gosrc.io/xmpp"
	"gosrc.io/xmpp/stanza"
)

func main() {
	config := xmpp.Config{
		TransportConfiguration: xmpp.TransportConfiguration{
			Address: "localhost:5222",
		},
		Jid:          "test@localhost",
	    Credential:   xmpp.Password("Test"),
		StreamLogger: os.Stdout,
		Insecure:     true,
	}

	router := xmpp.NewRouter()
	router.HandleFunc("message", handleMessage)

	client, err := xmpp.NewClient(config, router)
	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.
	cm := xmpp.NewStreamManager(client, nil)
	log.Fatal(cm.Run())
}

func handleMessage(s xmpp.Sender, p stanza.Packet) {
	msg, ok := p.(stanza.Message)
	if !ok {
		_, _ = fmt.Fprintf(os.Stdout, "Ignoring packet: %T\n", p)
		return
	}

	_, _ = fmt.Fprintf(os.Stdout, "Body = %s - from = %s\n", msg.Body, msg.From)
	reply := stanza.Message{Attrs: stanza.Attrs{To: msg.From}, Body: msg.Body}
	_ = s.Send(reply)
}

Reference documentation

The code documentation is available on GoDoc: gosrc.io/xmpp

You can’t perform that action at this time.