kibana-with-account
Version:
kibana-with-account is develop based kibana project
187 lines (150 loc) • 4.84 kB
JavaScript
var Joi = require('joi');
var Hoek = require('hoek');
var Async = require('async');
var Config = require('../config');
exports.register = function (server, options, next) {
options = Hoek.applyToDefaults({basePath: ''}, options);
server.route({
method: 'POST',
path: options.basePath + '/signup',
config: {
plugins: {
'hapi-auth-cookie': {
redirectTo: false
}
},
auth: {
mode: 'try',
strategy: 'session'
},
validate: {
payload: {
email: Joi.string().email().lowercase().required(),
username: Joi.string().token().lowercase().required(),
password: Joi.string().required()
}
},
pre: [{
assign: 'usernameCheck',
method: function (request, reply) {
var User = request.server.plugins['hapi-mongo-models'].User;
var conditions = {
username: request.payload.username
};
User.findOne(conditions, function (err, user) {
if (err) {
return reply(err);
}
if (user) {
var response = {
message: 'Username already in use.'
};
return reply(response).takeover().code(409);
}
reply(true);
});
}
}, {
assign: 'emailCheck',
method: function (request, reply) {
var User = request.server.plugins['hapi-mongo-models'].User;
var conditions = {
email: request.payload.email
};
User.findOne(conditions, function (err, user) {
if (err) {
return reply(err);
}
if (user) {
var response = {
message: 'Email already in use.'
};
return reply(response).takeover().code(409);
}
reply(true);
});
}
}]
},
handler: function (request, reply) {
var User = request.server.plugins['hapi-mongo-models'].User;
var UserGroup = request.server.plugins['hapi-mongo-models'].UserGroup;
var AdminGroup = request.server.plugins['hapi-mongo-models'].AdminGroup;
var Session = request.server.plugins['hapi-mongo-models'].Session;
var mailer = request.server.plugins.mailer;
Async.auto({
user: function (done) {
var username = request.payload.username;
var password = request.payload.password;
var email = request.payload.email;
User.create(username, password, email, done);
},
adminGroup: ['user', function (done, results) {
AdminGroup.findByUsername('default', done);
}],
linkAccount: ['adminGroup', function (done, results) {
var id = results.user._id.toString();
var update = {
$set: {
roles: {
account: {
id: results.adminGroup._id.toString(),
name: results.adminGroup.name
}
},
group: 'default'
}
};
User.findByIdAndUpdate(id, update, done);
}],
welcome: ['linkAccount', function (done, results) {
var emailOptions = {
subject: 'Your ' + Config.get('/projectName') + ' account',
to: {
name: request.payload.name,
address: request.payload.email
}
};
var template = 'welcome';
mailer.sendEmail(emailOptions, template, request.payload, function (err) {
if (err) {
console.warn('sending welcome email failed:', err.stack);
}
});
done();
}],
session: ['linkAccount', function (done, results) {
Session.create(results.user._id.toString(), done);
}],
group: ['linkAccount', function (done, results) {
UserGroup.findGroupByName(results.user.group, done);
}]
}, function (err, results) {
if (err) {
return reply(err);
}
var user = results.linkAccount;
var group = results.group;
var credentials = user.username + ':' + results.session.key;
var authHeader = 'Basic ' + new Buffer(credentials).toString('base64');
var result = {
user: {
_id: user._id,
username: user.username,
email: user.email,
roles: user.roles,
index: group.index
},
session: results.session,
authHeader: authHeader
};
request.auth.session.set(result);
reply(result);
});
}
});
next();
};
exports.register.attributes = {
name: 'signup'
};