Encrypt outgoing messages by !history command

This commit is contained in:
Bohdan Horbeshko 2026-07-29 06:14:59 -04:00
parent 71671a1b03
commit 942352a8df

View file

@ -3032,10 +3032,41 @@ func (c *Client) sendMessagesReverse(chatID int64, messages []*client.Message, p
from = sChatId from = sChatId
} }
body := c.formatMessage(0, 0, false, !isMUC, message)
// OMEMO encrypt hook - same rules as SendMessageToGateway's (see
// its doc comment): personal-chat pseudo-JIDs only, gated on
// the per-chat active flag, once per logical (historical)
// message. Real content must never go out in the clear if
// OMEMO is active but a session can't be established or
// encryption fails - gateway.OMEMOSendFailedBody is sent
// instead. This is the !history command's send path
// (sendMessagesReverse's plain branch) - easy to miss since it
// bypasses SendMessageToGateway entirely.
var envelope *e2ee.Envelope
if !isMUC && body != "" {
if backend, ok := gateway.E2EE.Backend(); ok {
owner := e2ee.OwnedPeer(c.Session.Login, gateway.CHATJID(chatID, false))
if active, _ := backend.Enabled(owner); active {
peer := e2ee.PeerID(c.jid)
if err := c.ensureOMEMOSession(backend, owner, peer); err != nil {
log.Error(errors.Wrap(err, "Failed to establish OMEMO session"))
body = gateway.OMEMOSendFailedBody
} else if env, err := backend.Encrypt(owner, []e2ee.PeerID{peer}, []byte(body)); err != nil {
log.Error(errors.Wrap(err, "Failed to encrypt OMEMO message"))
body = gateway.OMEMOSendFailedBody
} else {
envelope = &env
}
}
}
}
for _, to := range plainTos { for _, to := range plainTos {
gateway.SendMessage(to, from, c.xmpp, gateway.SendMessage(to, from, c.xmpp,
gateway.SMBody(c.formatMessage(0, 0, false, !isMUC, message)), gateway.SMId(sId), gateway.SMBody(body), gateway.SMId(sId),
gateway.SMReply(reply), gateway.SMIsGroupchat(isMUC), gateway.SMOriginalFrom(originalFrom), gateway.SMReply(reply), gateway.SMIsGroupchat(isMUC), gateway.SMOriginalFrom(originalFrom),
gateway.SMOMEMOEnvelope(envelope),
) )
} }
} else { } else {