blob: 61df5d0b80b10e612c95cf32f12a1df1816b3961 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.directory.server.ldap;
import org.apache.commons.lang.StringUtils;
import org.apache.directory.api.ldap.model.csn.Csn;
import org.apache.directory.api.ldap.model.message.Request;
import org.apache.directory.api.ldap.model.message.Response;
import org.apache.directory.api.util.Strings;
import org.apache.directory.server.core.api.interceptor.context.OperationContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Utility methods used by the LDAP protocol service.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class LdapProtocolUtils
{
/** A delimiter for the replicaId */
public static final String COOKIE_DELIM = ",";
/** the prefix for replicaId value */
public static final String REPLICA_ID_PREFIX = "rid=";
public static final int REPLICA_ID_PREFIX_LEN = REPLICA_ID_PREFIX.length();
/** the prefix for Csn value */
public static final String CSN_PREFIX = "csn=";
private static final int CSN_PREFIX_LEN = CSN_PREFIX.length();
private static final Logger LOG = LoggerFactory.getLogger( LdapProtocolUtils.class );
/**
* Extracts request controls from a request to populate into an
* OperationContext.
*
* @param opContext the context to populate with request controls
* @param request the request to extract controls from
*/
public static void setRequestControls( OperationContext opContext, Request request ) throws Exception
{
if ( request.getControls() != null )
{
opContext
.addRequestControls( request.getControls().values().toArray( LdapProtocolConstants.EMPTY_CONTROLS ) );
}
}
/**
* Extracts response controls from a an OperationContext to populate into
* a Response object.
*
* @param opContext the context to extract controls from
* @param response the response to populate with response controls
*/
public static void setResponseControls( OperationContext opContext, Response response ) throws Exception
{
response.addAllControls( opContext.getResponseControls() );
}
public static byte[] createCookie( int replicaId, String csn )
{
// the syncrepl cookie format (compatible with OpenLDAP)
// rid=nn,csn=xxxz
String replicaIdStr = StringUtils.leftPad( Integer.toString( replicaId ), 3, '0' );
return Strings.getBytesUtf8( REPLICA_ID_PREFIX + replicaIdStr + COOKIE_DELIM + CSN_PREFIX + csn );
}
/**
* Check the cookie syntax. A cookie must have the following syntax :
* { rid={replicaId},csn={CSN} }
*/
public static boolean isValidCookie( String cookieString )
{
if ( ( cookieString == null ) || ( cookieString.trim().length() == 0 ) )
{
return false;
}
int pos = cookieString.indexOf( COOKIE_DELIM );
// position should start from REPLICA_ID_PREFIX_LEN or higher cause a cookie can be
// like "rid=0,csn={csn}" or "rid=11,csn={csn}"
if ( pos <= REPLICA_ID_PREFIX_LEN )
{
return false;
}
String replicaId = cookieString.substring( REPLICA_ID_PREFIX_LEN, pos );
try
{
Integer.parseInt( replicaId );
}
catch ( NumberFormatException e )
{
LOG.debug( "Failed to parse the replica id {}", replicaId );
return false;
}
if ( pos == cookieString.length() )
{
return false;
}
String csnString = cookieString.substring( pos + 1 + CSN_PREFIX_LEN );
return Csn.isValid( csnString );
}
/**
* returns the CSN present in cookie
*
* @param cookieString the cookie
* @return
*/
public static String getCsn( String cookieString )
{
int pos = cookieString.indexOf( COOKIE_DELIM );
return cookieString.substring( pos + 1 + CSN_PREFIX_LEN );
}
/**
* returns the replica id present in cookie
*
* @param cookieString the cookie
* @return
*/
public static int getReplicaId( String cookieString )
{
String replicaId = cookieString.substring( REPLICA_ID_PREFIX_LEN, cookieString.indexOf( COOKIE_DELIM ) );
return Integer.parseInt( replicaId );
}
}