1 /******************************************************************************
3 * Copyright (c) 2003 Novell Inc., www.novell.com
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and associated documentation files (the Software), to deal
7 * in the Software without restriction, including without limitation the rights
8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 * copies of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
15 * THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 *******************************************************************************/
25 // System.DirectoryServices.DirectoryEntries.cs
28 // Sunil Kumar (sunilk@novell.com)
33 using System
.Collections
;
34 using Novell
.Directory
.Ldap
;
36 namespace System
.DirectoryServices
40 ///Contains the children (child entries) of an entry in
43 public class DirectoryEntries
: IEnumerable
45 private LdapConnection _Conn
=null;
46 private string _Bpath
=null;
47 private string _Buser
=null;
48 private string _Bpass
=null;
49 private string _Basedn
=null;
50 private ArrayList m_oValues
=null;
53 /// <summary> Initializes the Connection and other properties.
56 private void InitBlock()
59 LdapUrl lUrl
=new LdapUrl(_Bpath
);
60 _Conn
= new LdapConnection();
61 _Conn
.Connect(lUrl
.Host
,lUrl
.Port
);
62 _Conn
.Bind(_Buser
,_Bpass
);
64 catch(LdapException ex
) {
65 Console
.WriteLine("Error:" + ex
.LdapErrorMessage
);
69 Console
.WriteLine("Error:" + e
.Message
);
74 internal string Basedn
77 if( _Basedn
== null) {
78 // Console.WriteLine("Basepath:" + _Bpath);
79 LdapUrl lurl
=new LdapUrl(_Bpath
);
80 string bdn
= lurl
.getDN();
90 /// <summary> Contains the Path of the Container under which
91 /// the entries belongs to.
103 /// <summary> Returns the connection object used to communicate with
106 internal LdapConnection Conn
119 /// <summary> Constructs a collection of all the child entries of
122 /// <param name="path"> Path of the entry
124 /// <param name="uname"> Username to Bind as while authenticating to ldap
126 /// <param name="passwd"> Password of the user</param>
127 internal DirectoryEntries(string path
, string uname
, string passwd
)
134 /// <summary> Constructs a collection of all the child entries of
137 /// <param name="path"> Path of the entry
139 /// <param name="lc"> connection object used to connect to ldap server
141 internal DirectoryEntries(string path
, LdapConnection lc
)
147 public SchemaNameCollection SchemaFilter
{
149 get { throw new NotImplementedException ("System.DirectoryServices.DirectoryEntries.SchemaFilter"); }
152 public IEnumerator
GetEnumerator()
154 m_oValues
= new ArrayList();
155 string[] attrs
={"objectClass"}
;
156 // Console.WriteLine("BaseDN is:" + Basedn);
157 LdapSearchResults lsc
= Conn
.Search( Basedn
,
158 LdapConnection
.SCOPE_ONE
,
163 LdapUrl Burl
=new LdapUrl(_Bpath
);
164 string host
=Burl
.Host
;
167 while (lsc
.hasMore()) {
168 LdapEntry nextEntry
= null;
170 nextEntry
= lsc
.next();
172 catch(LdapException e
) {
173 Console
.WriteLine("Error: " + e
.LdapErrorMessage
);
174 // Exception is thrown, go for next entry
177 DirectoryEntry dEntry
=new DirectoryEntry(Conn
);
178 string eFdn
=nextEntry
.DN
;
179 LdapUrl curl
=new LdapUrl(host
,port
,eFdn
);
180 dEntry
.Path
=curl
.ToString();
181 m_oValues
.Add((DirectoryEntry
) dEntry
);
183 return m_oValues
.GetEnumerator();
186 /// <summary> Creates a request to create a new entry in the container.
189 /// <param name="name"> RDN of the entry to be created
191 /// <param name="schemaClassName"> StructuralClassName of the entry to be
194 public DirectoryEntry
Add( string name
,string schemaClassName
)
196 DirectoryEntry ent
=new DirectoryEntry(Conn
);
197 LdapUrl Burl
=new LdapUrl(_Bpath
);
198 string eFdn
=name
+","+Burl
.getDN();
199 LdapUrl curl
=new LdapUrl(Burl
.Host
,Burl
.Port
,eFdn
);
200 ent
.Path
=curl
.ToString();
202 ent
.Properties
["objectclass"].Add(schemaClassName
);
207 /// Deletes a child DirectoryEntry from this collection
209 /// <param name="entry">The DirectoryEntry to delete</param>
210 public void Remove( DirectoryEntry entry
)
212 LdapUrl Burl
=new LdapUrl(_Bpath
);
213 string eFDN
= entry
.Name
+ "," + Burl
.getDN();
218 /// Returns the child with the specified name.
220 /// <param name="filter">relative distinguised name of the child
222 /// <returns>Child entry with the specified name </returns>
223 public DirectoryEntry
Find(string filter
)
225 DirectoryEntry child
=CheckEntry(filter
);
230 /// Returns the child with the specified name and of the specified type.
232 /// <param name="filter">relative distinguised name of the child
234 /// <param name="otype"> Type of the child i.e strutcuralObjectClass
235 /// name of the child </param>
236 /// <returns>Child entry with the specified name and type</returns>
237 public DirectoryEntry
Find(string filter
, string otype
)
239 DirectoryEntry child
=CheckEntry(filter
);
242 if(child
.Properties
["objectclass"].ContainsCaselessStringValue(otype
))
245 throw new Exception("An unknown directory object was requested");
251 /// Checks whether the entry with the specified Relative distinguised name
254 /// <param name="rdn"> Relative distinguished name of the entry</param>
255 /// <returns>DirectoryEntry object of Entry if entry exists,
256 /// Null if entry doesn't exist </returns>
257 private DirectoryEntry
CheckEntry(string rdn
)
260 DirectoryEntry cEntry
=null;
263 string[] attrs
={"objectClass"}
;
265 LdapSearchResults lsc
= Conn
.Search( Ofdn
,
266 LdapConnection
.SCOPE_BASE
,
270 while(lsc
.hasMore()) {
271 LdapEntry nextEntry
= null;
273 nextEntry
= lsc
.next();
274 cEntry
= new DirectoryEntry(Conn
);
275 LdapUrl Burl
=new LdapUrl(_Bpath
);
276 LdapUrl curl
=new LdapUrl(Burl
.Host
,Burl
.Port
,Ofdn
);
277 cEntry
.Path
=curl
.ToString();
279 catch(LdapException e
) {
280 Console
.WriteLine("Error: " + e
.LdapErrorMessage
);
281 // Exception is thrown, go for next entry
288 catch(LdapException le
)
290 if(le
.ResultCode
== LdapException
.NO_SUCH_OBJECT
) {