wekan/packages/meteor-useraccounts-core/lib/server.js

185 lines
5.4 KiB
JavaScript
Raw Normal View History

/* global
AT: false,
AccountsTemplates: false
*/
"use strict";
// Initialization
AT.prototype.init = function() {
console.warn("[AccountsTemplates] There is no more need to call AccountsTemplates.init()! Simply remove the call ;-)");
};
AT.prototype._init = function() {
if (this._initialized) {
return;
}
// Checks there is at least one account service installed
if (!Package["accounts-password"] && (!Accounts.oauth || Accounts.oauth.serviceNames().length === 0)) {
throw Error("AccountsTemplates: You must add at least one account service!");
}
// A password field is strictly required
var password = this.getField("password");
if (!password) {
throw Error("A password field is strictly required!");
}
if (password.type !== "password") {
throw Error("The type of password field should be password!");
}
// Then we can have "username" or "email" or even both of them
// but at least one of the two is strictly required
var username = this.getField("username");
var email = this.getField("email");
if (!username && !email) {
throw Error("At least one field out of username and email is strictly required!");
}
if (username && !username.required) {
throw Error("The username field should be required!");
}
if (email) {
if (email.type !== "email") {
throw Error("The type of email field should be email!");
}
if (username) {
// username and email
if (username.type !== "text") {
throw Error("The type of username field should be text when email field is present!");
}
} else {
// email only
if (!email.required) {
throw Error("The email field should be required when username is not present!");
}
}
} else {
// username only
if (username.type !== "text" && username.type !== "tel") {
throw Error("The type of username field should be text or tel!");
}
}
// Possibly publish more user data in order to be able to show add/remove
// buttons for 3rd-party services
if (this.options.showAddRemoveServices) {
// Publish additional current user info to get the list of registered services
// XXX TODO: use
// Accounts.addAutopublishFields({
// forLoggedInUser: ['services.facebook'],
// forOtherUsers: [],
// })
// ...adds only user.services.*.id
Meteor.publish("userRegisteredServices", function() {
var userId = this.userId;
return Meteor.users.find(userId, {fields: {services: 1}});
/*
if (userId) {
var user = Meteor.users.findOne(userId);
var services_id = _.chain(user.services)
.keys()
.reject(function(service) {return service === "resume";})
.map(function(service) {return "services." + service + ".id";})
.value();
var projection = {};
_.each(services_id, function(key) {projection[key] = 1;});
return Meteor.users.find(userId, {fields: projection});
}
*/
});
}
// Security stuff
if (this.options.overrideLoginErrors) {
Accounts.validateLoginAttempt(function(attempt) {
if (attempt.error) {
var reason = attempt.error.reason;
if (reason === "User not found" || reason === "Incorrect password") {
throw new Meteor.Error(403, AccountsTemplates.texts.errors.loginForbidden);
}
}
return attempt.allowed;
});
}
if (this.options.sendVerificationEmail && this.options.enforceEmailVerification) {
Accounts.validateLoginAttempt(function(attempt) {
if (!attempt.allowed) {
return false;
}
if (attempt.type !== "password" || attempt.methodName !== "login") {
return attempt.allowed;
}
var user = attempt.user;
if (!user) {
return attempt.allowed;
}
var ok = true;
var loginEmail = attempt.methodArguments[0].user.email.toLowerCase();
if (loginEmail) {
var email = _.filter(user.emails, function(obj) {
return obj.address.toLowerCase() === loginEmail;
});
if (!email.length || !email[0].verified) {
ok = false;
}
} else {
// we got the username, lets check there's at lease one verified email
var emailVerified = _.chain(user.emails)
.pluck('verified')
.any()
.value();
if (!emailVerified) {
ok = false;
}
}
if (!ok) {
throw new Meteor.Error(401, AccountsTemplates.texts.errors.verifyEmailFirst);
}
return attempt.allowed;
});
}
//Check that reCaptcha secret keys are available
if (this.options.showReCaptcha) {
var atSecretKey = AccountsTemplates.options.reCaptcha && AccountsTemplates.options.reCaptcha.secretKey;
var settingsSecretKey = Meteor.settings.reCaptcha && Meteor.settings.reCaptcha.secretKey;
if (!atSecretKey && !settingsSecretKey) {
throw new Meteor.Error(401, "User Accounts: reCaptcha secret key not found! Please provide it or set showReCaptcha to false." );
}
}
// Marks AccountsTemplates as initialized
this._initialized = true;
};
AccountsTemplates = new AT();
// Client side account creation is disabled by default:
// the methos ATCreateUserServer is used instead!
// to actually disable client side account creation use:
//
// AccountsTemplates.config({
// forbidClientAccountCreation: true
// });
Accounts.config({
forbidClientAccountCreation: true
});
// Initialization
Meteor.startup(function() {
AccountsTemplates._init();
});