Fix block avatar

Stephen Paul Weber created

Change summary

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java | 13 
src/main/java/eu/siacs/conversations/xmpp/manager/AvatarManager.java     | 15 
2 files changed, 27 insertions(+), 1 deletion(-)

Detailed changes

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();
     }

src/main/java/eu/siacs/conversations/xmpp/manager/AvatarManager.java 🔗

@@ -128,6 +128,11 @@ public class AvatarManager extends AbstractManager {
     }
 
     private ListenableFuture<byte[]> fetch(final Jid address, final String itemId) {
+        if (context.isBlockedMediaSha1(itemId)) {
+            final SettableFuture<byte[]> 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<Void> fetchAndStoreVCard(final Jid address, final String expectedHash) {
+        if (context.isBlockedMediaSha1(expectedHash)) {
+            final SettableFuture<Void> future = SettableFuture.create();
+            future.setException(new XmppConnectionService.BlockedMediaException());
+            return future;
+        }
         final var future =
                 connection.getManager(VCardManager.class).retrievePhotoCacheException(address);
         return Futures.transformAsync(