/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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.apache.cxf.sts.operation;
import java.security.Principal;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;
import org.apache.cxf.common.logging.LogUtils;
import org.apache.cxf.sts.QNameConstants;
import org.apache.cxf.sts.STSConstants;
import org.apache.cxf.ws.security.sts.provider.STSException;
import org.apache.cxf.ws.security.sts.provider.model.RequestSecurityTokenCollectionType;
import org.apache.cxf.ws.security.sts.provider.model.RequestSecurityTokenResponseCollectionType;
import org.apache.cxf.ws.security.sts.provider.model.RequestSecurityTokenResponseType;
import org.apache.cxf.ws.security.sts.provider.model.RequestSecurityTokenType;
import org.apache.cxf.ws.security.sts.provider.operation.CancelOperation;
import org.apache.cxf.ws.security.sts.provider.operation.IssueSingleOperation;
import org.apache.cxf.ws.security.sts.provider.operation.RenewOperation;
import org.apache.cxf.ws.security.sts.provider.operation.RequestCollectionOperation;
import org.apache.cxf.ws.security.sts.provider.operation.ValidateOperation;
/**
* An implementation of the RequestCollectionOperation interface. It is composed of the different
* Operation implementations
*/
public class TokenRequestCollectionOperation extends AbstractOperation
implements RequestCollectionOperation {
public static final String WSTRUST_REQUESTTYPE_BATCH_ISSUE = STSConstants.WST_NS_05_12
+ "/BatchIssue";
public static final String WSTRUST_REQUESTTYPE_BATCH_CANCEL = STSConstants.WST_NS_05_12
+ "/BatchCancel";
public static final String WSTRUST_REQUESTTYPE_BATCH_RENEW = STSConstants.WST_NS_05_12
+ "/BatchRenew";
public static final String WSTRUST_REQUESTTYPE_BATCH_VALIDATE = STSConstants.WST_NS_05_12
+ "/BatchValidate";
static final Logger LOG = LogUtils.getL7dLogger(TokenRequestCollectionOperation.class);
private IssueSingleOperation issueSingleOperation;
private ValidateOperation validateOperation;
private RenewOperation renewOperation;
private CancelOperation cancelOperation;
public RequestSecurityTokenResponseCollectionType requestCollection(
RequestSecurityTokenCollectionType requestCollection,
Principal principal,
Map<String, Object> messageContext) {
RequestSecurityTokenResponseCollectionType responseCollection =
QNameConstants.WS_TRUST_FACTORY.createRequestSecurityTokenResponseCollectionType();
String requestType = null;
for (RequestSecurityTokenType request : requestCollection.getRequestSecurityToken()) {
List<?> objectList = request.getAny();
for (Object o : objectList) {
if (o instanceof JAXBElement) {
QName qname = ((JAXBElement<?>) o).getName();
if (qname.equals(new QName(STSConstants.WST_NS_05_12, "RequestType"))) {
String val = ((JAXBElement<?>) o).getValue().toString();
// All batch requests must have the same RequestType
if (val == null || (requestType != null && !requestType.equals(val))) {
LOG.log(
Level.WARNING,
"All RequestSecurityTokenCollection elements do not share the same"
+ "RequestType"
);
throw new STSException(
"Error in requesting a token", STSException.REQUEST_FAILED
);
} else {
requestType = val;
}
}
}
}
RequestSecurityTokenResponseType response =
handleRequest(request, principal, messageContext, requestType);
responseCollection.getRequestSecurityTokenResponse().add(response);
}
return responseCollection;
}
public RequestSecurityTokenResponseType handleRequest(
RequestSecurityTokenType request,
Principal principal,
Map<String, Object> messageContext,
String requestType
) {
if (WSTRUST_REQUESTTYPE_BATCH_ISSUE.equals(requestType)) {
if (issueSingleOperation == null) {
LOG.log(Level.WARNING, "IssueSingleOperation is null");
throw new STSException(
"Error in requesting a token", STSException.REQUEST_FAILED
);
}
return issueSingleOperation.issueSingle(request, principal, messageContext);
} else if (WSTRUST_REQUESTTYPE_BATCH_VALIDATE.equals(requestType)) {
if (validateOperation == null) {
LOG.log(Level.WARNING, "ValidateOperation is null");
throw new STSException(
"Error in requesting a token", STSException.REQUEST_FAILED
);
}
return validateOperation.validate(request, principal, messageContext);
} else if (WSTRUST_REQUESTTYPE_BATCH_CANCEL.equals(requestType)) {
if (cancelOperation == null) {
LOG.log(Level.WARNING, "CancelOperation is null");
throw new STSException(
"Error in requesting a token", STSException.REQUEST_FAILED
);
}
return cancelOperation.cancel(request, principal, messageContext);
} else if (WSTRUST_REQUESTTYPE_BATCH_RENEW.equals(requestType)) {
if (renewOperation == null) {
LOG.log(Level.WARNING, "RenewOperation is null");
throw new STSException(
"Error in requesting a token", STSException.REQUEST_FAILED
);
}
return renewOperation.renew(request, principal, messageContext);
} else {
LOG.log(Level.WARNING, "Unknown operation requested");
throw new STSException(
"Error in requesting a token", STSException.REQUEST_FAILED
);
}
}
public IssueSingleOperation getIssueSingleOperation() {
return issueSingleOperation;
}
public void setIssueSingleOperation(IssueSingleOperation issueSingleOperation) {
this.issueSingleOperation = issueSingleOperation;
}
public ValidateOperation getValidateOperation() {
return validateOperation;
}
public void setValidateOperation(ValidateOperation validateOperation) {
this.validateOperation = validateOperation;
}
public RenewOperation getRenewOperation() {
return renewOperation;
}
public void setRenewOperation(RenewOperation renewOperation) {
this.renewOperation = renewOperation;
}
public CancelOperation getCancelOperation() {
return cancelOperation;
}
public void setCancelOperation(CancelOperation cancelOperation) {
this.cancelOperation = cancelOperation;
}
}