2013-05-31 02:12:33 +08:00
|
|
|
/**
|
|
|
|
The modal for creating accounts
|
|
|
|
|
|
|
|
@class CreateAccountController
|
|
|
|
@extends Discourse.Controller
|
|
|
|
@namespace Discourse
|
|
|
|
@uses Discourse.ModalFunctionality
|
|
|
|
@module Discourse
|
|
|
|
**/
|
|
|
|
Discourse.CreateAccountController = Discourse.Controller.extend(Discourse.ModalFunctionality, {
|
|
|
|
uniqueUsernameValidation: null,
|
|
|
|
globalNicknameExists: false,
|
|
|
|
complete: false,
|
|
|
|
accountPasswordConfirm: 0,
|
|
|
|
accountChallenge: 0,
|
|
|
|
formSubmitted: false,
|
2013-07-26 01:01:27 +08:00
|
|
|
rejectedEmails: Em.A([]),
|
2013-12-21 05:34:34 +08:00
|
|
|
rejectedPasswords: Em.A([]),
|
2013-11-20 03:15:05 +08:00
|
|
|
prefilledUsername: null,
|
2013-05-31 02:12:33 +08:00
|
|
|
|
|
|
|
submitDisabled: function() {
|
|
|
|
if (this.get('formSubmitted')) return true;
|
|
|
|
if (this.get('nameValidation.failed')) return true;
|
|
|
|
if (this.get('emailValidation.failed')) return true;
|
|
|
|
if (this.get('usernameValidation.failed')) return true;
|
|
|
|
if (this.get('passwordValidation.failed')) return true;
|
|
|
|
return false;
|
|
|
|
}.property('nameValidation.failed', 'emailValidation.failed', 'usernameValidation.failed', 'passwordValidation.failed', 'formSubmitted'),
|
|
|
|
|
|
|
|
passwordRequired: function() {
|
2013-12-18 01:29:29 +08:00
|
|
|
return (this.blank('authOptions.auth_provider') || this.blank('authOptions.email_valid') || !this.get('authOptions.email_valid'));
|
2013-05-31 02:12:33 +08:00
|
|
|
}.property('authOptions.auth_provider'),
|
|
|
|
|
2013-12-17 06:31:05 +08:00
|
|
|
passwordInstructions: function() {
|
2013-12-20 05:15:36 +08:00
|
|
|
return I18n.t('user.password.instructions', {count: Discourse.SiteSettings.min_password_length});
|
2013-12-17 06:31:05 +08:00
|
|
|
}.property(),
|
|
|
|
|
2013-05-31 02:12:33 +08:00
|
|
|
// Validate the name
|
|
|
|
nameValidation: function() {
|
|
|
|
|
|
|
|
// If blank, fail without a reason
|
|
|
|
if (this.blank('accountName')) return Discourse.InputValidation.create({ failed: true });
|
|
|
|
|
|
|
|
if (this.get('accountPasswordConfirm') === 0) {
|
|
|
|
this.fetchConfirmationValue();
|
|
|
|
}
|
|
|
|
|
|
|
|
// If too short
|
|
|
|
if (this.get('accountName').length < 3) {
|
|
|
|
return Discourse.InputValidation.create({
|
|
|
|
failed: true,
|
2013-07-09 07:32:16 +08:00
|
|
|
reason: I18n.t('user.name.too_short')
|
2013-05-31 02:12:33 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// Looks good!
|
|
|
|
return Discourse.InputValidation.create({
|
|
|
|
ok: true,
|
2013-07-09 07:32:16 +08:00
|
|
|
reason: I18n.t('user.name.ok')
|
2013-05-31 02:12:33 +08:00
|
|
|
});
|
|
|
|
}.property('accountName'),
|
|
|
|
|
|
|
|
// Check the email address
|
|
|
|
emailValidation: function() {
|
|
|
|
// If blank, fail without a reason
|
|
|
|
var email;
|
|
|
|
if (this.blank('accountEmail')) {
|
|
|
|
return Discourse.InputValidation.create({
|
|
|
|
failed: true
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
email = this.get("accountEmail");
|
2013-07-26 01:01:27 +08:00
|
|
|
|
|
|
|
if (this.get('rejectedEmails').contains(email)) {
|
|
|
|
return Discourse.InputValidation.create({
|
|
|
|
failed: true,
|
|
|
|
reason: I18n.t('user.email.invalid')
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2013-05-31 02:12:33 +08:00
|
|
|
if ((this.get('authOptions.email') === email) && this.get('authOptions.email_valid')) {
|
|
|
|
return Discourse.InputValidation.create({
|
|
|
|
ok: true,
|
2013-07-09 07:32:16 +08:00
|
|
|
reason: I18n.t('user.email.authenticated', {
|
2013-05-31 02:12:33 +08:00
|
|
|
provider: this.get('authOptions.auth_provider')
|
|
|
|
})
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
if (Discourse.Utilities.emailValid(email)) {
|
|
|
|
return Discourse.InputValidation.create({
|
|
|
|
ok: true,
|
2013-07-09 07:32:16 +08:00
|
|
|
reason: I18n.t('user.email.ok')
|
2013-05-31 02:12:33 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
return Discourse.InputValidation.create({
|
|
|
|
failed: true,
|
2013-07-09 07:32:16 +08:00
|
|
|
reason: I18n.t('user.email.invalid')
|
2013-05-31 02:12:33 +08:00
|
|
|
});
|
2013-07-26 01:01:27 +08:00
|
|
|
}.property('accountEmail', 'rejectedEmails.@each'),
|
2013-05-31 02:12:33 +08:00
|
|
|
|
2013-11-20 03:15:05 +08:00
|
|
|
prefillUsername: function() {
|
|
|
|
if (this.get('prefilledUsername')) {
|
2013-11-21 03:22:51 +08:00
|
|
|
// If username field has been filled automatically, and email field just changed,
|
|
|
|
// then remove the username.
|
2013-11-20 03:15:05 +08:00
|
|
|
if (this.get('accountUsername') === this.get('prefilledUsername')) {
|
|
|
|
this.set('accountUsername', '');
|
|
|
|
}
|
|
|
|
this.set('prefilledUsername', null);
|
|
|
|
}
|
2013-11-21 03:22:51 +08:00
|
|
|
if (this.get('emailValidation.ok') && (this.blank('accountUsername') || this.get('authOptions.email'))) {
|
|
|
|
// If email is valid and username has not been entered yet,
|
|
|
|
// or email and username were filled automatically by 3rd parth auth,
|
|
|
|
// then look for a registered username that matches the email.
|
2013-11-20 03:15:05 +08:00
|
|
|
this.fetchExistingUsername();
|
|
|
|
}
|
|
|
|
}.observes('emailValidation', 'accountEmail'),
|
|
|
|
|
|
|
|
fetchExistingUsername: Discourse.debounce(function() {
|
|
|
|
var self = this;
|
|
|
|
Discourse.User.checkUsername(null, this.get('accountEmail')).then(function(result) {
|
2013-11-21 03:22:51 +08:00
|
|
|
if (result.suggestion && (self.blank('accountUsername') || self.get('accountUsername') === self.get('authOptions.username'))) {
|
2013-11-20 03:15:05 +08:00
|
|
|
self.set('accountUsername', result.suggestion);
|
|
|
|
self.set('prefilledUsername', result.suggestion);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}, 500),
|
|
|
|
|
2013-05-31 02:12:33 +08:00
|
|
|
usernameMatch: function() {
|
|
|
|
if (this.usernameNeedsToBeValidatedWithEmail()) {
|
|
|
|
if (this.get('emailValidation.failed')) {
|
|
|
|
if (this.shouldCheckUsernameMatch()) {
|
|
|
|
return this.set('uniqueUsernameValidation', Discourse.InputValidation.create({
|
|
|
|
failed: true,
|
2013-07-09 07:32:16 +08:00
|
|
|
reason: I18n.t('user.username.enter_email')
|
2013-05-31 02:12:33 +08:00
|
|
|
}));
|
|
|
|
} else {
|
|
|
|
return this.set('uniqueUsernameValidation', Discourse.InputValidation.create({ failed: true }));
|
|
|
|
}
|
|
|
|
} else if (this.shouldCheckUsernameMatch()) {
|
|
|
|
this.set('uniqueUsernameValidation', Discourse.InputValidation.create({
|
|
|
|
failed: true,
|
2013-07-09 07:32:16 +08:00
|
|
|
reason: I18n.t('user.username.checking')
|
2013-05-31 02:12:33 +08:00
|
|
|
}));
|
|
|
|
return this.checkUsernameAvailability();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}.observes('accountEmail'),
|
|
|
|
|
|
|
|
basicUsernameValidation: function() {
|
|
|
|
this.set('uniqueUsernameValidation', null);
|
|
|
|
|
2013-11-20 03:15:05 +08:00
|
|
|
if (this.get('accountUsername') === this.get('prefilledUsername')) {
|
|
|
|
return Discourse.InputValidation.create({
|
|
|
|
ok: true,
|
|
|
|
reason: I18n.t('user.username.prefilled')
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2013-05-31 02:12:33 +08:00
|
|
|
// If blank, fail without a reason
|
|
|
|
if (this.blank('accountUsername')) {
|
|
|
|
return Discourse.InputValidation.create({
|
|
|
|
failed: true
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// If too short
|
|
|
|
if (this.get('accountUsername').length < 3) {
|
|
|
|
return Discourse.InputValidation.create({
|
|
|
|
failed: true,
|
2013-07-09 07:32:16 +08:00
|
|
|
reason: I18n.t('user.username.too_short')
|
2013-05-31 02:12:33 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// If too long
|
|
|
|
if (this.get('accountUsername').length > 15) {
|
|
|
|
return Discourse.InputValidation.create({
|
|
|
|
failed: true,
|
2013-07-09 07:32:16 +08:00
|
|
|
reason: I18n.t('user.username.too_long')
|
2013-05-31 02:12:33 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
this.checkUsernameAvailability();
|
|
|
|
// Let's check it out asynchronously
|
|
|
|
return Discourse.InputValidation.create({
|
|
|
|
failed: true,
|
2013-07-09 07:32:16 +08:00
|
|
|
reason: I18n.t('user.username.checking')
|
2013-05-31 02:12:33 +08:00
|
|
|
});
|
|
|
|
}.property('accountUsername'),
|
|
|
|
|
|
|
|
shouldCheckUsernameMatch: function() {
|
|
|
|
return !this.blank('accountUsername') && this.get('accountUsername').length > 2;
|
|
|
|
},
|
|
|
|
|
|
|
|
checkUsernameAvailability: Discourse.debounce(function() {
|
|
|
|
var _this = this;
|
|
|
|
if (this.shouldCheckUsernameMatch()) {
|
|
|
|
return Discourse.User.checkUsername(this.get('accountUsername'), this.get('accountEmail')).then(function(result) {
|
|
|
|
_this.set('globalNicknameExists', false);
|
|
|
|
if (result.available) {
|
|
|
|
if (result.global_match) {
|
|
|
|
_this.set('globalNicknameExists', true);
|
|
|
|
return _this.set('uniqueUsernameValidation', Discourse.InputValidation.create({
|
|
|
|
ok: true,
|
2013-07-09 07:32:16 +08:00
|
|
|
reason: I18n.t('user.username.global_match')
|
2013-05-31 02:12:33 +08:00
|
|
|
}));
|
|
|
|
} else {
|
|
|
|
return _this.set('uniqueUsernameValidation', Discourse.InputValidation.create({
|
|
|
|
ok: true,
|
2013-07-09 07:32:16 +08:00
|
|
|
reason: I18n.t('user.username.available')
|
2013-05-31 02:12:33 +08:00
|
|
|
}));
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (result.suggestion) {
|
|
|
|
if (result.global_match !== void 0 && result.global_match === false) {
|
|
|
|
_this.set('globalNicknameExists', true);
|
|
|
|
return _this.set('uniqueUsernameValidation', Discourse.InputValidation.create({
|
|
|
|
failed: true,
|
2013-07-09 07:32:16 +08:00
|
|
|
reason: I18n.t('user.username.global_mismatch', result)
|
2013-05-31 02:12:33 +08:00
|
|
|
}));
|
|
|
|
} else {
|
|
|
|
return _this.set('uniqueUsernameValidation', Discourse.InputValidation.create({
|
|
|
|
failed: true,
|
2013-07-09 07:32:16 +08:00
|
|
|
reason: I18n.t('user.username.not_available', result)
|
2013-05-31 02:12:33 +08:00
|
|
|
}));
|
|
|
|
}
|
|
|
|
} else if (result.errors) {
|
|
|
|
return _this.set('uniqueUsernameValidation', Discourse.InputValidation.create({
|
|
|
|
failed: true,
|
|
|
|
reason: result.errors.join(' ')
|
|
|
|
}));
|
|
|
|
} else {
|
|
|
|
_this.set('globalNicknameExists', true);
|
|
|
|
return _this.set('uniqueUsernameValidation', Discourse.InputValidation.create({
|
|
|
|
failed: true,
|
2013-07-09 07:32:16 +08:00
|
|
|
reason: I18n.t('user.username.enter_email')
|
2013-05-31 02:12:33 +08:00
|
|
|
}));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}, 500),
|
|
|
|
|
|
|
|
// Actually wait for the async name check before we're 100% sure we're good to go
|
|
|
|
usernameValidation: function() {
|
|
|
|
var basicValidation, uniqueUsername;
|
|
|
|
basicValidation = this.get('basicUsernameValidation');
|
|
|
|
uniqueUsername = this.get('uniqueUsernameValidation');
|
|
|
|
if (uniqueUsername) {
|
|
|
|
return uniqueUsername;
|
|
|
|
}
|
|
|
|
return basicValidation;
|
|
|
|
}.property('uniqueUsernameValidation', 'basicUsernameValidation'),
|
|
|
|
|
|
|
|
usernameNeedsToBeValidatedWithEmail: function() {
|
|
|
|
return( this.get('globalNicknameExists') || false );
|
|
|
|
},
|
|
|
|
|
|
|
|
// Validate the password
|
|
|
|
passwordValidation: function() {
|
|
|
|
var password;
|
|
|
|
if (!this.get('passwordRequired')) {
|
|
|
|
return Discourse.InputValidation.create({
|
|
|
|
ok: true
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// If blank, fail without a reason
|
|
|
|
password = this.get("accountPassword");
|
|
|
|
if (this.blank('accountPassword')) {
|
|
|
|
return Discourse.InputValidation.create({ failed: true });
|
|
|
|
}
|
|
|
|
|
|
|
|
// If too short
|
2013-12-20 05:15:36 +08:00
|
|
|
if (password.length < Discourse.SiteSettings.min_password_length) {
|
2013-05-31 02:12:33 +08:00
|
|
|
return Discourse.InputValidation.create({
|
|
|
|
failed: true,
|
2013-07-09 07:32:16 +08:00
|
|
|
reason: I18n.t('user.password.too_short')
|
2013-05-31 02:12:33 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2013-12-21 05:34:34 +08:00
|
|
|
if (this.get('rejectedPasswords').contains(password)) {
|
|
|
|
return Discourse.InputValidation.create({
|
|
|
|
failed: true,
|
|
|
|
reason: I18n.t('user.password.common')
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2013-05-31 02:12:33 +08:00
|
|
|
// Looks good!
|
|
|
|
return Discourse.InputValidation.create({
|
|
|
|
ok: true,
|
2013-07-09 07:32:16 +08:00
|
|
|
reason: I18n.t('user.password.ok')
|
2013-05-31 02:12:33 +08:00
|
|
|
});
|
2013-12-21 05:34:34 +08:00
|
|
|
}.property('accountPassword', 'rejectedPasswords.@each'),
|
2013-05-31 02:12:33 +08:00
|
|
|
|
|
|
|
fetchConfirmationValue: function() {
|
|
|
|
var createAccountController = this;
|
|
|
|
return Discourse.ajax('/users/hp.json').then(function (json) {
|
|
|
|
createAccountController.set('accountPasswordConfirm', json.value);
|
|
|
|
createAccountController.set('accountChallenge', json.challenge.split("").reverse().join(""));
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2013-12-18 01:37:49 +08:00
|
|
|
actions: {
|
|
|
|
createAccount: function() {
|
2013-12-21 05:34:34 +08:00
|
|
|
var self = this;
|
2013-12-18 01:37:49 +08:00
|
|
|
this.set('formSubmitted', true);
|
|
|
|
var name = this.get('accountName');
|
|
|
|
var email = this.get('accountEmail');
|
|
|
|
var password = this.get('accountPassword');
|
|
|
|
var username = this.get('accountUsername');
|
|
|
|
var passwordConfirm = this.get('accountPasswordConfirm');
|
|
|
|
var challenge = this.get('accountChallenge');
|
|
|
|
return Discourse.User.createAccount(name, email, password, username, passwordConfirm, challenge).then(function(result) {
|
|
|
|
if (result.success) {
|
2013-12-21 05:34:34 +08:00
|
|
|
self.flash(result.message);
|
|
|
|
self.set('complete', true);
|
2013-12-18 01:37:49 +08:00
|
|
|
} else {
|
2013-12-21 05:34:34 +08:00
|
|
|
self.flash(result.message || I18n.t('create_account.failed'), 'error');
|
|
|
|
if (result.errors && result.errors.email && result.errors.email.length > 0 && result.values) {
|
|
|
|
self.get('rejectedEmails').pushObject(result.values.email);
|
|
|
|
}
|
|
|
|
if (result.errors && result.errors.password && result.errors.password.length > 0) {
|
|
|
|
self.get('rejectedPasswords').pushObject(password);
|
2013-12-18 01:37:49 +08:00
|
|
|
}
|
2013-12-21 05:34:34 +08:00
|
|
|
self.set('formSubmitted', false);
|
2013-07-26 01:01:27 +08:00
|
|
|
}
|
2013-12-18 01:37:49 +08:00
|
|
|
if (result.active) {
|
|
|
|
return window.location.reload();
|
|
|
|
}
|
|
|
|
}, function() {
|
2013-12-21 05:34:34 +08:00
|
|
|
self.set('formSubmitted', false);
|
|
|
|
return self.flash(I18n.t('create_account.failed'), 'error');
|
2013-12-18 01:37:49 +08:00
|
|
|
});
|
|
|
|
}
|
2013-05-31 02:12:33 +08:00
|
|
|
}
|
2013-07-09 07:32:16 +08:00
|
|
|
});
|