diff --git a/telegram/utils.go b/telegram/utils.go index 430b507..a1de641 100644 --- a/telegram/utils.go +++ b/telegram/utils.go @@ -3032,10 +3032,41 @@ func (c *Client) sendMessagesReverse(chatID int64, messages []*client.Message, p 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 { 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.SMOMEMOEnvelope(envelope), ) } } else {