do not retrieve media attributes from encrypted files

fixes #4353
This commit is contained in:
Daniel Gultsch 2022-08-12 09:58:33 +02:00
parent 150f8313a0
commit 7cc96e704e
2 changed files with 77 additions and 62 deletions

View file

@ -207,8 +207,8 @@ public class PgpDecryptionService {
} }
} }
final String url = message.getFileParams().url; final String url = message.getFileParams().url;
mXmppConnectionService.getFileBackend().updateFileParams(message, url);
message.setEncryption(Message.ENCRYPTION_DECRYPTED); message.setEncryption(Message.ENCRYPTION_DECRYPTED);
mXmppConnectionService.getFileBackend().updateFileParams(message, url);
mXmppConnectionService.updateMessage(message); mXmppConnectionService.updateMessage(message);
if (!inputFile.delete()) { if (!inputFile.delete()) {
Log.w(Config.LOGTAG,"unable to delete pgp encrypted source file "+inputFile.getAbsolutePath()); Log.w(Config.LOGTAG,"unable to delete pgp encrypted source file "+inputFile.getAbsolutePath());

View file

@ -66,7 +66,6 @@ import eu.siacs.conversations.services.AttachFileToConversationRunnable;
import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.ui.adapter.MediaAdapter; import eu.siacs.conversations.ui.adapter.MediaAdapter;
import eu.siacs.conversations.ui.util.Attachment; import eu.siacs.conversations.ui.util.Attachment;
import eu.siacs.conversations.utils.Compatibility;
import eu.siacs.conversations.utils.CryptoHelper; import eu.siacs.conversations.utils.CryptoHelper;
import eu.siacs.conversations.utils.FileUtils; import eu.siacs.conversations.utils.FileUtils;
import eu.siacs.conversations.utils.FileWriterException; import eu.siacs.conversations.utils.FileWriterException;
@ -400,27 +399,25 @@ public class FileBackend {
public static Uri getMediaUri(Context context, File file) { public static Uri getMediaUri(Context context, File file) {
final String filePath = file.getAbsolutePath(); final String filePath = file.getAbsolutePath();
final Cursor cursor; try (final Cursor cursor =
try {
cursor =
context.getContentResolver() context.getContentResolver()
.query( .query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[] {MediaStore.Images.Media._ID}, new String[] {MediaStore.Images.Media._ID},
MediaStore.Images.Media.DATA + "=? ", MediaStore.Images.Media.DATA + "=? ",
new String[] {filePath}, new String[] {filePath},
null); null)) {
} catch (SecurityException e) {
return null;
}
if (cursor != null && cursor.moveToFirst()) { if (cursor != null && cursor.moveToFirst()) {
final int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID)); final int id =
cursor.close(); cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID));
return Uri.withAppendedPath( return Uri.withAppendedPath(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, String.valueOf(id)); MediaStore.Images.Media.EXTERNAL_CONTENT_URI, String.valueOf(id));
} else { } else {
return null; return null;
} }
} catch (final Exception e) {
return null;
}
} }
public static void updateFileParams(Message message, String url, long size) { public static void updateFileParams(Message message, String url, long size) {
@ -1492,34 +1489,46 @@ public class FileBackend {
updateFileParams(message, null); updateFileParams(message, null);
} }
public void updateFileParams(Message message, String url) { public void updateFileParams(final Message message, final String url) {
DownloadableFile file = getFile(message); final boolean encrypted =
message.getEncryption() == Message.ENCRYPTION_PGP
|| message.getEncryption() == Message.ENCRYPTION_DECRYPTED;
final DownloadableFile file = getFile(message);
final String mime = file.getMimeType(); final String mime = file.getMimeType();
final boolean privateMessage = message.isPrivateMessage();
final boolean ambiguous = MimeUtils.AMBIGUOUS_CONTAINER_FORMATS.contains(mime);
final boolean image = final boolean image =
message.getType() == Message.TYPE_IMAGE message.getType() == Message.TYPE_IMAGE
|| (mime != null && mime.startsWith("image/")); || (mime != null && mime.startsWith("image/"));
final boolean video = mime != null && mime.startsWith("video/"); final boolean privateMessage = message.isPrivateMessage();
final boolean audio = mime != null && mime.startsWith("audio/");
final boolean pdf = "application/pdf".equals(mime);
final StringBuilder body = new StringBuilder(); final StringBuilder body = new StringBuilder();
if (url != null) { if (url != null) {
body.append(url); body.append(url);
} }
if (encrypted && !file.exists()) {
Log.d(Config.LOGTAG, "skipping updateFileParams because file is encrypted");
final DownloadableFile encryptedFile = getFile(message, false);
body.append('|').append(encryptedFile.getSize());
} else {
Log.d(Config.LOGTAG, "running updateFileParams");
final boolean ambiguous = MimeUtils.AMBIGUOUS_CONTAINER_FORMATS.contains(mime);
final boolean video = mime != null && mime.startsWith("video/");
final boolean audio = mime != null && mime.startsWith("audio/");
final boolean pdf = "application/pdf".equals(mime);
body.append('|').append(file.getSize()); body.append('|').append(file.getSize());
if (ambiguous) { if (ambiguous) {
try { try {
final Dimensions dimensions = getVideoDimensions(file); final Dimensions dimensions = getVideoDimensions(file);
if (dimensions.valid()) { if (dimensions.valid()) {
Log.d(Config.LOGTAG,"ambiguous file "+mime+" is video"); Log.d(Config.LOGTAG, "ambiguous file " + mime + " is video");
body.append('|').append(dimensions.width).append('|').append(dimensions.height); body.append('|')
.append(dimensions.width)
.append('|')
.append(dimensions.height);
} else { } else {
Log.d(Config.LOGTAG,"ambiguous file "+mime+" is audio"); Log.d(Config.LOGTAG, "ambiguous file " + mime + " is audio");
body.append("|0|0|").append(getMediaRuntime(file)); body.append("|0|0|").append(getMediaRuntime(file));
} }
} catch (final NotAVideoFile e) { } catch (final NotAVideoFile e) {
Log.d(Config.LOGTAG,"ambiguous file "+mime+" is audio"); Log.d(Config.LOGTAG, "ambiguous file " + mime + " is audio");
body.append("|0|0|").append(getMediaRuntime(file)); body.append("|0|0|").append(getMediaRuntime(file));
} }
} else if (image || video || pdf) { } else if (image || video || pdf) {
@ -1533,7 +1542,10 @@ public class FileBackend {
dimensions = getImageDimensions(file); dimensions = getImageDimensions(file);
} }
if (dimensions.valid()) { if (dimensions.valid()) {
body.append('|').append(dimensions.width).append('|').append(dimensions.height); body.append('|')
.append(dimensions.width)
.append('|')
.append(dimensions.height);
} }
} catch (NotAVideoFile notAVideoFile) { } catch (NotAVideoFile notAVideoFile) {
Log.d( Log.d(
@ -1544,6 +1556,7 @@ public class FileBackend {
} else if (audio) { } else if (audio) {
body.append("|0|0|").append(getMediaRuntime(file)); body.append("|0|0|").append(getMediaRuntime(file));
} }
}
message.setBody(body.toString()); message.setBody(body.toString());
message.setDeleted(false); message.setDeleted(false);
message.setType( message.setType(
@ -1556,12 +1569,14 @@ public class FileBackend {
try { try {
final MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever(); final MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
mediaMetadataRetriever.setDataSource(file.toString()); mediaMetadataRetriever.setDataSource(file.toString());
final String value = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); final String value =
mediaMetadataRetriever.extractMetadata(
MediaMetadataRetriever.METADATA_KEY_DURATION);
if (Strings.isNullOrEmpty(value)) { if (Strings.isNullOrEmpty(value)) {
return 0; return 0;
} }
return Integer.parseInt(value); return Integer.parseInt(value);
} catch (NumberFormatException e) { } catch (final IllegalArgumentException e) {
return 0; return 0;
} }
} }