If a client sends more than 100 messages in 10 seconds, give them the
heave ho. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@2960 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: PresentsClient.java,v 1.61 2003/10/25 00:01:04 mdb Exp $
|
// $Id: PresentsClient.java,v 1.62 2004/02/21 00:52:16 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.presents.server;
|
package com.threerings.presents.server;
|
||||||
|
|
||||||
@@ -9,6 +9,7 @@ import java.util.HashMap;
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
import com.samskivert.util.HashIntMap;
|
import com.samskivert.util.HashIntMap;
|
||||||
|
import com.samskivert.util.Throttle;
|
||||||
|
|
||||||
import com.threerings.presents.Log;
|
import com.threerings.presents.Log;
|
||||||
import com.threerings.presents.data.ClientObject;
|
import com.threerings.presents.data.ClientObject;
|
||||||
@@ -395,6 +396,27 @@ public class PresentsClient
|
|||||||
_clobj = null;
|
_clobj = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Queues up a runnable on the object manager thread where we can
|
||||||
|
* safely end the session.
|
||||||
|
*/
|
||||||
|
protected void safeEndSession ()
|
||||||
|
{
|
||||||
|
PresentsServer.omgr.postUnit(new Runnable() {
|
||||||
|
public void run () {
|
||||||
|
if (getClientObject() == null) {
|
||||||
|
// refuse to end the session unless the client is
|
||||||
|
// fully resolved
|
||||||
|
Log.warning("Refusing logoff request from " +
|
||||||
|
"still-resolving client " + this + ".");
|
||||||
|
} else {
|
||||||
|
// end the session in a civilized manner
|
||||||
|
endSession();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is called when the server is shut down in the middle of a
|
* This is called when the server is shut down in the middle of a
|
||||||
* client session. In this circumstance, {@link #endSession} will
|
* client session. In this circumstance, {@link #endSession} will
|
||||||
@@ -639,6 +661,21 @@ public class PresentsClient
|
|||||||
{
|
{
|
||||||
_messagesIn++; // count 'em up!
|
_messagesIn++; // count 'em up!
|
||||||
|
|
||||||
|
// if the client has been getting crazy with the cheeze whiz,
|
||||||
|
// stick a fork in them; the first time through we end our
|
||||||
|
// session, subsequently _throttle is null and we just drop any
|
||||||
|
// messages that come in until we've fully shutdown
|
||||||
|
if (_throttle == null) {
|
||||||
|
Log.info("Dropping message from force-quit client [conn=" + _conn +
|
||||||
|
", msg=" + message + "].");
|
||||||
|
return;
|
||||||
|
} else if (_throttle.throttleOp(message.received)) {
|
||||||
|
Log.warning("Client sent more than 100 messages in 10 seconds, " +
|
||||||
|
"forcing disconnect " + this + ".");
|
||||||
|
safeEndSession();
|
||||||
|
_throttle = null;
|
||||||
|
}
|
||||||
|
|
||||||
// we dispatch to a message dispatcher that is specialized for the
|
// we dispatch to a message dispatcher that is specialized for the
|
||||||
// particular class of message that we received
|
// particular class of message that we received
|
||||||
MessageDispatcher disp = (MessageDispatcher)
|
MessageDispatcher disp = (MessageDispatcher)
|
||||||
@@ -820,22 +857,7 @@ public class PresentsClient
|
|||||||
public void dispatch (final PresentsClient client, UpstreamMessage msg)
|
public void dispatch (final PresentsClient client, UpstreamMessage msg)
|
||||||
{
|
{
|
||||||
Log.debug("Client requested logoff " + client + ".");
|
Log.debug("Client requested logoff " + client + ".");
|
||||||
|
client.safeEndSession();
|
||||||
// queue up a runnable on the object manager thread where we
|
|
||||||
// can safely end the session
|
|
||||||
PresentsServer.omgr.postUnit(new Runnable() {
|
|
||||||
public void run () {
|
|
||||||
if (client.getClientObject() == null) {
|
|
||||||
// refuse to end the session unless the client is
|
|
||||||
// fully resolved
|
|
||||||
Log.warning("Refusing logoff request from " +
|
|
||||||
"still-resolving client " + client + ".");
|
|
||||||
} else {
|
|
||||||
// end the session in a civilized manner
|
|
||||||
client.endSession();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -855,6 +877,10 @@ public class PresentsClient
|
|||||||
* disconnected. */
|
* disconnected. */
|
||||||
protected long _networkStamp;
|
protected long _networkStamp;
|
||||||
|
|
||||||
|
/** Limit the client from sending too many messages too frequently.
|
||||||
|
* 100 messages in 10 seconds and you're audi. */
|
||||||
|
protected Throttle _throttle = new Throttle(100, 10 * 1000L);
|
||||||
|
|
||||||
// keep these for kicks and giggles
|
// keep these for kicks and giggles
|
||||||
protected int _messagesIn;
|
protected int _messagesIn;
|
||||||
protected int _messagesOut;
|
protected int _messagesOut;
|
||||||
|
|||||||
Reference in New Issue
Block a user