144 строки
4.0 KiB
JavaScript
144 строки
4.0 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
'use strict';
|
|
|
|
define([
|
|
'underscore',
|
|
'views/base',
|
|
'stache!templates/sign_up',
|
|
'lib/session',
|
|
'lib/fxa-client',
|
|
'lib/password-mixin'
|
|
],
|
|
function (_, BaseView, Template, Session, FxaClient, PasswordMixin) {
|
|
var now = new Date();
|
|
|
|
// If COPPA says 13, why 14 here? To make UX simpler, we only ask
|
|
// for their year of birth, we do not ask for month and day.
|
|
// To make this safe and ensure we do not let *any* 12 year olds pass,
|
|
// we are saying that it is acceptable for some 13 year olds to be
|
|
// caught in the snare.
|
|
// This is written on 2014-01-16. 13 years ago is 2001-01-16. Somebody born
|
|
// in 2001-01-15 is now 13. Somebody born 2001-01-17 is still only 12.
|
|
// To avoid letting the 12 year old in, add an extra year.
|
|
var TOO_YOUNG_YEAR = now.getFullYear() - 14;
|
|
|
|
var View = BaseView.extend({
|
|
template: Template,
|
|
className: 'sign-up',
|
|
|
|
initialize: function (options) {
|
|
options = options || {};
|
|
this.router = options.router || window.router;
|
|
},
|
|
|
|
beforeRender: function () {
|
|
if (document.cookie.indexOf('tooyoung') > -1) {
|
|
this.router.navigate('cannot_create_account', { trigger: true });
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
},
|
|
|
|
events: {
|
|
'submit form': 'onSubmit',
|
|
'keyup form': 'enableButtonWhenValid',
|
|
'change form': 'enableButtonWhenValid',
|
|
'change .show-password': 'onPasswordVisibilityChange'
|
|
},
|
|
|
|
onSubmit: function (event) {
|
|
event.preventDefault();
|
|
this.signUp();
|
|
},
|
|
|
|
signUp: function () {
|
|
if (! (this.isValid())) {
|
|
return;
|
|
}
|
|
|
|
if (! this._isUserOldEnough()) {
|
|
return this._cannotCreateAccount();
|
|
}
|
|
|
|
this._createAccount();
|
|
},
|
|
|
|
isValid: function () {
|
|
return !! (this._validateEmail() &&
|
|
this._validatePassword() &&
|
|
this._validateYear());
|
|
},
|
|
|
|
_validateEmail: function () {
|
|
return this.isElementValid('.email');
|
|
},
|
|
|
|
_validatePassword: function () {
|
|
return this.isElementValid('.password');
|
|
},
|
|
|
|
_validateYear: function () {
|
|
return ! isNaN(this._getYear());
|
|
},
|
|
|
|
_getYear: function () {
|
|
return this.$('#fxa-age-year').val();
|
|
},
|
|
|
|
_isUserOldEnough: function () {
|
|
var year = parseInt(this._getYear(), 10);
|
|
|
|
return year <= TOO_YOUNG_YEAR;
|
|
},
|
|
|
|
_cannotCreateAccount: function () {
|
|
// this is a session cookie. It will go away once:
|
|
// 1. the user closes the tab
|
|
// and
|
|
// 2. the user closes the browser
|
|
// Both of these have to happen or else the cookie
|
|
// hangs around like a bad smell.
|
|
document.cookie = 'tooyoung=1;';
|
|
|
|
this.router.navigate('cannot_create_account', { trigger: true });
|
|
},
|
|
|
|
_createAccount: function () {
|
|
var email = this.$('.email').val();
|
|
var password = this.$('.password').val();
|
|
|
|
var client = new FxaClient();
|
|
client.signUp(email, password)
|
|
.done(_.bind(function (accountData) {
|
|
// Ugh, kind of sloppy, but the channel is not yet created if the
|
|
// user (or Selenium tests) access this page directly. do a setTimeout
|
|
// to allow page initialization to complete, and then get back
|
|
// to sending the message.
|
|
setTimeout(function() {
|
|
Session.channel.send('login', {
|
|
email: email,
|
|
uid: accountData.uid,
|
|
sessionToken: accountData.sessionToken,
|
|
unwrapBKey: accountData.unwrapBKey,
|
|
keyFetchToken: accountData.keyFetchToken
|
|
});
|
|
}, 100);
|
|
|
|
this.router.navigate('confirm', { trigger: true });
|
|
}, this),
|
|
_.bind(function (err) {
|
|
this.displayError(err.message);
|
|
}, this));
|
|
}
|
|
|
|
});
|
|
|
|
_.extend(View.prototype, PasswordMixin);
|
|
|
|
return View;
|
|
});
|