Emmanuel Lecharny created DIRAPI-323:
----------------------------------------
Summary: Decoding extended operations which require a value isn't
enforcing the value to be present
Key: DIRAPI-323
URL: https://issues.apache.org/jira/browse/DIRAPI-323
Project: Directory Client API
Issue Type: Bug
Affects Versions: 2.0.0.AM2
Reporter: Emmanuel Lecharny
Currently, when we decode an extended operation for which we know about (ie,
it's registred in the {{LdapApiService}} instance), and if the {{RequestValue}}
part is required, we have no way to enforce it to be present, which means the
decoding will succeed, even if the resulting extended operation is invalid.
This is due to the fact that the extended operation grammar makes the value
optionnal :
{noformat}
ExtendedRequest ::= [APPLICATION 23] SEQUENCE {
requestName [0] LDAPOID,
requestValue [1] OCTET STRING OPTIONAL }
ExtendedResponse ::= [APPLICATION 24] SEQUENCE {
COMPONENTS OF LDAPResult,
responseName [10] LDAPOID OPTIONAL,
responseValue [11] OCTET STRING OPTIONAL }
{noformat}
(works for a request or a response), while for a specific implementation, like
the {{CancelRequest}}, defined in [RFC
3909|https://www.rfc-editor.org/rfc/rfc3909.txt], the grammar is :
{noformat}
The Cancel request is an ExtendedRequest with the requestName field
containing 1.3.6.1.1.8 and a requestValue field which contains a
BER-encoded cancelRequestValue value.
cancelRequestValue ::= SEQUENCE {
cancelID MessageID
-- MessageID is as defined in [RFC2251]
}
{noformat}
and it's clearly not optional.
It boils down to be able to detect the extended operation type (given by the
request name, if present), and then check if the request value is present or
not. It's a semantic check, while the decoding just take care of the syntax,
which makes it impossible to detect such a missing value.
There is a solution for PDU which ends with no controls, as we can tell the
grammar that there is some expected value, which will fail if the PDU ends, but
if we have controls, then the grammar will keep going as some more data is
present (we just have to change the {{isGrammarEndAllowed}} to {{false}} to
make that works when no control is present, but obviously that does not work
when we have some controls).
ATM, I have no solution to this problem. What would be required is to set a
flag when we meet the {{ExtendedOperation}} tag (ie {{0x77}} or {{0x78}}) and
check this flag when we have fully decoded a PDU, but this flag has a semantic
meaning, which would break the decoder as a generic ASN.1 decoder. One solution
would be to have the container check itself when we reach the {{PDU_DECODED}}
state in the {{Asn1Decoder}} loop...
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)