示例#1
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);
        }
示例#2
0
 private static BerValue ParseNot(String filter, ref Int32 pos, ref Int32 len, ref RFC1960Token tok, ref String res)
 {
     RFC1960Next(filter, ref pos, ref len, out tok, out res);
     return(new BerSequence(Asn1.LDAPFILTERNOT, ParseFilter(filter, ref pos, ref len, ref tok, ref res)));
 }
示例#3
0
        private static BerValue[] ParseFilterList(String filter, ref Int32 pos, ref Int32 len, ref RFC1960Token tok, ref String res)
        {
            List <BerValue> val = new List <BerValue>();

            val.Add(ParseFilter(filter, ref pos, ref len, ref tok, ref res));
            while (tok == RFC1960Token.OpeningParenthesis)
            {
                val.Add(ParseFilter(filter, ref pos, ref len, ref tok, ref res));
            }
            return(val.ToArray());
        }
示例#4
0
        internal static BerValue ParseFilter(String filter, ref Int32 pos, ref Int32 len, ref RFC1960Token tok, ref String res)
        {
            if (tok != RFC1960Token.OpeningParenthesis)
            {
                throw new LdapException("Opening parenthesis expected at " + pos);
            }
            RFC1960Next(filter, ref pos, ref len, out tok, out res);
            BerValue result;

            switch (tok)
            {
            case RFC1960Token.And:
                result = ParseAnd(filter, ref pos, ref len, ref tok, ref res);
                break;

            case RFC1960Token.Or:
                result = ParseOr(filter, ref pos, ref len, ref tok, ref res);
                break;

            case RFC1960Token.Not:
                result = ParseNot(filter, ref pos, ref len, ref tok, ref res);
                break;

            default:
                result = ParseSimple(filter, ref pos, ref len, ref tok, ref res);
                break;
            }

            if (tok != RFC1960Token.ClosingParenthesis)
            {
                throw new LdapException("Opening parenthesis expected at " + pos);
            }
            RFC1960Next(filter, ref pos, ref len, out tok, out res);
            return(result);
        }
示例#5
0
        private static String ParseValue(String filter, ref Int32 pos, ref Int32 len, ref RFC1960Token tok, ref String res)
        {
            if (tok != RFC1960Token.Value)
            {
                throw new LdapException("Value expected at " + pos);
            }
            String s = res;

            do
            {
                RFC1960Next(filter, ref pos, ref len, out tok, out res);
                switch (tok)
                {
                case RFC1960Token.Value:
                    s += res;
                    break;

                case RFC1960Token.And:
                case RFC1960Token.AproxEqual:
                case RFC1960Token.Equal:
                case RFC1960Token.GreaterOrEqual:
                case RFC1960Token.LessOrEqual:
                case RFC1960Token.Not:
                case RFC1960Token.Or:
                case RFC1960Token.Present:
                    s += filter.Substring(pos, len);
                    break;

                default:
                    return(s);
                }
            } while (true);
        }
示例#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;
        }
示例#7
0
        private static void RFC1960Next(String value, ref Int32 pos, ref Int32 len, out RFC1960Token tok, out String result)
        {
            pos   += len;
            len    = 0;
            result = null;

            switch (value[pos])
            {
            case '\0':
                tok = RFC1960Token.EOF;
                break;

            case '(':
                tok = RFC1960Token.OpeningParenthesis;
                len = 1;
                break;

            case ')':
                tok = RFC1960Token.ClosingParenthesis;
                len = 1;
                break;

            case '&':
                tok = RFC1960Token.And;
                len = 1;
                break;

            case '|':
                tok = RFC1960Token.Or;
                len = 1;
                break;

            case '!':
                tok = RFC1960Token.Not;
                len = 1;
                break;

            case '=':
                switch (value[pos + 1])
                {
                case '~':
                    len = 2;
                    tok = RFC1960Token.AproxEqual;
                    break;

                case '*':
                    len = 2;
                    tok = RFC1960Token.Present;
                    break;

                default:
                    len = 1;
                    tok = RFC1960Token.Equal;
                    break;
                }
                break;

            case '>':
                if (value[pos + 1] == '=')
                {
                    len = 2;
                    tok = RFC1960Token.GreaterOrEqual;
                    break;
                }
                len = 0;
                tok = RFC1960Token.Error;
                break;

            case '<':
                if (value[pos + 1] == '=')
                {
                    len = 2;
                    tok = RFC1960Token.LessOrEqual;
                    break;
                }
                len = 0;
                tok = RFC1960Token.Error;
                break;

            case '*':
                len = 1;
                tok = RFC1960Token.Any;
                break;

            default:
            {
                tok = RFC1960Token.Value;
                StringBuilder sb   = new StringBuilder(8);
                Boolean       stop = false;
                while (!stop)
                {
                    switch (value[pos + len])
                    {
                    case '<':
                    case '~':
                    case '>':
                    case '=':
                    case '\0':
                    case '*':
                    case '(':
                    case ')':
                    case '/':
                        stop = true;
                        break;

                    case '\\':
                        sb.Append((char)(Convert.ToByte(value[pos + len + 1].ToString()) * 16 +
                                         Convert.ToByte(value[pos + len + 2].ToString())));
                        len += 2;
                        break;

                    default:
                        sb.Append(value[pos + len]);
                        break;
                    }
                    len++;
                }
                len--;
                result = sb.ToString();
                break;
            }
            }
        }
