Add support for SASL2 and BIND2

Squashed commit of the following:

commit 0805b1f06a
Author: Martin Dosch <martin@mdosch.de>
Date:   Tue Apr 9 10:57:29 2024 +0200

    Move to upstream go-xmpp.

commit 557d105238
Author: Martin Dosch <martin@mdosch.de>
Date:   Sun Apr 7 12:45:10 2024 +0200

    Do not use sasl2 uuid attribute.

commit 986aea7957
Author: Martin Dosch <martin@mdosch.de>
Date:   Sun Apr 7 11:29:33 2024 +0200

    Don't print error on io.EOF

commit ef927ce5cc
Author: Martin Dosch <martin@mdosch.de>
Date:   Sun Apr 7 11:25:40 2024 +0200

    Detect stream error while receiving stanzas.

commit 73b00f0612
Author: Martin Dosch <martin@mdosch.de>
Date:   Sun Apr 7 10:00:54 2024 +0200

    Use a client uuid per JID.

commit b2d090a623
Author: Martin Dosch <martin@mdosch.de>
Date:   Sun Apr 7 09:29:50 2024 +0200

    Improve sasl2 user agent id stuff.

commit c7376832ce
Author: Martin Dosch <martin@mdosch.de>
Date:   Sun Apr 7 09:11:03 2024 +0200

    Rework getting data path.

commit 080100486e
Author: Martin Dosch <martin@mdosch.de>
Date:   Sun Apr 7 08:49:49 2024 +0200

    Update go-xmpp.

commit 9c56a79bae
Author: Martin Dosch <martin@mdosch.de>
Date:   Sun Apr 7 00:26:04 2024 +0200

    SASL2: Create per client installation ID.

commit cce36b070a
Author: Martin Dosch <martin@mdosch.de>
Date:   Sat Apr 6 22:20:35 2024 +0200

    Update go-xmpp.

commit 1c4acfd07c
Author: Martin Dosch <martin@mdosch.de>
Date:   Fri Apr 5 12:04:09 2024 +0200

    Update go-xmpp.

commit 0703a7c2d6
Author: Martin Dosch <martin@mdosch.de>
Date:   Fri Apr 5 11:38:28 2024 +0200

    Update go-xmpp.

commit 4f033fc5b9
Author: Martin Dosch <martin@mdosch.de>
Date:   Fri Apr 5 09:39:30 2024 +0200

    Update vendored lib.

commit a44554218d
Author: Martin Dosch <martin@mdosch.de>
Date:   Fri Apr 5 09:32:54 2024 +0200

    Use google/uuid for message IDs.

    It is used for go-xmpp in the sasl2 branch anyway.

commit 3e57ec3603
Author: Martin Dosch <martin@mdosch.de>
Date:   Fri Apr 5 09:12:50 2024 +0200

    Update vendored modules.

commit ead44ef99d
Author: Martin Dosch <martin@mdosch.de>
Date:   Fri Apr 5 09:12:25 2024 +0200

    Add . between go-sendxmpp and short id.

commit b3271a3530
Author: Martin Dosch <martin@mdosch.de>
Date:   Fri Apr 5 08:38:03 2024 +0200

    Update Changelog.

commit 639b9b6657
Author: Martin Dosch <martin@mdosch.de>
Date:   Fri Apr 5 08:22:56 2024 +0200

    Add short ID back to resource string.

    That's still necessary to avoid two instances with the same resource
    when using SASL instead of SASL2.

commit 680593359b
Author: Martin Dosch <martin@mdosch.de>
Date:   Thu Apr 4 23:56:15 2024 +0200

    Experimental sasl2 support.
v0.10
Martin Dosch 2 months ago
parent 06bbd9fda5
commit 9f9c533941
No known key found for this signature in database
GPG Key ID: 52A57CFCE13D657D

@ -6,6 +6,7 @@
### Added
- Add a warning when run by the user *root*.
- Add support for SASL2 and BIND2 (via go-xmpp > v0.1.5).
## [v0.9.0] 2024-03-28
### Changed

