SecurityTokenService.java

  1. /*
  2.  * Copyright (c) 2002-2022, City of Paris
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  *  1. Redistributions of source code must retain the above copyright notice
  10.  *     and the following disclaimer.
  11.  *
  12.  *  2. Redistributions in binary form must reproduce the above copyright notice
  13.  *     and the following disclaimer in the documentation and/or other materials
  14.  *     provided with the distribution.
  15.  *
  16.  *  3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
  17.  *     contributors may be used to endorse or promote products derived from
  18.  *     this software without specific prior written permission.
  19.  *
  20.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  21.  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23.  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
  24.  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  25.  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  26.  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  27.  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  28.  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  29.  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  30.  * POSSIBILITY OF SUCH DAMAGE.
  31.  *
  32.  * License 1.0
  33.  */
  34. package fr.paris.lutece.portal.service.security;

  35. import fr.paris.lutece.portal.service.spring.SpringContextService;

  36. import java.util.HashMap;
  37. import java.util.HashSet;
  38. import java.util.Map;
  39. import java.util.Set;
  40. import java.util.UUID;

  41. import javax.servlet.http.HttpServletRequest;
  42. import javax.servlet.http.HttpSession;

  43. /**
  44.  *
  45.  * This class provides a security service for getting and verify tokens
  46.  *
  47.  */
  48. public class SecurityTokenService implements ISecurityTokenService
  49. {
  50.     public static final String MARK_TOKEN = "token";
  51.     public static final String PARAMETER_TOKEN = "token";
  52.     private static final String BEAN_SECURITY_TOKEN_SERVICE = "securityTokenService";
  53.     private static final String PARAMETER_SESSION_TOKENS = "tokens";
  54.     private static ISecurityTokenService _singleton;

  55.     /**
  56.      * SecurityTokenService
  57.      */
  58.     private SecurityTokenService( )
  59.     {
  60.     }

  61.     /**
  62.      * Returns the instance of the singleton
  63.      *
  64.      * @return The instance of the singleton
  65.      */
  66.     public static synchronized ISecurityTokenService getInstance( )
  67.     {
  68.         if ( _singleton == null )
  69.         {
  70.             _singleton = SpringContextService.getBean( BEAN_SECURITY_TOKEN_SERVICE );
  71.         }

  72.         return _singleton;
  73.     }

  74.     /**
  75.      * {@inheritDoc}
  76.      */
  77.     @Override
  78.     public String getToken( HttpServletRequest request, String strAction )
  79.     {
  80.         String strToken = generateNewKey( );
  81.         HttpSession session = request.getSession( true );

  82.         if ( session.getAttribute( PARAMETER_SESSION_TOKENS ) == null )
  83.         {
  84.             session.setAttribute( PARAMETER_SESSION_TOKENS, new HashMap<String, HashSet<String>>( ) );
  85.         }

  86.         Map<String, HashSet<String>> hashTokens = (Map<String, HashSet<String>>) session.getAttribute( PARAMETER_SESSION_TOKENS );

  87.         if ( !hashTokens.containsKey( strAction ) )
  88.         {
  89.             hashTokens.put( strAction, new HashSet<>( ) );
  90.         }

  91.         hashTokens.get( strAction ).add( strToken );

  92.         return strToken;
  93.     }

  94.     /**
  95.      * {@inheritDoc}
  96.      */
  97.     @Override
  98.     public boolean validate( HttpServletRequest request, String strAction )
  99.     {
  100.         HttpSession session = request.getSession( true );

  101.         String strToken = request.getParameter( PARAMETER_TOKEN );

  102.         if ( ( session.getAttribute( PARAMETER_SESSION_TOKENS ) != null )
  103.                 && ( (Map<String, Set<String>>) session.getAttribute( PARAMETER_SESSION_TOKENS ) ).containsKey( strAction )
  104.                 && ( (Map<String, Set<String>>) session.getAttribute( PARAMETER_SESSION_TOKENS ) ).get( strAction ).contains( strToken ) )
  105.         {
  106.             ( (Map<String, Set<String>>) session.getAttribute( PARAMETER_SESSION_TOKENS ) ).get( strAction ).remove( strToken );

  107.             return true;
  108.         }

  109.         return false;
  110.     }

  111.     /**
  112.      * Generate a new key
  113.      *
  114.      * @return a new key
  115.      */
  116.     private String generateNewKey( )
  117.     {
  118.         UUID key = UUID.randomUUID( );

  119.         return key.toString( );
  120.     }
  121. }