Provide a mechanism for the authenticator to pass information to the

client object by way of passing the auth response data up to the client
after the completion of the authentication phase. This allows information
loaded by an authenticator (like a user record) to make its way into the
real world.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@722 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Michael Bayne
2001-12-03 20:14:51 +00:00
parent 1c823ae349
commit a0ba41c31d
7 changed files with 83 additions and 61 deletions
@@ -1,9 +1,11 @@
// //
// $Id: CrowdClient.java,v 1.3 2001/10/11 04:07:51 mdb Exp $ // $Id: CrowdClient.java,v 1.4 2001/12/03 20:14:51 mdb Exp $
package com.threerings.crowd.server; package com.threerings.crowd.server;
import com.threerings.presents.net.AuthResponseData;
import com.threerings.presents.server.PresentsClient; import com.threerings.presents.server.PresentsClient;
import com.threerings.crowd.data.BodyObject; import com.threerings.crowd.data.BodyObject;
/** /**
@@ -12,9 +14,9 @@ import com.threerings.crowd.data.BodyObject;
*/ */
public class CrowdClient extends PresentsClient public class CrowdClient extends PresentsClient
{ {
protected void sessionWillStart () protected void sessionWillStart (AuthResponseData rdata)
{ {
super.sessionWillStart(); super.sessionWillStart(rdata);
// cast our client object to a body object // cast our client object to a body object
_bodobj = (BodyObject)_clobj; _bodobj = (BodyObject)_clobj;
@@ -26,9 +28,9 @@ public class CrowdClient extends PresentsClient
CrowdServer.mapBody(_username, _bodobj); CrowdServer.mapBody(_username, _bodobj);
} }
protected void sessionWillResume () protected void sessionWillResume (AuthResponseData rdata)
{ {
super.sessionWillResume(); super.sessionWillResume(rdata);
// nothing to do here presently // nothing to do here presently
} }
@@ -1,5 +1,5 @@
// //
// $Id: ClientManager.java,v 1.11 2001/10/11 04:07:53 mdb Exp $ // $Id: ClientManager.java,v 1.12 2001/12/03 20:14:51 mdb Exp $
package com.threerings.presents.server; package com.threerings.presents.server;
@@ -8,6 +8,8 @@ import java.util.HashMap;
import com.threerings.presents.Log; import com.threerings.presents.Log;
import com.threerings.presents.data.ClientObject; import com.threerings.presents.data.ClientObject;
import com.threerings.presents.net.AuthRequest;
import com.threerings.presents.net.AuthResponse;
import com.threerings.presents.net.Credentials; import com.threerings.presents.net.Credentials;
import com.threerings.presents.server.net.*; import com.threerings.presents.server.net.*;
@@ -83,16 +85,11 @@ public class ClientManager implements ConnectionObserver
return _clobjClass; return _clobjClass;
} }
/** // documentation inherited
* Called when a new connection is established with the connection public synchronized void connectionEstablished (
* manager. Only fully authenticated connections will be passed on to Connection conn, AuthRequest req, AuthResponse rsp)
* the connection observer.
*
* @param conn The newly established connection.
*/
public synchronized
void connectionEstablished (Connection conn, Credentials creds)
{ {
Credentials creds = req.getCredentials();
String username = creds.getUsername(); String username = creds.getUsername();
// see if there's a client already registered with this username // see if there's a client already registered with this username
@@ -101,7 +98,7 @@ public class ClientManager implements ConnectionObserver
if (client != null) { if (client != null) {
Log.info("Session resumed [username=" + username + Log.info("Session resumed [username=" + username +
", conn=" + conn + "]."); ", conn=" + conn + "].");
client.resumeSession(conn); client.resumeSession(conn, rsp.getData());
} else { } else {
Log.info("Session initiated [username=" + username + Log.info("Session initiated [username=" + username +
@@ -109,7 +106,7 @@ public class ClientManager implements ConnectionObserver
// create a new client and stick'em in the table // create a new client and stick'em in the table
try { try {
client = (PresentsClient)_clientClass.newInstance(); client = (PresentsClient)_clientClass.newInstance();
client.startSession(this, username, conn); client.startSession(this, username, conn, rsp.getData());
_usermap.put(username, client); _usermap.put(username, client);
} catch (Exception e) { } catch (Exception e) {
Log.warning("Failed to instantiate client instance to " + Log.warning("Failed to instantiate client instance to " +
@@ -123,15 +120,7 @@ public class ClientManager implements ConnectionObserver
_conmap.put(conn, client); _conmap.put(conn, client);
} }
/** // documentation inherited
* Called if a connection fails for any reason. If a connection fails,
* <code>connectionClosed</code> will not be called. This call to
* <code>connectionFailed</code> is the last the observers will hear
* about it.
*
* @param conn The connection in that failed.
* @param fault The exception associated with the failure.
*/
public synchronized public synchronized
void connectionFailed (Connection conn, IOException fault) void connectionFailed (Connection conn, IOException fault)
{ {
@@ -151,11 +140,7 @@ public class ClientManager implements ConnectionObserver
} }
} }
/** // documentation inherited
* Called when a connection has been closed in an orderly manner.
*
* @param conn The recently closed connection.
*/
public synchronized void connectionClosed (Connection conn) public synchronized void connectionClosed (Connection conn)
{ {
// remove the client from the connection map // remove the client from the connection map
@@ -1,5 +1,5 @@
// //
// $Id: PresentsClient.java,v 1.24 2001/10/24 00:36:40 mdb Exp $ // $Id: PresentsClient.java,v 1.25 2001/12/03 20:14:51 mdb Exp $
package com.threerings.presents.server; package com.threerings.presents.server;
@@ -53,7 +53,8 @@ public class PresentsClient
* connection instance and begins a client session. * connection instance and begins a client session.
*/ */
protected void startSession ( protected void startSession (
ClientManager cmgr, String username, Connection conn) ClientManager cmgr, String username, Connection conn,
final AuthResponseData rdata)
{ {
_cmgr = cmgr; _cmgr = cmgr;
_username = username; _username = username;
@@ -66,7 +67,7 @@ public class PresentsClient
public void objectAvailable (DObject object) public void objectAvailable (DObject object)
{ {
setClientObject((ClientObject)object); setClientObject((ClientObject)object);
sessionWillStart(); sessionWillStart(rdata);
sendBootstrap(); sendBootstrap();
} }
@@ -96,7 +97,8 @@ public class PresentsClient
* authenticates as this already established client. This must only be * authenticates as this already established client. This must only be
* called from the congmr thread. * called from the congmr thread.
*/ */
protected void resumeSession (Connection conn) protected void resumeSession (
Connection conn, final AuthResponseData rdata)
{ {
Connection oldconn = getConnection(); Connection oldconn = getConnection();
@@ -122,7 +124,7 @@ public class PresentsClient
{ {
// now that we're on the dobjmgr thread we can resume our // now that we're on the dobjmgr thread we can resume our
// session resumption // session resumption
finishResumeSession(); finishResumeSession(rdata);
return false; return false;
} }
}; };
@@ -134,10 +136,10 @@ public class PresentsClient
* resumption. We call some call backs and send the bootstrap info to * resumption. We call some call backs and send the bootstrap info to
* the client. * the client.
*/ */
protected void finishResumeSession () protected void finishResumeSession (AuthResponseData rdata)
{ {
// let derived classes do any session resuming // let derived classes do any session resuming
sessionWillResume(); sessionWillResume(rdata);
// send off a bootstrap notification immediately because we've // send off a bootstrap notification immediately because we've
// already got our client object // already got our client object
@@ -237,8 +239,11 @@ public class PresentsClient
* <p><em>Note:</em> This function will be called on the dobjmgr * <p><em>Note:</em> This function will be called on the dobjmgr
* thread which means that object manipulations are OK, but client * thread which means that object manipulations are OK, but client
* instance manipulations must done carefully. * instance manipulations must done carefully.
*
* @param rdata the data object delivered to the client during the
* authentication phase.
*/ */
protected void sessionWillStart () protected void sessionWillStart (AuthResponseData rdata)
{ {
} }
@@ -252,8 +257,11 @@ public class PresentsClient
* <p><em>Note:</em> This function will be called on the dobjmgr * <p><em>Note:</em> This function will be called on the dobjmgr
* thread which means that object manipulations are OK, but client * thread which means that object manipulations are OK, but client
* instance manipulations must done carefully. * instance manipulations must done carefully.
*
* @param rdata the data object delivered to the client during the
* authentication phase.
*/ */
protected void sessionWillResume () protected void sessionWillResume (AuthResponseData rdata)
{ {
} }
@@ -1,5 +1,5 @@
// //
// $Id: AuthManager.java,v 1.5 2001/10/11 04:07:53 mdb Exp $ // $Id: AuthManager.java,v 1.6 2001/12/03 20:14:51 mdb Exp $
package com.threerings.presents.server.net; package com.threerings.presents.server.net;
@@ -72,8 +72,13 @@ public class AuthManager extends LoopingThread
// now ship the response back // now ship the response back
aconn.postMessage(rsp); 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 // if the authentication request was granted, let the
// connection manager know that we just authed a connection // connection manager know that we just authed
_conmgr.connectionDidAuthenticate(aconn); _conmgr.connectionDidAuthenticate(aconn);
} catch (Exception e) { } catch (Exception e) {
@@ -1,5 +1,5 @@
// //
// $Id: AuthingConnection.java,v 1.4 2001/10/11 04:07:53 mdb Exp $ // $Id: AuthingConnection.java,v 1.5 2001/12/03 20:14:51 mdb Exp $
package com.threerings.presents.server.net; package com.threerings.presents.server.net;
@@ -7,8 +7,9 @@ import java.io.IOException;
import ninja2.core.io_core.nbio.NonblockingSocket; import ninja2.core.io_core.nbio.NonblockingSocket;
import com.threerings.presents.Log; import com.threerings.presents.Log;
import com.threerings.presents.net.UpstreamMessage;
import com.threerings.presents.net.AuthRequest; import com.threerings.presents.net.AuthRequest;
import com.threerings.presents.net.AuthResponse;
import com.threerings.presents.net.UpstreamMessage;
/** /**
* The authing connection manages the client connection until * The authing connection manages the client connection until
@@ -58,14 +59,30 @@ public class AuthingConnection
return _authreq; return _authreq;
} }
/**
* Returns the auth response delivered to the client (only valid after
* the auth request has been processed.
*/
public AuthResponse getAuthResponse ()
{
return _authrsp;
}
/**
* Stores a reference to the auth response delivered to this
* connection. This is called by the auth manager after delivering the
* auth response to the client.
*/
public void setAuthResponse (AuthResponse authrsp)
{
_authrsp = authrsp;
}
public String toString () public String toString ()
{ {
return "[mode=AUTHING, addr=" + _socket.getInetAddress() + "]"; return "[mode=AUTHING, addr=" + _socket.getInetAddress() + "]";
} }
protected int _state = AWAITING_AUTH_REQUEST;
protected AuthRequest _authreq; protected AuthRequest _authreq;
protected AuthResponse _authrsp;
protected static final int AWAITING_AUTH_REQUEST = 0;
protected static final int PROCESSING_AUTH_REQUEST = 1;
} }
@@ -1,5 +1,5 @@
// //
// $Id: ConnectionManager.java,v 1.13 2001/10/25 23:37:13 mdb Exp $ // $Id: ConnectionManager.java,v 1.14 2001/12/03 20:14:51 mdb Exp $
package com.threerings.presents.server.net; package com.threerings.presents.server.net;
@@ -14,7 +14,8 @@ import com.threerings.presents.Log;
import com.threerings.presents.client.Client; import com.threerings.presents.client.Client;
import com.threerings.presents.io.FramingOutputStream; import com.threerings.presents.io.FramingOutputStream;
import com.threerings.presents.io.TypedObjectFactory; import com.threerings.presents.io.TypedObjectFactory;
import com.threerings.presents.net.Credentials; import com.threerings.presents.net.AuthRequest;
import com.threerings.presents.net.AuthResponse;
import com.threerings.presents.net.DownstreamMessage; import com.threerings.presents.net.DownstreamMessage;
import com.threerings.presents.server.PresentsServer; import com.threerings.presents.server.PresentsServer;
@@ -104,7 +105,8 @@ public class ConnectionManager extends LoopingThread
* Notifies the connection observers of a connection event. Used * Notifies the connection observers of a connection event. Used
* internally. * internally.
*/ */
protected void notifyObservers (int code, Connection conn, Object arg) protected void notifyObservers (
int code, Connection conn, Object arg1, Object arg2)
{ {
synchronized (_observers) { synchronized (_observers) {
for (int i = 0; i < _observers.size(); i++) { for (int i = 0; i < _observers.size(); i++) {
@@ -112,10 +114,11 @@ public class ConnectionManager extends LoopingThread
(ConnectionObserver)_observers.get(i); (ConnectionObserver)_observers.get(i);
switch (code) { switch (code) {
case CONNECTION_ESTABLISHED: case CONNECTION_ESTABLISHED:
obs.connectionEstablished(conn, (Credentials)arg); obs.connectionEstablished(conn, (AuthRequest)arg1,
(AuthResponse)arg2);
break; break;
case CONNECTION_FAILED: case CONNECTION_FAILED:
obs.connectionFailed(conn, (IOException)arg); obs.connectionFailed(conn, (IOException)arg1);
break; break;
case CONNECTION_CLOSED: case CONNECTION_CLOSED:
obs.connectionClosed(conn); obs.connectionClosed(conn);
@@ -171,7 +174,7 @@ public class ConnectionManager extends LoopingThread
// and let our observers know about our new connection // and let our observers know about our new connection
notifyObservers(CONNECTION_ESTABLISHED, rconn, notifyObservers(CONNECTION_ESTABLISHED, rconn,
conn.getAuthRequest().getCredentials()); conn.getAuthRequest(), conn.getAuthResponse());
} catch (IOException ioe) { } catch (IOException ioe) {
Log.warning("Failure upgrading authing connection to " + Log.warning("Failure upgrading authing connection to " +
@@ -279,7 +282,7 @@ public class ConnectionManager extends LoopingThread
_selset.remove(conn.getSelectItem()); _selset.remove(conn.getSelectItem());
// let our observers know what's up // let our observers know what's up
notifyObservers(CONNECTION_FAILED, conn, ioe); notifyObservers(CONNECTION_FAILED, conn, ioe, null);
} }
/** /**
@@ -293,7 +296,7 @@ public class ConnectionManager extends LoopingThread
_selset.remove(conn.getSelectItem()); _selset.remove(conn.getSelectItem());
// let our observers know what's up // let our observers know what's up
notifyObservers(CONNECTION_CLOSED, conn, null); notifyObservers(CONNECTION_CLOSED, conn, null, null);
} }
/** /**
@@ -1,10 +1,11 @@
// //
// $Id: ConnectionObserver.java,v 1.5 2001/10/11 04:07:53 mdb Exp $ // $Id: ConnectionObserver.java,v 1.6 2001/12/03 20:14:51 mdb Exp $
package com.threerings.presents.server.net; package com.threerings.presents.server.net;
import java.io.IOException; import java.io.IOException;
import com.threerings.presents.net.Credentials; import com.threerings.presents.net.AuthRequest;
import com.threerings.presents.net.AuthResponse;
/** /**
* A connection observer can be registered with the connection manager to * A connection observer can be registered with the connection manager to
@@ -24,10 +25,11 @@ public interface ConnectionObserver
* the connection observer. * the connection observer.
* *
* @param conn The newly established connection. * @param conn The newly established connection.
* @param creds The credentials with which this connection * @param req The auth request provided by the client.
* (successfully) authenticated. * @param rsp The auth response provided to the client.
*/ */
public void connectionEstablished (Connection conn, Credentials creds); public void connectionEstablished (
Connection conn, AuthRequest req, AuthResponse rsp);
/** /**
* Called if a connection fails for any reason. If a connection fails, * Called if a connection fails for any reason. If a connection fails,