|
|
|
@ -81,7 +81,7 @@ func oxDecrypt(m xmpp.Chat, client *xmpp.Client, iqc chan xmpp.IQ,
|
|
|
|
|
cryptMsgByte, err =
|
|
|
|
|
base64.StdEncoding.DecodeString(r.InnerXML)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "error", time.Now(), err
|
|
|
|
|
return strError, time.Now(), err
|
|
|
|
|
}
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
@ -89,53 +89,53 @@ func oxDecrypt(m xmpp.Chat, client *xmpp.Client, iqc chan xmpp.IQ,
|
|
|
|
|
oxMsg := crypto.NewPGPMessage(cryptMsgByte)
|
|
|
|
|
keyRing, err := crypto.NewKeyRing(oxPrivKey)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "error", time.Now(), err
|
|
|
|
|
return strError, time.Now(), err
|
|
|
|
|
}
|
|
|
|
|
senderKeyRing, err := oxGetPublicKeyRing(client, iqc, sender)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "error", time.Now(), err
|
|
|
|
|
return strError, time.Now(), err
|
|
|
|
|
}
|
|
|
|
|
decryptMsg, err := keyRing.Decrypt(oxMsg, senderKeyRing, crypto.GetUnixTime())
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "error", time.Now(), err
|
|
|
|
|
return strError, time.Now(), err
|
|
|
|
|
}
|
|
|
|
|
// Remove invalid code points.
|
|
|
|
|
message := validUTF8(string(decryptMsg.Data))
|
|
|
|
|
doc := etree.NewDocument()
|
|
|
|
|
err = doc.ReadFromString(message)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "error", time.Now(), err
|
|
|
|
|
return strError, time.Now(), err
|
|
|
|
|
}
|
|
|
|
|
signcrypt := doc.SelectElement("signcrypt")
|
|
|
|
|
if signcrypt == nil {
|
|
|
|
|
return "error", time.Now(), errors.New("ox: no signcrypt element")
|
|
|
|
|
return strError, time.Now(), errors.New("ox: no signcrypt element")
|
|
|
|
|
}
|
|
|
|
|
to := signcrypt.SelectElement("to")
|
|
|
|
|
if to == nil {
|
|
|
|
|
return "error", time.Now(), errors.New("ox: no to element")
|
|
|
|
|
return strError, time.Now(), errors.New("ox: no to element")
|
|
|
|
|
}
|
|
|
|
|
jid := to.SelectAttr("jid")
|
|
|
|
|
if jid == nil {
|
|
|
|
|
return "error", time.Now(), errors.New("ox: no jid attribute")
|
|
|
|
|
return strError, time.Now(), errors.New("ox: no jid attribute")
|
|
|
|
|
}
|
|
|
|
|
if strings.Split(jid.Value, "/")[0] != user {
|
|
|
|
|
return "error", time.Now(), errors.New("ox: encrypted for wrong user")
|
|
|
|
|
return strError, time.Now(), errors.New("ox: encrypted for wrong user")
|
|
|
|
|
}
|
|
|
|
|
timestamp := signcrypt.SelectElement("time")
|
|
|
|
|
if timestamp == nil {
|
|
|
|
|
return "error", time.Now(), errors.New("ox: no time element")
|
|
|
|
|
return strError, time.Now(), errors.New("ox: no time element")
|
|
|
|
|
}
|
|
|
|
|
stamp := timestamp.SelectAttr("stamp")
|
|
|
|
|
if stamp == nil {
|
|
|
|
|
return "error", time.Now(), errors.New("ox: no stamp attribute")
|
|
|
|
|
return strError, time.Now(), errors.New("ox: no stamp attribute")
|
|
|
|
|
}
|
|
|
|
|
msgStamp, err := time.Parse("2006-01-02T15:04:05Z0700", stamp.Value)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "error", time.Now(), err
|
|
|
|
|
return strError, time.Now(), err
|
|
|
|
|
}
|
|
|
|
|
payload := signcrypt.SelectElement("payload")
|
|
|
|
|
if payload == nil {
|
|
|
|
|
return "error", time.Now(), errors.New("ox: no payload element")
|
|
|
|
|
return strError, time.Now(), errors.New("ox: no payload element")
|
|
|
|
|
}
|
|
|
|
|
body := payload.SelectElement("body")
|
|
|
|
|
if body == nil {
|
|
|
|
@ -334,10 +334,10 @@ func oxGetPrivKeyLoc(jid string) (string, error) {
|
|
|
|
|
default:
|
|
|
|
|
homeDir, err = os.UserHomeDir()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "error", err
|
|
|
|
|
return strError, err
|
|
|
|
|
}
|
|
|
|
|
if homeDir == "" {
|
|
|
|
|
return "error", err
|
|
|
|
|
return strError, err
|
|
|
|
|
}
|
|
|
|
|
dataDir = homeDir + "/.local/share"
|
|
|
|
|
}
|
|
|
|
@ -345,7 +345,7 @@ func oxGetPrivKeyLoc(jid string) (string, error) {
|
|
|
|
|
if _, err = os.Stat(dataDir); os.IsNotExist(err) {
|
|
|
|
|
err = os.MkdirAll(dataDir, 0700)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "error", err
|
|
|
|
|
return strError, err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
dataFile := dataDir + base64.StdEncoding.EncodeToString([]byte(jid))
|
|
|
|
@ -367,10 +367,10 @@ func oxGetPubKeyLoc(fingerprint string) (string, error) {
|
|
|
|
|
default:
|
|
|
|
|
homeDir, err = os.UserHomeDir()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "error", err
|
|
|
|
|
return strError, err
|
|
|
|
|
}
|
|
|
|
|
if homeDir == "" {
|
|
|
|
|
return "error", err
|
|
|
|
|
return strError, err
|
|
|
|
|
}
|
|
|
|
|
dataDir = homeDir + "/.local/share"
|
|
|
|
|
}
|
|
|
|
@ -378,7 +378,7 @@ func oxGetPubKeyLoc(fingerprint string) (string, error) {
|
|
|
|
|
if _, err = os.Stat(dataDir); os.IsNotExist(err) {
|
|
|
|
|
err = os.MkdirAll(dataDir, 0700)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "error", err
|
|
|
|
|
return strError, err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
dataFile := dataDir + fingerprint
|
|
|
|
@ -703,7 +703,7 @@ func oxEncrypt(client *xmpp.Client, iqc chan xmpp.IQ, oxPrivKey *crypto.Key,
|
|
|
|
|
}
|
|
|
|
|
privKeyRing, err := crypto.NewKeyRing(oxPrivKey)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "error", err
|
|
|
|
|
return strError, err
|
|
|
|
|
}
|
|
|
|
|
ownJid := strings.Split(client.JID(), "/")[0]
|
|
|
|
|
if recipient != ownJid {
|
|
|
|
@ -729,12 +729,12 @@ func oxEncrypt(client *xmpp.Client, iqc chan xmpp.IQ, oxPrivKey *crypto.Key,
|
|
|
|
|
oxCryptMessageScPayloadBody.CreateText(message)
|
|
|
|
|
ocm, err := oxCryptMessage.WriteToString()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "error", err
|
|
|
|
|
return strError, err
|
|
|
|
|
}
|
|
|
|
|
plainMessage := crypto.NewPlainMessage([]byte(ocm))
|
|
|
|
|
pgpMessage, err := keyRing.Encrypt(plainMessage, privKeyRing)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "error", err
|
|
|
|
|
return strError, err
|
|
|
|
|
}
|
|
|
|
|
om := etree.NewDocument()
|
|
|
|
|
om.WriteSettings.AttrSingleQuote = true
|
|
|
|
@ -753,7 +753,7 @@ func oxEncrypt(client *xmpp.Client, iqc chan xmpp.IQ, oxPrivKey *crypto.Key,
|
|
|
|
|
omMessageBody.CreateText(oxAltBody)
|
|
|
|
|
oms, err := om.WriteToString()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "error", err
|
|
|
|
|
return strError, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return oms, nil
|
|
|
|
|