Skip to content

Commit

Permalink
fixed rate_control and session_check, added loginStatusRejectDecorato…
Browse files Browse the repository at this point in the history
…r for router
  • Loading branch information
SorenEricMent committed Sep 22, 2022
1 parent 3c91852 commit 25af2a4
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 56 deletions.
5 changes: 2 additions & 3 deletions modules/iapi.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -90,9 +90,6 @@ class IAPI {
});
}
getValidUserSession(uid){
/*
PRIORIZED TODO: userPermissions replacement
*/
return new Promise(async (resolve, reject) => {
try {
let currentSessions = await this.getUserSession(uid);
Expand Down Expand Up @@ -218,6 +215,7 @@ class IAPI {
}
//Actual service functions
userLogin(ip, ua, username, password) {
//Assume that user don't have login status, don't use session_check middleware optimization.
return new Promise(async (resolve, reject) => {
password = blake3Hash(this.salt + password);
this.mysql.query(
Expand Down Expand Up @@ -327,6 +325,7 @@ class IAPI {
});
}
userRegister(ip, ua, username, password, email, nickname) {
//Assume that user don't have login status, don't use session_check middleware optimization.
return new Promise((resolve, reject) => {
if (!basicPasswordRequirement(password)) {
reject("Password does not meet basic requirements(> 8 characters, contains at least one number, one letter)");
Expand Down
2 changes: 1 addition & 1 deletion modules/rate_control.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ function RateControlMiddleware(log, redis, siteConfig, iapi, getReqInfo) {
})
});
}else{
let permissionExpireAfter = JSON.parse(siteConfig.roles_permissions)[req.validUserPermissions.role].cookie_expire_after;
let permissionExpireAfter = req.validUserPermissions.permissions.cookie_expire_after;
this.redis.set(redisKeyUT, JSON.stringify(req.validUserPermissions.rate_limits), "PX", permissionExpireAfter, (err) => {
if(err){
reject({
Expand Down
119 changes: 67 additions & 52 deletions modules/router.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,17 @@ import { default as SCM } from "./session_check.mjs";
import { default as STM } from "./statistic.mjs";
import { default as CSM } from "./cache.mjs";

function rejectForLoginStatusDecorator(func){
return function(req, res){
if(req.isUserSessionValid){
res.status(412).send("You are already logged in.");
}else{
func(req, res);
}
}
}


function initializeRouter(mysqlConnection, redisConnection, siteConfig, log, salt, redisPrefix){
let getReqInfo = function(req){
let ip = null;
Expand Down Expand Up @@ -181,61 +192,65 @@ function initializeRouter(mysqlConnection, redisConnection, siteConfig, log, sal
let b = req.body;
});

blorumRouter.post('/user/login', function (req, res) {
res.set("Content-Type","application/json");
res.set(commonHeader);
let b = req.body;
let reqInfo = getReqInfo(req);
if(objHasAllProperties(b, "username", "password")){
if(isAllString(b.username, b.password)){
iapi.userLogin(reqInfo.ip, reqInfo.ua, b.username, b.password).then(function(result){
res.set(commonHeader);
let parsedPermission = ""; //Todo
res.cookie("blorum_uid", result.uid, {httpOnly: true});
res.cookie("blorum_token", result.token, {httpOnly: true, secure: true});
res.cookie("blorum_uuid", result.uuid);
res.cookie("blorum_permissions", parsedPermission);
res.status(200).send(result);
}).catch(function(err){
res.set(commonHeader);
res.status(500).send(err);
});
}else{
res.sendStatus(400);
}
}else{
res.sendStatus(400);
}
});

blorumRouter.post('/user/register', function (req, res) {
let b = req.body;
let reqInfo = getReqInfo(req);
if(objHasAllProperties(b, "username", "password", "email")){
if(isAllString(b.username, b.password, b.email, b.nickname)){
try {
res.set("Content-Type","application/json");
res.set(commonHeader);
iapi.userRegister(reqInfo.ip, reqInfo.ua, b.username, b.password, b.email, b.nickname).then(function (result) {
res.status(200).send(result);
}).catch(function (error) {
log("debug", "Router", "Failed to register user: " + error);
res.status(500).send(error);
});
} catch (error) {
log("debug", "Router", "Failed to register user: " + error);
res.sendStatus(500);
blorumRouter.post('/user/login',
rejectForLoginStatusDecorator(
function (req, res) {
res.set("Content-Type","application/json");
res.set(commonHeader);
let b = req.body;
let reqInfo = getReqInfo(req);
if(objHasAllProperties(b, "username", "password")){
if(isAllString(b.username, b.password)){
iapi.userLogin(reqInfo.ip, reqInfo.ua, b.username, b.password).then(function(result){
res.set(commonHeader);
let parsedPermission = ""; //Todo
res.cookie("blorum_uid", result.uid, {httpOnly: true});
res.cookie("blorum_token", result.token, {httpOnly: true});
res.cookie("blorum_uuid", result.uuid);
res.cookie("blorum_permissions", parsedPermission);
res.status(200).send(result);
}).catch(function(err){
res.set(commonHeader);
res.status(500).send(err);
});
}else{
res.sendStatus(400);
}
}else{
res.sendStatus(400);
}
}else{
res.sendStatus(400);
}
}else{
res.sendStatus(400);
}
});
}));

blorumRouter.post('/user/register',
rejectForLoginStatusDecorator(
function (req, res) {
let b = req.body;
let reqInfo = getReqInfo(req);
if(objHasAllProperties(b, "username", "password", "email")){
if(isAllString(b.username, b.password, b.email, b.nickname)){
try {
res.set("Content-Type","application/json");
res.set(commonHeader);
iapi.userRegister(reqInfo.ip, reqInfo.ua, b.username, b.password, b.email, b.nickname).then(function (result) {
res.status(200).send(result);
}).catch(function (error) {
log("debug", "Router", "Failed to register user: " + error);
res.status(500).send(error);
});
} catch (error) {
log("debug", "Router", "Failed to register user: " + error);
res.sendStatus(500);
}
}else{
res.sendStatus(400);
}
}else{
res.sendStatus(400);
}
}));

blorumRouter.get('/user/permissions', function (req, res) {
//TODO: permission check;
// Todo: permission check and optimization with session_check
if(req.isUserSessionValid){
let b = req.body;
res.set("Content-Type","application/json");
Expand Down
1 change: 1 addition & 0 deletions modules/session_check.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ function SessionCheckMiddleware(log, redis, iapi){
}
}
if(req.isUserSessionValid){
req.validUserRole = result.roles;
req.validUserPermissions = result.permissions;
next();
}else{
Expand Down

0 comments on commit 25af2a4

Please sign in to comment.