[app] Fix ApkVerifierTest by removing index v0 XML parsing and adding permissions directly in the test

This commit is contained in:
Torsten Grote
2022-06-16 10:42:16 -03:00
committed by Hans-Christoph Steiner
parent 065cfe40f5
commit 12ebcff665
8 changed files with 87 additions and 343 deletions

View File

@@ -63,6 +63,8 @@ android {
applicationIdSuffix ".debug"
resValue "string", "applicationId", fullApplicationId + applicationIdSuffix
versionNameSuffix "-debug"
// testProguardFiles gets partially ignored for instrumentation tests
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', 'src/androidTest/proguard-rules.pro'
println 'buildTypes.debug defaultConfig.versionCode ' + defaultConfig.versionCode
}
}

View File

@@ -1,125 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<fdroid>
<repo name="F-Droid" icon="fdroid-icon.png" maxage="14"
pubkey="3082035e30820246a00302010202044c49cd00300d06092a864886f70d01010505003071310b300906035504061302554b3110300e06035504081307556e6b6e6f776e3111300f0603550407130857657468657262793110300e060355040a1307556e6b6e6f776e3110300e060355040b1307556e6b6e6f776e311930170603550403131043696172616e2047756c746e69656b73301e170d3130303732333137313032345a170d3337313230383137313032345a3071310b300906035504061302554b3110300e06035504081307556e6b6e6f776e3111300f0603550407130857657468657262793110300e060355040a1307556e6b6e6f776e3110300e060355040b1307556e6b6e6f776e311930170603550403131043696172616e2047756c746e69656b7330820122300d06092a864886f70d01010105000382010f003082010a028201010096d075e47c014e7822c89fd67f795d23203e2a8843f53ba4e6b1bf5f2fd0e225938267cfcae7fbf4fe596346afbaf4070fdb91f66fbcdf2348a3d92430502824f80517b156fab00809bdc8e631bfa9afd42d9045ab5fd6d28d9e140afc1300917b19b7c6c4df4a494cf1f7cb4a63c80d734265d735af9e4f09455f427aa65a53563f87b336ca2c19d244fcbba617ba0b19e56ed34afe0b253ab91e2fdb1271f1b9e3c3232027ed8862a112f0706e234cf236914b939bcf959821ecb2a6c18057e070de3428046d94b175e1d89bd795e535499a091f5bc65a79d539a8d43891ec504058acb28c08393b5718b57600a211e803f4a634e5c57f25b9b8c4422c6fd90203010001300d06092a864886f70d0101050500038201010008e4ef699e9807677ff56753da73efb2390d5ae2c17e4db691d5df7a7b60fc071ae509c5414be7d5da74df2811e83d3668c4a0b1abc84b9fa7d96b4cdf30bba68517ad2a93e233b042972ac0553a4801c9ebe07bf57ebe9a3b3d6d663965260e50f3b8f46db0531761e60340a2bddc3426098397fda54044a17e5244549f9869b460ca5e6e216b6f6a2db0580b480ca2afe6ec6b46eedacfa4aa45038809ece0c5978653d6c85f678e7f5a2156d1bedd8117751e64a4b0dcd140f3040b021821a8d93aed8d01ba36db6c82372211fed714d9a32607038cdfd565bd529ffc637212aaa2c224ef22b603eccefb5bf1e085c191d4b24fe742b17ab3f55d4e6f05ef"
timestamp="1467169032" url="http://f-droid.org/repo" version="16">
<description>
This is just a test of the extended permissions attributes.
</description>
</repo>
<application id="urzip.at.or.at.urzip">
<id>at.bitfire.davdroid</id>
<added>2013-10-13</added>
<lastupdated>2016-06-26</lastupdated>
<name>DAVdroid</name>
<summary>Contacts and Calendar sync</summary>
<icon>at.bitfire.davdroid.107.png</icon>
<desc>apk generated from urzip to test extended permissions</desc>
<license>GPLv3</license>
<categories>Internet</categories>
<category>Internet</category>
<web>https://davdroid.bitfire.at/</web>
<source>https://davdroid.bitfire.at/source/</source>
<tracker>https://davdroid.bitfire.at/forums/</tracker>
<changelog>https://gitlab.com/bitfireAT/davdroid/tags</changelog>
<donate>https://davdroid.bitfire.at/donate/</donate>
<bitcoin>1KSCy7RHztKuhW9fLLaUYqdwdC2iwbejZU</bitcoin>
<flattr>2100160</flattr>
<marketversion>1.1.1.2</marketversion>
<marketvercode>107</marketvercode>
<package>
<version>1.3.2-FAKE</version>
<versioncode>117</versioncode>
<apkname>org.fdroid.extendedpermissionstest.apk</apkname>
<srcname>at.bitfire.davdroid_116_src.tar.gz</srcname>
<hash type="sha256">f1aa02257e99c167d2ea9b0e9525c3ce7c181fe2e7f4dd00b65dd81ed2e27a62
</hash>
<sig>03542175324d067b4c36582242f8aecc</sig>
<size>3298864</size>
<sdkver>14</sdkver>
<targetSdkVersion>23</targetSdkVersion>
<added>2016-09-22</added>
<permissions>
READ_EXTERNAL_STORAGE,WRITE_SYNC_SETTINGS,ACCESS_NETWORK_STATE,WRITE_EXTERNAL_STORAGE,WRITE_CONTACTS,ACCESS_WIFI_STATE,REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,WRITE_CALENDAR,READ_CONTACTS,READ_SYNC_SETTINGS,MANAGE_ACCOUNTS,INTERNET,AUTHENTICATE_ACCOUNTS,GET_ACCOUNTS,READ_CALENDAR,READ_SYNC_STATS
</permissions>
<uses-permission name="android.permission.GET_ACCOUNTS" maxSdkVersion="22" />
<uses-permission name="android.permission.READ_EXTERNAL_STORAGE" maxSdkVersion="18" />
<uses-permission name="android.permission.WRITE_EXTERNAL_STORAGE" maxSdkVersion="18" />
<uses-permission name="android.permission.AUTHENTICATE_ACCOUNTS" maxSdkVersion="22" />
<uses-permission name="android.permission.MANAGE_ACCOUNTS" maxSdkVersion="22" />
<uses-permission-sdk-23 name="android.permission.CAMERA" />
<uses-permission-sdk-23 name="android.permission.CALL_PHONE" maxSdkVersion="23" />
</package>
<package>
<version>1.3.1-ose</version>
<versioncode>116</versioncode>
<apkname>at.bitfire.davdroid_116.apk</apkname>
<srcname>at.bitfire.davdroid_116_src.tar.gz</srcname>
<hash type="sha256">f1aa02257e99c167d2ea9b0e9525c3ce7c181fe2e7f4dd00b65dd81ed2e27a62
</hash>
<sig>03542175324d067b4c36582242f8aecc</sig>
<size>3298864</size>
<sdkver>14</sdkver>
<targetSdkVersion>24</targetSdkVersion>
<added>2016-09-21</added>
<permissions>
READ_EXTERNAL_STORAGE,WRITE_SYNC_SETTINGS,ACCESS_NETWORK_STATE,WRITE_EXTERNAL_STORAGE,org.dmfs.permission.READ_TASKS,WRITE_CONTACTS,ACCESS_WIFI_STATE,REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,WRITE_CALENDAR,READ_CONTACTS,READ_SYNC_SETTINGS,MANAGE_ACCOUNTS,INTERNET,AUTHENTICATE_ACCOUNTS,GET_ACCOUNTS,READ_CALENDAR,org.dmfs.permission.WRITE_TASKS
</permissions>
<uses-permission name="android.permission.GET_ACCOUNTS" maxSdkVersion="22" />
<uses-permission name="android.permission.READ_EXTERNAL_STORAGE" maxSdkVersion="18" />
<uses-permission name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission name="android.permission.AUTHENTICATE_ACCOUNTS" maxSdkVersion="22" />
<uses-permission name="android.permission.MANAGE_ACCOUNTS" maxSdkVersion="22" />
</package>
<package>
<version>1.1.1.2</version>
<versioncode>107</versioncode>
<apkname>at.bitfire.davdroid_107.apk</apkname>
<srcname>at.bitfire.davdroid_107_src.tar.gz</srcname>
<hash type="sha256">9a616f2e97bf8cf012baf896f95667dea4e3ce3252b31c5715073638a9fcc3d4
</hash>
<sig>03542175324d067b4c36582242f8aecc</sig>
<size>3134363</size>
<sdkver>14</sdkver>
<targetSdkVersion>23</targetSdkVersion>
<added>2016-06-26</added>
<permissions>
org.dmfs.permission.READ_TASKS,WRITE_CONTACTS,GET_ACCOUNTS,AUTHENTICATE_ACCOUNTS,WRITE_EXTERNAL_STORAGE,READ_CALENDAR,ACCESS_WIFI_STATE,org.dmfs.permission.WRITE_TASKS,ACCESS_NETWORK_STATE,WRITE_CALENDAR,READ_CONTACTS,READ_SYNC_SETTINGS,INTERNET,MANAGE_ACCOUNTS,WRITE_SYNC_SETTINGS
</permissions>
</package>
<package>
<version>1.1.1.1</version>
<versioncode>105</versioncode>
<apkname>at.bitfire.davdroid_105.apk</apkname>
<srcname>at.bitfire.davdroid_105_src.tar.gz</srcname>
<hash type="sha256">4a0408c61536a1cc1028cea4273adbde2e57dfa2b12d93c3b52f4c3d095e2849
</hash>
<sig>03542175324d067b4c36582242f8aecc</sig>
<size>3131567</size>
<sdkver>14</sdkver>
<targetSdkVersion>23</targetSdkVersion>
<added>2016-06-24</added>
<permissions>
org.dmfs.permission.READ_TASKS,READ_EXTERNAL_STORAGE,WRITE_CONTACTS,GET_ACCOUNTS,AUTHENTICATE_ACCOUNTS,WRITE_EXTERNAL_STORAGE,READ_CALENDAR,ACCESS_WIFI_STATE,org.dmfs.permission.WRITE_TASKS,ACCESS_NETWORK_STATE,WRITE_CALENDAR,READ_CONTACTS,READ_SYNC_SETTINGS,INTERNET,MANAGE_ACCOUNTS,WRITE_SYNC_SETTINGS
</permissions>
</package>
<package>
<version>1.1.1</version>
<versioncode>104</versioncode>
<apkname>at.bitfire.davdroid_104.apk</apkname>
<srcname>at.bitfire.davdroid_104_src.tar.gz</srcname>
<hash type="sha256">09ba34996177efe8b1498a93fe6521ab84efab3bccb0f42449116e80b59e5b56
</hash>
<sig>03542175324d067b4c36582242f8aecc</sig>
<size>3131367</size>
<sdkver>14</sdkver>
<targetSdkVersion>23</targetSdkVersion>
<added>2016-06-22</added>
<permissions>
org.dmfs.permission.READ_TASKS,READ_EXTERNAL_STORAGE,WRITE_CONTACTS,GET_ACCOUNTS,AUTHENTICATE_ACCOUNTS,WRITE_EXTERNAL_STORAGE,READ_CALENDAR,ACCESS_WIFI_STATE,org.dmfs.permission.WRITE_TASKS,ACCESS_NETWORK_STATE,WRITE_CALENDAR,READ_CONTACTS,READ_SYNC_SETTINGS,INTERNET,MANAGE_ACCOUNTS,WRITE_SYNC_SETTINGS
</permissions>
</package>
</application>
</fdroid>

