blob: 86f00e505844cbd16b215cf5a81f3d112191b9ff [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.shared.ldap.message.extended;
import org.apache.directory.shared.i18n.I18n;
import org.apache.directory.shared.ldap.message.ExtendedResponseImpl;
import org.apache.directory.shared.ldap.message.ResultCodeEnum;
/**
* An extended operation intended for notifying clients of upcoming
* disconnection. Here's what <a
* href="http://www.faqs.org/rfcs/rfc2251.html">RFC 2251</a> has to say about
* it:
*
* <pre>
* Section 4.1.1 (Small snippet on sending NoD)
*
* If the server receives a PDU from the client in which the LDAPMessage
* SEQUENCE tag cannot be recognized, the messageID cannot be parsed,
* the tag of the protocolOp is not recognized as a request, or the
* encoding structures or lengths of data fields are found to be
* incorrect, then the server MUST return the notice of disconnection
* described in section 4.4.1, with resultCode protocolError, and
* immediately close the connection. In other cases that the server
* cannot parse the request received by the client, the server MUST
* return an appropriate response to the request, with the resultCode
* set to protocolError.
*
* ...
*
* 4.4. Unsolicited Notification
*
* An unsolicited notification is an LDAPMessage sent from the server to
* the client which is not in response to any LDAPMessage received by
* the server. It is used to signal an extraordinary condition in the
* server or in the connection between the client and the server. The
* notification is of an advisory nature, and the server will not expect
* any response to be returned from the client.
*
* The unsolicited notification is structured as an LDAPMessage in which
* the messageID is 0 and protocolOp is of the extendedResp form. The
* responseName field of the ExtendedResponse is present. The LDAPOID
* value MUST be unique for this notification, and not be used in any
* other situation.
*
* One unsolicited notification is defined in this document.
*
* 4.4.1. Notice of Disconnection
*
* This notification may be used by the server to advise the client that
* the server is about to close the connection due to an error
* condition. Note that this notification is NOT a response to an
* unbind requested by the client: the server MUST follow the procedures
* of section 4.3. This notification is intended to assist clients in
* distinguishing between an error condition and a transient network
* failure. As with a connection close due to network failure, the
* client MUST NOT assume that any outstanding requests which modified
* the directory have succeeded or failed.
*
* The responseName is 1.3.6.1.4.1.1466.20036, the response field is
* absent, and the resultCode is used to indicate the reason for the
* disconnection.
*
* The following resultCode values are to be used in this notification:
*
* - protocolError: The server has received data from the client in
* which the LDAPMessage structure could not be parsed.
*
* - strongAuthRequired: The server has detected that an established
* underlying security association protecting communication between
* the client and server has unexpectedly failed or been compromised.
*
* - unavailable: This server will stop accepting new connections and
* operations on all existing connections, and be unavailable for an
* extended period of time. The client may make use of an alternative
* server.
*
* After sending this notice, the server MUST close the connection.
* After receiving this notice, the client MUST NOT transmit any further
* on the connection, and may abruptly close the connection.
* </pre>
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev$
*/
public class NoticeOfDisconnect extends ExtendedResponseImpl
{
private static final long serialVersionUID = -4682291068700593492L;
public static final String EXTENSION_OID = "1.3.6.1.4.1.1466.20036";
private static final byte[] EMPTY_RESPONSE = new byte[0];
public static final NoticeOfDisconnect UNAVAILABLE = new NoticeOfDisconnect( ResultCodeEnum.UNAVAILABLE );
public static final NoticeOfDisconnect PROTOCOLERROR = new NoticeOfDisconnect( ResultCodeEnum.PROTOCOL_ERROR );
public static final NoticeOfDisconnect STRONGAUTHREQUIRED = new NoticeOfDisconnect(
ResultCodeEnum.STRONG_AUTH_REQUIRED );
private NoticeOfDisconnect( ResultCodeEnum rcode )
{
super( 0, EXTENSION_OID );
switch ( rcode )
{
case UNAVAILABLE:
break;
case PROTOCOL_ERROR:
break;
case STRONG_AUTH_REQUIRED:
break;
default:
throw new IllegalArgumentException( I18n.err( I18n.ERR_04166, ResultCodeEnum.UNAVAILABLE,
ResultCodeEnum.PROTOCOL_ERROR, ResultCodeEnum.STRONG_AUTH_REQUIRED ) );
}
super.getLdapResult().setErrorMessage( rcode.toString() + ": The server will disconnect!" );
super.getLdapResult().setMatchedDn( null );
super.getLdapResult().setResultCode( rcode );
}
// ------------------------------------------------------------------------
// ExtendedResponse Interface Method Implementations
// ------------------------------------------------------------------------
/**
* Gets the reponse OID specific encoded response values.
*
* @return the response specific encoded response values.
*/
public byte[] getResponse()
{
return EMPTY_RESPONSE;
}
/**
* Sets the reponse OID specific encoded response values.
*
* @param value
* the response specific encoded response values.
*/
public void setResponse( byte[] value )
{
throw new UnsupportedOperationException( I18n.err( I18n.ERR_04173 ) );
}
/**
* Gets the OID uniquely identifying this extended response (a.k.a. its
* name).
*
* @return the OID of the extended response type.
*/
public String getResponseName()
{
return EXTENSION_OID;
}
/**
* Sets the OID uniquely identifying this extended response (a.k.a. its
* name).
*
* @param oid
* the OID of the extended response type.
*/
public void setResponseName( String oid )
{
throw new UnsupportedOperationException( I18n.err( I18n.ERR_04168, EXTENSION_OID ) );
}
public boolean equals( Object obj )
{
if ( obj == this )
{
return true;
}
if ( obj instanceof NoticeOfDisconnect )
{
return true;
}
return false;
}
}