Example #1
0
exports.logout = function (req, res, next) {
    var collection,
        data = util.chk_rqd(['access_token'], req.body, next),
        getStudent = function (err, _collection) {
            if (err) return next(err);
            collection = _collection;
            collection.findOne({'access_token': data.access_token}, updateStudent);
        },
        updateStudent = function (err, item) {
            if (err) return next(err);
            if (item) {
                /* collection.update(
					{
						'_id' : item._id
					},
					{
						$set : {
							access_token: null
						}
					},
					function (err) {
						if (err) return next(err);
					}
				); */
                logger.log('info', 'student:logout Logout successful');
				exports._log(item._id, 'logged out', item.first_name + ' ' + item.last_name);
                return res.send({message : "Logout successful"});
            }
            else
                return res.send(401, {message : "Invalid access_token"});
        };
	logger.log('info', 'student:logout someone is trying to logout');
	if (!data) return;
    db.get().collection(collectionName, getStudent);
};
Example #2
0
exports.findByAccessToken = function (req, res, next) {
    var sendStudent = function (err, item) {
            if (err) return next(err);
            if (item) {
                logger.log('info', 'student:findByAccessToken : student found');
                logger.log('debug', item);
                return res.send(item);
            }
            else {
                logger.log('info', 'student:findByAccessToken : student not found');
                return res.send(404, 'student not found');
            }
        };

	logger.log('info', 'findByAccessToken');
    exports._findByAccessToken(util.chk_rqd(['access_token'], req.body, next).access_token, sendStudent, next);
};
Example #3
0
exports.submit = function (req, res, next) {
    var student,
		section,
        counter = 0,
        section_dir,
        student_dir,
        files = util.extractFiles(req.files, 'file', next),
        getCurrentSubject = function (err, item) {
            if (err) return next(err);
			if (item) {
				student = item;
				logger.log('verbose', 'student:submit getting current subject');
				exports._getCurrentSubject(student._id, createSectionDir, next);
			}
			else {
                logger.log('info', 'student:submit student not found');
                return res.send(404, 'student not found');
			}
        },
        createSectionDir = function (err, item) {
            if (err) return next(err);
            if (item) {
				section = item;
                logger.log('debug', 'student:submit', item);
                section_dir = config.upload_dir + item._id.replace(/\s+/g, '_');
                logger.log('verbose', 'student:submit creating subject dir', section_dir);
				util.mkdir(section_dir, createStudentDir);
            }
            else {
                logger.log('warn', 'student:submit no current subject');
                return res.send(400, {message : 'no current subject'});
            }
        },
        createStudentDir = function (err) {
            if (err) return next(err);
            student_dir = section_dir + '/' + student._id;
            logger.log('verbose', 'student:submit creating student dir', student_dir);
            util.mkdir(student_dir, uploadFiles);
        },
        uploadFiles = function () {
            files.forEach(readWriteFile);
        },
        readWriteFile = function (file, index) {
            logger.log('verbose', 'student:submit reading file', file.name);
            fs.readFile(file.path, function (err, data) {
				if(err) return next(err);
				// console.log(file.path);
				fs.unlink(file.path, function (err) {
					if (err) return next(err);
					file.cleanName = util.cleanFileName(file.name);
					logger.log('verbose', 'student:submit writing file', file.cleanName);
					util.getSafeFileName(student_dir + '/' + file.cleanName, function (path, version) {
						file.version = version;
						file.path = path.substring(config.upload_dir.length);
						if (process.env['NODE_ENV'] === 'testing')
							getStudentCollection();
						else
							fs.writeFile(path, data, getStudentCollection);
					});
				});
            });
        },
		getStudentCollection = function (err) {
            if (err) return next(err);
            if (++counter === files.length) {
                logger.log('verbose', 'student:submit saving in db');
				db.get().collection(collectionName, saveInDb);
            }
		},
		saveInDb = function (err, collection) {
            if (err) return next(err);
			collection.update({_id : student._id},
			{
				$pushAll : {
					files : files.map(function(f){
						return {
							name : f.cleanName,
							version : f.version,
							path : f.path,
							size : f.size,
							date : +new Date
						}
					})
				}
			}, sendResponse);
		},
        sendResponse = function (err) {
            if (err) return next(err);
			logger.log('info', 'student:submit', student._id, ' successfully submitted file/s');
			exports._log(student._id, 'submitted ' + files.length + ' file(s) [' + files.map(function (f) {
				return f.cleanName + ' v' + f.version + ' - ' + f.size + 'bytes';
			}).join(', ') + ']', student.first_name + ' ' + student.last_name);
			return res.send({message : 'Successfully submitted ' + files.length + ' file' + (files.length > 1 ? 's' : '')});
        };
    logger.log('verbose', 'student:submit someone submitted file/s');
	if (!files) return;
    exports._findByAccessToken(util.chk_rqd(['access_token'], req.body, next).access_token, getCurrentSubject, next);
};
Example #4
0
exports.login = function (req, res, next) {
    var item,
		student,
		section,
		instructor,
        collection,
        data = util.chk_rqd(['student_number', 'username', 'password', 'access_token'], req.body, next),
        getStudent = function(err, _collection) {
            if (err) return next(err);
            collection = _collection;
            logger.log('verbose', 'student:login checking student from local db', data.username, data.student_number, data.access_token);
            collection.findOne({
                $or : [
                    {
                        '_id'  : data.student_number,
                        'username'  : data.username,
                        'password'  : util.hash(util.hash(data.password) + config.SALT)
                    },
                    {
                        'access_token' : data.access_token || '#'
                    }
                ]
            }, trySystemOne);
        },
        trySystemOne = function (err, item) {
            if (err) return next(err);
            if (item) {
				if (process.env['NODE_ENV'] !== 'testing') {	// avoid test fails because of race condition
					// item.access_token = util.hash(+new Date + config.SALT);
				}
                item.last_login = +new Date;
                logger.log('verbose', 'student:login updating student properties', data.username, data.student_number);
                logger.log('info', 'student:login logged in locally', data.username, data.student_number);
				item.ip_address = data.ip_address;
				student = item;
                collection.update({'_id' : item._id}, {$set : {
                    access_token : item.access_token,
                    last_login : +new Date,
                    ip_address : student.ip_address
                }}, getCurrentSubject);
            }
            else {
				if (process.env['NODE_ENV'] === 'testing') {	// dont try systemone on test env
					return res.send(401, {message : 'Wrong username or password'});
				}
				else {
					logger.log('verbose', 'student:login trying to login via systemone', data.username, data.student_number);
					loginViaSystemOne();
				}
            }
        },
        loginViaSystemOne = function () {
            var payload = ['password='******'&username='******'&student_number=',
                            util.hash(util.hash(data.student_number) + config.SALT),
                            '&access_token=',
                            config.ACCESS_TOKEN].join(''),
                req = http.request({
                    host: config.systemone.host,
                    port: config.systemone.port,
                    path: config.systemone.path,
                    method: 'POST',
                    headers : {
                        "Content-Type" : 'application/x-www-form-urlencoded',
                        "Content-Length" : payload.length
                    }
                }, function(response) {
					var s = '';
                    response.setEncoding('utf8');
                    response.on('data', function (chunk) {
						s+=chunk;
                    });

                    response.on('end', function () {
                        saveInDb(JSON.parse(s));
                    });
                });
            req.on('error', function(err) {
                logger.log('info', 'student:login systemone not responding', JSON.stringify(err));
                return res.send(401, {message : 'Wrong username or password'});
            });
            req.write(payload);
            req.end();
			logger.log('verbose', 'student:login sending request to rodolfo');
        },
        saveInDb = function (temp) {
            var i, temp2;
            if (temp.message) {
                logger.log('info', 'student:login login failed', data.username, data.student_number);
                return res.send(401, {message : 'Wrong username or password'});
            }
            else {
				temp.first_name = util.toTitleCase(temp.first_name);
				temp.last_name = util.toTitleCase(temp.last_name);
                temp.username = data.username;
                temp._id = data.student_number;
                temp.password = util.hash(util.hash(data.password) + config.SALT);
                temp.access_token = util.hash(+new Date + config.SALT);
                temp.last_login = +new Date;
                temp.ip_address = data.ip_address;

                for (i = temp.classes.length; i--; ) {
                    temp2 = temp.classes[i].laboratory.split(" ");
                    if (config.subjects_with_lab[temp.classes[i].courseCode] && temp2.length > 1) {
                        temp.classes[i] = temp.classes[i].courseCode + " " + temp.classes[i].sectionName;
                    }
                    else {
                        temp.classes.splice(i, 1);
                    }
                }


				// var file = __dirname + '/../data/room_ip_address.json',
					// classifyIP = function  (err, __data) {
						// if (err) return next(err);
						// __data = JSON.parse(__data);

						// __data.filter(function (d) {
							// return ~d.ip_addresses.indexOf(temp.ip_address)
						// });

						// if (__data.length > 0) {

							// EDIT THIS FOR EVERY TEST
							// var test_section_id = __data[0].section;
							// var test_section_id = '';

							// if (!~temp.classes.indexOf(test_section_id))
								// temp.classes.push(test_section_id);

							student = temp;

							// var a = function (err, _collection) {
								// AND THIS
								// _collection.update({_id : test_section_id},
								// {
									// $push : {
										// students : data.student_number
									// }
								// }, function () {
									collection.remove({'_id': data.student_number}, function (err) {
										if (err) return next(err);
										collection.insert(temp, getCurrentSubject);
									});
								// });
							// }
							// db.get().collection('sections', a);
						// }
						// else {
							// logger.log('error', 'IP address not classified', temp.ip_address);s
						// }
					// };


				// fs.readFile(file, 'utf8', classifyIP);
                logger.log('info', 'student:login logged in via systemone', data.username, data.student_number);
            }
        },
		getCurrentSubject = function (err) {
			if (err) return next(err);
			logger.log('verbose', 'student:login getting current subject');
			exports._getCurrentSubject(student._id, getSectionInstructor);
		},
		getSectionInstructor = function (err, item) {
			if (err) return next(err);
			if (item) {
				section = item;
				exports._getSectionInstructor(section._id, getAttendanceCollection);
			}
			else {
				logger.log('info', 'student:login no current subject found');
				return res.send(400, {message : 'Sorry but you have no lab class as of this moment'});
			}
		},
		getAttendanceCollection = function (err, item) {
			if (err) return next(err);
			if (item) {
				instructor = item;
				db.get().collection('attendance', recordAttendance);
			}
			else {
				logger.log('info', 'student:login instructor is missing');
				return res.send(401, {message : 'No current subject'});
			}
		},
		recordAttendance = function (err, collection) {
			var date = new Date(),
				data = {
					date : (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear(),
					student_number : student._id,
					section_id : section._id
				};
			if (err) return next(err);
			collection.update(data, data, {upsert : true}, sendResponse);
		},
		sendResponse = function (err) {
			if (err) return next(err);
			exports._log(student._id, 'logged in', student.first_name + ' ' + student.last_name);
			return res.send({
				access_token : student.access_token,
				instructor : (instructor.sex === 'F' ? 'Ms. ' : 'Mr. ') + instructor.first_name + ' ' + instructor.last_name
			});
		};
    logger.log('info', 'student:login student trying to login');
	if (!data) return;
    data.ip_address = req.connection.remoteAddress;
	db.get().collection(collectionName, getStudent)
};