Package org.jboss.seam.security.external.saml.sp

Source Code of org.jboss.seam.security.external.saml.sp.SamlSpSingleLogoutService

package org.jboss.seam.security.external.saml.sp;

import java.util.List;

import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jboss.seam.security.external.InvalidRequestException;
import org.jboss.seam.security.external.ResponseHandler;
import org.jboss.seam.security.external.SamlNameIdImpl;
import org.jboss.seam.security.external.dialogues.DialogueBean;
import org.jboss.seam.security.external.jaxb.samlv2.assertion.NameIDType;
import org.jboss.seam.security.external.jaxb.samlv2.protocol.LogoutRequestType;
import org.jboss.seam.security.external.jaxb.samlv2.protocol.RequestAbstractType;
import org.jboss.seam.security.external.jaxb.samlv2.protocol.StatusResponseType;
import org.jboss.seam.security.external.jaxb.samlv2.protocol.StatusType;
import org.jboss.seam.security.external.saml.SamlConstants;
import org.jboss.seam.security.external.saml.SamlDialogue;
import org.jboss.seam.security.external.saml.SamlMessageFactory;
import org.jboss.seam.security.external.saml.SamlMessageSender;
import org.jboss.seam.security.external.saml.SamlProfile;
import org.jboss.seam.security.external.saml.api.SamlNameId;
import org.jboss.seam.security.external.spi.SamlServiceProviderSpi;

/**
* @author Marcel Kolsteren
*
*/
public class SamlSpSingleLogoutService
{
   @Inject
   private SamlMessageFactory samlMessageFactory;

   @Inject
   private SamlMessageSender samlMessageSender;

   @Inject
   private SamlSpSessions samlSpSessions;

   @Inject
   private Instance<SamlServiceProviderSpi> samlServiceProviderSpi;

   @Inject
   private SamlSpLogoutDialogue samlSpLogoutDialogue;

   @Inject
   private DialogueBean dialogue;

   @Inject
   private SamlDialogue samlDialogue;

   @Inject
   private ResponseHandler responseHandler;

   public void processIDPRequest(HttpServletRequest httpRequest, HttpServletResponse httpResponse, RequestAbstractType request) throws InvalidRequestException
   {
      if (!(request instanceof LogoutRequestType))
      {
         throw new InvalidRequestException("Request should be a single logout request.");
      }

      LogoutRequestType logoutRequest = (LogoutRequestType) request;
      SamlExternalIdentityProvider idp = (SamlExternalIdentityProvider) samlDialogue.getExternalProvider();

      NameIDType nameIdJaxb = logoutRequest.getNameID();
      SamlNameId samlNameId = new SamlNameIdImpl(nameIdJaxb.getValue(), nameIdJaxb.getFormat(), nameIdJaxb.getNameQualifier());
      removeSessions(samlNameId, idp.getEntityId(), logoutRequest.getSessionIndex());

      StatusResponseType statusResponse = samlMessageFactory.createStatusResponse(SamlConstants.STATUS_SUCCESS, null);

      samlMessageSender.sendResponse(idp, statusResponse, SamlProfile.SINGLE_LOGOUT, httpResponse);

      dialogue.setFinished(true);
   }

   private void removeSessions(SamlNameId nameId, String idpEntityId, List<String> sessionIndexes)
   {
      for (SamlSpSessionImpl session : samlSpSessions.getSessions())
      {
         if (session.getPrincipal().getNameId().equals(nameId) && session.getIdentityProvider().getEntityId().equals(idpEntityId))
         {
            if (sessionIndexes.size() == 0 || sessionIndexes.contains(session.getSessionIndex()))
            {
               samlSpSessions.removeSession((SamlSpSessionImpl) session);
               samlServiceProviderSpi.get().loggedOut(session);
            }
         }
      }
   }

   public void processIDPResponse(HttpServletRequest httpRequest, HttpServletResponse httpResponse, StatusResponseType statusResponse)
   {
      StatusType status = statusResponse.getStatus();
      if (status.getStatusCode().getValue().equals(SamlConstants.STATUS_SUCCESS))
      {
         samlServiceProviderSpi.get().globalLogoutSucceeded(responseHandler.createResponseHolder(httpResponse));
      }
      else
      {
         String statusCodeLevel1 = status.getStatusCode().getValue();
         String statusCodeLevel2 = null;
         if (status.getStatusCode().getStatusCode() != null)
         {
            statusCodeLevel2 = status.getStatusCode().getStatusCode().getValue();
         }
         samlServiceProviderSpi.get().globalLogoutFailed(statusCodeLevel1, statusCodeLevel2, responseHandler.createResponseHolder(httpResponse));
      }
      dialogue.setFinished(true);
   }

   public void sendSingleLogoutRequestToIDP(SamlSpSessionImpl session, HttpServletResponse httpResponse)
   {
      SamlExternalIdentityProvider idp = session.getIdentityProvider();
      LogoutRequestType logoutRequest;
      logoutRequest = samlMessageFactory.createLogoutRequest(session.getPrincipal().getNameId(), session.getSessionIndex());

      samlDialogue.setExternalProvider(idp);
      samlSpLogoutDialogue.setSession(session);

      samlMessageSender.sendRequest(idp, SamlProfile.SINGLE_LOGOUT, logoutRequest, httpResponse);
   }
}
TOP

Related Classes of org.jboss.seam.security.external.saml.sp.SamlSpSingleLogoutService

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.