mirror of https://github.com/calzoneman/sync.git
Fix some login race conditions/issues
This commit is contained in:
parent
c3035ca368
commit
574ef4435c
|
@ -440,30 +440,86 @@ Channel.prototype.getIPRank = function (ip, callback) {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a user attempts to join a channel.
|
||||||
|
* Handles password check
|
||||||
|
*/
|
||||||
|
Channel.prototype.preJoin = function (user, password) {
|
||||||
|
var self = this;
|
||||||
|
self.whenReady(function () {
|
||||||
|
user.whenLoggedIn(function () {
|
||||||
|
self.getRank(user.name, function (err, rank) {
|
||||||
|
if (err) {
|
||||||
|
user.rank = user.global_rank;
|
||||||
|
} else {
|
||||||
|
user.rank = Math.max(rank, user.global_rank);
|
||||||
|
}
|
||||||
|
|
||||||
|
user.socket.emit("rank", user.rank);
|
||||||
|
user.emit("channelRank", user.rank);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
if (self.opts.password !== false && user.rank < 2) {
|
||||||
|
if (password !== self.opts.password) {
|
||||||
|
var checkPassword = function (pw) {
|
||||||
|
if (self.dead) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pw !== self.opts.password) {
|
||||||
|
user.socket.emit("needPassword", true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
user.socket.listeners("channelPassword").splice(
|
||||||
|
user.socket.listeners("channelPassword").indexOf(checkPassword)
|
||||||
|
);
|
||||||
|
|
||||||
|
user.socket.emit("cancelNeedPassword");
|
||||||
|
self.join(user);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
user.socket.on("channelPassword", checkPassword);
|
||||||
|
user.socket.emit("needPassword", typeof password !== "undefined");
|
||||||
|
user.once("channelRank", function (r) {
|
||||||
|
if (!user.inChannel() && !self.dead && r >= 2) {
|
||||||
|
user.socket.emit("cancelNeedPassword");
|
||||||
|
self.join(user);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.join(user);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when a user joins a channel
|
* Called when a user joins a channel
|
||||||
*/
|
*/
|
||||||
Channel.prototype.join = function (user, password) {
|
Channel.prototype.join = function (user) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
user.whenLoggedIn(function () {
|
var afterLogin = function () {
|
||||||
self.getRank(user.name, function (err, rank) {
|
|
||||||
if (err) {
|
|
||||||
user.rank = user.global_rank;
|
|
||||||
} else {
|
|
||||||
user.rank = Math.max(rank, user.global_rank);
|
|
||||||
}
|
|
||||||
|
|
||||||
user.socket.emit("rank", user.rank);
|
|
||||||
user.emit("channelRank", user.rank);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
var afterIPBanCheck = function () {
|
|
||||||
if (self.dead) {
|
if (self.dead) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var lname = user.name.toLowerCase();
|
||||||
|
for (var i = 0; i < self.users.length; i++) {
|
||||||
|
if (self.users[i].name.toLowerCase() === lname && self.users[i] !== user) {
|
||||||
|
self.users[i].kick("Duplicate login");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.sendUserJoin(self.users, user);
|
||||||
|
self.sendUserlist([user]);
|
||||||
|
};
|
||||||
|
|
||||||
|
var afterIPBan = function () {
|
||||||
user.autoAFK();
|
user.autoAFK();
|
||||||
user.socket.join(self.uniqueName);
|
user.socket.join(self.uniqueName);
|
||||||
user.channel = self;
|
user.channel = self;
|
||||||
|
@ -498,44 +554,13 @@ Channel.prototype.join = function (user, password) {
|
||||||
Logger.syslog.log(user.ip + " joined channel " + self.name);
|
Logger.syslog.log(user.ip + " joined channel " + self.name);
|
||||||
};
|
};
|
||||||
|
|
||||||
var afterLogin = function () {
|
db.channels.isIPBanned(self.name, user.ip, function (err, banned) {
|
||||||
if (self.dead) {
|
if (!err && banned) {
|
||||||
|
user.kick("You're banned!");
|
||||||
return;
|
return;
|
||||||
|
} else {
|
||||||
|
afterIPBan();
|
||||||
}
|
}
|
||||||
|
|
||||||
var lname = user.name.toLowerCase();
|
|
||||||
for (var i = 0; i < self.users.length; i++) {
|
|
||||||
if (self.users[i].name.toLowerCase() === lname && self.users[i] !== user) {
|
|
||||||
self.users[i].kick("Duplicate login");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
self.sendUserJoin(self.users, user);
|
|
||||||
self.sendUserlist([user]);
|
|
||||||
};
|
|
||||||
|
|
||||||
self.whenReady(function () {
|
|
||||||
if (self.opts.password !== false && user.rank < 2) {
|
|
||||||
if (password !== self.opts.password) {
|
|
||||||
user.socket.emit("needPassword", typeof password !== "undefined");
|
|
||||||
user.once("channelRank", function (r) {
|
|
||||||
if (r >= 2) {
|
|
||||||
self.join(user);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
user.socket.emit("cancelNeedPassword");
|
|
||||||
db.channels.isIPBanned(self.name, user.ip, function (err, banned) {
|
|
||||||
if (!err && banned) {
|
|
||||||
user.kick("You're banned!");
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
afterIPBanCheck();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -175,7 +175,7 @@ User.prototype.initChannelCallbacks = function () {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
self.socket.on("joinChannel", typecheck("object", {}, function (data) {
|
self.socket.once("joinChannel", typecheck("object", {}, function (data) {
|
||||||
if (self.inChannel()) {
|
if (self.inChannel()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -195,7 +195,7 @@ User.prototype.initChannelCallbacks = function () {
|
||||||
|
|
||||||
data.name = data.name.toLowerCase();
|
data.name = data.name.toLowerCase();
|
||||||
var chan = Server.getServer().getChannel(data.name);
|
var chan = Server.getServer().getChannel(data.name);
|
||||||
chan.join(self, data.pw);
|
chan.preJoin(self, data.pw);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
wrapTypecheck("assignLeader", function (data) {
|
wrapTypecheck("assignLeader", function (data) {
|
||||||
|
|
|
@ -138,10 +138,7 @@ Callbacks = {
|
||||||
var parent = chatDialog(div);
|
var parent = chatDialog(div);
|
||||||
parent.attr("id", "needpw");
|
parent.attr("id", "needpw");
|
||||||
var sendpw = function () {
|
var sendpw = function () {
|
||||||
socket.emit("joinChannel", {
|
socket.emit("channelPassword", pwbox.val());
|
||||||
name: CHANNEL.name,
|
|
||||||
pw: pwbox.val()
|
|
||||||
});
|
|
||||||
parent.remove();
|
parent.remove();
|
||||||
};
|
};
|
||||||
submit.click(sendpw);
|
submit.click(sendpw);
|
||||||
|
|
|
@ -1354,7 +1354,8 @@ function addChatMessage(data) {
|
||||||
/* layouts */
|
/* layouts */
|
||||||
|
|
||||||
function fluidLayout() {
|
function fluidLayout() {
|
||||||
$(".container").css("max-width", "100%");
|
$(".container").removeClass("container").addClass("container-fluid");
|
||||||
|
// TODO resize
|
||||||
}
|
}
|
||||||
|
|
||||||
function synchtubeLayout() {
|
function synchtubeLayout() {
|
||||||
|
@ -1547,7 +1548,11 @@ function unhidePlayer() {
|
||||||
|
|
||||||
function chatDialog(div) {
|
function chatDialog(div) {
|
||||||
var parent = $("<div/>").addClass("profile-box")
|
var parent = $("<div/>").addClass("profile-box")
|
||||||
.css("padding", "10px")
|
.css({
|
||||||
|
padding: "10px",
|
||||||
|
"z-index": "auto",
|
||||||
|
position: "absolute"
|
||||||
|
})
|
||||||
.appendTo($("body"));
|
.appendTo($("body"));
|
||||||
|
|
||||||
div.appendTo(parent);
|
div.appendTo(parent);
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
.container-fluid {
|
||||||
|
padding-left: 15px;
|
||||||
|
padding-right: 15px;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
#loginform > .form-group {
|
#loginform > .form-group {
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue