Skip to content

Commit

Permalink
OMEMO: Fix sending messages when only old OMEMO is supported.
Browse files Browse the repository at this point in the history
  • Loading branch information
Yagiza committed Aug 14, 2021
1 parent f356997 commit e14b2d8
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 15 deletions.
35 changes: 20 additions & 15 deletions src/plugins/omemo/omemo.cpp
Expand Up @@ -1628,6 +1628,18 @@ int Omemo::isSupported(const IMessageAddress *AAddresses) const
return 0;
}

bool Omemo::isTrusted(SignalProtocol *ASignalProtocol, const QString &ABareJid,
const QList<quint32> &ADeviceIds, const QList<quint32> &AFailedDeviceIds,
const QHash<quint32, SignalDeviceBundle> &ABundles) const
{
for (QList<quint32>::ConstIterator it = ADeviceIds.constBegin();
it != ADeviceIds.constEnd(); ++it)
if (!AFailedDeviceIds.contains(*it) &&
ASignalProtocol->getIdentityTrusted(ABareJid, *it) == 1) // Trusted identity
return true;
return false;
}

bool Omemo::setActiveSession(const Jid &AStreamJid, const QString &ABareJid, bool AActive)
{
bool rc = false;
Expand Down Expand Up @@ -1877,7 +1889,8 @@ void Omemo::onOmemoActionTriggered()
Jid streamJid(action->data(ADR_STREAM_JID).toString());
Jid contactJid(action->data(ADR_CONTACT_JID).toString());
bool active = isActiveSession(streamJid, contactJid.bare());
if (setActiveSession(streamJid, contactJid.bare(), !active) && active)
if (setActiveSession(streamJid, contactJid.bare(), !active) && active &&
isSupported(contactJid.bare()).testFlag(OmemoNew))
sendOptOutStanza(streamJid, contactJid);
}
}
Expand Down Expand Up @@ -2412,7 +2425,6 @@ bool Omemo::messageReadWrite(int AOrder, const Jid &AStreamJid, Message &AMessag

if (FSignalProtocols.contains(AStreamJid))
{
SignalProtocol *signalProtocol = FSignalProtocols[AStreamJid];
if (ADirection == IMessageProcessor::DirectionOut)
{
Stanza stanza(AMessage.stanza());
Expand All @@ -2423,21 +2435,14 @@ bool Omemo::messageReadWrite(int AOrder, const Jid &AStreamJid, Message &AMessag
QString bareJid = stanza.toJid().bare();
if (isActiveSession(AStreamJid, bareJid))
{
bool haveTrustedIdentities(false);
if (isSupported(AStreamJid, stanza.toJid()))
{
QList<quint32> deviceIds = FDeviceIds[bareJid];
QList<quint32> failedDeviceIds = FFailedDeviceIds[bareJid];
QHash<quint32, SignalDeviceBundle> bundles = FBundles.value(bareJid);
for (QList<quint32>::ConstIterator it = deviceIds.constBegin();
it != deviceIds.constEnd(); ++it)
if (!failedDeviceIds.contains(*it) &&
signalProtocol->getIdentityTrusted(bareJid, *it) == 1) // Trusted identity
{
haveTrustedIdentities = true;
break;
}

bool haveTrustedIdentities = isTrusted(FSignalProtocols[AStreamJid], bareJid, FDeviceIds[bareJid],
FFailedDeviceIds[bareJid], FBundles.value(bareJid))
#ifndef NO_OMEMO_OLD
|| isTrusted(FSignalProtocolsOld[AStreamJid], bareJid, FDeviceIdsOld[bareJid],
FFailedDeviceIdsOld[bareJid], FBundlesOld.value(bareJid));
#endif
if (!haveTrustedIdentities)
{
//FIXME: Use appropriate message widget for the message box below
Expand Down
3 changes: 3 additions & 0 deletions src/plugins/omemo/omemo.h
Expand Up @@ -121,6 +121,9 @@ class Omemo: public QObject,
OmemoVersionFlags isSupported(const QString &ABareJid) const;
OmemoVersionFlags isSupported(const Jid &AStreamJid, const Jid &AContactJid) const;
int isSupported(const IMessageAddress *AAddresses) const;
bool isTrusted(SignalProtocol *ASignalProtocol, const QString &ABareJid,
const QList<quint32> &ADeviceIds, const QList<quint32> &AFailedDeviceIds,
const QHash<quint32, SignalDeviceBundle> &ABundles) const;
bool setActiveSession(const Jid &AStreamJid, const QString &ABareJid, bool AActive=true);
bool isActiveSession(const Jid &AStreamJid, const QString &ABareJid) const;
bool isActiveSession(const IMessageAddress *AAddresses) const;
Expand Down

0 comments on commit e14b2d8

Please sign in to comment.