示例#8
0
 private static BerValue[] ParseFilterList(String filter, ref Int32 pos, ref Int32 len, ref RFC1960Token tok, ref String res)
 {
     List<BerValue> val = new List<BerValue>();
     val.Add(ParseFilter(filter, ref pos, ref len, ref tok, ref res));
     while (tok == RFC1960Token.OpeningParenthesis)
         val.Add(ParseFilter(filter, ref pos, ref len, ref tok, ref res));
     return val.ToArray();
 }
示例#9
0
 private static BerValue ParseNot(String filter, ref Int32 pos, ref Int32 len, ref RFC1960Token tok, ref String res)
 {
     RFC1960Next(filter, ref pos, ref len, out tok, out res);
     return new BerSequence(Asn1.LDAPFILTERNOT, ParseFilter(filter, ref pos, ref len, ref tok, ref res));
 }
示例#10
0
 private static String ParseValue(String filter, ref Int32 pos, ref Int32 len, ref RFC1960Token tok, ref String res)
 {
     if (tok != RFC1960Token.Value)
         throw new LdapException("Value expected at " + pos);
     String s = res;
     do
     {
         RFC1960Next(filter, ref pos, ref len, out tok, out res);
         switch (tok)
         {
             case RFC1960Token.Value:
                 s += res;
                 break;
             case RFC1960Token.And:
             case RFC1960Token.AproxEqual:
             case RFC1960Token.Equal:
             case RFC1960Token.GreaterOrEqual:
             case RFC1960Token.LessOrEqual:
             case RFC1960Token.Not:
             case RFC1960Token.Or:
             case RFC1960Token.Present:
                 s += filter.Substring(pos, len);
                 break;
             default:
                 return s;
         }
     } while (true);
 }
示例#11
0
        internal static BerValue ParseFilter(String filter, ref Int32 pos, ref Int32 len, ref RFC1960Token tok, ref String res)
        {
            if (tok != RFC1960Token.OpeningParenthesis)
                throw new LdapException("Opening parenthesis expected at " + pos);
            RFC1960Next(filter, ref pos, ref len, out tok, out res);
            BerValue result;
            switch (tok)
            {
                case RFC1960Token.And:
                    result = ParseAnd(filter, ref pos, ref len, ref tok, ref res);
                    break;
                case RFC1960Token.Or:
                    result = ParseOr(filter, ref pos, ref len, ref tok, ref res);
                    break;
                case RFC1960Token.Not:
                    result = ParseNot(filter, ref pos, ref len, ref tok, ref res);
                    break;
                default:
                    result = ParseSimple(filter, ref pos, ref len, ref tok, ref res);
                    break;
            }

            if (tok != RFC1960Token.ClosingParenthesis)
                throw new LdapException("Opening parenthesis expected at " + pos);
            RFC1960Next(filter, ref pos, ref len, out tok, out res);
            return result;
        }
示例#12
0
        private static void RFC1960Next(String value, ref Int32 pos, ref Int32 len, out RFC1960Token tok, out String result)
        {
            pos += len;
            len = 0;
            result = null;

            switch (value[pos])
            {
                case '\0':
                    tok = RFC1960Token.EOF;
                    break;
                case '(':
                    tok = RFC1960Token.OpeningParenthesis;
                    len = 1;
                    break;
                case ')':
                    tok = RFC1960Token.ClosingParenthesis;
                    len = 1;
                    break;
                case '&':
                    tok = RFC1960Token.And;
                    len = 1;
                    break;
                case '|':
                    tok = RFC1960Token.Or;
                    len = 1;
                    break;
                case '!':
                    tok = RFC1960Token.Not;
                    len = 1;
                    break;
                case '=':
                    switch (value[pos + 1])
                    {
                        case '~':
                            len = 2;
                            tok = RFC1960Token.AproxEqual;
                            break;
                        case '*':
                            len = 2;
                            tok = RFC1960Token.Present;
                            break;
                        default:
                            len = 1;
                            tok = RFC1960Token.Equal;
                            break;
                    }
                    break;
                case '>':
                    if (value[pos + 1] == '=')
                    {
                        len = 2;
                        tok = RFC1960Token.GreaterOrEqual;
                        break;
                    }
                    len = 0;
                    tok = RFC1960Token.Error;
                    break;
                case '<':
                    if (value[pos + 1] == '=')
                    {
                        len = 2;
                        tok = RFC1960Token.LessOrEqual;
                        break;
                    }
                    len = 0;
                    tok = RFC1960Token.Error;
                    break;

                case '*':
                    len = 1;
                    tok = RFC1960Token.Any;
                    break;
                default:
                    {
                        tok = RFC1960Token.Value;
                        StringBuilder sb = new StringBuilder(8);
                        Boolean stop = false;
                        while (!stop)
                        {
                            switch (value[pos + len])
                            {
                                case '<':
                                case '~':
                                case '>':
                                case '=':
                                case '\0':
                                case '*':
                                case '(':
                                case ')':
                                case '/':
                                    stop = true;
                                    break;
                                case '\\':
                                    sb.Append((char)(Byte.Parse(value[pos + len + 1].ToString()) * 16 +
                                    Byte.Parse(value[pos + len + 2].ToString())));
                                    len += 2;
                                    break;
                                default:
                                    sb.Append(value[pos + len]);
                                    break;


                            }
                            len++;
                        }
                        len--;
                        result = sb.ToString();
                        break;
                    }

            }
        }