Merge branch 'master' of github.com:designcreateplay/NodeBB

v1.18.x
Julian Lam 11 years ago
commit 1e61033667

@ -27,8 +27,9 @@
async = require('async'), async = require('async'),
semver = require('semver'), semver = require('semver'),
winston = require('winston'), winston = require('winston'),
pkg = require('./package.json'),
path = require('path'), path = require('path'),
pkg = require('./package.json'),
utils = require('./public/src/utils.js'),
meta; meta;
// Runtime environment // Runtime environment
@ -69,8 +70,8 @@
}); });
meta = require('./src/meta'); meta = require('./src/meta');
nconf.set('url', nconf.get('base_url') + (nconf.get('use_port') ? ':' + nconf.get('port') : '') + nconf.get('relative_path') + '/'); nconf.set('url', nconf.get('base_url') + (nconf.get('use_port') ? ':' + nconf.get('port') : '') + nconf.get('relative_path') + path.sep);
nconf.set('upload_url', nconf.get('url') + 'uploads/'); nconf.set('upload_url', path.join(path.sep, nconf.get('relative_path'), 'uploads', path.sep));
nconf.set('base_dir', __dirname); nconf.set('base_dir', __dirname);
winston.info('Initializing NodeBB v' + pkg.version + ', on port ' + nconf.get('port') + ', using Redis store at ' + nconf.get('redis:host') + ':' + nconf.get('redis:port') + '.'); winston.info('Initializing NodeBB v' + pkg.version + ', on port ' + nconf.get('port') + ', using Redis store at ' + nconf.get('redis:host') + ':' + nconf.get('redis:port') + '.');
@ -108,16 +109,11 @@
var customTemplates = meta.config['theme:templates'] ? path.join(__dirname, 'node_modules', meta.config['theme:id'], meta.config['theme:templates']) : false; var customTemplates = meta.config['theme:templates'] ? path.join(__dirname, 'node_modules', meta.config['theme:id'], meta.config['theme:templates']) : false;
// todo: replace below with read directory code, derp.
templates.init([ utils.walk(path.join(__dirname, 'public/templates'), function (err, tplsToLoad) {
'header', 'footer', 'logout', 'outgoing', 'admin/header', 'admin/footer', 'admin/index', templates.init(tplsToLoad, customTemplates);
'emails/reset', 'emails/reset_plaintext', 'emails/email_confirm', 'emails/email_confirm_plaintext', });
'emails/header', 'emails/footer',
'noscript/header', 'noscript/home', 'noscript/category', 'noscript/topic'
], customTemplates);
plugins.ready(function() { plugins.ready(function() {
templates.ready(webserver.init); templates.ready(webserver.init);
}); });

@ -95,7 +95,7 @@ define(['forum/accountheader', 'uploader'], function(header, uploader) {
$('#uploadPictureBtn').on('click', function() { $('#uploadPictureBtn').on('click', function() {
$('#change-picture-modal').modal('hide'); $('#change-picture-modal').modal('hide');
uploader.open(RELATIVE_PATH + '/user/uploadpicture', function(imageUrlOnServer) { uploader.open(RELATIVE_PATH + '/user/uploadpicture', {}, function(imageUrlOnServer) {
imageUrlOnServer = imageUrlOnServer + '?' + new Date().getTime(); imageUrlOnServer = imageUrlOnServer + '?' + new Date().getTime();
$('#user-current-picture').attr('src', imageUrlOnServer); $('#user-current-picture').attr('src', imageUrlOnServer);

@ -183,8 +183,8 @@ define(['uploader'], function(uploader) {
$('.upload-button').on('click', function() { $('.upload-button').on('click', function() {
var inputEl = this; var inputEl = this;
var cid = $(this).parents('li[data-cid]').attr('data-cid');
uploader.open(RELATIVE_PATH + '/admin/category/uploadpicture', function(imageUrlOnServer) { uploader.open(RELATIVE_PATH + '/admin/category/uploadpicture', {cid:cid}, function(imageUrlOnServer) {
inputEl.value = imageUrlOnServer; inputEl.value = imageUrlOnServer;
$(inputEl).parents('li[data-cid]').find('.preview-box').css('background', 'url(' + imageUrlOnServer + '?' + new Date().getTime() + ')'); $(inputEl).parents('li[data-cid]').find('.preview-box').css('background', 'url(' + imageUrlOnServer + '?' + new Date().getTime() + ')');
modified(inputEl); modified(inputEl);
@ -270,7 +270,7 @@ define(['uploader'], function(uploader) {
liEl = document.createElement('li'); liEl = document.createElement('li');
var numResults = results.length, var numResults = results.length,
resultObj; resultObj;
for(var x=0;x<numResults;x++) { for(var x=0;x<numResults;x++) {
resultObj = results[x]; resultObj = results[x];
liEl.setAttribute('data-gid', resultObj.gid); liEl.setAttribute('data-gid', resultObj.gid);
@ -281,13 +281,13 @@ define(['uploader'], function(uploader) {
'</div>' + '</div>' +
'</div>' + '</div>' +
' '+resultObj.name; ' '+resultObj.name;
groupsFrag.appendChild(liEl.cloneNode(true)); groupsFrag.appendChild(liEl.cloneNode(true));
} }
groupsResultsEl.html(groupsFrag); groupsResultsEl.html(groupsFrag);
}); });
groupsResultsEl.off().on('click', '[data-gpriv]', function(e) { groupsResultsEl.off().on('click', '[data-gpriv]', function(e) {
var btnEl = $(this), var btnEl = $(this),
gid = btnEl.parents('li[data-gid]').attr('data-gid'), gid = btnEl.parents('li[data-gid]').attr('data-gid'),

@ -75,7 +75,7 @@ define(['uploader'], function(uploader) {
}); });
$('#uploadLogoBtn').on('click', function() { $('#uploadLogoBtn').on('click', function() {
uploader.open(RELATIVE_PATH + '/admin/uploadlogo', function(image) { uploader.open(RELATIVE_PATH + '/admin/uploadlogo', {}, function(image) {
$('#logoUrl').val(image); $('#logoUrl').val(image);
}); });
@ -83,7 +83,7 @@ define(['uploader'], function(uploader) {
}); });
$('#uploadFaviconBtn').on('click', function() { $('#uploadFaviconBtn').on('click', function() {
uploader.open(RELATIVE_PATH + '/admin/uploadfavicon', function(icon) { uploader.open(RELATIVE_PATH + '/admin/uploadfavicon', {}, function(icon) {
$('#faviconUrl').val(icon); $('#faviconUrl').val(icon);
}); });

@ -71,6 +71,7 @@ define(function() {
}); });
function onTopicsLoaded(topics) { function onTopicsLoaded(topics) {
var html = templates.prepare(templates['unread'].blocks['topics']).parse({ var html = templates.prepare(templates['unread'].blocks['topics']).parse({
topics: topics topics: topics
}); });

@ -2,12 +2,13 @@ define(function() {
var module = {}; var module = {};
module.open = function(route, callback) { module.open = function(route, params, callback) {
$('#upload-picture-modal').modal('show').removeClass('hide'); $('#upload-picture-modal').modal('show').removeClass('hide');
module.hideAlerts(); module.hideAlerts();
$('#uploadForm')[0].reset(); $('#uploadForm')[0].reset();
$('#uploadForm').attr('action', route); $('#uploadForm').attr('action', route);
$('#uploadForm').find('#params').val(JSON.stringify(params));
$('#pictureUploadSubmitBtn').off('click').on('click', function() { $('#pictureUploadSubmitBtn').off('click').on('click', function() {
$('#uploadForm').submit(); $('#uploadForm').submit();

@ -48,7 +48,7 @@
} }
}; };
templates.prepare = function (raw_tpl, data) { templates.prepare = function (raw_tpl) {
var template = {}; var template = {};
template.html = raw_tpl; template.html = raw_tpl;
template.parse = parse; template.parse = parse;
@ -78,7 +78,9 @@
global.templates[file] = new template; global.templates[file] = new template;
loaded--; loaded--;
if (loaded == 0) templates.ready(); if (loaded === 0) {
templates.ready();
}
}); });
}(templatesToLoad[t])); }(templatesToLoad[t]));
} }

@ -17,6 +17,7 @@
<p class="help-block">You may only upload PNG, JPG, or GIF files under 256kb.</p> <p class="help-block">You may only upload PNG, JPG, or GIF files under 256kb.</p>
</div> </div>
<input id="imageUploadCsrf" type="hidden" name="_csrf" value="" /> <input id="imageUploadCsrf" type="hidden" name="_csrf" value="" />
<input type="hidden" id="params" name="params">
</form> </form>
<div id="upload-progress-box" class="progress progress-striped"> <div id="upload-progress-box" class="progress progress-striped">

@ -36,6 +36,7 @@
<p class="help-block">[[user:image_spec]]</p> <p class="help-block">[[user:image_spec]]</p>
</div> </div>
<input id="imageUploadCsrf" type="hidden" name="_csrf" value="" /> <input id="imageUploadCsrf" type="hidden" name="_csrf" value="" />
<input type="hidden" id="params" name="params">
</form> </form>
<div id="upload-progress-box" class="progress progress-striped"> <div id="upload-progress-box" class="progress progress-striped">

@ -104,46 +104,25 @@ var nconf = require('nconf'),
return res.redirect('/403'); return res.redirect('/403');
var allowedTypes = ['image/png', 'image/jpeg', 'image/jpg', 'image/gif']; var allowedTypes = ['image/png', 'image/jpeg', 'image/jpg', 'image/gif'];
var params = null;
if (allowedTypes.indexOf(req.files.userPhoto.type) === -1) { try {
res.send({ params = JSON.parse(req.body.params);
error: 'Allowed image types are png, jpg and gif!' } catch (e) {
return res.send({
error: 'Error uploading file! Error :' + e.message
}); });
return;
} }
var tempPath = req.files.userPhoto.path; if (allowedTypes.indexOf(req.files.userPhoto.type) === -1) {
var extension = path.extname(req.files.userPhoto.name);
if (!extension) {
res.send({ res.send({
error: 'Error uploading file! Error : Invalid extension!' error: 'Allowed image types are png, jpg and gif!'
}); });
return; return;
} }
var filename = 'category' + utils.generateUUID() + extension; var filename = 'category-' + params.cid + path.extname(req.files.userPhoto.name);
var uploadPath = path.join(nconf.get('base_dir'), nconf.get('upload_path'), filename);
winston.info('Attempting upload to: ' + uploadPath);
var is = fs.createReadStream(tempPath);
var os = fs.createWriteStream(uploadPath);
is.on('end', function () {
fs.unlinkSync(tempPath);
console.log(nconf.get('upload_url') + filename);
res.json({
path: nconf.get('upload_url') + filename
});
});
os.on('error', function (err) {
fs.unlinkSync(tempPath);
winston.err(err);
});
is.pipe(os); uploadImage(filename, req, res);
}); });
app.post('/uploadfavicon', function(req, res) { app.post('/uploadfavicon', function(req, res) {
@ -159,38 +138,7 @@ var nconf = require('nconf'),
return; return;
} }
var tempPath = req.files.userPhoto.path; uploadImage('favicon.ico', req, res);
var extension = path.extname(req.files.userPhoto.name);
if (!extension) {
res.send({
error: 'Error uploading file! Error : Invalid extension!'
});
return;
}
var filename = 'favicon.ico';
var uploadPath = path.join(nconf.get('base_dir'), nconf.get('upload_path'), filename);
winston.info('Attempting upload to: ' + uploadPath);
var is = fs.createReadStream(tempPath);
var os = fs.createWriteStream(uploadPath);
is.on('end', function () {
fs.unlinkSync(tempPath);
res.json({
path: nconf.get('upload_url') + filename
});
});
os.on('error', function (err) {
fs.unlinkSync(tempPath);
winston.err(err);
});
is.pipe(os);
}); });
app.post('/uploadlogo', function(req, res) { app.post('/uploadlogo', function(req, res) {
@ -207,40 +155,45 @@ var nconf = require('nconf'),
return; return;
} }
var tempPath = req.files.userPhoto.path; var filename = 'site-logo' + path.extname(req.files.userPhoto.name);
var extension = path.extname(req.files.userPhoto.name);
if (!extension) { uploadImage(filename, req, res);
res.send({ });
error: 'Error uploading file! Error : Invalid extension!' });
});
return;
}
var filename = 'site-logo' + extension; function uploadImage(filename, req, res) {
var uploadPath = path.join(nconf.get('base_dir'), nconf.get('upload_path'), filename);
winston.info('Attempting upload to: ' + uploadPath); var tempPath = req.files.userPhoto.path;
var extension = path.extname(req.files.userPhoto.name);
var is = fs.createReadStream(tempPath); if (!extension) {
var os = fs.createWriteStream(uploadPath); res.send({
error: 'Error uploading file! Error : Invalid extension!'
});
return;
}
is.on('end', function () { var uploadPath = path.join(nconf.get('base_dir'), nconf.get('upload_path'), filename);
fs.unlinkSync(tempPath);
res.json({ winston.info('Attempting upload to: ' + uploadPath);
path: nconf.get('upload_url') + filename var is = fs.createReadStream(tempPath);
}); var os = fs.createWriteStream(uploadPath);
});
is.on('end', function () {
fs.unlinkSync(tempPath);
os.on('error', function (err) { res.json({
fs.unlinkSync(tempPath); path: nconf.get('upload_url') + filename
winston.err(err);
}); });
});
is.pipe(os); os.on('error', function (err) {
fs.unlinkSync(tempPath);
winston.err(err);
}); });
});
is.pipe(os);
}
var custom_routes = { var custom_routes = {

@ -161,12 +161,7 @@ var fs = require('fs'),
is.on('end', function () { is.on('end', function () {
fs.unlinkSync(tempPath); fs.unlinkSync(tempPath);
im.crop({ function done(err) {
srcPath: uploadPath,
dstPath: uploadPath,
width: 128,
height: 128
}, function (err, stdout, stderr) {
if (err) { if (err) {
winston.err(err); winston.err(err);
res.send({ res.send({
@ -180,7 +175,7 @@ var fs = require('fs'),
user.setUserField(uid, 'uploadedpicture', imageUrl); user.setUserField(uid, 'uploadedpicture', imageUrl);
user.setUserField(uid, 'picture', imageUrl); user.setUserField(uid, 'picture', imageUrl);
if (convertToPNG) { if (convertToPNG && extension !== '.png') {
im.convert([uploadPath, 'png:-'], im.convert([uploadPath, 'png:-'],
function(err, stdout){ function(err, stdout){
if (err) { if (err) {
@ -195,11 +190,25 @@ var fs = require('fs'),
}); });
} }
res.json({ res.json({
path: imageUrl path: imageUrl
}); });
}); }
if(extension === '.gif') {
im.convert([uploadPath, '-coalesce', '-repage', '0x0', '-crop', '128x128+0+0', '+repage', 'uploadPath'], function(err, stdout) {
done(err);
});
} else {
im.crop({
srcPath: uploadPath,
dstPath: uploadPath,
width: 128,
height: 128
}, function (err, stdout, stderr) {
done(err);
});
}
}); });
os.on('error', function (err) { os.on('error', function (err) {

@ -456,9 +456,10 @@ var async = require('async'),
} }
function sendUnreadTopics(topicIds) { function sendUnreadTopics(topicIds) {
Topics.getTopicsByTids(topicIds, uid, function(topicData) { Topics.getTopicsByTids(topicIds, uid, function(topicData) {
unreadTopics.topics = topicData; unreadTopics.topics = topicData;
unreadTopics.nextStart = start + topicIds.length; unreadTopics.nextStart = stop + 1;
if (!topicData || topicData.length === 0) { if (!topicData || topicData.length === 0) {
unreadTopics.no_topics_message = 'show'; unreadTopics.no_topics_message = 'show';
} }

@ -807,7 +807,8 @@ var path = require('path'),
var custom_routes = { var custom_routes = {
'routes': [], 'routes': [],
'api': [] 'api': [],
'templates': []
}; };
plugins.ready(function() { plugins.ready(function() {
@ -843,6 +844,17 @@ var path = require('path'),
} }
} }
var templateRoutes = custom_routes.templates;
for (var route in templateRoutes) {
if (templateRoutes.hasOwnProperty(route)) {
(function(route) {
app.get('/templates/' + templateRoutes[route].template, function(req, res) {
res.send(templateRoutes[route].content);
});
}(route));
}
}
}); });
}); });

@ -106,12 +106,12 @@ websockets.init = function(io) {
socket.on('disconnect', function() { socket.on('disconnect', function() {
var index = userSockets[uid].indexOf(socket); var index = (userSockets[uid] || []).indexOf(socket);
if (index !== -1) { if (index !== -1) {
userSockets[uid].splice(index, 1); userSockets[uid].splice(index, 1);
} }
if (userSockets[uid].length === 0) { if (userSockets[uid] && userSockets[uid].length === 0) {
delete users[sessionID]; delete users[sessionID];
delete userSockets[uid]; delete userSockets[uid];
if (uid) { if (uid) {

Loading…
Cancel
Save