From df54f8bffc8c5c5001e655f9de919d37ab67f53b Mon Sep 17 00:00:00 2001 From: calzoneman Date: Sat, 23 Mar 2013 22:01:37 -0500 Subject: [PATCH] Proper IPbans in the database --- channel.js | 50 +++++++++++++++++++++++++++++++++----- chatcommand.js | 5 ++-- database.js | 1 + www/assets/js/functions.js | 9 +++++++ 4 files changed, 56 insertions(+), 9 deletions(-) diff --git a/channel.js b/channel.js index 9a3e8e44..65ca5eaa 100644 --- a/channel.js +++ b/channel.js @@ -89,6 +89,20 @@ Channel.prototype.loadMysql = function() { for(var i = 0; i < rows.length; i++) { this.library[rows[i].id] = new Media(rows[i].id, rows[i].title, rows[i].seconds, rows[i].type); } + + // Load bans + var query = 'SELECT * FROM chan_{}_bans' + .replace(/\{\}/, this.name); + var results = db.querySync(query); + if(!results) { + console.log("Channel banlist query failed"); + return; + } + var rows = results.fetchAllSync(); + for(var i = 0; i < rows.length; i++) { + this.ipbans[rows[i].ip] = [rows[i].name, rows[i].banner]; + } + console.log("Loaded channel " + this.name + " from MySQL DB"); db.closeSync(); } @@ -250,6 +264,32 @@ Channel.prototype.addToLibrary = function(media) { return results; } +Channel.prototype.banIP = function(banner, bannee) { + // It is assumed that the banner has permission at this point + this.ipbans[bannee.ip] = [bannee.name, banner.name]; + bannee.socket.disconnect(); + if(!this.registered) + return false; + var db = mysql.createConnectionSync(); + db.connectSync(Config.MYSQL_SERVER, Config.MYSQL_USER, + Config.MYSQL_PASSWORD, Config.MYSQL_DB); + if(!db.connectedSync()) { + console.log("MySQL Connection Failed"); + return false; + } + var query = 'INSERT INTO chan_{1}_bans (`ip`, `name`, `banner`) VALUES ("{2}", "{3}", "{4}")' + .replace(/\{1\}/, this.name) + .replace(/\{2\}/, bannee.ip) + .replace(/\{3\}/, bannee.name) + .replace(/\{4\}/, banner.name); + results = db.querySync(query); + if(!results) { + console.log("Insert into ban table failed"); + } + db.closeSync(); + return results; +} + // Searches the local library for media titles containing query Channel.prototype.searchLibrary = function(query) { query = query.toLowerCase(); @@ -270,11 +310,10 @@ Channel.prototype.searchLibrary = function(query) { // Called when a new user enters the channel Channel.prototype.userJoin = function(user) { - for(var i = 0; i < this.ipbans.length; i++) { - if(this.ipbans[i] == user.ip) { - user.socket.disconnect(); - return; - } + if(user.ip in this.ipbans && this.ipbans[user.ip] != null) { + console.log("/" + user.ip + " was disconnected - banned"); + user.socket.disconnect(); + return; } user.socket.join(this.name); @@ -332,7 +371,6 @@ Channel.prototype.userLeave = function(user) { var idx = this.users.indexOf(user); if(idx >= 0 && idx < this.users.length) this.users.splice(idx, 1); - console.log(this.users.length); this.updateUsercount(); if(user.name != "") { this.sendAll('userLeave', { diff --git a/chatcommand.js b/chatcommand.js index a0ee2c12..72f9e343 100644 --- a/chatcommand.js +++ b/chatcommand.js @@ -57,9 +57,8 @@ function handleBan(chan, user, args) { break; } } - if(kickee) { - chan.ipbans.push(kickee.ip); - kickee.socket.disconnect(); + if(kickee && kickee.rank < user.rank) { + chan.banIP(user, kickee); } } } diff --git a/database.js b/database.js index 982a3ee5..09cde31e 100644 --- a/database.js +++ b/database.js @@ -46,6 +46,7 @@ exports.init = function() { } initialized = true; + db.closeSync(); return true; } diff --git a/www/assets/js/functions.js b/www/assets/js/functions.js index 280de8e0..3cc1cf0d 100644 --- a/www/assets/js/functions.js +++ b/www/assets/js/functions.js @@ -86,6 +86,15 @@ function addUserDropdown(entry, name) { }); }); + var ban = $('
  • ').appendTo(ul); + var a = $('').attr("tabindex", "-1").attr("href", "#").appendTo(ban); + a.text("IP Ban"); + a.click(function() { + socket.emit('chatMsg', { + msg: "/ban " + name + }); + }); + $('
  • ').addClass("divider").appendTo(ul); var promote = $('
  • ').appendTo(ul);