user redis
This commit is contained in:
		
							
								
								
									
										0
									
								
								nodejs/models/auth.js → nodejs/models/auth_pam.js
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								nodejs/models/auth.js → nodejs/models/auth_pam.js
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										55
									
								
								nodejs/models/auth_red.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								nodejs/models/auth_red.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,55 @@ | ||||
| const {promisify} = require('util'); | ||||
| const pam = require('authenticate-pam'); | ||||
| const authenticate = promisify(pam.authenticate); | ||||
|  | ||||
| const {User} = require('./user'); | ||||
| const {Token, AuthToken} = require('./token'); | ||||
|  | ||||
| Auth = {} | ||||
| Auth.errors = {} | ||||
|  | ||||
| Auth.errors.login = function(){ | ||||
| 	let error = new Error('PamLoginFailed'); | ||||
| 	error.name = 'PamLoginFailed'; | ||||
| 	error.message = `Invalid Credentials, login failed.`; | ||||
| 	error.status = 401; | ||||
|  | ||||
| 	return error; | ||||
| } | ||||
|  | ||||
| Auth.login = async function(data){ | ||||
| 	try{ | ||||
| 		let auth = await authenticate(data.username, data.password); | ||||
| 		let user = await User.get(data); | ||||
| 		let token = await AuthToken.add(user); | ||||
|  | ||||
| 		return {user, token} | ||||
| 	}catch(error){ | ||||
| 		if (error == 'Authentication failure'){ | ||||
| 			throw this.errors.login() | ||||
| 		} | ||||
| 		throw error; | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| Auth.checkToken = async function(data){ | ||||
| 	try{ | ||||
| 		let token = await AuthToken.get(data); | ||||
| 		if(token.is_valid){ | ||||
| 			return await User.get(token.created_by); | ||||
| 		} | ||||
| 	}catch(error){ | ||||
| 		throw this.errors.login(); | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| Auth.logOut = async function(data){ | ||||
| 	try{ | ||||
| 		let token = await AuthToken.get(data); | ||||
| 		await token.remove(); | ||||
| 	}catch(error){ | ||||
| 		throw error; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| module.exports = {Auth, AuthToken}; | ||||
							
								
								
									
										62
									
								
								nodejs/models/auth_redis.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								nodejs/models/auth_redis.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,62 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const bcrypt = require('bcrypt'); | ||||
| const saltRounds = 10; | ||||
|  | ||||
| const {User} = require('./user_redis'); | ||||
| const {Token, AuthToken} = require('./token'); | ||||
|  | ||||
| var Auth = {} | ||||
| Auth.errors = {} | ||||
|  | ||||
| Auth.errors.login = function(){ | ||||
| 	let error = new Error('ResisLoginFailed'); | ||||
| 	error.name = 'RedisLoginFailed'; | ||||
| 	error.message = `Invalid Credentials, login failed.`; | ||||
| 	error.status = 401; | ||||
|  | ||||
| 	return error; | ||||
| } | ||||
|  | ||||
| Auth.login = async function(data){ | ||||
| 	try{ | ||||
| 		let user = await User.get(data); | ||||
|  | ||||
| 		let auth = await bcrypt.compare(data.password, user.password); | ||||
|  | ||||
| 		if(auth){ | ||||
| 			let token = await AuthToken.add(user); | ||||
|  | ||||
| 			return {user, token} | ||||
| 		}else{ | ||||
| 			throw this.errors.login(); | ||||
| 		} | ||||
| 	}catch(error){ | ||||
| 		if (error == 'Authentication failure'){ | ||||
| 			throw this.errors.login() | ||||
| 		} | ||||
| 		throw error; | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| Auth.checkToken = async function(data){ | ||||
| 	try{ | ||||
| 		let token = await AuthToken.get(data); | ||||
| 		if(token.is_valid){ | ||||
| 			return await User.get(token.created_by); | ||||
| 		} | ||||
| 	}catch(error){ | ||||
| 		throw this.errors.login(); | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| Auth.logOut = async function(data){ | ||||
| 	try{ | ||||
| 		let token = await AuthToken.get(data); | ||||
| 		await token.remove(); | ||||
| 	}catch(error){ | ||||
| 		throw error; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| module.exports = {Auth, AuthToken}; | ||||
| @ -1,6 +1,6 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Host = require('../utils/redis_model')({ | ||||
| const Host = new require('../utils/redis_model')({ | ||||
| 	_name: 'host', | ||||
| 	_key: 'host', | ||||
| 	_keyMap: { | ||||
|  | ||||
							
								
								
									
										0
									
								
								nodejs/models/user.js → nodejs/models/user_pam.js
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								nodejs/models/user.js → nodejs/models/user_pam.js
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										100
									
								
								nodejs/models/user_redis.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								nodejs/models/user_redis.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,100 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const objValidate = require('../utils/object_validate'); | ||||
| const {Token, InviteToken} = require('./token'); | ||||
| const bcrypt = require('bcrypt'); | ||||
| const saltRounds = 10; | ||||
|  | ||||
| const User = require('../utils/redis_model')({ | ||||
| 	_name: 'user', | ||||
| 	_key: 'username', | ||||
| 	_keyMap: { | ||||
| 		'created_by': {isRequired: true, type: 'string', min: 3, max: 500}, | ||||
| 		'created_on': {default: function(){return (new Date).getTime()}}, | ||||
| 		'updated_by': {default:"__NONE__", isRequired: false, type: 'string',}, | ||||
| 		'updated_on': {default: function(){return (new Date).getTime()}, always: true}, | ||||
| 		'username': {isRequired: true, type: 'string', min: 3, max: 500}, | ||||
| 		'password': {isRequired: true, type: 'string', min: 3, max: 500}, | ||||
| 		'backing': {default:"redis", isRequired: false, type: 'string',}, | ||||
| 	} | ||||
| }); | ||||
|  | ||||
| User.add = async function(data) { | ||||
| 	try{ | ||||
| 		data['password'] = await bcrypt.hash(data['password'], saltRounds); | ||||
| 		data['backing'] = data['backing'] || 'redis'; | ||||
|  | ||||
|  | ||||
| 		return this.__proto__.add(data); | ||||
|  | ||||
| 	}catch(error){ | ||||
| 		throw error; | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| User.addByInvite = async function(data){ | ||||
| 	try{ | ||||
| 		let token = await InviteToken.get(data.token); | ||||
|  | ||||
| 		if(!token.is_valid){ | ||||
| 			let error = new Error('Token Invalid'); | ||||
| 			error.name = 'Token Invalid'; | ||||
| 			error.message = `Token is not valid or as allready been used. ${data.token}`; | ||||
| 			error.status = 401; | ||||
| 			throw error; | ||||
| 		} | ||||
|  | ||||
| 		let user = await this.add(data); | ||||
|  | ||||
| 		if(user){ | ||||
| 			await token.consume({claimed_by: user.username}); | ||||
| 			return user; | ||||
| 		} | ||||
|  | ||||
| 	}catch(error){ | ||||
| 		throw error; | ||||
| 	} | ||||
|  | ||||
| }; | ||||
|  | ||||
| User.setPassword = async function(data){ | ||||
| 	try{ | ||||
| 		data['password'] = await bcrypt.hash(data['password'], saltRounds); | ||||
|  | ||||
| 		return this.__proto__.update(data); | ||||
| 	}catch(error){ | ||||
| 		throw error; | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| User.invite = async function(){ | ||||
| 	try{ | ||||
| 		let token = await InviteToken.add({created_by: this.username}); | ||||
| 		 | ||||
| 		return token; | ||||
|  | ||||
| 	}catch(error){ | ||||
| 		throw error; | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| module.exports = {User}; | ||||
|  | ||||
|  | ||||
| (async function(){ | ||||
| 	try{ | ||||
| 		await User.get('proxyadmin1'); | ||||
| 		console.info('proxyadmin1 user exists'); | ||||
| 	}catch(error){ | ||||
| 		try{ | ||||
| 			let user = await User.add({ | ||||
| 				username:'proxyadmin1', | ||||
| 				password: 'proxyadmin1', | ||||
| 				created_by:'proxyadmin1' | ||||
| 			}); | ||||
| 			console.log('proxyadmin1 created', user);	 | ||||
| 		}catch(error){ | ||||
| 			console.error(error) | ||||
| 		} | ||||
| 	} | ||||
| })(); | ||||
		Reference in New Issue
	
	Block a user