diff --git a/src/java/com/threerings/presents/server/Authenticator.java b/src/java/com/threerings/presents/server/Authenticator.java index a4a09827f..aedc7ffb9 100644 --- a/src/java/com/threerings/presents/server/Authenticator.java +++ b/src/java/com/threerings/presents/server/Authenticator.java @@ -1,26 +1,64 @@ // -// $Id: Authenticator.java,v 1.3 2001/10/11 04:07:53 mdb Exp $ +// $Id: Authenticator.java,v 1.4 2002/03/05 03:19:18 mdb Exp $ package com.threerings.presents.server.net; -import com.threerings.presents.net.AuthRequest; import com.threerings.presents.net.AuthResponse; +import com.threerings.presents.net.AuthResponseData; /** * The authenticator is a pluggable component of the authentication - * framework. It is provided with an auth request object and is expected - * to return an auth response object indicating whether or not the client - * is authenticated. authenticate() is invoked on the authmgr - * thread which means that it can access databases or other external - * (slow) information sources without concern for unduly blocking the - * normal operation of the server. Of course, authentication requests are - * processed serially, so they shouldn't take too long. + * framework. The base class handles the basic mechanics of authentication + * and a system would extend the base authenticator and add code that does + * the actual client authentication. */ -public interface Authenticator +public abstract class Authenticator { /** - * Requests that the authenticator process the supplied request and - * provide a response object indicating success or failure. + * Called by the connection manager to give us a reference to it for + * reporting authenticated connections. */ - public AuthResponse process (AuthRequest request); + public void setConnectionManager (ConnectionManager conmgr) + { + _conmgr = conmgr; + } + + /** + * Called by the connection management code when an authenticating + * connection has received its authentication request from the client. + * This method must return immediately as it is called on the + * connection manager thread. If it is possible to authenticate the + * connection immediately, it may do so, but more likely it will fire + * off a task on the {@link PresentsServer#invoker} to perform the + * authentication. When the authentication is complete, the + * authenticator implementation should call {@link + * #connectionWasAuthenticated}. + */ + public abstract void authenticateConnection (AuthingConnection conn); + + /** + * This is called by authenticator implementations when they have + * completed the authentication process. It will deliver the response + * to the user and let the connection manager know to report the + * authentication if it succeeded. + */ + protected void connectionWasAuthenticated ( + AuthingConnection conn, AuthResponse rsp) + { + // now ship the response back + conn.postMessage(rsp); + + // stuff a reference to the auth response into the connection so + // that we have access to it later in the authentication process + conn.setAuthResponse(rsp); + + // if the authentication request was granted, let the connection + // manager know that we just authed + if (AuthResponseData.SUCCESS.equals(rsp.getData().code)) { + _conmgr.connectionDidAuthenticate(conn); + } + } + + /** The connection manager with which we're working. */ + protected ConnectionManager _conmgr; } diff --git a/src/java/com/threerings/presents/server/DummyAuthenticator.java b/src/java/com/threerings/presents/server/DummyAuthenticator.java index ae22cb37f..d88880962 100644 --- a/src/java/com/threerings/presents/server/DummyAuthenticator.java +++ b/src/java/com/threerings/presents/server/DummyAuthenticator.java @@ -1,22 +1,28 @@ // -// $Id: DummyAuthenticator.java,v 1.4 2001/10/11 04:07:53 mdb Exp $ +// $Id: DummyAuthenticator.java,v 1.5 2002/03/05 03:19:18 mdb Exp $ package com.threerings.presents.server; import com.threerings.presents.Log; -import com.threerings.presents.net.*; +import com.threerings.presents.net.AuthResponse; +import com.threerings.presents.net.AuthResponseData; import com.threerings.presents.server.net.Authenticator; +import com.threerings.presents.server.net.AuthingConnection; -public class DummyAuthenticator implements Authenticator +/** + * A simple authenticator implementation that simply accepts all + * authentication requests. + */ +public class DummyAuthenticator extends Authenticator { /** - * We just accept all authentication requests. + * Accept all authentication requests. */ - public AuthResponse process (AuthRequest req) + public void authenticateConnection (AuthingConnection conn) { - Log.info("Accepting request: " + req); + Log.info("Accepting request: " + conn.getAuthRequest()); AuthResponseData rdata = new AuthResponseData(); rdata.code = AuthResponseData.SUCCESS; - return new AuthResponse(rdata); + connectionWasAuthenticated(conn, new AuthResponse(rdata)); } } diff --git a/src/java/com/threerings/presents/server/PresentsServer.java b/src/java/com/threerings/presents/server/PresentsServer.java index ad54572d4..51417023a 100644 --- a/src/java/com/threerings/presents/server/PresentsServer.java +++ b/src/java/com/threerings/presents/server/PresentsServer.java @@ -1,5 +1,5 @@ // -// $Id: PresentsServer.java,v 1.17 2002/02/09 07:49:41 mdb Exp $ +// $Id: PresentsServer.java,v 1.18 2002/03/05 03:19:18 mdb Exp $ package com.threerings.presents.server; @@ -7,8 +7,8 @@ import com.samskivert.util.Config; import com.threerings.presents.Log; import com.threerings.presents.dobj.DObjectManager; -import com.threerings.presents.server.net.AuthManager; import com.threerings.presents.server.net.ConnectionManager; +import com.threerings.presents.util.Invoker; /** * The presents server provides a central point of access to the various @@ -28,9 +28,6 @@ public class PresentsServer /** The server configuration. */ public static Config config; - /** The authentication manager. */ - public static AuthManager authmgr; - /** The manager of network connections. */ public static ConnectionManager conmgr; @@ -43,6 +40,11 @@ public class PresentsServer /** The invocation manager. */ public static InvocationManager invmgr; + /** This is used to invoke background tasks that should not be allowed + * to tie up the distributed object manager thread. This is generally + * used to talk to databases and other (relatively) slow entities. */ + public static Invoker invoker; + /** * Initializes all of the server services and prepares for operation. */ @@ -54,14 +56,20 @@ public class PresentsServer // bind the presents server config into the namespace config.bindProperties(CONFIG_KEY, CONFIG_PATH, true); - // create our authentication manager - authmgr = new AuthManager(new DummyAuthenticator()); - // create our connection manager - conmgr = new ConnectionManager(config, authmgr); - // create our client manager - clmgr = new ClientManager(conmgr); // create our distributed object manager omgr = new PresentsDObjectMgr(); + + // create and start up our invoker + invoker = new Invoker(omgr); + invoker.start(); + + // create our connection manager + conmgr = new ConnectionManager(config); + conmgr.setAuthenticator(new DummyAuthenticator()); + + // create our client manager + clmgr = new ClientManager(conmgr); + // create our invocation manager invmgr = new InvocationManager(omgr); @@ -123,8 +131,6 @@ public class PresentsServer */ public void run () { - // start up the auth manager - authmgr.start(); // start up the connection manager conmgr.start(); // invoke the dobjmgr event loop @@ -137,7 +143,6 @@ public class PresentsServer public static void shutdown () { // shut down our managers - authmgr.shutdown(); conmgr.shutdown(); omgr.shutdown(); } diff --git a/src/java/com/threerings/presents/server/net/AuthManager.java b/src/java/com/threerings/presents/server/net/AuthManager.java deleted file mode 100644 index 3cd75e099..000000000 --- a/src/java/com/threerings/presents/server/net/AuthManager.java +++ /dev/null @@ -1,115 +0,0 @@ -// -// $Id: AuthManager.java,v 1.8 2001/12/04 07:32:10 mdb Exp $ - -package com.threerings.presents.server.net; - -import com.samskivert.util.LoopingThread; -import com.samskivert.util.Queue; - -import com.threerings.presents.Log; -import com.threerings.presents.net.AuthRequest; -import com.threerings.presents.net.AuthResponse; -import com.threerings.presents.net.AuthResponseData; - -/** - * The authentication manager takes care of the authentication process. - * Authentication happens on multiple threads. The conmgr thread parses - * the authentication request and passes it on to the authmgr thread. The - * authmgr thread invokes the (pluggable) authenticator to do the actual - * authentication. Then the response message is queued up to be delivered - * by the conmgr thread. - * - *

