From 33610d781025d9411477d5d51e411888fae04ac1 Mon Sep 17 00:00:00 2001 From: maskara Date: Sun, 2 Sep 2018 23:19:36 +0530 Subject: [PATCH] Fix logout --- .../java/fr/free/nrw/commons/CommonsApplication.java | 5 +++-- .../fr/free/nrw/commons/auth/SessionManager.java | 12 ++++++++++-- .../commons/mwapi/ApacheHttpClientMediaWikiApi.java | 11 +++++++++++ .../java/fr/free/nrw/commons/mwapi/CustomMwApi.java | 2 ++ .../java/fr/free/nrw/commons/mwapi/MediaWikiApi.java | 2 ++ 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java index 2ceb22d06a..0e68af83c4 100644 --- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java +++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java @@ -1,5 +1,6 @@ package fr.free.nrw.commons; +import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; @@ -128,6 +129,7 @@ public static RefWatcher getRefWatcher(Context context) { * @param context Application context * @param logoutListener Implementation of interface LogoutListener */ + @SuppressLint("CheckResult") public void clearApplicationData(Context context, LogoutListener logoutListener) { File cacheDirectory = context.getCacheDir(); File applicationDirectory = new File(cacheDirectory.getParent()); @@ -140,7 +142,7 @@ public void clearApplicationData(Context context, LogoutListener logoutListener) } } - sessionManager.clearAllAccounts() + sessionManager.logout() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(() -> { @@ -151,7 +153,6 @@ public void clearApplicationData(Context context, LogoutListener logoutListener) applicationPrefs.edit().putBoolean("firstrun", false).apply(); otherPrefs.edit().clear().apply(); updateAllDatabases(); - logoutListener.onLogoutComplete(); }); } diff --git a/app/src/main/java/fr/free/nrw/commons/auth/SessionManager.java b/app/src/main/java/fr/free/nrw/commons/auth/SessionManager.java index cd23d12829..e8745e25be 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/SessionManager.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/SessionManager.java @@ -153,11 +153,19 @@ public void forceLogin(Context context) { } } - public Completable clearAllAccounts() { + /** + * 1. Clears existing accounts from account manager + * 2. Calls MediaWikiApi's logout function to clear cookies + * @return + */ + public Completable logout() { AccountManager accountManager = AccountManager.get(context); Account[] allAccounts = accountManager.getAccountsByType(BuildConfig.ACCOUNT_TYPE); return Completable.fromObservable(Observable.fromArray(allAccounts) .map(a -> accountManager.removeAccount(a, null, null).getResult())) - .doOnComplete(() -> currentAccount = null); + .doOnComplete(() -> { + mediaWikiApi.logout(); + currentAccount = null; + }); } } diff --git a/app/src/main/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApi.java b/app/src/main/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApi.java index 53050094b9..b9a0468d9a 100644 --- a/app/src/main/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApi.java +++ b/app/src/main/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApi.java @@ -1032,4 +1032,15 @@ private Date parseMWDate(String mwDate) { } } + /** + * Calls media wiki's logout API + */ + public void logout() { + try { + api.logout(); + } catch (IOException e) { + Timber.e(e, "Error occurred while logging out"); + } + } + } diff --git a/app/src/main/java/fr/free/nrw/commons/mwapi/CustomMwApi.java b/app/src/main/java/fr/free/nrw/commons/mwapi/CustomMwApi.java index 1b9e93fa9c..21810d8656 100644 --- a/app/src/main/java/fr/free/nrw/commons/mwapi/CustomMwApi.java +++ b/app/src/main/java/fr/free/nrw/commons/mwapi/CustomMwApi.java @@ -167,6 +167,8 @@ public void logout() throws IOException { // I should be doing more validation here, but meh isLoggedIn = false; this.action("logout").post(); + removeAllCookies(); + authCookie = null; } private CustomApiResult makeRequest(String method, HashMap params) throws IOException { diff --git a/app/src/main/java/fr/free/nrw/commons/mwapi/MediaWikiApi.java b/app/src/main/java/fr/free/nrw/commons/mwapi/MediaWikiApi.java index d96e9b177a..687e898473 100644 --- a/app/src/main/java/fr/free/nrw/commons/mwapi/MediaWikiApi.java +++ b/app/src/main/java/fr/free/nrw/commons/mwapi/MediaWikiApi.java @@ -106,6 +106,8 @@ public interface MediaWikiApi { @NonNull Single getAchievements(String userName); + void logout(); + interface ProgressListener { void onProgress(long transferred, long total); }