Browse Source

Addd info function to logger, added logging to file, added async to hooks.

KrisVos130 8 years ago
parent
commit
e640cafcc3

+ 26 - 8
backend/logic/actions/hooks/adminRequired.js

@@ -1,19 +1,37 @@
 const cache = require('../../cache');
 const db = require('../../db');
+const utils = require('../../utils');
+const logger = require('../../logger');
+const async = require('async');
 
 module.exports = function(next) {
 	return function(session) {
 		let args = [];
 		for (let prop in arguments) args.push(arguments[prop]);
 		let cb = args[args.length - 1];
-		cache.hget('sessions', session.sessionId, (err, session) => {
-			if (err || !session || !session.userId) return cb({ status: 'failure', message: 'Login required.' });
-			db.models.user.findOne({_id: session.userId}, (err, user) => {
-				if (err || !user) return cb({ status: 'failure', message: 'Login required.' });
-				if (user.role !== 'admin') return cb({ status: 'failure', message: 'Admin required.' });
-				args.push(session.userId);
-				next.apply(null, args);
-			});
+		async.waterfall([
+			(next) => {
+				cache.hget('sessions', session.sessionId, next);
+			},
+			(session, next) => {
+				if (!session || !session.userId) return next('Login required.');
+				this.session = session;
+				db.models.user.findOne({_id: session.userId}, next);
+			},
+			(user, next) => {
+				if (!user) return next('Login required.');
+				if (user.role !== 'admin') return next('Insufficient permissions.');
+				next();
+			}
+		], (err) => {
+			if (err) {
+				err = utils.getError(err);
+				logger.info("ADMIN_REQUIRED", `User failed to pass admin required check. "${err}"`);
+				return cb({status: 'failure', message: err});
+			}
+			logger.info("ADMIN_REQUIRED", `User "${session.userId}" passed admin required check.`);
+			args.push(session.userId);
+			next.apply(null, args);
 		});
 	}
 };

+ 19 - 2
backend/logic/actions/hooks/loginRequired.js

@@ -1,12 +1,29 @@
 const cache = require('../../cache');
+const utils = require('../../utils');
+const logger = require('../../logger');
+const async = require('async');
 
 module.exports = function(next) {
 	return function(session) {
 		let args = [];
 		for (let prop in arguments) args.push(arguments[prop]);
 		let cb = args[args.length - 1];
-		cache.hget('sessions', session.sessionId, (err, session) => {
-			if (err || !session || !session.userId) return cb({ status: 'failure', message: 'Login required.' });
+		async.waterfall([
+			(next) => {
+				cache.hget('sessions', session.sessionId, next);
+			},
+			(session, next) => {
+				if (!session || !session.userId) return next('Login required.');
+				this.session = session;
+				next();
+			}
+		], (err) => {
+			if (err) {
+				err = utils.getError(err);
+				logger.info("LOGIN_REQUIRED", `User failed to pass login required check for station "${stationId}". "${err}"`);
+				return cb({status: 'failure', message: err});
+			}
+			logger.info("LOGIN_REQUIRED", `User "${session.userId}" passed login required check for station "${stationId}"`);
 			args.push(session.userId);
 			next.apply(null, args);
 		});

+ 31 - 18
backend/logic/actions/hooks/ownerRequired.js

@@ -1,5 +1,8 @@
 const cache = require('../../cache');
 const db = require('../../db');
+const utils = require('../../utils');
+const logger = require('../../logger');
+const async = require('async');
 const stations = require('../../stations');
 
 module.exports = function(next) {
@@ -7,24 +10,34 @@ module.exports = function(next) {
 		let args = [];
 		for (let prop in arguments) args.push(arguments[prop]);
 		let cb = args[args.length - 1];
-		cache.hget('sessions', session.sessionId, (err, session) => {
-			if (err || !session || !session.userId) return cb({ status: 'failure', message: 'Login required.' });
-			db.models.user.findOne({_id: session.userId}, (err, user) => {
-				if (err || !user) return cb({ status: 'failure', message: 'Login required.' });
-				if (user.role === 'admin') pushArgs();
-				else {
-					stations.getStation(stationId, (err, station) => {
-						if (err || !station) return cb({ status: 'failure', message: 'Something went wrong when getting the station.' });
-						else if (station.type === 'community' && station.owner === session.userId) pushArgs();
-						else return cb({ status: 'failure', message: 'Invalid permissions.' });
-					});
-				}
-
-				function pushArgs() {
-					args.push(session.userId);
-					next.apply(null, args);
-				}
-			});
+		async.waterfall([
+			(next) => {
+				cache.hget('sessions', session.sessionId, next);
+			},
+			(session, next) => {
+				if (!session || !session.userId) return next('Login required.');
+				this.session = session;
+				db.models.user.findOne({_id: session.userId}, next);
+			},
+			(user, next) => {
+				if (!user) return next('Login required.');
+				if (user.role === 'admin') return next(true);
+				stations.getStation(stationId, next);
+			},
+			(station, next) => {
+				if (!station) return next('Station not found.');
+				if (station.type === 'community' && station.owner === session.userId) return next(true);
+				next('Invalid permissions.');
+			}
+		], (err) => {
+			if (err !== true) {
+				err = utils.getError(err);
+				logger.info("OWNER_REQUIRED", `User failed to pass owner required check for station "${stationId}". "${err}"`);
+				return cb({status: 'failure', message: err});
+			}
+			logger.info("OWNER_REQUIRED", `User "${session.userId}" passed owner required check for station "${stationId}"`);
+			args.push(session.userId);
+			next.apply(null, args);
 		});
 	}
 };

+ 1 - 0
backend/logic/actions/songs.js

@@ -4,6 +4,7 @@ const db = require('../db');
 const io = require('../io');
 const songs = require('../songs');
 const cache = require('../cache');
+const async = require('async');
 const utils = require('../utils');
 const logger = require('../logger');
 const hooks = require('./hooks');

+ 19 - 0
backend/logic/logger.js

@@ -1,5 +1,11 @@
 'use strict';
 
+const fs = require('fs');
+/*const log_file = fs.createWriteStream(__dirname + '/../../all.log', {flags : 'w'});
+const success_log_file = fs.createWriteStream(__dirname + '/../../success.log', {flags : 'w'});
+const error_log_file = fs.createWriteStream(__dirname + '/../../error.log', {flags : 'w'});
+const info_log_file = fs.createWriteStream(__dirname + '/../../info.log', {flags : 'w'});*/
+
 let twoDigits = (num) => {
 	return (num < 10) ? '0' + num : num;
 };
@@ -20,13 +26,26 @@ module.exports = {
 	success: (type, message) => {
 		getTime((time) => {
 			let timeString = `${time.year}-${twoDigits(time.month)}-${twoDigits(time.day)} ${twoDigits(time.hour)}:${twoDigits(time.minute)}:${twoDigits(time.second)}`;
+			fs.appendFile(__dirname + '/../../all.log', `${timeString} SUCCESS - ${type} - ${message}\n`);
+			fs.appendFile(__dirname + '/../../success.log', `${timeString} SUCCESS - ${type} - ${message}\n`);
 			console.info('\x1b[32m', timeString, 'SUCCESS', '-', type, '-', message, '\x1b[0m');
 		});
 	},
 	error: (type, message) => {
 		getTime((time) => {
 			let timeString = `${time.year}-${twoDigits(time.month)}-${twoDigits(time.day)} ${twoDigits(time.hour)}:${twoDigits(time.minute)}:${twoDigits(time.second)}`;
+			fs.appendFile(__dirname + '/../../all.log', `${timeString} ERROR - ${type} - ${message}\n`);
+			fs.appendFile(__dirname + '/../../error.log', `${timeString} ERROR - ${type} - ${message}\n`);
 			console.warn('\x1b[31m', timeString, 'ERROR', '-', type, '-', message, '\x1b[0m');
 		});
+	},
+	info: (type, message) => {
+		getTime((time) => {
+			let timeString = `${time.year}-${twoDigits(time.month)}-${twoDigits(time.day)} ${twoDigits(time.hour)}:${twoDigits(time.minute)}:${twoDigits(time.second)}`;
+			fs.appendFile(__dirname + '/../../all.log', `${timeString} INFO - ${type} - ${message}\n`);
+			fs.appendFile(__dirname + '/../../info.log', `${timeString} INFO - ${type} - ${message}\n`);
+
+			console.info('\x1b[36m', timeString, 'INFO', '-', type, '-', message, '\x1b[0m');
+		});
 	}
 };