From 5540ac6d813d77b1d43f15b69e32acfab8d3c256 Mon Sep 17 00:00:00 2001 From: Siwat Sirichai Date: Sun, 5 May 2024 17:18:54 +0700 Subject: [PATCH] link student working --- config/passport.js | 18 ++++------- directory.js | 57 ++++++++++++++++++++++++--------- routes/auth.js | 20 +++--------- routes/ps_relation_parent.js | 62 +++++++++++++++++------------------- 4 files changed, 84 insertions(+), 73 deletions(-) diff --git a/config/passport.js b/config/passport.js index eb5b940..f1e16e7 100644 --- a/config/passport.js +++ b/config/passport.js @@ -22,22 +22,18 @@ passport.use( signatureAlgorithm: "sha256", racComparison: "exact", }, - function (profile, done) { + async function (profile, done) { // Query Active Directory for user details // username is the UPN // Store the user's group and DN in the session let username = profile["username"]; attributes = ["dn", "memberOf"]; - directory.queryUser(username, attributes, function (err, user) { - if (err) { - console.log("Error:", err); - } else { - console.log("User:", user); - profile["dn"] = user.dn; - profile["memberOf"] = user.memberOf; - return done(null, profile); - } - }); + console.log("Waiting for queryUser...") + let user = await directory.queryUser(username, attributes); + console.log("user:", user); + profile["dn"] = user.dn; + profile["memberOf"] = user.memberOf; + return done(null, profile); } ) ); diff --git a/directory.js b/directory.js index 7cb9ec4..fe226e5 100644 --- a/directory.js +++ b/directory.js @@ -1,4 +1,5 @@ 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) => { @@ -23,12 +24,39 @@ async function queryUser(upn, attributes) { }); } -function setAttribute(upn, attribute, value, callback) { - // First, get DN of the user from the UPN - let attributes = ['dn']; - +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, @@ -55,23 +83,22 @@ function getUserType(req, res) { } } -async function getPrimaryParent(student_upn, callback) { - return new Promise((resolve, reject) => { +async function getPrimaryParent(student_upn) { + try { // Query primaryParent attribute in the student's LDAP entry let attributes = ['primaryParent']; - queryUser(student_upn, attributes, function(err, student) { - if (err) { - reject(err); - } else { - let primaryParent = student.primaryParent; - resolve(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 }; \ No newline at end of file diff --git a/routes/auth.js b/routes/auth.js index 7f635e6..9af0756 100644 --- a/routes/auth.js +++ b/routes/auth.js @@ -11,21 +11,11 @@ router.get('/selfservice/api', function (req, res) { // username is the UPN let username = req.user.username; attributes = ['dn', 'memberOf']; - directory.queryUser(username, attributes, function(err, user) { - if (err) { - console.log('Error:', err); - } - else { - console.log('User:', user); - response += 'Username: ' + req.user.username + '
'; - response += 'First Name: ' + req.user.first_name + '
'; - response += 'Last Name: ' + req.user.last_name + '
'; - usertype_str_map = ['Unknown', 'Student', 'Parent']; - response += 'User Type: ' + usertype_str_map[directory.getUserType(req, res)] + '
'; - response += 'Logout'; - res.send(response); - } - }); + response += 'Username: ' + req.user.username + '
'; + response += 'First Name: ' + req.user.first_name + '
'; + response += 'Last Name: ' + req.user.last_name + '
'; + response += 'Logout'; + res.send(response); } else { response += 'Login'; diff --git a/routes/ps_relation_parent.js b/routes/ps_relation_parent.js index 688d5c9..940a3e0 100644 --- a/routes/ps_relation_parent.js +++ b/routes/ps_relation_parent.js @@ -3,36 +3,39 @@ let express = require('express'); let router = express.Router(); let passport = require('passport'); +let directory = require('../directory.js'); let database = require('../config/database.js'); // Consume the pairing code // Return the student's UPN then delete the pairing code -function consumePairingCode(pairing_code, callback) { - let sql = 'SELECT upn FROM ps_pairing_codes WHERE pairing_code = ?'; - database.query(sql, pairing_code, function (err, result) { - if (err) { - console.log('Error:', err); - return callback(err, null); - } else { - if (result.length === 0) { - return callback(null, null); +async function consumePairingCode(pairing_code) { + return new Promise((resolve, reject) => { + let sql = 'SELECT upn FROM ps_pairing_codes WHERE pairing_code = ?'; + database.query(sql, pairing_code, function (err, result) { + if (err) { + console.log('Error:', err); + reject(err); } else { - let upn = result[0].upn; - let sql = 'DELETE FROM ps_pairing_codes WHERE pairing_code = ?'; - database.query(sql, pairing_code, function (err, result) { - if (err) { - console.log('Error:', err); - } else { - console.log('Pairing code consumed'); - } - }); - return callback(null, upn); + if (result.length === 0) { + resolve(null); + } else { + let upn = result[0].upn; + let deleteSql = 'DELETE FROM ps_pairing_codes WHERE pairing_code = ?'; + database.query(deleteSql, pairing_code, function (err, result) { + if (err) { + console.log('Error:', err); + } else { + console.log('Pairing code consumed'); + } + }); + resolve(upn); + } } - } + }); }); } -router.get('/parent/:parent_upn/add-student', function (req, res) { +router.get('/parent/:parent_upn/add-student', async function (req, res) { if(!req.isAuthenticated()) { return res.status(401).send('Unauthorized'); } @@ -52,17 +55,12 @@ router.get('/parent/:parent_upn/add-student', function (req, res) { return res.status(400).send('Bad Request, pairing_code missing'); } let student_upn = ''; - consumePairingCode(pairing_code, function (err, upn) { - if (err) { - return res.status(500).send('Internal Server Error'); - } - if (upn === null) { - return res.status(404).send('Invalid pairing code'); - } - student_upn = upn; - res.send('Student added'); - // Set the LDAP attribute parent to the parent's UPN in the student's LDAP entry - }); + let student = await consumePairingCode(pairing_code); + if (!student) { + return res.status(404).send('Not Found, pairing_code not found'); + } + await directory.setPrimaryParent(student, parent_upn); + res.send('Student added'); }); router.get('/parent/:parent_upn', function (req, res) {