Fixed a bug that caused superuser status to be cached only once for characters, even if the player was not yet connected.

This commit is contained in:
Griatch 2013-03-11 20:01:03 +01:00
parent 29e313492f
commit bbdf2e0896
3 changed files with 17 additions and 15 deletions

View file

@ -136,7 +136,7 @@ class CmdPy(MuxCommand):
""" """
key = "@py" key = "@py"
aliases = ["!"] aliases = ["!"]
locks = "cmd:perm(py) or perm(Immortals)" locks = "cmd:all()"#"cmd:perm(py) or perm(Immortals)"
help_category = "System" help_category = "System"
def func(self): def func(self):

View file

@ -170,20 +170,7 @@ class LockHandler(object):
self.log_obj = None self.log_obj = None
self.reset_flag = False self.reset_flag = False
self._cache_locks(self.obj.lock_storage) self._cache_locks(self.obj.lock_storage)
# we handle bypass checks already here for efficiency. We need to grant access to superusers. self.cache_lock_bypass(obj)
# We need to check both directly on the object (players), through obj.player and using the
# get_player method (this sits on serversessions, in some rare cases where a check is done
# before the login process has yet been fully finalized)
self.lock_bypass = ((hasattr(obj, "is_superuser") and obj.is_superuser)
or (hasattr(obj, "player") and hasattr(obj.player, "is_superuser") and obj.player.is_superuser)
or (hasattr(obj, "get_player") and (not obj.get_player() or obj.get_player().is_superuser)))
if obj.key == "Griatch":
print "SETTING lock_bypass:", obj, self.lock_bypass, "<-",
print (hasattr(obj, "is_superuser") and obj.is_superuser),
print (hasattr(obj, "player") and hasattr(obj.player, "is_superuser") and obj.player.is_superuser),
print (hasattr(obj, "get_player") and (not obj.get_player() or obj.get_player().is_superuser)),
if hasattr(obj, "player"):
print obj.player and obj.player.is_superuser
def __str__(self): def __str__(self):
return ";".join(self.locks[key][2] for key in sorted(self.locks)) return ";".join(self.locks[key][2] for key in sorted(self.locks))
@ -265,6 +252,17 @@ class LockHandler(object):
"Store locks to obj" "Store locks to obj"
self.obj.lock_storage = ";".join([tup[2] for tup in self.locks.values()]) self.obj.lock_storage = ";".join([tup[2] for tup in self.locks.values()])
def cache_lock_bypass(self, obj):
"""
We cache superuser bypass checks here for efficiency. This needs to be re-run when a player is assigned to a character.
We need to grant access to superusers. We need to check both directly on the object (players), through obj.player and using the
get_player method (this sits on serversessions, in some rare cases where a check is done
before the login process has yet been fully finalized)
"""
self.lock_bypass = ((hasattr(obj, "is_superuser") and obj.is_superuser)
or (hasattr(obj, "player") and hasattr(obj.player, "is_superuser") and obj.player.is_superuser)
or (hasattr(obj, "get_player") and (not obj.get_player() or obj.get_player().is_superuser)))
def add(self, lockstring, log_obj=None): def add(self, lockstring, log_obj=None):
""" """
Add a new lockstring on the form '<access_type>:<functions>'. Multiple Add a new lockstring on the form '<access_type>:<functions>'. Multiple

View file

@ -256,6 +256,10 @@ class ObjectDB(TypedObject):
if inherits_from(player, TypeClass): if inherits_from(player, TypeClass):
player = player.dbobj player = player.dbobj
set_field_cache(self, "player", player) set_field_cache(self, "player", player)
# we must set this here or superusers won't be able to
# bypass lockchecks unless they start the game connected
# to the character in question.
self.locks.cache_lock_bypass(self)
#@player.deleter #@player.deleter
def __player_del(self): def __player_del(self):
"Deleter. Allows for del self.player" "Deleter. Allows for del self.player"