mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-27 04:43:54 +01:00
Revert stopgaps related to beta server cert issue (#3396)
* Revert stopgaps related to beta server cert issue The upstream issue with Commons beta server has been fixed now[1]. So, there's no point in stopgapping the issue anymore. So, revert the related changes. This revertsfa87eb5661anddf426f7c42which correspond to PRs #3350 and #3349 respectively. [1]: https://phabricator.wikimedia.org/T243881#5861983 * Test-fix: fix the failing CI test
This commit is contained in:
parent
4bd7a5b1e2
commit
a78e167676
5 changed files with 11 additions and 293 deletions
|
|
@ -16,10 +16,6 @@ import androidx.annotation.NonNull;
|
||||||
import com.facebook.drawee.backends.pipeline.Fresco;
|
import com.facebook.drawee.backends.pipeline.Fresco;
|
||||||
import com.facebook.imagepipeline.core.ImagePipeline;
|
import com.facebook.imagepipeline.core.ImagePipeline;
|
||||||
import com.facebook.imagepipeline.core.ImagePipelineConfig;
|
import com.facebook.imagepipeline.core.ImagePipelineConfig;
|
||||||
import com.facebook.imagepipeline.producers.Consumer;
|
|
||||||
import com.facebook.imagepipeline.producers.FetchState;
|
|
||||||
import com.facebook.imagepipeline.producers.NetworkFetcher;
|
|
||||||
import com.facebook.imagepipeline.producers.ProducerContext;
|
|
||||||
import com.mapbox.mapboxsdk.Mapbox;
|
import com.mapbox.mapboxsdk.Mapbox;
|
||||||
import com.squareup.leakcanary.LeakCanary;
|
import com.squareup.leakcanary.LeakCanary;
|
||||||
import com.squareup.leakcanary.RefWatcher;
|
import com.squareup.leakcanary.RefWatcher;
|
||||||
|
|
@ -58,7 +54,6 @@ import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||||
import io.reactivex.internal.functions.Functions;
|
import io.reactivex.internal.functions.Functions;
|
||||||
import io.reactivex.plugins.RxJavaPlugins;
|
import io.reactivex.plugins.RxJavaPlugins;
|
||||||
import io.reactivex.schedulers.Schedulers;
|
import io.reactivex.schedulers.Schedulers;
|
||||||
import okhttp3.OkHttpClient;
|
|
||||||
import timber.log.Timber;
|
import timber.log.Timber;
|
||||||
|
|
||||||
import static fr.free.nrw.commons.data.DBOpenHelper.CONTRIBUTIONS_TABLE;
|
import static fr.free.nrw.commons.data.DBOpenHelper.CONTRIBUTIONS_TABLE;
|
||||||
|
|
@ -94,9 +89,6 @@ public class CommonsApplication extends Application {
|
||||||
|
|
||||||
@Inject @Named("default_preferences") JsonKvStore defaultPrefs;
|
@Inject @Named("default_preferences") JsonKvStore defaultPrefs;
|
||||||
|
|
||||||
@Inject
|
|
||||||
OkHttpClient okHttpClient;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constants begin
|
* Constants begin
|
||||||
*/
|
*/
|
||||||
|
|
@ -162,15 +154,9 @@ public class CommonsApplication extends Application {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set DownsampleEnabled to True to downsample the image in case it's heavy
|
// Set DownsampleEnabled to True to downsample the image in case it's heavy
|
||||||
ImagePipelineConfig.Builder imagePipelineConfigBuilder = ImagePipelineConfig.newBuilder(this)
|
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(this)
|
||||||
.setDownsampleEnabled(true);
|
.setDownsampleEnabled(true)
|
||||||
|
.build();
|
||||||
if(ConfigUtils.isBetaFlavour()){
|
|
||||||
NetworkFetcher networkFetcher=new CustomNetworkFetcher(okHttpClient);
|
|
||||||
imagePipelineConfigBuilder.setNetworkFetcher(networkFetcher);
|
|
||||||
}
|
|
||||||
|
|
||||||
ImagePipelineConfig config = imagePipelineConfigBuilder.build();
|
|
||||||
try {
|
try {
|
||||||
Fresco.initialize(this, config);
|
Fresco.initialize(this, config);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
|
||||||
|
|
@ -1,206 +0,0 @@
|
||||||
package fr.free.nrw.commons;
|
|
||||||
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Looper;
|
|
||||||
import android.os.SystemClock;
|
|
||||||
import com.facebook.imagepipeline.common.BytesRange;
|
|
||||||
import com.facebook.imagepipeline.image.EncodedImage;
|
|
||||||
import com.facebook.imagepipeline.producers.BaseNetworkFetcher;
|
|
||||||
import com.facebook.imagepipeline.producers.BaseProducerContextCallbacks;
|
|
||||||
import com.facebook.imagepipeline.producers.Consumer;
|
|
||||||
import com.facebook.imagepipeline.producers.FetchState;
|
|
||||||
import com.facebook.imagepipeline.producers.NetworkFetcher;
|
|
||||||
import com.facebook.imagepipeline.producers.ProducerContext;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.Executor;
|
|
||||||
import okhttp3.CacheControl;
|
|
||||||
import okhttp3.Call;
|
|
||||||
import okhttp3.OkHttpClient;
|
|
||||||
import okhttp3.Request;
|
|
||||||
import okhttp3.Response;
|
|
||||||
import okhttp3.ResponseBody;
|
|
||||||
|
|
||||||
/** Network fetcher that uses OkHttp 3 as a backend. */
|
|
||||||
public class CustomNetworkFetcher
|
|
||||||
extends BaseNetworkFetcher<CustomNetworkFetcher.OkHttpNetworkFetchState> {
|
|
||||||
|
|
||||||
public static class OkHttpNetworkFetchState extends FetchState {
|
|
||||||
|
|
||||||
public long submitTime;
|
|
||||||
public long responseTime;
|
|
||||||
public long fetchCompleteTime;
|
|
||||||
|
|
||||||
public OkHttpNetworkFetchState(
|
|
||||||
Consumer<EncodedImage> consumer, ProducerContext producerContext) {
|
|
||||||
super(consumer, producerContext);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final String QUEUE_TIME = "queue_time";
|
|
||||||
private static final String FETCH_TIME = "fetch_time";
|
|
||||||
private static final String TOTAL_TIME = "total_time";
|
|
||||||
private static final String IMAGE_SIZE = "image_size";
|
|
||||||
|
|
||||||
private final Call.Factory mCallFactory;
|
|
||||||
private final CacheControl mCacheControl;
|
|
||||||
|
|
||||||
private Executor mCancellationExecutor;
|
|
||||||
|
|
||||||
/** @param okHttpClient client to use */
|
|
||||||
public CustomNetworkFetcher(OkHttpClient okHttpClient) {
|
|
||||||
this(okHttpClient, okHttpClient.dispatcher().executorService());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param callFactory custom {@link Call.Factory} for fetching image from the network
|
|
||||||
* @param cancellationExecutor executor on which fetching cancellation is performed if
|
|
||||||
* cancellation is requested from the UI Thread
|
|
||||||
*/
|
|
||||||
public CustomNetworkFetcher(Call.Factory callFactory, Executor cancellationExecutor) {
|
|
||||||
this(callFactory, cancellationExecutor, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param callFactory custom {@link Call.Factory} for fetching image from the network
|
|
||||||
* @param cancellationExecutor executor on which fetching cancellation is performed if
|
|
||||||
* cancellation is requested from the UI Thread
|
|
||||||
* @param disableOkHttpCache true if network requests should not be cached by OkHttp
|
|
||||||
*/
|
|
||||||
public CustomNetworkFetcher(
|
|
||||||
Call.Factory callFactory, Executor cancellationExecutor, boolean disableOkHttpCache) {
|
|
||||||
mCallFactory = callFactory;
|
|
||||||
mCancellationExecutor = cancellationExecutor;
|
|
||||||
mCacheControl = disableOkHttpCache ? new CacheControl.Builder().noStore().build() : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public OkHttpNetworkFetchState createFetchState(
|
|
||||||
Consumer<EncodedImage> consumer, ProducerContext context) {
|
|
||||||
return new OkHttpNetworkFetchState(consumer, context);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void fetch(
|
|
||||||
final OkHttpNetworkFetchState fetchState, final NetworkFetcher.Callback callback) {
|
|
||||||
fetchState.submitTime = SystemClock.elapsedRealtime();
|
|
||||||
final Uri uri = fetchState.getUri();
|
|
||||||
|
|
||||||
try {
|
|
||||||
final Request.Builder requestBuilder = new Request.Builder().url(uri.toString()).get();
|
|
||||||
|
|
||||||
if (mCacheControl != null) {
|
|
||||||
requestBuilder.cacheControl(mCacheControl);
|
|
||||||
}
|
|
||||||
|
|
||||||
final BytesRange bytesRange = fetchState.getContext().getImageRequest().getBytesRange();
|
|
||||||
if (bytesRange != null) {
|
|
||||||
requestBuilder.addHeader("Range", bytesRange.toHttpRangeHeaderValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
fetchWithRequest(fetchState, callback, requestBuilder.build());
|
|
||||||
} catch (Exception e) {
|
|
||||||
// handle error while creating the request
|
|
||||||
callback.onFailure(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onFetchCompletion(OkHttpNetworkFetchState fetchState, int byteSize) {
|
|
||||||
fetchState.fetchCompleteTime = SystemClock.elapsedRealtime();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Map<String, String> getExtraMap(OkHttpNetworkFetchState fetchState, int byteSize) {
|
|
||||||
Map<String, String> extraMap = new HashMap<>(4);
|
|
||||||
extraMap.put(QUEUE_TIME, Long.toString(fetchState.responseTime - fetchState.submitTime));
|
|
||||||
extraMap.put(FETCH_TIME, Long.toString(fetchState.fetchCompleteTime - fetchState.responseTime));
|
|
||||||
extraMap.put(TOTAL_TIME, Long.toString(fetchState.fetchCompleteTime - fetchState.submitTime));
|
|
||||||
extraMap.put(IMAGE_SIZE, Integer.toString(byteSize));
|
|
||||||
return extraMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void fetchWithRequest(
|
|
||||||
final OkHttpNetworkFetchState fetchState,
|
|
||||||
final NetworkFetcher.Callback callback,
|
|
||||||
final Request request) {
|
|
||||||
final Call call = mCallFactory.newCall(request);
|
|
||||||
|
|
||||||
fetchState
|
|
||||||
.getContext()
|
|
||||||
.addCallbacks(
|
|
||||||
new BaseProducerContextCallbacks() {
|
|
||||||
@Override
|
|
||||||
public void onCancellationRequested() {
|
|
||||||
if (Looper.myLooper() != Looper.getMainLooper()) {
|
|
||||||
call.cancel();
|
|
||||||
} else {
|
|
||||||
mCancellationExecutor.execute(
|
|
||||||
new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
call.cancel();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
call.enqueue(
|
|
||||||
new okhttp3.Callback() {
|
|
||||||
@Override
|
|
||||||
public void onResponse(Call call, Response response) throws IOException {
|
|
||||||
fetchState.responseTime = SystemClock.elapsedRealtime();
|
|
||||||
final ResponseBody body = response.body();
|
|
||||||
try {
|
|
||||||
if (!response.isSuccessful()) {
|
|
||||||
handleException(
|
|
||||||
call, new IOException("Unexpected HTTP code " + response), callback);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
BytesRange responseRange =
|
|
||||||
BytesRange.fromContentRangeHeader(response.header("Content-Range"));
|
|
||||||
if (responseRange != null
|
|
||||||
&& !(responseRange.from == 0
|
|
||||||
&& responseRange.to == BytesRange.TO_END_OF_CONTENT)) {
|
|
||||||
// Only treat as a partial image if the range is not all of the content
|
|
||||||
fetchState.setResponseBytesRange(responseRange);
|
|
||||||
fetchState.setOnNewResultStatusFlags(Consumer.IS_PARTIAL_RESULT);
|
|
||||||
}
|
|
||||||
|
|
||||||
long contentLength = body.contentLength();
|
|
||||||
if (contentLength < 0) {
|
|
||||||
contentLength = 0;
|
|
||||||
}
|
|
||||||
callback.onResponse(body.byteStream(), (int) contentLength);
|
|
||||||
} catch (Exception e) {
|
|
||||||
handleException(call, e, callback);
|
|
||||||
} finally {
|
|
||||||
body.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onFailure(Call call, IOException e) {
|
|
||||||
handleException(call, e, callback);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles exceptions.
|
|
||||||
*
|
|
||||||
* <p>OkHttp notifies callers of cancellations via an IOException. If IOException is caught after
|
|
||||||
* request cancellation, then the exception is interpreted as successful cancellation and
|
|
||||||
* onCancellation is called. Otherwise onFailure is called.
|
|
||||||
*/
|
|
||||||
private void handleException(final Call call, final Exception e, final Callback callback) {
|
|
||||||
if (call.isCanceled()) {
|
|
||||||
callback.onCancellation();
|
|
||||||
} else {
|
|
||||||
callback.onFailure(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -8,8 +8,6 @@ import org.wikipedia.dataclient.okhttp.HttpStatusException;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import fr.free.nrw.commons.di.SslUtils;
|
|
||||||
import fr.free.nrw.commons.utils.ConfigUtils;
|
|
||||||
import okhttp3.Cache;
|
import okhttp3.Cache;
|
||||||
import okhttp3.Interceptor;
|
import okhttp3.Interceptor;
|
||||||
import okhttp3.OkHttpClient;
|
import okhttp3.OkHttpClient;
|
||||||
|
|
@ -31,17 +29,13 @@ public final class OkHttpConnectionFactory {
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private static OkHttpClient createClient() {
|
private static OkHttpClient createClient() {
|
||||||
OkHttpClient.Builder builder = new OkHttpClient.Builder()
|
return new OkHttpClient.Builder()
|
||||||
.cookieJar(SharedPreferenceCookieManager.getInstance())
|
.cookieJar(SharedPreferenceCookieManager.getInstance())
|
||||||
.cache(NET_CACHE)
|
.cache(NET_CACHE)
|
||||||
.addInterceptor(getLoggingInterceptor())
|
.addInterceptor(getLoggingInterceptor())
|
||||||
.addInterceptor(new UnsuccessfulResponseInterceptor())
|
.addInterceptor(new UnsuccessfulResponseInterceptor())
|
||||||
.addInterceptor(new CommonHeaderRequestInterceptor());
|
.addInterceptor(new CommonHeaderRequestInterceptor())
|
||||||
|
.build();
|
||||||
if(ConfigUtils.isBetaFlavour()){
|
|
||||||
builder.sslSocketFactory(SslUtils.INSTANCE.getTrustAllHostsSSLSocketFactory());
|
|
||||||
}
|
|
||||||
return builder.build();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static HttpLoggingInterceptor getLoggingInterceptor() {
|
private static HttpLoggingInterceptor getLoggingInterceptor() {
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,6 @@ import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import javax.inject.Named;
|
import javax.inject.Named;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
import javax.net.ssl.SSLContext;
|
|
||||||
import javax.net.ssl.SSLSocketFactory;
|
|
||||||
|
|
||||||
import dagger.Module;
|
import dagger.Module;
|
||||||
import dagger.Provides;
|
import dagger.Provides;
|
||||||
|
|
@ -33,7 +31,6 @@ import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
|
||||||
import fr.free.nrw.commons.mwapi.UserInterface;
|
import fr.free.nrw.commons.mwapi.UserInterface;
|
||||||
import fr.free.nrw.commons.review.ReviewInterface;
|
import fr.free.nrw.commons.review.ReviewInterface;
|
||||||
import fr.free.nrw.commons.upload.UploadInterface;
|
import fr.free.nrw.commons.upload.UploadInterface;
|
||||||
import fr.free.nrw.commons.utils.ConfigUtils;
|
|
||||||
import fr.free.nrw.commons.wikidata.WikidataInterface;
|
import fr.free.nrw.commons.wikidata.WikidataInterface;
|
||||||
import okhttp3.Cache;
|
import okhttp3.Cache;
|
||||||
import okhttp3.HttpUrl;
|
import okhttp3.HttpUrl;
|
||||||
|
|
@ -61,19 +58,13 @@ public class NetworkingModule {
|
||||||
public OkHttpClient provideOkHttpClient(Context context,
|
public OkHttpClient provideOkHttpClient(Context context,
|
||||||
HttpLoggingInterceptor httpLoggingInterceptor) {
|
HttpLoggingInterceptor httpLoggingInterceptor) {
|
||||||
File dir = new File(context.getCacheDir(), "okHttpCache");
|
File dir = new File(context.getCacheDir(), "okHttpCache");
|
||||||
OkHttpClient.Builder builder = new OkHttpClient.Builder().connectTimeout(60, TimeUnit.SECONDS)
|
return new OkHttpClient.Builder().connectTimeout(60, TimeUnit.SECONDS)
|
||||||
.writeTimeout(60, TimeUnit.SECONDS)
|
.writeTimeout(60, TimeUnit.SECONDS)
|
||||||
.addInterceptor(httpLoggingInterceptor)
|
.addInterceptor(httpLoggingInterceptor)
|
||||||
.readTimeout(60, TimeUnit.SECONDS)
|
.readTimeout(60, TimeUnit.SECONDS)
|
||||||
.cache(new Cache(dir, OK_HTTP_CACHE_SIZE));
|
.cache(new Cache(dir, OK_HTTP_CACHE_SIZE))
|
||||||
|
.build();
|
||||||
if(ConfigUtils.isBetaFlavour()){
|
|
||||||
builder.sslSocketFactory(SslUtils.INSTANCE.getTrustAllHostsSSLSocketFactory());
|
|
||||||
}
|
}
|
||||||
return builder.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
|
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
package fr.free.nrw.commons.di
|
|
||||||
|
|
||||||
import java.security.KeyManagementException
|
|
||||||
import java.security.NoSuchAlgorithmException
|
|
||||||
import java.security.cert.CertificateException
|
|
||||||
import java.security.cert.X509Certificate
|
|
||||||
import javax.net.ssl.SSLContext
|
|
||||||
import javax.net.ssl.SSLSocketFactory
|
|
||||||
import javax.net.ssl.TrustManager
|
|
||||||
import javax.net.ssl.X509TrustManager
|
|
||||||
|
|
||||||
object SslUtils {
|
|
||||||
|
|
||||||
fun getTrustAllHostsSSLSocketFactory(): SSLSocketFactory? {
|
|
||||||
try {
|
|
||||||
// Create a trust manager that does not validate certificate chains
|
|
||||||
val trustAllCerts = arrayOf<TrustManager>(object : X509TrustManager {
|
|
||||||
|
|
||||||
override fun getAcceptedIssuers(): Array<X509Certificate> {
|
|
||||||
return arrayOf()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Throws(CertificateException::class)
|
|
||||||
override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Throws(CertificateException::class)
|
|
||||||
override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// Install the all-trusting trust manager
|
|
||||||
val sslContext = SSLContext.getInstance("SSL")
|
|
||||||
sslContext.init(null, trustAllCerts, java.security.SecureRandom())
|
|
||||||
// Create an ssl socket factory with our all-trusting manager
|
|
||||||
|
|
||||||
return sslContext.socketFactory
|
|
||||||
} catch (e: KeyManagementException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
return null
|
|
||||||
} catch (e: NoSuchAlgorithmException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue