mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-11-03 20:45:58 +01:00 
			
		
		
		
	@@ -398,6 +398,34 @@ function createCategories(next) {
 | 
				
			|||||||
	});
 | 
						});
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function setupPrivileges(next) {
 | 
				
			||||||
 | 
						function givePrivileges(privileges, cid, groupName, next) {
 | 
				
			||||||
 | 
							async.each(privileges, function(privilege, next) {
 | 
				
			||||||
 | 
								Groups.join('cid:' + cid + ':privileges:groups:' + privilege, groupName, next);
 | 
				
			||||||
 | 
							}, next);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var Groups = require('./groups');
 | 
				
			||||||
 | 
						var db = require('./database');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						db.getSortedSetRange('categories:cid', 0, -1, function(err, cids) {
 | 
				
			||||||
 | 
							if (err) {
 | 
				
			||||||
 | 
								return next(err);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							async.each(cids, function(cid, next) {
 | 
				
			||||||
 | 
								async.parallel([
 | 
				
			||||||
 | 
									function(next) {
 | 
				
			||||||
 | 
										givePrivileges(['find', 'read', 'topics:create', 'topics:reply'], cid, 'administrators', next);
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									function(next) {
 | 
				
			||||||
 | 
										givePrivileges(['find', 'read', 'topics:create', 'topics:reply'], cid, 'registered-users', next);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								], next);
 | 
				
			||||||
 | 
							}, next);
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function createWelcomePost(next) {
 | 
					function createWelcomePost(next) {
 | 
				
			||||||
	var db = require('./database'),
 | 
						var db = require('./database'),
 | 
				
			||||||
		Topics = require('./topics');
 | 
							Topics = require('./topics');
 | 
				
			||||||
@@ -442,7 +470,18 @@ function setCopyrightWidget(next) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
install.setup = function (callback) {
 | 
					install.setup = function (callback) {
 | 
				
			||||||
	async.series([checkSetupFlag, checkCIFlag, setupConfig, setupDefaultConfigs, enableDefaultTheme, createAdministrator, createCategories, createWelcomePost, enableDefaultPlugins, setCopyrightWidget,
 | 
						async.series([
 | 
				
			||||||
 | 
							checkSetupFlag,
 | 
				
			||||||
 | 
							checkCIFlag,
 | 
				
			||||||
 | 
							setupConfig,
 | 
				
			||||||
 | 
							setupDefaultConfigs,
 | 
				
			||||||
 | 
							enableDefaultTheme,
 | 
				
			||||||
 | 
							createAdministrator,
 | 
				
			||||||
 | 
							createCategories,
 | 
				
			||||||
 | 
							setupPrivileges,
 | 
				
			||||||
 | 
							createWelcomePost,
 | 
				
			||||||
 | 
							enableDefaultPlugins,
 | 
				
			||||||
 | 
							setCopyrightWidget,
 | 
				
			||||||
		function (next) {
 | 
							function (next) {
 | 
				
			||||||
			require('./upgrade').upgrade(next);
 | 
								require('./upgrade').upgrade(next);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,12 +32,6 @@ helpers.isUserAllowedTo = function(privilege, uid, cids, callback) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	async.parallel({
 | 
						async.parallel({
 | 
				
			||||||
		userPrivilegeExists: function(next) {
 | 
					 | 
				
			||||||
			groups.exists(userKeys, next);
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		groupPrivilegeExists: function(next) {
 | 
					 | 
				
			||||||
			groups.exists(groupKeys, next);
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		hasUserPrivilege: function(next) {
 | 
							hasUserPrivilege: function(next) {
 | 
				
			||||||
			groups.isMemberOfGroups(uid, userKeys, next);
 | 
								groups.isMemberOfGroups(uid, userKeys, next);
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@@ -51,7 +45,7 @@ helpers.isUserAllowedTo = function(privilege, uid, cids, callback) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		var result = [];
 | 
							var result = [];
 | 
				
			||||||
		for (var i=0; i<cids.length; ++i) {
 | 
							for (var i=0; i<cids.length; ++i) {
 | 
				
			||||||
			result.push((!results.userPrivilegeExists[i] && !results.groupPrivilegeExists[i]) || results.hasUserPrivilege[i] || results.hasGroupPrivilege[i]);
 | 
								result.push(results.hasUserPrivilege[i] || results.hasGroupPrivilege[i]);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		callback(null, result);
 | 
							callback(null, result);
 | 
				
			||||||
@@ -60,12 +54,6 @@ helpers.isUserAllowedTo = function(privilege, uid, cids, callback) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
helpers.isUsersAllowedTo = function(privilege, uids, cid, callback) {
 | 
					helpers.isUsersAllowedTo = function(privilege, uids, cid, callback) {
 | 
				
			||||||
	async.parallel({
 | 
						async.parallel({
 | 
				
			||||||
		userPrivilegeExists: function(next) {
 | 
					 | 
				
			||||||
			groups.exists('cid:' + cid + ':privileges:' + privilege, next);
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		groupPrivilegeExists: function(next) {
 | 
					 | 
				
			||||||
			groups.exists('cid:' + cid + ':privileges:groups:' + privilege, next);
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		hasUserPrivilege: function(next) {
 | 
							hasUserPrivilege: function(next) {
 | 
				
			||||||
			groups.isMembers(uids, 'cid:' + cid + ':privileges:' + privilege, next);
 | 
								groups.isMembers(uids, 'cid:' + cid + ':privileges:' + privilege, next);
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@@ -78,9 +66,8 @@ helpers.isUsersAllowedTo = function(privilege, uids, cid, callback) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		var result = [];
 | 
							var result = [];
 | 
				
			||||||
 | 
					 | 
				
			||||||
		for(var i=0; i<uids.length; ++i) {
 | 
							for(var i=0; i<uids.length; ++i) {
 | 
				
			||||||
			result.push((!results.userPrivilegeExists && !results.groupPrivilegeExists) || results.hasUserPrivilege[i] || results.hasGroupPrivilege[i]);
 | 
								result.push(results.hasUserPrivilege[i] || results.hasGroupPrivilege[i]);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		callback(null, result);
 | 
							callback(null, result);
 | 
				
			||||||
@@ -88,38 +75,12 @@ helpers.isUsersAllowedTo = function(privilege, uids, cid, callback) {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function isGuestAllowedTo(privilege, cids, callback) {
 | 
					function isGuestAllowedTo(privilege, cids, callback) {
 | 
				
			||||||
	var userKeys = [], groupKeys = [];
 | 
						var groupKeys = [];
 | 
				
			||||||
	for (var i=0; i<cids.length; ++i) {
 | 
						for (var i=0; i<cids.length; ++i) {
 | 
				
			||||||
		userKeys.push('cid:' + cids[i] + ':privileges:' + privilege);
 | 
					 | 
				
			||||||
		groupKeys.push('cid:' + cids[i] + ':privileges:groups:' + privilege);
 | 
							groupKeys.push('cid:' + cids[i] + ':privileges:groups:' + privilege);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	async.parallel({
 | 
						groups.isMemberOfGroups('guests', groupKeys, callback);
 | 
				
			||||||
		userPrivilegeExists: function(next) {
 | 
					 | 
				
			||||||
			groups.exists(userKeys, next);
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		groupPrivilegeExists: function(next) {
 | 
					 | 
				
			||||||
			groups.exists(groupKeys, next);
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		hasGroupPrivilege: function(next) {
 | 
					 | 
				
			||||||
			groups.isMemberOfGroups('guests', groupKeys, next);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}, function(err, results) {
 | 
					 | 
				
			||||||
		if (err) {
 | 
					 | 
				
			||||||
			return callback(err);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		var result = [];
 | 
					 | 
				
			||||||
		for (var i = 0; i<cids.length; ++i) {
 | 
					 | 
				
			||||||
			var groupPriv = (privilege === 'find' || privilege === 'read') ?
 | 
					 | 
				
			||||||
				(!results.groupPrivilegeExists[i] || results.hasGroupPrivilege[i] !== false) :
 | 
					 | 
				
			||||||
				(results.groupPrivilegeExists[i] && results.hasGroupPrivilege[i] === true);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			result.push((!results.userPrivilegeExists[i] && !results.groupPrivilegeExists[i]) || groupPriv);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		callback(null, result);
 | 
					 | 
				
			||||||
	});
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
helpers.hasEnoughReputationFor = function(privilege, uid, callback) {
 | 
					helpers.hasEnoughReputationFor = function(privilege, uid, callback) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,7 +19,7 @@ var db = require('./database'),
 | 
				
			|||||||
	schemaDate, thisSchemaDate,
 | 
						schemaDate, thisSchemaDate,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema
 | 
						// IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema
 | 
				
			||||||
	latestSchema = Date.UTC(2014, 10, 7);
 | 
						latestSchema = Date.UTC(2014, 10, 11);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Upgrade.check = function(callback) {
 | 
					Upgrade.check = function(callback) {
 | 
				
			||||||
	db.get('schemaDate', function(err, value) {
 | 
						db.get('schemaDate', function(err, value) {
 | 
				
			||||||
@@ -1272,6 +1272,69 @@ Upgrade.upgrade = function(callback) {
 | 
				
			|||||||
				winston.info('[2014/11/7] Renaming sorted sets skipped');
 | 
									winston.info('[2014/11/7] Renaming sorted sets skipped');
 | 
				
			||||||
				next();
 | 
									next();
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							function(next) {
 | 
				
			||||||
 | 
								thisSchemaDate = Date.UTC(2014, 10, 11);
 | 
				
			||||||
 | 
								if (schemaDate < thisSchemaDate) {
 | 
				
			||||||
 | 
									winston.info('[2014/11/11] Upgrading permissions');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									async.waterfall([
 | 
				
			||||||
 | 
										function(next) {
 | 
				
			||||||
 | 
											db.getSortedSetRange('categories:cid', 0, -1, next);
 | 
				
			||||||
 | 
										},
 | 
				
			||||||
 | 
										function(cids, next) {
 | 
				
			||||||
 | 
											function upgradePrivilege(cid, privilege, groupName, next) {
 | 
				
			||||||
 | 
												async.parallel({
 | 
				
			||||||
 | 
													userPrivExists: function(next) {
 | 
				
			||||||
 | 
														Groups.exists('cid:' + cid + ':privileges:' + privilege, next);
 | 
				
			||||||
 | 
													},
 | 
				
			||||||
 | 
													groupPrivExists: function(next) {
 | 
				
			||||||
 | 
														Groups.exists('cid:' + cid + ':privileges:groups:' + privilege, next);
 | 
				
			||||||
 | 
													}
 | 
				
			||||||
 | 
												}, function(err, results) {
 | 
				
			||||||
 | 
													if (err || results.userPrivExists || results.groupPrivExists) {
 | 
				
			||||||
 | 
														return next(err);
 | 
				
			||||||
 | 
													}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
													Groups.join('cid:' + cid + ':privileges:groups:' + privilege, groupName, next);
 | 
				
			||||||
 | 
												});
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											function upgradePrivileges(cid, groupName, next) {
 | 
				
			||||||
 | 
												var privs = ['find', 'read', 'topics:reply', 'topics:post'];
 | 
				
			||||||
 | 
												async.each(privs, function(priv, next) {
 | 
				
			||||||
 | 
													upgradePrivilege(cid, priv, groupName, next);
 | 
				
			||||||
 | 
												}, next);
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											Groups.list({}, function(err, groups) {
 | 
				
			||||||
 | 
												if (err) {
 | 
				
			||||||
 | 
													return next(err);
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												async.eachLimit(cids, 50, function(cid, next) {
 | 
				
			||||||
 | 
													async.eachLimit(groups, 50, function(group, next) {
 | 
				
			||||||
 | 
														if (group && !group.hidden) {
 | 
				
			||||||
 | 
															upgradePrivileges(cid, group.name, next);
 | 
				
			||||||
 | 
														} else {
 | 
				
			||||||
 | 
															next();
 | 
				
			||||||
 | 
														}
 | 
				
			||||||
 | 
													}, next);
 | 
				
			||||||
 | 
												}, next);
 | 
				
			||||||
 | 
											});
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									], function(err) {
 | 
				
			||||||
 | 
										if (err) {
 | 
				
			||||||
 | 
											winston.error('[2014/11/11] Error encountered while upgrading permissions');
 | 
				
			||||||
 | 
											return next(err);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										winston.info('[2014/11/11] Upgrading permissions done');
 | 
				
			||||||
 | 
										Upgrade.update(thisSchemaDate, next);
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									winston.info('[2014/11/11] Upgrading permissions skipped');
 | 
				
			||||||
 | 
									next();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Add new schema updates here
 | 
							// Add new schema updates here
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user