Browse Source

Add ib ban functionality

sbkwgh 8 years ago
parent
commit
677b01404c
3 changed files with 69 additions and 12 deletions
  1. 51 5
      models/ban.js
  2. 2 1
      routes/ban.js
  3. 16 6
      routes/user.js

+ 51 - 5
models/ban.js

@@ -8,7 +8,7 @@ module.exports = (sequelize, DataTypes) => {
 			validate: {
 				isBoolean (val) {
 					if(typeof val !== 'boolean') {
-						throw new sequelize.ValidationError('canCreateThreads must be a string')
+						throw new sequelize.ValidationError('canCreateThreads must be a boolean')
 					}
 				}
 			}
@@ -19,7 +19,18 @@ module.exports = (sequelize, DataTypes) => {
 			validate: {
 				isBoolean (val) {
 					if(typeof val !== 'boolean') {
-						throw new sequelize.ValidationError('canCreateThreads must be a string')
+						throw new sequelize.ValidationError('canCreateThreads must be a boolean')
+					}
+				}
+			}
+		},
+		ipBanned: {
+			type: DataTypes.BOOLEAN,
+			defaultValue: false,
+			validate: {
+				isBoolean (val) {
+					if(typeof val !== 'boolean') {
+						throw new sequelize.ValidationError('ipBanned must be a boolean')
 					}
 				}
 			}
@@ -29,7 +40,7 @@ module.exports = (sequelize, DataTypes) => {
 			validate: {
 				isString (val) {
 					if(typeof val !== 'string') {
-						throw new sequelize.ValidationError('description must be a string')
+						throw new sequelize.ValidationError('message must be a string')
 					}
 				},
 				len: {
@@ -57,7 +68,7 @@ module.exports = (sequelize, DataTypes) => {
 						error: ban.message || 'You have been banned from posting'
 					})
 				} else {
-					false
+					return false
 				}
 			},
 			async canCreateThreads (username) {
@@ -68,7 +79,42 @@ module.exports = (sequelize, DataTypes) => {
 						error: ban.message || 'You have been banned from creating threads'
 					})
 				} else {
-					false
+					return false
+				}
+			},
+			async isIpBanned (ip, username) {
+				let { User, Ip } = sequelize.models
+
+				if(username) {
+					let user = await User.findOne({ where: {
+						username
+					}})
+					if(user && user.admin) return false
+				}
+		
+
+				let users = await User.findAll({
+					include: [{
+						model: Ip,
+						where: { ip }
+					}]
+				})
+				if(!users.length) return false
+
+				let ban = await Ban.findOne({ where: {
+					UserId: {
+						$in: users.map(u => u.id)
+					},
+					ipBanned: true 
+				} })
+
+				if(ban) {
+					throw Errors.sequelizeValidation(sequelize.Sequelize, {
+						error: ban.message ||
+						'This IP has been banned from creating accounts or logging in'
+					})
+				} else {
+					return false
 				}
 			}
 		}

+ 2 - 1
routes/ban.js

@@ -26,7 +26,8 @@ router.post('/', async (req, res) => {
 		let ban = await Ban.create({
 			message: req.body.message,
 			canCreateThreads: req.body.canCreateThreads,
-			canCreatePosts: req.body.canCreatePosts
+			canCreatePosts: req.body.canCreatePosts,
+			ipBanned: req.body.ipBanned
 		})
 		await ban.setUser(user)
 

+ 16 - 6
routes/user.js

@@ -3,7 +3,7 @@ let express = require('express')
 let router = express.Router()
 
 const Errors = require('../lib/errors.js')
-let { User, Post, AdminToken, Thread, Category, Sequelize, Ip } = require('../models')
+let { User, Post, AdminToken, Thread, Category, Sequelize, Ip, Ban } = require('../models')
 let pagination = require('../lib/pagination.js')
 
 function setUserSession(req, res, username, UserId, admin) {
@@ -21,6 +21,8 @@ function setUserSession(req, res, username, UserId, admin) {
 }
 router.post('/', async (req, res) => {
 	try {
+		await Ban.isIpBanned(req.ip)
+
 		let userParams = {
 			username: req.body.username,
 			hash: req.body.password,
@@ -115,6 +117,8 @@ router.get('/:username', async (req, res) => {
 
 router.post('/:username/login', async (req, res) => {
 	try {
+		await Ban.isIpBanned(req.ip, req.params.username)
+
 		let user = await User.findOne({ where: {
 			username: req.params.username
 		}})
@@ -143,12 +147,18 @@ router.post('/:username/login', async (req, res) => {
 		}
 
 	} catch (err) {
-		console.log(err)
+		if(err instanceof Sequelize.ValidationError) {
+			res.status(400)
+			res.json(err)
+		} else {
+			console.log(err)
+
+			res.status(500)
+			res.json({
+				errors: [Errors.unknown]
+			})
+		}
 
-		res.status(500)
-		res.json({
-			errors: [Errors.unknown]
-		})
 	}
 })