feat: make auth backend configurable
This commit is contained in:
+58
-39
@@ -61,7 +61,7 @@ function IsValidLDAPUser(username) {
|
||||
var dcstrings = domain.split(".");
|
||||
if (dcstrings.length > 0) {
|
||||
dcstring += dcstrings.join(",dc=");
|
||||
}
|
||||
}
|
||||
}
|
||||
var search_options = { scope : 'sub' };
|
||||
var _filter = '(&(objectClass=inetOrgPerson)';
|
||||
@@ -115,14 +115,14 @@ function IsValidLDAPUser(username) {
|
||||
console.log(moment().format("LTS") + " [valid LDAP user] ", username);
|
||||
resolve(true);
|
||||
} else {
|
||||
console.log(moment().format("LTS") + " [no valid LDAP user] - sending 401");
|
||||
console.log(moment().format("LTS") + " [no valid LDAP user] - sending 401");
|
||||
resolve(false);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
);
|
||||
|
||||
});
|
||||
}
|
||||
@@ -147,17 +147,17 @@ function IsValidLDAPAuth(username, password) {
|
||||
console.error(moment().format("LTS") + " [profile ldap] unsupported config.ldap.ldapType : '"+config.ldap.ldapType+"'");
|
||||
resolve(false);
|
||||
}
|
||||
ldap.bind( uiddn, password,
|
||||
ldap.bind( uiddn, password,
|
||||
err => {
|
||||
if (err) {
|
||||
console.error(moment().format("LTS") + " [user ldap.bind] fail ", err);
|
||||
resolve(false);
|
||||
} else {
|
||||
console.error(moment().format("LTS") + " [user ldap.bind]", err);
|
||||
resolve(true);
|
||||
resolve(true);
|
||||
}
|
||||
}
|
||||
);
|
||||
);
|
||||
|
||||
});
|
||||
}
|
||||
@@ -181,8 +181,8 @@ function IsValidRedmineUser(username) {
|
||||
console.log("db connection error: ", derr);
|
||||
resolve(false);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
});
|
||||
}
|
||||
@@ -196,7 +196,7 @@ function IsValidRedmineAuth(username, password) {
|
||||
queryparams[1] = password;
|
||||
queryparams[2] = "sha1";
|
||||
queryparams[3] = "hex";
|
||||
|
||||
|
||||
var query = "SELECT DISTINCT ON (uid) users.login AS uid, users.firstname AS givenName, users.lastname AS sn FROM users ";
|
||||
query += "WHERE users.status=1 AND users.login=$1 AND substring(users.hashed_password, 0, length(users.hashed_password)+1) = encode(digest(users.salt||encode(digest($2, $3), $4), $3), $4)";
|
||||
dbpool.query(query, queryparams, function (derr, dres) {
|
||||
@@ -210,8 +210,8 @@ function IsValidRedmineAuth(username, password) {
|
||||
console.log("db connection error: ", derr);
|
||||
resolve(false);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
});
|
||||
}
|
||||
@@ -225,7 +225,7 @@ function IsValidOldSecret(username, password) {
|
||||
var OldDay = secretTimeseed.substring(0,2);
|
||||
var OldMonth = secretTimeseed.substring(2,4);
|
||||
var OldHour = secretTimeseed.substring(8,10);
|
||||
var oldMoment = moment.utc(OldYear + "-" + OldMonth + "-" + OldDay + " " + OldHour).valueOf();
|
||||
var oldMoment = moment.utc(OldYear + "-" + OldMonth + "-" + OldDay + " " + OldHour).valueOf();
|
||||
var nowMoment = moment.utc().valueOf();
|
||||
if (oldMoment >= nowMoment) {
|
||||
// OldSecretTest is still within valid time Timeseed as moment
|
||||
@@ -235,7 +235,7 @@ function IsValidOldSecret(username, password) {
|
||||
mangledarray.push(uid.charCodeAt(i) + 1);
|
||||
}
|
||||
var mangledusername=mangledarray.join('');
|
||||
|
||||
|
||||
var testSecret = secretTimeseed + mangledusername + config.xmppToken;
|
||||
var testdigest = md5(testSecret);
|
||||
var testhash = testdigest;
|
||||
@@ -247,16 +247,16 @@ function IsValidOldSecret(username, password) {
|
||||
return true;
|
||||
} else {
|
||||
console.log(moment().format("LTS") + " [OldSecretTest] oldSecret invalid for ", username);
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
console.log(moment().format("LTS") + " [OldSecretTest] oldSecret expired for ", username);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(moment().format("LTS") + " [OldSecretTest] error: ", e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function IsValidJWT(username,password) {
|
||||
@@ -269,11 +269,11 @@ function IsValidJWT(username,password) {
|
||||
} catch (e) {
|
||||
console.error(moment().format("LTS") + " [JWTValidation] error: ", e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
app.get('/', async function (req, res) {
|
||||
if (req.headers.authorization && req.headers.authorization.startsWith("Basic")) {
|
||||
app.get('/', async function (req, res) {
|
||||
if (req.headers.authorization && req.headers.authorization.startsWith("Basic")) {
|
||||
try {
|
||||
var b64input = req.headers.authorization.split(" ")[1];
|
||||
var decodedInput = new Buffer(b64input, 'base64').toString('ascii');
|
||||
@@ -286,32 +286,51 @@ app.get('/', async function (req, res) {
|
||||
password += ":";
|
||||
}
|
||||
}
|
||||
let validRedmineUser = await IsValidRedmineUser(username);
|
||||
console.log(moment().format("LTS") + ' username ' + username +' - IsValidRedmineUser: ', validRedmineUser);
|
||||
console.log(moment().format("LTS") + ' username ' + username +' - password: ', password);
|
||||
console.log(moment().format("LTS") + ' username ' + username +' - indesxforOldToken: ', password.indexOf("-"));
|
||||
if (validRedmineUser === true) {
|
||||
let validRedmineAuth = await IsValidRedmineAuth(username, password);
|
||||
console.log("IsValidRedmineAuth: ", validRedmineAuth);
|
||||
console.log("IsValidOldSecret: ", IsValidOldSecret(username, password));
|
||||
console.log("IsValidJWT: ", IsValidJWT(username, password));
|
||||
if (validRedmineUser && (validRedmineAuth || IsValidOldSecret(username, password) || IsValidJWT(username, password))) {
|
||||
res.status(200).json(null);
|
||||
} else {
|
||||
res.status(401).json(null);
|
||||
}
|
||||
if (config.useRedmineAuth) {
|
||||
let validRedmineUser = await IsValidRedmineUser(username);
|
||||
console.log(moment().format("LTS") + ' username ' + username +' - IsValidRedmineUser: ', validRedmineUser);
|
||||
console.log(moment().format("LTS") + ' username ' + username +' - password: ', password);
|
||||
console.log(moment().format("LTS") + ' username ' + username +' - indesxforOldToken: ', password.indexOf("-"));
|
||||
if (validRedmineUser === true) {
|
||||
let validRedmineAuth = await IsValidRedmineAuth(username, password);
|
||||
console.log("IsValidRedmineAuth: ", validRedmineAuth);
|
||||
console.log("IsValidOldSecret: ", IsValidOldSecret(username, password));
|
||||
console.log("IsValidJWT: ", IsValidJWT(username, password));
|
||||
if (validRedmineUser && (validRedmineAuth || IsValidOldSecret(username, password) || IsValidJWT(username, password))) {
|
||||
res.status(200).json(null);
|
||||
} else {
|
||||
res.status(401).json(null);
|
||||
}
|
||||
} else {
|
||||
res.status(401).json(null);
|
||||
}
|
||||
|
||||
} else {
|
||||
res.status(401).json(null);
|
||||
}
|
||||
// res.status(200).json(null);
|
||||
let validLdapUser = await IsValidLDAPUser(username);
|
||||
console.log(moment().format("LTS") + ' username ' + username +' - validInLDAP: ', validLdapUser);
|
||||
console.log(moment().format("LTS") + ' username ' + username +' - password: ', password);
|
||||
console.log(moment().format("LTS") + ' username ' + username +' - indesxforOldToken: ', password.indexOf("-"));
|
||||
if (validLdapUser === true) {
|
||||
let validLdapAuth = await IsValidLDAPAuth(username, password);
|
||||
if (validLdapUser && (validLdapAuth || IsValidOldSecret(username, password) || IsValidJWT(username, password))) {
|
||||
res.status(200).json(null);
|
||||
} else {
|
||||
res.status(401).json(null);
|
||||
}
|
||||
} else {
|
||||
res.status(401).json(null);
|
||||
}
|
||||
}
|
||||
|
||||
// res.status(200).json(null);
|
||||
} catch (e) {
|
||||
console.log(moment().format("LTS") + ' Error: ', e);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
console.log(moment().format("LTS") + ' no auth header');
|
||||
res.status(401).json(null);
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user