This structure prevents authentication to take place - * asynchronously, but in a controlled manner. Only one authentication - * will be processed at a time, but the dobj and conmgr threads will - * continue to operate independent of the authentication process. - */ -public class AuthManager extends LoopingThread -{ - /** - * Constructs an auth manager which will use the specified - * authenticator to authorize logon requests. - */ - public AuthManager (Authenticator author) - { - setAuthenticator(author); - } - - /** - * Specifies the authenticator that should be used by the auth manager - * to authenticate logon requests. - */ - public void setAuthenticator (Authenticator author) - { - _author = author; - } - - /** - * Puts an authenticating connection on the queue. The connection will - * be authenticated and an auth response delivered. - */ - public void postAuthingConnection (AuthingConnection aconn) - { - _authq.append(aconn); - } - - /** - * The connection manager introduces itself to the auth manager so - * that the auth manager can let it know when it has authorized - * connections. - */ - public void setConnectionManager (ConnectionManager conmgr) - { - _conmgr = conmgr; - } - - /** - * Process auth requests. - */ - protected void iterate () - { - // grab the next authing connection from the queue - Object item = _authq.get(); - - // if we're being kicked and requested to exit, we'll just post - // some bogus item on the queue to wake up the auth manager and - // get him the hell out of dodge - if (!(item instanceof AuthingConnection)) { - return; - } - - AuthingConnection aconn = (AuthingConnection)item; - try { - // instruct the authenticator to process the auth request - AuthResponse rsp = _author.process(aconn.getAuthRequest()); - - // now ship the response back - aconn.postMessage(rsp); - - // stuff a reference to the auth response into the connection - // so that we have access to it later in the authentication - // process - aconn.setAuthResponse(rsp); - - // if the authentication request was granted, let the - // connection manager know that we just authed - if (AuthResponseData.SUCCESS.equals(rsp.getData().code)) { - _conmgr.connectionDidAuthenticate(aconn); - } - - } catch (Exception e) { - Log.warning("Failure processing authreq [conn=" + aconn + "]."); - Log.logStackTrace(e); - } - } - - protected void kick () - { - // we post something bogus to the queue to wake up the authmgr - _authq.append(new Integer(0)); - } - - protected Authenticator _author; - protected ConnectionManager _conmgr; - protected Queue _authq = new Queue(); -} diff --git a/src/java/com/threerings/presents/server/net/AuthingConnection.java b/src/java/com/threerings/presents/server/net/AuthingConnection.java index c763c5600..f4a8c447a 100644 --- a/src/java/com/threerings/presents/server/net/AuthingConnection.java +++ b/src/java/com/threerings/presents/server/net/AuthingConnection.java @@ -1,5 +1,5 @@ // -// $Id: AuthingConnection.java,v 1.5 2001/12/03 20:14:51 mdb Exp $ +// $Id: AuthingConnection.java,v 1.6 2002/03/05 03:19:18 mdb Exp $ package com.threerings.presents.server.net; @@ -41,7 +41,7 @@ public class AuthingConnection _authreq = (AuthRequest)msg; // post ourselves for processing by the authmgr - _cmgr.getAuthManager().postAuthingConnection(this); + _cmgr.getAuthenticator().authenticateConnection(this); } catch (ClassCastException cce) { Log.warning("Received non-authreq message during " + diff --git a/src/java/com/threerings/presents/server/net/ConnectionManager.java b/src/java/com/threerings/presents/server/net/ConnectionManager.java index 3a05e0595..c4c8d2fd7 100644 --- a/src/java/com/threerings/presents/server/net/ConnectionManager.java +++ b/src/java/com/threerings/presents/server/net/ConnectionManager.java @@ -1,5 +1,5 @@ // -// $Id: ConnectionManager.java,v 1.14 2001/12/03 20:14:51 mdb Exp $ +// $Id: ConnectionManager.java,v 1.15 2002/03/05 03:19:18 mdb Exp $ package com.threerings.presents.server.net; @@ -34,19 +34,13 @@ public class ConnectionManager extends LoopingThread * * @param config A config object from which the connection manager * will fetch its configuration parameters. - * @param authmgr The authentication manager to use when - * authenticating client connections. */ - public ConnectionManager (Config config, AuthManager authmgr) + public ConnectionManager (Config config) throws IOException { + // the listen port is specified in our configuration _port = config.getValue(CM_PORT_KEY, Client.DEFAULT_SERVER_PORT); - // keep a handle on our authentication manager - _authmgr = authmgr; - // complete the introductions - _authmgr.setConnectionManager(this); - // we use this to wait for activity on our sockets _selset = new SelectSet(); @@ -67,12 +61,22 @@ public class ConnectionManager extends LoopingThread } /** - * Returns a reference to the auth manager being used to authenticate - * connections. + * Specifies the authenticator that should be used by the connection + * manager to authenticate logon requests. */ - public AuthManager getAuthManager () + public void setAuthenticator (Authenticator author) { - return _authmgr; + // say hello to our new authenticator + _author = author; + _author.setConnectionManager(this); + } + + /** + * Returns the entity that is being used to authenticate connections. + */ + public Authenticator getAuthenticator () + { + return _author; } /** @@ -310,7 +314,7 @@ public class ConnectionManager extends LoopingThread } protected int _port; - protected AuthManager _authmgr; + protected Authenticator _author; protected SelectSet _selset; protected NonblockingServerSocket _listener; diff --git a/src/java/com/threerings/whirled/server/WhirledServer.java b/src/java/com/threerings/whirled/server/WhirledServer.java index 05bcccc7d..d8dc6bab8 100644 --- a/src/java/com/threerings/whirled/server/WhirledServer.java +++ b/src/java/com/threerings/whirled/server/WhirledServer.java @@ -1,5 +1,5 @@ // -// $Id: WhirledServer.java,v 1.11 2001/12/16 05:39:16 mdb Exp $ +// $Id: WhirledServer.java,v 1.12 2002/03/05 03:19:18 mdb Exp $ package com.threerings.whirled.server; @@ -7,7 +7,6 @@ import com.samskivert.jdbc.ConnectionProvider; import com.samskivert.jdbc.StaticConnectionProvider; import com.samskivert.util.Config; -import com.threerings.presents.util.Invoker; import com.threerings.crowd.server.CrowdServer; import com.threerings.whirled.Log; @@ -29,9 +28,6 @@ public class WhirledServer extends CrowdServer /** The scene registry. */ public static SceneRegistry screg; - /** A thread on which we can do things like repository lookups. */ - public static Invoker invoker; - /** * Initializes all of the server services and prepares for operation. */ @@ -47,10 +43,6 @@ public class WhirledServer extends CrowdServer // configure the client to use our whirled client clmgr.setClientClass(WhirledClient.class); - // create and start up our invoker - invoker = new Invoker(); - invoker.start(); - // create our connection provider conprov = createConnectionProvider(config);