Fixes, rate limiting

This commit is contained in:
calzoneman 2013-06-04 18:22:05 -04:00
parent cfc866400c
commit 2c57d2a8f2
5 changed files with 44 additions and 14 deletions

View File

@ -14,6 +14,23 @@ var NotWebsocket = function() {
this.handlers = {}; this.handlers = {};
this.room = ""; this.room = "";
this.lastpoll = Date.now(); this.lastpoll = Date.now();
this.noflood = {};
}
NotWebsocket.prototype.checkFlood = function(id, rate) {
if(id in this.noflood) {
this.noflood[id].push(Date.now());
}
else {
this.noflood[id] = [Date.now()];
}
if(this.noflood[id].length > 10) {
this.noflood[id].shift();
var hz = 10000 / (this.noflood[id][9] - this.noflood[id][0]);
if(hz > rate) {
throw "Rate is too high: " + id;
}
}
} }
NotWebsocket.prototype.emit = function(msg, data) { NotWebsocket.prototype.emit = function(msg, data) {
@ -22,6 +39,7 @@ NotWebsocket.prototype.emit = function(msg, data) {
} }
NotWebsocket.prototype.poll = function() { NotWebsocket.prototype.poll = function() {
this.checkFlood("poll", 100);
this.lastpoll = Date.now(); this.lastpoll = Date.now();
var q = []; var q = [];
for(var i = 0; i < this.pktqueue.length; i++) { for(var i = 0; i < this.pktqueue.length; i++) {
@ -38,6 +56,7 @@ NotWebsocket.prototype.on = function(msg, callback) {
} }
NotWebsocket.prototype.recv = function(urlstr) { NotWebsocket.prototype.recv = function(urlstr) {
this.checkFlood("recv", 100);
var msg, data; var msg, data;
try { try {
var js = JSON.parse(urlstr); var js = JSON.parse(urlstr);
@ -115,6 +134,7 @@ function msgReceived(req, res) {
if(h in clients && clients[h] != null) { if(h in clients && clients[h] != null) {
var str = req.params.str; var str = req.params.str;
res.callback = req.query.callback; res.callback = req.query.callback;
try {
if(str == "poll") { if(str == "poll") {
sendJSON(res, clients[h].poll()); sendJSON(res, clients[h].poll());
} }
@ -123,6 +143,10 @@ function msgReceived(req, res) {
sendJSON(res, ""); sendJSON(res, "");
} }
} }
catch(e) {
res.send(429); // 429 Too Many Requests
}
}
else { else {
res.send(404); res.send(404);
} }

View File

@ -846,3 +846,9 @@ $.getScript(IO_URL+"/socket.io/socket.io.js", function() {
Callbacks.disconnect(); Callbacks.disconnect();
} }
}); });
window.setupNewSocket = function() {
for(var key in Callbacks) {
socket.on(key, Callbacks[key]);
}
}

View File

@ -1129,6 +1129,9 @@ function saveOpts() {
} }
} }
// To be overridden in callbacks.js
function setupNewSocket() { }
function applyOpts() { function applyOpts() {
$("#usertheme").remove(); $("#usertheme").remove();
if(USEROPTS.theme != "default") { if(USEROPTS.theme != "default") {
@ -1189,22 +1192,18 @@ function applyOpts() {
} }
if(USEROPTS.altsocket) { if(USEROPTS.altsocket) {
if(socket)
socket.disconnect(); socket.disconnect();
socket = new NotWebsocket(); socket = new NotWebsocket();
for(var key in Callbacks) { setupNewSocket();
socket.on(key, Callbacks[key]);
}
} }
// Switch from NotWebsocket => Socket.io // Switch from NotWebsocket => Socket.io
else if(socket && typeof socket.poll !== "undefined") { else if(socket && typeof socket.poll !== "undefined") {
try { try {
socket = io.connect(IO_URL); socket = io.connect(IO_URL);
for(var key in Callbacks) { setupNewSocket();
socket.on(key, Callbacks[key]);
}
} }
catch(e) { catch(e) {
Callbacks.disconnect();
} }
} }
} }

View File

@ -118,3 +118,4 @@ NotWebsocket.prototype.disconnect = function() {
this.reconnect(); this.reconnect();
}.bind(this), this.reconndelay); }.bind(this), this.reconndelay);
} }

View File

@ -310,10 +310,10 @@
<script src="./assets/js/jquery.js"></script> <script src="./assets/js/jquery.js"></script>
<!-- My Javascript --> <!-- My Javascript -->
<script src="./assets/js/iourl.js"></script> <script src="./assets/js/iourl.js"></script>
<script src="./assets/js/notwebsocket.js"></script>
<script src="./assets/js/media.js"></script> <script src="./assets/js/media.js"></script>
<script src="./assets/js/functions.js"></script> <script src="./assets/js/functions.js"></script>
<script src="./assets/js/client.js"></script> <script src="./assets/js/client.js"></script>
<script src="./assets/js/notwebsocket.js"></script>
<script src="./assets/js/callbacks.js"></script> <script src="./assets/js/callbacks.js"></script>
<!-- APIs --> <!-- APIs -->
<script src="http://api.dmcdn.net/all.js"></script> <script src="http://api.dmcdn.net/all.js"></script>