Revamping/cleanup of how we handle authentication usernames as well as chained
authenticators and chained session factories. We can share a lot more code this way and the implicit requirement that the default authenticator/factory had to be configured before anyone else configured a chanied author/factory is gone. The other big change is that Credentials doesn't require a username (UsernamePasswordCreds inherits that username so most derived classes don't notice any difference). Instead we require that a canonical authentication username be determined and configured in AuthingConnection during the authentication process. This canonical username is then used to resolve the client session and map everything in the client manager. This is pretty much exactly what was going on before except that we were doing it all in an ad hoc way by jamming a new name into Credentials during the authentication process and also doing jiggery pokery in PresentsSession.assignStartingUsername. That all goes away and/or becomes cleaner and more explicit. This is going to impact some Yohoho jiggery pokery, which I will shortly commit a patch for, but we're going to need to test it. Omelets, eggs, etc. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@5828 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -22,15 +22,20 @@
|
||||
package com.threerings.bureau.client {
|
||||
|
||||
import com.threerings.presents.client.Client;
|
||||
import com.threerings.presents.dobj.DObjectManager;
|
||||
|
||||
import com.threerings.bureau.data.BureauAuthName;
|
||||
import com.threerings.bureau.data.BureauCredentials;
|
||||
import com.threerings.bureau.util.BureauContext;
|
||||
import com.threerings.presents.dobj.DObjectManager;
|
||||
|
||||
/**
|
||||
* Represents a client embedded in a bureau.
|
||||
*/
|
||||
public class BureauClient extends Client
|
||||
{
|
||||
// statically reference classes we require
|
||||
BureauAuthName
|
||||
|
||||
/**
|
||||
* Creates a new client.
|
||||
* @param creds the credentials supplied during connection
|
||||
@@ -40,9 +45,7 @@ public class BureauClient extends Client
|
||||
{
|
||||
super(null);
|
||||
_bureauId = bureauId;
|
||||
var creds :BureauCredentials = new BureauCredentials(_bureauId);
|
||||
creds.sessionToken = token;
|
||||
_creds = creds;
|
||||
_creds = new BureauCredentials(_bureauId, token);
|
||||
_ctx = createContext();
|
||||
_director = createDirector();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
//
|
||||
// $Id$
|
||||
//
|
||||
// Narya library - tools for developing networked games
|
||||
// Copyright (C) 2002-2009 Three Rings Design, Inc., All Rights Reserved
|
||||
// http://www.threerings.net/code/narya/
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or modify it
|
||||
// under the terms of the GNU Lesser General Public License as published
|
||||
// by the Free Software Foundation; either version 2.1 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
package com.threerings.bureau.data {
|
||||
|
||||
import com.threerings.util.Name;
|
||||
|
||||
/**
|
||||
* Represents an authenticated bureau client.
|
||||
*/
|
||||
public class BureauAuthName extends Name
|
||||
{
|
||||
public function BureauAuthName (bureauId :String = "")
|
||||
{
|
||||
super(bureauId);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -21,59 +21,19 @@
|
||||
|
||||
package com.threerings.bureau.data {
|
||||
|
||||
import com.threerings.presents.net.Credentials;
|
||||
import com.threerings.util.Name;
|
||||
import com.threerings.io.ObjectInputStream;
|
||||
import com.threerings.io.ObjectOutputStream;
|
||||
import com.threerings.util.StringBuilder;
|
||||
import com.threerings.presents.net.ServiceCreds;
|
||||
|
||||
/**
|
||||
* Extends the basic credentials to provide bureau-specific fields.
|
||||
*/
|
||||
public class BureauCredentials extends Credentials
|
||||
public class BureauCredentials extends ServiceCreds
|
||||
{
|
||||
/**
|
||||
* The token to pass to the server when logging in. This is usually just passed to the bureau
|
||||
* on the command line to guard against outside connections being established.
|
||||
*/
|
||||
public var sessionToken :String;
|
||||
|
||||
/**
|
||||
* The id of the bureau logging in.
|
||||
*/
|
||||
public var bureauId :String;
|
||||
|
||||
/**
|
||||
* Creates new credentials for a specific bureau.
|
||||
*/
|
||||
public function BureauCredentials (bureauId :String)
|
||||
public function BureauCredentials (bureauId :String = null, sharedSecret :String = null)
|
||||
{
|
||||
super(new Name("@@bureau:" + bureauId + "@@"));
|
||||
this.bureauId = bureauId;
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
override protected function toStringBuf (buf :StringBuilder) :void
|
||||
{
|
||||
super.toStringBuf(buf);
|
||||
buf.append(" bureauId=").append(bureauId).
|
||||
append(" token=").append(sessionToken);
|
||||
}
|
||||
|
||||
// from interface Streamable
|
||||
override public function readObject (ins :ObjectInputStream) :void
|
||||
{
|
||||
super.readObject(ins);
|
||||
sessionToken = (ins.readField(String) as String);
|
||||
bureauId = (ins.readField(String) as String);
|
||||
}
|
||||
|
||||
// from interface Streamable
|
||||
override public function writeObject (out :ObjectOutputStream) :void
|
||||
{
|
||||
super.writeObject(out);
|
||||
out.writeField(sessionToken);
|
||||
out.writeField(bureauId);
|
||||
super(bureauId, sharedSecret);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,9 +21,6 @@
|
||||
|
||||
package com.threerings.presents.net {
|
||||
|
||||
import com.threerings.util.Name;
|
||||
import com.threerings.util.StringBuilder;
|
||||
|
||||
import com.threerings.io.ObjectInputStream;
|
||||
import com.threerings.io.ObjectOutputStream;
|
||||
import com.threerings.io.Streamable;
|
||||
@@ -31,49 +28,22 @@ import com.threerings.io.Streamable;
|
||||
public /* abstract */ class Credentials
|
||||
implements Streamable
|
||||
{
|
||||
public function Credentials (username :Name)
|
||||
public function Credentials ()
|
||||
{
|
||||
_username = username;
|
||||
}
|
||||
|
||||
public function getUsername () :Name
|
||||
{
|
||||
return _username;
|
||||
}
|
||||
|
||||
public function setUsername (name :Name) :void
|
||||
{
|
||||
_username = name;
|
||||
}
|
||||
|
||||
// documentation inherited from interface Streamable
|
||||
// from interface Streamable
|
||||
public function writeObject (out :ObjectOutputStream) :void
|
||||
//throws IOError
|
||||
{
|
||||
out.writeObject(_username);
|
||||
// nada
|
||||
}
|
||||
|
||||
// documentation inherited from interface Streamable
|
||||
// from interface Streamable
|
||||
public function readObject (ins :ObjectInputStream) :void
|
||||
//throws IOError
|
||||
{
|
||||
_username = Name(ins.readObject());
|
||||
// nada
|
||||
}
|
||||
|
||||
public function toString () :String
|
||||
{
|
||||
var buf :StringBuilder = new StringBuilder("[");
|
||||
toStringBuf(buf);
|
||||
buf.append("]");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
protected function toStringBuf (buf :StringBuilder) :void
|
||||
{
|
||||
buf.append("username=", _username);
|
||||
}
|
||||
|
||||
/** The username. */
|
||||
protected var _username :Name;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
//
|
||||
// $Id$
|
||||
//
|
||||
// Narya library - tools for developing networked games
|
||||
// Copyright (C) 2002-2009 Three Rings Design, Inc., All Rights Reserved
|
||||
// http://www.threerings.net/code/narya/
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or modify it
|
||||
// under the terms of the GNU Lesser General Public License as published
|
||||
// by the Free Software Foundation; either version 2.1 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
package com.threerings.presents.net {
|
||||
|
||||
import com.adobe.crypto.MD5;
|
||||
|
||||
import com.threerings.io.ObjectInputStream;
|
||||
import com.threerings.io.ObjectOutputStream;
|
||||
|
||||
/**
|
||||
* Extends the basic credentials to provide bureau-specific fields.
|
||||
*/
|
||||
public class ServiceCreds extends Credentials
|
||||
{
|
||||
/** The id of the service client that is authenticating. */
|
||||
public var clientId :String;
|
||||
|
||||
/**
|
||||
* Creates credentials for the specified client.
|
||||
*/
|
||||
public function ServiceCreds (clientId :String = null, sharedSecret :String = null)
|
||||
{
|
||||
this.clientId = clientId;
|
||||
_authToken = createAuthToken(clientId, sharedSecret);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates that these credentials were created with the supplied shared secret.
|
||||
*/
|
||||
public function areValid (sharedSecret :String) :Boolean
|
||||
{
|
||||
return createAuthToken(clientId, sharedSecret) == _authToken;
|
||||
}
|
||||
|
||||
// from interface Streamable
|
||||
override public function readObject (ins :ObjectInputStream) :void
|
||||
{
|
||||
super.readObject(ins);
|
||||
clientId = (ins.readField(String) as String);
|
||||
_authToken = (ins.readField(String) as String);
|
||||
}
|
||||
|
||||
// from interface Streamable
|
||||
override public function writeObject (out :ObjectOutputStream) :void
|
||||
{
|
||||
super.writeObject(out);
|
||||
out.writeField(clientId);
|
||||
out.writeField(_authToken);
|
||||
}
|
||||
|
||||
// from Object
|
||||
public function toString () :String
|
||||
{
|
||||
return "[id=" + clientId + ", token=" + _authToken + "]";
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a unique password for the specified node using the supplied shared secret.
|
||||
*/
|
||||
protected static function createAuthToken (clientId :String, sharedSecret :String) :String
|
||||
{
|
||||
return MD5.hash(clientId + sharedSecret);
|
||||
}
|
||||
|
||||
/** A token created by a call to {@link #createAuthToken}. */
|
||||
protected var _authToken :String;
|
||||
}
|
||||
}
|
||||
@@ -32,36 +32,52 @@ public class UsernamePasswordCreds extends Credentials
|
||||
/**
|
||||
* Construct credentials with the supplied username and password.
|
||||
*/
|
||||
public function UsernamePasswordCreds (username :Name, password :String)
|
||||
public function UsernamePasswordCreds (username :Name = null, password :String = null)
|
||||
{
|
||||
super(username);
|
||||
_username = username;
|
||||
_password = password;
|
||||
}
|
||||
|
||||
public function getUsername () :Name
|
||||
{
|
||||
return _username;
|
||||
}
|
||||
|
||||
public function getPassword () :String
|
||||
{
|
||||
return _password;
|
||||
}
|
||||
|
||||
// from Credentials
|
||||
override public function writeObject (out :ObjectOutputStream) :void
|
||||
{
|
||||
super.writeObject(out);
|
||||
out.writeObject(_username);
|
||||
out.writeField(_password);
|
||||
}
|
||||
|
||||
// from Credentials
|
||||
override public function readObject (ins :ObjectInputStream) :void
|
||||
{
|
||||
super.readObject(ins);
|
||||
_username = Name(ins.readObject());
|
||||
_password = (ins.readField(String) as String);
|
||||
}
|
||||
|
||||
// documentation inherited
|
||||
override protected function toStringBuf (buf :StringBuilder) :void
|
||||
// from Object
|
||||
public function toString () :String
|
||||
{
|
||||
super.toStringBuf(buf);
|
||||
var buf :StringBuilder = new StringBuilder("[");
|
||||
toStringBuf(buf);
|
||||
buf.append("]");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
protected function toStringBuf (buf :StringBuilder) :void
|
||||
{
|
||||
buf.append("username=", _username);
|
||||
buf.append(", password=", _password);
|
||||
}
|
||||
|
||||
protected var _username :Name;
|
||||
protected var _password :String;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user