diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 451e1550547426d88a439cc83bb6fe35af121b21..21e8628b96d9e871c01aa26549ceeafc2bb7eb79 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -79,6 +79,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.URI; +import java.security.NoSuchAlgorithmException; import java.security.Security; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; @@ -506,6 +507,18 @@ public class XmppConnectionService extends Service { this.databaseBackend.blockMedia(cid); } + public boolean isBlockedMedia(Cid cid) { + return databaseBackend.isBlockedMedia(cid); + } + + public boolean isBlockedMediaSha1(final String sha1sum) { + try { + return isBlockedMedia(CryptoHelper.cid(CryptoHelper.hexToBytes(sha1sum), "sha-1")); + } catch (final NoSuchAlgorithmException e) { + return false; + } + } + public void clearBlockedMedia() { this.databaseBackend.clearBlockedMedia(); } diff --git a/src/main/java/eu/siacs/conversations/xmpp/manager/AvatarManager.java b/src/main/java/eu/siacs/conversations/xmpp/manager/AvatarManager.java index 509bbf472d1a4c0ac5872d575c175ccaf314cfc2..27da8a577693f8bb06e7c8c53c5f9d52d8484057 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/manager/AvatarManager.java +++ b/src/main/java/eu/siacs/conversations/xmpp/manager/AvatarManager.java @@ -128,6 +128,11 @@ public class AvatarManager extends AbstractManager { } private ListenableFuture fetch(final Jid address, final String itemId) { + if (context.isBlockedMediaSha1(itemId)) { + final SettableFuture future = SettableFuture.create(); + future.setException(new XmppConnectionService.BlockedMediaException()); + return future; + } final var future = getManager(PubSubManager.class).fetchItem(address, itemId, Data.class); return Futures.transform(future, ByteContent::asBytes, MoreExecutors.directExecutor()); } @@ -261,6 +266,9 @@ public class AvatarManager extends AbstractManager { } private void setAvatar(final Jid from, @Nullable final String id) { + if (context.isBlockedMediaSha1(id)) { + return; + } Log.d(Config.LOGTAG, "setting avatar for " + from + " to " + id); if (from.isBareJid()) { setAvatarContact(from, id); @@ -412,7 +420,7 @@ public class AvatarManager extends AbstractManager { Collections2.filter( infos, i -> - Objects.nonNull(i.getId()) + Objects.nonNull(i.getId()) && !context.isBlockedMediaSha1(i.getId()) && i.getBytes() > 0 && i.getHeight() > 0 && i.getWidth() > 0 @@ -843,6 +851,11 @@ public class AvatarManager extends AbstractManager { } public ListenableFuture fetchAndStoreVCard(final Jid address, final String expectedHash) { + if (context.isBlockedMediaSha1(expectedHash)) { + final SettableFuture future = SettableFuture.create(); + future.setException(new XmppConnectionService.BlockedMediaException()); + return future; + } final var future = connection.getManager(VCardManager.class).retrievePhotoCacheException(address); return Futures.transformAsync(