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: DiscoveryService.java,v 1.5 2008/12/05 00:18:30 exu Exp $
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpackage com.sun.identity.liberty.ws.disco;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.List;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Iterator;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Map;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.HashMap;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Set;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Collection;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.logging.Level;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.xml.bind.JAXBException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.w3c.dom.*;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.shared.xml.XMLUtils;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.common.LogUtil;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.common.Status;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.common.wsse.BinarySecurityToken;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.security.*;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.soapbinding.*;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.interfaces.*;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.disco.plugins.*;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.disco.common.*;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.disco.jaxb.*;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Handles Liberty discovery service protocol.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpublic final class DiscoveryService implements RequestHandler {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Default constructor.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public DiscoveryService() {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.message("In DiscoveryService constructor.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Processes request.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param request in coming request <code>Message</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return response <code>Message</code>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @exception Exception if an error occurred during the process.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public Message processRequest(Message request) throws Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List bodies = request.getBodies();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster bodies = Utils.convertElementToJAXB(bodies);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!(bodies.size() == 1)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // log it
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.error("DiscoService.processRequest: SOAP message"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " didn't contain one SOAP body.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new Exception(DiscoUtils.bundle.getString("oneBody"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String authnMech = request.getAuthenticationMechanism();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (DiscoUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.message("DiscoService.processRequest: "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "authentication mechanism =" + authnMech);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Set authnMechs =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoServiceManager.getSupportedAuthenticationMechanisms();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((authnMechs == null) || (!authnMechs.contains(authnMech))) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.error("DiscoService.processRequest: Authentication"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "Mechanism used is not supported by this service:"+authnMech);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new Exception(DiscoUtils.bundle.getString(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "authnMechNotSupported"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Message message = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ProviderHeader provH = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster provH = new ProviderHeader(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoServiceManager.getDiscoProviderID());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SOAPBindingException sbe) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new DiscoveryException(sbe.getMessage());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (DiscoServiceManager.useResponseAuthentication() ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (authnMech.equals(Message.NULL_X509)) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (authnMech.equals(Message.NULL_SAML)) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (authnMech.equals(Message.NULL_BEARER)) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (authnMech.equals(Message.TLS_X509)) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (authnMech.equals(Message.TLS_SAML)) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (authnMech.equals(Message.TLS_BEARER)) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (authnMech.equals(Message.CLIENT_TLS_X509)) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (authnMech.equals(Message.CLIENT_TLS_SAML)) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (authnMech.equals(Message.CLIENT_TLS_BEARER)) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (authnMech.equals(Message.NULL_X509_WSF11)) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (authnMech.equals(Message.NULL_SAML_WSF11)) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (authnMech.equals(Message.NULL_BEARER_WSF11)) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (authnMech.equals(Message.TLS_X509_WSF11)) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (authnMech.equals(Message.TLS_SAML_WSF11)) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (authnMech.equals(Message.TLS_BEARER_WSF11)) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (authnMech.equals(Message.CLIENT_TLS_X509_WSF11)) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (authnMech.equals(Message.CLIENT_TLS_SAML_WSF11)) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (authnMech.equals(Message.CLIENT_TLS_BEARER_WSF11)))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SecurityTokenManager stm =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster new SecurityTokenManager(request.getToken());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster BinarySecurityToken binaryToken = stm.getX509CertificateToken();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster binaryToken.setWSFVersion(request.getWSFVersion());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster message = new Message(provH, binaryToken);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster message.setWSFVersion(request.getWSFVersion());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.error("DiscoveryService.processRequest:"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "couldn't generate Message with X509 token: ", e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new DiscoveryException(e.getMessage());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster message = new Message(provH);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.error("DiscoveryService.processRequest:"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "couldn't generate Message: ", e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new DiscoveryException(e.getMessage());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Object body = bodies.iterator().next();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (body instanceof QueryType) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster message.setSOAPBody(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster lookup((QueryType) body, request));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else if (body instanceof ModifyType) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster message.setSOAPBody(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.convertJAXBToElement(update((ModifyType) body,request)));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.error("DiscoService.processRequest: SOAPBody "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "is not a Disco message.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new Exception(DiscoUtils.bundle.getString("bodyNotDisco"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // TODO:
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster //create other header if needed
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster //message.setOtherHeader()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return message;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Finds the resource offerings requested in the query.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param query The incoming Discovery Query request.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param message soapbinding message that contains info regarding sending
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * identities that can be used in access control
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return org.w3c.dom.Element which is the QueryResponse of this operation.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Inside this QueryResponse, Credentials may be included, and
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * ResourceID may be encrypted if required.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private org.w3c.dom.Element lookup(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster com.sun.identity.liberty.ws.disco.jaxb.QueryType query,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster com.sun.identity.liberty.ws.soapbinding.Message message)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws JAXBException
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.message("in lookup.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Status status = new Status(DiscoConstants.DISCO_NS,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoConstants.DISCO_NSPREFIX);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster QueryResponse resp = new QueryResponse(status);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String providerID = DiscoServiceManager.getDiscoProviderID();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String resourceID = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ResourceIDType resID = query.getResourceID();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (resID == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster resourceID = getResourceID(query.getEncryptedResourceID(),
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster providerID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster resourceID = resID.getValue();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoEntryHandler entryHandler = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String userDN = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean isB2E = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(resourceID == null ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster resourceID.equals(DiscoConstants.IMPLIED_RESOURCE)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // B2E case
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.message("DiscoveryService.lookup: in B2E case");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isB2E = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(!isB2E) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // find the disco ResourceIDMapper from config
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ResourceIDMapper idMapper = DiscoServiceManager.getResourceIDMapper(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster providerID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (idMapper == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster idMapper = DiscoServiceManager.getDefaultResourceIDMapper();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster userDN = idMapper.getUserID(providerID, resourceID, message);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (userDN == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.error("DiscoService.lookup: couldn't find the "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "user associated with the resourceID:" + resourceID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster status.setCode(DiscoConstants.QNAME_FAILED);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Document doc = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster doc = XMLUtils.newDocument();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception ex) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.error("DiscoService.lookup:", ex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.getDiscoMarshaller().marshal(resp, doc);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return doc.getDocumentElement();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (DiscoUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.message("DiscoService.lookup: userDN="
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + userDN);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster entryHandler = DiscoServiceManager.getDiscoEntryHandler();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster entryHandler = DiscoServiceManager.getGlobalEntryHandler();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (entryHandler == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster status.setCode(DiscoConstants.QNAME_FAILED);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.message(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "DiscoService.lookup: null DiscoEntryHandler.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return XMLUtils.toDOMDocument(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster resp.toString(), null).getDocumentElement();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Map discoEntriesMap = entryHandler.getDiscoEntries(userDN,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster query.getRequestedServiceType());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Collection results = discoEntriesMap.values();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Map returnMap = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (results.size() == 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (DiscoUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.message("DiscoService.lookup: lookup "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "NoResults for user:" + userDN);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster status.setCode(DiscoConstants.QNAME_FAILED);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String[] data = { userDN };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,LogUtil.DS_LOOKUP_FAILURE,data);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (DiscoUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.message("DiscoService.lookup: find " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster results.size() + "ResourceOfferings for userDN:" + userDN);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Authorizer authorizer = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (DiscoServiceManager.needPolicyEvalLookup()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.message("DiscoService.lookup:needPolicyEval.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster authorizer = DiscoServiceManager.getAuthorizer();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (authorizer == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster status.setCode(DiscoConstants.QNAME_FAILED);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String[] data = { userDN };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,LogUtil.DS_LOOKUP_FAILURE,data);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return XMLUtils.toDOMDocument(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster resp.toString(), null).getDocumentElement();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster returnMap = DiscoUtils.checkPolicyAndHandleDirectives(userDN,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster message, results, authorizer,null,null, message.getToken());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List offerings = (List) returnMap.get(DiscoUtils.OFFERINGS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (offerings.isEmpty()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (DiscoUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.message("DiscoService.lookup: after policy"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " check and directive handling, NoResults for:"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + userDN);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster status.setCode(DiscoConstants.QNAME_FAILED);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String[] data = { userDN };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,LogUtil.DS_LOOKUP_FAILURE,data);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster resp.setResourceOffering(offerings);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.message("after resp.getresoff.addall");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List credentials = (List) returnMap.get(DiscoUtils.CREDENTIALS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((credentials != null) && (!credentials.isEmpty())) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.message("DiscoService.lookup: has cred.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster resp.setCredentials(credentials);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster status.setCode(DiscoConstants.QNAME_OK);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String[] data = { userDN };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.access(Level.INFO,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.DS_LOOKUP_SUCCESS,data);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return XMLUtils.toDOMDocument(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster resp.toString(), null).getDocumentElement();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Updates resource offerings.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param modify The incoming Discovery Update request.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param message soapbinding message that contains info regarding sending
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * identities that can be used in access control
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return ModifyResponseType which includes Status of the operation.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private com.sun.identity.liberty.ws.disco.jaxb.ModifyResponseElement update(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster com.sun.identity.liberty.ws.disco.jaxb.ModifyType modify,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster com.sun.identity.liberty.ws.soapbinding.Message message)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws JAXBException
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.message("in update.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ModifyResponseElement resp = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster StatusType status = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster resp =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.getDiscoFactory().createModifyResponseElement();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster status = DiscoUtils.getDiscoFactory().createStatusType();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster resp.setStatus(status);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (JAXBException je) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.error("DiscoService.update: couldn't form "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "ModifyResponse.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw je;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String providerID = DiscoServiceManager.getDiscoProviderID();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String resourceID = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ResourceIDType resID = modify.getResourceID();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (resID == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster resourceID = getResourceID(modify.getEncryptedResourceID(),
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster providerID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster resourceID = resID.getValue();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoEntryHandler entryHandler = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String userDN = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster boolean isB2E = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String logMsg = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(resourceID == null ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster resourceID.equals(DiscoConstants.IMPLIED_RESOURCE)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // B2E case
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.message("DiscoveryService.lookup: in B2E case");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isB2E = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(!isB2E) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // find the disco ResourceIDMapper from config
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ResourceIDMapper idMapper = DiscoServiceManager.getResourceIDMapper(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster providerID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (idMapper == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster idMapper = DiscoServiceManager.getDefaultResourceIDMapper();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster userDN = idMapper.getUserID(providerID, resourceID, message);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster logMsg = DiscoUtils.bundle.getString("messageID") + "="
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + message.getCorrelationHeader().getMessageID() + "."
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + DiscoUtils.bundle.getString("providerID") + "="
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + providerID + "."
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + DiscoUtils.bundle.getString("securityMechID") + "="
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + message.getAuthenticationMechanism() + "."
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + DiscoUtils.bundle.getString("resourceOfferingID")
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "=" + resourceID + "."
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + DiscoUtils.bundle.getString("operation") + "="
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "Update";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (userDN == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.error("DiscoService.update: couldn't find user "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "from resourceID: " + resourceID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster status.setCode(DiscoConstants.QNAME_FAILED);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String[] data = { resourceID };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.DS_UPDATE_FAILURE,data);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return resp;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // find the DiscoEntryHandler from config
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster entryHandler = DiscoServiceManager.getDiscoEntryHandler();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster entryHandler = DiscoServiceManager.getGlobalEntryHandler();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // get flag if policy check for modify from config
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (DiscoServiceManager.needPolicyEvalUpdate()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.message("DiscoService.lookup: needPolicyEval.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!isUpdateAllowed(userDN, message, modify.getRemoveEntry(),
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster modify.getInsertEntry(), entryHandler,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoServiceManager.getAuthorizer()))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster status.setCode(DiscoConstants.QNAME_FAILED);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String[] data = { userDN };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.DS_UPDATE_FAILURE,data);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return resp;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // now do the modify
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Map results = entryHandler.modifyDiscoEntries(userDN,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster modify.getRemoveEntry(), modify.getInsertEntry());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String statusCode = (String) results.get(DiscoEntryHandler.STATUS_CODE);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (statusCode.equals(DiscoConstants.STATUS_OK)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (DiscoUtils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.message("DiscoService.update: modified "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "DiscoEntries through DiscoEntryHandler successfully.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster status.setCode(DiscoConstants.QNAME_OK);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List entryIds = (List) results.get(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoEntryHandler.NEW_ENTRY_IDS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((entryIds != null) && (entryIds.size() != 0)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster resp.getNewEntryIDs().addAll(entryIds);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String[] data = { logMsg };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.access(Level.INFO,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.DS_UPDATE_SUCCESS,data);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.error("DiscoService.update: couldn't modify "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "DiscoEntries through DiscoEntryHandler.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster status.setCode(DiscoConstants.QNAME_FAILED);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String[] data = { logMsg };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.error(Level.INFO,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster LogUtil.DS_UPDATE_FAILURE,data);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return resp;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private boolean isUpdateAllowed(String userDN, Message message,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List removes, List inserts, DiscoEntryHandler entryHandler,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Authorizer authorizer)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.message("DiscoService.isUpdateAllowed.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (authorizer == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Map env = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // policy eval for each removes
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((removes != null) && (removes.size() != 0)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Map entryMap = entryHandler.getDiscoEntries(userDN, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Iterator i = removes.iterator();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String entryID = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster while (i.hasNext()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster entryID = ((RemoveEntryType) i.next()).getEntryID();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!entryMap.containsKey(entryID)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.error("DiscoveryService.isUpdateAllowed: "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "remove entry not exits: " + entryID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (env == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster env = new HashMap();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster env.put(Authorizer.USER_ID, userDN);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster env.put(Authorizer.AUTH_TYPE,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster message.getAuthenticationMechanism());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster env.put(Authorizer.MESSAGE, message);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!authorizer.isAuthorized(message.getToken(),
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoConstants.ACTION_UPDATE,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ((InsertEntryType) entryMap.get(entryID)).
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster getResourceOffering(),
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster env))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.error("DiscoveryService.isUpdateAllowed: "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "WSC is not authorized to remove entry: " + entryID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // policy eval for each inserts
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((inserts != null) && (inserts.size() != 0)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Iterator j = inserts.iterator();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster while (j.hasNext()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (env == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster env = new HashMap();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster env.put(Authorizer.USER_ID, userDN);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster env.put(Authorizer.AUTH_TYPE,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster message.getAuthenticationMechanism());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster env.put(Authorizer.MESSAGE, message);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!authorizer.isAuthorized(message.getToken(),
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoConstants.ACTION_UPDATE,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ((InsertEntryType) j.next()).getResourceOffering(),
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster env))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.error("DiscoveryService.isUpdateAllowed: "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "WSC is not authorized to insert entry.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private String getResourceID(EncryptedResourceIDType encryptResID,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String providerID)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((encryptResID == null) || (providerID == null)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String result = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster EncryptedResourceID eri = new EncryptedResourceID(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.convertJAXBToElement(encryptResID, false));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ResourceID ri = EncryptedResourceID.getDecryptedResourceID(eri,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster providerID);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (ri != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster result = ri.getResourceID();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoUtils.debug.error("DiscoveryService.getResourceID: Exception:",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return result;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}