This commit is contained in:
calzoneman 2013-06-19 17:54:27 -04:00
parent dc5c6801ed
commit 7b60d0948e
15 changed files with 139 additions and 113 deletions

View file

@ -20,7 +20,7 @@ var Logger = require("./logger.js");
exports.isRegistered = function(name) { exports.isRegistered = function(name) {
var db = Database.getConnection(); var db = Database.getConnection();
if(!db) { if(!db) {
return true; throw "Database failure";
} }
var query = Database.createQuery( var query = Database.createQuery(
"SELECT * FROM `registrations` WHERE uname=?", "SELECT * FROM `registrations` WHERE uname=?",
@ -90,7 +90,7 @@ exports.login = function(name, pw, session) {
exports.loginPassword = function(name, pw) { exports.loginPassword = function(name, pw) {
var db = Database.getConnection(); var db = Database.getConnection();
if(!db) { if(!db) {
return false; throw "Database failure";
} }
var query = Database.createQuery( var query = Database.createQuery(
"SELECT * FROM `registrations` WHERE uname=?", "SELECT * FROM `registrations` WHERE uname=?",
@ -140,7 +140,7 @@ exports.createSession = function(name) {
var hash = hashlib.sha256(salt + name); var hash = hashlib.sha256(salt + name);
var db = Database.getConnection(); var db = Database.getConnection();
if(!db) { if(!db) {
return false; throw "Database failure";
} }
var query = Database.createQuery( var query = Database.createQuery(
["UPDATE `registrations` SET ", ["UPDATE `registrations` SET ",
@ -156,7 +156,7 @@ exports.createSession = function(name) {
exports.loginSession = function(name, hash) { exports.loginSession = function(name, hash) {
var db = Database.getConnection(); var db = Database.getConnection();
if(!db) { if(!db) {
return false; throw "Database failure";
} }
var query = Database.createQuery( var query = Database.createQuery(
"SELECT * FROM `registrations` WHERE `uname`=?", "SELECT * FROM `registrations` WHERE `uname`=?",

View file

@ -138,8 +138,15 @@ Channel.prototype.hasPermission = function(user, key) {
Channel.prototype.loadDump = function() { Channel.prototype.loadDump = function() {
fs.readFile("chandump/" + this.name, function(err, data) { fs.readFile("chandump/" + this.name, function(err, data) {
if(err) { if(err) {
Logger.errlog.log("Failed to open channel dump " + this.name); if(err.code == "ENOENT") {
Logger.errlog.log(err); Logger.errlog.log("WARN: missing dump for " + this.name);
this.initialized = true;
this.saveDump();
}
else {
Logger.errlog.log("Failed to open channel dump " + this.name);
Logger.errlog.log(err);
}
return; return;
} }
try { try {

View file

@ -38,7 +38,7 @@ function getConnection() {
db = mysql.createConnectionSync(); db = mysql.createConnectionSync();
db.connectSync(SERVER, USER, PASSWORD, DATABASE); db.connectSync(SERVER, USER, PASSWORD, DATABASE);
if(!db.connectedSync()) { if(!db.connectedSync()) {
//Logger.errlog.log("DB connection failed"); Logger.errlog.log("DB connection failed");
return false; return false;
} }
if(CONFIG.DEBUG) { if(CONFIG.DEBUG) {

View file

@ -141,6 +141,7 @@ function newConnection(req, res) {
exports.newConnection = newConnection; exports.newConnection = newConnection;
function msgReceived(req, res) { function msgReceived(req, res) {
res.callback = req.query.callback;
var h = req.params.hash; var h = req.params.hash;
if(h in clients && clients[h] != null) { if(h in clients && clients[h] != null) {
var str = req.params.str; var str = req.params.str;

132
user.js
View file

@ -541,73 +541,89 @@ User.prototype.login = function(name, pw, session) {
return false; return false;
} }
} }
// Sorry bud, can't take that name try {
if(Auth.isRegistered(name)) { // Sorry bud, can't take that name
this.socket.emit("login", { if(Auth.isRegistered(name)) {
success: false, this.socket.emit("login", {
error: "That username is already taken" success: false,
}); error: "That username is already taken"
return false; });
} return false;
// YOUR ARGUMENT IS INVALID
else if(!Auth.validateName(name)) {
this.socket.emit("login", {
success: false,
error: "Invalid username. Usernames must be 1-20 characters long and consist only of alphanumeric characters and underscores"
});
}
else {
lastguestlogin[this.ip] = Date.now();
this.rank = Rank.Guest;
Logger.syslog.log(this.ip + " signed in as " + name);
Database.recordVisit(this.ip, name);
this.name = name;
this.loggedIn = false;
this.socket.emit("login", {
success: true,
name: name
});
this.socket.emit("rank", this.rank);
if(this.channel != null) {
this.channel.logger.log(this.ip + " signed in as " + name);
this.channel.broadcastNewUser(this);
} }
// YOUR ARGUMENT IS INVALID
else if(!Auth.validateName(name)) {
this.socket.emit("login", {
success: false,
error: "Invalid username. Usernames must be 1-20 characters long and consist only of alphanumeric characters and underscores"
});
}
else {
lastguestlogin[this.ip] = Date.now();
this.rank = Rank.Guest;
Logger.syslog.log(this.ip + " signed in as " + name);
Database.recordVisit(this.ip, name);
this.name = name;
this.loggedIn = false;
this.socket.emit("login", {
success: true,
name: name
});
this.socket.emit("rank", this.rank);
if(this.channel != null) {
this.channel.logger.log(this.ip + " signed in as " + name);
this.channel.broadcastNewUser(this);
}
}
}
catch(e) {
this.socket.emit("login", {
success: false,
error: e
});
} }
} }
else { else {
var row; try {
if((row = Auth.login(name, pw, session))) { var row;
this.loggedIn = true; if((row = Auth.login(name, pw, session))) {
this.socket.emit("login", { this.loggedIn = true;
success: true, this.socket.emit("login", {
session: row.session_hash, success: true,
name: name session: row.session_hash,
}); name: name
Logger.syslog.log(this.ip + " logged in as " + name); });
Database.recordVisit(this.ip, name); Logger.syslog.log(this.ip + " logged in as " + name);
this.profile = { Database.recordVisit(this.ip, name);
image: row.profile_image, this.profile = {
text: row.profile_text image: row.profile_image,
}; text: row.profile_text
var chanrank = (this.channel != null) ? this.channel.getRank(name) };
: Rank.Guest; var chanrank = (this.channel != null) ? this.channel.getRank(name)
var rank = (chanrank > row.global_rank) ? chanrank : Rank.Guest;
: row.global_rank; var rank = (chanrank > row.global_rank) ? chanrank
this.rank = (this.rank > rank) ? this.rank : rank; : row.global_rank;
this.socket.emit("rank", this.rank); this.rank = (this.rank > rank) ? this.rank : rank;
this.name = name; this.socket.emit("rank", this.rank);
if(this.channel != null) { this.name = name;
this.channel.logger.log(this.ip + " logged in as " + name); if(this.channel != null) {
this.channel.broadcastNewUser(this); this.channel.logger.log(this.ip + " logged in as " + name);
this.channel.broadcastNewUser(this);
}
}
// Wrong password
else {
this.socket.emit("login", {
success: false,
error: "Invalid session"
});
return false;
} }
} }
// Wrong password catch(e) {
else {
this.socket.emit("login", { this.socket.emit("login", {
success: false, success: false,
error: "Invalid session" error: e
}); });
return false;
} }
} }
} }

View file

@ -27,7 +27,7 @@
<div class=""> <div class="">
<ul class="nav"> <ul class="nav">
<li><a href="index.html">Home</a></li> <li><a href="index.html">Home</a></li>
<li><a href="help.html">Help</a></li> <li><a href="https://github.com/calzoneman/sync/wiki/Beginner%27s-Guide-and-FAQ" target="_blank">Help</a></li>
<li class="active"><a href="account.html">Account</a></li> <li class="active"><a href="account.html">Account</a></li>
</ul> </ul>
</div> </div>

View file

@ -9,8 +9,8 @@ The above copyright notice and this permission notice shall be included in all c
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/ */
var uname = readCookie("sync_uname") || ""; var uname = readCookie("cytube_uname") || "";
var session = readCookie("sync_session") || ""; var session = readCookie("cytube_session") || "";
var api = WEB_URL + "/api/json/"; var api = WEB_URL + "/api/json/";
var loggedin = false; var loggedin = false;

View file

@ -356,9 +356,10 @@ Callbacks = {
banlist: function(entries) { banlist: function(entries) {
var tbl = $("#banlist table"); var tbl = $("#banlist table");
// dumb hack because of jquery UI // I originally added this check because of a race condition
// sortable turns tables and lists into a mess of race conditions // Now it seems to work without but I don't trust it
if(!tbl.hasClass("table")) { if(!tbl.hasClass("table")) {
console.log("thing");
setTimeout(function() { setTimeout(function() {
Callbacks.banlist(entries); Callbacks.banlist(entries);
}, 100); }, 100);
@ -391,8 +392,8 @@ Callbacks = {
recentLogins: function(entries) { recentLogins: function(entries) {
var tbl = $("#loginhistory table"); var tbl = $("#loginhistory table");
// dumb hack because of jquery UI // I originally added this check because of a race condition
// sortable turns tables and lists into a mess of race conditions // Now it seems to work without but I don't trust it
if(!tbl.hasClass("table")) { if(!tbl.hasClass("table")) {
setTimeout(function() { setTimeout(function() {
Callbacks.recentLogins(entries); Callbacks.recentLogins(entries);
@ -415,8 +416,10 @@ Callbacks = {
channelRanks: function(entries) { channelRanks: function(entries) {
var tbl = $("#channelranks table"); var tbl = $("#channelranks table");
// Dammit jQuery UI // I originally added this check because of a race condition
// Now it seems to work without but I don't trust it
if(!tbl.hasClass("table")) { if(!tbl.hasClass("table")) {
console.log("thing");
setTimeout(function() { setTimeout(function() {
Callbacks.channelRanks(entries); Callbacks.channelRanks(entries);
}, 100); }, 100);
@ -935,35 +938,8 @@ Callbacks = {
} }
} }
} }
/*
pl = [];
for(var i = 0; i < 10; i++) {
var m = {
title: "Test " + i,
type: "yt",
id: "test" + i,
seconds: 0,
duration: "00:00"
};
pl.push(m);
}
setTimeout(function() {
Callbacks.playlist(pl);
}, 1000);
*/
$.getScript(IO_URL+"/socket.io/socket.io.js", function() {
try {
socket = io.connect(IO_URL);
setupCallbacks();
}
catch(e) {
Callbacks.disconnect();
}
});
setupCallbacks = function() { setupCallbacks = function() {
console.log(socket);
for(var key in Callbacks) { for(var key in Callbacks) {
(function(key) { (function(key) {
socket.on(key, function(data) { socket.on(key, function(data) {
@ -973,3 +949,23 @@ setupCallbacks = function() {
} }
} }
if(USEROPTS.altsocket) {
socket = new NotWebsocket();
setupCallbacks();
}
else {
$.getScript(IO_URL+"/socket.io/socket.io.js", function() {
try {
if(NO_WEBSOCKETS) {
var i = io.transports.indexOf("websocket");
if(i >= 0)
io.transports.splice(i, 1);
}
socket = io.connect(IO_URL);
setupCallbacks();
}
catch(e) {
Callbacks.disconnect();
}
});
}

View file

@ -1,3 +1,5 @@
var CL_VERSION = "2.0.0";
var CLIENT = { var CLIENT = {
rank: -1, rank: -1,
leader: false, leader: false,

View file

@ -11,3 +11,4 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
var IO_URL = "http://localhost:1337"; var IO_URL = "http://localhost:1337";
var WEB_URL = "http://localhost:8080"; var WEB_URL = "http://localhost:8080";
var NO_WEBSOCKETS = false;

View file

@ -12,7 +12,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
var NotWebsocket = function() { var NotWebsocket = function() {
this.connected = false; this.connected = false;
this.polltmr = false; this.polltmr = false;
$.getJSON(WEB_URL + "/nws/connect", function(data) { $.getJSON(WEB_URL + "/nws/connect?callback=?", function(data) {
this.hash = data; this.hash = data;
this.connected = true; this.connected = true;
this.recv(["connect", undefined]); this.recv(["connect", undefined]);
@ -76,7 +76,7 @@ NotWebsocket.prototype.emit = function(msg, data) {
} }
var pkt = [msg, data]; var pkt = [msg, data];
var str = escape(JSON.stringify(pkt)).replace(/\//g, "%2F"); var str = escape(JSON.stringify(pkt)).replace(/\//g, "%2F");
$.getJSON(WEB_URL+"/nws/"+this.hash+"/"+str, function() { $.getJSON(WEB_URL+"/nws/"+this.hash+"/"+str+"?callback=?", function() {
// Poll more quickly because sending a packet usually means // Poll more quickly because sending a packet usually means
// expecting some data to come back // expecting some data to come back
this.pollint = 100; this.pollint = 100;

View file

@ -57,7 +57,7 @@ $("#chatline").keydown(function(ev) {
msg: msg msg: msg
}); });
CHATHIST.push($("#chatline").val()); CHATHIST.push($("#chatline").val());
CHATLISTIDX = CHATHIST.length; CHATHISTIDX = CHATHIST.length;
$("#chatline").val(""); $("#chatline").val("");
} }
return; return;
@ -326,3 +326,8 @@ else {
} }
}); });
} }
/* oh internet explorer, how I hate thee */
$(":input:not(textarea)").keypress(function(ev) {
return ev.keyCode != 13;
});

View file

@ -111,8 +111,6 @@ function addUserDropdown(entry, name) {
$("<strong/>").text(name).appendTo(menu); $("<strong/>").text(name).appendTo(menu);
$("<br/>").appendTo(menu); $("<br/>").appendTo(menu);
if(CLIENT.rank >= 2)
$("<span/>").addClass("user-aliases").appendTo(menu);
if(hasPermission("kick")) { if(hasPermission("kick")) {
$("<button/>").addClass("btn btn-mini btn-block") $("<button/>").addClass("btn btn-mini btn-block")
.text("Kick") .text("Kick")
@ -164,8 +162,6 @@ function addUserDropdown(entry, name) {
entry.contextmenu(function(ev) { entry.contextmenu(function(ev) {
ev.preventDefault(); ev.preventDefault();
if(menu.css("display") == "none") { if(menu.css("display") == "none") {
menu.find(".user-aliases")
.text("Aliases: " + entry.data("aliases"));
menu.show(); menu.show();
} }
else { else {
@ -476,7 +472,7 @@ function applyOpts() {
} }
if(USEROPTS.altsocket) { if(USEROPTS.altsocket) {
if(socket) if(socket && socket.disconnect)
socket.disconnect(); socket.disconnect();
socket = new NotWebsocket(); socket = new NotWebsocket();
setupCallbacks(); setupCallbacks();
@ -649,6 +645,8 @@ function hasPermission(key) {
function handlePermissionChange() { function handlePermissionChange() {
function setVisible(selector, bool) { function setVisible(selector, bool) {
// I originally added this check because of a race condition
// Now it seems to work without but I don't trust it
if($(selector) && $(selector).attr("id") != selector.substring(1)) { if($(selector) && $(selector).attr("id") != selector.substring(1)) {
setTimeout(function() { setTimeout(function() {
setVisible(selector, bool); setVisible(selector, bool);

View file

@ -26,8 +26,8 @@
<a class="brand" href="index.html">CyTube</a> <a class="brand" href="index.html">CyTube</a>
<ul class="nav"> <ul class="nav">
<li class="active"><a href="index.html">Home</a></li> <li class="active"><a href="index.html">Home</a></li>
<li><a href="help.html">Help</a></li> <li><a href="https://github.com/calzoneman/sync/wiki/Beginner%27s-Guide-and-FAQ" target="_blank">Help</a></li>
<li><a href="account.html">Account</a></li> <li><a href="account.html" target="_blank">Account</a></li>
<li><a href="javascript:void(0)" id="optlink">Options</a></li> <li><a href="javascript:void(0)" id="optlink">Options</a></li>
<li><a href="javascript:void(0)" id="chatonly">Chat Only</a></li> <li><a href="javascript:void(0)" id="chatonly">Chat Only</a></li>
</ul> </ul>
@ -200,10 +200,10 @@
<script src="./assets/js/data.js"></script> <script src="./assets/js/data.js"></script>
<script src="./assets/js/iourl.js"></script> <script src="./assets/js/iourl.js"></script>
<script src="./assets/js/player.js"></script> <script src="./assets/js/player.js"></script>
<script src="./assets/js/notwebsocket.js"></script>
<script src="./assets/js/util.js"></script> <script src="./assets/js/util.js"></script>
<script src="./assets/js/ui.js"></script> <script src="./assets/js/ui.js"></script>
<script src="./assets/js/callbacks.js"></script> <script src="./assets/js/callbacks.js"></script>
<script src="./assets/js/notwebsocket.js"></script>
<!-- APIs --> <!-- APIs -->
<script src="http://api.dmcdn.net/all.js"></script> <script src="http://api.dmcdn.net/all.js"></script>
<script src="http://jwpsrv.com/library/QouFCLBMEeKC+CIACpYGxA.js"></script> <script src="http://jwpsrv.com/library/QouFCLBMEeKC+CIACpYGxA.js"></script>

View file

@ -31,7 +31,7 @@
<div class=""> <div class="">
<ul class="nav"> <ul class="nav">
<li class="active"><a href="index.html">Home</a></li> <li class="active"><a href="index.html">Home</a></li>
<li><a href="help.html">Help</a></li> <li><a href="https://github.com/calzoneman/sync/wiki/Beginner%27s-Guide-and-FAQ" target="_blank">Help</a></li>
<li><a href="account.html">Account</a></li> <li><a href="account.html">Account</a></li>
<li><a href="javascript:void(0)" id="optlink">Options</a></li> <li><a href="javascript:void(0)" id="optlink">Options</a></li>
</ul> </ul>