diff --git a/lib/channel.js b/lib/channel.js index 98a8c8f9..6b78e574 100644 --- a/lib/channel.js +++ b/lib/channel.js @@ -99,6 +99,7 @@ var Channel = function(name) { }, show_public: false, enable_link_regex: true, + password: "tomato74" }; self.filters = [ new Filter("monospace", "`([^`]+)`", "g", "$1"), @@ -803,20 +804,40 @@ Channel.prototype.search = function(query, callback) { Channel.prototype.handlePendingJoins = function () { var self = this; self.pendingJoins.forEach(function (u) { - self.userJoin(u); + self.userJoin(u.user, u.pw); }); delete self["pendingJoins"]; }; -Channel.prototype.userJoin = function(user) { +Channel.prototype.userJoin = function(user, password) { var self = this; if (!self.ready) { if (!("pendingJoins" in self)) { self.pendingJoins = []; } - self.pendingJoins.push(user); + if (self.pendingJoins.indexOf(user) === -1) { + self.pendingJoins.push({ + user: user, + pw: password + }); + } return; } + + if (this.opts.password !== false && + this.opts.password !== password && + user.rank < 2) { + user.socket.emit("needPassword", password !== undefined && + this.opts.password !== password); + return; + } + + user.channel = this; + if (("pendingChannel" in user)) { + user.socket.emit("cancelNeedPassword"); + delete user["pendingChannel"]; + } + var parts = user.ip.split("."); var slash24 = parts[0] + "." + parts[1] + "." + parts[2]; // GTFO @@ -2117,7 +2138,8 @@ Channel.prototype.tryUpdateOptions = function(user, data) { pagetitle: true, externalcss: true, externaljs: true, - show_public: true + show_public: true, + password: true }; if ("afk_timeout" in data) { @@ -2126,6 +2148,10 @@ Channel.prototype.tryUpdateOptions = function(user, data) { data.afk_timeout = 0; } + if ("password" in data) { + data.password = data.password === "" ? false : ""+data.password; + } + for(var key in this.opts) { if(key in data) { if(key in adminonly && user.rank < 3) { diff --git a/lib/user.js b/lib/user.js index d29784aa..b6171f64 100644 --- a/lib/user.js +++ b/lib/user.js @@ -28,6 +28,7 @@ var User = function (socket) { this.rank = -1 this.global_rank = -1; this.channel = null; + this.pendingChannel = null; this.name = ""; this.meta = { afk: false, @@ -54,6 +55,10 @@ User.prototype.inChannel = function () { return this.channel !== null && !this.channel.dead; }; +User.prototype.inPendingChannel = function () { + return this.pendingChannel != null && !this.pendingChannel.dead; +}; + // Throttling/cooldown User.prototype.noflood = function (name, hz) { var time = new Date().getTime(); @@ -134,7 +139,7 @@ User.prototype.initCallbacks = function () { self.socket.on("joinChannel", function (data) { data = (typeof data !== "object") ? {} : data; - if (self.inChannel()) + if (self.inChannel() || self.inPendingChannel()) return; if (typeof data.name != "string") { return; @@ -148,14 +153,21 @@ User.prototype.initCallbacks = function () { return; } data.name = data.name.toLowerCase(); - self.channel = self.server.getChannel(data.name); + self.pendingChannel = self.server.getChannel(data.name); if (self.loggedIn) { - self.channel.getRank(self.name, function (err, rank) { + // TODO fix + self.pendingChannel.getRank(self.name, function (err, rank) { if (!err && rank > self.rank) self.rank = rank; }); } - self.channel.userJoin(self); + self.pendingChannel.userJoin(self); + }); + + self.socket.on("channelPassword", function (pw) { + if (!self.inChannel() && self.inPendingChannel()) { + self.pendingChannel.userJoin(self, pw); + } }); self.socket.on("login", function (data) { @@ -745,10 +757,13 @@ User.prototype.login = function (name, pw, session) { self.channel.logger.log(self.ip + " logged in as " + name); self.channel.broadcastNewUser(self); + } else if (self.inPendingChannel()) { + self.pendingChannel.userJoin(self); } }; - if (self.inChannel()) { - self.channel.getRank(name, function (err, rank) { + if (self.inChannel() || self.inPendingChannel()) { + var chan = self.channel != null ? self.channel : self.pendingChannel; + chan.getRank(name, function (err, rank) { if (!err) { self.saverank = true; self.rank = rank; diff --git a/www/assets/js/callbacks.js b/www/assets/js/callbacks.js index 412448ee..08421e02 100644 --- a/www/assets/js/callbacks.js +++ b/www/assets/js/callbacks.js @@ -46,6 +46,9 @@ Callbacks = { socket.emit("joinChannel", { name: CHANNEL.name }); + if (CHANNEL.opts.password) { + socket.emit("channelPassword", CHANNEL.opts.password); + } if(NAME && SESSION) { socket.emit("login", { name: NAME, @@ -127,26 +130,44 @@ Callbacks = { scrollChat(); }, + needPassword: function (wrongpw) { + var div = $("
"); + $("").text("Channel Password") + .appendTo(div); + if (wrongpw) { + $("
").appendTo(div); + $("").addClass("text-error") + .text("Wrong Password") + .appendTo(div); + } + + var pwbox = $("").addClass("input-block-level") + .attr("type", "password") + .appendTo(div); + var submit = $("