diff --git a/server/handlers/chat.js b/server/handlers/chat.js index fd65f2c8..7ca43e59 100644 --- a/server/handlers/chat.js +++ b/server/handlers/chat.js @@ -58,19 +58,6 @@ function getAndSendLogs(channel, all, socket, pass, query) { }); } -function checkIfUserIsBanned(channel, socket, guid, callback) { - var connection_id = Functions.hash_pass(socket.handshake.headers["user-agent"] + socket.handshake.address + socket.handshake.headers["accept-language"]); - db.collection(channel + "_banned_chat").find({connection_id: connection_id}, function(err, docs) { - if(docs.length == 0) callback(); - else { - db.collection("user_names").update({guid, guid}, {$addToSet:{channels: channel}}, function(){ - socket.emit('chat', {from: "System", msg: ": You can't chat in this channel, you are banned. The reason is: " + docs[0].reason, icon: "https://zoff.me/assets/images/favicon-32x32.png"}); - return; - }); - } - }) -} - function chat(msg, guid, offline, socket) { if(typeof(msg) !== 'object' || !msg.hasOwnProperty('data') || !msg.hasOwnProperty('channel') || typeof(msg.data) != "string" || typeof(msg.channel) != "string") { @@ -103,7 +90,10 @@ function chat(msg, guid, offline, socket) { msg.pass = crypto.createHash('sha256').update(Functions.decrypt_string(msg.pass)).digest("base64"); } db.collection(coll + "_settings").find(function(err, conf){ - if(conf.length > 0 && (conf[0].userpass == undefined || conf[0].userpass == "" || (msg.hasOwnProperty('pass') && conf[0].userpass == msg.pass))) { + if(conf.length > 0 && !conf[0].toggleChat) { + socket.emit('chat', {from: "System", msg: ": Chat for this channel has been disabled.", icon: "https://zoff.me/assets/images/favicon-32x32.png"}); + return; + } else if(conf.length > 0 && (conf[0].userpass == undefined || conf[0].userpass == "" || (msg.hasOwnProperty('pass') && conf[0].userpass == msg.pass))) { var data = msg.data; Functions.check_inlist(coll, guid, socket, offline, function() { @@ -239,138 +229,167 @@ function all_chat(msg, guid, offline, socket) { }, "place 2"); } -function namechange(data, guid, socket, tried, callback) { - /*if(!data.hasOwnProperty("channel") || - typeof(data.channel) != "string") return;*/ - checkIfUserIsBanned(data.channel, socket, guid, function() { - var pw = ""; - var new_password; - var first = false; - Functions.getSessionChatPass(Functions.getSession(socket), function(name, pass) { - var fetched = false; - if(data.hasOwnProperty("first") && data.first) { - pw = pass; - name = name; - data.name = name; - data.password = pass; - new_password = false; - if(name == "" || pass == "") { - if(typeof(callback) == "function") callback(); - return; - } - fetched = true; - password = pw; +function checkIfChatEnabled(channel, socket, callback) { + if(channel == "" || channel == undefined) callback(); + else { + db.collection(channel + "_settings").find(function(err, docs){ + if(docs.length > 0 && !docs[0].toggleChat) { + socket.emit('chat', {from: "System", msg: ": Chat for this channel has been disabled.", icon: "https://zoff.me/assets/images/favicon-32x32.png"}); } else { - var name = data.name; - if(data.hasOwnProperty("first")) { - first = data.first; - } - if(data.hasOwnProperty("password")) { - pw = data.password; + callback(); + } + }); + } +} + +function checkIfUserIsBanned(channel, socket, guid, callback, callback_error) { + var connection_id = Functions.hash_pass(socket.handshake.headers["user-agent"] + socket.handshake.address + socket.handshake.headers["accept-language"]); + db.collection(channel + "_banned_chat").find({connection_id: connection_id}, function(err, docs) { + if(docs.length == 0) callback(); + else { + db.collection("user_names").findAndModify({query: {guid, guid}, update: {$addToSet:{channels: channel}}}, function(e, d){ + socket.emit('chat', {from: "System", msg: ": You can't chat in this channel, you are banned. The reason is: " + docs[0].reason, icon: "https://zoff.me/assets/images/favicon-32x32.png"}); + if(typeof(callback_error) == "function") callback_error(); + else return; + }); + } + }) +} + +function namechange(data, guid, socket, tried, callback) { + checkIfChatEnabled(data.channel, socket, function() { + checkIfUserIsBanned(data.channel, socket, guid, function() { + var pw = ""; + var new_password; + var first = false; + Functions.getSessionChatPass(Functions.getSession(socket), function(name, pass) { + var fetched = false; + if(data.hasOwnProperty("first") && data.first) { + pw = pass; + name = name; + data.name = name; + data.password = pass; new_password = false; - } else if(data.hasOwnProperty("new_password") && data.hasOwnProperty("old_password")) { - pw = data.old_password; - new_password = Functions.decrypt_string(data.new_password); - } - password = Functions.decrypt_string(pw); - password = Functions.hash_pass(password); - doubled = true; - } - - if(name == "") { - if(typeof(callback) == "function") callback(); - return; - } - - - db.collection("registered_users").find({"_id": name.toLowerCase()}, function(err, docs) { - var accepted_password = false; - var icon = false; - if(docs.length == 0) { - if(new_password) { + if(name == "" || pass == "") { if(typeof(callback) == "function") callback(); return; } - accepted_password = true; - Functions.setSessionChatPass(Functions.getSession(socket), name.toLowerCase(), data.password, function() { - db.collection("registered_users").update({"_id": name.toLowerCase()}, {$set: {password: password}}, {upsert: true}, function() { - }); - }); - } else if(docs[0].password == password) { - if(docs[0].icon) { - icon = docs[0].icon; + fetched = true; + password = pw; + } else { + var name = data.name; + if(data.hasOwnProperty("first")) { + first = data.first; } - accepted_password = true; - if(new_password) { - Functions.setSessionChatPass(Functions.getSession(socket), name.toLowerCase(), data.new_password, function() { + if(data.hasOwnProperty("password")) { + pw = data.password; + new_password = false; + } else if(data.hasOwnProperty("new_password") && data.hasOwnProperty("old_password")) { + pw = data.old_password; + new_password = Functions.decrypt_string(data.new_password); + } + password = Functions.decrypt_string(pw); + password = Functions.hash_pass(password); + doubled = true; + } - db.collection("registered_users").update({"_id": name.toLowerCase(), password: password}, {$set: {password: Functions.hash_pass(new_password)}}, function() { + if(name == "") { + if(typeof(callback) == "function") callback(); + return; + } + + db.collection("registered_users").find({"_id": name.toLowerCase()}, function(err, docs) { + var accepted_password = false; + var icon = false; + if(docs.length == 0) { + if(new_password) { + if(typeof(callback) == "function") callback(); + return; + } + accepted_password = true; + Functions.setSessionChatPass(Functions.getSession(socket), name.toLowerCase(), data.password, function() { + db.collection("registered_users").update({"_id": name.toLowerCase()}, {$set: {password: password}}, {upsert: true}, function() { }); }); - } else { - Functions.setSessionChatPass(Functions.getSession(socket), name.toLowerCase(), fetched ? data.password : Functions.hash_pass(Functions.decrypt_string(data.password)), function() { - }); - } - } - if(accepted_password) { + } else if(docs[0].password == password) { + if(docs[0].icon) { + icon = docs[0].icon; + } + accepted_password = true; + if(new_password) { + Functions.setSessionChatPass(Functions.getSession(socket), name.toLowerCase(), data.new_password, function() { + + db.collection("registered_users").update({"_id": name.toLowerCase(), password: password}, {$set: {password: Functions.hash_pass(new_password)}}, function() { - db.collection("user_names").find({"guid": guid}, function(err, names) { - if(names.length > 0 || (docs.length != 0 && docs[0].password == password)) { - var no_name = false; - if(names.length == 0) no_name = true; - if(!no_name) { - var old_name = names[0].name; - db.collection("user_names").update({"_id": "all_names"}, {$pull: {names: old_name}}, function() {}); - } - var updateElement = {$set: {name: name, icon: icon}}; - if(data.hasOwnProperty("channel") && data.channel != "") { - updateElement["$addToSet"] = {channels: data.channel}; - } - db.collection("user_names").update({"guid": guid}, updateElement, {upsert: true}, function(err, docs) { - db.collection("user_names").update({"_id": "all_names"}, {$addToSet: {names: name}}, function(err, docs) { - //socket.emit('name', {type: "name", accepted: true}); - if(old_name != name && !first && !no_name) { - if(data.hasOwnProperty("channel") && typeof(data.channel) == "string") { - io.to(data.channel).emit('chat', {from: old_name, msg: " changed name to " + name}); - io.sockets.emit('chat.all', {from: old_name , msg: " changed name to " + name, channel: data.channel}); - } - } - if(callback != undefined && typeof(callback) == "function") callback(); }); }); } else { - if(tried < 3 || tried == undefined) { - if(tried == undefined) { - tried = 1; - } - namechange(data, guid, socket, tried + 1); - } + Functions.setSessionChatPass(Functions.getSession(socket), name.toLowerCase(), fetched ? data.password : Functions.hash_pass(Functions.decrypt_string(data.password)), function() { + }); } - }); - } else { - Functions.removeSessionChatPass(Functions.getSession(socket), function() { - socket.emit('name', {type: "name", accepted: false}); - }); - } + } + if(accepted_password) { + + db.collection("user_names").find({"guid": guid}, function(err, names) { + if(names.length > 0 || (docs.length != 0 && docs[0].password == password)) { + var no_name = false; + if(names.length == 0) no_name = true; + if(!no_name) { + var old_name = names[0].name; + db.collection("user_names").update({"_id": "all_names"}, {$pull: {names: old_name}}, function() {}); + } + var updateElement = {$set: {name: name, icon: icon}}; + if(data.hasOwnProperty("channel") && data.channel != "") { + updateElement["$addToSet"] = {channels: data.channel}; + } + db.collection("user_names").update({"guid": guid}, updateElement, {upsert: true}, function(err, docs) { + db.collection("user_names").update({"_id": "all_names"}, {$addToSet: {names: name}}, function(err, docs) { + //socket.emit('name', {type: "name", accepted: true}); + if(old_name != name && !first && !no_name) { + if(data.hasOwnProperty("channel") && typeof(data.channel) == "string") { + io.to(data.channel).emit('chat', {from: old_name, msg: " changed name to " + name}); + io.sockets.emit('chat.all', {from: old_name , msg: " changed name to " + name, channel: data.channel}); + } + } + if(callback != undefined && typeof(callback) == "function") callback(); + }); + }); + } else { + if(tried < 3 || tried == undefined) { + if(tried == undefined) { + tried = 1; + } + namechange(data, guid, socket, tried + 1); + } + } + }); + } else { + Functions.removeSessionChatPass(Functions.getSession(socket), function() { + socket.emit('name', {type: "name", accepted: false}); + }); + } + }); }); - }); + }, callback); }); } function removename(guid, coll, socket) { //coll = coll.replace(/ /g,''); - db.collection("user_names").find({"guid": guid}, function(err, docs) { - if(docs.length == 1) { - var old_name = docs[0].name; - Functions.removeSessionChatPass(Functions.getSession(socket), function() { - db.collection("user_names").update({"_id": "all_names"}, {$pull: {names: old_name}}, function(err, updated) { - db.collection("user_names").remove({"guid": guid}, function(err, removed) { - get_name(guid, {announce: true, old_name: old_name, channel: coll, socket: socket}); + checkIfChatEnabled(coll, socket, function() { + db.collection("user_names").find({"guid": guid}, function(err, docs) { + if(docs.length == 1) { + var old_name = docs[0].name; + Functions.removeSessionChatPass(Functions.getSession(socket), function() { + db.collection("user_names").update({"_id": "all_names"}, {$pull: {names: old_name}}, function(err, updated) { + db.collection("user_names").remove({"guid": guid}, function(err, removed) { + get_name(guid, {announce: true, old_name: old_name, channel: coll, socket: socket}); + }); }); }); - }); - } + } + }); }); } diff --git a/server/handlers/functions.js b/server/handlers/functions.js index edc6bbda..96049792 100644 --- a/server/handlers/functions.js +++ b/server/handlers/functions.js @@ -317,10 +317,11 @@ function setChromecastHost(id, other_id, list, callback) { function setSessionUserPass(id, userpass, list, callback) { try { - if(id == "empty" || id == undefined) { + if(id == "empty" || id == undefined || userpass == undefined) { callback(); return; } + connected_db.collection(id).update({_id: list}, {$set: {userpass: userpass}}, {upsert: true}, function(e, d){ callback(); return; diff --git a/server/handlers/list_change.js b/server/handlers/list_change.js index 83b8ca18..b4dddd34 100644 --- a/server/handlers/list_change.js +++ b/server/handlers/list_change.js @@ -56,6 +56,7 @@ function addFromOtherList(arr, guid, offline, socket) { } else { otheruser = crypto.createHash('sha256').update(Functions.decrypt_string(otheruser)).digest("base64"); } + db.collection(channel).find({now_playing: true}, function(e, np) { var project_object = { diff --git a/server/handlers/list_settings.js b/server/handlers/list_settings.js index d3691cfe..c57a6403 100644 --- a/server/handlers/list_settings.js +++ b/server/handlers/list_settings.js @@ -179,8 +179,8 @@ function conf_function(params, coll, guid, offline, socket) { var adminpass = params.adminpass; var skipping = params.skipping; var shuffling = params.shuffling; - var userpass = Functions.decrypt_string(params.userpass); + var userpass = Functions.decrypt_string(params.userpass); if((!params.userpass_changed && frontpage) || (params.userpass_changed && userpass == "")) { userpass = ""; @@ -218,6 +218,9 @@ function conf_function(params, coll, guid, offline, socket) { adminpass:hash, desc: description, }; + if(params.hasOwnProperty("toggleChat") && docs[0].adminpass != "" && docs[0].adminpass != undefined && docs[0].adminpass == hash) { + obj.toggleChat = params.toggleChat; + } if(params.userpass_changed) { obj["userpass"] = userpass; } else if (frontpage) { @@ -226,7 +229,7 @@ function conf_function(params, coll, guid, offline, socket) { db.collection(coll + "_settings").update({ id: "config" }, { $set:obj }, function(err, docs){ - Functions.setSessionUserPass(Functions.getSession(socket), crypto.createHash('sha256').update(Functions.decrypt_string(params.userpass)).digest('base64'), coll, function() { + Functions.setSessionUserPass(Functions.getSession(socket), obj["userpass"], coll, function() { db.collection(coll + "_settings").find(function(err, docs){ if(docs[0].adminpass !== "") docs[0].adminpass = true; if(docs[0].hasOwnProperty("userpass") && docs[0].userpass != "") docs[0].userpass = true; diff --git a/server/public/assets/js/admin.js b/server/public/assets/js/admin.js index 21f9cede..67078217 100755 --- a/server/public/assets/js/admin.js +++ b/server/public/assets/js/admin.js @@ -22,7 +22,7 @@ var Admin = { } Helper.removeClass(".delete-context-menu", "context-menu-disabled"); names = ["vote","addsongs","longsongs","frontpage", "allvideos", - "removeplay", "skip", "shuffle", "userpass"]; + "removeplay", "skip", "shuffle", "userpass", "toggleChat"]; //Crypt.set_pass(chan.toLowerCase(), Crypt.tmp_pass); for (var i = 0; i < names.length; i++) { @@ -42,6 +42,7 @@ var Admin = { document.getElementById("password").value = ""; document.getElementById("password").setAttribute("placeholder", "Change admin password"); Helper.removeClass(".user-password-li", "hide"); + Helper.removeClass(".chat-toggle-li", "hide"); Helper.removeClass(".delete-all", "hide"); if(document.getElementsByClassName("password_protected")[0].checked) { Helper.removeClass(".change_user_pass", "hide"); @@ -105,7 +106,7 @@ var Admin = { w_p = true; adminpass = ""; names = ["vote","addsongs","longsongs","frontpage", "allvideos", - "removeplay", "skip", "shuffle"]; + "removeplay", "skip", "shuffle", "toggleChat"]; document.getElementById("password").value = ""; Helper.css("#thumbnail_form", "display", "none"); Helper.css("#description_form", "display", "none"); @@ -123,6 +124,7 @@ var Admin = { Helper.addClass(".user-password-li", "hide"); + Helper.addClass(".chat-toggle-li", "hide"); Helper.addClass(".delete-all", "hide"); if(document.getElementsByClassName("password_protected")[0].checked) { @@ -146,9 +148,9 @@ var Admin = { music = conf_array.allvideos; longsongs = conf_array.longsongs; names = ["vote","addsongs","longsongs","frontpage", "allvideos", - "removeplay", "skip", "shuffle", "userpass"]; - - + "removeplay", "skip", "shuffle", "userpass", "toggleChat"]; + if(!conf.hasOwnProperty("toggleChat")) conf.toggleChat = true; + toggleChat = conf.toggleChat; hasadmin = conf_array.adminpass != ""; var show_disabled = true; if(hasadmin && Admin.logged_in || !hasadmin) { @@ -197,6 +199,8 @@ var Admin = { removeplay = form.removeplay.checked; skipping = form.skip.checked; shuffling = form.shuffle.checked; + toggleChat = form.toggleChat.checked; + var pass_send = userpass_changed && !form.userpass.checked ? "" : userpass; configs = { channel: chan.toLowerCase(), @@ -209,6 +213,7 @@ var Admin = { adminpass: adminpass == "" ? "" : Crypt.crypt_pass(adminpass), skipping: skipping, shuffling: shuffling, + toggleChat: toggleChat, userpass: Crypt.crypt_pass(pass_send), userpass_changed: userpass_changed }; diff --git a/server/public/assets/js/chat.js b/server/public/assets/js/chat.js index d33911c4..1f0d1be5 100755 --- a/server/public/assets/js/chat.js +++ b/server/public/assets/js/chat.js @@ -143,7 +143,7 @@ var Chat = { }, channelchat: function(data, time_sent, disable_blink) { - if(data.msg.substring(0,1) == ":" && !chat_active && !disable_blink) { + if(data.msg.substring(0,1) == ":" && !chat_active && !disable_blink && data.from.toLowerCase() != "system") { document.querySelector("#favicon").setAttribute("href", "/assets/images/highlogo.png"); unseen = true; chat_unseen = true; diff --git a/server/public/assets/js/listeners.js b/server/public/assets/js/listeners.js index ae1c4853..55822b22 100755 --- a/server/public/assets/js/listeners.js +++ b/server/public/assets/js/listeners.js @@ -49,6 +49,7 @@ var frontpage = 1; var adminpass = ""; var showDiscovery = false; var player_ready = false; +var toggleChat = true; var viewers = 1; var temp_user_pass = ""; var zoff_api_token = "DwpnKVkaMH2HdcpJT2YPy783SY33byF5/32rbs0+xdU="; diff --git a/server/public/partials/channel/panel.handlebars b/server/public/partials/channel/panel.handlebars index f1ff09ed..516dea84 100755 --- a/server/public/partials/channel/panel.handlebars +++ b/server/public/partials/channel/panel.handlebars @@ -3,148 +3,7 @@ close