From 0272a094ec8bc86286bc108457f852122e2f558e Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Fri, 18 Sep 2020 12:04:18 -0300 Subject: [PATCH] Add backup of local contacts as an extra APK so we can use the existing system backup API and keep this code (and the tests as well as permissions) nicely separate from seedvault itself --- Android.bp | 1 + contactsbackup/.gitignore | 1 + contactsbackup/Android.bp | 24 +++ contactsbackup/README.md | 10 ++ contactsbackup/build.gradle | 67 ++++++++ ...ermissions_org.calyxos.backup.contacts.xml | 7 + contactsbackup/libs/com.android.vcard.jar | Bin 0 -> 133362 bytes .../src/androidTest/AndroidManifest.xml | 7 + .../backup/contacts/BackupRestoreTest.kt | 83 ++++++++++ .../calyxos/backup/contacts/ContactUtils.kt | 116 +++++++++++++ contactsbackup/src/main/AndroidManifest.xml | 33 ++++ .../backup/contacts/ContactsBackupAgent.java | 156 ++++++++++++++++++ .../contacts/FullBackupFileHandler.java | 11 ++ .../contacts/StartBroadcastReceiver.java | 31 ++++ .../backup/contacts/VCardExporter.java | 65 ++++++++ .../backup/contacts/VCardImporter.java | 71 ++++++++ .../src/main/res/values/strings.xml | 4 + .../contacts/ContactsBackupAgentTest.kt | 122 ++++++++++++++ settings.gradle | 1 + 19 files changed, 810 insertions(+) create mode 100644 contactsbackup/.gitignore create mode 100644 contactsbackup/Android.bp create mode 100644 contactsbackup/README.md create mode 100644 contactsbackup/build.gradle create mode 100644 contactsbackup/default-permissions_org.calyxos.backup.contacts.xml create mode 100644 contactsbackup/libs/com.android.vcard.jar create mode 100644 contactsbackup/src/androidTest/AndroidManifest.xml create mode 100644 contactsbackup/src/androidTest/java/org/calyxos/backup/contacts/BackupRestoreTest.kt create mode 100644 contactsbackup/src/androidTest/java/org/calyxos/backup/contacts/ContactUtils.kt create mode 100644 contactsbackup/src/main/AndroidManifest.xml create mode 100644 contactsbackup/src/main/java/org/calyxos/backup/contacts/ContactsBackupAgent.java create mode 100644 contactsbackup/src/main/java/org/calyxos/backup/contacts/FullBackupFileHandler.java create mode 100644 contactsbackup/src/main/java/org/calyxos/backup/contacts/StartBroadcastReceiver.java create mode 100644 contactsbackup/src/main/java/org/calyxos/backup/contacts/VCardExporter.java create mode 100644 contactsbackup/src/main/java/org/calyxos/backup/contacts/VCardImporter.java create mode 100644 contactsbackup/src/main/res/values/strings.xml create mode 100644 contactsbackup/src/test/java/org/calyxos/backup/contacts/ContactsBackupAgentTest.kt diff --git a/Android.bp b/Android.bp index ae3116dd..258391b7 100644 --- a/Android.bp +++ b/Android.bp @@ -42,6 +42,7 @@ android_app { certificate: "platform", privileged: true, required: [ + "LocalContactsBackup", "privapp_whitelist_com.stevesoltys.backup", "com.stevesoltys.backup_whitelist" ], diff --git a/contactsbackup/.gitignore b/contactsbackup/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/contactsbackup/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/contactsbackup/Android.bp b/contactsbackup/Android.bp new file mode 100644 index 00000000..9a4e2e60 --- /dev/null +++ b/contactsbackup/Android.bp @@ -0,0 +1,24 @@ +android_app { + name: "LocalContactsBackup", + srcs: [ + "src/main/java/**/*.java", + ], + resource_dirs: [ + "src/main/res", + ], + manifest: "src/main/AndroidManifest.xml", + static_libs: [ + "com.android.vcard", + ], + required: [ + "default-permissions_org.calyxos.backup.contacts", + ], + sdk_version: "current", +} + +prebuilt_etc { + name: "default-permissions_org.calyxos.backup.contacts", + sub_dir: "default-permissions", + src: "default-permissions_org.calyxos.backup.contacts.xml", + filename_from_src: true, +} diff --git a/contactsbackup/README.md b/contactsbackup/README.md new file mode 100644 index 00000000..28246f0c --- /dev/null +++ b/contactsbackup/README.md @@ -0,0 +1,10 @@ +# Local Contacts Backup + +A backup application that backs up local on-device contacts via the system's backup API. +This explicitly excludes contacts that are synced via sync accounts +such as [DAVx⁵](https://www.davx5.com/). + +## Permissions + +* `android.permission.READ_CONTACTS` to back up local contacts. +* `android.permission.WRITE_CONTACTS` to restore local contacts to the device. diff --git a/contactsbackup/build.gradle b/contactsbackup/build.gradle new file mode 100644 index 00000000..eb622f90 --- /dev/null +++ b/contactsbackup/build.gradle @@ -0,0 +1,67 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.2" + + defaultConfig { + applicationId "org.calyxos.backup.contacts" + minSdkVersion 30 + targetSdkVersion 30 + versionCode 30 + versionName "0.1" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + compileOptions { + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + } + + testOptions { + unitTests.returnDefaultValues = true + } + + // optional signingConfigs + // On userdebug builds, you can use the testkey here to update the system app + def keystorePropertiesFile = project.file("keystore.properties") + if (keystorePropertiesFile.exists()) { + def keystoreProperties = new Properties() + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) + + signingConfigs { + release { + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile file(keystoreProperties['storeFile']) + storePassword keystoreProperties['storePassword'] + } + } + buildTypes.release.signingConfig = signingConfigs.release + buildTypes.debug.signingConfig = signingConfigs.release + } +} + +def aospDeps = fileTree(include: [ + // out/target/common/obj/JAVA_LIBRARIES/com.android.vcard_intermediates/classes.jar + 'com.android.vcard.jar' +], dir: 'libs') + +dependencies { + implementation aospDeps + + //noinspection GradleDependency + testImplementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" + testImplementation 'junit:junit:4.13' + def mockk_version = "1.10.0" + testImplementation "io.mockk:mockk:$mockk_version" + + //noinspection GradleDependency + androidTestImplementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + def espresso_version = "3.3.0" + androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_version" + androidTestImplementation "io.mockk:mockk-android:$mockk_version" +} diff --git a/contactsbackup/default-permissions_org.calyxos.backup.contacts.xml b/contactsbackup/default-permissions_org.calyxos.backup.contacts.xml new file mode 100644 index 00000000..16e8ab90 --- /dev/null +++ b/contactsbackup/default-permissions_org.calyxos.backup.contacts.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/contactsbackup/libs/com.android.vcard.jar b/contactsbackup/libs/com.android.vcard.jar new file mode 100644 index 0000000000000000000000000000000000000000..9cd0189322ef29abbf37504357a228eacb830a39 GIT binary patch literal 133362 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

K53nRQ*KD>t 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 X!vOlAAP^Y%nFC(GZL9)a8_@p&a|k1j literal 0 HcmV?d00001 diff --git a/contactsbackup/src/androidTest/AndroidManifest.xml b/contactsbackup/src/androidTest/AndroidManifest.xml new file mode 100644 index 00000000..1c51a97e --- /dev/null +++ b/contactsbackup/src/androidTest/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/contactsbackup/src/androidTest/java/org/calyxos/backup/contacts/BackupRestoreTest.kt b/contactsbackup/src/androidTest/java/org/calyxos/backup/contacts/BackupRestoreTest.kt new file mode 100644 index 00000000..6d2d6e54 --- /dev/null +++ b/contactsbackup/src/androidTest/java/org/calyxos/backup/contacts/BackupRestoreTest.kt @@ -0,0 +1,83 @@ +package org.calyxos.backup.contacts + +import android.app.backup.BackupAgent +import android.app.backup.BackupAgent.TYPE_FILE +import android.app.backup.FullBackupDataOutput +import android.os.ParcelFileDescriptor +import android.os.ParcelFileDescriptor.MODE_READ_ONLY +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import io.mockk.every +import io.mockk.mockk +import org.calyxos.backup.contacts.ContactUtils.Contact +import org.calyxos.backup.contacts.ContactsBackupAgent.BACKUP_FILE +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test +import org.junit.runner.RunWith +import java.io.File + +@RunWith(AndroidJUnit4::class) +class BackupRestoreTest { + + private val context = InstrumentationRegistry.getInstrumentation().targetContext + private val resolver = context.contentResolver + private val utils = ContactUtils(resolver) + + private val fileHandler = object : FullBackupFileHandler { + var bytes: ByteArray? = null + override fun fullBackupFile(file: File, output: FullBackupDataOutput?) { + bytes = file.readBytes() + } + } + + // we are calling agent ourselves, because using bmgr will kill our process making test fail + private val agent = ContactsBackupAgent(context, fileHandler) + + @Test + fun testBackupAndRestore() { + assertEquals( + "Test will remove *all* contacts and thus requires empty address book", + 0, + utils.getNumberOfContacts() + ) + val contacts = listOf( + Contact("Test Contact 1", "+49123456789", "test@example.com"), + Contact("Test Contact 2", "+559876543210", "test@example.org") + ) + for (c in contacts) utils.addContact(c) + assertEquals(2, utils.getNumberOfContacts()) + assertNull(fileHandler.bytes) + + val data: FullBackupDataOutput = mockk() + every { data.transportFlags } returns BackupAgent.FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED + + // do actual backup by calling agent directly + agent.onFullBackup(data) + assertTrue(fileHandler.bytes!!.isNotEmpty()) + + // preparing file for restore + val tmp = File(context.cacheDir, "tmp") + tmp.writeBytes(fileHandler.bytes!!) + val fd = ParcelFileDescriptor.open(tmp, MODE_READ_ONLY) + val dest = File(context.filesDir, BACKUP_FILE) + + // now delete all contacts, so we can restore them + utils.deleteAllContacts() + assertEquals(0, utils.getNumberOfContacts()) + + // do restore by calling agent directly + val mode = 384L // 0600 in octal + agent.onRestoreFile(fd, tmp.length(), dest, TYPE_FILE, mode, 0) + + // check that restored contacts match what we backed up + assertEquals(2, utils.getNumberOfContacts()) + assertEquals(contacts.sortedBy { it.name }, utils.getContacts().sortedBy { it.name }) + + // delete everything again + utils.deleteAllContacts() + assertEquals(0, utils.getNumberOfContacts()) + } + +} diff --git a/contactsbackup/src/androidTest/java/org/calyxos/backup/contacts/ContactUtils.kt b/contactsbackup/src/androidTest/java/org/calyxos/backup/contacts/ContactUtils.kt new file mode 100644 index 00000000..0eb79785 --- /dev/null +++ b/contactsbackup/src/androidTest/java/org/calyxos/backup/contacts/ContactUtils.kt @@ -0,0 +1,116 @@ +package org.calyxos.backup.contacts + +import android.content.ContentProviderOperation +import android.content.ContentResolver +import android.net.Uri +import android.provider.ContactsContract +import android.provider.ContactsContract.CommonDataKinds.Email +import android.provider.ContactsContract.CommonDataKinds.Phone +import android.provider.ContactsContract.CommonDataKinds.StructuredName +import android.provider.ContactsContract.Contacts +import android.provider.ContactsContract.Data +import android.provider.ContactsContract.RawContacts + +class ContactUtils(private val resolver: ContentResolver) { + + data class Contact( + val name: String?, + val phone: String?, + val email: String? + ) + + fun addContact(contact: Contact) { + val ops = ArrayList().apply { + add( + ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) + .withValue(RawContacts.ACCOUNT_TYPE, null) + .withValue(RawContacts.ACCOUNT_NAME, null) + .build() + ) + add( + ContentProviderOperation.newInsert(Data.CONTENT_URI) + .withValueBackReference(Data.RAW_CONTACT_ID, 0) + .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) + .withValue(StructuredName.DISPLAY_NAME, contact.name) + .build() + ) + add( + ContentProviderOperation.newInsert(Data.CONTENT_URI) + .withValueBackReference(Data.RAW_CONTACT_ID, 0) + .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE) + .withValue(Phone.NUMBER, contact.phone) + .withValue(Phone.TYPE, Phone.TYPE_HOME) + .build() + ) + add( + ContentProviderOperation.newInsert(Data.CONTENT_URI) + .withValueBackReference(Data.RAW_CONTACT_ID, 0) + .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE) + .withValue(Email.ADDRESS, contact.email) + .withValue(Email.TYPE, Email.TYPE_WORK) + .build() + ) + } + resolver.applyBatch(ContactsContract.AUTHORITY, ops) + } + + fun getContacts(): List { + val lookupKeys = ArrayList() + resolver.query(Contacts.CONTENT_URI, arrayOf(Contacts.LOOKUP_KEY), null, null, null) + .use { cursor -> + while (cursor!!.moveToNext()) { + lookupKeys.add(cursor.getString(0)) + } + } + val contacts = ArrayList() + for (key in lookupKeys) { + val name = getDetail(key, StructuredName.DISPLAY_NAME, StructuredName.CONTENT_ITEM_TYPE) + val phone = getDetail(key, Phone.NUMBER, Phone.CONTENT_ITEM_TYPE) + val email = getDetail(key, Email.ADDRESS, Email.CONTENT_ITEM_TYPE) + contacts.add(Contact(name, phone, email)) + } + return contacts + } + + private fun getDetail(lookupKey: String, detail: String, mimeType: String): String? { + val projection = arrayOf(detail) + val selection = "${Contacts.LOOKUP_KEY}=? AND ${Data.MIMETYPE}=?" + val args = arrayOf(lookupKey, mimeType) + resolver.query(Data.CONTENT_URI, projection, selection, args, null) + ?.use { cursor -> + while (cursor.moveToNext()) { + return cursor.getString(0) + } + } + return null + } + + fun deleteAllContacts() { + val ops = ArrayList() + resolver.query( + Contacts.CONTENT_URI, + arrayOf(Contacts.LOOKUP_KEY), + null, + null, + null + ).use { cursor -> + while (cursor!!.moveToNext()) { + val uri: Uri = + Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, cursor.getString(0)) + ops.add(ContentProviderOperation.newDelete(uri).build()) + } + } + resolver.applyBatch(ContactsContract.AUTHORITY, ops) + } + + fun getNumberOfContacts(): Int { + return resolver.query( + Contacts.CONTENT_URI, + arrayOf(Contacts.LOOKUP_KEY), + null, + null, + null + )!!.count + } + +} diff --git a/contactsbackup/src/main/AndroidManifest.xml b/contactsbackup/src/main/AndroidManifest.xml new file mode 100644 index 00000000..43fa2699 --- /dev/null +++ b/contactsbackup/src/main/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/contactsbackup/src/main/java/org/calyxos/backup/contacts/ContactsBackupAgent.java b/contactsbackup/src/main/java/org/calyxos/backup/contacts/ContactsBackupAgent.java new file mode 100644 index 00000000..7ebf0a9d --- /dev/null +++ b/contactsbackup/src/main/java/org/calyxos/backup/contacts/ContactsBackupAgent.java @@ -0,0 +1,156 @@ +package org.calyxos.backup.contacts; + +import android.app.backup.BackupAgent; +import android.app.backup.BackupDataInput; +import android.app.backup.BackupDataOutput; +import android.app.backup.FullBackupDataOutput; +import android.content.Context; +import android.os.ParcelFileDescriptor; +import android.util.Log; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Optional; + +import static android.Manifest.permission.READ_CONTACTS; +import static android.Manifest.permission.WRITE_CONTACTS; +import static android.content.pm.PackageManager.PERMISSION_GRANTED; + +public class ContactsBackupAgent extends BackupAgent implements FullBackupFileHandler { + + private final static String TAG = "ContactsBackupAgent"; + final static String BACKUP_FILE = "backup-v1.tar"; + final static boolean DEBUG = false; // don't commit with true + + private final Context testContext; + private final FullBackupFileHandler fileHandler; + + public ContactsBackupAgent() { + super(); + testContext = null; + fileHandler = this; + } + + /** + * Only for testing + */ + ContactsBackupAgent(Context context, FullBackupFileHandler fileHandler) { + super(); + testContext = context; + attachBaseContext(context); + this.fileHandler = fileHandler; + } + + private Context getContext() { + if (testContext != null) return testContext; + else return getBaseContext(); + } + + @Override + public void onFullBackup(FullBackupDataOutput data) throws IOException { + if (shouldAvoidBackup(data)) { + Log.w(TAG, "onFullBackup - will not back up due to flags: " + data.getTransportFlags()); + return; + } + + if (getContext().checkSelfPermission(READ_CONTACTS) != PERMISSION_GRANTED) { + throw new IOException("Permission READ_CONTACTS not granted."); + } + + // get VCARDs as an InputStream + VCardExporter vCardExporter = new VCardExporter(getContentResolver()); + Optional optionalInputStream = vCardExporter.getVCardInputStream(); + if (!optionalInputStream.isPresent()) { + Log.i(TAG, "onFullBackup - found no contacts. Not backing up."); + return; + } + InputStream vCardInputStream = optionalInputStream.orElseThrow(AssertionError::new); + + Log.d(TAG, "onFullBackup - will do backup"); + + // create backup file as an OutputStream + File backupFile = new File(getContext().getFilesDir(), BACKUP_FILE); + FileOutputStream backupFileOutputStream = new FileOutputStream(backupFile); + + // write VCARDs into backup file + try { + copyStreams(vCardInputStream, backupFileOutputStream); + } finally { + backupFileOutputStream.close(); + vCardInputStream.close(); + } + + // backup file + fileHandler.fullBackupFile(backupFile, data); + + // delete file when done + if (!backupFile.delete()) { + Log.w(TAG, "Could not delete: " + backupFile.getAbsolutePath()); + } + } + + private boolean shouldAvoidBackup(FullBackupDataOutput data) { + boolean isEncrypted = (data.getTransportFlags() & FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) != 0; + boolean isDeviceTransfer = (data.getTransportFlags() & FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0; + return !isEncrypted && !isDeviceTransfer; + } + + private void copyStreams(InputStream inputStream, OutputStream outputStream) throws IOException { + byte[] buf = new byte[8192]; + int length; + while ((length = inputStream.read(buf)) > 0) { + outputStream.write(buf, 0, length); + if (DEBUG) { + Log.e(TAG, new String(buf, 0, length)); + } + } + } + + @Override + public void onRestoreFile(ParcelFileDescriptor data, long size, File destination, int type, long mode, long mtime) throws IOException { + Log.d(TAG, "onRestoreFile " + mode); + super.onRestoreFile(data, size, destination, type, mode, mtime); + + if (getContext().checkSelfPermission(WRITE_CONTACTS) != PERMISSION_GRANTED) { + throw new IOException("Permission WRITE_CONTACTS not granted."); + } + + File backupFile = new File(getContext().getFilesDir(), BACKUP_FILE); + + try (FileInputStream backupFileInputStream = new FileInputStream(backupFile)) { + VCardImporter vCardImporter = new VCardImporter(getContentResolver()); + vCardImporter.importFromStream(backupFileInputStream); + } + + // delete file when done + if (!backupFile.delete()) { + Log.w(TAG, "Could not delete: " + backupFile.getAbsolutePath()); + } + } + + @Override + public void onQuotaExceeded(long backupDataBytes, long quotaBytes) { + super.onQuotaExceeded(backupDataBytes, quotaBytes); + // TODO show error notification? + Log.e(TAG, "onQuotaExceeded " + backupDataBytes + " / " + quotaBytes); + } + + /** + * The methods below are for key/value backup/restore and should never get called + **/ + + @Override + public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) { + Log.e(TAG, "onBackup noSuper"); + } + + @Override + public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState) { + Log.e(TAG, "onRestore noSuper"); + } + +} diff --git a/contactsbackup/src/main/java/org/calyxos/backup/contacts/FullBackupFileHandler.java b/contactsbackup/src/main/java/org/calyxos/backup/contacts/FullBackupFileHandler.java new file mode 100644 index 00000000..033a1ba7 --- /dev/null +++ b/contactsbackup/src/main/java/org/calyxos/backup/contacts/FullBackupFileHandler.java @@ -0,0 +1,11 @@ +package org.calyxos.backup.contacts; + +import android.app.backup.FullBackupDataOutput; + +import java.io.File; + +interface FullBackupFileHandler { + + void fullBackupFile(File file, FullBackupDataOutput output); + +} diff --git a/contactsbackup/src/main/java/org/calyxos/backup/contacts/StartBroadcastReceiver.java b/contactsbackup/src/main/java/org/calyxos/backup/contacts/StartBroadcastReceiver.java new file mode 100644 index 00000000..a398718b --- /dev/null +++ b/contactsbackup/src/main/java/org/calyxos/backup/contacts/StartBroadcastReceiver.java @@ -0,0 +1,31 @@ +package org.calyxos.backup.contacts; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.util.Log; + +import static android.content.Intent.ACTION_BOOT_COMPLETED; +import static android.content.Intent.ACTION_MY_PACKAGE_REPLACED; + +/** + * This receiver doesn't seem to do anything, + * but we need it to prevent us from getting {@link ApplicationInfo#FLAG_STOPPED} + * which would make us ineligible for backups. + *

+ * It might be required that the app is already installed as a system app for this to work. + */ +public class StartBroadcastReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context ctx, Intent intent) { + String action = intent.getAction(); + if (ACTION_BOOT_COMPLETED.equals(action) || ACTION_MY_PACKAGE_REPLACED.equals(action)) { + Log.d("StartBroadcastReceiver", "Broadcast received: " + intent); + } else { + Log.w("StartBroadcastReceiver", "Unexpected broadcast received: " + intent); + } + } + +} diff --git a/contactsbackup/src/main/java/org/calyxos/backup/contacts/VCardExporter.java b/contactsbackup/src/main/java/org/calyxos/backup/contacts/VCardExporter.java new file mode 100644 index 00000000..c83de68e --- /dev/null +++ b/contactsbackup/src/main/java/org/calyxos/backup/contacts/VCardExporter.java @@ -0,0 +1,65 @@ +package org.calyxos.backup.contacts; + +import android.content.ContentResolver; +import android.database.Cursor; +import android.net.Uri; +import android.util.Log; + +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; + +import static android.provider.ContactsContract.Contacts.CONTENT_MULTI_VCARD_URI; +import static android.provider.ContactsContract.Data.CONTENT_URI; +import static android.provider.ContactsContract.Data.LOOKUP_KEY; +import static android.provider.ContactsContract.RawContacts.ACCOUNT_TYPE; +import static org.calyxos.backup.contacts.ContactsBackupAgent.DEBUG; + +class VCardExporter { + + private final static String TAG = "VCardExporter"; + + private final ContentResolver contentResolver; + + VCardExporter(ContentResolver contentResolver) { + this.contentResolver = contentResolver; + } + + Optional getVCardInputStream() throws FileNotFoundException { + String lookupKeysStr = String.join(":", getLookupKeys()); + if (DEBUG) { + Log.e(TAG, "lookupKeysStr: " + lookupKeysStr); + } + if (lookupKeysStr.isEmpty()) { + return Optional.empty(); + } else { + Uri uri = Uri.withAppendedPath(CONTENT_MULTI_VCARD_URI, Uri.encode(lookupKeysStr)); + return Optional.ofNullable(contentResolver.openInputStream(uri)); + } + } + + private Collection getLookupKeys() { + String[] projection = new String[]{LOOKUP_KEY}; + // We can not add IS_PRIMARY here as this gets lost on restored contacts + String selection = ACCOUNT_TYPE + " is null"; + Cursor cursor = contentResolver.query(CONTENT_URI, projection, selection, null, null); + if (cursor == null) { + Log.e(TAG, "Cursor for LOOKUP_KEY is null"); + return Collections.emptyList(); + } + Set lookupKeys = new HashSet<>(); + try { + while (cursor.moveToNext()) { + lookupKeys.add(cursor.getString(0)); + } + } finally { + cursor.close(); + } + return lookupKeys; + } + +} diff --git a/contactsbackup/src/main/java/org/calyxos/backup/contacts/VCardImporter.java b/contactsbackup/src/main/java/org/calyxos/backup/contacts/VCardImporter.java new file mode 100644 index 00000000..01e69790 --- /dev/null +++ b/contactsbackup/src/main/java/org/calyxos/backup/contacts/VCardImporter.java @@ -0,0 +1,71 @@ +package org.calyxos.backup.contacts; + +import android.content.ContentResolver; +import android.util.Log; + +import com.android.vcard.VCardEntry; +import com.android.vcard.VCardEntryCommitter; +import com.android.vcard.VCardEntryConstructor; +import com.android.vcard.VCardEntryHandler; +import com.android.vcard.VCardParser; +import com.android.vcard.VCardParser_V21; +import com.android.vcard.exception.VCardException; +import com.android.vcard.exception.VCardVersionException; + +import java.io.IOException; +import java.io.InputStream; + +import static com.android.vcard.VCardConfig.VCARD_TYPE_V21_GENERIC; +import static org.calyxos.backup.contacts.ContactsBackupAgent.DEBUG; + +class VCardImporter implements VCardEntryHandler { + + private final static String TAG = "VCardImporter"; + private final static int TYPE = VCARD_TYPE_V21_GENERIC; + + private final ContentResolver contentResolver; + + VCardImporter(ContentResolver contentResolver) { + this.contentResolver = contentResolver; + } + + void importFromStream(InputStream is) throws IOException { + final VCardEntryConstructor constructor = new VCardEntryConstructor(TYPE, null); + final VCardEntryCommitter committer = new VCardEntryCommitter(contentResolver); + constructor.addEntryHandler(committer); + if (DEBUG) { + constructor.addEntryHandler(this); + } + try { + constructor.clear(); + VCardParser mVCardParser = new VCardParser_V21(TYPE); + mVCardParser.addInterpreter(constructor); + mVCardParser.parse(is); + } catch (VCardVersionException e) { + Log.e(TAG, "Appropriate version for this vCard is not found.", e); + throw new IOException(e); + } catch (VCardException e) { + Log.e(TAG, "Error parsing vCard.", e); + throw new IOException(e); + } catch (IOException e) { + Log.e(TAG, e.toString()); + throw e; + } + } + + @Override + public void onStart() { + Log.e(TAG, "onStart"); + } + + @Override + public void onEntryCreated(VCardEntry vCardEntry) { + Log.e(TAG, "onEntryCreated " + vCardEntry); + } + + @Override + public void onEnd() { + Log.e(TAG, "onEnd"); + } + +} diff --git a/contactsbackup/src/main/res/values/strings.xml b/contactsbackup/src/main/res/values/strings.xml new file mode 100644 index 00000000..db4fbc24 --- /dev/null +++ b/contactsbackup/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + + Local Contacts Backup + diff --git a/contactsbackup/src/test/java/org/calyxos/backup/contacts/ContactsBackupAgentTest.kt b/contactsbackup/src/test/java/org/calyxos/backup/contacts/ContactsBackupAgentTest.kt new file mode 100644 index 00000000..f0bed13a --- /dev/null +++ b/contactsbackup/src/test/java/org/calyxos/backup/contacts/ContactsBackupAgentTest.kt @@ -0,0 +1,122 @@ +package org.calyxos.backup.contacts + +import android.Manifest.permission.READ_CONTACTS +import android.Manifest.permission.WRITE_CONTACTS +import android.app.backup.BackupAgent +import android.app.backup.BackupAgent.TYPE_FILE +import android.app.backup.FullBackupDataOutput +import android.content.Context +import android.content.pm.PackageManager.PERMISSION_DENIED +import android.content.pm.PackageManager.PERMISSION_GRANTED +import io.mockk.Runs +import io.mockk.every +import io.mockk.just +import io.mockk.mockk +import io.mockk.mockkConstructor +import org.calyxos.backup.contacts.ContactsBackupAgent.BACKUP_FILE +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Assert.fail +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TemporaryFolder +import java.io.ByteArrayInputStream +import java.io.File +import java.io.IOException +import java.util.Optional +import kotlin.random.Random + +/** + * Limited unit tests as the code itself is small and not very testable. + */ +class ContactsBackupAgentTest { + + @get:Rule + var folder = TemporaryFolder() + + private val context: Context = mockk() + private val fileHandler: FullBackupFileHandler = mockk() + private val agent = ContactsBackupAgent(context, fileHandler) + + private val data: FullBackupDataOutput = mockk() + + @Test + fun `backup is skipped when not encrypted or device-to-device`() { + every { data.transportFlags } returns 0 + agent.onFullBackup(data) + } + + @Test + fun `missing read contacts permission throws`() { + expectEncryptedOrDevice2DeviceTransport() + every { context.checkSelfPermission(READ_CONTACTS) } returns PERMISSION_DENIED + + try { + agent.onFullBackup(data) + fail("IOException was not thrown") + } catch (e: IOException) { + assertTrue(e.message!!.contains("READ_CONTACTS")) + } + } + + @Test + fun `no contacts does not throw or attempt backup`() { + expectEncryptedOrDevice2DeviceTransport() + every { context.checkSelfPermission(READ_CONTACTS) } returns PERMISSION_GRANTED + mockkConstructor(VCardExporter::class) + every { anyConstructed().vCardInputStream } returns Optional.empty() + + agent.onFullBackup(data) + } + + @Test + fun `backup works`() { + val backupBytes = Random.nextBytes(42) + val inputStream = ByteArrayInputStream(backupBytes) + val filesDir = folder.newFolder() + + expectEncryptedOrDevice2DeviceTransport() + every { context.checkSelfPermission(READ_CONTACTS) } returns PERMISSION_GRANTED + every { context.filesDir } returns filesDir + mockkConstructor(VCardExporter::class) + every { anyConstructed().vCardInputStream } returns Optional.of(inputStream) + every { fileHandler.fullBackupFile(any(), data) } just Runs + + agent.onFullBackup(data) + } + + private fun expectEncryptedOrDevice2DeviceTransport() { + every { data.transportFlags } returns listOf( + BackupAgent.FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED, + BackupAgent.FLAG_DEVICE_TO_DEVICE_TRANSFER + ).random() // both flags should allow the backup + } + + @Test + fun `missing write contacts permission throws`() { + every { context.checkSelfPermission(WRITE_CONTACTS) } returns PERMISSION_DENIED + + try { + agent.onRestoreFile(null, 0, null, 0, 0, 0) + fail("IOException was not thrown") + } catch (e: IOException) { + assertTrue(e.message!!.contains("WRITE_CONTACTS")) + } + } + + @Test + fun `restore works`() { + val filesDir = folder.newFolder() + val file = File(filesDir, BACKUP_FILE) + val restoreBytes = Random.nextBytes(42) + file.writeBytes(restoreBytes) + + every { context.checkSelfPermission(WRITE_CONTACTS) } returns PERMISSION_GRANTED + every { context.filesDir } returns filesDir + + agent.onRestoreFile(null, file.length(), null, TYPE_FILE, 0, 0) + + assertFalse(file.exists()) + } + +} diff --git a/settings.gradle b/settings.gradle index e7b4def4..717326dd 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,2 @@ include ':app' +include ':contactsbackup'