Skip attachments with unrecoverable errors during sms export.

main
Cody Henthorne 2023-02-28 10:58:23 -05:00 zatwierdzone przez Greyson Parrelli
rodzic 57e8684bb3
commit 10e8c6d795
3 zmienionych plików z 23 dodań i 4 usunięć

Wyświetl plik

@ -22,6 +22,8 @@ import javax.crypto.spec.SecretKeySpec;
public class ModernDecryptingPartInputStream {
public static final String PREMATURE_END_ERROR_MESSAGE = "Prematurely reached end of stream!";
public static InputStream createFor(@NonNull AttachmentSecret attachmentSecret, @NonNull byte[] random, @NonNull File file, long offset)
throws IOException
{
@ -75,7 +77,7 @@ public class ModernDecryptingPartInputStream {
for (;;) {
int read = in.read(buffer, offset, buffer.length-offset);
if (read == -1) throw new IOException("Prematurely reached end of stream!");
if (read == -1) throw new IOException(PREMATURE_END_ERROR_MESSAGE);
else if (read + offset < buffer.length) offset += read;
else return;
}

Wyświetl plik

@ -9,6 +9,7 @@ import org.signal.smsexporter.ExportableMessage
import org.signal.smsexporter.SmsExportService
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.attachments.AttachmentId
import org.thoughtcrime.securesms.crypto.ModernDecryptingPartInputStream
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.database.model.MessageId
import org.thoughtcrime.securesms.database.model.databaseprotos.MessageExportState
@ -19,6 +20,7 @@ import org.thoughtcrime.securesms.notifications.NotificationChannels
import org.thoughtcrime.securesms.notifications.NotificationIds
import org.thoughtcrime.securesms.notifications.v2.NotificationPendingIntentHelper
import org.thoughtcrime.securesms.util.JsonUtils
import java.io.EOFException
import java.io.IOException
import java.io.InputStream
@ -168,7 +170,15 @@ class SignalSmsExportService : SmsExportService() {
@Throws(IOException::class)
override fun getInputStream(part: ExportableMessage.Mms.Part): InputStream {
return SignalDatabase.attachments.getAttachmentStream(JsonUtils.fromJson(part.contentId, AttachmentId::class.java), 0)
try {
return SignalDatabase.attachments.getAttachmentStream(JsonUtils.fromJson(part.contentId, AttachmentId::class.java), 0)
} catch (e: IOException) {
if (e.message == ModernDecryptingPartInputStream.PREMATURE_END_ERROR_MESSAGE) {
throw EOFException(e.message)
} else {
throw e
}
}
}
override fun onExportPassCompleted() {

Wyświetl plik

@ -14,6 +14,7 @@ import org.signal.smsexporter.internal.mms.ExportMmsPartsUseCase
import org.signal.smsexporter.internal.mms.ExportMmsRecipientsUseCase
import org.signal.smsexporter.internal.mms.GetOrCreateMmsThreadIdsUseCase
import org.signal.smsexporter.internal.sms.ExportSmsMessagesUseCase
import java.io.EOFException
import java.io.FileNotFoundException
import java.io.InputStream
import java.util.concurrent.Executor
@ -346,8 +347,14 @@ abstract class SmsExportService : Service() {
onAttachmentPartExportSucceeded(output.message, output.part)
Try.success(Unit)
} catch (e: Exception) {
Log.d(TAG, "Failed to write attachment to disk.", e)
Try.failure(e)
if (e is EOFException) {
Log.d(TAG, "Unrecoverable failure to write attachment to disk, marking as successful and moving on", e)
onAttachmentPartExportSucceeded(output.message, output.part)
Try.success(Unit)
} else {
Log.d(TAG, "Failed to write attachment to disk.", e)
Try.failure(e)
}
}
}