diff --git a/lib/acp.js b/lib/acp.js index c15d3c2d..0c0edfd7 100644 --- a/lib/acp.js +++ b/lib/acp.js @@ -12,6 +12,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI var Logger = require("./logger"); var Server = require("./server"); var db = require("./database"); +var util = require("./utilities"); +var Config = require("./config"); function handleAnnounce(user, data) { var sv = Server.getServer(); @@ -105,11 +107,85 @@ function handleListUsers(user, data) { } function handleSetRank(user, data) { + var name = data.name; + var rank = data.rank; + if (typeof name !== "string" || typeof rank !== "number") { + return; + } + if (rank >= user.global_rank) { + user.socket.emit("errMessage", { + msg: "You are not permitted to promote others to equal or higher rank than " + + "yourself." + }); + return; + } + + db.users.getGlobalRank(name, function (err, oldrank) { + if (err) { + user.socket.emit("errMessage", { + msg: err + }); + return; + } + + if (oldrank >= user.global_rank) { + user.socket.emit("errMessage", { + msg: "You are not permitted to change the rank of users who rank " + + "higher than you." + }); + return; + } + + db.users.setGlobalRank(name, rank, function (err) { + if (err) { + user.socket.emit("errMessage", { + msg: err + }); + } else { + user.socket.emit("acp-set-rank", data); + } + }); + }); } function handleResetPassword(user, data) { + var name = data.name; + var email = data.email; + if (typeof name !== "string" || typeof email !== "string") { + return; + } + db.users.getGlobalRank(name, function (err, rank) { + if (rank >= user.global_rank) { + user.socket.emit("errMessage", { + msg: "You don't have permission to reset the password for " + name + }); + return; + } + + var hash = util.sha1(util.randomSalt(64)); + var expire = Date.now() + 86400000; + db.addPasswordReset({ + ip: "", + name: name, + email: email, + hash: hash, + expire: expire + }, function (err) { + if (err) { + user.socket.emit("errMessage", { + msg: err + }); + return; + } + + user.socket.emit("errMessage", { + msg: "Reset link: " + Config.get("http.domain") + + "/account/passwordrecover/" + hash + }); + }); + }); } function init(user) { diff --git a/templates/acp.jade b/templates/acp.jade index d6ed80f3..45fcf3f1 100644 --- a/templates/acp.jade +++ b/templates/acp.jade @@ -76,10 +76,10 @@ html(lang="en") table.table.table-bordered.table-striped(style="margin-top: 20px") thead tr - th#acp-users-id ID - th#acp-users-name Name - th#acp-users-rank Rank - th#acp-users-email Email + th.sort(data-key="id") ID + th.sort(data-key="name") Name + th.sort(data-key="global_rank") Rank + th.sort(data-key="email") Email th Actions #acp-channel-lookup.acp-panel.col-md-12(style="display: none") h3 Channels diff --git a/www/js/acp.js b/www/js/acp.js index 73f44ef7..e879a534 100644 --- a/www/js/acp.js +++ b/www/js/acp.js @@ -161,7 +161,7 @@ socket.on("acp-list-users", function (users) { generator: function (u, page, index) { var tr = $("