View File

@@ -29,6 +29,7 @@ import androidx.test.platform.app.InstrumentationRegistry;
import org.fdroid.fdroid.AssetUtils;
import org.fdroid.fdroid.compat.FileCompatTest;
import org.fdroid.fdroid.data.Apk;
import org.fdroid.index.v2.PermissionV2;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -57,10 +58,10 @@ import static org.junit.Assert.fail;
public class ApkVerifierTest {
public static final String TAG = "ApkVerifierTest";
Instrumentation instrumentation;
private Instrumentation instrumentation;
File sdk14Apk;
File minMaxApk;
private File sdk14Apk;
private File minMaxApk;
private File extendedPermissionsApk;
@Before
@@ -81,14 +82,9 @@ public class ApkVerifierTest {
"org.fdroid.extendedpermissionstest.apk",
dir
);
File extendedPermsXml = AssetUtils.copyAssetToDir(instrumentation.getContext(),
"extendedPerms.xml",
dir
);
assertTrue(sdk14Apk.exists());
assertTrue(minMaxApk.exists());
assertTrue(extendedPermissionsApk.exists());
assertTrue(extendedPermsXml.exists()); // TODO remove file when test was ported
}
@Test
@@ -274,8 +270,30 @@ public class ApkVerifierTest {
expectedSet.add("android.permission.CALL_PHONE");
}
}
// TODO get this from "extendedPerms.xml" and use setRequestedPermissions
Apk apk = new Apk();
apk.packageName = "urzip.at.or.at.urzip";
ArrayList<PermissionV2> perms = new ArrayList<>();
perms.add(new PermissionV2("android.permission.READ_EXTERNAL_STORAGE", 18));
perms.add(new PermissionV2("android.permission.WRITE_SYNC_SETTINGS", null));
perms.add(new PermissionV2("android.permission.ACCESS_NETWORK_STATE", null));
perms.add(new PermissionV2("android.permission.WRITE_EXTERNAL_STORAGE", 18));
perms.add(new PermissionV2("android.permission.WRITE_CONTACTS", null));
perms.add(new PermissionV2("android.permission.ACCESS_WIFI_STATE", null));
perms.add(new PermissionV2("android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS", null));
perms.add(new PermissionV2("android.permission.WRITE_CALENDAR", null));
perms.add(new PermissionV2("android.permission.READ_CONTACTS", null));
perms.add(new PermissionV2("android.permission.READ_SYNC_SETTINGS", null));
perms.add(new PermissionV2("android.permission.MANAGE_ACCOUNTS", 22));
perms.add(new PermissionV2("android.permission.INTERNET", null));
perms.add(new PermissionV2("android.permission.AUTHENTICATE_ACCOUNTS", 22));
perms.add(new PermissionV2("android.permission.GET_ACCOUNTS", 22));
perms.add(new PermissionV2("android.permission.READ_CALENDAR", null));
perms.add(new PermissionV2("android.permission.READ_SYNC_STATS", null));
apk.setRequestedPermissions(perms, 0);
ArrayList<PermissionV2> perms23 = new ArrayList<>();
perms23.add(new PermissionV2("android.permission.CAMERA", null));
perms23.add(new PermissionV2("android.permission.CALL_PHONE", 23));
apk.setRequestedPermissions(perms23, 23);
HashSet<String> actualSet = new HashSet<>(Arrays.asList(apk.requestedPermissions));
for (String permission : expectedSet) {
if (!actualSet.contains(permission)) {
@@ -330,9 +348,28 @@ public class ApkVerifierTest {
if (Build.VERSION.SDK_INT >= 29) {
expectedSet.add("android.permission.ACCESS_MEDIA_LOCATION");
}
// TODO get this from "extendedPerms.xml" and use setRequestedPermissions
Apk apk = new Apk();
Log.i(TAG, "APK: " + apk.apkName);
apk.packageName = "urzip.at.or.at.urzip";
apk.targetSdkVersion = 24;
ArrayList<PermissionV2> perms = new ArrayList<>();
perms.add(new PermissionV2("android.permission.READ_EXTERNAL_STORAGE", 18));
perms.add(new PermissionV2("android.permission.WRITE_SYNC_SETTINGS", null));
perms.add(new PermissionV2("android.permission.ACCESS_NETWORK_STATE", null));
perms.add(new PermissionV2("android.permission.WRITE_EXTERNAL_STORAGE", null));
perms.add(new PermissionV2("android.permission.WRITE_CONTACTS", null));
perms.add(new PermissionV2("android.permission.ACCESS_WIFI_STATE", null));
perms.add(new PermissionV2("android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS", null));
perms.add(new PermissionV2("android.permission.WRITE_CALENDAR", null));
perms.add(new PermissionV2("android.permission.READ_CONTACTS", null));
perms.add(new PermissionV2("android.permission.READ_SYNC_SETTINGS", null));
perms.add(new PermissionV2("android.permission.MANAGE_ACCOUNTS", 22));
perms.add(new PermissionV2("android.permission.INTERNET", null));
perms.add(new PermissionV2("android.permission.AUTHENTICATE_ACCOUNTS", 22));
perms.add(new PermissionV2("android.permission.GET_ACCOUNTS", 22));
perms.add(new PermissionV2("android.permission.READ_CALENDAR", null));
perms.add(new PermissionV2("org.dmfs.permission.READ_TASKS", null));
perms.add(new PermissionV2("org.dmfs.permission.WRITE_TASKS", null));
apk.setRequestedPermissions(perms, 0);
HashSet<String> actualSet = new HashSet<>(Arrays.asList(apk.requestedPermissions));
for (String permission : expectedSet) {
if (!actualSet.contains(permission)) {
@@ -371,9 +408,26 @@ public class ApkVerifierTest {
expectedSet.add("android.permission.ACCESS_MEDIA_LOCATION");
}
expectedPermissions = expectedSet.toArray(new String[expectedSet.size()]);
// TODO get this from "extendedPerms.xml" and use setRequestedPermissions
apk = new Apk();
Log.i(TAG, "APK: " + apk.apkName);
apk.packageName = "urzip.at.or.at.urzip";
apk.targetSdkVersion = 23;
perms = new ArrayList<>();
perms.add(new PermissionV2("android.permission.WRITE_SYNC_SETTINGS", null));
perms.add(new PermissionV2("android.permission.ACCESS_NETWORK_STATE", null));
perms.add(new PermissionV2("android.permission.WRITE_EXTERNAL_STORAGE", null));
perms.add(new PermissionV2("android.permission.WRITE_CONTACTS", null));
perms.add(new PermissionV2("android.permission.ACCESS_WIFI_STATE", null));
perms.add(new PermissionV2("android.permission.WRITE_CALENDAR", null));
perms.add(new PermissionV2("android.permission.READ_CONTACTS", null));
perms.add(new PermissionV2("android.permission.READ_SYNC_SETTINGS", null));
perms.add(new PermissionV2("android.permission.MANAGE_ACCOUNTS", null));
perms.add(new PermissionV2("android.permission.INTERNET", null));
perms.add(new PermissionV2("android.permission.AUTHENTICATE_ACCOUNTS", null));
perms.add(new PermissionV2("android.permission.GET_ACCOUNTS", null));
perms.add(new PermissionV2("android.permission.READ_CALENDAR", null));
perms.add(new PermissionV2("org.dmfs.permission.READ_TASKS", null));
perms.add(new PermissionV2("org.dmfs.permission.WRITE_TASKS", null));
apk.setRequestedPermissions(perms, 0);
actualSet = new HashSet<>(Arrays.asList(apk.requestedPermissions));
for (String permission : expectedSet) {
if (!actualSet.contains(permission)) {

View File

@@ -19,7 +19,11 @@
-keep class junit.** { *; }
-dontwarn junit.**
# This is necessary so that RemoteWorkManager can be initialized (also marked with @Keep)
-keep class androidx.work.multiprocess.RemoteWorkManagerClient {
public <init>(...);
-keep class androidx.arch.core.executor.ArchTaskExecutor {*;}
-keep class org.fdroid.download.Mirror {
public static *** fromStrings(***);
}
# This is necessary so that RemoteWorkManager can be initialized (also marked with @Keep)
-keep class androidx.work.WorkManager { *; }

View File

@@ -41,6 +41,7 @@ import java.util.zip.ZipFile;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
/**
* Represents a single package of an application. This represents one particular
@@ -448,8 +449,10 @@ public class Apk implements Comparable<Apk>, Parcelable {
* so they are not included here.
*
* @see Manifest.permission#READ_EXTERNAL_STORAGE
* @see <a href="https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/data/etc/platform.xml">platform.xml</a>
*/
private void setRequestedPermissions(List<PermissionV2> permissions, int minSdk) {
@VisibleForTesting
public void setRequestedPermissions(List<PermissionV2> permissions, int minSdk) {
HashSet<String> set = new HashSet<>();
if (requestedPermissions != null) {
Collections.addAll(set, requestedPermissions);

View File

@@ -74,7 +74,8 @@ class ApkVerifier {
// check if the apk has the expected packageName
if (!TextUtils.equals(localApkInfo.packageName, expectedApk.packageName)) {
throw new ApkVerificationException("Apk file has unexpected packageName!");
throw new ApkVerificationException("Apk file has unexpected packageName! " +
localApkInfo.packageName);
}
if (localApkInfo.versionCode < 0) {
@@ -83,7 +84,7 @@ class ApkVerifier {
// verify permissions, important for unattended installer
if (!requestedPermissionsEqual(expectedApk.requestedPermissions, localApkInfo.requestedPermissions)) {
throw new ApkPermissionUnequalException("Permissions in APK and index.xml do not match!");
throw new ApkPermissionUnequalException("Permissions in APK and index do not match!");
}
int localTargetSdkVersion = localApkInfo.applicationInfo.targetSdkVersion;

View File

@@ -1,195 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<fdroid>
<repo name="F-Droid" icon="fdroid-icon.png" maxage="14"
pubkey="3082035e30820246a00302010202044c49cd00300d06092a864886f70d01010505003071310b300906035504061302554b3110300e06035504081307556e6b6e6f776e3111300f0603550407130857657468657262793110300e060355040a1307556e6b6e6f776e3110300e060355040b1307556e6b6e6f776e311930170603550403131043696172616e2047756c746e69656b73301e170d3130303732333137313032345a170d3337313230383137313032345a3071310b300906035504061302554b3110300e06035504081307556e6b6e6f776e3111300f0603550407130857657468657262793110300e060355040a1307556e6b6e6f776e3110300e060355040b1307556e6b6e6f776e311930170603550403131043696172616e2047756c746e69656b7330820122300d06092a864886f70d01010105000382010f003082010a028201010096d075e47c014e7822c89fd67f795d23203e2a8843f53ba4e6b1bf5f2fd0e225938267cfcae7fbf4fe596346afbaf4070fdb91f66fbcdf2348a3d92430502824f80517b156fab00809bdc8e631bfa9afd42d9045ab5fd6d28d9e140afc1300917b19b7c6c4df4a494cf1f7cb4a63c80d734265d735af9e4f09455f427aa65a53563f87b336ca2c19d244fcbba617ba0b19e56ed34afe0b253ab91e2fdb1271f1b9e3c3232027ed8862a112f0706e234cf236914b939bcf959821ecb2a6c18057e070de3428046d94b175e1d89bd795e535499a091f5bc65a79d539a8d43891ec504058acb28c08393b5718b57600a211e803f4a634e5c57f25b9b8c4422c6fd90203010001300d06092a864886f70d0101050500038201010008e4ef699e9807677ff56753da73efb2390d5ae2c17e4db691d5df7a7b60fc071ae509c5414be7d5da74df2811e83d3668c4a0b1abc84b9fa7d96b4cdf30bba68517ad2a93e233b042972ac0553a4801c9ebe07bf57ebe9a3b3d6d663965260e50f3b8f46db0531761e60340a2bddc3426098397fda54044a17e5244549f9869b460ca5e6e216b6f6a2db0580b480ca2afe6ec6b46eedacfa4aa45038809ece0c5978653d6c85f678e7f5a2156d1bedd8117751e64a4b0dcd140f3040b021821a8d93aed8d01ba36db6c82372211fed714d9a32607038cdfd565bd529ffc637212aaa2c224ef22b603eccefb5bf1e085c191d4b24fe742b17ab3f55d4e6f05ef"
timestamp="1467169032" url="http://f-droid.org/repo" version="16">
<description>
This is just a test of the extended permissions attributes.
</description>
</repo>
<application id="at.bitfire.davdroid">
<id>at.bitfire.davdroid</id>
<added>2013-10-13</added>
<lastupdated>2016-09-21</lastupdated>
<name>DAVdroid</name>
<summary>Contacts and Calendar sync</summary>
<icon>at.bitfire.davdroid.116.png</icon>
<desc>
<p>DAVdroid is a CalDAV/CardDAV synchronisation adapter for Android 4+ devices.</p>
<p>Use it with your own server (like<a href="https://owncloud.org/">OwnCloud</a>,<a
href="http://baikal-server.com/">Baïkal</a>,
<a href="http://www.davical.org/">DAViCal</a>
or<a href="http://radicale.org/">radiCALe</a>) or with a trusted hoster to keep your
contacts and events under your control.
</p>
<p>Integrates natively in Android calendar/contact apps. See homepage for configuration
details, including info about self-signed certificates.
</p>
<p>For a comparison of server software, see the<a
href="https://wiki.debian.org/Groupware">
Debian wiki</a>.
</p>
</desc>
<license>GPLv3</license>
<categories>Internet</categories>
<category>Internet</category>
<web>https://davdroid.bitfire.at/</web>
<source>https://davdroid.bitfire.at/source/</source>
<tracker>https://davdroid.bitfire.at/forums/</tracker>
<changelog>https://gitlab.com/bitfireAT/davdroid/tags</changelog>
<donate>https://davdroid.bitfire.at/donate/</donate>
<bitcoin>1KSCy7RHztKuhW9fLLaUYqdwdC2iwbejZU</bitcoin>
<flattr>2100160</flattr>
<marketversion>1.3.1-ose</marketversion>
<marketvercode>116</marketvercode>
<package>
<version>1.3.1-ose</version>
<versioncode>116</versioncode>
<apkname>at.bitfire.davdroid_116.apk</apkname>
<srcname>at.bitfire.davdroid_116_src.tar.gz</srcname>
<hash type="sha256">f1aa02257e99c167d2ea9b0e9525c3ce7c181fe2e7f4dd00b65dd81ed2e27a62
</hash>
<sig>03542175324d067b4c36582242f8aecc</sig>
<size>3298864</size>
<sdkver>14</sdkver>
<targetSdkVersion>24</targetSdkVersion>
<added>2016-09-21</added>
<permissions>
READ_EXTERNAL_STORAGE,WRITE_SYNC_SETTINGS,ACCESS_NETWORK_STATE,WRITE_EXTERNAL_STORAGE,org.dmfs.permission.READ_TASKS,WRITE_CONTACTS,ACCESS_WIFI_STATE,REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,WRITE_CALENDAR,READ_CONTACTS,READ_SYNC_SETTINGS,MANAGE_ACCOUNTS,INTERNET,AUTHENTICATE_ACCOUNTS,GET_ACCOUNTS,READ_CALENDAR,org.dmfs.permission.WRITE_TASKS
</permissions>
<uses-permission name="android.permission.GET_ACCOUNTS" maxSdkVersion="22" />
<uses-permission name="android.permission.READ_EXTERNAL_STORAGE" maxSdkVersion="18" />
<uses-permission name="android.permission.WRITE_EXTERNAL_STORAGE" maxSdkVersion="18" />
<uses-permission name="android.permission.AUTHENTICATE_ACCOUNTS" maxSdkVersion="22" />
<uses-permission name="android.permission.MANAGE_ACCOUNTS" maxSdkVersion="22" />
</package>
<package>
<version>1.3-ose</version>
<versioncode>114</versioncode>
<apkname>at.bitfire.davdroid_114.apk</apkname>
<srcname>at.bitfire.davdroid_114_src.tar.gz</srcname>
<hash type="sha256">aaf956539aad7400269997bf1a6689f191b592e70146ffe5484312f9375df9d9
</hash>
<sig>03542175324d067b4c36582242f8aecc</sig>
<size>3295326</size>
<sdkver>14</sdkver>
<targetSdkVersion>24</targetSdkVersion>
<added>2016-09-05</added>
<permissions>
READ_EXTERNAL_STORAGE,WRITE_SYNC_SETTINGS,ACCESS_NETWORK_STATE,WRITE_EXTERNAL_STORAGE,org.dmfs.permission.READ_TASKS,WRITE_CONTACTS,ACCESS_WIFI_STATE,REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,WRITE_CALENDAR,READ_CONTACTS,READ_SYNC_SETTINGS,MANAGE_ACCOUNTS,INTERNET,AUTHENTICATE_ACCOUNTS,GET_ACCOUNTS,READ_CALENDAR,org.dmfs.permission.WRITE_TASKS
</permissions>
<uses-permission name="android.permission.GET_ACCOUNTS" maxSdkVersion="22" />
<uses-permission name="android.permission.READ_EXTERNAL_STORAGE" maxSdkVersion="18" />
<uses-permission name="android.permission.WRITE_EXTERNAL_STORAGE" maxSdkVersion="18" />
<uses-permission name="android.permission.AUTHENTICATE_ACCOUNTS" maxSdkVersion="22" />
<uses-permission name="android.permission.MANAGE_ACCOUNTS" maxSdkVersion="22" />
</package>
<package>
<version>1.2.3-ose</version>
<versioncode>112</versioncode>
<apkname>at.bitfire.davdroid_112.apk</apkname>
<srcname>at.bitfire.davdroid_112_src.tar.gz</srcname>
<hash type="sha256">045480c571f4dfabb23a5efb803b594c432c20ab33b6eb575b4476a8df22bb05
</hash>
<sig>03542175324d067b4c36582242f8aecc</sig>
<size>3172611</size>
<sdkver>14</sdkver>
<targetSdkVersion>24</targetSdkVersion>
<added>2016-08-12</added>
<permissions>
READ_EXTERNAL_STORAGE,WRITE_SYNC_SETTINGS,ACCESS_NETWORK_STATE,WRITE_EXTERNAL_STORAGE,org.dmfs.permission.READ_TASKS,WRITE_CONTACTS,ACCESS_WIFI_STATE,REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,WRITE_CALENDAR,READ_CONTACTS,READ_SYNC_SETTINGS,MANAGE_ACCOUNTS,INTERNET,AUTHENTICATE_ACCOUNTS,GET_ACCOUNTS,READ_CALENDAR,org.dmfs.permission.WRITE_TASKS
</permissions>
<uses-permission name="android.permission.READ_EXTERNAL_STORAGE" maxSdkVersion="18" />
<uses-permission name="android.permission.WRITE_EXTERNAL_STORAGE" maxSdkVersion="18" />
<uses-permission name="android.permission.AUTHENTICATE_ACCOUNTS" maxSdkVersion="22" />
</package>
</application>
<application id="com.murrayc.galaxyzoo.app">
<id>com.murrayc.galaxyzoo.app</id>
<added>2014-11-23</added>
<lastupdated>2016-09-02</lastupdated>
<name>Galaxy Zoo</name>
<summary>Help to classify galaxies</summary>
<icon>com.murrayc.galaxyzoo.app.64.png</icon>
<desc>
<p>Classify
<a href="http://www.galaxyzoo.org/">Galaxy Zoo</a>
subjects. Official approved by the<a href="https://www.zooniverse.org/">Zooniverse
project</a>.
</p>
<p>Asks you questions about a picture of a galaxy, with each question depending on the
previous question. This "Citizen Science" helps astronomers to analyze the huge
amount of images of galaxies provided, for instance, by the Hubble Space Telescope.
</p>
</desc>
<license>GPLv3</license>
<categories>Science &amp; Education</categories>
<category>Science &amp; Education</category>
<web />
<source>https://github.com/murraycu/android-galaxyzoo</source>
<tracker>https://github.com/murraycu/android-galaxyzoo/issues</tracker>
<marketversion>1.64</marketversion>
<marketvercode>64</marketvercode>
<package>
<version>1.64</version>
<versioncode>64</versioncode>
<apkname>com.murrayc.galaxyzoo.app_64.apk</apkname>
<srcname>com.murrayc.galaxyzoo.app_64_src.tar.gz</srcname>
<hash type="sha256">6f10487c8ef84078232aafe115228c6252ef982a228666454005b8d62c27fe42
</hash>
<sig>f1a84be1ce965e270f64318cfdb41861</sig>
<size>4095584</size>
<sdkver>11</sdkver>
<targetSdkVersion>24</targetSdkVersion>
<added>2016-09-02</added>
<permissions>
READ_EXTERNAL_STORAGE,WRITE_SYNC_SETTINGS,ACCESS_NETWORK_STATE,WRITE_EXTERNAL_STORAGE,USE_CREDENTIALS,READ_SYNC_SETTINGS,MANAGE_ACCOUNTS,INTERNET,AUTHENTICATE_ACCOUNTS,GET_ACCOUNTS
</permissions>
<uses-permission name="android.permission.USE_CREDENTIALS" maxSdkVersion="22" />
<uses-permission name="android.permission.GET_ACCOUNTS" maxSdkVersion="22" />
<uses-permission name="android.permission.AUTHENTICATE_ACCOUNTS" maxSdkVersion="22" />
<uses-permission name="android.permission.MANAGE_ACCOUNTS" maxSdkVersion="22" />
</package>
<package>
<version>1.61</version>
<versioncode>61</versioncode>
<apkname>com.murrayc.galaxyzoo.app_61.apk</apkname>
<srcname>com.murrayc.galaxyzoo.app_61_src.tar.gz</srcname>
<hash type="sha256">c35bc15885d57a2ddfcb2c702c9147b63b63a9765a6eeacf98d6a1534f6f8ff2
</hash>
<sig>f1a84be1ce965e270f64318cfdb41861</sig>
<size>4588315</size>
<sdkver>11</sdkver>
<targetSdkVersion>24</targetSdkVersion>
<added>2016-08-26</added>
<permissions>
READ_EXTERNAL_STORAGE,WRITE_SYNC_SETTINGS,ACCESS_NETWORK_STATE,WRITE_EXTERNAL_STORAGE,USE_CREDENTIALS,READ_SYNC_SETTINGS,MANAGE_ACCOUNTS,INTERNET,AUTHENTICATE_ACCOUNTS,GET_ACCOUNTS
</permissions>
<uses-permission name="android.permission.USE_CREDENTIALS" maxSdkVersion="22" />
<uses-permission name="android.permission.GET_ACCOUNTS" maxSdkVersion="22" />
<uses-permission name="android.permission.AUTHENTICATE_ACCOUNTS" maxSdkVersion="22" />
<uses-permission name="android.permission.MANAGE_ACCOUNTS" maxSdkVersion="22" />
</package>
<package>
<version>1.59</version>
<versioncode>59</versioncode>
<apkname>com.murrayc.galaxyzoo.app_59.apk</apkname>
<srcname>com.murrayc.galaxyzoo.app_59_src.tar.gz</srcname>
<hash type="sha256">719d1440dd2f16ad29b45edba5b43262f22ef68cee0c6b478e40fe8eb0e53227
</hash>
<sig>f1a84be1ce965e270f64318cfdb41861</sig>
<size>4116175</size>
<sdkver>11</sdkver>
<targetSdkVersion>24</targetSdkVersion>
<added>2016-08-25</added>
<permissions>
READ_EXTERNAL_STORAGE,WRITE_SYNC_SETTINGS,ACCESS_NETWORK_STATE,WRITE_EXTERNAL_STORAGE,USE_CREDENTIALS,READ_SYNC_SETTINGS,MANAGE_ACCOUNTS,INTERNET,AUTHENTICATE_ACCOUNTS,GET_ACCOUNTS
</permissions>
<uses-permission name="android.permission.USE_CREDENTIALS" maxSdkVersion="22" />
<uses-permission name="android.permission.GET_ACCOUNTS" maxSdkVersion="22" />
<uses-permission name="android.permission.AUTHENTICATE_ACCOUNTS" maxSdkVersion="22" />
<uses-permission name="android.permission.MANAGE_ACCOUNTS" maxSdkVersion="22" />
</package>
</application>
</fdroid>

View File

@@ -168,13 +168,13 @@ public class LocalHTTPDTest {
assertTrue(string.indexOf("test.html") > 0);
connection.disconnect();
IOUtils.copy(classLoader.getResourceAsStream("extendedPerms.xml"),
new FileOutputStream(new File(webRoot, "extendedPerms.xml")));
url = new URL(baseUrl + "/extendedPerms.xml");
IOUtils.copy(classLoader.getResourceAsStream("additional_repos.xml"),
new FileOutputStream(new File(webRoot, "additional_repos.xml")));
url = new URL(baseUrl + "/additional_repos.xml");
connection = (HttpURLConnection) url.openConnection();
assertEquals(200, connection.getResponseCode());
byte[] actual = IOUtils.toByteArray(connection.getInputStream());
byte[] expected = IOUtils.toByteArray(classLoader.getResourceAsStream("extendedPerms.xml"));
byte[] expected = IOUtils.toByteArray(classLoader.getResourceAsStream("additional_repos.xml"));
Assert.assertArrayEquals(expected, actual);
connection.disconnect();
}