package com.fastaccess.ui.modules.login; import android.content.Intent; import android.net.Uri; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import com.fastaccess.BuildConfig; import com.fastaccess.R; import com.fastaccess.data.dao.AccessTokenModel; import com.fastaccess.data.dao.AuthModel; import com.fastaccess.data.dao.model.Login; import com.fastaccess.helper.GithubConfigHelper; import com.fastaccess.helper.InputHelper; import com.fastaccess.helper.Logger; import com.fastaccess.helper.PrefGetter; import com.fastaccess.provider.rest.LoginProvider; import com.fastaccess.provider.rest.RestProvider; import com.fastaccess.ui.base.mvp.presenter.BasePresenter; import java.util.Arrays; import okhttp3.Credentials; import retrofit2.adapter.rxjava.HttpException; /** * Created by Kosh on 09 Nov 2016, 9:43 PM */ public class LoginPresenter extends BasePresenter<LoginMvp.View> implements LoginMvp.Presenter { public LoginPresenter() { RestProvider.clearHttpClient(); } @Override protected void onDestroy() { super.onDestroy(); } @Override public void onError(@NonNull Throwable throwable) { if (RestProvider.getErrorCode(throwable) == 401 && throwable instanceof HttpException) { retrofit2.Response response = ((HttpException) throwable).response(); if (response != null && response.headers() != null) { String twoFaToken = response.headers().get("X-GitHub-OTP"); if (twoFaToken != null) { sendToView(LoginMvp.View::onRequire2Fa); return; } else { sendToView(view -> view.showMessage(R.string.error, R.string.failed_login)); return; } } } sendToView(view -> view.showErrorMessage(throwable.getMessage())); } @Override public void onTokenResponse(@Nullable AccessTokenModel modelResponse) { if (modelResponse != null) { String token = modelResponse.getToken() != null ? modelResponse.getToken() : modelResponse.getAccessToken(); if (!InputHelper.isEmpty(token)) { PrefGetter.setToken(token); makeRestCall(RestProvider.getUserService().getUser(), this::onUserResponse); return; } } sendToView(view -> view.showMessage(R.string.error, R.string.failed_login)); } @NonNull @Override public Uri getAuthorizationUrl() { return new Uri.Builder() .scheme("https") .authority("github.com") .appendPath("login") .appendPath("oauth") .appendPath("authorize") .appendQueryParameter("client_id", GithubConfigHelper.getClientId()) .appendQueryParameter("redirect_uri", GithubConfigHelper.getRedirectUrl()) .appendQueryParameter("scope", "user,repo,gist,notifications,read:org") .appendQueryParameter("state", BuildConfig.APPLICATION_ID) .build(); } @Override public void onHandleAuthIntent(@Nullable Intent intent) { Logger.e(intent, intent != null ? intent.getExtras() : "N/A"); if (intent != null && intent.getData() != null) { Uri uri = intent.getData(); Logger.e(uri.toString()); if (uri.toString().startsWith(GithubConfigHelper.getRedirectUrl())) { String tokenCode = uri.getQueryParameter("code"); if (!InputHelper.isEmpty(tokenCode)) { makeRestCall(LoginProvider.getLoginRestService().getAccessToken(tokenCode, GithubConfigHelper.getClientId(), GithubConfigHelper.getSecret(), BuildConfig.APPLICATION_ID, GithubConfigHelper.getRedirectUrl()), this::onTokenResponse); } else { sendToView(view -> view.showMessage(R.string.error, R.string.error)); } } } } @Override public void onUserResponse(@Nullable Login userModel) { if (userModel != null) { userModel.setToken(PrefGetter.getToken()); userModel.save(userModel); if(getView()!=null) getView().onSuccessfullyLoggedIn(userModel); else sendToView(LoginMvp.View::onSuccessfullyLoggedIn); return; } sendToView(view -> view.showMessage(R.string.error, R.string.failed_login)); } @Override public void login(@NonNull String username, @NonNull String password, @Nullable String twoFactorCode, boolean isBasicAuth, boolean ignore) { boolean usernameIsEmpty = InputHelper.isEmpty(username); boolean passwordIsEmpty = InputHelper.isEmpty(password); if (getView() == null) return; getView().onEmptyUserName(!ignore&&usernameIsEmpty); getView().onEmptyPassword(!ignore&&passwordIsEmpty); if ((!usernameIsEmpty && !passwordIsEmpty) || ignore) { String authToken = Credentials.basic(username, password); if (isBasicAuth) { AuthModel authModel = new AuthModel(); authModel.setScopes(Arrays.asList("user", "repo", "gist", "notifications", "read:org")); authModel.setNote(BuildConfig.APPLICATION_ID); authModel.setClientSecret(GithubConfigHelper.getSecret()); authModel.setClientId(GithubConfigHelper.getClientId()); authModel.setNoteUr(GithubConfigHelper.getRedirectUrl()); if (!InputHelper.isEmpty(twoFactorCode)) { authModel.setOtpCode(twoFactorCode); } makeRestCall(LoginProvider.getLoginRestService(authToken, twoFactorCode).login(authModel), accessTokenModel -> { if (!InputHelper.isEmpty(twoFactorCode)) { PrefGetter.setOtpCode(twoFactorCode); } onTokenResponse(accessTokenModel); }); } else { makeRestCall(LoginProvider.getLoginRestService(authToken, null).loginAccessToken(), login -> { if (login != null) { PrefGetter.setToken(InputHelper.toString(password)); } onUserResponse(login); }); } } } }