From c2ab1725030a384619a7b62b0eaecac752742a68 Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Mon, 16 May 2005 04:51:11 +0000 Subject: [PATCH] Put the basis for the token ring authentication stuff into Narya as we are now using it in Yohoho, Game Gardens and Bang. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3552 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../com/threerings/crowd/data/BodyObject.java | 15 ++- .../com/threerings/crowd/data/TokenRing.java | 94 +++++++++++++++++++ 2 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 src/java/com/threerings/crowd/data/TokenRing.java diff --git a/src/java/com/threerings/crowd/data/BodyObject.java b/src/java/com/threerings/crowd/data/BodyObject.java index 0ea15c4a3..bd3144f13 100644 --- a/src/java/com/threerings/crowd/data/BodyObject.java +++ b/src/java/com/threerings/crowd/data/BodyObject.java @@ -92,13 +92,23 @@ public class BodyObject extends ClientObject public String checkAccess (String feature, Object context) { // our default access control policy; how quaint - if (ChatCodes.CHAT_ACCESS.equals(feature)) { + if (ChatCodes.BROADCAST_ACCESS.equals(feature)) { + return getTokens().isAdmin() ? null : ChatCodes.ACCESS_DENIED; + } else if (ChatCodes.CHAT_ACCESS.equals(feature)) { return null; } else { return InvocationCodes.ACCESS_DENIED; } } + /** + * Returns this user's access control tokens. + */ + public TokenRing getTokens () + { + return EMPTY_TOKENS; + } + // documentation inherited public void applyToListeners (ListenerOp op) { @@ -181,4 +191,7 @@ public class BodyObject extends ClientObject this.awayMessage = value; } // AUTO-GENERATED: METHODS END + + /** The default (no tokens) access control. */ + protected static final TokenRing EMPTY_TOKENS = new TokenRing(); } diff --git a/src/java/com/threerings/crowd/data/TokenRing.java b/src/java/com/threerings/crowd/data/TokenRing.java new file mode 100644 index 000000000..5d62ac8d1 --- /dev/null +++ b/src/java/com/threerings/crowd/data/TokenRing.java @@ -0,0 +1,94 @@ +// +// $Id$ +// +// Narya library - tools for developing networked games +// Copyright (C) 2002-2005 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.crowd.data; + +import com.threerings.io.SimpleStreamableObject; + +/** + * Defines access control tokens that convey certain privileges to users + * (see {@link BodyObject#checkAccess}). + */ +public class TokenRing extends SimpleStreamableObject +{ + /** Indicates that this user is an administrator and can do things + * like broadcast, shutdown the server and whatnot. */ + public static final int ADMIN = (1 << 0); + + /** + * A default constructor, used when unserializing token rings. + */ + public TokenRing () + { + } + + /** + * Constructs a token ring with the supplied set of tokens. + */ + public TokenRing (int tokens) + { + _tokens = tokens; + } + + /** + * Returns true if this token ring contains the specified token. + */ + public boolean holdsToken (int token) + { + return (_tokens & token) != 0; + } + + /** + * Convenience function for checking whether this ring holds the + * {@link #ADMIN} token. + */ + public boolean isAdmin () + { + return holdsToken(ADMIN); + } + + /** + * Returns the bitmask that stores the various tokens. + */ + public int getTokens () + { + return _tokens; + } + + /** + * Adds the specified token to this ring. + */ + public void setToken (int token) + { + _tokens |= token; + } + + /** + * Clears the specified token from this ring. + */ + public void clearToken (int token) + { + _tokens &= ~token; + } + + /** The tokens contained in this ring (composed together bitwise). */ + protected int _tokens; +}