/* ==========================================
* Laverca Project
* https://sourceforge.net/projects/laverca/
* ==========================================
* Copyright 2015 Laverca Project
*
* 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 fi.laverca.ficom;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import fi.laverca.StatusCodes;
import fi.laverca.jaxb.mss.MSSSignatureReq;
import fi.laverca.jaxb.mss.MSSSignatureResp;
import fi.laverca.jaxb.mss.MSSStatusResp;
import fi.laverca.jaxb.mss.StatusDetailType;
import fi.laverca.jaxb.mss.StatusType;
import fi.laverca.jaxb.mssfi.ServiceResponses.ServiceResponse;
import fi.laverca.jaxb.saml2a.Assertion;
import fi.laverca.jaxb.saml2a.Attribute;
import fi.laverca.jaxb.saml2a.AttributeStatement;
import fi.laverca.jaxb.saml2p.Response;
import fi.laverca.mss.MssResponse;
import fi.laverca.util.Saml2Util;
/**
* Asynchronous MSS_StatusResp callback response.
*/
public class FiComResponse extends MssResponse {
private static final Log log = LogFactory.getLog(FiComResponse.class);
public FiComResponse( final MSSSignatureReq originalSigReq,
final MSSSignatureResp originalSigResp,
final MSSStatusResp finalStatusResp) {
super(originalSigReq, originalSigResp, finalStatusResp);
}
/**
* Get available PersonID attributes from this response
*
* @return A list of attributes as per the PersonIdentity additional service.
*
null if the MSS_Status response does not include a PersonID response.
*/
public List getPersonIdAttributes() {
try {
final StatusDetailType sd = this.finalStatusResp.getStatus().getStatusDetail();
final ServiceResponse sResp = FiComAdditionalServices.readServiceResponse(sd, FiComAdditionalServices.PERSON_ID_URI);
final Response samlpResp = sResp.getResponse();
final Assertion assertion = Saml2Util.parseFromResponse(samlpResp);
final AttributeStatement stmt = Saml2Util.parseFromAssertion(assertion);
final List attrs = Saml2Util.parseFromAttributeStatement(stmt);
final List fiComAttrs = new ArrayList();
for (final Attribute samlAttribute : attrs) {
fiComAttrs.add(new PersonIdAttribute(samlAttribute));
}
return fiComAttrs;
} catch (NullPointerException e){
log.error("Failed to fetch PersonID attributes");
return null;
} catch(Throwable t) {
log.error("Failed to fetch PersonID attributes: " + t.getMessage());
return null;
}
}
/**
*
* @return AE validation status, null if no AE validation was done or if an error occurred
*/
public StatusType getAeValidationStatus() {
try {
StatusType validationStatus = null;
for (final Object o1 : this.finalStatusResp.getStatus().getStatusDetail().getAniesAndServiceResponsesAndReceiptRequestExtensions()) {
if (!(o1 instanceof StatusType)) {
// Not interesting
continue;
}
final StatusType s1 = (StatusType)o1;
if (s1.getStatusDetail() == null) {
// null -> not interesting
continue;
}
for (final Object o2 : s1.getStatusDetail().getAniesAndServiceResponsesAndReceiptRequestExtensions()) {
if (!(o2 instanceof ServiceResponse)) {
continue;
}
final ServiceResponse s2 = (ServiceResponse)o2;
if (FiComAdditionalServices.VALIDATE_URI.equals(s2.getDescription().getMssURI())) {
validationStatus = s2.getStatus();
break;
}
}
}
return validationStatus;
} catch (NullPointerException e){
log.error("Failed to fetch PersonID attributes");
return null;
} catch (Throwable t) {
log.error("Failed to fetch PersonID attributes: " + t.getMessage());
return null;
}
}
/**
* Check if this response has a valid signature
*
* @return true if HMSSP and AE validations return VALID_SIGNATURE
*/
public boolean isValid() {
try {
long statusCode = this.finalStatusResp.getStatus().getStatusCode().getValue();
boolean aeStatusOk;
try {
aeStatusOk = (this.getAeValidationStatus().getStatusCode().getValue() == StatusCodes.VALID_SIGNATURE.getValue());
} catch (NullPointerException e) {
aeStatusOk = (this.getAeValidationStatus() == null);
}
return statusCode == StatusCodes.VALID_SIGNATURE.getValue() && aeStatusOk;
} catch (Throwable t) {
log.error("Failed to check response validity: " + t.getMessage());
return false;
}
}
}