|
|
|
@ -6,7 +6,6 @@ package main
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"encoding/base64"
|
|
|
|
|
"encoding/xml"
|
|
|
|
|
"errors"
|
|
|
|
|
"log"
|
|
|
|
|
"os"
|
|
|
|
@ -373,7 +372,6 @@ func oxRecvPublicKeys(client *xmpp.Client, recipient string,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func oxGetPublicKeyRing(client *xmpp.Client, recipient string) (*crypto.KeyRing, error) {
|
|
|
|
|
var oxPublicKeyListXML OxPublicKeysList
|
|
|
|
|
publicKeyRing, err := crypto.NewKeyRing(nil)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
@ -397,7 +395,8 @@ func oxGetPublicKeyRing(client *xmpp.Client, recipient string) (*crypto.KeyRing,
|
|
|
|
|
return nil, errors.New("Error while requesting public openpgp keys for " +
|
|
|
|
|
recipient)
|
|
|
|
|
}
|
|
|
|
|
err = xml.Unmarshal(oxPublicKeyList.Query, &oxPublicKeyListXML)
|
|
|
|
|
oxPubKeyListXML := etree.NewDocument()
|
|
|
|
|
err = oxPubKeyListXML.ReadFromBytes(oxPublicKeyList.Query)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
@ -407,14 +406,23 @@ func oxGetPublicKeyRing(client *xmpp.Client, recipient string) (*crypto.KeyRing,
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
for _, r := range oxPublicKeyListXML.Items.Item.PublicKeysList.PubkeyMetadata {
|
|
|
|
|
keyDate, err := time.Parse(time.RFC3339, r.Date)
|
|
|
|
|
|
|
|
|
|
oxPubKeyListXMLPubsub := oxPubKeyListXML.SelectElement("pubsub")
|
|
|
|
|
oxPubKeyListXMLPubsubItems := oxPubKeyListXMLPubsub.SelectElement("items")
|
|
|
|
|
oxPubKeyListXMLPubsubItemsItem := oxPubKeyListXMLPubsubItems.SelectElement("item")
|
|
|
|
|
oxPubKeyListXMLPubsubItemsItemPkl := oxPubKeyListXMLPubsubItemsItem.SelectElement("public-keys-list")
|
|
|
|
|
oxPubKeyListXMLPubsubItemsItemPklPm :=
|
|
|
|
|
oxPubKeyListXMLPubsubItemsItemPkl.SelectElements("pubkey-metadata")
|
|
|
|
|
for _, r := range oxPubKeyListXMLPubsubItemsItemPklPm {
|
|
|
|
|
date := r.SelectAttr("date")
|
|
|
|
|
fingerprint := r.SelectAttr("v4-fingerprint")
|
|
|
|
|
keyDate, err := time.Parse(time.RFC3339, date.Value)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
if keyDate.After(newestKey) {
|
|
|
|
|
newestKey = keyDate
|
|
|
|
|
pubKeyRingId = r.V4Fingerprint
|
|
|
|
|
pubKeyRingId = fingerprint.Value
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if pubKeyRingId == "none" {
|
|
|
|
@ -489,7 +497,6 @@ func oxGetPublicKeyRing(client *xmpp.Client, recipient string) (*crypto.KeyRing,
|
|
|
|
|
|
|
|
|
|
func oxEncrypt(client *xmpp.Client, oxPrivKey *crypto.Key, recipient string,
|
|
|
|
|
keyRing *crypto.KeyRing, message string) (string, error) {
|
|
|
|
|
var oxMessage OxMessageElement
|
|
|
|
|
privKeyRing, err := crypto.NewKeyRing(oxPrivKey)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "error", err
|
|
|
|
@ -524,18 +531,24 @@ func oxEncrypt(client *xmpp.Client, oxPrivKey *crypto.Key, recipient string,
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "error", err
|
|
|
|
|
}
|
|
|
|
|
oxMessage.To = recipient
|
|
|
|
|
oxMessage.Id = getID()
|
|
|
|
|
oxMessage.Store.Xmlns = nsHints
|
|
|
|
|
oxMessage.Openpgp.Text = base64.StdEncoding.EncodeToString(pgpMessage.Data)
|
|
|
|
|
oxMessage.Openpgp.Xmlns = nsOx
|
|
|
|
|
oxMessage.Encryption.Xmlns = nsEme
|
|
|
|
|
oxMessage.Encryption.Namespace = nsOx
|
|
|
|
|
oxMessage.Body = oxAltBody
|
|
|
|
|
om, err := xml.Marshal(oxMessage)
|
|
|
|
|
om := etree.NewDocument()
|
|
|
|
|
omMessage := om.CreateElement("message")
|
|
|
|
|
omMessage.CreateAttr("to", recipient)
|
|
|
|
|
omMessage.CreateAttr("id", getID())
|
|
|
|
|
omMessageStore := omMessage.CreateElement("store")
|
|
|
|
|
omMessageStore.CreateAttr("xmlns", nsHints)
|
|
|
|
|
omMessageEme := omMessage.CreateElement("encryption")
|
|
|
|
|
omMessageEme.CreateAttr("xmlns", nsEme)
|
|
|
|
|
omMessageEme.CreateAttr("namespace", nsOx)
|
|
|
|
|
omMessageOpgp := omMessage.CreateElement("openpgp")
|
|
|
|
|
omMessageOpgp.CreateAttr("xmlns", nsOx)
|
|
|
|
|
omMessageOpgp.CreateText(base64.StdEncoding.EncodeToString(pgpMessage.Data))
|
|
|
|
|
omMessageBody := omMessage.CreateElement("body")
|
|
|
|
|
omMessageBody.CreateText(oxAltBody)
|
|
|
|
|
oms, err := om.WriteToString()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "error", err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return string(om), nil
|
|
|
|
|
return oms, nil
|
|
|
|
|
}
|
|
|
|
|