diff --git a/game/gamesrc/commands/default/objmanip.py b/game/gamesrc/commands/default/objmanip.py index 0a0fad6a5..ea2f20fca 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 15b393473..562b32ef8 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 b8483fb9a..763d98a7e 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 7561dd0e6..de56ccc89 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 f37fe2ee3..0f9a1fd58 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 9dd1dff82..42323cea9 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 6975cc2e5..79a02c231 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 48313766b..365e26f1d 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