//file io
|
|
const utils = require('../utils/utils.js');
|
|
|
|
//update db
|
|
const sql = require('../utils/sql');
|
|
|
|
const qs = require('querystring');
|
|
|
|
const DEBUG = false;
|
|
|
|
|
|
/**
|
|
* Processes post data to see if the user has successfully
|
|
* logged in. If the user has logged in successfully, a session
|
|
* variable is set and the page is refreshed.
|
|
*
|
|
* @param request
|
|
* @returns {Promise}
|
|
*/
|
|
const processLogin = function(request, clientAddress, templateContext)
|
|
{
|
|
return new Promise(function(resolve, reject)
|
|
{
|
|
if(DEBUG)
|
|
{
|
|
//logs in as first user in DB
|
|
request.session.user = 1;
|
|
console.log("user has logged in");
|
|
templateContext.goodLoginAttempt = true;
|
|
resolve();
|
|
}
|
|
|
|
utils.getPostData(request).then(function(postData)
|
|
{
|
|
const post = qs.parse(postData);
|
|
if(!post.username && !post.password)
|
|
{
|
|
resolve("");
|
|
return(false); // no login attempted
|
|
}
|
|
return sql.checkLogin(postData);
|
|
}).then(function(loginResult)
|
|
{
|
|
if(loginResult !== false)
|
|
{
|
|
if(loginResult.pass)
|
|
{
|
|
//what actually logs in the user
|
|
request.session.user = loginResult.user;
|
|
console.log("user has logged in");
|
|
templateContext.goodLoginAttempt = true;
|
|
resolve();
|
|
}
|
|
else
|
|
{
|
|
templateContext.invalid = true;
|
|
banIP(clientAddress);
|
|
console.log("Invader!");
|
|
resolve("Wrong!");
|
|
}
|
|
}
|
|
}).catch(function(err)
|
|
{
|
|
reject(err);
|
|
})
|
|
});
|
|
};
|
|
|
|
|
|
/** Global Containing Ban Data **/
|
|
var banData = {};
|
|
|
|
/** Number of incorrect login attempts permitted per ip */
|
|
const LOGIN_LIMIT = 5;
|
|
|
|
|
|
/**
|
|
* Determines if a client is banned from the server
|
|
* or not.
|
|
*
|
|
* @param clientAddress
|
|
*/
|
|
const isBanned = function(clientAddress)
|
|
{
|
|
if(clientAddress in banData)
|
|
{
|
|
user = banData[clientAddress];
|
|
|
|
return user.incorrectLogins > LOGIN_LIMIT;
|
|
}
|
|
return false;
|
|
|
|
};
|
|
|
|
|
|
/**
|
|
* Increments the user's incorrect login attempt
|
|
* counter.
|
|
*
|
|
* @param clientAddress
|
|
*/
|
|
const banIP = function(clientAddress)
|
|
{
|
|
if(clientAddress in banData)
|
|
{
|
|
user = banData[clientAddress];
|
|
user.incorrectLogins++;
|
|
}
|
|
else
|
|
{
|
|
var newUser = new Object();
|
|
newUser.incorrectLogins = 1;
|
|
banData[clientAddress] = newUser;
|
|
}
|
|
};
|
|
|
|
|
|
module.exports=
|
|
{
|
|
/**
|
|
* Renders the contents of the login page of the website
|
|
*
|
|
* @param request express request containing post data
|
|
* @returns {Promise} resolves html of login page
|
|
*/
|
|
main: function(request, clientAddress, templateContext)
|
|
{
|
|
return new Promise(function(resolve, reject)
|
|
{
|
|
if(isBanned(clientAddress))
|
|
{
|
|
templateContext.banned = true;
|
|
resolve();
|
|
}
|
|
else
|
|
{
|
|
processLogin(request, clientAddress, templateContext).then(function()
|
|
{
|
|
resolve();
|
|
}).catch(function(err)
|
|
{
|
|
reject(err);
|
|
})
|
|
}
|
|
});
|
|
|
|
},
|
|
};
|