package com.khmelenko.lab.varis.presenter;
import android.text.TextUtils;
import com.khmelenko.lab.varis.event.github.CreateAuthorizationSuccessEvent;
import com.khmelenko.lab.varis.event.github.DeleteAuthorizationSuccessEvent;
import com.khmelenko.lab.varis.event.github.GithubAuthorizationFailEvent;
import com.khmelenko.lab.varis.event.travis.AuthFailEvent;
import com.khmelenko.lab.varis.event.travis.AuthSuccessEvent;
import com.khmelenko.lab.varis.mvp.MvpPresenter;
import com.khmelenko.lab.varis.network.request.AuthorizationRequest;
import com.khmelenko.lab.varis.network.response.Authorization;
import com.khmelenko.lab.varis.network.retrofit.travis.TravisRestClient;
import com.khmelenko.lab.varis.storage.AppSettings;
import com.khmelenko.lab.varis.task.TaskError;
import com.khmelenko.lab.varis.task.TaskManager;
import com.khmelenko.lab.varis.util.EncryptionUtils;
import com.khmelenko.lab.varis.util.StringUtils;
import com.khmelenko.lab.varis.view.AuthView;
import java.util.Arrays;
import java.util.List;
import javax.inject.Inject;
import de.greenrobot.event.EventBus;
/**
* Authentication presenter
*
* @author Dmytro Khmelenko (d.khmelenko@gmail.com)
*/
public class AuthPresenter extends MvpPresenter<AuthView> {
private final TaskManager mTaskManager;
private final EventBus mEventBus;
private final TravisRestClient mTravisRestClient;
private String mBasicAuth;
private String mSecurityCode;
private Authorization mAuthorization;
private boolean mSecurityCodeInput;
@Inject
public AuthPresenter(TaskManager taskManager, EventBus eventBus, TravisRestClient travisRestClient) {
mTaskManager = taskManager;
mEventBus = eventBus;
mTravisRestClient = travisRestClient;
}
@Override
public void onAttach() {
mEventBus.register(this);
getView().setInputView(mSecurityCodeInput);
}
@Override
public void onDetach() {
mEventBus.unregister(this);
}
/**
* Handles success creation new authorization
*
* @param event Event data
*/
public void onEvent(CreateAuthorizationSuccessEvent event) {
mAuthorization = event.getAuthorization();
mTaskManager.startAuth(mAuthorization.getToken());
}
/**
* Handles success deletion authorization
*
* @param event Event data
*/
public void onEvent(DeleteAuthorizationSuccessEvent event) {
// ignoring the result of deletion
}
/**
* Handles event of github failed authentication
*
* @param event Event data
*/
public void onEvent(GithubAuthorizationFailEvent event) {
getView().hideProgress();
TaskError taskError = event.getTaskError();
if (taskError.getCode() == TaskError.TWO_FACTOR_AUTH_REQUIRED) {
mSecurityCodeInput = true;
getView().showTwoFactorAuth();
} else {
getView().showErrorMessage(event.getTaskError().getMessage());
}
}
/**
* Handles event of success authentication
*
* @param event Event data
*/
public void onEvent(AuthSuccessEvent event) {
getView().hideProgress();
// start deletion authorization on Github, because we don't need it anymore
if (!TextUtils.isEmpty(mSecurityCode)) {
mTaskManager.deleteAuthorization(mBasicAuth, String.valueOf(mAuthorization.getId()), mSecurityCode);
} else {
mTaskManager.deleteAuthorization(mBasicAuth, String.valueOf(mAuthorization.getId()));
}
// save access token to settings
String accessToken = event.getAccessToken();
AppSettings.putAccessToken(accessToken);
getView().finishView();
}
/**
* Handles event on failed authentication
*
* @param event Event data
*/
public void onEvent(AuthFailEvent event) {
getView().hideProgress();
getView().showErrorMessage(event.getTaskError().getMessage());
}
/**
* Updates server endpoint
*
* @param newServer New server endpoint
*/
public void updateServer(String newServer) {
AppSettings.putServerUrl(newServer);
mTravisRestClient.updateTravisEndpoint(newServer);
}
/**
* Executes login action
*
* @param userName Username
* @param password Password
*/
public void login(String userName, String password) {
mBasicAuth = EncryptionUtils.generateBasicAuthorization(userName, password);
mTaskManager.createNewAuthorization(mBasicAuth, prepareAuthorizationRequest());
}
/**
* Executes two-factor auth call
*
* @param securityCode Security code
*/
public void twoFactorAuth(String securityCode) {
mSecurityCode = securityCode;
mTaskManager.createNewAuthorization(mBasicAuth, prepareAuthorizationRequest(), securityCode);
}
/**
* Prepares authorization request
*
* @return Authorization request
*/
private AuthorizationRequest prepareAuthorizationRequest() {
List<String> scopes = Arrays.asList("read:org", "user:email", "repo_deployment",
"repo:status", "write:repo_hook", "repo");
String note = String.format("varis_client_%1$s", StringUtils.getRandomString());
return new AuthorizationRequest(scopes, note);
}
}