forked from seedvault-app/seedvault
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Use new Backend directly in storage lib
- Loading branch information
Showing
24 changed files
with
446 additions
and
406 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
70 changes: 70 additions & 0 deletions
70
storage/demo/src/main/java/de/grobox/storagebackuptester/plugin/TestSafBackend.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
/* | ||
* SPDX-FileCopyrightText: 2021 The Calyx Institute | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package de.grobox.storagebackuptester.plugin | ||
|
||
import android.content.Context | ||
import android.net.Uri | ||
import org.calyxos.seedvault.core.backends.Backend | ||
import org.calyxos.seedvault.core.backends.FileHandle | ||
import org.calyxos.seedvault.core.backends.FileInfo | ||
import org.calyxos.seedvault.core.backends.TopLevelFolder | ||
import org.calyxos.seedvault.core.backends.saf.SafBackend | ||
import org.calyxos.seedvault.core.backends.saf.SafConfig | ||
import java.io.InputStream | ||
import java.io.OutputStream | ||
import kotlin.reflect.KClass | ||
|
||
class TestSafBackend( | ||
private val appContext: Context, | ||
private val getLocationUri: () -> Uri?, | ||
) : Backend { | ||
|
||
private val safConfig | ||
get() = SafConfig( | ||
config = getLocationUri() ?: error("no uri"), | ||
name = "foo", | ||
isUsb = false, | ||
requiresNetwork = false, | ||
rootId = "bar", | ||
) | ||
private val delegate: SafBackend get() = SafBackend(appContext, safConfig) | ||
|
||
private val nullStream = object : OutputStream() { | ||
override fun write(b: Int) { | ||
// oops | ||
} | ||
} | ||
|
||
override suspend fun test(): Boolean = delegate.test() | ||
|
||
override suspend fun getFreeSpace(): Long? = delegate.getFreeSpace() | ||
|
||
override suspend fun save(handle: FileHandle): OutputStream { | ||
if (getLocationUri() == null) return nullStream | ||
return delegate.save(handle) | ||
} | ||
|
||
override suspend fun load(handle: FileHandle): InputStream { | ||
return delegate.load(handle) | ||
} | ||
|
||
override suspend fun list( | ||
topLevelFolder: TopLevelFolder?, | ||
vararg fileTypes: KClass<out FileHandle>, | ||
callback: (FileInfo) -> Unit, | ||
) = delegate.list(topLevelFolder, *fileTypes, callback = callback) | ||
|
||
override suspend fun remove(handle: FileHandle) = delegate.remove(handle) | ||
|
||
override suspend fun rename(from: TopLevelFolder, to: TopLevelFolder) { | ||
delegate.rename(from, to) | ||
} | ||
|
||
override suspend fun removeAll() = delegate.removeAll() | ||
|
||
override val providerPackageName: String? get() = delegate.providerPackageName | ||
|
||
} |
47 changes: 0 additions & 47 deletions
47
storage/demo/src/main/java/de/grobox/storagebackuptester/plugin/TestSafStoragePlugin.kt
This file was deleted.
Oops, something went wrong.
67 changes: 67 additions & 0 deletions
67
storage/lib/src/main/java/org/calyxos/backup/storage/SnapshotRetriever.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
/* | ||
* SPDX-FileCopyrightText: 2024 The Calyx Institute | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package org.calyxos.backup.storage | ||
|
||
import com.google.protobuf.InvalidProtocolBufferException | ||
import org.calyxos.backup.storage.api.StoredSnapshot | ||
import org.calyxos.backup.storage.backup.BackupSnapshot | ||
import org.calyxos.backup.storage.crypto.StreamCrypto | ||
import org.calyxos.backup.storage.restore.readVersion | ||
import org.calyxos.seedvault.core.backends.Backend | ||
import org.calyxos.seedvault.core.backends.FileBackupFileType | ||
import org.calyxos.seedvault.core.backends.TopLevelFolder | ||
import java.io.IOException | ||
import java.security.GeneralSecurityException | ||
|
||
internal class SnapshotRetriever( | ||
private val storagePlugin: () -> Backend, | ||
private val streamCrypto: StreamCrypto = StreamCrypto, | ||
) { | ||
|
||
@Throws( | ||
IOException::class, | ||
GeneralSecurityException::class, | ||
InvalidProtocolBufferException::class, | ||
) | ||
suspend fun getSnapshot(streamKey: ByteArray, storedSnapshot: StoredSnapshot): BackupSnapshot { | ||
return storagePlugin().load(storedSnapshot.snapshotHandle).use { inputStream -> | ||
val version = inputStream.readVersion() | ||
val timestamp = storedSnapshot.timestamp | ||
val ad = streamCrypto.getAssociatedDataForSnapshot(timestamp, version.toByte()) | ||
streamCrypto.newDecryptingStream(streamKey, inputStream, ad).use { decryptedStream -> | ||
BackupSnapshot.parseFrom(decryptedStream) | ||
} | ||
} | ||
} | ||
|
||
} | ||
|
||
@Throws(IOException::class) | ||
internal suspend fun Backend.getCurrentBackupSnapshots(androidId: String): List<StoredSnapshot> { | ||
val topLevelFolder = TopLevelFolder("$androidId.sv") | ||
val snapshots = ArrayList<StoredSnapshot>() | ||
list(topLevelFolder, FileBackupFileType.Snapshot::class) { fileInfo -> | ||
val handle = fileInfo.fileHandle as FileBackupFileType.Snapshot | ||
val folderName = handle.topLevelFolder.name | ||
val timestamp = handle.time | ||
val storedSnapshot = StoredSnapshot(folderName, timestamp) | ||
snapshots.add(storedSnapshot) | ||
} | ||
return snapshots | ||
} | ||
|
||
@Throws(IOException::class) | ||
internal suspend fun Backend.getBackupSnapshotsForRestore(): List<StoredSnapshot> { | ||
val snapshots = ArrayList<StoredSnapshot>() | ||
list(null, FileBackupFileType.Snapshot::class) { fileInfo -> | ||
val handle = fileInfo.fileHandle as FileBackupFileType.Snapshot | ||
val folderName = handle.topLevelFolder.name | ||
val timestamp = handle.time | ||
val storedSnapshot = StoredSnapshot(folderName, timestamp) | ||
snapshots.add(storedSnapshot) | ||
} | ||
return snapshots | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.