| 
									
										
										
										
											2014-01-13 12:05:13 -05:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-10 16:00:03 -05:00
										 |  |  | var	groups = require('../groups'), | 
					
						
							|  |  |  | 	meta = require('../meta'), | 
					
						
							|  |  |  | 	plugins = require('../plugins'), | 
					
						
							|  |  |  | 	user = require('../user'), | 
					
						
							|  |  |  | 	topics = require('../topics'), | 
					
						
							| 
									
										
										
										
											2014-01-13 12:05:13 -05:00
										 |  |  | 	categories = require('../categories'), | 
					
						
							| 
									
										
										
										
											2014-01-10 16:00:03 -05:00
										 |  |  | 	CategoryTools = require('../categoryTools'), | 
					
						
							| 
									
										
										
										
											2014-01-13 12:05:13 -05:00
										 |  |  | 	logger = require('../logger'), | 
					
						
							| 
									
										
										
										
											2014-01-10 16:00:03 -05:00
										 |  |  | 	admin = { | 
					
						
							|  |  |  | 		user: require('../admin/user'), | 
					
						
							|  |  |  | 		categories: require('../admin/categories') | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	async = require('async'), | 
					
						
							| 
									
										
										
										
											2014-01-13 12:01:42 -05:00
										 |  |  | 	winston = require('winston'), | 
					
						
							| 
									
										
										
										
											2014-01-10 16:00:03 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	SocketAdmin = {}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 15:00:49 -05:00
										 |  |  | SocketAdmin.before = function(socket, next) { | 
					
						
							| 
									
										
										
										
											2014-01-13 12:01:42 -05:00
										 |  |  | 	// Verify administrative privileges
 | 
					
						
							| 
									
										
										
										
											2014-01-16 15:00:49 -05:00
										 |  |  | 	user.isAdministrator(socket.uid, function(err, isAdmin) { | 
					
						
							| 
									
										
										
										
											2014-01-13 12:01:42 -05:00
										 |  |  | 		if (isAdmin) { | 
					
						
							|  |  |  | 			next(); | 
					
						
							|  |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2014-01-16 15:00:49 -05:00
										 |  |  | 			winston.warn('[socket.io] Call to admin method blocked (accessed by uid ' + socket.uid + ')'); | 
					
						
							| 
									
										
										
										
											2014-01-13 12:01:42 -05:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-10 16:00:03 -05:00
										 |  |  | /* Topics */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SocketAdmin.topics = {}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 15:00:49 -05:00
										 |  |  | SocketAdmin.topics.getMore = function(socket, data, callback) { | 
					
						
							| 
									
										
										
										
											2014-01-10 16:00:03 -05:00
										 |  |  | 	topics.getAllTopics(data.limit, data.after, function(err, topics) { | 
					
						
							|  |  |  | 		callback(JSON.stringify(topics)); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* User */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SocketAdmin.user = {}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 15:00:49 -05:00
										 |  |  | SocketAdmin.user.makeAdmin = function(socket, theirid) { | 
					
						
							|  |  |  | 	admin.user.makeAdmin(socket.uid, theirid, socket); | 
					
						
							| 
									
										
										
										
											2014-01-10 16:00:03 -05:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 15:00:49 -05:00
										 |  |  | SocketAdmin.user.removeAdmin = function(socket, theirid) { | 
					
						
							|  |  |  | 	admin.user.removeAdmin(socket.uid, theirid, socket); | 
					
						
							| 
									
										
										
										
											2014-01-10 16:00:03 -05:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 15:00:49 -05:00
										 |  |  | SocketAdmin.user.createUser = function(socket, user, callback) { | 
					
						
							|  |  |  | 	admin.user.createUser(socket.uid, user, callback); | 
					
						
							| 
									
										
										
										
											2014-01-10 16:00:03 -05:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 15:00:49 -05:00
										 |  |  | SocketAdmin.user.banUser = function(socket, theirid) { | 
					
						
							|  |  |  | 	admin.user.banUser(socket.uid, theirid, socket, function(isBanned) { | 
					
						
							|  |  |  | 		if(isBanned) { | 
					
						
							|  |  |  | 			if(socket.userSockets[theirid]) { | 
					
						
							|  |  |  | 				for(var i=0; i<socket.userSockets[theirid].length; ++i) { | 
					
						
							|  |  |  | 					socket.userSockets[theirid][i].emit('event:banned'); | 
					
						
							| 
									
										
										
										
											2014-01-10 16:00:03 -05:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-01-16 15:00:49 -05:00
										 |  |  | 			module.parent.exports.logoutUser(theirid); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2014-01-10 16:00:03 -05:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 15:00:49 -05:00
										 |  |  | SocketAdmin.user.unbanUser = function(socket, theirid) { | 
					
						
							|  |  |  | 	admin.user.unbanUser(socket.uid, theirid, socket); | 
					
						
							| 
									
										
										
										
											2014-01-10 16:00:03 -05:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 15:00:49 -05:00
										 |  |  | SocketAdmin.user.search = function(socket, username, callback) { | 
					
						
							| 
									
										
										
										
											2014-01-10 16:00:03 -05:00
										 |  |  | 	user.search(username, function(data) { | 
					
						
							|  |  |  | 		function isAdmin(userData, next) { | 
					
						
							|  |  |  | 			user.isAdministrator(userData.uid, function(err, isAdmin) { | 
					
						
							|  |  |  | 				if(err) { | 
					
						
							|  |  |  | 					return next(err); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				userData.administrator = isAdmin?'1':'0'; | 
					
						
							|  |  |  | 				next(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		async.each(data, isAdmin, function(err) { | 
					
						
							|  |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback({message: err.message}); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			callback(null, data); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Categories */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SocketAdmin.categories = {}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 15:00:49 -05:00
										 |  |  | SocketAdmin.categories.create = function(socket, data, callback) { | 
					
						
							| 
									
										
										
										
											2014-01-10 16:00:03 -05:00
										 |  |  | 	categories.create(data, function(err, data) { | 
					
						
							|  |  |  | 		callback(err, data); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 15:00:49 -05:00
										 |  |  | SocketAdmin.categories.update = function(socket, data) { | 
					
						
							|  |  |  | 	admin.categories.update(data, socket); | 
					
						
							| 
									
										
										
										
											2014-01-10 16:00:03 -05:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 15:00:49 -05:00
										 |  |  | SocketAdmin.categories.search = function(socket, data, callback) { | 
					
						
							|  |  |  | 	var	username = data.username, | 
					
						
							|  |  |  | 		cid = data.cid; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 12:34:48 -05:00
										 |  |  | 	user.search(username, function(data) { | 
					
						
							|  |  |  | 		async.map(data, function(userObj, next) { | 
					
						
							|  |  |  | 			CategoryTools.privileges(cid, userObj.uid, function(err, privileges) { | 
					
						
							|  |  |  | 				if (!err) { | 
					
						
							|  |  |  | 					userObj.privileges = privileges; | 
					
						
							| 
									
										
										
										
											2014-01-13 12:05:13 -05:00
										 |  |  | 				} else { | 
					
						
							| 
									
										
										
										
											2014-01-16 12:34:48 -05:00
										 |  |  | 					winston.error('[socket api:admin.categories.search] Could not retrieve permissions'); | 
					
						
							| 
									
										
										
										
											2014-01-13 12:05:13 -05:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-01-16 12:34:48 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				next(null, userObj); | 
					
						
							| 
									
										
										
										
											2014-01-10 16:00:03 -05:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2014-01-16 12:34:48 -05:00
										 |  |  | 		}, function(err, data) { | 
					
						
							|  |  |  | 			if (!callback) { | 
					
						
							| 
									
										
										
										
											2014-01-16 15:00:49 -05:00
										 |  |  | 				socket.emit('api:admin.categories.search', data); | 
					
						
							| 
									
										
										
										
											2014-01-16 12:34:48 -05:00
										 |  |  | 			} else { | 
					
						
							|  |  |  | 				callback(null, data); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-01-10 16:00:03 -05:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2014-01-16 12:34:48 -05:00
										 |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2014-01-10 16:00:03 -05:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 15:00:49 -05:00
										 |  |  | SocketAdmin.categories.setPrivilege = function(socket, data, callback) { | 
					
						
							|  |  |  | 	var	cid = data.cid, | 
					
						
							|  |  |  | 		uid = data.uid, | 
					
						
							|  |  |  | 		privilege = data.privilege, | 
					
						
							|  |  |  | 		set = data.set, | 
					
						
							|  |  |  | 		cb = function(err) { | 
					
						
							|  |  |  | 			CategoryTools.privileges(cid, uid, callback); | 
					
						
							|  |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2014-01-10 16:00:03 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (set) { | 
					
						
							|  |  |  | 		groups.joinByGroupName('cid:' + cid + ':privileges:' + privilege, uid, cb); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		groups.leaveByGroupName('cid:' + cid + ':privileges:' + privilege, uid, cb); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SocketAdmin.categories.getPrivilegeSettings = function(cid, callback) { | 
					
						
							|  |  |  | 	async.parallel({ | 
					
						
							|  |  |  | 		"+r": function(next) { | 
					
						
							|  |  |  | 			groups.getByGroupName('cid:' + cid + ':privileges:+r', { expand: true }, function(err, groupObj) { | 
					
						
							|  |  |  | 				if (!err) { | 
					
						
							|  |  |  | 					next.apply(this, arguments); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					next(null, { | 
					
						
							|  |  |  | 						members: [] | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		"+w": function(next) { | 
					
						
							|  |  |  | 			groups.getByGroupName('cid:' + cid + ':privileges:+w', { expand: true }, function(err, groupObj) { | 
					
						
							|  |  |  | 				if (!err) { | 
					
						
							|  |  |  | 					next.apply(this, arguments); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					next(null, { | 
					
						
							|  |  |  | 						members: [] | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}, function(err, data) { | 
					
						
							|  |  |  | 		callback(null, { | 
					
						
							|  |  |  | 			"+r": data['+r'].members, | 
					
						
							|  |  |  | 			"+w": data['+w'].members | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SocketAdmin.categories.setGroupPrivilege = function(cid, gid, privilege, set, callback) { | 
					
						
							|  |  |  | 	if (set) { | 
					
						
							|  |  |  | 		groups.joinByGroupName('cid:' + cid + ':privileges:' + privilege, gid, callback); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		groups.leaveByGroupName('cid:' + cid + ':privileges:' + privilege, gid, callback); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SocketAdmin.categories.groupsList = function(cid, callback) { | 
					
						
							|  |  |  | 	groups.list({expand:false}, function(err, data){ | 
					
						
							|  |  |  | 		async.map(data, function(groupObj, next) { | 
					
						
							|  |  |  | 			CategoryTools.groupPrivileges(cid, groupObj.gid, function(err, privileges) { | 
					
						
							|  |  |  | 				if (!err) { | 
					
						
							|  |  |  | 					groupObj.privileges = privileges; | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					winston.error('[socket api:admin.categories.groupsList] Could not retrieve permissions'); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				next(null, groupObj); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}, function(err, data) { | 
					
						
							|  |  |  | 			callback(null, data); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Themes & Plugins */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SocketAdmin.themes = {}; | 
					
						
							|  |  |  | SocketAdmin.plugins = {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SocketAdmin.themes.getInstalled = function(callback) { | 
					
						
							|  |  |  | 	meta.themes.get(function(err, themeArr) { | 
					
						
							|  |  |  | 		callback(themeArr); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SocketAdmin.themes.set = meta.themes.set; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SocketAdmin.plugins.toggle = function(plugin_id, sessionData) { | 
					
						
							|  |  |  | 	plugins.toggleActive(plugin_id, function(status) { | 
					
						
							|  |  |  | 		sessionData.socket.emit('api:admin.plugins.toggle', status); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-13 12:05:13 -05:00
										 |  |  | /* Configs */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SocketAdmin.config = {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SocketAdmin.config.get = function(callback, sessionData) { | 
					
						
							|  |  |  | 	meta.configs.list(function(err, config) { | 
					
						
							|  |  |  | 		if (!err) { | 
					
						
							|  |  |  | 			callback(config); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SocketAdmin.config.set = function(data, callback, sessionData) { | 
					
						
							|  |  |  | 	meta.configs.set(data.key, data.value, function(err) { | 
					
						
							|  |  |  | 		if (!err) { | 
					
						
							|  |  |  | 			callback({ | 
					
						
							|  |  |  | 				status: 'ok' | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			plugins.fireHook('action:config.set', { | 
					
						
							|  |  |  | 				key: data.key, | 
					
						
							|  |  |  | 				value: data.value | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		logger.monitorConfig({io: sessionData.server}, data); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SocketAdmin.config.remove = function(key) { | 
					
						
							|  |  |  | 	meta.configs.remove(key); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-13 12:09:13 -05:00
										 |  |  | /* Groups */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SocketAdmin.groups = {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SocketAdmin.groups.create = function(data, callback) { | 
					
						
							|  |  |  | 	groups.create(data.name, data.description, function(err, groupObj) { | 
					
						
							|  |  |  | 		callback(err ? err.message : null, groupObj || undefined); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SocketAdmin.groups.delete = function(gid, callback) { | 
					
						
							|  |  |  | 	groups.destroy(gid, function(err) { | 
					
						
							|  |  |  | 		callback(err ? err.message : null, err ? null : 'OK'); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SocketAdmin.groups.get = function(gid, callback) { | 
					
						
							|  |  |  | 	groups.get(gid, { | 
					
						
							|  |  |  | 		expand: true | 
					
						
							|  |  |  | 	}, function(err, groupObj) { | 
					
						
							|  |  |  | 		callback(err ? err.message : null, groupObj || undefined); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SocketAdmin.groups.join = function(data, callback) { | 
					
						
							|  |  |  | 	groups.join(data.gid, data.uid, callback); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SocketAdmin.groups.leave = function(data, callback) { | 
					
						
							|  |  |  | 	groups.leave(data.gid, data.uid, callback); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SocketAdmin.groups.update = function(data, callback) { | 
					
						
							|  |  |  | 	groups.update(data.gid, data.values, function(err) { | 
					
						
							|  |  |  | 		callback(err ? err.message : null); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-10 16:00:03 -05:00
										 |  |  | module.exports = SocketAdmin; |