Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion src/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@ DB_TYPE=
# Authentication backend: 'db' or 'ldap' (Required)
AUTH_BACKEND=

# Directory backend: 'db' or 'proxmox' (Required)
DIRECTORY_BACKEND=

# WEBCHART OBSERVATION CODE (Optional : Required if WC)
LDAP_UID_OBS_NAME=

#LDAP configuration (Required)
LDAP_BASE_DN=
LDAP_PORT=
Expand All @@ -27,4 +33,8 @@ LDAP_CERT_CONTENT=
LDAP_KEY_CONTENT=

# OpenLDAP Configuration (Required if AUTH_BACKEND is 'ldap')
LDAP_URL=
LDAP_URL=

# Bind Credentials (Optional: Required if WC)
LDAP_BIND_DN=CN=
LDAP_BIND_PASSWORD=
40 changes: 19 additions & 21 deletions src/auth/providers/auth/ldapBackend.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,28 +12,23 @@ class LDAPBackend extends AuthProvider {
setInterval(() => {
this.failedServers.clear();
logger.debug("Resetting failed LDAP servers for retry.");
}, 5 * 60 * 1000); // every 5 minutes
}, 5 * 60 * 1000);
}

async authenticate(username, password, req) {
for (const server of this.serverPool) {
if (this.failedServers.get(server.hostname)) {
continue;
}
if (this.failedServers.get(server.hostname)) continue;

const url = `${server.scheme}//${server.hostname}:${server.port}`;
logger.debug(`Trying LDAP server: ${url} for user: ${username}`);
logger.debug("Attempting LDAP authentication via server", { host: server.hostname });

const success = await this.tryBind(url, username, password, server);

if (success) {
return true;
} else {
this.failedServers.set(server.hostname, Date.now());
}
if (success) return true;

this.failedServers.set(server.hostname, Date.now());
}

// if all tried and failed, clear the failed list for next time
this.failedServers.clear();
return false;
}
Expand All @@ -45,25 +40,26 @@ class LDAPBackend extends AuthProvider {
this.searchUserDN(client, username)
.then((foundDN) => {
if (!foundDN) {
logger.error("No DN found for user", { username });
logger.warn("No DN found for user");
client.unbind();
return resolve(false);
}
logger.debug(`Found user DN: ${foundDN}, attempting bind with user password...`);

logger.debug("User DN found, attempting user bind...");
return this.attemptBind(client, foundDN, password);
})
.then((success) => {
client.unbind();
resolve(success);
})
.catch((err) => {
logger.error("LDAP bind or search error", { url, username, err });
logger.error("LDAP bind or search error", { error: err.message });
client.unbind();
resolve(false);
});

client.on("error", (err) => {
logger.error("LDAP client connection error", { url, err });
logger.error("LDAP client connection error", { error: err.message });
resolve(false);
});
});
Expand All @@ -79,19 +75,20 @@ class LDAPBackend extends AuthProvider {

client.bind(process.env.LDAP_BIND_DN, process.env.LDAP_BIND_PASSWORD, (err) => {
if (err) {
logger.error("Service bind failed", err);
return reject(new Error("Service bind failed: " + err));
logger.error("LDAP service bind failed", { error: err.message });
return reject(new Error("Service bind failed"));
}
logger.debug("Service bind successful, searching for user...");

logger.debug("LDAP service bind successful");

let foundDN = null;
client.search('dc=mieweb,dc=com', opts, (err, res) => {
if (err) return reject(err);

res.on('searchEntry', (entry) => {
console.log("Found entry DN:", entry.objectName);
foundDN = entry.dn.toString();
});

res.on('error', (err) => reject(err));
res.on('end', () => resolve(foundDN));
});
Expand All @@ -103,10 +100,11 @@ class LDAPBackend extends AuthProvider {
return new Promise((resolve) => {
client.bind(dn, password, (err) => {
if (err) {
logger.error("LDAP user bind failed", { dn, err });
logger.warn("LDAP user bind failed");
return resolve(false);
}
logger.info("LDAP user bind success", { dn });

logger.info("LDAP user bind succeeded");
return resolve(true);
});
});
Expand Down
1 change: 1 addition & 0 deletions src/config/dbConfig.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const dbConfigs = {
mysql: {
type: 'mysql',
host: process.env.MYSQL_HOST || "mysql",
port: process.env.MYSQL_PORT || "33306",
user: process.env.MYSQL_USER || "root",
password: process.env.MYSQL_PASSWORD || "rootpassword",
database: process.env.MYSQL_DATABASE || "ldap_user_db",
Expand Down
Loading