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); }
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))); }
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()); }
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); }
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); }
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; }
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; } } }
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(); }
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)); }
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); }
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; }
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; } } }