Make login work across sessions

This commit is contained in:
maskara 2018-01-21 03:29:07 +05:30
parent 1ea0a1ebeb
commit 9c23a8c34b
7 changed files with 56 additions and 41 deletions

View file

@ -6,8 +6,6 @@ import javax.inject.Inject;
import fr.free.nrw.commons.mwapi.MediaWikiApi;
import fr.free.nrw.commons.theme.NavigationBaseActivity;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import static fr.free.nrw.commons.auth.AccountUtil.AUTH_COOKIE;
@ -23,13 +21,10 @@ public abstract class AuthenticatedActivity extends NavigationBaseActivity {
onAuthCookieAcquired(authCookie);
return;
}
sessionManager.getAndSetAuthCookie()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(cookie -> {
authCookie = cookie;
onAuthCookieAcquired(authCookie);
});
authCookie = sessionManager.getAuthCookie();
if (authCookie != null) {
onAuthCookieAcquired(authCookie);
}
}
@Override

View file

@ -3,15 +3,14 @@ package fr.free.nrw.commons.auth;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.content.Context;
import android.content.SharedPreferences;
import fr.free.nrw.commons.mwapi.MediaWikiApi;
import io.reactivex.Completable;
import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;
import timber.log.Timber;
import static fr.free.nrw.commons.auth.AccountUtil.ACCOUNT_TYPE;
import static fr.free.nrw.commons.auth.AccountUtil.AUTH_TOKEN_TYPE;
/**
* Manage the current logged in user session.
@ -20,11 +19,13 @@ public class SessionManager {
private final Context context;
private final MediaWikiApi mediaWikiApi;
private Account currentAccount; // Unlike a savings account... ;-)
private SharedPreferences sharedPreferences;
public SessionManager(Context context, MediaWikiApi mediaWikiApi) {
public SessionManager(Context context, MediaWikiApi mediaWikiApi, SharedPreferences sharedPreferences) {
this.context = context;
this.mediaWikiApi = mediaWikiApi;
this.currentAccount = null;
this.sharedPreferences = sharedPreferences;
}
/**
@ -50,31 +51,28 @@ public class SessionManager {
}
accountManager.invalidateAuthToken(ACCOUNT_TYPE, mediaWikiApi.getAuthCookie());
getAndSetAuthCookie().subscribeOn(Schedulers.io())
.subscribe(authCookie -> {
mediaWikiApi.setAuthCookie(authCookie);
});
String authCookie = getAuthCookie();
if (authCookie == null) {
return false;
}
mediaWikiApi.setAuthCookie(authCookie);
return true;
}
public Observable<String> getAndSetAuthCookie() {
AccountManager accountManager = AccountManager.get(context);
Account curAccount = getCurrentAccount();
return Observable.fromCallable(() -> {
String authCookie = accountManager.blockingGetAuthToken(curAccount, AUTH_TOKEN_TYPE, false);
if (authCookie == null) {
Timber.d("Media wiki auth cookie is %s", mediaWikiApi.getAuthCookie());
authCookie = mediaWikiApi.getAuthCookie();
//authCookie = currentAccount.name + "|" + currentAccount.type + "|" + mediaWikiApi.getUserAgent();
//mediaWikiApi.setAuthCookie(authCookie);
public String getAuthCookie() {
boolean isLoggedIn = sharedPreferences.getBoolean("isUserLoggedIn", false);
}
Timber.d("Auth cookie is %s", authCookie);
return authCookie;
}).onErrorReturn(throwable-> {
Timber.e(throwable, "Auth cookie is still null :(");
if (!isLoggedIn) {
Timber.e("User is not logged in");
return null;
});
} else {
String authCookie = sharedPreferences.getString("getAuthCookie", null);
if (authCookie == null) {
Timber.e("Auth cookie is null even after login");
}
return authCookie;
}
}
public Completable clearAllAccounts() {

View file

@ -19,7 +19,7 @@ import static fr.free.nrw.commons.auth.AccountUtil.ACCOUNT_TYPE;
import static fr.free.nrw.commons.auth.AccountUtil.AUTH_TOKEN_TYPE;
public class WikiAccountAuthenticator extends AbstractAccountAuthenticator {
private static final String[] SYNC_AUTHORITIES = {ContributionsContentProvider.AUTHORITY, ModificationsContentProvider.AUTHORITY};
private static final String[] SYNC_AUTHORITIES = {ContributionsContentProvider.CONTRIBUTION_AUTHORITY, ModificationsContentProvider.MODIFICATIONS_AUTHORITY};
@NonNull
private final Context context;