summaryrefslogtreecommitdiffstats
path: root/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form.js
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form.js')
-rw-r--r--packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form.js331
1 files changed, 331 insertions, 0 deletions
diff --git a/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form.js b/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form.js
new file mode 100644
index 00000000..2f8d53c4
--- /dev/null
+++ b/packages/meteor-useraccounts-core/lib/templates_helpers/at_pwd_form.js
@@ -0,0 +1,331 @@
+AT.prototype.atPwdFormHelpers = {
+ disabled: function() {
+ return AccountsTemplates.disabled();
+ },
+ fields: function() {
+ var parentData = Template.currentData();
+ var state = (parentData && parentData.state) || AccountsTemplates.getState();
+ return _.filter(AccountsTemplates.getFields(), function(s) {
+ return _.contains(s.visible, state);
+ });
+ },
+ showForgotPasswordLink: function() {
+ var parentData = Template.currentData();
+ var state = (parentData && parentData.state) || AccountsTemplates.getState();
+ return state === "signIn" && AccountsTemplates.options.showForgotPasswordLink;
+ },
+ showReCaptcha: function() {
+ var parentData = Template.currentData();
+ var state = (parentData && parentData.state) || AccountsTemplates.getState();
+ return state === "signUp" && AccountsTemplates.options.showReCaptcha;
+ },
+};
+
+
+var toLowercaseUsername = function(value){
+ return value.toLowerCase().replace(/\s+/gm, '');
+};
+
+AT.prototype.atPwdFormEvents = {
+ // Form submit
+ "submit #at-pwd-form": function(event, t) {
+ event.preventDefault();
+ t.$("#at-btn").blur();
+
+ AccountsTemplates.setDisabled(true);
+
+ var parentData = Template.currentData();
+ var state = (parentData && parentData.state) || AccountsTemplates.getState();
+ var preValidation = (state !== "signIn");
+
+ // Client-side pre-validation
+ // Validates fields values
+ // NOTE: This is the only place where password validation can be enforced!
+ var formData = {};
+ var someError = false;
+ var errList = [];
+ _.each(AccountsTemplates.getFields(), function(field){
+ // Considers only visible fields...
+ if (!_.contains(field.visible, state))
+ return;
+
+ var fieldId = field._id;
+
+ var rawValue = field.getValue(t);
+ var value = field.fixValue(rawValue);
+ // Possibly updates the input value
+ if (value !== rawValue) {
+ field.setValue(t, value);
+ }
+ if (value !== undefined && value !== "") {
+ formData[fieldId] = value;
+ }
+
+ // Validates the field value only if current state is not "signIn"
+ if (preValidation && field.getStatus() !== false){
+ var validationErr = field.validate(value, "strict");
+ if (validationErr) {
+ if (field.negativeValidation)
+ field.setError(validationErr);
+ else{
+ var fId = T9n.get(field.getDisplayName(), markIfMissing=false);
+ //errList.push(fId + ": " + err);
+ errList.push({
+ field: field.getDisplayName(),
+ err: validationErr
+ });
+ }
+ someError = true;
+ }
+ else
+ field.setSuccess();
+ }
+ });
+
+ // Clears error and result
+ AccountsTemplates.clearError();
+ AccountsTemplates.clearResult();
+ AccountsTemplates.clearMessage();
+ // Possibly sets errors
+ if (someError){
+ if (errList.length)
+ AccountsTemplates.state.form.set("error", errList);
+ AccountsTemplates.setDisabled(false);
+ //reset reCaptcha form
+ if (state === "signUp" && AccountsTemplates.options.showReCaptcha) {
+ grecaptcha.reset();
+ }
+ return;
+ }
+
+ // Extracts username, email, and pwds
+ var current_password = formData.current_password;
+ var email = formData.email;
+ var password = formData.password;
+ var password_again = formData.password_again;
+ var username = formData.username;
+ var username_and_email = formData.username_and_email;
+ // Clears profile data removing username, email, and pwd
+ delete formData.current_password;
+ delete formData.email;
+ delete formData.password;
+ delete formData.password_again;
+ delete formData.username;
+ delete formData.username_and_email;
+
+ if (AccountsTemplates.options.confirmPassword){
+ // Checks passwords for correct match
+ if (password_again && password !== password_again){
+ var pwd_again = AccountsTemplates.getField("password_again");
+ if (pwd_again.negativeValidation)
+ pwd_again.setError(AccountsTemplates.texts.errors.pwdMismatch);
+ else
+ AccountsTemplates.state.form.set("error", [{
+ field: pwd_again.getDisplayName(),
+ err: AccountsTemplates.texts.errors.pwdMismatch
+ }]);
+ AccountsTemplates.setDisabled(false);
+ //reset reCaptcha form
+ if (state === "signUp" && AccountsTemplates.options.showReCaptcha) {
+ grecaptcha.reset();
+ }
+ return;
+ }
+ }
+
+ // -------
+ // Sign In
+ // -------
+ if (state === "signIn") {
+ var pwdOk = !!password;
+ var userOk = true;
+ var loginSelector;
+ if (email) {
+ if (AccountsTemplates.options.lowercaseUsername) {
+ email = toLowercaseUsername(email);
+ }
+
+ loginSelector = {email: email};
+ }
+ else if (username) {
+ if (AccountsTemplates.options.lowercaseUsername) {
+ username = toLowercaseUsername(username);
+ }
+ loginSelector = {username: username};
+ }
+ else if (username_and_email) {
+ if (AccountsTemplates.options.lowercaseUsername) {
+ username_and_email = toLowercaseUsername(username_and_email);
+ }
+ loginSelector = username_and_email;
+ }
+ else
+ userOk = false;
+
+ // Possibly exits if not both 'password' and 'username' are non-empty...
+ if (!pwdOk || !userOk){
+ AccountsTemplates.state.form.set("error", [AccountsTemplates.texts.errors.loginForbidden]);
+ AccountsTemplates.setDisabled(false);
+ return;
+ }
+
+
+ return Meteor.loginWithPassword(loginSelector, password, function(error) {
+ AccountsTemplates.submitCallback(error, state);
+ });
+ }
+
+ // -------
+ // Sign Up
+ // -------
+ if (state === "signUp") {
+ // Possibly gets reCaptcha response
+ if (AccountsTemplates.options.showReCaptcha) {
+ var response = grecaptcha.getResponse();
+ if (response === "") {
+ // recaptcha verification has not completed yet (or has expired)...
+ // ...simply ignore submit event!
+ AccountsTemplates.setDisabled(false);
+ return;
+ } else {
+ formData.reCaptchaResponse = response;
+ }
+ }
+
+ var hash = Accounts._hashPassword(password);
+ var options = {
+ username: username,
+ email: email,
+ password: hash,
+ profile: formData,
+ };
+
+ // Call preSignUpHook, if any...
+ var preSignUpHook = AccountsTemplates.options.preSignUpHook;
+ if (preSignUpHook) {
+ preSignUpHook(password, options);
+ }
+
+ return Meteor.call("ATCreateUserServer", options, function(error){
+ if (error && error.reason === 'Email already exists.') {
+ if (AccountsTemplates.options.showReCaptcha) {
+ grecaptcha.reset();
+ }
+ }
+ AccountsTemplates.submitCallback(error, undefined, function(){
+ if (AccountsTemplates.options.sendVerificationEmail && AccountsTemplates.options.enforceEmailVerification){
+ AccountsTemplates.submitCallback(error, state, function () {
+ AccountsTemplates.state.form.set("result", AccountsTemplates.texts.info.signUpVerifyEmail);
+ // Cleans up input fields' content
+ _.each(AccountsTemplates.getFields(), function(field){
+ // Considers only visible fields...
+ if (!_.contains(field.visible, state))
+ return;
+
+ var elem = t.$("#at-field-" + field._id);
+
+ // Naïve reset
+ if (field.type === "checkbox") elem.prop('checked', false);
+ else elem.val("");
+
+ });
+ AccountsTemplates.setDisabled(false);
+ AccountsTemplates.avoidRedirect = true;
+ });
+ }
+ else {
+ var loginSelector;
+
+ if (email) {
+ if (AccountsTemplates.options.lowercaseUsername) {
+ email = toLowercaseUsername(email);
+ }
+
+ loginSelector = {email: email};
+ }
+ else if (username) {
+ if (AccountsTemplates.options.lowercaseUsername) {
+ username = toLowercaseUsername(username);
+ }
+ loginSelector = {username: username};
+ }
+ else {
+ if (AccountsTemplates.options.lowercaseUsername) {
+ username_and_email = toLowercaseUsername(username_and_email);
+ }
+ loginSelector = username_and_email;
+ }
+
+ Meteor.loginWithPassword(loginSelector, password, function(error) {
+ AccountsTemplates.submitCallback(error, state, function(){
+ AccountsTemplates.setState("signIn");
+ });
+ });
+ }
+ });
+ });
+ }
+
+ //----------------
+ // Forgot Password
+ //----------------
+ if (state === "forgotPwd"){
+ return Accounts.forgotPassword({
+ email: email
+ }, function(error) {
+ AccountsTemplates.submitCallback(error, state, function(){
+ AccountsTemplates.state.form.set("result", AccountsTemplates.texts.info.emailSent);
+ t.$("#at-field-email").val("");
+ });
+ });
+ }
+
+ //--------------------------------
+ // Reset Password / Enroll Account
+ //--------------------------------
+ if (state === "resetPwd" || state === "enrollAccount") {
+ var paramToken = AccountsTemplates.getparamToken();
+ return Accounts.resetPassword(paramToken, password, function(error) {
+ AccountsTemplates.submitCallback(error, state, function(){
+ var pwd_field_id;
+ if (state === "resetPwd")
+ AccountsTemplates.state.form.set("result", AccountsTemplates.texts.info.pwdReset);
+ else // Enroll Account
+ AccountsTemplates.state.form.set("result", AccountsTemplates.texts.info.pwdSet);
+ t.$("#at-field-password").val("");
+ if (AccountsTemplates.options.confirmPassword)
+ t.$("#at-field-password_again").val("");
+ });
+ });
+ }
+
+ //----------------
+ // Change Password
+ //----------------
+ if (state === "changePwd"){
+ return Accounts.changePassword(current_password, password, function(error) {
+ AccountsTemplates.submitCallback(error, state, function(){
+ AccountsTemplates.state.form.set("result", AccountsTemplates.texts.info.pwdChanged);
+ t.$("#at-field-current_password").val("");
+ t.$("#at-field-password").val("");
+ if (AccountsTemplates.options.confirmPassword)
+ t.$("#at-field-password_again").val("");
+ });
+ });
+ }
+
+ //----------------
+ // Resend Verification E-mail
+ //----------------
+ if (state === "resendVerificationEmail"){
+ return Meteor.call("ATResendVerificationEmail", email, function (error) {
+ AccountsTemplates.submitCallback(error, state, function(){
+ AccountsTemplates.state.form.set("result", AccountsTemplates.texts.info.verificationEmailSent);
+ t.$("#at-field-email").val("");
+
+ AccountsTemplates.avoidRedirect = true;
+ });
+ });
+ }
+ },
+};