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

Reply via email to