package org.ourgrid.peer.business.requester; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.List; import org.ourgrid.common.WorkerLoginResult; import org.ourgrid.common.internal.IResponseTO; import org.ourgrid.common.internal.response.LoggerResponseTO; import org.ourgrid.common.internal.response.ReleaseResponseTO; import org.ourgrid.common.specification.worker.WorkerSpecification; import org.ourgrid.common.util.StringUtil; import org.ourgrid.peer.business.dao.PeerDAOFactory; import org.ourgrid.peer.request.WorkerLoginRequestTO; import org.ourgrid.peer.response.WorkerLoginSucceededResponseTO; import br.edu.ufcg.lsd.commune.network.certification.CertificationUtils; import br.edu.ufcg.lsd.commune.network.signature.Util; public class WorkerLoginRequester extends AbstractRegisterWorkerRequester<WorkerLoginRequestTO> { public List<IResponseTO> execute(WorkerLoginRequestTO request) { List<IResponseTO> responses = new ArrayList<IResponseTO>(); if (!request.isVoluntary() && !verifyWorkerCertificate(request, responses)) { return responses; } if (PeerDAOFactory.getInstance().getLocalWorkersDAO().isWorkerUp( StringUtil.addressToUserAtServer(request.getWorkerAddress()))) { responses.add(new LoggerResponseTO("The worker [" + request.getWorkerAddress() + "] was identified " + "but it is already logged. Maybe it is recovering? Login with success.", LoggerResponseTO.WARN)); } WorkerSpecification workerSpecification = request.getWorkerSpecification(); registerNewWorker(responses, workerSpecification, request.getWorkerPublicKey(), request.getMyUserAtServer()); WorkerLoginResult workerLoginResult = new WorkerLoginResult(WorkerLoginResult.OK); WorkerLoginSucceededResponseTO workerLoginSucceededTO = new WorkerLoginSucceededResponseTO(); workerLoginSucceededTO.setLoginResult(workerLoginResult); workerLoginSucceededTO.setWorkerManagementAddress(request.getWorkerAddress()); responses.add(workerLoginSucceededTO); responses.add(new LoggerResponseTO("The worker [" + request.getWorkerAddress() + "] was identified. " + "Login with success.", LoggerResponseTO.INFO)); return responses; } @SuppressWarnings("restriction") private boolean verifyWorkerCertificate(WorkerLoginRequestTO request, List<IResponseTO> responses) { WorkerLoginResult workerLoginResult = new WorkerLoginResult(WorkerLoginResult.OK); if (!CertificationUtils.isCertificateValid(request.getWorkerCertPath())) { workerLoginResult.setResultMessage(WorkerLoginResult.INVALID_CERT_PATH); WorkerLoginSucceededResponseTO workerLoginSucceededTO = new WorkerLoginSucceededResponseTO(); workerLoginSucceededTO.setLoginResult(workerLoginResult); workerLoginSucceededTO.setWorkerManagementAddress(request.getWorkerAddress()); responses.add(workerLoginSucceededTO); responses.add(new LoggerResponseTO("The worker certificate path " + "is not valid.", LoggerResponseTO.WARN)); ReleaseResponseTO releaseTO = new ReleaseResponseTO(); releaseTO.setStubAddress(request.getWorkerAddress()); responses.add(releaseTO); return false; } if (!verify(request.getMyPublicKey(), request.getWorkerCertPath().getCertificates().get(0))) { workerLoginResult.setResultMessage(WorkerLoginResult.UNISSUED_CERT_PATH); WorkerLoginSucceededResponseTO workerLoginResultTO = new WorkerLoginSucceededResponseTO(); workerLoginResultTO.setLoginResult(workerLoginResult); responses.add(workerLoginResultTO); responses.add(new LoggerResponseTO("The worker certificate path " + "is not issued by CA.", LoggerResponseTO.WARN)); ReleaseResponseTO releaseTO = new ReleaseResponseTO(); releaseTO.setStubAddress(request.getWorkerAddress()); responses.add(releaseTO); return false; } return true; } private static boolean verify(String peerPublicKey, X509Certificate workerCertificate) { try { workerCertificate.verify( Util.decodePublicKey(peerPublicKey)); return true; } catch (Exception e) { return false; } } }