Skip to content

Commit

Permalink
Validation of the username
Browse files Browse the repository at this point in the history
+ The username is now validated (close #10)
+ onChange and on init (if he changes his localStorage value)
+ userModel contains the usernameValidate function
  • Loading branch information
cyrilf committed Jun 2, 2013
1 parent 60d924b commit d8d5bfc
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 21 deletions.
32 changes: 32 additions & 0 deletions models/userModel.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,38 @@ var userModel = {
this.users = _.reject(this.users, function removeUser(user) {
return (user.username === username);
});
},

/**
* Validate a username
* A valid username is :
* + Not a forbidden one
* + Aplha and Numeric
* + @ . + _ - are accepted symbols
* + Between 2 and 35 chars long
* @param {String} username the username to validate
* @return {Boolean} Is the username valid ?
*/
validateUsername: function(username) {
// Check if the username is not a forbidden one
var forbiddenUsernames = [
'system'
];
var isForbiddenUsername = _.find(forbiddenUsernames, function(forbiddenUsername) {
return (forbiddenUsername == username);
});

if(isForbiddenUsername) {
return false;
}

// Check if it's a valid username
var validUsername = /^[a-zA-Z0-9@\.\+ _-]{2,35}$/;
if(!validUsername.test(username)) {
return false;
}

return true;
}
};

Expand Down
11 changes: 5 additions & 6 deletions public/javascripts/ngChatCtrl.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ function ngChatCtrl($scope, socket) {
var usernameAlreadyUsed = (localStorage.username &&
(localStorage.username !== data.username));
if (usernameAlreadyUsed) {
var content = 'Sorry, someone is using your username.' +
' We picked a new one for you, you\'re free to change it.';
var content = 'Sorry, your username is already used or is invalid.' +
' We picked a new one for you, you\'re free to change it now.';
addMessage('system', content);
}
});
Expand Down Expand Up @@ -107,10 +107,9 @@ function ngChatCtrl($scope, socket) {
var self = this;
socket.emit('change:username', {
username: this.newUsername
}, function (usernameChanged) {
if (!usernameChanged) {
var content = 'This username is already taken, choose another one.';
addMessage('system', content);
}, function (error) {
if (error) {
addMessage('system', error.message);
} else {
changeUsername($scope.username, self.newUsername);
$scope.username = self.newUsername;
Expand Down
2 changes: 1 addition & 1 deletion routes/rootRoute.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/**
* Router for the entry point
*/
var rootController = require('../controllers/root');
var rootController = require('../controllers/rootController');

module.exports = function(app) {
app.get('/', rootController.index);
Expand Down
2 changes: 1 addition & 1 deletion utils/routeManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ var RouteManager = {
* @param {Object} app The app
*/
init: function(app) {
require('../routes/root')(app);
require('../routes/rootRoute')(app);
}
};

Expand Down
44 changes: 31 additions & 13 deletions utils/socketManager.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
var userModel = require('../models/user');
var userModel = require('../models/userModel');

/**
* SocketManager
Expand Down Expand Up @@ -40,9 +40,9 @@ var SocketManager = {

var username = data.username;

// If no username has been sent or the username is already taken,
// If no username has been sent or the username isn't valid or is already taken,
// we generate a new one.
if(!userModel.claim(username)) {
if(!userModel.validateUsername(username) || !userModel.claim(username)) {
username = userModel.generateUsername();
}

Expand All @@ -59,20 +59,38 @@ var SocketManager = {

// Validate and notify a username change
socket.on('change:username', function (data, callback) {
if (userModel.claim(data.username)) {
var oldUsername = username;
userModel.remove(oldUsername);
var error = {};

username = data.username;
// Validate the username
if(userModel.validateUsername(data.username)) {

socket.broadcast.emit('change:username', {
oldUsername: oldUsername,
newUsername: username
});
// Check if the username isn't already taken.
if(userModel.claim(data.username)) {

callback(true);
var oldUsername = username;
userModel.remove(oldUsername);

username = data.username;

socket.broadcast.emit('change:username', {
oldUsername: oldUsername,
newUsername: username
});

// Everything's fine. Username changed.
callback();
} else {
error.message = 'This username is already taken, please choose another one.';
callback(error);
}
} else {
callback(false);
error.message = 'The username isn\'t valid.'
+ '\n A valid username is :'
+ '\n Not a forbidden one'
+ '\n / Aplha and Numeric'
+ '\n / @ . + _ - symbols are accepted'
+ '\n / Between 2 and 35 chars long';
callback(error);
}
});

Expand Down

0 comments on commit d8d5bfc

Please sign in to comment.