/ * g l o b a l
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 ( ) ;
} ) ;