2
0
mirror of https://github.com/FluuxIO/go-xmpp synced 2024-11-11 07:11:03 +00:00
Go to file
remicorniere 928c1595ef
Merge pull request #148 from remicorniere/ResultSetsRework
- Changed IQ stanzas to pointer semantics
- Fixed commands from v 0.4.0 and tests
- Added primitive Result Sets support (XEP-0059)
- Tests for Result sets are not implemented yet. Result sets seem to be fairly unused across servers and is a little weird to test without a specific implementing XEP like XEP-0313; because the implementations are different across XEPs. Therefore, as 313 is coming, I'll update the tests for XEP-0059 with it.
2020-01-31 11:18:36 +00:00
_examples Merge pull request #148 from remicorniere/ResultSetsRework 2020-01-31 11:18:36 +00:00
.github/workflows Added coverage 2019-11-29 15:56:27 +01:00
cmd - Changed IQ stanzas to pointer semantics 2020-01-31 11:48:03 +01:00
stanza Reset Tests 2020-01-31 12:06:53 +01:00
.gitignore Ignore directory where I put private notes 2019-06-18 14:36:56 +02:00
auth.go Tests for Component and code style fixes (#129) 2019-11-28 17:15:15 +01:00
backoff_test.go Add constants (enumlike) for stanza types and simplify packet creation (#62) 2019-06-22 11:13:33 +02:00
backoff.go Add constants (enumlike) for stanza types and simplify packet creation (#62) 2019-06-22 11:13:33 +02:00
bi_dir_iterator.go - Changed IQ stanzas to pointer semantics 2020-01-31 11:48:03 +01:00
cert_checker.go Tests for Component and code style fixes (#129) 2019-11-28 17:15:15 +01:00
CHANGELOG.md Change log pub sub (#143) 2020-01-09 15:33:38 +01:00
client_internal_test.go Fixes issue with unescaped character % 2019-09-27 16:32:53 +02:00
client_test.go - Changed IQ stanzas to pointer semantics 2020-01-31 11:48:03 +01:00
client.go - Changed IQ stanzas to pointer semantics 2020-01-31 11:48:03 +01:00
CODE_OF_CONDUCT.md Add CoC and contribution guide 2019-01-21 16:24:26 +01:00
component_test.go - Changed IQ stanzas to pointer semantics 2020-01-31 11:48:03 +01:00
component.go - Changed IQ stanzas to pointer semantics 2020-01-31 11:48:03 +01:00
config.go PubSub protocol support (#142) 2020-01-09 15:33:11 +01:00
conn_error.go With go modules, we should be able to remove import comments 2019-06-18 16:28:30 +02:00
CONTRIBUTING.md Add CoC and contribution guide 2019-01-21 16:24:26 +01:00
doc.go Fixed decoder usage. 2019-12-10 17:53:42 +01:00
go.mod Example client with TUI 2019-12-16 01:42:27 +01:00
go.sum Remove context leak warnings 2019-12-26 15:51:19 +01:00
LICENSE Moving XMPP library to Fluux project 2018-01-01 18:12:33 +01:00
network_test.go Tests for Component and code style fixes (#129) 2019-11-28 17:15:15 +01:00
network.go Tests for Component and code style fixes (#129) 2019-11-28 17:15:15 +01:00
README.md PubSub protocol support (#142) 2020-01-09 15:33:11 +01:00
router_test.go - Changed IQ stanzas to pointer semantics 2020-01-31 11:48:03 +01:00
router.go - Changed IQ stanzas to pointer semantics 2020-01-31 11:48:03 +01:00
session.go - Changed IQ stanzas to pointer semantics 2020-01-31 11:48:03 +01:00
stream_logger.go Comments clean-up 2019-11-04 12:58:10 +01:00
stream_manager.go - Changed IQ stanzas to pointer semantics 2020-01-31 11:48:03 +01:00
tcp_server_mock.go - Changed IQ stanzas to pointer semantics 2020-01-31 11:48:03 +01:00
test.sh Removed last bits of codecov 2019-12-02 10:19:39 +01:00
transport.go - Changed IQ stanzas to pointer semantics 2020-01-31 11:48:03 +01:00
websocket_transport.go Changed "Disconnect" to wait for the closing stream tag. (#141) 2019-12-26 14:47:02 +01:00
xmpp_transport.go - Changed IQ stanzas to pointer semantics 2020-01-31 11:48:03 +01:00

Fluux XMPP

GoDoc GoReportCard Coverage Status

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

Extensions

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,
		// TLSConfig: tls.Config{InsecureSkipVerify: true},
	}

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

	client, err := xmpp.NewClient(config, router, errorHandler)
	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)
}

func errorHandler(err error) {
	fmt.Println(err.Error())
}

Reference documentation

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