@@ -148,7 +148,8 @@ class TLdapAuthProvider : public NActors::TActorBootstrapped<TLdapAuthProvider>
148
148
NKikimrLdap::BerFree (ber, 0 );
149
149
}
150
150
std::vector<TString> allUserGroups;
151
- if (!directUserGroups.empty ()) {
151
+ auto & extendedSettings = Settings.GetExtendedSettings ();
152
+ if (extendedSettings.GetEnableNestedGroupsSearch () && !directUserGroups.empty ()) {
152
153
// Active Directory has special matching rule to fetch nested groups in one request it is MatchingRuleInChain
153
154
// We don`t know what is ldap server. Is it Active Directory or OpenLdap or other server?
154
155
// If using MatchingRuleInChain return empty list of groups it means that ldap server isn`t Active Directory
@@ -158,6 +159,8 @@ class TLdapAuthProvider : public NActors::TActorBootstrapped<TLdapAuthProvider>
158
159
allUserGroups = std::move (directUserGroups);
159
160
GetNestedGroups (ld, &allUserGroups);
160
161
}
162
+ } else {
163
+ allUserGroups = std::move (directUserGroups);
161
164
}
162
165
NKikimrLdap::MsgFree (entry);
163
166
NKikimrLdap::Unbind (ld);
@@ -306,7 +309,10 @@ class TLdapAuthProvider : public NActors::TActorBootstrapped<TLdapAuthProvider>
306
309
std::vector<TString> TryToGetGroupsUseMatchingRuleInChain (LDAP* ld, LDAPMessage* entry) const {
307
310
static const TString matchingRuleInChain = " 1.2.840.113556.1.4.1941" ; // Only Active Directory supports
308
311
TStringBuilder filter;
309
- filter << " (member:" << matchingRuleInChain << " :=" << NKikimrLdap::GetDn (ld, entry) << ' )' ;
312
+ char * dn = NKikimrLdap::GetDn (ld, entry);
313
+ filter << " (member:" << matchingRuleInChain << " :=" << dn << ' )' ;
314
+ NKikimrLdap::MemFree (dn);
315
+ dn = nullptr ;
310
316
LDAPMessage* searchMessage = nullptr ;
311
317
int result = NKikimrLdap::Search (ld, Settings.GetBaseDn (), NKikimrLdap::EScope::SUBTREE, filter, NKikimrLdap::noAttributes, 0 , &searchMessage);
312
318
if (!NKikimrLdap::IsSuccess (result)) {
@@ -320,7 +326,10 @@ class TLdapAuthProvider : public NActors::TActorBootstrapped<TLdapAuthProvider>
320
326
std::vector<TString> groups;
321
327
groups.reserve (countEntries);
322
328
for (LDAPMessage* groupEntry = NKikimrLdap::FirstEntry (ld, searchMessage); groupEntry != nullptr ; groupEntry = NKikimrLdap::NextEntry (ld, groupEntry)) {
323
- groups.push_back (NKikimrLdap::GetDn (ld, groupEntry));
329
+ dn = NKikimrLdap::GetDn (ld, groupEntry);
330
+ groups.push_back (dn);
331
+ NKikimrLdap::MemFree (dn);
332
+ dn = nullptr ;
324
333
}
325
334
NKikimrLdap::MsgFree (searchMessage);
326
335
return groups;
0 commit comments