@ -41,6 +41,7 @@ const (
oxAltBody = "This message is encrypted (XEP-0373: OpenPGP for XMPP)."
pubsubPubOptions = "http://jabber.org/protocol/pubsub#publish-options"
strChat = "chat"
strEmpty = ""
strError = "error"
strGroupchat = "groupchat"
strHeadline = "headline"

@ -6,8 +6,9 @@ require (
github.com/ProtonMail/gopenpgp/v2 v2.7.5
github.com/beevik/etree v1.3.0
github.com/gabriel-vasile/mimetype v1.4.3
github.com/google/uuid v1.6.0
github.com/pborman/getopt/v2 v2.1.0
github.com/xmppo/go-xmpp v0.1.5-0.20240402143230-ca4e49201e53
github.com/xmppo/go-xmpp v0.1.6-0.20240409085338-7486b7a3638c
salsa.debian.org/mdosch/xmppsrv v0.2.6
)
@ -16,8 +17,8 @@ require (
github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f // indirect
github.com/cloudflare/circl v1.3.7 // indirect
github.com/pkg/errors v0.9.1 // indirect
golang.org/x/crypto v0.21.0 // indirect
golang.org/x/net v0.23.0 // indirect
golang.org/x/sys v0.18.0 // indirect
golang.org/x/crypto v0.22.0 // indirect
golang.org/x/net v0.24.0 // indirect
golang.org/x/sys v0.19.0 // indirect
golang.org/x/text v0.14.0 // indirect
)

@ -16,6 +16,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/pborman/getopt/v2 v2.1.0 h1:eNfR+r+dWLdWmV8g5OlpyrTYHkhVNxHBdN2cCrJmOEA=
github.com/pborman/getopt/v2 v2.1.0/go.mod h1:4NtW75ny4eBw9fO1bhtNdYTlZKYX5/tBLtsOpwKIKd0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@ -25,15 +27,17 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/xmppo/go-xmpp v0.1.5-0.20240402143230-ca4e49201e53 h1:kTuborF/7DsdPWZhi6hxBj2cJTbixecsoHNkoHeCajE=
github.com/xmppo/go-xmpp v0.1.5-0.20240402143230-ca4e49201e53/go.mod h1:yyTnJMs6I6KUKv3BjXc4i3NU/iWBxY3yBGiUvUcW0Qg=
github.com/xmppo/go-xmpp v0.1.5 h1:Nxrf+NPxBcpmDTVSNpHPEdHccXJAHE3uMULnM0fOI1U=
github.com/xmppo/go-xmpp v0.1.5/go.mod h1:yOhaLKwPWIe/lMiDS6btyI8lCa56j8RD3iSrel0k/8c=
github.com/xmppo/go-xmpp v0.1.6-0.20240409085338-7486b7a3638c h1:NEaqrFrkYveuMPEOxOhArIvRm7NcXI4Bo4ef1iNSeJQ=
github.com/xmppo/go-xmpp v0.1.6-0.20240409085338-7486b7a3638c/go.mod h1:wR5vg1WrtcaP0DiW8XRUH9YLdFDjwlwJWl6zQEUqNuo=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@ -42,8 +46,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@ -56,8 +60,8 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=

@ -7,6 +7,7 @@ package main
import (
"bytes"
"crypto/rand"
"errors"
"fmt"
"log"
"math/big"
@ -14,6 +15,8 @@ import (
"os"
"regexp"
"strings"
"github.com/google/uuid" // BSD-3-Clause
)
func validUTF8(s string) string {
@ -48,6 +51,41 @@ func readFile(path string) (*bytes.Buffer, error) {
return buffer, nil
}
func getDataPath(folder string) (string, error) {
var err error
var homeDir, dataDir string
switch {
case os.Getenv("$XDG_DATA_HOME") != "":
dataDir = os.Getenv("$XDG_DATA_HOME")
case os.Getenv("$XDG_HOME") != "":
homeDir = os.Getenv("$XDG_HOME")
dataDir = homeDir + "/.local/share"
case os.Getenv("$HOME") != "":
homeDir = os.Getenv("$HOME")
dataDir = homeDir + "/.local/share"
default:
homeDir, err = os.UserHomeDir()
if err != nil {
return strError, fmt.Errorf("getDataPath: failed to determine user dir: %w", err)
}
if homeDir == "" {
return strError, errors.New("getDataPath: received empty string for home directory")
}
dataDir = homeDir + "/.local/share"
}
if folder != "" && !strings.HasSuffix(folder, "/") {
folder = fmt.Sprintf("%s/", folder)
}
dataDir = fmt.Sprintf("%s/go-sendxmpp/%s", dataDir, folder)
if _, err = os.Stat(dataDir); os.IsNotExist(err) {
err = os.MkdirAll(dataDir, defaultDirRights)
if err != nil {
return strError, fmt.Errorf("getDataPath: could not create folder: %w", err)
}
}
return dataDir, nil
}
func getRpad(messageLength int) string {
rpadRunes := []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
length := defaultRpadMultiple - messageLength%defaultRpadMultiple
@ -64,12 +102,7 @@ func getRpad(messageLength int) string {
}
func getID() string {
id := make([]byte, defaultIDBytes)
_, err := rand.Read(id)
if err != nil {
log.Fatal(err)
}
return fmt.Sprintf("%x-%x-%x", id[0:4], id[4:8], id[8:])
return uuid.NewString()
}
func getShortID() string {

@ -296,12 +296,13 @@ func main() {
// set when NoTLS is set go-sendxmpp won't use unencrypted
// client-to-server connections.
// See https://pkg.go.dev/github.com/xmppo/go-xmpp#Options
NoTLS: !*flagDirectTLS,
StartTLS: !*flagDirectTLS,
Debug: *flagDebug,
TLSConfig: &tlsConfig,
Mechanism: *flagSCRAMPinning,
SSDP: !*flagSSDPOff,
NoTLS: !*flagDirectTLS,
StartTLS: !*flagDirectTLS,
Debug: *flagDebug,
TLSConfig: &tlsConfig,
Mechanism: *flagSCRAMPinning,
SSDP: !*flagSSDPOff,
UserAgentSW: "go-sendxmpp",
}
// Read message from file.

60
ox.go

@ -316,33 +316,9 @@ func oxPublishPubKey(jid string, client *xmpp.Client, iqc chan xmpp.IQ, pubKey *
}
func oxGetPrivKeyLoc(jid string) (string, error) {
var err error
var homeDir, dataDir string
switch {
case os.Getenv("$XDG_DATA_HOME") != "":
dataDir = os.Getenv("$XDG_DATA_HOME")
case os.Getenv("$XDG_HOME") != "":
homeDir = os.Getenv("$XDG_HOME")
dataDir = homeDir + "/.local/share"
case os.Getenv("$HOME") != "":
homeDir = os.Getenv("$HOME")
dataDir = homeDir + "/.local/share"
default:
homeDir, err = os.UserHomeDir()
if err != nil {
return strError, fmt.Errorf("oxGetPrivKeyLoc: failed to determine user dir: %w", err)
}
if homeDir == "" {
return strError, errors.New("oxGetPrivKeyLoc: received empty string for home directory")
}
dataDir = homeDir + "/.local/share"
}
dataDir += "/go-sendxmpp/oxprivkeys/"
if _, err = os.Stat(dataDir); os.IsNotExist(err) {
err = os.MkdirAll(dataDir, defaultDirRights)
if err != nil {
return strError, fmt.Errorf("oxGetPrivKeyLoc: could not create folder for private keys: %w", err)
}
dataDir, err := getDataPath("oxprivkeys/")
if err != nil {
return strError, fmt.Errorf("oxGetPubKeyLoc: %w", err)
}
// TODO: Remove handling of oldDataFile in a later version when it's very likely that there are no
// more versions in use using the oldDataFile (<0.8.3).
@ -365,33 +341,9 @@ func oxGetPrivKeyLoc(jid string) (string, error) {
}
func oxGetPubKeyLoc(fingerprint string) (string, error) {
var err error
var homeDir, dataDir string
switch {
case os.Getenv("$XDG_DATA_HOME") != "":
dataDir = os.Getenv("$XDG_DATA_HOME")
case os.Getenv("$XDG_HOME") != "":
homeDir = os.Getenv("$XDG_HOME")
dataDir = homeDir + "/.local/share"
case os.Getenv("$HOME") != "":
homeDir = os.Getenv("$HOME")
dataDir = homeDir + "/.local/share"
default:
homeDir, err = os.UserHomeDir()
if err != nil {
return strError, fmt.Errorf("oxGetPubKeyLoc: failed to determine user dir: %w", err)
}
if homeDir == "" {
return strError, errors.New("oxGetPubKeyLoc: received empty string for home directory")
}
dataDir = homeDir + "/.local/share"
}
dataDir += "/go-sendxmpp/oxpubkeys/"
if _, err = os.Stat(dataDir); os.IsNotExist(err) {
err = os.MkdirAll(dataDir, defaultDirRights)
if err != nil {
return strError, fmt.Errorf("oxGetPubKeyLoc: could not create folder for public keys: %w", err)
}
dataDir, err := getDataPath("oxpubkeys/")
if err != nil {
return strError, fmt.Errorf("oxGetPubKeyLoc: %w", err)
}
dataFile := dataDir + fingerprint
return dataFile, nil

Loading…
Cancel
Save