Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

683 lines
16 KiB
C#

/******************************************************************************
* The MIT License
* Copyright (c) 2003 Novell Inc. www.novell.com
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the Software), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*******************************************************************************/
//
// Novell.Directory.Ldap.LdapAttributeSchema.cs
//
// Author:
// Sunil Kumar (Sunilk@novell.com)
//
// (C) 2003 Novell, Inc (http://www.novell.com)
//
using System;
using LdapObjectClassSchema = Novell.Directory.Ldap.LdapObjectClassSchema;
using LdapAttributeSchema = Novell.Directory.Ldap.LdapAttributeSchema;
namespace Novell.Directory.Ldap.Utilclass
{
public class SchemaParser
{
private void InitBlock()
{
usage = LdapAttributeSchema.USER_APPLICATIONS;
qualifiers = new System.Collections.ArrayList();
}
virtual public System.String RawString
{
get
{
return rawString;
}
set
{
this.rawString = value;
}
}
virtual public System.String[] Names
{
get
{
return names;
}
}
virtual public System.Collections.IEnumerator Qualifiers
{
get
{
return qualifiers.GetEnumerator();
}
}
virtual public System.String ID
{
get
{
return id;
}
}
virtual public System.String Description
{
get
{
return description;
}
}
virtual public System.String Syntax
{
get
{
return syntax;
}
}
virtual public System.String Superior
{
get
{
return superior;
}
}
virtual public bool Single
{
get
{
return single;
}
}
virtual public bool Obsolete
{
get
{
return obsolete;
}
}
virtual public System.String Equality
{
get
{
return equality;
}
}
virtual public System.String Ordering
{
get
{
return ordering;
}
}
virtual public System.String Substring
{
get
{
return substring;
}
}
virtual public bool Collective
{
get
{
return collective;
}
}
virtual public bool UserMod
{
get
{
return userMod;
}
}
virtual public int Usage
{
get
{
return usage;
}
}
virtual public int Type
{
get
{
return type;
}
}
virtual public System.String[] Superiors
{
get
{
return superiors;
}
}
virtual public System.String[] Required
{
get
{
return required;
}
}
virtual public System.String[] Optional
{
get
{
return optional;
}
}
virtual public System.String[] Auxiliary
{
get
{
return auxiliary;
}
}
virtual public System.String[] Precluded
{
get
{
return precluded;
}
}
virtual public System.String[] Applies
{
get
{
return applies;
}
}
virtual public System.String NameForm
{
get
{
return nameForm;
}
}
virtual public System.String ObjectClass
{
get
{
return nameForm;
}
}
internal System.String rawString;
internal System.String[] names = null;
internal System.String id;
internal System.String description;
internal System.String syntax;
internal System.String superior;
internal System.String nameForm;
internal System.String objectClass;
internal System.String[] superiors;
internal System.String[] required;
internal System.String[] optional;
internal System.String[] auxiliary;
internal System.String[] precluded;
internal System.String[] applies;
internal bool single = false;
internal bool obsolete = false;
internal System.String equality;
internal System.String ordering;
internal System.String substring;
internal bool collective = false;
internal bool userMod = true;
internal int usage;
internal int type = - 1;
internal int result;
internal System.Collections.ArrayList qualifiers;
public SchemaParser(System.String aString)
{
InitBlock();
int index;
if ((index = aString.IndexOf((System.Char) '\\')) != - 1)
{
/*
* Unless we escape the slash, StreamTokenizer will interpret the
* single slash and convert it assuming octal values.
* Two successive back slashes are intrepreted as one backslash.
*/
System.Text.StringBuilder newString = new System.Text.StringBuilder(aString.Substring(0, (index) - (0)));
for (int i = index; i < aString.Length; i++)
{
newString.Append(aString[i]);
if (aString[i] == '\\')
{
newString.Append('\\');
}
}
rawString = newString.ToString();
}
else
{
rawString = aString;
}
SchemaTokenCreator st2 = new SchemaTokenCreator(new System.IO.StringReader(rawString));
st2.OrdinaryCharacter('.');
st2.OrdinaryCharacters('0', '9');
st2.OrdinaryCharacter('{');
st2.OrdinaryCharacter('}');
st2.OrdinaryCharacter('_');
st2.OrdinaryCharacter(';');
st2.WordCharacters('.', '9');
st2.WordCharacters('{', '}');
st2.WordCharacters('_', '_');
st2.WordCharacters(';', ';');
//First parse out the OID
try
{
System.String currName;
if ((int)TokenTypes.EOF != st2.nextToken())
{
if (st2.lastttype == '(')
{
if ((int)TokenTypes.WORD == st2.nextToken())
{
id = st2.StringValue;
}
while ((int)TokenTypes.EOF != st2.nextToken())
{
if (st2.lastttype == (int)TokenTypes.WORD)
{
if (st2.StringValue.ToUpper().Equals("NAME".ToUpper()))
{
if (st2.nextToken() == '\'')
{
names = new System.String[1];
names[0] = st2.StringValue;
}
else
{
if (st2.lastttype == '(')
{
System.Collections.ArrayList nameList = new System.Collections.ArrayList();
while (st2.nextToken() == '\'')
{
if ((System.Object) st2.StringValue != null)
{
nameList.Add(st2.StringValue);
}
}
if (nameList.Count > 0)
{
names = new System.String[nameList.Count];
SupportClass.ArrayListSupport.ToArray(nameList, names);
}
}
}
continue;
}
if (st2.StringValue.ToUpper().Equals("DESC".ToUpper()))
{
if (st2.nextToken() == '\'')
{
description = st2.StringValue;
}
continue;
}
if (st2.StringValue.ToUpper().Equals("SYNTAX".ToUpper()))
{
result = st2.nextToken();
if ((result == (int)TokenTypes.WORD) || (result == '\''))
//Test for non-standard schema
{
syntax = st2.StringValue;
}
continue;
}
if (st2.StringValue.ToUpper().Equals("EQUALITY".ToUpper()))
{
if (st2.nextToken() == (int)TokenTypes.WORD)
{
equality = st2.StringValue;
}
continue;
}
if (st2.StringValue.ToUpper().Equals("ORDERING".ToUpper()))
{
if (st2.nextToken() == (int)TokenTypes.WORD)
{
ordering = st2.StringValue;
}
continue;
}
if (st2.StringValue.ToUpper().Equals("SUBSTR".ToUpper()))
{
if (st2.nextToken() == (int)TokenTypes.WORD)
{
substring = st2.StringValue;
}
continue;
}
if (st2.StringValue.ToUpper().Equals("FORM".ToUpper()))
{
if (st2.nextToken() == (int)TokenTypes.WORD)
{
nameForm = st2.StringValue;
}
continue;
}
if (st2.StringValue.ToUpper().Equals("OC".ToUpper()))
{
if (st2.nextToken() == (int)TokenTypes.WORD)
{
objectClass = st2.StringValue;
}
continue;
}
if (st2.StringValue.ToUpper().Equals("SUP".ToUpper()))
{
System.Collections.ArrayList values = new System.Collections.ArrayList();
st2.nextToken();
if (st2.lastttype == '(')
{
st2.nextToken();
while (st2.lastttype != ')')
{
if (st2.lastttype != '$')
{
values.Add(st2.StringValue);
}
st2.nextToken();
}
}
else
{
values.Add(st2.StringValue);
superior = st2.StringValue;
}
if (values.Count > 0)
{
superiors = new System.String[values.Count];
SupportClass.ArrayListSupport.ToArray(values, superiors);
}
continue;
}
if (st2.StringValue.ToUpper().Equals("SINGLE-VALUE".ToUpper()))
{
single = true;
continue;
}
if (st2.StringValue.ToUpper().Equals("OBSOLETE".ToUpper()))
{
obsolete = true;
continue;
}
if (st2.StringValue.ToUpper().Equals("COLLECTIVE".ToUpper()))
{
collective = true;
continue;
}
if (st2.StringValue.ToUpper().Equals("NO-USER-MODIFICATION".ToUpper()))
{
userMod = false;
continue;
}
if (st2.StringValue.ToUpper().Equals("MUST".ToUpper()))
{
System.Collections.ArrayList values = new System.Collections.ArrayList();
st2.nextToken();
if (st2.lastttype == '(')
{
st2.nextToken();
while (st2.lastttype != ')')
{
if (st2.lastttype != '$')
{
values.Add(st2.StringValue);
}
st2.nextToken();
}
}
else
{
values.Add(st2.StringValue);
}
if (values.Count > 0)
{
required = new System.String[values.Count];
SupportClass.ArrayListSupport.ToArray(values, required);
}
continue;
}
if (st2.StringValue.ToUpper().Equals("MAY".ToUpper()))
{
System.Collections.ArrayList values = new System.Collections.ArrayList();
st2.nextToken();
if (st2.lastttype == '(')
{
st2.nextToken();
while (st2.lastttype != ')')
{
if (st2.lastttype != '$')
{
values.Add(st2.StringValue);
}
st2.nextToken();
}
}
else
{
values.Add(st2.StringValue);
}
if (values.Count > 0)
{
optional = new System.String[values.Count];
SupportClass.ArrayListSupport.ToArray(values, optional);
}
continue;
}
if (st2.StringValue.ToUpper().Equals("NOT".ToUpper()))
{
System.Collections.ArrayList values = new System.Collections.ArrayList();
st2.nextToken();
if (st2.lastttype == '(')
{
st2.nextToken();
while (st2.lastttype != ')')
{
if (st2.lastttype != '$')
{
values.Add(st2.StringValue);
}
st2.nextToken();
}
}
else
{
values.Add(st2.StringValue);
}
if (values.Count > 0)
{
precluded = new System.String[values.Count];
SupportClass.ArrayListSupport.ToArray(values, precluded);
}
continue;
}
if (st2.StringValue.ToUpper().Equals("AUX".ToUpper()))
{
System.Collections.ArrayList values = new System.Collections.ArrayList();
st2.nextToken();
if (st2.lastttype == '(')
{
st2.nextToken();
while (st2.lastttype != ')')
{
if (st2.lastttype != '$')
{
values.Add(st2.StringValue);
}
st2.nextToken();
}
}
else
{
values.Add(st2.StringValue);
}
if (values.Count > 0)
{
auxiliary = new System.String[values.Count];
SupportClass.ArrayListSupport.ToArray(values, auxiliary);
}
continue;
}
if (st2.StringValue.ToUpper().Equals("ABSTRACT".ToUpper()))
{
type = LdapObjectClassSchema.ABSTRACT;
continue;
}
if (st2.StringValue.ToUpper().Equals("STRUCTURAL".ToUpper()))
{
type = LdapObjectClassSchema.STRUCTURAL;
continue;
}
if (st2.StringValue.ToUpper().Equals("AUXILIARY".ToUpper()))
{
type = LdapObjectClassSchema.AUXILIARY;
continue;
}
if (st2.StringValue.ToUpper().Equals("USAGE".ToUpper()))
{
if (st2.nextToken() == (int)TokenTypes.WORD)
{
currName = st2.StringValue;
if (currName.ToUpper().Equals("directoryOperation".ToUpper()))
{
usage = LdapAttributeSchema.DIRECTORY_OPERATION;
}
else if (currName.ToUpper().Equals("distributedOperation".ToUpper()))
{
usage = LdapAttributeSchema.DISTRIBUTED_OPERATION;
}
else if (currName.ToUpper().Equals("dSAOperation".ToUpper()))
{
usage = LdapAttributeSchema.DSA_OPERATION;
}
else if (currName.ToUpper().Equals("userApplications".ToUpper()))
{
usage = LdapAttributeSchema.USER_APPLICATIONS;
}
}
continue;
}
if (st2.StringValue.ToUpper().Equals("APPLIES".ToUpper()))
{
System.Collections.ArrayList values = new System.Collections.ArrayList();
st2.nextToken();
if (st2.lastttype == '(')
{
st2.nextToken();
while (st2.lastttype != ')')
{
if (st2.lastttype != '$')
{
values.Add(st2.StringValue);
}
st2.nextToken();
}
}
else
{
values.Add(st2.StringValue);
}
if (values.Count > 0)
{
applies = new System.String[values.Count];
SupportClass.ArrayListSupport.ToArray(values, applies);
}
continue;
}
currName = st2.StringValue;
AttributeQualifier q = parseQualifier(st2, currName);
if (q != null)
{
qualifiers.Add(q);
}
continue;
}
}
}
}
}
catch (System.IO.IOException e)
{
throw e;
}
}
private AttributeQualifier parseQualifier(SchemaTokenCreator st, System.String name)
{
System.Collections.ArrayList values = new System.Collections.ArrayList(5);
try
{
if (st.nextToken() == '\'')
{
values.Add(st.StringValue);
}
else
{
if (st.lastttype == '(')
{
while (st.nextToken() == '\'')
{
values.Add(st.StringValue);
}
}
}
}
catch (System.IO.IOException e)
{
throw e;
}
System.String[] valArray = new System.String[values.Count];
valArray = (System.String[]) SupportClass.ArrayListSupport.ToArray(values, valArray);
return new AttributeQualifier(name, valArray);
}
}
}