mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-13 01:15:47 +01:00
Merge branch 'master' of github.com:designcreateplay/NodeBB
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"banned": "Banned",
|
"banned": "Banned",
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
|
"username": "User Name",
|
||||||
"email": "Email",
|
"email": "Email",
|
||||||
"fullname": "Full Name",
|
"fullname": "Full Name",
|
||||||
"website": "Website",
|
"website": "Website",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ define(['forum/accountheader', 'uploader'], function(header, uploader) {
|
|||||||
|
|
||||||
var userData = {
|
var userData = {
|
||||||
uid: $('#inputUID').val(),
|
uid: $('#inputUID').val(),
|
||||||
|
username: $('#inputUsername').val(),
|
||||||
email: $('#inputEmail').val(),
|
email: $('#inputEmail').val(),
|
||||||
fullname: $('#inputFullname').val(),
|
fullname: $('#inputFullname').val(),
|
||||||
website: $('#inputWebsite').val(),
|
website: $('#inputWebsite').val(),
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ define(['composer'], function(composer) {
|
|||||||
li.setAttribute('data-pid', posts[i].pid);
|
li.setAttribute('data-pid', posts[i].pid);
|
||||||
|
|
||||||
|
|
||||||
li.innerHTML = '<a href="' + RELATIVE_PATH + '/user/' + posts[i].userslug + '"><img title="' + posts[i].username + '" style="width: 48px; height: 48px; /*temporary*/" class="img-rounded user-img" src="' + posts[i].picture + '"/></a>' +
|
li.innerHTML = '<a href="' + RELATIVE_PATH + '/user/' + posts[i].userslug + '"><img title="' + posts[i].username + '" class="img-rounded user-img" src="' + posts[i].picture + '"/></a>' +
|
||||||
'<a href="' + RELATIVE_PATH + '/topic/' + posts[i].topicSlug + '#' + posts[i].pid + '">' +
|
'<a href="' + RELATIVE_PATH + '/topic/' + posts[i].topicSlug + '#' + posts[i].pid + '">' +
|
||||||
'<strong><span>'+ posts[i].username + '</span></strong>' +
|
'<strong><span>'+ posts[i].username + '</span></strong>' +
|
||||||
'<p>' +
|
'<p>' +
|
||||||
|
|||||||
@@ -102,6 +102,7 @@
|
|||||||
str = XRegExp.replace(str, invalidChars, '-');
|
str = XRegExp.replace(str, invalidChars, '-');
|
||||||
str = str.replace(/\s+/g, '-') // collapse whitespace and replace by -
|
str = str.replace(/\s+/g, '-') // collapse whitespace and replace by -
|
||||||
str = str.replace(/-+/g, '-'); // collapse dashes
|
str = str.replace(/-+/g, '-'); // collapse dashes
|
||||||
|
str = str.replace(/-$/g, '');
|
||||||
|
|
||||||
return str;
|
return str;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -48,6 +48,14 @@
|
|||||||
<div class="col-md-5">
|
<div class="col-md-5">
|
||||||
<div>
|
<div>
|
||||||
<form class='form-horizontal'>
|
<form class='form-horizontal'>
|
||||||
|
|
||||||
|
<div class="control-group">
|
||||||
|
<label class="control-label" for="inputUsername">[[user:username]]</label>
|
||||||
|
<div class="controls">
|
||||||
|
<input class="form-control" type="text" id="inputUsername" placeholder="Username" value="{username}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label class="control-label" for="inputEmail">[[user:email]]</label>
|
<label class="control-label" for="inputEmail">[[user:email]]</label>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
|
|||||||
99
src/user.js
99
src/user.js
@@ -184,7 +184,7 @@ var bcrypt = require('bcrypt'),
|
|||||||
|
|
||||||
User.updateProfile = function(uid, data, callback) {
|
User.updateProfile = function(uid, data, callback) {
|
||||||
|
|
||||||
var fields = ['email', 'fullname', 'website', 'location', 'birthday', 'signature'];
|
var fields = ['username', 'email', 'fullname', 'website', 'location', 'birthday', 'signature'];
|
||||||
var returnData = {
|
var returnData = {
|
||||||
success: false
|
success: false
|
||||||
};
|
};
|
||||||
@@ -205,38 +205,66 @@ var bcrypt = require('bcrypt'),
|
|||||||
}
|
}
|
||||||
|
|
||||||
User.getUserField(uid, 'email', function(err, email) {
|
User.getUserField(uid, 'email', function(err, email) {
|
||||||
if (email !== data.email) {
|
if(email === data.email) {
|
||||||
User.isEmailAvailable(data.email, function(err, available) {
|
return next(null, true);
|
||||||
if (err) {
|
|
||||||
return next(err, null);
|
|
||||||
}
|
|
||||||
if (!available) {
|
|
||||||
next({
|
|
||||||
error: 'Email not available!'
|
|
||||||
}, false);
|
|
||||||
} else {
|
|
||||||
next(null, true);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
next(null, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
User.isEmailAvailable(data.email, function(err, available) {
|
||||||
|
if (err) {
|
||||||
|
return next(err, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!available) {
|
||||||
|
next({
|
||||||
|
error: 'Email not available!'
|
||||||
|
}, false);
|
||||||
|
} else {
|
||||||
|
next(null, true);
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async.series([isSignatureValid, isEmailAvailable], function(err, results) {
|
function isUsernameAvailable(next) {
|
||||||
if (err) {
|
User.getUserFields(uid, ['username', 'userslug'], function(err, userData) {
|
||||||
callback(err, returnData);
|
|
||||||
} else {
|
var userslug = utils.slugify(data.username);
|
||||||
async.each(fields, updateField, function(err) {
|
|
||||||
if (err) {
|
if(userslug === userData.userslug) {
|
||||||
callback(err, returnData);
|
return next(null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!utils.isUserNameValid(data.username) || !userslug) {
|
||||||
|
return next({
|
||||||
|
error: 'Invalid Username!'
|
||||||
|
}, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
User.exists(userslug, function(exists) {
|
||||||
|
if(exists) {
|
||||||
|
next({
|
||||||
|
error: 'Username not available!'
|
||||||
|
}, false);
|
||||||
} else {
|
} else {
|
||||||
returnData.success = true;
|
next(null, true);
|
||||||
callback(null, returnData);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async.series([isSignatureValid, isEmailAvailable, isUsernameAvailable], function(err, results) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err, returnData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async.each(fields, updateField, function(err) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err, returnData);
|
||||||
|
}
|
||||||
|
|
||||||
|
returnData.success = true;
|
||||||
|
callback(null, returnData);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
function updateField(field, next) {
|
function updateField(field, next) {
|
||||||
@@ -269,6 +297,27 @@ var bcrypt = require('bcrypt'),
|
|||||||
events.logEmailChange(uid, userData.email, data.email);
|
events.logEmailChange(uid, userData.email, data.email);
|
||||||
next();
|
next();
|
||||||
});
|
});
|
||||||
|
return;
|
||||||
|
} else if (field === 'username') {
|
||||||
|
|
||||||
|
User.getUserFields(uid, ['username', 'userslug'], function(err, userData) {
|
||||||
|
var userslug = utils.slugify(data.username);
|
||||||
|
|
||||||
|
if(data.username !== userData.username) {
|
||||||
|
User.setUserField(uid, 'username', data.username);
|
||||||
|
db.deleteObjectField('username:uid', userData.username);
|
||||||
|
db.setObjectField('username:uid', data.username, uid);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(userslug !== userData.userslug) {
|
||||||
|
User.setUserField(uid, 'userslug', userslug);
|
||||||
|
db.deleteObjectField('userslug:uid', userData.userslug);
|
||||||
|
db.setObjectField('userslug:uid', userslug, uid);
|
||||||
|
}
|
||||||
|
|
||||||
|
next();
|
||||||
|
});
|
||||||
|
|
||||||
return;
|
return;
|
||||||
} else if (field === 'signature') {
|
} else if (field === 'signature') {
|
||||||
data[field] = S(data[field]).stripTags().s;
|
data[field] = S(data[field]).stripTags().s;
|
||||||
|
|||||||
Reference in New Issue
Block a user