rc1
This commit is contained in:
		| @ -1,12 +1,14 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const {User} = require('./user'); | ||||
| const {Token, AuthToken} = require('./token'); | ||||
|  | ||||
| Auth = {} | ||||
| var Auth = {} | ||||
| Auth.errors = {} | ||||
|  | ||||
| Auth.errors.login = function(){ | ||||
| 	let error = new Error('PamLoginFailed'); | ||||
| 	error.name = 'PamLoginFailed'; | ||||
| 	let error = new Error('LDAPLoginFailed'); | ||||
| 	error.name = 'LDAPLoginFailed'; | ||||
| 	error.message = `Invalid Credentials, login failed.`; | ||||
| 	error.status = 401; | ||||
|  | ||||
|  | ||||
							
								
								
									
										32
									
								
								nodejs/models/email.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								nodejs/models/email.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const sgMail = require('@sendgrid/mail'); | ||||
| const mustache = require('mustache'); | ||||
| const conf = require('../app').conf; | ||||
|  | ||||
| sgMail.setApiKey(conf.SENDGRID_API_KEY); | ||||
|  | ||||
| var Mail = {}; | ||||
|  | ||||
| Mail.send = async function(to, subject, message, from){ | ||||
| 	await sgMail.send({ | ||||
| 		to: to, | ||||
| 		from: from || 'Theta 42 Accounts <accounts@no-reply.theta42.com>', | ||||
| 		subject: subject, | ||||
| 		text: message, | ||||
| 		html: message, | ||||
| 	}); | ||||
| }; | ||||
|  | ||||
|  | ||||
| Mail.sendTemplate = async function(to, template, context, from){ | ||||
| 	template = require(`../views/email_templates/${template}`); | ||||
| 	await Mail.send( | ||||
| 		to, | ||||
| 		mustache.render(template.subject, context), | ||||
| 		mustache.render(template.message, context), | ||||
| 		from || (template.from && mustache.render(template.message, context)) | ||||
| 	) | ||||
| }; | ||||
|  | ||||
| module.exports = {Mail}; | ||||
| @ -4,7 +4,7 @@ const { Client, Attribute, Change } = require('ldapts'); | ||||
| const conf = require('../app').conf.ldap; | ||||
|  | ||||
| const client = new Client({ | ||||
|   url: conf.url, | ||||
| 	url: conf.url, | ||||
| }); | ||||
|  | ||||
| async function getGroups(client){ | ||||
| @ -25,21 +25,21 @@ async function getGroups(client){ | ||||
| } | ||||
|  | ||||
| async function addGroup(client, data){ | ||||
|   try{ | ||||
| 	try{ | ||||
|  | ||||
|     await client.add(`cn=${data.name},${conf.groupBase}`, { | ||||
|       cn: data.name, | ||||
|       member: data.owner, | ||||
|       description: data.description, | ||||
|       owner: data.owner, | ||||
|       objectclass: [ 'groupOfNames', 'top'  ] | ||||
|     }); | ||||
| 		await client.add(`cn=${data.name},${conf.groupBase}`, { | ||||
| 			cn: data.name, | ||||
| 			member: data.owner, | ||||
| 			description: data.description, | ||||
| 			owner: data.owner, | ||||
| 			objectclass: [ 'groupOfNames', 'top'  ] | ||||
| 		}); | ||||
|  | ||||
|     return data; | ||||
| 		return data; | ||||
|  | ||||
|   }catch(error){ | ||||
|     throw error; | ||||
|   } | ||||
| 	}catch(error){ | ||||
| 		throw error; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| async function addMember(client, group, user){ | ||||
| @ -61,18 +61,18 @@ async function addMember(client, group, user){ | ||||
|  | ||||
| async function removeMember(client, group, user){ | ||||
|   try{ | ||||
|     await client.modify(group.dn, [ | ||||
|       new Change({ | ||||
|         operation: 'delete', | ||||
|         modification: new Attribute({ | ||||
|           type: 'member', | ||||
|           values: [user.dn]  | ||||
|         })}), | ||||
|     ]);  | ||||
|   }catch(error){ | ||||
|     if(error = "TypeOrValueExistsError")return ; | ||||
|     throw error; | ||||
|   } | ||||
| 	await client.modify(group.dn, [ | ||||
| 		new Change({ | ||||
| 			operation: 'delete', | ||||
| 			modification: new Attribute({ | ||||
| 				type: 'member', | ||||
| 				values: [user.dn]  | ||||
| 			})}), | ||||
| 		]);  | ||||
| 	}catch(error){ | ||||
| 		if(error = "TypeOrValueExistsError")return ; | ||||
| 		throw error; | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -134,4 +134,19 @@ Group.get = async function(data){ | ||||
| 	} | ||||
| } | ||||
|  | ||||
| Group.add = async function(data){ | ||||
| 	try{ | ||||
| 		await client.bind(conf.bindDN, conf.bindPassword); | ||||
|  | ||||
| 		await addGroup(client, data); | ||||
|  | ||||
| 		await client.unbind(); | ||||
|  | ||||
| 		return this.get(data); | ||||
|  | ||||
| 	}catch(error){ | ||||
|  | ||||
| 	} | ||||
| } | ||||
|  | ||||
| module.exports = {Group}; | ||||
|  | ||||
| @ -29,7 +29,9 @@ Token.check = async function(data){ | ||||
| var InviteToken = Object.create(Token({ | ||||
| 	name: 'invite', | ||||
| 	keyMap:{ | ||||
| 		claimed_by: {default:"__NONE__", isRequired: false, type: 'string',} | ||||
| 		claimed_by: {default:"__NONE__", isRequired: false, type: 'string',}, | ||||
| 		mail: {default:"__NONE__", isRequired: false, type: 'string',}, | ||||
| 		mail_token: {default: UUID, type: 'string', min: 36, max: 36}, | ||||
| 	} | ||||
| })); | ||||
|  | ||||
| @ -53,7 +55,7 @@ var AuthToken = Object.create(Token({ | ||||
| })); | ||||
|  | ||||
| AuthToken.add = async function(data){ | ||||
| 	data.created_by = data.username; | ||||
| 	data.created_by = data.uid; | ||||
| 	return AuthToken.__proto__.add(data); | ||||
| }; | ||||
|  | ||||
|  | ||||
| @ -3,6 +3,7 @@ | ||||
| const { Client, Attribute, Change } = require('ldapts'); | ||||
| const crypto = require('crypto'); | ||||
|  | ||||
| const {Mail} = require('./email'); | ||||
| const {Token, InviteToken} = require('./token'); | ||||
| const conf = require('../app').conf.ldap; | ||||
|  | ||||
| @ -47,7 +48,9 @@ async function addPosixAccount(client, data){ | ||||
|       uid: data.uid, | ||||
|       uidNumber: data.uidNumber, | ||||
|       gidNumber: data.gidNumber, | ||||
|       givenName: data.givenName, | ||||
|       mail: data.mail, | ||||
|       mobile: data.mobile, | ||||
|       loginShell: data.loginShell, | ||||
|       homeDirectory: data.homeDirectory, | ||||
|       userPassword: data.userPassword, | ||||
| @ -81,6 +84,14 @@ async function addLdapUser(client, data){ | ||||
|   } | ||||
| } | ||||
|  | ||||
| async function deleteLdapUser(client, data){ | ||||
| 	try{ | ||||
| 		await client.del(`cn=${data.cn},${conf.groupBase}`); | ||||
| 		await client.del(data.dn); | ||||
| 	}catch(error){ | ||||
| 		throw error; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| async function changeLdapPassword(client, data){ | ||||
|   try{ | ||||
| @ -100,14 +111,8 @@ async function changeLdapPassword(client, data){ | ||||
| const user_parse = function(data){ | ||||
| 	if(data[conf.userNameAttribute]){ | ||||
| 		data.username = data[conf.userNameAttribute] | ||||
| 		// delete data[conf.userNameAttribute]; | ||||
| 	} | ||||
|  | ||||
| 	// if(data.uidNumber){ | ||||
| 	// 	data.uid = data.uidNumber; | ||||
| 	// 	delete data.uidNumber; | ||||
| 	// } | ||||
|  | ||||
| 	return data; | ||||
| } | ||||
|  | ||||
| @ -115,11 +120,6 @@ var User = {} | ||||
|  | ||||
| User.backing = "LDAP"; | ||||
|  | ||||
| User.keyMap = { | ||||
| 	'username': {isRequired: true, type: 'string', min: 3, max: 500}, | ||||
| 	'password': {isRequired: true, type: 'string', min: 3, max: 500}, | ||||
| } | ||||
|  | ||||
| User.list = async function(){ | ||||
| 	try{ | ||||
| 		await client.bind(conf.bindDN, conf.bindPassword); | ||||
| @ -170,14 +170,14 @@ User.listDetail = async function(){ | ||||
| User.get = async function(data){ | ||||
| 	try{ | ||||
| 		if(typeof data !== 'object'){ | ||||
| 			let username = data; | ||||
| 			let uid = data; | ||||
| 			data = {}; | ||||
| 			data.username = username; | ||||
| 			data.uid = uid; | ||||
| 		} | ||||
| 		 | ||||
| 		await client.bind(conf.bindDN, conf.bindPassword); | ||||
|  | ||||
| 		let filter = `(&${conf.userFilter}(${conf.userNameAttribute}=${data.username}))`; | ||||
| 		let filter = `(&${conf.userFilter}(${conf.userNameAttribute}=${data.uid}))`; | ||||
|  | ||||
| 		const res = await client.search(conf.userBase, { | ||||
| 			scope: 'sub', | ||||
| @ -225,7 +225,18 @@ User.add = async function(data) { | ||||
|  | ||||
| 		await client.unbind(); | ||||
|  | ||||
| 		return this.get(data.uid); | ||||
| 		let user = await this.get(data.uid); | ||||
|  | ||||
|  | ||||
| 		await Mail.sendTemplate( | ||||
| 			user.mail, | ||||
| 			'welcome', | ||||
| 			{ | ||||
| 				user: user | ||||
| 			} | ||||
| 		) | ||||
|  | ||||
| 		return user; | ||||
|  | ||||
| 	}catch(error){ | ||||
| 		if(error.message.includes('exists')){ | ||||
| @ -244,7 +255,7 @@ User.addByInvite = async function(data){ | ||||
| 	try{ | ||||
| 		let token = await InviteToken.get(data.token); | ||||
|  | ||||
| 		if(!token.is_valid){ | ||||
| 		if(!token.is_valid && data.mailToken !== token.mail_token){ | ||||
| 			let error = new Error('Token Invalid'); | ||||
| 			error.name = 'Token Invalid'; | ||||
| 			error.message = `Token is not valid or as allready been used. ${data.token}`; | ||||
| @ -252,6 +263,8 @@ User.addByInvite = async function(data){ | ||||
| 			throw error; | ||||
| 		} | ||||
|  | ||||
| 		data.mail = token.mail; | ||||
|  | ||||
| 		let user = await this.add(data); | ||||
|  | ||||
| 		if(user){ | ||||
| @ -265,13 +278,37 @@ User.addByInvite = async function(data){ | ||||
|  | ||||
| }; | ||||
|  | ||||
| // User.remove = async function(data){ | ||||
| // 	try{ | ||||
| // 		return await linuxUser.removeUser(this.username); | ||||
| // 	}catch(error){ | ||||
| // 		throw error; | ||||
| // 	} | ||||
| // }; | ||||
| User.verifyEmail = async function(data){ | ||||
| 	try{ | ||||
| 		let token = await InviteToken.get(data.token); | ||||
| 		await token.update({mail: data.mail}) | ||||
| 		await Mail.sendTemplate( | ||||
| 			data.mail, | ||||
| 			'validate_link', | ||||
| 			{ | ||||
| 				link:`${data.url}/login/invite/${token.token}/${token.mail_token}` | ||||
| 			} | ||||
| 		) | ||||
| 	}catch(error){ | ||||
| 		throw error; | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| User.remove = async function(data){ | ||||
| 	try{ | ||||
|  | ||||
| 		await client.bind(conf.bindDN, conf.bindPassword); | ||||
|  | ||||
| 		await deleteLdapUser(client, this); | ||||
|  | ||||
| 		await client.unbind(); | ||||
|  | ||||
| 		return true | ||||
|  | ||||
| 	}catch(error){ | ||||
| 		throw error; | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| // User.setPassword = async function(data){ | ||||
| // 	try{ | ||||
|  | ||||
		Reference in New Issue
	
	Block a user