Inheritance: BerValue
Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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;
        }
Beispiel #6
0
        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;
        }