Merge branch 'index-downloads-from-mirrors' into 'master'

Index downloads from mirrors

See merge request fdroid/fdroidclient!730
This commit is contained in:
Hans-Christoph Steiner 2018-08-17 13:07:20 +00:00
commit 9cfe8ef091
12 changed files with 43 additions and 28 deletions

View File

@ -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;
/**

View File

@ -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;

View File

@ -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) {

View File

@ -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);

View File

@ -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:

View File

@ -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());

View File

@ -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);
}

View File

@ -240,7 +240,7 @@ public class InstallManagerService extends Service {
* @see <a href="https://developer.android.com/google/play/expansion-files.html">APK Expansion Files</a>
*/
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();

View File

@ -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) {
@ -271,29 +274,31 @@ public class DownloaderService extends Service {
/**
* Add a URL to the download queue.
* <p/>
* <p>
* 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.
* <p/>
* <p>
* All notifications are sent as an {@link Intent} via local broadcasts to be received by
*
* @param context this app's {@link Context}

View File

@ -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 <a href="http://lucb1e.com/rp/cookielesscookies">Cookieless cookies</a>
*/
@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");

View File

@ -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 {

View File

@ -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")
/**