diff --git a/game/gamesrc/commands/default/objmanip.py b/game/gamesrc/commands/default/objmanip.py index 0a0fad6a52..ea2f20fca0 100644 --- a/game/gamesrc/commands/default/objmanip.py +++ b/game/gamesrc/commands/default/objmanip.py @@ -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 = [""] + elif not perms: + perms = [""] + 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 = [""] - elif not perms: - perms = [""] - 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: diff --git a/game/gamesrc/commands/default/privileged.py b/game/gamesrc/commands/default/privileged.py index 15b3934735..562b32ef81 100644 --- a/game/gamesrc/commands/default/privileged.py +++ b/game/gamesrc/commands/default/privileged.py @@ -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 += "" 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()) diff --git a/src/commands/cmdsethandler.py b/src/commands/cmdsethandler.py index b8483fb9a9..763d98a7e4 100644 --- a/src/commands/cmdsethandler.py +++ b/src/commands/cmdsethandler.py @@ -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]) diff --git a/src/objects/manager.py b/src/objects/manager.py index 7561dd0e6c..de56ccc890 100644 --- a/src/objects/manager.py +++ b/src/objects/manager.py @@ -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 diff --git a/src/objects/models.py b/src/objects/models.py index f37fe2ee33..0f9a1fd58e 100644 --- a/src/objects/models.py +++ b/src/objects/models.py @@ -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) diff --git a/src/permissions/default_permissions.py b/src/permissions/default_permissions.py index 9dd1dff82e..42323cea94 100644 --- a/src/permissions/default_permissions.py +++ b/src/permissions/default_permissions.py @@ -38,6 +38,7 @@ PERMS = [ 'examine', 'typeclass', 'debug', + 'puppet', 'batchcommands', 'batchcodes', @@ -89,6 +90,7 @@ GROUPS = { 'perm', 'batchcommands', 'batchcodes', + 'puppet', 'wall', 'boot', diff --git a/src/utils/create.py b/src/utils/create.py index 6975cc2e5a..79a02c231d 100644 --- a/src/utils/create.py +++ b/src/utils/create.py @@ -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 diff --git a/src/utils/utils.py b/src/utils/utils.py index 48313766b9..365e26f1d3 100644 --- a/src/utils/utils.py +++ b/src/utils/utils.py @@ -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