|
|
|
@ -17,6 +17,7 @@ import (
|
|
|
|
|
"os/signal"
|
|
|
|
|
"runtime"
|
|
|
|
|
"strings"
|
|
|
|
|
"sync"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"github.com/ProtonMail/gopenpgp/v2/crypto" // MIT License
|
|
|
|
@ -32,8 +33,12 @@ type configuration struct {
|
|
|
|
|
alias string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func closeAndExit(client *xmpp.Client, cancel context.CancelFunc, err error) {
|
|
|
|
|
var mutex sync.Mutex
|
|
|
|
|
|
|
|
|
|
func closeAndExit(client *xmpp.Client, cancel context.CancelFunc, err error, mutex *sync.Mutex) {
|
|
|
|
|
cancel()
|
|
|
|
|
mutex.Lock()
|
|
|
|
|
defer mutex.Unlock()
|
|
|
|
|
client.Close()
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
@ -335,7 +340,7 @@ func main() {
|
|
|
|
|
iqc := make(chan xmpp.IQ, defaultBufferSize)
|
|
|
|
|
msgc := make(chan xmpp.Chat, defaultBufferSize)
|
|
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
|
|
|
go rcvStanzas(client, iqc, msgc, ctx, cancel)
|
|
|
|
|
go rcvStanzas(client, iqc, msgc, ctx, cancel, &mutex)
|
|
|
|
|
for _, r := range getopt.Args() {
|
|
|
|
|
var re recipientsType
|
|
|
|
|
re.Jid = r
|
|
|
|
@ -353,7 +358,7 @@ func main() {
|
|
|
|
|
for i, recipient := range recipients {
|
|
|
|
|
validatedJid, err := MarshalJID(recipient.Jid)
|
|
|
|
|
if err != nil {
|
|
|
|
|
closeAndExit(client, cancel, err)
|
|
|
|
|
closeAndExit(client, cancel, err, &mutex)
|
|
|
|
|
}
|
|
|
|
|
recipients[i].Jid = validatedJid
|
|
|
|
|
}
|
|
|
|
@ -362,52 +367,52 @@ func main() {
|
|
|
|
|
case *flagOxGenPrivKeyX25519:
|
|
|
|
|
validatedOwnJid, err := MarshalJID(user)
|
|
|
|
|
if err != nil {
|
|
|
|
|
closeAndExit(client, cancel, err)
|
|
|
|
|
closeAndExit(client, cancel, err, &mutex)
|
|
|
|
|
}
|
|
|
|
|
err = oxGenPrivKey(validatedOwnJid, client, iqc, *flagOxPassphrase, "x25519")
|
|
|
|
|
if err != nil {
|
|
|
|
|
closeAndExit(client, cancel, err)
|
|
|
|
|
closeAndExit(client, cancel, err, &mutex)
|
|
|
|
|
}
|
|
|
|
|
os.Exit(0)
|
|
|
|
|
case *flagOxGenPrivKeyRSA:
|
|
|
|
|
validatedOwnJid, err := MarshalJID(user)
|
|
|
|
|
if err != nil {
|
|
|
|
|
closeAndExit(client, cancel, err)
|
|
|
|
|
closeAndExit(client, cancel, err, &mutex)
|
|
|
|
|
}
|
|
|
|
|
err = oxGenPrivKey(validatedOwnJid, client, iqc, *flagOxPassphrase, "rsa")
|
|
|
|
|
if err != nil {
|
|
|
|
|
closeAndExit(client, cancel, err)
|
|
|
|
|
closeAndExit(client, cancel, err, &mutex)
|
|
|
|
|
}
|
|
|
|
|
os.Exit(0)
|
|
|
|
|
case *flagOxImportPrivKey != "":
|
|
|
|
|
validatedOwnJid, err := MarshalJID(user)
|
|
|
|
|
if err != nil {
|
|
|
|
|
closeAndExit(client, cancel, err)
|
|
|
|
|
closeAndExit(client, cancel, err, &mutex)
|
|
|
|
|
}
|
|
|
|
|
err = oxImportPrivKey(validatedOwnJid, *flagOxImportPrivKey,
|
|
|
|
|
client, iqc)
|
|
|
|
|
if err != nil {
|
|
|
|
|
closeAndExit(client, cancel, err)
|
|
|
|
|
closeAndExit(client, cancel, err, &mutex)
|
|
|
|
|
}
|
|
|
|
|
os.Exit(0)
|
|
|
|
|
case *flagOxDeleteNodes:
|
|
|
|
|
validatedOwnJid, err := MarshalJID(user)
|
|
|
|
|
if err != nil {
|
|
|
|
|
closeAndExit(client, cancel, err)
|
|
|
|
|
closeAndExit(client, cancel, err, &mutex)
|
|
|
|
|
}
|
|
|
|
|
err = oxDeleteNodes(validatedOwnJid, client, iqc)
|
|
|
|
|
if err != nil {
|
|
|
|
|
closeAndExit(client, cancel, err)
|
|
|
|
|
closeAndExit(client, cancel, err, &mutex)
|
|
|
|
|
}
|
|
|
|
|
os.Exit(0)
|
|
|
|
|
case *flagOx:
|
|
|
|
|
validatedOwnJid, err := MarshalJID(user)
|
|
|
|
|
if err != nil {
|
|
|
|
|
closeAndExit(client, cancel, err)
|
|
|
|
|
closeAndExit(client, cancel, err, &mutex)
|
|
|
|
|
}
|
|
|
|
|
oxPrivKey, err = oxGetPrivKey(validatedOwnJid, *flagOxPassphrase)
|
|
|
|
|
if err != nil {
|
|
|
|
|
closeAndExit(client, cancel, err)
|
|
|
|
|
closeAndExit(client, cancel, err, &mutex)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -415,7 +420,7 @@ func main() {
|
|
|
|
|
message, err = httpUpload(client, iqc, tlsConfig.ServerName,
|
|
|
|
|
*flagHTTPUpload, timeout)
|
|
|
|
|
if err != nil {
|
|
|
|
|
closeAndExit(client, cancel, err)
|
|
|
|
|
closeAndExit(client, cancel, err, &mutex)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -425,7 +430,7 @@ func main() {
|
|
|
|
|
// Check if the URI is valid.
|
|
|
|
|
uri, err := validURI(message)
|
|
|
|
|
if err != nil {
|
|
|
|
|
closeAndExit(client, cancel, err)
|
|
|
|
|
closeAndExit(client, cancel, err, &mutex)
|
|
|
|
|
}
|
|
|
|
|
message = uri.String()
|
|
|
|
|
}
|
|
|
|
@ -448,7 +453,7 @@ func main() {
|
|
|
|
|
_, err = client.JoinMUCNoHistory(recipient.Jid, alias)
|
|
|
|
|
}
|
|
|
|
|
if err != nil {
|
|
|
|
|
closeAndExit(client, cancel, err)
|
|
|
|
|
closeAndExit(client, cancel, err, &mutex)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -460,7 +465,7 @@ func main() {
|
|
|
|
|
// Send raw XML
|
|
|
|
|
_, err = client.SendOrg(message)
|
|
|
|
|
if err != nil {
|
|
|
|
|
closeAndExit(client, cancel, err)
|
|
|
|
|
closeAndExit(client, cancel, err, &mutex)
|
|
|
|
|
}
|
|
|
|
|
case *flagInteractive:
|
|
|
|
|
// Send in endless loop (for usage with e.g. "tail -f").
|
|
|
|
@ -470,7 +475,7 @@ func main() {
|
|
|
|
|
signal.Notify(c, os.Interrupt)
|
|
|
|
|
go func() {
|
|
|
|
|
for range c {
|
|
|
|
|
closeAndExit(client, cancel, nil)
|
|
|
|
|
closeAndExit(client, cancel, nil, &mutex)
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
for {
|
|
|
|
@ -480,7 +485,7 @@ func main() {
|
|
|
|
|
return
|
|
|
|
|
default:
|
|
|
|
|
if err != nil {
|
|
|
|
|
closeAndExit(client, cancel, errors.New("failed to read from stdin"))
|
|
|
|
|
closeAndExit(client, cancel, errors.New("failed to read from stdin"), &mutex)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
message = strings.TrimSuffix(message, "\n")
|
|
|
|
@ -505,7 +510,7 @@ func main() {
|
|
|
|
|
}
|
|
|
|
|
_, err = client.SendOrg(oxMessage)
|
|
|
|
|
if err != nil {
|
|
|
|
|
closeAndExit(client, cancel, err)
|
|
|
|
|
closeAndExit(client, cancel, err, &mutex)
|
|
|
|
|
}
|
|
|
|
|
default:
|
|
|
|
|
_, err = client.Send(xmpp.Chat{
|
|
|
|
@ -513,7 +518,7 @@ func main() {
|
|
|
|
|
Type: msgType, Text: message,
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
closeAndExit(client, cancel, err)
|
|
|
|
|
closeAndExit(client, cancel, err, &mutex)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -624,7 +629,7 @@ func main() {
|
|
|
|
|
}
|
|
|
|
|
_, err = client.SendOrg(oxMessage)
|
|
|
|
|
if err != nil {
|
|
|
|
|
closeAndExit(client, cancel, err)
|
|
|
|
|
closeAndExit(client, cancel, err, &mutex)
|
|
|
|
|
}
|
|
|
|
|
default:
|
|
|
|
|
_, err = client.Send(xmpp.Chat{
|
|
|
|
@ -632,10 +637,10 @@ func main() {
|
|
|
|
|
Type: msgType, Text: message,
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
closeAndExit(client, cancel, err)
|
|
|
|
|
closeAndExit(client, cancel, err, &mutex)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
closeAndExit(client, cancel, nil)
|
|
|
|
|
closeAndExit(client, cancel, nil, &mutex)
|
|
|
|
|
}
|
|
|
|
|