Made search(*playername) commands correctly return a Player typeclass and not a character. Initial startup/character creation: Default permissions are now assigned on player level rather than character level (this gives more safety to @puppet operations). Made @puppet command work only on Character objects.

This commit is contained in:
Griatch 2010-10-21 18:58:47 +00:00
parent c9861e06de
commit 547eb53b32
8 changed files with 61 additions and 39 deletions

View file

@ -5,7 +5,7 @@ from django.conf import settings
from src.permissions.permissions import has_perm, has_perm_string
from src.objects.models import ObjectDB, ObjAttribute
from game.gamesrc.commands.default.muxcommand import MuxCommand
from src.utils import create
from src.utils import create, utils
class ObjManipCommand(MuxCommand):
"""
@ -1468,16 +1468,20 @@ class CmdExamine(ObjManipCommand):
string += "\n{wAliases{n: %s" % (", ".join(obj.aliases))
if obj.has_player:
string += "\n{wPlayer{n: %s" % obj.player.name
perms = obj.player.permissions
if obj.player.is_superuser:
perms = ["<Superuser>"]
elif not perms:
perms = ["<None>"]
string += "\n{wPlayer Perms/Locks{n: %s" % (", ".join(perms))
string += "\n{wTypeclass{n: %s (%s)" % (obj.typeclass, obj.typeclass_path)
string += "\n{wLocation{n: %s" % obj.location
perms = obj.permissions
if obj.player and obj.player.is_superuser:
perms = ["<Superuser>"]
elif not perms:
perms = ["<None>"]
string += "\n{wPerms/Locks{n: %s" % (", ".join(perms))
if perms:
string += "\n{wObj Perms/Locks{n: %s" % (", ".join(perms))
if not (len(obj.cmdset.all()) == 1 and obj.cmdset.current.key == "Empty"):
string += "\n{wCurrent Cmdset{n:\n\r %s" % obj.cmdset
string += "\n{wCurrent Cmdset (before permission checks){n:\n\r %s" % obj.cmdset
if obj.scripts.all():
string += "\n{wScripts{n:\n\r %s" % obj.scripts
# add the attributes
@ -1663,6 +1667,9 @@ class CmdPuppet(MuxCommand):
new_character = caller.search(self.args)
if not new_character:
return
if not utils.inherits_from(new_character, settings.BASE_CHARACTER_TYPECLASS):
caller.msg("%s is not a Character." % self.args)
return
if player.swap_character(new_character):
new_character.msg("You now control %s." % new_character.name)
else:

View file

@ -6,6 +6,7 @@ exceptions.
import traceback
from django.contrib.auth.models import User
from django.conf import settings
from src.server import sessionhandler
from src.players.models import PlayerDB
from src.scripts.models import ScriptDB
@ -745,49 +746,59 @@ class CmdPerm(MuxCommand):
return
# locate the object/player
obj = caller.search(self.lhs, global_search=True)
obj = caller.search(lhs, global_search=True)
if not obj:
return
pstring = ""
if utils.inherits_from(obj, settings.BASE_PLAYER_TYPECLASS):
pstring = " Player "
if not rhs:
string = "Permission string on {w%s{n: " % obj.key
string = "Permission string on %s{w%s{n: " % (pstring, obj.key)
if not obj.permissions:
string += "<None>"
else:
string += ", ".join(obj.permissions)
if obj.player and obj.player.is_superuser:
if pstring and obj.is_superuser:
string += "\n(... But this player is a SUPERUSER! "
string += "All access checked are passed automatically.)"
elif obj.player and obj.player.is_superuser:
string += "\n(... But this object's player is a SUPERUSER! "
string += "All access checked are passed automatically.)"
caller.msg(string)
return
# we supplied an argument on the form obj = perm
cstring = ""
tstring = ""
if 'del' in switches:
# delete the given permission from object.
try:
index = obj.permissions.index(rhs)
except ValueError:
caller.msg("Permission '%s' was not defined on object." % rhs)
return
permissions = obj.permissions
del permissions[index]
obj.permissions = permissions
caller.msg("Permission '%s' was removed from object %s." % (rhs, obj.name))
obj.msg("%s revokes the permission '%s' from you." % (caller.name, rhs))
# delete the given permission(s) from object.
for perm in self.rhslist:
try:
index = obj.permissions.index(perm)
except ValueError:
cstring += "\nPermission '%s' was not defined on %s%s." % (perm, pstring, lhs)
continue
permissions = obj.permissions
del permissions[index]
obj.permissions = permissions
cstring += "\nPermission '%s' was removed from %s%s." % (perm, pstring, obj.name)
tstring += "\n%s revokes the permission '%s' from you." % (caller.name, perm)
else:
# As an extra check, we warn the user if they customize the
# permission string (which is okay, and is used by the lock system)
permissions = obj.permissions
if rhs in permissions:
string = "Permission '%s' is already defined on %s." % (rhs, obj.name)
else:
permissions.append(rhs)
obj.permissions = permissions
string = "Permission '%s' given to %s." % (rhs, obj.name)
obj.msg("%s granted you the permission '%s'." % (caller.name, rhs))
caller.msg(string)
for perm in self.rhslist:
if perm in permissions:
cstring += "\nPermission '%s' is already defined on %s%s." % (rhs, pstring, obj.name)
else:
permissions.append(perm)
obj.permissions = permissions
cstring += "\nPermission '%s' given to %s%s." % (rhs, pstring, obj.name)
tstring += "\n%s granted you the permission '%s'." % (caller.name, rhs)
caller.msg(cstring.strip())
if tstring:
obj.msg(tstring.strip())

View file

@ -93,7 +93,7 @@ def import_cmdset(python_path, cmdsetobj, emit_to_obj=None, no_logging=False):
cmdsetclass = CACHED_CMDSETS.get(wanted_cache_key, None)
errstring = ""
if not cmdsetclass:
print "cmdset %s not in cache. Reloading." % wanted_cache_key
#print "cmdset %s not in cache. Reloading." % wanted_cache_key
# Not in cache. Reload from disk.
modulepath, classname = python_path.rsplit('.', 1)
module = __import__(modulepath, fromlist=[True])

View file

@ -137,7 +137,7 @@ class ObjectManager(TypedObjectManager):
A player<->user is a one-to-relationship, so this always
returns just one result or None.
user - mayb be a user object or user id.
user - may be a user object or user id.
"""
try:
uid = int(user)
@ -281,7 +281,7 @@ class ObjectManager(TypedObjectManager):
player_string = ostring.lstrip("*")
player_match = self.get_object_with_player(player_string)
if player_match is not None:
return [player_match]
return [player_match.player]
# find suitable objects

View file

@ -414,6 +414,8 @@ class ObjectDB(TypedObject):
ostring: (str) The string to match object names against.
Obs - To find a player, append * to the
start of ostring.
global_search: Search all objects, not just the current
location/inventory
attribute_name: (string) Which attribute to match
(if None, uses default 'name')
use_nicks : Use nickname replace (off by default)

View file

@ -38,6 +38,7 @@ PERMS = [
'examine',
'typeclass',
'debug',
'puppet',
'batchcommands',
'batchcodes',
@ -89,6 +90,7 @@ GROUPS = {
'perm',
'batchcommands',
'batchcodes',
'puppet',
'wall',
'boot',

View file

@ -434,6 +434,6 @@ def create_player(name, email, password,
new_character = create_object(typeclass, name,
location, home,
player=new_player)
set_perm(new_character, permissions)
#set_perm(new_character, permissions)
return new_character
return new_player

View file

@ -286,7 +286,7 @@ def validate_email_address(emailaddress):
def inherits_from(obj, parent):
"""
Takes an object and tries to determine if it inherits
Takes an object and tries to determine if it inherits at any distance
from parent. What differs this function from e.g. isinstance()
is that obj may be both an instance and a class, and parent
may be an instance, a class, or the python path to a class (counting