a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Copyright (c) 2006 Sun Microsystems Inc. All Rights Reserved
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * The contents of this file are subject to the terms
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * of the Common Development and Distribution License
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * (the License). You may not use this file except in
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * compliance with the License.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * You can obtain a copy of the License at
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * https://opensso.dev.java.net/public/CDDLv1.0.html or
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * opensso/legal/CDDLv1.0.txt
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * See the License for the specific language governing
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * permission and limitations under the License.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * When distributing Covered Code, include this CDDL
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Header Notice in each file and include the License file
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * at opensso/legal/CDDLv1.0.txt.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * If applicable, add the following below the CDDL Header,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * with the fields enclosed by brackets [] replaced by
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * your own identifying information:
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * "Portions Copyrighted [year] [name of copyright owner]"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * $Id: AuthnSvcRequestHandlerImpl.java,v 1.2 2008/06/25 05:47:06 qcheng Exp $
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpackage com.sun.identity.liberty.ws.authnsvc;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.List;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.StringTokenizer;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.logging.Level;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.w3c.dom.Element;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.authnsvc.mechanism.MechanismHandler;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.authnsvc.protocol.SASLRequest;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.authnsvc.protocol.SASLResponse;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.common.LogUtil;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.soapbinding.Message;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.soapbinding.RequestHandler;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * The class <code>AuthnSvcRequestHandlerImpl</code> is used to process
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * SASL requests.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpublic final class AuthnSvcRequestHandlerImpl implements RequestHandler {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Default constructor
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public AuthnSvcRequestHandlerImpl() {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (AuthnSvcUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AuthnSvcUtils.debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "AuthnSvcRequestHanderImpl constructor.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Extracts SASL request out of a SOAP Message and processes it.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param request a SOAP Message containing a SASL request
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return a SOAP Message containing a SASL response
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @exception AuthnSvcException if an error occurs while processing the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * SOAP Message
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public Message processRequest(Message request) throws AuthnSvcException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List list = request.getBodies(AuthnSvcConstants.NS_AUTHN_SVC,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AuthnSvcConstants.TAG_SASL_REQUEST);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (list.isEmpty()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new AuthnSvcException("missingSASLRequet");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else if (list.size() > 1) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new AuthnSvcException("tooManySASLRequet");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SASLRequest saslReq = new SASLRequest((Element)list.get(0));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster saslReq.setMessageID(request.getCorrelationHeader().getMessageID());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster saslReq.setRefToMessageID(request.getCorrelationHeader()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .getRefToMessageID());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Message message = new Message();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String respMessageID = message.getCorrelationHeader().getMessageID();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SASLResponse saslResp = processSASLRequest(saslReq, request,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster respMessageID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster message.setSOAPBody(saslResp.toElement());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return message;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Processes a SASL request and returns a SASL response.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param saslReq a SASL request
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param message a SOAP Message containing a SASL response
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param respMessageID messageID of SOAP Message response that will
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * contain returned SASL response
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return a SASL response
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @exception AuthnSvcException if an error occurs while processing the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * SASL request
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static SASLResponse processSASLRequest(SASLRequest saslReq,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Message message,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String respMessageID)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws AuthnSvcException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String mechanism = saslReq.getMechanism().trim();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (AuthnSvcUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String msg = AuthnSvcUtils.getString("messageID") + "=" +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster message.getCorrelationHeader().getMessageID() + ", " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AuthnSvcUtils.getString("mechanism") + "=" + mechanism +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ", " + AuthnSvcUtils.getString("authzID") + "=" +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster saslReq.getAuthzID() + ", " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AuthnSvcUtils.getString("advisoryAuthnID") + "=" +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster saslReq.getAdvisoryAuthnID();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AuthnSvcUtils.debug.message(msg);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String[] data = { message.getCorrelationHeader().getMessageID(),
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster mechanism,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster saslReq.getAuthzID(),
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster saslReq.getAdvisoryAuthnID() };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (mechanism.length() == 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (AuthnSvcUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AuthnSvcUtils.debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "AuthnSvcRequestHanderImpl.processSASLRequest: " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "mechanism is empty");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (LogUtil.isLogEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.access(Level.INFO,LogUtil.AS_ABORT,data);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return new SASLResponse(SASLResponse.ABORT);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster MechanismHandler mechanismHandler = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster StringTokenizer stz = new StringTokenizer(mechanism);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster while(stz.hasMoreTokens()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String mech = stz.nextToken();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster mechanismHandler = AuthnSvcService.getMechanismHandler(mech);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (mechanismHandler != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster break;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (mechanismHandler == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (AuthnSvcUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AuthnSvcUtils.debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "AuthnSvcRequestHanderImpl.processSASLRequest: " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Unable to find mechanismHandler");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (LogUtil.isLogEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.access(Level.INFO,LogUtil.AS_ABORT,data);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return new SASLResponse(SASLResponse.ABORT);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (AuthnSvcUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster AuthnSvcUtils.debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "AuthnSvcRequestHanderImpl.processSASLRequest: " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "mechanismHandler = " + mechanismHandler.getClass());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SASLResponse saslResp = mechanismHandler.processSASLRequest(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster saslReq, message, respMessageID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (LogUtil.isLogEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String statusCode = saslResp.getStatusCode();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (statusCode.equals(SASLResponse.OK)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.access(Level.INFO,LogUtil.AS_OK,data);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else if (statusCode.equals(SASLResponse.CONTINUE)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.access(Level.INFO, LogUtil.AS_CONTINUE,data);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.access(Level.INFO, LogUtil.AS_ABORT,data);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return saslResp;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}