Patch LDAP issue

This commit is contained in:
Tuan Dang
2024-04-23 21:16:55 -07:00
parent f3fc898232
commit a54d156bf0
3 changed files with 36 additions and 38 deletions
+26 -33
View File
@@ -103,41 +103,34 @@ export const registerLdapRouter = async (server: FastifyZodProvider) => {
: {}) : {})
}); });
ldapClient.bind(ldapConfig.bindDN, ldapConfig.bindPass, (err) => { const groupFilter = "(|(memberUid={{.Username}})(member={{.UserDN}})(uniqueMember={{.UserDN}}))";
if (err) { const searchFilter =
ldapConfig.groupSearchFilter ||
groupFilter.replace("{{.Username}}", user.uid).replace("{{.UserDN}}", user.dn);
searchGroups(ldapClient, searchFilter, ldapConfig.groupSearchBase)
.then((groups) => {
ldapClient.unbind(); ldapClient.unbind();
return cb(err); return server.services.ldap.ldapLogin({
} ldapConfigId: ldapConfig.id,
externalId: user.uidNumber,
const groupFilter = username: user.uid,
ldapConfig.groupSearchFilter || firstName: user.givenName,
"(|(memberUid={{.Username}})(member={{.UserDN}})(uniqueMember={{.UserDN}}))"; lastName: user.sn,
const searchFilter = groupFilter.replace("{{.Username}}", user.uid).replace("{{.UserDN}}", user.dn); emails: user.mail ? [user.mail] : [],
groups,
searchGroups(ldapClient, searchFilter, ldapConfig.groupSearchBase) relayState: ((req as unknown as FastifyRequest).body as { RelayState?: string }).RelayState,
.then((groups) => { orgId: (req as unknown as FastifyRequest).ldapConfig.organization
ldapClient.unbind();
return server.services.ldap.ldapLogin({
ldapConfigId: ldapConfig.id,
externalId: user.uidNumber,
username: user.uid,
firstName: user.givenName,
lastName: user.sn,
emails: user.mail ? [user.mail] : [],
groups,
relayState: ((req as unknown as FastifyRequest).body as { RelayState?: string }).RelayState,
orgId: (req as unknown as FastifyRequest).ldapConfig.organization
});
})
.then(({ isUserCompleted, providerAuthToken }) => {
cb(null, { isUserCompleted, providerAuthToken });
})
.catch((err2) => {
ldapClient.unbind();
logger.error(err);
cb(err2, false);
}); });
}); })
.then(({ isUserCompleted, providerAuthToken }) => {
cb(null, { isUserCompleted, providerAuthToken });
})
.catch((err2) => {
ldapClient.unbind();
logger.error(err2);
cb(err2, false);
});
} catch (error) { } catch (error) {
logger.error(error); logger.error(error);
return cb(error, false); return cb(error, false);
@@ -14,19 +14,24 @@ export const searchGroups = async (
}, },
(err, res) => { (err, res) => {
if (err) { if (err) {
reject(err); return reject(err);
} }
const groups: { dn: string; cn: string }[] = []; const groups: { dn: string; cn: string }[] = [];
res.on("searchEntry", (entry) => { res.on("searchEntry", (entry) => {
groups.push({ dn: entry.object.dn, cn: entry.object.cn as string }); const dn = entry.dn.toString();
}); const regex = /cn=([^,]+)/;
const match = dn.match(regex);
// parse the cn from the dn
const cn = (match && match[1]) as string;
groups.push({ dn, cn });
});
res.on("error", (error) => { res.on("error", (error) => {
console.error(`error: ${error.message}`);
reject(error); reject(error);
}); });
res.on("end", () => { res.on("end", () => {
resolve(groups); resolve(groups);
}); });
@@ -191,7 +191,7 @@ export const authLoginServiceFactory = ({
const decodedProviderToken = validateProviderAuthToken(providerAuthToken, email); const decodedProviderToken = validateProviderAuthToken(providerAuthToken, email);
authMethod = decodedProviderToken.authMethod; authMethod = decodedProviderToken.authMethod;
if (isAuthMethodSaml(authMethod) && decodedProviderToken.orgId) { if ((isAuthMethodSaml(authMethod) || authMethod === AuthMethod.LDAP) && decodedProviderToken.orgId) {
organizationId = decodedProviderToken.orgId; organizationId = decodedProviderToken.orgId;
} }
} }