satitm-sso-node/directory.js

104 lines
No EOL
2.9 KiB
JavaScript

let satitm_directory = require('./config/ldap.js');
let ldap = require('ldapjs');
// Search for a user in the directory
async function queryUser(upn, attributes) {
return new Promise((resolve, reject) => {
let opts = {
filter: `(userPrincipalName=${upn})`,
scope: 'sub',
attributes: attributes
};
satitm_directory.search('DC=ad,DC=satitm,DC=chula,DC=ac,DC=th', opts, function(err, ldapRes) {
ldapRes.on('searchEntry', function(entry) {
console.log('entry: ' + JSON.stringify(entry.object));
resolve(entry.object);
});
ldapRes.on('error', function(err) {
console.error('error: ' + err.message);
reject(err);
});
ldapRes.on('end', function(result) {
console.log('status: ' + result.status);
});
});
});
}
async function setPrimaryParent(student_upn, parent_upn) {
try {
// Query the student's LDAP entry
let studentAttributes = ['primaryParent'];
let student = await queryUser(student_upn, studentAttributes);
let primaryParent = student.primaryParent;
// If the primary parent is not set, set it to the parent's UPN
if (!primaryParent) {
let change = new ldap.Change({
operation: 'add',
modification: {
primaryParent: parent_upn
}
});
let dn = student.dn;
satitm_directory.modify(dn, change, function(err) {
if (err) {
console.error(err);
throw err;
}
});
}
// If the primary parent is already set, return an error
else {
throw new Error('Primary parent already set');
}
} catch (err) {
console.error(err);
throw err;
}
}
// 0: Unkown, 1: Student, 2: Parent
const USER_TYPE = {
UNKNOWN: 0,
STUDENT: 1,
PARENT: 2
};
// Determine the type of user
// Student is in OU=Students,OU=Users,DC=ad,DC=satitm,DC=chula,DC=ac,DC=th
// Parent is in OU=Parents,OU=Users,DC=ad,DC=satitm,DC=chula,DC=ac,DC=th
function getUserType(req, res) {
// The user's DN is present in the session as req.user.dn
// To convert DN to OU, remove from first CN= to first ,
let ou = req.user.dn.substring(req.user.dn.indexOf(',') + 1);
console.log('OU:', ou);
if (ou === 'OU=Students,DC=ad,DC=satitm,DC=chula,DC=ac,DC=th') {
return USER_TYPE.STUDENT;
}
else if (ou === 'OU=Parents,DC=ad,DC=satitm,DC=chula,DC=ac,DC=th') {
return USER_TYPE.PARENT;
}
else {
return USER_TYPE.UNKNOWN;
}
}
async function getPrimaryParent(student_upn) {
try {
// Query primaryParent attribute in the student's LDAP entry
let attributes = ['primaryParent'];
let student = await queryUser(student_upn, attributes);
let primaryParent = student.primaryParent;
return primaryParent;
} catch (err) {
console.error(err);
throw err;
}
}
module.exports = {
queryUser: queryUser,
getUserType: getUserType,
setPrimaryParent: setPrimaryParent,
USER_TYPE: USER_TYPE
};