/** * Copyright (c) Istituto Nazionale di Fisica Nucleare (INFN). 2006-2016 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.glite.security.voms.admin.integration.orgdb; import java.util.List; import java.util.Vector; import org.glite.security.voms.admin.core.validation.RequestValidationContext; import org.glite.security.voms.admin.core.validation.RequestValidationResult; import org.glite.security.voms.admin.core.validation.strategies.RequestValidationStrategy; import org.glite.security.voms.admin.integration.orgdb.dao.OrgDBDAOFactory; import org.glite.security.voms.admin.integration.orgdb.dao.OrgDBVOMSPersonDAO; import org.glite.security.voms.admin.integration.orgdb.database.OrgDBError; import org.glite.security.voms.admin.integration.orgdb.model.VOMSOrgDBPerson; import org.glite.security.voms.admin.persistence.model.request.NewVOMembershipRequest; public class OrgDBRequestValidator implements RequestValidationStrategy<NewVOMembershipRequest>, RequestValidationContext { String experimentName; public OrgDBRequestValidator(String experimentName) { this.experimentName = experimentName; } protected void propertyEqualsIgnoreCase(String value1, String value2, String propertyName, List<String> errors) { if (!value1.equalsIgnoreCase(value2)) { String errorMessage = String .format( "Property '" + propertyName + "' does not match (ignoring case) the OrgDB VOMS person record. You entered '%s', while '%s' was expected.", value1, value2); errors.add(errorMessage); } } protected List<String> checkRequestAgainstParticipation( NewVOMembershipRequest r, VOMSOrgDBPerson p) { List<String> errors = new Vector<String>(); propertyEqualsIgnoreCase(r.getRequesterInfo().getName(), p.getFirstName(), "name", errors); propertyEqualsIgnoreCase(r.getRequesterInfo().getSurname(), p.getName(), "surname", errors); return errors; } public RequestValidationResult validateRequest(NewVOMembershipRequest r) { try { String email = r.getRequesterInfo().getEmailAddress(); OrgDBVOMSPersonDAO dao = OrgDBDAOFactory.instance().getVOMSPersonDAO(); VOMSOrgDBPerson p = dao .findPersonWithValidExperimentParticipationByEmail(email, experimentName); if (p != null) { List<String> errors = checkRequestAgainstParticipation(r, p); if (!errors.isEmpty()) { RequestValidationResult result = RequestValidationResult .failure("OrgDb validation failed. The OrgDb VOMS person record linked to email address '" + email + "' did not match the data you entered."); result.setErrorMessages(errors); return result; } else { return RequestValidationResult.success(); } } else { RequestValidationResult result = RequestValidationResult .failure("No OrgDB participation found matching email '" + email + "' for experiment '" + experimentName + "'."); return result; } } catch (OrgDBError e) { return RequestValidationResult.error(e.getMessage(), e); } } public String getExperimentName() { return experimentName; } public void setExperimentName(String experimentName) { this.experimentName = experimentName; } public RequestValidationStrategy<NewVOMembershipRequest> getVOMembershipRequestValidationStrategy() { return this; } }