[ https://issues.apache.org/jira/browse/DIRAPI-323?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Emmanuel Lecharny resolved DIRAPI-323. -------------------------------------- Resolution: Fixed Fix Version/s: 2.0.0.AM3 The way it's now handled is that we create an Opaque ExtOp that we convert to a typed ExtOp once we have detected the ExtOp type. It works, even if not efficient. A better solution would be to add a post-grammar-end action to create the proper ExtOp only once. > 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 > Priority: Minor > Fix For: 2.0.0.AM3 > > > 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)