public static BerValue Read(BinaryReader reader, Int32 length, Byte code) { BerValue lResult; switch (code) { case Asn1.BITSTRING: lResult = new BerBinary(); break; case Asn1.ENUMERATED: lResult = new BerEnumerated(); break; case Asn1.BOOLEAN: lResult = new BerBoolean(); break; case Asn1.INTEGER: lResult = new BerInteger(); break; case Asn1.COUNTER: case Asn1.GAUGE: case Asn1.TIMETICKS: lResult = new BerUInteger(); break; case Asn1.LDAPREFERER: case Asn1.SET: case Asn1.SEQUENCE: lResult = new BerSequence(); break; case Asn1.IPADDRESS: lResult = new BerIpAddress(); break; case Asn1.OPAQUE: case Asn1.OCTETSTRING: lResult = new BerString(); break; default: if (code >= Asn1.LDAPSTARTRANGE && code <= Asn1.LDAPENDRANGE) { lResult = new BerSequence(); } else { lResult = new BerOther(); } break; } lResult.IntRead(reader, code, length); return(lResult); }
private Int32 SendLdapRequest(Byte command, params BerValue[] args) { if (fMemoryStream == null) { fMemoryStream = new MemoryStream(); fWriter = new BinaryWriter(fMemoryStream); } fSequenceNumber++; if (fSequenceNumber < 0) { fSequenceNumber = 1; } BerSequence lCommandParameters = new BerSequence(); lCommandParameters.TypeCodeTag = command; for (Int32 i = 0; i < args.Length; i++) { lCommandParameters.Items.Add(args[i]); } // Now we have a wrapped ldap command; we need to add an integer before it, in a regular sequence BerSequence lSequence = new BerSequence(); // first write the sequence number lSequence.Items.Add(new BerInteger(fSequenceNumber)); // then the comamnd data lSequence.Items.Add(lCommandParameters); fMemoryStream.SetLength(0); lSequence.Write(fWriter); fWriter.Flush(); Byte[] lData = fMemoryStream.ToArray(); fCurrentConnection.Write(lData, 0, lData.Length); return(fSequenceNumber); }
private Response ReadResponse() { BerValue lValue = ReadBerValue(); if (lValue != null && lValue.Type == BerType.Sequence && ((BerSequence)lValue).Items.Count >= 2 && ((BerSequence)lValue).Items[0].Type == BerType.Integer) { Response lResponse = new Response(); lResponse.SequenceId = ((BerInteger)((BerSequence)lValue).Items[0]).Value; BerSequence lSubValue = ((BerSequence)lValue).Items[1] as BerSequence; if (lSubValue == null) { return(null); } lResponse.TypeCode = lSubValue.TypeCodeTag; if (lSubValue.Items.Count == 0) { return(null); } if (lResponse.TypeCode == Asn1.LDAPSEARCHENTRY) { lResponse.RestData = ((List <BerValue>)lSubValue.Items).ToArray(); } else { if (!(lSubValue.Items[0] is BerInteger)) { return(null); // Int32 or sequence } lResponse.Code = ((BerInteger)lSubValue.Items[0]).Value; if (lSubValue.Items.Count > 1 && lSubValue.Items[1].Type == BerType.String) { lResponse.DN = ((BerString)lSubValue.Items[1]).Value; } if (lSubValue.Items.Count > 2 && lSubValue.Items[2].Type == BerType.String) { lResponse.Result = ((BerString)lSubValue.Items[2]).Value; } if (lSubValue.Items.Count > 3 && lResponse.Code == 10) // 10 = referers { lResponse.Referers = lSubValue.Items[3] as BerSequence; } else if (lSubValue.Items.Count > 3) { lResponse.RestData = new BerValue[lSubValue.Items.Count - 3]; for (Int32 i = 0; i < lResponse.RestData.Length; i++) { lResponse.RestData[i] = lSubValue.Items[i + 3]; } } } return(lResponse); } return(null); // crap on the line }
private static BerValue ParseSimple(String filter, ref Int32 pos, ref Int32 len, ref RFC1960Token tok, ref String res) { if (tok != RFC1960Token.Value) { throw new LdapException("Attribute name expected at " + pos); } String attributename = res; BerValue result; RFC1960Next(filter, ref pos, ref len, out tok, out res); switch (tok) { // <simple> ::= <attr> <filtertype> <value> // <filtertype> ::= <equal> | <approx> | <ge> | <le> // <equal> ::= '=' // <approx> ::= '~=' // <ge> ::= '>=' // <le> ::= '<=' case RFC1960Token.Equal: { RFC1960Next(filter, ref pos, ref len, out tok, out res); String currval = ParseValue(filter, ref pos, ref len, ref tok, ref res); if (tok != RFC1960Token.Any) { result = new BerSequence(Asn1.LDAPFILTEREQUALITYMATCH, new BerString(OCTETSTRING, attributename), new BerString(OCTETSTRING, currval)); break; } BerSequence items = new BerSequence(); items.Items.Add(new BerString(LDAPFILTERSUBSTRING_INIT, currval)); currval = null; while (tok == RFC1960Token.Any) { if (currval != null) { items.Items.Add(new BerString(LDAPFILTERSUBSTRING_ANY, currval)); } RFC1960Next(filter, ref pos, ref len, out tok, out res); currval = ParseValue(filter, ref pos, ref len, ref tok, ref res); } items.Items.Add(new BerString(LDAPFILTERSUBSTRING_FINAL, currval)); result = new BerSequence(Asn1.LDAPFILTERSUBSTRING, new BerString(OCTETSTRING, attributename), items); break; } // supports * too case RFC1960Token.AproxEqual: RFC1960Next(filter, ref pos, ref len, out tok, out res); result = new BerSequence(Asn1.LDAPFILTERAPPROXMATCH, new BerString(OCTETSTRING, attributename), new BerString(OCTETSTRING, ParseValue(filter, ref pos, ref len, ref tok, ref res))); break; case RFC1960Token.GreaterOrEqual: RFC1960Next(filter, ref pos, ref len, out tok, out res); result = new BerSequence(Asn1.LDAPFILTERGREATEROREQUAL, new BerString(OCTETSTRING, attributename), new BerString(OCTETSTRING, ParseValue(filter, ref pos, ref len, ref tok, ref res))); break; case RFC1960Token.LessOrEqual: RFC1960Next(filter, ref pos, ref len, out tok, out res); result = new BerSequence(Asn1.LDAPFILTERLESSOREQUAL, new BerString(OCTETSTRING, attributename), new BerString(OCTETSTRING, ParseValue(filter, ref pos, ref len, ref tok, ref res))); break; case RFC1960Token.Present: RFC1960Next(filter, ref pos, ref len, out tok, out res); result = new BerString(Asn1.LDAPFILTERPRESENT, attributename); break; default: throw new LdapException("expression expected at " + pos); } return(result); }
public static BerValue Read(BinaryReader reader, Int32 length, Byte code) { BerValue lResult; switch (code) { case Asn1.BITSTRING: lResult = new BerBinary(); break; case Asn1.ENUMERATED: lResult = new BerEnumerated(); break; case Asn1.BOOLEAN: lResult = new BerBoolean(); break; case Asn1.INTEGER: lResult = new BerInteger(); break; case Asn1.COUNTER: case Asn1.GAUGE: case Asn1.TIMETICKS: lResult = new BerUInteger(); break; case Asn1.LDAPREFERER: case Asn1.SET: case Asn1.SEQUENCE: lResult = new BerSequence(); break; case Asn1.IPADDRESS: lResult = new BerIpAddress(); break; case Asn1.OPAQUE: case Asn1.OCTETSTRING: lResult = new BerString(); break; default: if (code >= Asn1.LDAPSTARTRANGE && code <= Asn1.LDAPENDRANGE) lResult = new BerSequence(); else lResult = new BerOther(); break; } lResult.IntRead(reader, code, length); return lResult; }
private static BerValue ParseSimple(String filter, ref Int32 pos, ref Int32 len, ref RFC1960Token tok, ref String res) { if (tok != RFC1960Token.Value) throw new LdapException("Attribute name expected at " + pos); String attributename = res; BerValue result; RFC1960Next(filter, ref pos, ref len, out tok, out res); switch (tok) { // <simple> ::= <attr> <filtertype> <value> // <filtertype> ::= <equal> | <approx> | <ge> | <le> // <equal> ::= '=' // <approx> ::= '~=' // <ge> ::= '>=' // <le> ::= '<=' case RFC1960Token.Equal: { RFC1960Next(filter, ref pos, ref len, out tok, out res); String currval = ParseValue(filter, ref pos, ref len, ref tok, ref res); if (tok != RFC1960Token.Any) { result = new BerSequence(Asn1.LDAPFILTEREQUALITYMATCH, new BerString(OCTETSTRING, attributename), new BerString(OCTETSTRING, currval)); break; } BerSequence items = new BerSequence(); items.Items.Add(new BerString(LDAPFILTERSUBSTRING_INIT, currval)); currval = null; while (tok == RFC1960Token.Any) { if (currval != null) { items.Items.Add(new BerString(LDAPFILTERSUBSTRING_ANY, currval)); } RFC1960Next(filter, ref pos, ref len, out tok, out res); currval = ParseValue(filter, ref pos, ref len, ref tok, ref res); } items.Items.Add(new BerString(LDAPFILTERSUBSTRING_FINAL, currval)); result = new BerSequence(Asn1.LDAPFILTERSUBSTRING, new BerString(OCTETSTRING, attributename), items); break; } // supports * too case RFC1960Token.AproxEqual: RFC1960Next(filter, ref pos, ref len, out tok, out res); result = new BerSequence(Asn1.LDAPFILTERAPPROXMATCH, new BerString(OCTETSTRING, attributename), new BerString(OCTETSTRING, ParseValue(filter, ref pos, ref len, ref tok, ref res))); break; case RFC1960Token.GreaterOrEqual: RFC1960Next(filter, ref pos, ref len, out tok, out res); result = new BerSequence(Asn1.LDAPFILTERGREATEROREQUAL, new BerString(OCTETSTRING, attributename), new BerString(OCTETSTRING, ParseValue(filter, ref pos, ref len, ref tok, ref res))); break; case RFC1960Token.LessOrEqual: RFC1960Next(filter, ref pos, ref len, out tok, out res); result = new BerSequence(Asn1.LDAPFILTERLESSOREQUAL, new BerString(OCTETSTRING, attributename), new BerString(OCTETSTRING, ParseValue(filter, ref pos, ref len, ref tok, ref res))); break; case RFC1960Token.Present: RFC1960Next(filter, ref pos, ref len, out tok, out res); result = new BerString(Asn1.LDAPFILTERPRESENT, attributename); break; default: throw new LdapException("expression expected at " + pos); } return result; }