/* * Copyright (c) 2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * WSO2 Inc. licenses this file to you 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.wso2.carbon.identity.sso.saml.builders; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.joda.time.DateTime; import org.opensaml.common.SAMLVersion; import org.opensaml.saml2.core.Response; import org.opensaml.saml2.core.Status; import org.opensaml.saml2.core.StatusCode; import org.opensaml.saml2.core.StatusMessage; import org.opensaml.saml2.core.impl.ResponseBuilder; import org.opensaml.saml2.core.impl.StatusBuilder; import org.opensaml.saml2.core.impl.StatusCodeBuilder; import org.opensaml.saml2.core.impl.StatusMessageBuilder; import org.wso2.carbon.identity.base.IdentityException; import org.wso2.carbon.identity.sso.saml.util.SAMLSSOUtil; import java.util.List; public class ErrorResponseBuilder { private static Log log = LogFactory.getLog(ErrorResponseBuilder.class); private Response response; //Do the bootstrap first static { SAMLSSOUtil.doBootstrap(); } public ErrorResponseBuilder() { ResponseBuilder responseBuilder = new ResponseBuilder(); this.response = responseBuilder.buildObject(); } /** * Build the error response * * @param inResponseToID * @param statusCodes * @param statusMsg * @return */ public Response buildResponse(String inResponseToID, List<String> statusCodes, String statusMsg, String destination) throws IdentityException { if (statusCodes == null || statusCodes.isEmpty()) { throw IdentityException.error("No Status Values"); } response.setIssuer(SAMLSSOUtil.getIssuer()); Status status = new StatusBuilder().buildObject(); StatusCode statusCode = null; for (String statCode : statusCodes) { statusCode = buildStatusCode(statCode, statusCode); } status.setStatusCode(statusCode); buildStatusMsg(status, statusMsg); response.setStatus(status); response.setVersion(SAMLVersion.VERSION_20); response.setID(SAMLSSOUtil.createID()); if (inResponseToID != null) { response.setInResponseTo(inResponseToID); } if (destination != null) { response.setDestination(destination); } response.setIssueInstant(new DateTime()); return response; } /** * Build the StatusCode for Status of Response * * @param parentStatusCode * @param childStatusCode * @return */ private StatusCode buildStatusCode(String parentStatusCode, StatusCode childStatusCode) throws IdentityException { if (parentStatusCode == null) { throw IdentityException.error("Invalid SAML Response Status Code"); } StatusCode statusCode = new StatusCodeBuilder().buildObject(); statusCode.setValue(parentStatusCode); //Set the status Message if (childStatusCode != null) { statusCode.setStatusCode(childStatusCode); return statusCode; } else { return statusCode; } } /** * Set the StatusMessage for Status of Response * * @param statusMsg * @return */ private Status buildStatusMsg(Status status, String statusMsg) { if (statusMsg != null) { StatusMessage statusMesssage = new StatusMessageBuilder().buildObject(); statusMesssage.setMessage(statusMsg); status.setStatusMessage(statusMesssage); } return status; } }