use etree

ox
Martin Dosch 2 years ago
parent 9420fe5b4f
commit 502417a62e

@ -4,6 +4,7 @@ go 1.17
require (
github.com/ProtonMail/gopenpgp/v2 v2.4.6
github.com/beevik/etree v1.1.0
github.com/gabriel-vasile/mimetype v1.4.0
github.com/mattn/go-xmpp v0.0.0-20220410054612-99ddfc1aa46a
github.com/pborman/getopt/v2 v2.1.0

@ -6,6 +6,8 @@ github.com/ProtonMail/go-mime v0.0.0-20220302105931-303f85f7fe0f h1:CGq7OieOz3wy
github.com/ProtonMail/go-mime v0.0.0-20220302105931-303f85f7fe0f/go.mod h1:NYt+V3/4rEeDuaev/zw1zCq8uqVEuPHzDPo3OZrlGJ4=
github.com/ProtonMail/gopenpgp/v2 v2.4.6 h1:/EcJsFIsE0ywShAJ+lNLafcaSd6GBhIzHsaBID5pGXw=
github.com/ProtonMail/gopenpgp/v2 v2.4.6/go.mod h1:ZW1KxHNG6q5LMgFKf9Ap/d2eVYeyGf5+fAUEAjJWtmo=
github.com/beevik/etree v1.1.0 h1:T0xke/WvNtMoCqgzPhkX2r4rjY3GDZFi+FjpRZY2Jbs=
github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
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=

@ -6,77 +6,6 @@ package main
import "encoding/xml"
// Created with https://github.com/miku/zek
type IQoxPublishKeyListType struct {
XMLName xml.Name `xml:"pubsub"`
Text string `xml:",chardata"`
Xmlns string `xml:"xmlns,attr"`
Publish struct {
Text string `xml:",chardata"`
Node string `xml:"node,attr"`
Item struct {
Text string `xml:",chardata"`
PublicKeysList struct {
Text string `xml:",chardata"`
Xmlns string `xml:"xmlns,attr"`
PubkeyMetadata [1]struct {
Text string `xml:",chardata"`
V4Fingerprint string `xml:"v4-fingerprint,attr"`
Date string `xml:"date,attr"`
} `xml:"pubkey-metadata"`
} `xml:"public-keys-list"`
} `xml:"item"`
} `xml:"publish"`
PublishOptions struct {
Text string `xml:",chardata"`
X struct {
Text string `xml:",chardata"`
Xmlns string `xml:"xmlns,attr"`
Type string `xml:"type,attr"`
Field [2]struct {
Text string `xml:",chardata"`
Var string `xml:"var,attr"`
Type string `xml:"type,attr"`
Value string `xml:"value"`
} `xml:"field"`
} `xml:"x"`
} `xml:"publish-options"`
}
// Created with https://github.com/miku/zek
type IQoxPublishKeyType struct {
XMLName xml.Name `xml:"pubsub"`
Text string `xml:",chardata"`
Xmlns string `xml:"xmlns,attr"`
Publish struct {
Text string `xml:",chardata"`
Node string `xml:"node,attr"`
Item struct {
Text string `xml:",chardata"`
ID string `xml:"id,attr"`
Pubkey struct {
Text string `xml:",chardata"`
Xmlns string `xml:"xmlns,attr"`
Data string `xml:"data"`
} `xml:"pubkey"`
} `xml:"item"`
} `xml:"publish"`
PublishOptions struct {
Text string `xml:",chardata"`
X struct {
Text string `xml:",chardata"`
Xmlns string `xml:"xmlns,attr"`
Type string `xml:"type,attr"`
Field [2]struct {
Text string `xml:",chardata"`
Var string `xml:"var,attr"`
Type string `xml:"type,attr"`
Value string `xml:"value"`
} `xml:"field"`
} `xml:"x"`
} `xml:"publish-options"`
}
// Created with https://github.com/miku/zek
type OxMessageElement struct {
XMLName xml.Name `xml:"message"`

93
ox.go

@ -16,6 +16,7 @@ import (
"time"
"github.com/ProtonMail/gopenpgp/v2/crypto" // MIT License
"github.com/beevik/etree" // BSD-2-clause
"github.com/mattn/go-xmpp" // BSD-3-Clause
)
@ -112,9 +113,6 @@ func oxStorePrivKey(jid string, privKey string) error {
}
func oxGenPrivKey(jid string, client *xmpp.Client) error {
var iqOxPublishKey IQoxPublishKeyType
var iqOxPublishKeyList IQoxPublishKeyListType
// var iqPubsubCreate IQpubsubCreateType
xmppUri := "xmpp:" + jid
key, err := crypto.GenerateKey(xmppUri, xmppUri, "x25519", 0)
if err != nil {
@ -132,32 +130,43 @@ func oxGenPrivKey(jid string, client *xmpp.Client) error {
if err != nil {
log.Fatal(err)
}
keyCreated := time.Now().UTC().Format("2006-01-02T15:04:05Z")
fingerprint := strings.ToUpper(key.GetFingerprint())
// TODO: Get existing key list and append the new one.
iqOxPublishKey.Xmlns = nsPubsub
iqOxPublishKey.Publish.Node = nsOxPubKeys + ":" + fingerprint
iqOxPublishKey.Publish.Item.ID = time.Now().UTC().Format("2006-01-02T15:04:05Z")
iqOxPublishKey.Publish.Item.Pubkey.Xmlns = nsOx
iqOxPublishKey.Publish.Item.Pubkey.Data = pubKeyBase64
iqOxPublishKey.PublishOptions.X.Xmlns = nsJabberData
iqOxPublishKey.PublishOptions.X.Type = "submit"
iqOxPublishKey.PublishOptions.X.Field[0].Var = "FORM_TYPE"
iqOxPublishKey.PublishOptions.X.Field[0].Type = "hidden"
iqOxPublishKey.PublishOptions.X.Field[0].Value = pubsubPubOptions
iqOxPublishKey.PublishOptions.X.Field[1].Var = "pubsub#access_model"
iqOxPublishKey.PublishOptions.X.Field[1].Value = "open"
opk, err := xml.Marshal(iqOxPublishKey)
root := etree.NewDocument()
pubsub := root.CreateElement("pubsub")
pubsub.CreateAttr("xmlns", nsPubsub)
publish := pubsub.CreateElement("publish")
publish.CreateAttr("node", nsOxPubKeys+":"+fingerprint)
item := publish.CreateElement("item")
item.CreateAttr("id", keyCreated)
pubkey := item.CreateElement("pubkey")
pubkey.CreateAttr("xmlns", nsOx)
data := pubkey.CreateElement("data")
data.CreateText(pubKeyBase64)
publishoptions := pubsub.CreateElement("publish-options")
x := publishoptions.CreateElement("x")
x.CreateAttr("xmlns", nsJabberData)
x.CreateAttr("type", "submit")
field := x.CreateElement("field")
field.CreateAttr("var", "FORM_TYPE")
field.CreateAttr("type", "hidden")
value := field.CreateElement("value")
value.CreateText(pubsubPubOptions)
field = x.CreateElement("field")
field.CreateAttr("var", "pubsub#access_model")
value = field.CreateElement("value")
value.CreateText("open")
xmlstring, err := root.WriteToString()
if err != nil {
return err
}
println(string(opk))
iqReply, err := sendIQ(client, jid, "set", string(opk))
println(xmlstring)
iqReply, err := sendIQ(client, jid, "set", xmlstring)
if err != nil {
return err
}
if iqReply.Type != "result" {
return errors.New("Error whil publishing public key.")
return errors.New("Error while publishing public key.")
}
// TODO: Split GetPublicKey in GetPublicKeyList and GetPublicKey
@ -176,26 +185,34 @@ func oxGenPrivKey(jid string, client *xmpp.Client) error {
return errors.New("Couldn't successfully verify public key upload.")
}
iqOxPublishKeyList.Xmlns = nsPubsub
iqOxPublishKeyList.Publish.Node = nsOxPubKeys
iqOxPublishKeyList.Publish.Item.PublicKeysList.Xmlns = nsOx
iqOxPublishKeyList.Publish.Item.PublicKeysList.PubkeyMetadata[0].V4Fingerprint = fingerprint
iqOxPublishKeyList.Publish.Item.PublicKeysList.PubkeyMetadata[0].Date =
time.Now().UTC().Format("2006-01-02T15:04:05Z")
iqOxPublishKeyList.PublishOptions.X.Xmlns = nsJabberData
iqOxPublishKeyList.PublishOptions.X.Type = "submit"
iqOxPublishKeyList.PublishOptions.X.Field[0].Var = "FORM_TYPE"
iqOxPublishKeyList.PublishOptions.X.Field[0].Type = "hidden"
iqOxPublishKeyList.PublishOptions.X.Field[0].Value = pubsubPubOptions
iqOxPublishKeyList.PublishOptions.X.Field[1].Var = "pubsub#access_model"
iqOxPublishKeyList.PublishOptions.X.Field[1].Value = "open"
opkl, err := xml.Marshal(iqOxPublishKeyList)
root = etree.NewDocument()
pubsub = root.CreateElement("pubsub")
pubsub.CreateAttr("xmlns", nsPubsub)
publish = pubsub.CreateElement("publish")
publish.CreateAttr("node", nsOxPubKeys)
item = publish.CreateElement("item")
pubkeymeta := item.CreateElement("pubkey-metadata")
pubkeymeta.CreateAttr("v4-fingerprint", fingerprint)
pubkeymeta.CreateAttr("date", keyCreated)
publishoptions = pubsub.CreateElement("publish-options")
x = publishoptions.CreateElement("x")
x.CreateAttr("xmlns", nsJabberData)
x.CreateAttr("type", "submit")
field = x.CreateElement("field")
field.CreateAttr("var", "FORM_TYPE")
field.CreateAttr("type", "hidden")
value = field.CreateElement("value")
value.CreateText(pubsubPubOptions)
field = x.CreateElement("field")
field.CreateAttr("var", "pubsub#access_model")
value = field.CreateElement("value")
value.CreateText("open")
xmlstring, err = root.WriteToString()
if err != nil {
return err
}
println(string(opkl))
iqReply, err = sendIQ(client, jid, "set", string(opkl))
println(xmlstring)
iqReply, err = sendIQ(client, jid, "set", xmlstring)
if err != nil {
return err
}

Loading…
Cancel
Save