/* * JOSSO: Java Open Single Sign-On * * Copyright 2004-2009, Atricore, Inc. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. * */ package org.josso.gateway.identity.service; import java.rmi.RemoteException; import java.util.ArrayList; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.josso.gateway.SSONameValuePair; import org.josso.gateway.identity.SSORole; import org.josso.gateway.identity.SSOUser; import org.josso.gateway.identity.exceptions.NoSuchUserException; import org.josso.gateway.identity.exceptions.SSOIdentityException; import org.josso.gateway.ws._1_2.protocol.FindRolesBySSOSessionIdRequestType; import org.josso.gateway.ws._1_2.protocol.FindRolesBySSOSessionIdResponseType; import org.josso.gateway.ws._1_2.protocol.FindUserInSecurityDomainRequestType; import org.josso.gateway.ws._1_2.protocol.FindUserInSecurityDomainResponseType; import org.josso.gateway.ws._1_2.protocol.FindUserInSessionRequestType; import org.josso.gateway.ws._1_2.protocol.FindUserInSessionResponseType; import org.josso.gateway.ws._1_2.protocol.InvalidSessionErrorType; import org.josso.gateway.ws._1_2.protocol.NoSuchUserErrorType; import org.josso.gateway.ws._1_2.protocol.SSOIdentityManagerErrorType; import org.josso.gateway.ws._1_2.protocol.SSONameValuePairType; import org.josso.gateway.ws._1_2.protocol.SSORoleType; import org.josso.gateway.ws._1_2.protocol.SSOUserType; import org.josso.gateway.ws._1_2.protocol.UserExistsRequestType; import org.josso.gateway.ws._1_2.protocol.UserExistsResponseType; import org.josso.gateway.ws._1_2.wsdl.SSOIdentityManager; /** * Webservice client implementation for the SSO Identity Manager based on * the Axis-generated Stub & Skeleton. * * @author <a href="mailto:gbrigand@josso.org">Gianluca Brigandi</a> * @version CVS $Id: WebserviceSSOIdentityManager.java 578 2008-08-04 12:01:44Z gbrigand $ */ public class WebserviceSSOIdentityManager implements SSOIdentityManagerService { private static final Log logger = LogFactory.getLog(WebserviceSSOIdentityManager.class); private SSOIdentityManager _wsSSOIdentityManager; private int _errorCount; private int _processedCount; /** * Build a Webservice SSO Identity Manager. * * @param wsSSOIdentityManager the SOAP stub to be invoked. */ public WebserviceSSOIdentityManager(SSOIdentityManager wsSSOIdentityManager) { _wsSSOIdentityManager = wsSSOIdentityManager; } /** * Initializes this manager instance. */ public void initialize() { } /** * Finds a user based on its security domain and name. The name is a unique identifier of the user in the security domain, probably the user login. * * @throws org.josso.gateway.identity.exceptions.NoSuchUserException * if the user does not exist. */ public SSOUser findUser(String requester, String securityDomain, String username) throws NoSuchUserException, SSOIdentityException { try { if (logger.isDebugEnabled()) logger.debug("[findUser()] : " + securityDomain + ":" + username); FindUserInSecurityDomainRequestType request = new FindUserInSecurityDomainRequestType(); request.setRequester(requester); request.setSecurityDomain(securityDomain); request.setUsername(username); FindUserInSecurityDomainResponseType response = _wsSSOIdentityManager.findUserInSecurityDomain(request); return adaptSSOUser(response.getSSOUser()); } catch (NoSuchUserErrorType e) { throw new NoSuchUserException(e.getUsername()); } catch (SSOIdentityManagerErrorType e) { throw new SSOIdentityException(e.getMessage(), e); } catch (RemoteException e) { _errorCount++; throw new SSOIdentityException(e.getMessage(), e); } catch (Exception e) { _errorCount++; throw new SSOIdentityException(e.getMessage(), e); } finally { _processedCount++; } } /** * Finds the user associated to a sso session * * @param sessionId the sso session identifier * @throws org.josso.gateway.identity.exceptions.NoSuchUserException * if no user is associated to this session id. */ public SSOUser findUserInSession(String requester, String sessionId) throws NoSuchUserException, SSOIdentityException { if (logger.isDebugEnabled()) logger.debug("[findUserInSession()] : " + sessionId); try { FindUserInSessionRequestType request = new FindUserInSessionRequestType(requester, sessionId); FindUserInSessionResponseType response = _wsSSOIdentityManager.findUserInSession(request); return adaptSSOUser(response.getSSOUser()); } catch (InvalidSessionErrorType e) { throw new SSOIdentityException(e.getMessage()); } catch (NoSuchUserErrorType e) { throw new NoSuchUserException(e.getUsername()); } catch (SSOIdentityManagerErrorType e) { throw new SSOIdentityException(e.getMessage(), e); } catch (RemoteException e) { _errorCount++; throw new SSOIdentityException(e.getMessage(), e); } catch (Exception e) { _errorCount++; throw new SSOIdentityException(e.getMessage(), e); } finally { _processedCount++; } } /** * Finds a collection of user's roles. * Elements in the collection are SSORole instances. * * @param ssoSessionId * @throws org.josso.gateway.identity.exceptions.SSOIdentityException * */ public SSORole[] findRolesBySSOSessionId(String requester, String ssoSessionId) throws SSOIdentityException { try { if (logger.isDebugEnabled()) logger.debug("[findRolesBySSOSessionId()] : " + ssoSessionId); FindRolesBySSOSessionIdRequestType request = new FindRolesBySSOSessionIdRequestType(); request.setRequester(requester); request.setSsoSessionId(ssoSessionId); FindRolesBySSOSessionIdResponseType response = _wsSSOIdentityManager.findRolesBySSOSessionId(request); return adaptSSORoles(response.getRoles()); } catch (InvalidSessionErrorType e) { throw new SSOIdentityException(e.getMessage()); } catch (SSOIdentityManagerErrorType e) { throw new SSOIdentityException(e.getMessage(), e); } catch (RemoteException e) { _errorCount++; throw new SSOIdentityException(e.getMessage(), e); } catch (Exception e) { _errorCount++; throw new SSOIdentityException(e.getMessage(), e); } finally { _processedCount++; } } public void userExists(String requester, String securityDomain, String username) throws NoSuchUserException, SSOIdentityException { try { if (logger.isDebugEnabled()) logger.debug("[userExists()] : " + username); UserExistsRequestType request = new UserExistsRequestType(requester, securityDomain, username); UserExistsResponseType response = _wsSSOIdentityManager.userExists(request); if (!response.isUserexists()) throw new NoSuchUserException(username); } catch (java.rmi.RemoteException e) { _errorCount++; throw new SSOIdentityException(e.getMessage(), e); } catch (Exception e) { _errorCount++; throw new SSOIdentityException(e.getMessage(), e); } finally { _processedCount++; } } /** * Maps a SOAP SSOUser type instance to a JOSSO SSOUser type instance. * * @param srcSSOUser the SOAP type instance to be mapped. * @return the mapped user */ protected SSOUser adaptSSOUser(SSOUserType srcSSOUser) { BaseUserImpl targetSSOUser = new BaseUserImpl(); targetSSOUser.setName(srcSSOUser.getName()); // map Properties if (srcSSOUser.getProperties() != null) { SSONameValuePair[] properties = new SSONameValuePair[srcSSOUser.getProperties().length]; for (int i = 0; i < srcSSOUser.getProperties().length; i++) { SSONameValuePairType nvpt = srcSSOUser.getProperties()[i]; properties[i] = new SSONameValuePair(nvpt.getName(), nvpt.getValue()); } targetSSOUser.setProperties(properties); } return targetSSOUser; } /** * Maps a SOAP SSOValuePair type instance to a JOSSO SSOValuePair type instance. * * @param srcSSONameValuePair the SOAP type instance to be mapped. * @return the mapped value pair */ protected SSONameValuePair adaptSSOValuePair(SSONameValuePair srcSSONameValuePair) { BaseUserImpl targetSSOUser = new BaseUserImpl(); org.josso.gateway.SSONameValuePair targetSSONameValuePair = new org.josso.gateway.SSONameValuePair(srcSSONameValuePair.getName(), srcSSONameValuePair.getValue()); return targetSSONameValuePair; } /** * Maps a SOAP SSORole type instance to a JOSSO SSORole type instance. * * @param srcSSORole the SOAP type instance to be mapped. * @return the mapped role */ protected SSORole adaptSSORole(SSORoleType srcSSORole) { BaseRoleImpl targetSSORole = new BaseRoleImpl(); targetSSORole.setName(srcSSORole.getName()); return targetSSORole; } /** * Maps one or more SOAP SSORole type instancess to one or more JOSSO SSORole type instances. * * @param srcSSORoles the SOAP type instances to be mapped. * @return the mapped roles */ protected SSORole[] adaptSSORoles(SSORoleType[] srcSSORoles) { if (srcSSORoles == null) { return new SSORole[0]; } ArrayList targetSSORoles = new ArrayList(); for (int i = 0; i < srcSSORoles.length; i++) { targetSSORoles.add(adaptSSORole(srcSSORoles[i])); } return (SSORole[]) targetSSORoles.toArray(new BaseRoleImpl[targetSSORoles.size()]); } public int getErrorCount() { return _errorCount; } public int getProcessedCount() { return _processedCount; } }