jenkins-bot has submitted this change and it was merged. Change subject: Fix cookies and user options ......................................................................
Fix cookies and user options • The cookie jar was only being used for old Api requests. Use the same OkHttpClient and cookie manager everywhere. • HttpCookie.getDomain() now seems to return a top level domain like wikipedia.org instead of en.wikipedia.org. This appears to affect only the user option cookie loosening around meta.wikimedia.org. Make the check slightly looser. • There is a race condition with obtaining the edit token used to preserve user options. For now, catch the error and handle it like a network issue. Change-Id: Ibf3985f1fcf0b349c9d8ec799adf8d2587d854a0 --- M app/src/main/java/org/wikipedia/OkHttpConnectionFactory.java M app/src/main/java/org/wikipedia/SharedPreferenceCookieManager.java M app/src/main/java/org/wikipedia/dataclient/retrofit/RetrofitFactory.java M app/src/main/java/org/wikipedia/useroption/dataclient/DefaultUserOptionDataClient.java 4 files changed, 37 insertions(+), 36 deletions(-) Approvals: BearND: Looks good to me, but someone else must approve Mholloway: Looks good to me, approved jenkins-bot: Verified diff --git a/app/src/main/java/org/wikipedia/OkHttpConnectionFactory.java b/app/src/main/java/org/wikipedia/OkHttpConnectionFactory.java index 65428a4..abe8adb 100644 --- a/app/src/main/java/org/wikipedia/OkHttpConnectionFactory.java +++ b/app/src/main/java/org/wikipedia/OkHttpConnectionFactory.java @@ -1,13 +1,11 @@ package org.wikipedia; import android.content.Context; +import android.support.annotation.NonNull; + import com.github.kevinsawicki.http.HttpRequest; -import okhttp3.Cache; -import okhttp3.CookieJar; -import okhttp3.JavaNetCookieJar; -import okhttp3.OkHttpClient; -import okhttp3.OkUrlFactory; -import okhttp3.Protocol; + +import org.wikipedia.settings.Prefs; import java.io.IOException; import java.net.HttpURLConnection; @@ -16,13 +14,21 @@ import java.util.ArrayList; import java.util.List; +import okhttp3.Cache; +import okhttp3.CookieJar; +import okhttp3.JavaNetCookieJar; +import okhttp3.OkHttpClient; +import okhttp3.OkUrlFactory; +import okhttp3.Protocol; +import okhttp3.logging.HttpLoggingInterceptor; + public class OkHttpConnectionFactory implements HttpRequest.ConnectionFactory { private static final long HTTP_CACHE_SIZE = 16 * 1024 * 1024; private final OkHttpClient client; - public OkHttpConnectionFactory(Context context) { - client = createClient(context); + public OkHttpConnectionFactory(@NonNull Context context) { + client = createClient(context).build(); } @Override @@ -36,7 +42,7 @@ "Per-connection proxy is not supported. Use OkHttpClient's setProxy instead."); } - public static OkHttpClient createClient(Context context) { + public static OkHttpClient.Builder createClient(@NonNull Context context) { // Create a custom set of protocols that excludes HTTP/2, since OkHttp doesn't play // nicely with nginx over HTTP/2. // TODO: Remove when https://github.com/square/okhttp/issues/2543 is fixed. @@ -49,10 +55,13 @@ // TODO: consider using okhttp3.CookieJar implementation instead of JavaNetCookieJar wrapper CookieJar cookieJar = new JavaNetCookieJar(cookieManager); + HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); + loggingInterceptor.setLevel(Prefs.getRetrofitLogLevel()); + return new OkHttpClient.Builder() .cookieJar(cookieJar) .cache(new Cache(context.getCacheDir(), HTTP_CACHE_SIZE)) .protocols(protocolList) - .build(); + .addInterceptor(loggingInterceptor); } } diff --git a/app/src/main/java/org/wikipedia/SharedPreferenceCookieManager.java b/app/src/main/java/org/wikipedia/SharedPreferenceCookieManager.java index b6c8c18..b127031 100644 --- a/app/src/main/java/org/wikipedia/SharedPreferenceCookieManager.java +++ b/app/src/main/java/org/wikipedia/SharedPreferenceCookieManager.java @@ -47,7 +47,7 @@ // en.wikipedia.org and *.wikimedia.org // FIXME: Whitelist the domains we accept cookies from/send cookies to. SECURITY!!!1 if (domain.endsWith(domainSpec) - || (domain.endsWith(".wikimedia.org") && domainSpec.endsWith(".wikipedia.org"))) { + || (domain.endsWith(".wikimedia.org") && domainSpec.endsWith("wikipedia.org"))) { cookiesList.addAll(makeCookieList(cookieJar.get(domainSpec))); } } @@ -86,7 +86,6 @@ } else { cookieJar.get(domainSpec).put(cookie.getName(), cookie.getValue()); } - domainsModified.add(domainSpec); } } catch (IllegalArgumentException e) { diff --git a/app/src/main/java/org/wikipedia/dataclient/retrofit/RetrofitFactory.java b/app/src/main/java/org/wikipedia/dataclient/retrofit/RetrofitFactory.java index 22be5b9..df43a89 100644 --- a/app/src/main/java/org/wikipedia/dataclient/retrofit/RetrofitFactory.java +++ b/app/src/main/java/org/wikipedia/dataclient/retrofit/RetrofitFactory.java @@ -5,10 +5,10 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import org.wikipedia.OkHttpConnectionFactory; import org.wikipedia.Site; import org.wikipedia.WikipediaApp; import org.wikipedia.server.Protection; -import org.wikipedia.settings.Prefs; import java.io.IOException; @@ -16,7 +16,6 @@ import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; -import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; @@ -27,25 +26,20 @@ public static Retrofit newInstance(@NonNull final Site site, @NonNull String endpoint) { final WikipediaApp app = WikipediaApp.getInstance(); - HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); - loggingInterceptor.setLevel(Prefs.getRetrofitLogLevel()); - - OkHttpClient.Builder httpClient = new OkHttpClient.Builder() - .addInterceptor(loggingInterceptor) - .addNetworkInterceptor( - new Interceptor() { - @Override - public Response intercept(Chain chain) throws IOException { - Request request = chain.request(); - request = request.newBuilder() - .headers(app.buildCustomHeaders(request, site)) - .build(); - return chain.proceed(request); - } - } - ); - - OkHttpClient client = httpClient.build(); + OkHttpClient client = OkHttpConnectionFactory + .createClient(WikipediaApp.getInstance()) + .addNetworkInterceptor( + new Interceptor() { + @Override + public Response intercept(Chain chain) throws IOException { + Request request = chain.request(); + request = request.newBuilder() + .headers(app.buildCustomHeaders(request, site)) + .build(); + return chain.proceed(request); + } + }) + .build(); return new Retrofit.Builder() .client(client) .baseUrl(endpoint) diff --git a/app/src/main/java/org/wikipedia/useroption/dataclient/DefaultUserOptionDataClient.java b/app/src/main/java/org/wikipedia/useroption/dataclient/DefaultUserOptionDataClient.java index c0a9974..ae94859 100644 --- a/app/src/main/java/org/wikipedia/useroption/dataclient/DefaultUserOptionDataClient.java +++ b/app/src/main/java/org/wikipedia/useroption/dataclient/DefaultUserOptionDataClient.java @@ -49,15 +49,14 @@ client.delete(getToken(), key).execute().body().check(site); } - @NonNull private String getToken() { + @NonNull private String getToken() throws IOException { if (app().getEditTokenStorage().token(site) == null) { requestToken(); } String token = app().getEditTokenStorage().token(site); if (token == null) { - throw RetrofitException.unexpectedError( - new RuntimeException("No token for " + site.authority())); + throw new IOException("No token for " + site.authority()); } return token; } -- To view, visit https://gerrit.wikimedia.org/r/288533 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: Ibf3985f1fcf0b349c9d8ec799adf8d2587d854a0 Gerrit-PatchSet: 2 Gerrit-Project: apps/android/wikipedia Gerrit-Branch: master Gerrit-Owner: Niedzielski <sniedziel...@wikimedia.org> Gerrit-Reviewer: BearND <bsitzm...@wikimedia.org> Gerrit-Reviewer: Brion VIBBER <br...@wikimedia.org> Gerrit-Reviewer: Dbrant <dbr...@wikimedia.org> Gerrit-Reviewer: Mholloway <mhollo...@wikimedia.org> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits