//************************************************************************* // Constructor for ModifyRequest //************************************************************************* /// <summary> </summary> public RfcModifyRequest(RfcLdapDN object_Renamed, Asn1SequenceOf modification) : base(2) { add(object_Renamed); add(modification); return ; }
/// <summary> Constructs a sort control with multiple sort keys. /// /// </summary> /// <param name="keys An">array of sort key objects, to be processed in /// order. /// /// </param> /// <param name="critical True">if the search operation is to fail if the /// server does not support this control. /// </param> public LdapSortControl(LdapSortKey[] keys, bool critical):base(requestOID, critical, null) { Asn1SequenceOf sortKeyList = new Asn1SequenceOf(); for (int i = 0; i < keys.Length; i++) { Asn1Sequence key = new Asn1Sequence(); key.add(new Asn1OctetString(keys[i].Key)); if ((System.Object) keys[i].MatchRule != null) { key.add(new Asn1Tagged(new Asn1Identifier(Asn1Identifier.CONTEXT, false, ORDERING_RULE), new Asn1OctetString(keys[i].MatchRule), false)); } if (keys[i].Reverse == true) { // only add if true key.add(new Asn1Tagged(new Asn1Identifier(Asn1Identifier.CONTEXT, false, REVERSE_ORDER), new Asn1Boolean(true), false)); } sortKeyList.add(key); } setValue(sortKeyList.getEncoding(new LBEREncoder())); return ; }
/// <summary> /// Constructs an extended operations object which contains the ber encoded /// replication filter. /// /// </summary> /// <param name="serverDN">The server on which the replication filter needs to be set /// /// </param> /// <param name="replicationFilter">An array of String Arrays. Each array starting with /// a class name followed by the attribute names for that class that should comprise /// the replication filter. /// /// </param> /// <exception> LdapException A general exception which includes an error /// message and an Ldap error code. /// </exception> public SetReplicationFilterRequest(System.String serverDN, System.String[][] replicationFilter):base(ReplicationConstants.SET_REPLICATION_FILTER_REQ, null) { try { if ((System.Object) serverDN == null) throw new System.ArgumentException(ExceptionMessages.PARAM_ERROR); System.IO.MemoryStream encodedData = new System.IO.MemoryStream(); LBEREncoder encoder = new LBEREncoder(); Asn1OctetString asn1_serverDN = new Asn1OctetString(serverDN); // Add the serverDN to encoded data asn1_serverDN.encode(encoder, encodedData); // The toplevel sequenceOF Asn1SequenceOf asn1_replicationFilter = new Asn1SequenceOf(); if (replicationFilter == null) { asn1_replicationFilter.encode(encoder, encodedData); setValue(SupportClass.ToSByteArray(encodedData.ToArray())); return ; } int i = 0; // for every element in the array while ((i < replicationFilter.Length) && (replicationFilter[i] != null)) { // The following additional Sequence is not needed // as defined by the Asn1. But the server and the // C client are encoding it. Remove this when server // and C client are fixed to conform to the published Asn1. Asn1Sequence buginAsn1Representation = new Asn1Sequence(); // Add the classname to the sequence - buginAsn1Representation.add(new Asn1OctetString(replicationFilter[i][0])); // Start a sequenceOF for attributes Asn1SequenceOf asn1_attributeList = new Asn1SequenceOf(); // For every attribute in the array - remember attributes start after // the first element int j = 1; while ((j < replicationFilter[i].Length) && ((System.Object) replicationFilter[i][j] != null)) { // Add the attribute name to the inner SequenceOf asn1_attributeList.add(new Asn1OctetString(replicationFilter[i][j])); j++; } // Add the attributeList to the sequence - extra add due to bug buginAsn1Representation.add(asn1_attributeList); asn1_replicationFilter.add(buginAsn1Representation); i++; } asn1_replicationFilter.encode(encoder, encodedData); setValue(SupportClass.ToSByteArray(encodedData.ToArray())); } catch (System.IO.IOException ioe) { throw new LdapException(ExceptionMessages.ENCODING_ERROR, LdapException.ENCODING_ERROR, (System.String) null); } }
/// <summary> Encode an array of LdapModifications to ASN.1. /// /// </summary> /// <param name="mods">an array of LdapModification objects /// /// </param> /// <returns> an Asn1SequenceOf object containing the modifications. /// </returns> private static Asn1SequenceOf encodeModifications(LdapModification[] mods) { // Convert Java-API LdapModification[] to RFC2251 SEQUENCE OF SEQUENCE Asn1SequenceOf rfcMods = new Asn1SequenceOf(mods.Length); for (int i = 0; i < mods.Length; i++) { LdapAttribute attr = mods[i].Attribute; // place modification attribute values in Asn1SetOf Asn1SetOf vals = new Asn1SetOf(attr.size()); if (attr.size() > 0) { System.Collections.IEnumerator attrEnum = attr.ByteValues; while (attrEnum.MoveNext()) { vals.add(new RfcAttributeValue((sbyte[]) attrEnum.Current)); } } // create SEQUENCE containing mod operation and attr type and vals Asn1Sequence rfcMod = new Asn1Sequence(2); rfcMod.add(new Asn1Enumerated(mods[i].Op)); rfcMod.add(new RfcAttributeTypeAndValues(new RfcAttributeDescription(attr.Name), vals)); // place SEQUENCE into SEQUENCE OF rfcMods.add(rfcMod); } return rfcMods; }
/// <summary> RFC 2254 filter helper method. Will Parse a filter component.</summary> private Asn1Tagged parseFilterComp() { Asn1Tagged tag = null; int filterComp = ft.OpOrAttr; switch (filterComp) { case AND: case OR: tag = new Asn1Tagged(new Asn1Identifier(Asn1Identifier.CONTEXT, true, filterComp), parseFilterList(), false); break; case NOT: tag = new Asn1Tagged(new Asn1Identifier(Asn1Identifier.CONTEXT, true, filterComp), parseFilter(), true); break; default: int filterType = ft.FilterType; System.String value_Renamed = ft.Value; switch (filterType) { case GREATER_OR_EQUAL: case LESS_OR_EQUAL: case APPROX_MATCH: tag = new Asn1Tagged(new Asn1Identifier(Asn1Identifier.CONTEXT, true, filterType), new RfcAttributeValueAssertion(new RfcAttributeDescription(ft.Attr), new RfcAssertionValue(unescapeString(value_Renamed))), false); break; case EQUALITY_MATCH: if (value_Renamed.Equals("*")) { // present tag = new Asn1Tagged(new Asn1Identifier(Asn1Identifier.CONTEXT, false, PRESENT), new RfcAttributeDescription(ft.Attr), false); } else if (value_Renamed.IndexOf((System.Char) '*') != - 1) { // substrings parse: // [initial], *any*, [final] into an Asn1SequenceOf SupportClass.Tokenizer sub = new SupportClass.Tokenizer(value_Renamed, "*", true); // SupportClass.Tokenizer sub = new SupportClass.Tokenizer(value_Renamed, "*");//, true); Asn1SequenceOf seq = new Asn1SequenceOf(5); int tokCnt = sub.Count; int cnt = 0; System.String lastTok = new System.Text.StringBuilder("").ToString(); while (sub.HasMoreTokens()) { System.String subTok = sub.NextToken(); cnt++; if (subTok.Equals("*")) { // if previous token was '*', and since the current // token is a '*', we need to insert 'any' if (lastTok.Equals(subTok)) { // '**' seq.add(new Asn1Tagged(new Asn1Identifier(Asn1Identifier.CONTEXT, false, ANY), new RfcLdapString(unescapeString("")), false)); } } else { // value (RfcLdapString) if (cnt == 1) { // initial seq.add(new Asn1Tagged(new Asn1Identifier(Asn1Identifier.CONTEXT, false, INITIAL), new RfcLdapString(unescapeString(subTok)), false)); } else if (cnt < tokCnt) { // any seq.add(new Asn1Tagged(new Asn1Identifier(Asn1Identifier.CONTEXT, false, ANY), new RfcLdapString(unescapeString(subTok)), false)); } else { // final seq.add(new Asn1Tagged(new Asn1Identifier(Asn1Identifier.CONTEXT, false, FINAL), new RfcLdapString(unescapeString(subTok)), false)); } } lastTok = subTok; } tag = new Asn1Tagged(new Asn1Identifier(Asn1Identifier.CONTEXT, true, SUBSTRINGS), new RfcSubstringFilter(new RfcAttributeDescription(ft.Attr), seq), false); } else { // simple tag = new Asn1Tagged(new Asn1Identifier(Asn1Identifier.CONTEXT, true, EQUALITY_MATCH), new RfcAttributeValueAssertion(new RfcAttributeDescription(ft.Attr), new RfcAssertionValue(unescapeString(value_Renamed))), false); } break; case EXTENSIBLE_MATCH: System.String type = null, matchingRule = null; bool dnAttributes = false; // SupportClass.Tokenizer st = new StringTokenizer(ft.Attr, ":", true); SupportClass.Tokenizer st = new SupportClass.Tokenizer(ft.Attr, ":");//, true); bool first = true; while (st.HasMoreTokens()) { System.String s = st.NextToken().Trim(); if (first && !s.Equals(":")) { type = s; } // dn must be lower case to be considered dn of the Entry. else if (s.Equals("dn")) { dnAttributes = true; } else if (!s.Equals(":")) { matchingRule = s; } first = false; } tag = new Asn1Tagged(new Asn1Identifier(Asn1Identifier.CONTEXT, true, EXTENSIBLE_MATCH), new RfcMatchingRuleAssertion(((System.Object) matchingRule == null)?null:new RfcMatchingRuleId(matchingRule), ((System.Object) type == null)?null:new RfcAttributeDescription(type), new RfcAssertionValue(unescapeString(value_Renamed)), (dnAttributes == false)?null:new Asn1Boolean(true)), false); break; } break; } return tag; }
/// <summary> Creates and addes a substrings filter component. /// /// startSubstrings must be immediatly followed by at least one /// {@link #addSubstring} method and one {@link #endSubstrings} method /// @throws Novell.Directory.Ldap.LdapLocalException /// Occurs when this component is created out of sequence. /// </summary> public virtual void startSubstrings(System.String attrName) { finalFound = false; Asn1SequenceOf seq = new Asn1SequenceOf(5); Asn1Object current = new Asn1Tagged(new Asn1Identifier(Asn1Identifier.CONTEXT, true, SUBSTRINGS), new RfcSubstringFilter(new RfcAttributeDescription(attrName), seq), false); addObject(current); SupportClass.StackPush(filterStack, seq); return ; }
//************************************************************************* // Constructors for SubstringFilter //************************************************************************* /// <summary> </summary> public RfcSubstringFilter(RfcAttributeDescription type, Asn1SequenceOf substrings) : base(2) { add(type); add(substrings); }