001    /*
002     * Copyright 2011-2015 UnboundID Corp.
003     * All Rights Reserved.
004     */
005    /*
006     * Copyright (C) 2011-2015 UnboundID Corp.
007     *
008     * This program is free software; you can redistribute it and/or modify
009     * it under the terms of the GNU General Public License (GPLv2 only)
010     * or the terms of the GNU Lesser General Public License (LGPLv2.1 only)
011     * as published by the Free Software Foundation.
012     *
013     * This program is distributed in the hope that it will be useful,
014     * but WITHOUT ANY WARRANTY; without even the implied warranty of
015     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
016     * GNU General Public License for more details.
017     *
018     * You should have received a copy of the GNU General Public License
019     * along with this program; if not, see <http://www.gnu.org/licenses>.
020     */
021    package com.unboundid.ldap.listener;
022    
023    
024    
025    import java.util.Arrays;
026    import java.util.List;
027    
028    import com.unboundid.ldap.sdk.Control;
029    import com.unboundid.ldap.sdk.ExtendedRequest;
030    import com.unboundid.ldap.sdk.ExtendedResult;
031    import com.unboundid.ldap.sdk.ResultCode;
032    import com.unboundid.ldap.sdk.extensions.WhoAmIExtendedRequest;
033    import com.unboundid.ldap.sdk.extensions.WhoAmIExtendedResult;
034    import com.unboundid.util.NotMutable;
035    import com.unboundid.util.ThreadSafety;
036    import com.unboundid.util.ThreadSafetyLevel;
037    
038    import static com.unboundid.ldap.listener.ListenerMessages.*;
039    
040    
041    
042    /**
043     * This class provides an implementation of an extended operation handler for
044     * the in-memory directory server that can be used to process the "Who Am I?"
045     * extended operation as defined in
046     * <A HREF="http://www.ietf.org/rfc/rfc4532.txt">RFC 4532</A>.
047     */
048    @NotMutable()
049    @ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
050    public final class WhoAmIExtendedOperationHandler
051           extends InMemoryExtendedOperationHandler
052    {
053      /**
054       * Creates a new instance of this extended operation handler.
055       */
056      public WhoAmIExtendedOperationHandler()
057      {
058        // No initialization is required.
059      }
060    
061    
062    
063      /**
064       * {@inheritDoc}
065       */
066      @Override()
067      public String getExtendedOperationHandlerName()
068      {
069        return "Who Am I?";
070      }
071    
072    
073    
074      /**
075       * {@inheritDoc}
076       */
077      @Override()
078      public List<String> getSupportedExtendedRequestOIDs()
079      {
080        return Arrays.asList(WhoAmIExtendedRequest.WHO_AM_I_REQUEST_OID);
081      }
082    
083    
084    
085      /**
086       * {@inheritDoc}
087       */
088      @Override()
089      public ExtendedResult processExtendedOperation(
090                                 final InMemoryRequestHandler handler,
091                                 final int messageID, final ExtendedRequest request)
092      {
093        // This extended operation handler does not support any controls.  If the
094        // request has any critical controls, then reject it.
095        for (final Control c : request.getControls())
096        {
097          if (c.isCritical())
098          {
099            return new ExtendedResult(messageID,
100                 ResultCode.UNAVAILABLE_CRITICAL_EXTENSION,
101                 ERR_WHO_AM_I_EXTOP_UNSUPPORTED_CONTROL.get(c.getOID()), null, null,
102                 null, null, null);
103          }
104        }
105    
106        final String authorizationID =
107             "dn:" + handler.getAuthenticatedDN().toString();
108        return new WhoAmIExtendedResult(messageID, ResultCode.SUCCESS,  null,
109             null, null, authorizationID, null);
110      }
111    }