Compare commits

...

3 Commits

Author SHA1 Message Date
Vetle Ledaal
99ba555e80 fix lint 2024-07-28 00:27:27 +02:00
Vetle Ledaal
1a96d8c990 Use more generic error message if protobuf fails 2024-07-28 00:08:50 +02:00
Vetle Ledaal
bfbab7f129 Replace Exception with IOException 2024-07-28 00:07:29 +02:00
2 changed files with 17 additions and 6 deletions

View File

@@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.data.backup
import android.content.Context
import android.net.Uri
import eu.kanade.tachiyomi.data.backup.models.Backup
import kotlinx.serialization.SerializationException
import kotlinx.serialization.protobuf.ProtoBuf
import okio.buffer
import okio.gzip
@@ -11,12 +12,12 @@ import tachiyomi.core.common.i18n.stringResource
import tachiyomi.i18n.MR
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.io.IOException
class BackupDecoder(
private val context: Context,
private val parser: ProtoBuf = Injekt.get(),
) {
/**
* Decode a potentially-gzipped backup.
*/
@@ -28,16 +29,25 @@ class BackupDecoder(
require(2)
}
val id1id2 = peeked.readShort()
val backupString = when(id1id2.toInt()) {
val backupString = when (id1id2.toInt()) {
0x1f8b -> source.gzip().buffer() // 0x1f8b is gzip magic bytes
0x7b7d, 0x7b22, 0x7b0a -> {
// `{}` OR `{"` OR `{\n`
throw Exception(context.stringResource(MR.strings.invalid_backup_file_json))
MAGIC_JSON_SIGNATURE1, MAGIC_JSON_SIGNATURE2, MAGIC_JSON_SIGNATURE3 -> {
throw IOException(context.stringResource(MR.strings.invalid_backup_file_json))
}
else -> source
}.use { it.readByteArray() }
parser.decodeFromByteArray(Backup.serializer(), backupString)
try {
parser.decodeFromByteArray(Backup.serializer(), backupString)
} catch (_: SerializationException) {
throw IOException(context.stringResource(MR.strings.invalid_backup_file_unknown))
}
}
}
companion object {
private const val MAGIC_JSON_SIGNATURE1 = 0x7b7d // `{}`
private const val MAGIC_JSON_SIGNATURE2 = 0x7b22 // `{"`
private const val MAGIC_JSON_SIGNATURE3 = 0x7b0a // `{\n`
}
}

View File

@@ -519,6 +519,7 @@
<string name="invalid_backup_file_error">Full error:</string>
<string name="invalid_backup_file_missing_manga">Backup does not contain any library entries.</string>
<string name="invalid_backup_file_json">JSON backup not supported</string>
<string name="invalid_backup_file_unknown">Backup file is corrupted</string>
<string name="backup_restore_missing_sources">Missing sources:</string>
<string name="backup_restore_missing_trackers">Trackers not logged into:</string>
<string name="backup_restore_content_full">You may need to install any missing extensions and log in to tracking services afterwards to use them.</string>