package org.ourgrid.peer.business.requester;
import static org.ourgrid.common.util.CommonUtils.checkKey;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.ourgrid.common.BrokerLoginResult;
import org.ourgrid.common.internal.IResponseTO;
import org.ourgrid.common.internal.RequesterIF;
import org.ourgrid.common.internal.response.LoggerResponseTO;
import org.ourgrid.common.internal.response.ReleaseResponseTO;
import org.ourgrid.common.statistics.control.LoginControl;
import org.ourgrid.common.statistics.control.UserControl;
import org.ourgrid.common.util.StringUtil;
import org.ourgrid.peer.business.controller.WorkerProviderClientFailureController;
import org.ourgrid.peer.business.dao.PeerDAOFactory;
import org.ourgrid.peer.request.LoginRequestTO;
import org.ourgrid.peer.response.LoginSuccededResponseTO;
import org.ourgrid.peer.to.PeerUser;
import org.ourgrid.peer.to.PeerUserReference;
import org.ourgrid.reqtrace.Req;
public class LoginRequester implements RequesterIF<LoginRequestTO> {
public List<IResponseTO> execute(LoginRequestTO request) {
List<IResponseTO> responses = new ArrayList<IResponseTO>();
String brokerPublicKey = request.getSenderPublicKey();
String login = request.getLogin();
PeerUser user = UserControl.getInstance().getUser(responses, login);
if (request.isOnDemandPeer()) {
try {
if (user == null){
UserControl.getInstance().addUser(responses, request.getLogin(), request.getMyUserAtServer(),
request.getMyCertSubjectDN(), request.getDescription(),request.getEmail(),
request.getLabel(), request.getLatitude(), request.getLongitude());
user = UserControl.getInstance().getUser(responses, login);
}
UserControl.getInstance().registerPublicKey(responses, user, brokerPublicKey);
user.setPublicKey(brokerPublicKey);
} catch (Exception e) {
//do nothing
}
} else {
if (!validateLogin(responses, request, user)) {
return responses;
}
}
String workerProviderClientAddress = request.getWorkerProviderClientAddress();
PeerUserReference loggedUser = PeerDAOFactory.getInstance().getUsersDAO().getLoggedUser(user.getPublicKey());
if (loggedUser != null && !loggedUser.getWorkerProviderClientAddress().equals(workerProviderClientAddress)) {
getLoginStatistics().localConsumerFailure(responses, user);
}
WorkerProviderClientFailureController.getInstance().finishUserRequests(responses,
StringUtil.addressToContainerID(request.getWorkerProviderClientAddress()),
brokerPublicKey, request.getMyCertSubjectDN());
if (loggedUser != null){
if (loggedUser.getWorkerProviderClientAddress().equals(workerProviderClientAddress)) {
BrokerLoginResult loginResult = new BrokerLoginResult(); //TODO LoginResult.ALREADY_LOGGED);
LoginSuccededResponseTO loginTO = new LoginSuccededResponseTO();
loginTO.setLoginResult(loginResult);
loginTO.setWorkerProviderClientAddress(workerProviderClientAddress);
responses.add(loginTO);
getLoginStatistics().login(responses, user, loginResult, request.getMyUserAtServer(), request.getMyCertSubjectDN(), request.getDescription(),
request.getEmail(), request.getLabel(), request.getLatitude(), request.getLongitude());
return responses;
}
PeerDAOFactory.getInstance().getUsersDAO().removeLoggedUser(brokerPublicKey);
PeerDAOFactory.getInstance().getConsumerDAO().removeLocalConsumer(brokerPublicKey);
}
doLogin(responses, request, user);
return responses;
}
private boolean validateLogin(List<IResponseTO> responses, LoginRequestTO request, PeerUser user) {
String workerProviderClientAddress = request.getWorkerProviderClientAddress();
String brokerPublicKey = request.getSenderPublicKey();
if (user == null) {
BrokerLoginResult loginResult = new BrokerLoginResult(BrokerLoginResult.UNKNOWN_USER);
LoginSuccededResponseTO loginTO = new LoginSuccededResponseTO();
loginTO.setLoginResult(loginResult);
loginTO.setWorkerProviderClientAddress(workerProviderClientAddress);
responses.add(loginTO);
user = new PeerUser(request.getUserName(), request.getServerName(),
"", false);
getLoginStatistics().login(responses, user, loginResult,
request.getMyUserAtServer(), request.getMyCertSubjectDN(), request.getDescription(),
request.getEmail(), request.getLabel(), request.getLatitude(), request.getLongitude());
ReleaseResponseTO releaseTO = new ReleaseResponseTO();
releaseTO.setStubAddress(workerProviderClientAddress);
responses.add(releaseTO);
return false;
}
if(isFirstLogin(user)){
try {
if (UserControl.getInstance().userExists(responses, brokerPublicKey)) {
BrokerLoginResult loginResult = new BrokerLoginResult(BrokerLoginResult.DUPLICATED_PUBLIC_KEY);
LoginSuccededResponseTO loginTO = new LoginSuccededResponseTO();
loginTO.setLoginResult(loginResult);
loginTO.setWorkerProviderClientAddress(workerProviderClientAddress);
responses.add(loginTO);
getLoginStatistics().login(responses, user, loginResult, request.getMyUserAtServer(), request.getMyCertSubjectDN(), request.getDescription(),
request.getEmail(), request.getLabel(), request.getLatitude(), request.getLongitude());
ReleaseResponseTO releaseTO = new ReleaseResponseTO();
releaseTO.setStubAddress(workerProviderClientAddress);
responses.add(releaseTO);
return false;
} else {
UserControl.getInstance().registerPublicKey(responses, user, brokerPublicKey);
user.setPublicKey(brokerPublicKey);
}
} catch (IOException e) {
responses.add(new LoggerResponseTO(e.getMessage(), LoggerResponseTO.ERROR, e));
BrokerLoginResult loginResult = new BrokerLoginResult(BrokerLoginResult.INTERNAL_ERROR);
LoginSuccededResponseTO loginTO = new LoginSuccededResponseTO();
loginTO.setLoginResult(loginResult);
loginTO.setWorkerProviderClientAddress(workerProviderClientAddress);
responses.add(loginTO);
getLoginStatistics().login(responses, user, loginResult, request.getMyUserAtServer(), request.getMyCertSubjectDN(), request.getDescription(),
request.getEmail(), request.getLabel(), request.getLatitude(), request.getLongitude());
ReleaseResponseTO releaseTO = new ReleaseResponseTO();
releaseTO.setStubAddress(workerProviderClientAddress);
responses.add(releaseTO);
}
}
if(!checkKey(user.getPublicKey(), brokerPublicKey)){
BrokerLoginResult loginResult = new BrokerLoginResult(BrokerLoginResult.WRONG_PUBLIC_KEY);
LoginSuccededResponseTO loginTO = new LoginSuccededResponseTO();
loginTO.setLoginResult(loginResult);
loginTO.setWorkerProviderClientAddress(workerProviderClientAddress);
responses.add(loginTO);
getLoginStatistics().login(responses, user, loginResult, request.getMyUserAtServer(), request.getMyCertSubjectDN(), request.getDescription(),
request.getEmail(), request.getLabel(), request.getLatitude(), request.getLongitude());
ReleaseResponseTO releaseTO = new ReleaseResponseTO();
releaseTO.setStubAddress(workerProviderClientAddress);
responses.add(releaseTO);
return false;
}
return true;
}
@Req("REQ108")
private void doLogin(List<IResponseTO> responses, LoginRequestTO request, PeerUser user) {
PeerDAOFactory.getInstance().getUsersDAO().addLoggedUser(request.getSenderPublicKey(), new PeerUserReference(request.getWorkerProviderClientAddress()));
BrokerLoginResult loginResult = new BrokerLoginResult();
LoginSuccededResponseTO loginTO = new LoginSuccededResponseTO();
loginTO.setLoginResult(loginResult);
loginTO.setWorkerProviderClientAddress(request.getWorkerProviderClientAddress());
responses.add(loginTO);
getLoginStatistics().login(responses, user, loginResult, request.getMyUserAtServer(), request.getMyCertSubjectDN(), request.getDescription(),
request.getEmail(), request.getLabel(), request.getLatitude(), request.getLongitude());
}
/**
* @return
*/
private LoginControl getLoginStatistics() {
return LoginControl.getInstance();
}
@Req("REQ108")
private boolean isFirstLogin(PeerUser user) {
return user.getPublicKey().equals("");
}
}