From 20c93c64d8bc29de25fd09c61a5bbb6a816fe586 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 1 Aug 2018 16:41:54 +0200 Subject: [PATCH 1/5] eliminate .views.fragments package used by a single class --- .../java/org/fdroid/fdroid/views/main/MainViewController.java | 2 +- .../java/org/fdroid/fdroid/views/main/MainViewController.java | 2 +- app/src/main/java/org/fdroid/fdroid/Preferences.java | 2 +- .../fdroid/views/{fragments => }/PreferencesFragment.java | 3 +-- .../main/java/org/fdroid/fdroid/views/main/SettingsView.java | 2 +- 5 files changed, 5 insertions(+), 6 deletions(-) rename app/src/main/java/org/fdroid/fdroid/views/{fragments => }/PreferencesFragment.java (99%) diff --git a/app/src/basic/java/org/fdroid/fdroid/views/main/MainViewController.java b/app/src/basic/java/org/fdroid/fdroid/views/main/MainViewController.java index d2f2ae9c8..d8225193b 100644 --- a/app/src/basic/java/org/fdroid/fdroid/views/main/MainViewController.java +++ b/app/src/basic/java/org/fdroid/fdroid/views/main/MainViewController.java @@ -25,7 +25,7 @@ import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.RecyclerView; import android.widget.FrameLayout; import org.fdroid.fdroid.R; -import org.fdroid.fdroid.views.fragments.PreferencesFragment; +import org.fdroid.fdroid.views.PreferencesFragment; import org.fdroid.fdroid.views.updates.UpdatesViewBinder; /** diff --git a/app/src/full/java/org/fdroid/fdroid/views/main/MainViewController.java b/app/src/full/java/org/fdroid/fdroid/views/main/MainViewController.java index eaced1466..849a15a4b 100644 --- a/app/src/full/java/org/fdroid/fdroid/views/main/MainViewController.java +++ b/app/src/full/java/org/fdroid/fdroid/views/main/MainViewController.java @@ -10,7 +10,7 @@ import android.widget.Button; import android.widget.FrameLayout; import android.widget.TextView; import org.fdroid.fdroid.R; -import org.fdroid.fdroid.views.fragments.PreferencesFragment; +import org.fdroid.fdroid.views.PreferencesFragment; import org.fdroid.fdroid.views.swap.SwapWorkflowActivity; import org.fdroid.fdroid.views.updates.UpdatesViewBinder; diff --git a/app/src/main/java/org/fdroid/fdroid/Preferences.java b/app/src/main/java/org/fdroid/fdroid/Preferences.java index 21dff8f23..28c780b29 100644 --- a/app/src/main/java/org/fdroid/fdroid/Preferences.java +++ b/app/src/main/java/org/fdroid/fdroid/Preferences.java @@ -193,7 +193,7 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh * of the Privileged Extension. The preference provides a way to disable using the * Privileged Extension even though its installed. * - * @see org.fdroid.fdroid.views.fragments.PreferencesFragment#initPrivilegedInstallerPreference() + * @see org.fdroid.fdroid.views.PreferencesFragment#initPrivilegedInstallerPreference() */ public boolean isPrivilegedInstallerEnabled() { return preferences.getBoolean(PREF_PRIVILEGED_INSTALLER, true); diff --git a/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java b/app/src/main/java/org/fdroid/fdroid/views/PreferencesFragment.java similarity index 99% rename from app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java rename to app/src/main/java/org/fdroid/fdroid/views/PreferencesFragment.java index 884a8ce32..48e10df37 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java +++ b/app/src/main/java/org/fdroid/fdroid/views/PreferencesFragment.java @@ -23,7 +23,7 @@ * MA 02110-1301, USA. */ -package org.fdroid.fdroid.views.fragments; +package org.fdroid.fdroid.views; import android.app.Activity; import android.content.Intent; @@ -55,7 +55,6 @@ import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.data.RepoProvider; import org.fdroid.fdroid.installer.InstallHistoryService; import org.fdroid.fdroid.installer.PrivilegedInstaller; -import org.fdroid.fdroid.views.LiveSeekBarPreference; public class PreferencesFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { diff --git a/app/src/main/java/org/fdroid/fdroid/views/main/SettingsView.java b/app/src/main/java/org/fdroid/fdroid/views/main/SettingsView.java index 22458c79a..7bff54835 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/main/SettingsView.java +++ b/app/src/main/java/org/fdroid/fdroid/views/main/SettingsView.java @@ -8,7 +8,7 @@ import android.support.v7.app.AppCompatActivity; import android.util.AttributeSet; import android.widget.FrameLayout; import org.fdroid.fdroid.R; -import org.fdroid.fdroid.views.fragments.PreferencesFragment; +import org.fdroid.fdroid.views.PreferencesFragment; @SuppressWarnings("LineLength") /** From 20a1b4c83db6ccc842beda4eda50a3cc810a06e0 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 6 Aug 2018 23:26:35 +0200 Subject: [PATCH 2/5] standardize on "sha256" as the hash name, like fdroidserver uses fdroidserver has always written "sha256" to the index.xml file, so client should use the same. The Java hashers will correctly respond to both "sha256" and "SHA-256", and the only place that the hashType is read from the DB and used is in the swap repo index.xml generation, where it should also use "sha256". --- app/src/main/java/org/fdroid/fdroid/RepoXMLHandler.java | 5 ++--- app/src/main/java/org/fdroid/fdroid/Utils.java | 2 +- .../org/fdroid/fdroid/installer/InstallManagerService.java | 6 +++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/RepoXMLHandler.java b/app/src/main/java/org/fdroid/fdroid/RepoXMLHandler.java index a087e6909..5aef95ac7 100644 --- a/app/src/main/java/org/fdroid/fdroid/RepoXMLHandler.java +++ b/app/src/main/java/org/fdroid/fdroid/RepoXMLHandler.java @@ -22,7 +22,6 @@ package org.fdroid.fdroid; import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.Nullable; - import org.fdroid.fdroid.data.Apk; import org.fdroid.fdroid.data.App; import org.fdroid.fdroid.data.Repo; @@ -129,11 +128,11 @@ public class RepoXMLHandler extends DefaultHandler { if (currentApkHashType == null || "md5".equals(currentApkHashType)) { if (curapk.hash == null) { curapk.hash = str; - curapk.hashType = "SHA-256"; + curapk.hashType = "sha256"; } } else if ("sha256".equals(currentApkHashType)) { curapk.hash = str; - curapk.hashType = "SHA-256"; + curapk.hashType = "sha256"; } break; case ApkTable.Cols.SIGNATURE: diff --git a/app/src/main/java/org/fdroid/fdroid/Utils.java b/app/src/main/java/org/fdroid/fdroid/Utils.java index 7c95d1995..b2b8c499d 100644 --- a/app/src/main/java/org/fdroid/fdroid/Utils.java +++ b/app/src/main/java/org/fdroid/fdroid/Utils.java @@ -362,7 +362,7 @@ public final class Utils { String ret = null; try { // keytool -list -v gives you the SHA-256 fingerprint - MessageDigest digest = MessageDigest.getInstance("SHA-256"); + MessageDigest digest = MessageDigest.getInstance("sha256"); digest.update(key); byte[] fingerprint = digest.digest(); Formatter formatter = new Formatter(new StringBuilder()); diff --git a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java index 8e0f5e926..f42ce380f 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java @@ -240,7 +240,7 @@ public class InstallManagerService extends Service { * @see APK Expansion Files */ private void getObb(final String urlString, String obbUrlString, - final File obbDestFile, final String sha256) { + final File obbDestFile, final String hash) { if (obbDestFile == null || obbDestFile.exists() || TextUtils.isEmpty(obbUrlString)) { return; } @@ -267,7 +267,7 @@ public class InstallManagerService extends Service { + " to " + localApkUri); try { - if (Hasher.isFileMatchingHash(localFile, sha256, "SHA-256")) { + if (Hasher.isFileMatchingHash(localFile, hash, "sha256")) { Utils.debugLog(TAG, "Installing OBB " + localFile + " to " + obbDestFile); FileUtils.forceMkdirParent(obbDestFile); FileUtils.copyFile(localFile, obbDestFile); @@ -280,7 +280,7 @@ public class InstallManagerService extends Service { } } } else { - Utils.debugLog(TAG, localFile + " deleted, did not match hash: " + sha256); + Utils.debugLog(TAG, localFile + " deleted, did not match hash: " + hash); } } catch (IOException e) { e.printStackTrace(); From e02a5987d2a31e2462f0b79df9aa736762fea4d5 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 8 Aug 2018 14:04:31 +0200 Subject: [PATCH 3/5] make DownloaderService use urlString var names like rest of code --- .../fdroid/fdroid/net/DownloaderService.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/net/DownloaderService.java b/app/src/main/java/org/fdroid/fdroid/net/DownloaderService.java index e9d598619..c670baf71 100644 --- a/app/src/main/java/org/fdroid/fdroid/net/DownloaderService.java +++ b/app/src/main/java/org/fdroid/fdroid/net/DownloaderService.java @@ -271,29 +271,31 @@ public class DownloaderService extends Service { /** * Add a URL to the download queue. - *

+ *

* All notifications are sent as an {@link Intent} via local broadcasts to be received by * - * @param context this app's {@link Context} - * @param urlString The URL to add to the download queue + * @param context this app's {@link Context} + * @param mirrorUrlString The URL to add to the download queue + * @param repoId the database ID number representing one repo + * @param urlString the URL used as the unique ID throughout F-Droid * @see #cancel(Context, String) */ - public static void queue(Context context, String urlString, long repoId, String originalUrlString) { - if (TextUtils.isEmpty(urlString)) { + public static void queue(Context context, String mirrorUrlString, long repoId, String urlString) { + if (TextUtils.isEmpty(mirrorUrlString)) { return; } - Utils.debugLog(TAG, "Preparing " + urlString + " to go into the download queue"); + Utils.debugLog(TAG, "Preparing " + mirrorUrlString + " to go into the download queue"); Intent intent = new Intent(context, DownloaderService.class); intent.setAction(ACTION_QUEUE); - intent.setData(Uri.parse(urlString)); + intent.setData(Uri.parse(mirrorUrlString)); intent.putExtra(Downloader.EXTRA_REPO_ID, repoId); - intent.putExtra(Downloader.EXTRA_CANONICAL_URL, originalUrlString); + intent.putExtra(Downloader.EXTRA_CANONICAL_URL, urlString); context.startService(intent); } /** * Remove a URL to the download queue, even if it is currently downloading. - *

+ *

* All notifications are sent as an {@link Intent} via local broadcasts to be received by * * @param context this app's {@link Context} From c291b8f0f838c49b807d242e47c6635dc6d82374 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 9 Aug 2018 13:08:17 +0200 Subject: [PATCH 4/5] retry index downloads from mirrors when failing for a networking reason f1f56abd0f4253d69ee91bccaf09ce3730a648a3 fdroid/fdroidclient!697 --- .../java/org/fdroid/fdroid/IndexV1Updater.java | 18 ++++++++++++++++-- .../fdroid/fdroid/net/DownloaderService.java | 5 ++++- .../org/fdroid/fdroid/net/HttpDownloader.java | 3 +-- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/IndexV1Updater.java b/app/src/main/java/org/fdroid/fdroid/IndexV1Updater.java index 8e11fbf4c..310541f86 100644 --- a/app/src/main/java/org/fdroid/fdroid/IndexV1Updater.java +++ b/app/src/main/java/org/fdroid/fdroid/IndexV1Updater.java @@ -47,11 +47,19 @@ import org.fdroid.fdroid.data.Schema; import org.fdroid.fdroid.net.Downloader; import org.fdroid.fdroid.net.DownloaderFactory; +import javax.net.ssl.SSLHandshakeException; +import javax.net.ssl.SSLKeyException; +import javax.net.ssl.SSLPeerUnverifiedException; +import javax.net.ssl.SSLProtocolException; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.ConnectException; +import java.net.HttpRetryException; +import java.net.NoRouteToHostException; +import java.net.ProtocolException; import java.net.SocketTimeoutException; +import java.net.UnknownHostException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Date; @@ -94,6 +102,7 @@ public class IndexV1Updater extends RepoUpdater { /** * @return whether this successfully found an index of this version * @throws RepoUpdater.UpdateException + * @see org.fdroid.fdroid.net.DownloaderService#handleIntent(android.content.Intent) */ @Override public boolean update() throws RepoUpdater.UpdateException { @@ -119,7 +128,10 @@ public class IndexV1Updater extends RepoUpdater { } processDownloadedIndex(downloader.outputFile, downloader.getCacheTag()); - } catch (ConnectException | SocketTimeoutException e) { + } catch (ConnectException | HttpRetryException | NoRouteToHostException | SocketTimeoutException + | SSLHandshakeException | SSLKeyException | SSLPeerUnverifiedException | SSLProtocolException + | ProtocolException | UnknownHostException e) { + // if the above list changes, also change below and in DownloaderService.handleIntent() Utils.debugLog(TAG, "Trying to download the index from a mirror"); // Mirror logic here, so that the default download code is untouched. String mirrorUrl; @@ -146,7 +158,9 @@ public class IndexV1Updater extends RepoUpdater { processDownloadedIndex(downloader.outputFile, downloader.getCacheTag()); break; - } catch (ConnectException | SocketTimeoutException e2) { + } catch (ConnectException | HttpRetryException | NoRouteToHostException | SocketTimeoutException + | SSLHandshakeException | SSLKeyException | SSLPeerUnverifiedException | SSLProtocolException + | ProtocolException | UnknownHostException e2) { // We'll just let this try the next mirror Utils.debugLog(TAG, "Trying next mirror"); } catch (IOException e2) { diff --git a/app/src/main/java/org/fdroid/fdroid/net/DownloaderService.java b/app/src/main/java/org/fdroid/fdroid/net/DownloaderService.java index c670baf71..0aaea76b7 100644 --- a/app/src/main/java/org/fdroid/fdroid/net/DownloaderService.java +++ b/app/src/main/java/org/fdroid/fdroid/net/DownloaderService.java @@ -47,6 +47,7 @@ import java.io.IOException; import java.net.ConnectException; import java.net.HttpRetryException; import java.net.NoRouteToHostException; +import java.net.ProtocolException; import java.net.SocketTimeoutException; import java.net.UnknownHostException; @@ -193,6 +194,7 @@ public class DownloaderService extends Service { * * @param intent The {@link Intent} passed via {@link * android.content.Context#startService(Intent)}. + * @see org.fdroid.fdroid.IndexV1Updater#update() */ private void handleIntent(Intent intent) { final Uri uri = intent.getData(); @@ -225,7 +227,8 @@ public class DownloaderService extends Service { sendBroadcast(uri, Downloader.ACTION_INTERRUPTED, localFile, repoId, originalUrlString); } catch (ConnectException | HttpRetryException | NoRouteToHostException | SocketTimeoutException | SSLHandshakeException | SSLKeyException | SSLPeerUnverifiedException | SSLProtocolException - | UnknownHostException e) { + | ProtocolException | UnknownHostException e) { + // if the above list of exceptions changes, also change it in IndexV1Updater.update() Log.e(TAG, e.getLocalizedMessage()); sendBroadcast(uri, Downloader.ACTION_CONNECTION_FAILED, localFile, repoId, originalUrlString); } catch (IOException e) { diff --git a/app/src/main/java/org/fdroid/fdroid/net/HttpDownloader.java b/app/src/main/java/org/fdroid/fdroid/net/HttpDownloader.java index 63bfe99b2..87ba6a81d 100644 --- a/app/src/main/java/org/fdroid/fdroid/net/HttpDownloader.java +++ b/app/src/main/java/org/fdroid/fdroid/net/HttpDownloader.java @@ -37,7 +37,6 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; -import java.net.ConnectException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.SocketTimeoutException; @@ -106,7 +105,7 @@ public class HttpDownloader extends Downloader { * @see Cookieless cookies */ @Override - public void download() throws ConnectException, IOException, InterruptedException { + public void download() throws IOException, InterruptedException { // get the file size from the server HttpURLConnection tmpConn = getConnection(); tmpConn.setRequestMethod("HEAD"); From db5ac3bdfc322106a89cefec758e22fd1d5c28d1 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 10 Aug 2018 17:06:26 +0200 Subject: [PATCH 5/5] stop throwing an exception in DBHelper.onDowngrade() I missed this little detail ind64a55e013882a7d6b3de646955ed68647a82e97, the super version of this throws an exception, so it stops the downgrade. fdroid/fdroidclient!729 --- app/src/main/java/org/fdroid/fdroid/data/DBHelper.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java index d61684dbe..2dbfba8a4 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java +++ b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java @@ -280,7 +280,6 @@ public class DBHelper extends SQLiteOpenHelper { @Override public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { - super.onDowngrade(db, oldVersion, newVersion); resetTransient(context); }