ROOT logo
// @(#)root/ldap:$Id: TLDAPServer.cxx 41671 2011-11-01 14:50:23Z rdm $
// Author: Oleksandr Grebenyuk   21/09/2001

/*************************************************************************
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TLDAPServer.h"
#include "TLDAPResult.h"
#include "TLDAPEntry.h"
#include "TLDAPAttribute.h"
#include "TObjString.h"
#include "TList.h"
#include "TError.h"


ClassImp(TLDAPServer)

//______________________________________________________________________________
TLDAPServer::TLDAPServer(const char *host, Int_t port, const char *binddn,
                         const char *password, Int_t version)
{
   // During construction TLDAPServer object tries to connect to the
   // specified server and you should check the connection status by
   // calling the IsConnected() member function immediately after
   // creating that object.
   // const char *host:     The name of host to connect. Default is "localhost".
   // Int_t port:           Port number to connect. Default is LDAP_PORT (=389).
   // const char *binddn:   Bind DN.
   // const char *password: Password. Usually you have to specify bind DN and
   //                       password to have the write permissions. Default
   //                       values for bind DN and password are zero, that means
   //                       anonymous connection. Usually it is enough to read
   //                       the data from the server.
   //  Int_t version        Set LDAP protocol version: LDAP_VERSION1,
   //                       LDAP_VERSION2, LDAP_VERSION3

   fLd          = 0;
   fIsConnected = kFALSE;
   fBinddn      = binddn;
   fPassword    = password;

   fLd = ldap_init(host, port);
   if (!fLd) {
      Error("TLDAPServer", "error in ldap_init function");
   } else {
      if (ldap_set_option(fLd, LDAP_OPT_PROTOCOL_VERSION, &version) != LDAP_OPT_SUCCESS ) {
         Error("Bind", "Could not set protocol version!");
         return;
      }

      Bind( );
   }
}

//______________________________________________________________________________
TLDAPServer::TLDAPServer(const TLDAPServer& lds) :
   TObject(lds),
   fLd(lds.fLd),
   fBinddn(lds.fBinddn),
   fPassword(lds.fPassword),
   fIsConnected(lds.fIsConnected)
{
   // Copy constructor
}

//______________________________________________________________________________
TLDAPServer& TLDAPServer::operator=(const TLDAPServer& lds)
{
   // Equal operator
   if(this!=&lds) {
      TObject::operator=(lds);
      fLd=lds.fLd;
      fBinddn=lds.fBinddn;
      fPassword=lds.fPassword;
      fIsConnected=lds.fIsConnected;
   } return *this;
}

//______________________________________________________________________________
TLDAPServer::~TLDAPServer()
{
   // If the object is connected to the server, it disconnects.

   Unbind();
}

//______________________________________________________________________________
Int_t TLDAPServer::Bind()
{
   // Binds to the server with specified binddn and password.
   // Return value: LDAP error code, 0 if successfully bound.

   if (!IsConnected()) {
      Int_t result = ldap_simple_bind_s(fLd, fBinddn.Data(), fPassword.Data());
      if (result != LDAP_SUCCESS) {
         ldap_unbind(fLd);
         fIsConnected = kFALSE;
         switch (result) {
            case LDAP_INVALID_CREDENTIALS:
               Error("Bind", "invalid password");
               break;
            case LDAP_INAPPROPRIATE_AUTH:
               Error("Bind", "entry has no password to check");
               break;
            default :
               Error("Bind", "%s", ldap_err2string(result));
               break;
         }
      } else {
         fIsConnected = kTRUE;
      }
      return result;
   }
   return 0;
}

//______________________________________________________________________________
void TLDAPServer::Unbind()
{
   // Unbinds from the server with specified binddn and password.

   if (IsConnected()) {
      ldap_unbind(fLd);
      fIsConnected = kFALSE;
   }
}

//______________________________________________________________________________
const char *TLDAPServer::GetNamingContexts()
{
   // Performs an LDAPSearch with the attribute "namingContexts" to be
   // returned with the result. The value of this attribute is
   // extracted and returned as const char.

   TList *attrs = new TList;
   attrs->SetOwner();
   attrs->AddLast(new TObjString("namingContexts"));
   const char *namingcontexts = 0;

   TLDAPResult *result = Search("", LDAP_SCOPE_BASE, 0, attrs, 0);

   if (result) {
      TLDAPEntry *entry = result->GetNext();
      if (entry) {
         TLDAPAttribute *attribute = entry->GetAttribute();
         if (attribute)
            namingcontexts = attribute->GetValue();
         delete entry;
      }
      delete result;
   }
   delete attrs;

   return namingcontexts;
}

//______________________________________________________________________________
const char *TLDAPServer::GetSubschemaSubentry()
{
   // Performs an LDAPSearch with the attribute "subschemaSubentry" to
   // be returned with the result. The value of this attribute is
   // extracted and returned as const char.

   TList *attrs = new TList;
   attrs->SetOwner();
   attrs->AddLast(new TObjString("subschemaSubentry"));
   const char *subschema = 0;

   TLDAPResult *result = Search("", LDAP_SCOPE_BASE, 0, attrs, 0);

   if (result) {
      TLDAPEntry *entry = result->GetNext();
      if (entry) {
         TLDAPAttribute *attribute = entry->GetAttribute();
         if (attribute)
            subschema = attribute->GetValue();
         delete entry;
      }
      delete result;
   }
   delete attrs;

   return subschema;
}

//______________________________________________________________________________
TLDAPResult *TLDAPServer::GetObjectClasses()
{
   // Calls GetSubschemaSubentry() and performs and LDAPSearch with
   // the attribute "objectClasses" to be returned with the result.
   // The returned result object must be deleted by the user.

   const char *subschema = GetSubschemaSubentry();

   TList *attrs = new TList;
   attrs->SetOwner();
   attrs->AddLast(new TObjString("objectClasses"));

   TLDAPResult *result = Search(subschema, LDAP_SCOPE_BASE, 0, attrs, 0);

   delete attrs;

   return result;
}

//______________________________________________________________________________
TLDAPResult *TLDAPServer::GetAttributeTypes()
{
   // Calls GetSubschemaSubentry() and performs and LDAPSearch with the
   // attribute "attributeTypes" to be returned with the result.
   // The returned result object must be deleted by the user.

   const char *subschema = GetSubschemaSubentry();

   TList *attrs = new TList;
   attrs->SetOwner();
   attrs->AddLast(new TObjString("attributeTypes"));

   TLDAPResult *result = Search(subschema, LDAP_SCOPE_BASE, 0, attrs, 0);

   delete attrs;

   return result;
}

//______________________________________________________________________________
TLDAPResult *TLDAPServer::Search(const char *base, Int_t scope,
                                 const char *filter, TList *attrs,
                                 Bool_t attrsonly)
{
   // Performs searching at the LDAP directory.
   // Return value:     a TLDAPResult object or 0 in case of error.
   //                   Result needs to be deleted by user.
   // const char *base: Specifies the base object for the search operation
   // Int_t scope:      Specifies the portion of the LDAP tree, relative to
   //                   the base object, to search.
   //                   Must be one of LDAP_SCOPE_BASE (==0),
   //                   LDAP_SCOPE_ONELEVEL (==1) or LDAP_SCOPE_SUBTREE (==2).
   // char *filter:     The criteria during the search to determine which
   //                   entries to return, 0 means that the filter
   //                   "(objectclass=*)" will be applied
   // TList *attrs:     The TList of attributes to be returned along with
   //                   each entry, 0 means that all available attributes
   //                   should be returned.
   // Int_t attrsonly:  This parameter is a boolean specifying whether both
   //                   types and values should be returned with each
   //                   attribute (zero) or types only should be returned
   //                   (non-zero).

   Bind();

   Int_t errcode;
   TLDAPResult *result = 0;

   if (IsConnected()) {

      LDAPMessage *searchresult;
      char **attrslist = 0;
      if (attrs) {
         Int_t n = attrs->GetSize();
         attrslist = new char* [n + 1];
         for (Int_t i = 0; i < n; i++)
            attrslist[i] = (char*) ((TObjString*)attrs->At(i))->GetName();
         attrslist[n] = 0;
      }
      if (filter == 0)
         filter = "(objectClass=*)";

      errcode = ldap_search_s(fLd, base, scope, filter, attrslist,
                              attrsonly, &searchresult);

      delete [] attrslist;

      if (errcode == LDAP_SUCCESS) {
         result = new TLDAPResult(fLd, searchresult);
      } else {
         ldap_msgfree(searchresult);
         Error("Search", "%s", ldap_err2string(errcode));
      }

   } else {
      errcode = LDAP_SERVER_DOWN;
      Error("Search", "%s", "server is not connected");
   }

   return result;
}

//______________________________________________________________________________
Int_t TLDAPServer::AddEntry(TLDAPEntry &entry)
{
   // Adds entry to the LDAP tree.
   // Be sure that you are bound with write permissions.
   // Return value: LDAP error code.

   Bind();

   Int_t errcode;
   if (IsConnected()) {
      LDAPMod **ms = entry.GetMods(0);
      errcode = ldap_add_s(fLd, entry.GetDn(), ms);
      TLDAPServer::DeleteMods(ms);
      if (errcode != LDAP_SUCCESS)
         Error("AddEntry", "%s", ldap_err2string(errcode));
   } else {
      errcode = LDAP_SERVER_DOWN;
      Error("AddEntry", "server is not connected");
   }
   return errcode;
}

//______________________________________________________________________________
Int_t TLDAPServer::ModifyEntry(TLDAPEntry &entry, Int_t mode)
{
   // Modifies specified entry.
   // Be sure that you are bound with write permissions.
   // Return value:      LDAP error code, 0 = success.
   // TLDAPEntry &entry: Entry to be modified.
   // Int_t mode:        Modifying mode.
   //                    Should be one of LDAP_MOD_ADD (==0),
   //                    LDAP_MOD_DELETE (==1) or LDAP_MOD_REPLACE (==2)
   //                    Specifies what to do with all the entry's attributes
   //                    and its values - add to the corresponding entry on
   //                    the server, delete from it, or replace the
   //                    corresponding attributes with new values

   Bind();

   Int_t errcode;
   if (IsConnected()) {
      LDAPMod **ms = entry.GetMods(mode);
      errcode = ldap_modify_s(fLd, entry.GetDn(), ms);
      TLDAPServer::DeleteMods(ms);
      if (errcode != LDAP_SUCCESS)
         Error("ModifyEntry", "%s", ldap_err2string(errcode));
   } else {
      errcode = LDAP_SERVER_DOWN;
      Error("ModifyEntry", "server is not connected");
   }
   return errcode;
}

//______________________________________________________________________________
Int_t TLDAPServer::DeleteEntry(const char *dn)
{
   // Deletes the entry with specified DN, the base entry must exist.
   // Be sure that you are bound with write permissions.
   // Return value: LDAP error code, 0 = succes.

   Bind();

   Int_t errcode;
   if (IsConnected()) {
      errcode = ldap_delete_s(fLd, dn);
      if (errcode != LDAP_SUCCESS)
         Error("DeleteEntry", "%s", ldap_err2string(errcode));
   } else {
      errcode = LDAP_SERVER_DOWN;
      Error("DeleteEntry", "server is not connected");
   }
   return errcode;
}

//______________________________________________________________________________
Int_t TLDAPServer::RenameEntry(const char *dn, const char *newrdn, Bool_t removeattr)
{
   // Renames the entry with specified DN, the entry must be leaf
   // Be sure that you are bound with the write permissions
   // Return value:      LDAP error code, 0 = succes
   // char *dn:          Distinguished name of entry to be renamed.
   //                    This entry must be a leaf in the LDAP directory tree.
   // char *newrdn:      The new relative distinguished name to give the entry
   //                    being renamed.
   // Bool_t removeattr: This parameter specifies whether or not the
   //                    attribute values in the old relative distinguished
   //                    name should be removed from the entry
   //                    or retained as non-distinguished attributes.

   Int_t errcode;
   if (IsConnected()) {
      errcode = ldap_modrdn2_s(fLd, dn, newrdn, removeattr);
      if (errcode != LDAP_SUCCESS)
         Error( "RenameEntry", "%s", ldap_err2string(errcode));
   } else {
      errcode = LDAP_SERVER_DOWN;
      Error("RenameEntry", "server is not connected");
   }
   return errcode;
}

//______________________________________________________________________________
void TLDAPServer::DeleteMods(LDAPMod **mods)
{
   // Deletes the array of LDAPMod structures and frees its memory.
   // LDAPMod **mods: Pointer to the zero-terminated array of pointers
   //                 to LDAPMod structures

#if 1
   ldap_mods_free(mods, 1);
#else
   Int_t i = 0;
   LDAPMod *mod;
   while ((mod = mods[i++]) != 0) {
      if (mod->mod_op & LDAP_MOD_BVALUES) {
         ber_bvecfree(mod->mod_bvalues);
      } else {
         Int_t j = 0;
         char *c;
         while ((c = mod->mod_values[j++]) != 0)
            delete c;
      }
      delete mod->mod_type;
      delete mod;
   }
   delete mods;
#endif
}
 TLDAPServer.cxx:1
 TLDAPServer.cxx:2
 TLDAPServer.cxx:3
 TLDAPServer.cxx:4
 TLDAPServer.cxx:5
 TLDAPServer.cxx:6
 TLDAPServer.cxx:7
 TLDAPServer.cxx:8
 TLDAPServer.cxx:9
 TLDAPServer.cxx:10
 TLDAPServer.cxx:11
 TLDAPServer.cxx:12
 TLDAPServer.cxx:13
 TLDAPServer.cxx:14
 TLDAPServer.cxx:15
 TLDAPServer.cxx:16
 TLDAPServer.cxx:17
 TLDAPServer.cxx:18
 TLDAPServer.cxx:19
 TLDAPServer.cxx:20
 TLDAPServer.cxx:21
 TLDAPServer.cxx:22
 TLDAPServer.cxx:23
 TLDAPServer.cxx:24
 TLDAPServer.cxx:25
 TLDAPServer.cxx:26
 TLDAPServer.cxx:27
 TLDAPServer.cxx:28
 TLDAPServer.cxx:29
 TLDAPServer.cxx:30
 TLDAPServer.cxx:31
 TLDAPServer.cxx:32
 TLDAPServer.cxx:33
 TLDAPServer.cxx:34
 TLDAPServer.cxx:35
 TLDAPServer.cxx:36
 TLDAPServer.cxx:37
 TLDAPServer.cxx:38
 TLDAPServer.cxx:39
 TLDAPServer.cxx:40
 TLDAPServer.cxx:41
 TLDAPServer.cxx:42
 TLDAPServer.cxx:43
 TLDAPServer.cxx:44
 TLDAPServer.cxx:45
 TLDAPServer.cxx:46
 TLDAPServer.cxx:47
 TLDAPServer.cxx:48
 TLDAPServer.cxx:49
 TLDAPServer.cxx:50
 TLDAPServer.cxx:51
 TLDAPServer.cxx:52
 TLDAPServer.cxx:53
 TLDAPServer.cxx:54
 TLDAPServer.cxx:55
 TLDAPServer.cxx:56
 TLDAPServer.cxx:57
 TLDAPServer.cxx:58
 TLDAPServer.cxx:59
 TLDAPServer.cxx:60
 TLDAPServer.cxx:61
 TLDAPServer.cxx:62
 TLDAPServer.cxx:63
 TLDAPServer.cxx:64
 TLDAPServer.cxx:65
 TLDAPServer.cxx:66
 TLDAPServer.cxx:67
 TLDAPServer.cxx:68
 TLDAPServer.cxx:69
 TLDAPServer.cxx:70
 TLDAPServer.cxx:71
 TLDAPServer.cxx:72
 TLDAPServer.cxx:73
 TLDAPServer.cxx:74
 TLDAPServer.cxx:75
 TLDAPServer.cxx:76
 TLDAPServer.cxx:77
 TLDAPServer.cxx:78
 TLDAPServer.cxx:79
 TLDAPServer.cxx:80
 TLDAPServer.cxx:81
 TLDAPServer.cxx:82
 TLDAPServer.cxx:83
 TLDAPServer.cxx:84
 TLDAPServer.cxx:85
 TLDAPServer.cxx:86
 TLDAPServer.cxx:87
 TLDAPServer.cxx:88
 TLDAPServer.cxx:89
 TLDAPServer.cxx:90
 TLDAPServer.cxx:91
 TLDAPServer.cxx:92
 TLDAPServer.cxx:93
 TLDAPServer.cxx:94
 TLDAPServer.cxx:95
 TLDAPServer.cxx:96
 TLDAPServer.cxx:97
 TLDAPServer.cxx:98
 TLDAPServer.cxx:99
 TLDAPServer.cxx:100
 TLDAPServer.cxx:101
 TLDAPServer.cxx:102
 TLDAPServer.cxx:103
 TLDAPServer.cxx:104
 TLDAPServer.cxx:105
 TLDAPServer.cxx:106
 TLDAPServer.cxx:107
 TLDAPServer.cxx:108
 TLDAPServer.cxx:109
 TLDAPServer.cxx:110
 TLDAPServer.cxx:111
 TLDAPServer.cxx:112
 TLDAPServer.cxx:113
 TLDAPServer.cxx:114
 TLDAPServer.cxx:115
 TLDAPServer.cxx:116
 TLDAPServer.cxx:117
 TLDAPServer.cxx:118
 TLDAPServer.cxx:119
 TLDAPServer.cxx:120
 TLDAPServer.cxx:121
 TLDAPServer.cxx:122
 TLDAPServer.cxx:123
 TLDAPServer.cxx:124
 TLDAPServer.cxx:125
 TLDAPServer.cxx:126
 TLDAPServer.cxx:127
 TLDAPServer.cxx:128
 TLDAPServer.cxx:129
 TLDAPServer.cxx:130
 TLDAPServer.cxx:131
 TLDAPServer.cxx:132
 TLDAPServer.cxx:133
 TLDAPServer.cxx:134
 TLDAPServer.cxx:135
 TLDAPServer.cxx:136
 TLDAPServer.cxx:137
 TLDAPServer.cxx:138
 TLDAPServer.cxx:139
 TLDAPServer.cxx:140
 TLDAPServer.cxx:141
 TLDAPServer.cxx:142
 TLDAPServer.cxx:143
 TLDAPServer.cxx:144
 TLDAPServer.cxx:145
 TLDAPServer.cxx:146
 TLDAPServer.cxx:147
 TLDAPServer.cxx:148
 TLDAPServer.cxx:149
 TLDAPServer.cxx:150
 TLDAPServer.cxx:151
 TLDAPServer.cxx:152
 TLDAPServer.cxx:153
 TLDAPServer.cxx:154
 TLDAPServer.cxx:155
 TLDAPServer.cxx:156
 TLDAPServer.cxx:157
 TLDAPServer.cxx:158
 TLDAPServer.cxx:159
 TLDAPServer.cxx:160
 TLDAPServer.cxx:161
 TLDAPServer.cxx:162
 TLDAPServer.cxx:163
 TLDAPServer.cxx:164
 TLDAPServer.cxx:165
 TLDAPServer.cxx:166
 TLDAPServer.cxx:167
 TLDAPServer.cxx:168
 TLDAPServer.cxx:169
 TLDAPServer.cxx:170
 TLDAPServer.cxx:171
 TLDAPServer.cxx:172
 TLDAPServer.cxx:173
 TLDAPServer.cxx:174
 TLDAPServer.cxx:175
 TLDAPServer.cxx:176
 TLDAPServer.cxx:177
 TLDAPServer.cxx:178
 TLDAPServer.cxx:179
 TLDAPServer.cxx:180
 TLDAPServer.cxx:181
 TLDAPServer.cxx:182
 TLDAPServer.cxx:183
 TLDAPServer.cxx:184
 TLDAPServer.cxx:185
 TLDAPServer.cxx:186
 TLDAPServer.cxx:187
 TLDAPServer.cxx:188
 TLDAPServer.cxx:189
 TLDAPServer.cxx:190
 TLDAPServer.cxx:191
 TLDAPServer.cxx:192
 TLDAPServer.cxx:193
 TLDAPServer.cxx:194
 TLDAPServer.cxx:195
 TLDAPServer.cxx:196
 TLDAPServer.cxx:197
 TLDAPServer.cxx:198
 TLDAPServer.cxx:199
 TLDAPServer.cxx:200
 TLDAPServer.cxx:201
 TLDAPServer.cxx:202
 TLDAPServer.cxx:203
 TLDAPServer.cxx:204
 TLDAPServer.cxx:205
 TLDAPServer.cxx:206
 TLDAPServer.cxx:207
 TLDAPServer.cxx:208
 TLDAPServer.cxx:209
 TLDAPServer.cxx:210
 TLDAPServer.cxx:211
 TLDAPServer.cxx:212
 TLDAPServer.cxx:213
 TLDAPServer.cxx:214
 TLDAPServer.cxx:215
 TLDAPServer.cxx:216
 TLDAPServer.cxx:217
 TLDAPServer.cxx:218
 TLDAPServer.cxx:219
 TLDAPServer.cxx:220
 TLDAPServer.cxx:221
 TLDAPServer.cxx:222
 TLDAPServer.cxx:223
 TLDAPServer.cxx:224
 TLDAPServer.cxx:225
 TLDAPServer.cxx:226
 TLDAPServer.cxx:227
 TLDAPServer.cxx:228
 TLDAPServer.cxx:229
 TLDAPServer.cxx:230
 TLDAPServer.cxx:231
 TLDAPServer.cxx:232
 TLDAPServer.cxx:233
 TLDAPServer.cxx:234
 TLDAPServer.cxx:235
 TLDAPServer.cxx:236
 TLDAPServer.cxx:237
 TLDAPServer.cxx:238
 TLDAPServer.cxx:239
 TLDAPServer.cxx:240
 TLDAPServer.cxx:241
 TLDAPServer.cxx:242
 TLDAPServer.cxx:243
 TLDAPServer.cxx:244
 TLDAPServer.cxx:245
 TLDAPServer.cxx:246
 TLDAPServer.cxx:247
 TLDAPServer.cxx:248
 TLDAPServer.cxx:249
 TLDAPServer.cxx:250
 TLDAPServer.cxx:251
 TLDAPServer.cxx:252
 TLDAPServer.cxx:253
 TLDAPServer.cxx:254
 TLDAPServer.cxx:255
 TLDAPServer.cxx:256
 TLDAPServer.cxx:257
 TLDAPServer.cxx:258
 TLDAPServer.cxx:259
 TLDAPServer.cxx:260
 TLDAPServer.cxx:261
 TLDAPServer.cxx:262
 TLDAPServer.cxx:263
 TLDAPServer.cxx:264
 TLDAPServer.cxx:265
 TLDAPServer.cxx:266
 TLDAPServer.cxx:267
 TLDAPServer.cxx:268
 TLDAPServer.cxx:269
 TLDAPServer.cxx:270
 TLDAPServer.cxx:271
 TLDAPServer.cxx:272
 TLDAPServer.cxx:273
 TLDAPServer.cxx:274
 TLDAPServer.cxx:275
 TLDAPServer.cxx:276
 TLDAPServer.cxx:277
 TLDAPServer.cxx:278
 TLDAPServer.cxx:279
 TLDAPServer.cxx:280
 TLDAPServer.cxx:281
 TLDAPServer.cxx:282
 TLDAPServer.cxx:283
 TLDAPServer.cxx:284
 TLDAPServer.cxx:285
 TLDAPServer.cxx:286
 TLDAPServer.cxx:287
 TLDAPServer.cxx:288
 TLDAPServer.cxx:289
 TLDAPServer.cxx:290
 TLDAPServer.cxx:291
 TLDAPServer.cxx:292
 TLDAPServer.cxx:293
 TLDAPServer.cxx:294
 TLDAPServer.cxx:295
 TLDAPServer.cxx:296
 TLDAPServer.cxx:297
 TLDAPServer.cxx:298
 TLDAPServer.cxx:299
 TLDAPServer.cxx:300
 TLDAPServer.cxx:301
 TLDAPServer.cxx:302
 TLDAPServer.cxx:303
 TLDAPServer.cxx:304
 TLDAPServer.cxx:305
 TLDAPServer.cxx:306
 TLDAPServer.cxx:307
 TLDAPServer.cxx:308
 TLDAPServer.cxx:309
 TLDAPServer.cxx:310
 TLDAPServer.cxx:311
 TLDAPServer.cxx:312
 TLDAPServer.cxx:313
 TLDAPServer.cxx:314
 TLDAPServer.cxx:315
 TLDAPServer.cxx:316
 TLDAPServer.cxx:317
 TLDAPServer.cxx:318
 TLDAPServer.cxx:319
 TLDAPServer.cxx:320
 TLDAPServer.cxx:321
 TLDAPServer.cxx:322
 TLDAPServer.cxx:323
 TLDAPServer.cxx:324
 TLDAPServer.cxx:325
 TLDAPServer.cxx:326
 TLDAPServer.cxx:327
 TLDAPServer.cxx:328
 TLDAPServer.cxx:329
 TLDAPServer.cxx:330
 TLDAPServer.cxx:331
 TLDAPServer.cxx:332
 TLDAPServer.cxx:333
 TLDAPServer.cxx:334
 TLDAPServer.cxx:335
 TLDAPServer.cxx:336
 TLDAPServer.cxx:337
 TLDAPServer.cxx:338
 TLDAPServer.cxx:339
 TLDAPServer.cxx:340
 TLDAPServer.cxx:341
 TLDAPServer.cxx:342
 TLDAPServer.cxx:343
 TLDAPServer.cxx:344
 TLDAPServer.cxx:345
 TLDAPServer.cxx:346
 TLDAPServer.cxx:347
 TLDAPServer.cxx:348
 TLDAPServer.cxx:349
 TLDAPServer.cxx:350
 TLDAPServer.cxx:351
 TLDAPServer.cxx:352
 TLDAPServer.cxx:353
 TLDAPServer.cxx:354
 TLDAPServer.cxx:355
 TLDAPServer.cxx:356
 TLDAPServer.cxx:357
 TLDAPServer.cxx:358
 TLDAPServer.cxx:359
 TLDAPServer.cxx:360
 TLDAPServer.cxx:361
 TLDAPServer.cxx:362
 TLDAPServer.cxx:363
 TLDAPServer.cxx:364
 TLDAPServer.cxx:365
 TLDAPServer.cxx:366
 TLDAPServer.cxx:367
 TLDAPServer.cxx:368
 TLDAPServer.cxx:369
 TLDAPServer.cxx:370
 TLDAPServer.cxx:371
 TLDAPServer.cxx:372
 TLDAPServer.cxx:373
 TLDAPServer.cxx:374
 TLDAPServer.cxx:375
 TLDAPServer.cxx:376
 TLDAPServer.cxx:377
 TLDAPServer.cxx:378
 TLDAPServer.cxx:379
 TLDAPServer.cxx:380
 TLDAPServer.cxx:381
 TLDAPServer.cxx:382
 TLDAPServer.cxx:383
 TLDAPServer.cxx:384
 TLDAPServer.cxx:385
 TLDAPServer.cxx:386
 TLDAPServer.cxx:387
 TLDAPServer.cxx:388
 TLDAPServer.cxx:389
 TLDAPServer.cxx:390
 TLDAPServer.cxx:391
 TLDAPServer.cxx:392
 TLDAPServer.cxx:393
 TLDAPServer.cxx:394
 TLDAPServer.cxx:395
 TLDAPServer.cxx:396
 TLDAPServer.cxx:397
 TLDAPServer.cxx:398
 TLDAPServer.cxx:399
 TLDAPServer.cxx:400
 TLDAPServer.cxx:401
 TLDAPServer.cxx:402
 TLDAPServer.cxx:403
 TLDAPServer.cxx:404
 TLDAPServer.cxx:405
 TLDAPServer.cxx:406
 TLDAPServer.cxx:407
 TLDAPServer.cxx:408
 TLDAPServer.cxx:409
 TLDAPServer.cxx:410
 TLDAPServer.cxx:411
 TLDAPServer.cxx:412
 TLDAPServer.cxx:413
 TLDAPServer.cxx:414
 TLDAPServer.cxx:415
 TLDAPServer.cxx:416
 TLDAPServer.cxx:417
 TLDAPServer.cxx:418
 TLDAPServer.cxx:419