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 };