"""User command functions for the mudpy engine."""
-# Copyright (c) 2004-2019 mudpy authors. Permission to use, copy,
+# Copyright (c) 2004-2020 mudpy authors. Permission to use, copy,
# modify, and distribute this software is granted under terms
# provided in the LICENSE file distributed with this software.
actor.send("Exiting chat mode.")
else:
actor.send("Sorry, but you're already busy with something else!")
+ return True
def create(actor, parameters):
elif len(arguments) > 2:
message = "You can only specify an element and a filename."
actor.send(message)
+ return True
def delete(actor, parameters):
+ '". Try "show element ' +
element + '" for verification.')
actor.send(message)
+ return True
def destroy(actor, parameters):
6
)
actor.send(message)
+ return True
def error(actor, input_data):
"""Generic error for an unrecognized command word."""
# 90% of the time use a generic error
- if random.randrange(10):
+ # Allow the random.randrange() call in bandit since it's not used for
+ # security/cryptographic purposes
+ if random.randrange(10): # nosec
message = '''I'm not sure what "''' + input_data + '''" means...'''
# 10% of the time use the classic diku error
mudpy.misc.log(
'Sending a command error to user %s raised exception...\n%s' % (
actor.owner.account.get("name"), traceback.format_exc()))
+ return True
def halt(actor, parameters):
# set a flag to terminate the world
actor.universe.terminate_flag = True
+ return True
def help(actor, parameters):
description = command.get("description")
if not description:
description = "(no short description provided)"
- if command.get("administrative"):
+ if command.is_restricted():
output = "$(red)"
else:
output = "$(grn)"
if actor.can_run(command):
if really_see_also:
really_see_also += ", "
- if command.get("administrative"):
+ if command.is_restricted():
really_see_also += "$(red)"
else:
really_see_also += "$(grn)"
"description", "(no short description provided)")
# administrative command names are in red, others in green
- if command.get("administrative"):
+ if command.is_restricted():
color = "red"
else:
color = "grn"
# send the accumulated output to the user
actor.send(output)
+ return True
def look(actor, parameters):
actor.send("You can't look at or in anything yet.")
else:
actor.look_at(actor.get("location"))
+ return True
def move(actor, parameters):
actor.move_direction(portal)
return(portal)
actor.send("You cannot go that way.")
+ return True
def preferences(actor, parameters):
message = ""
arguments = parameters.split()
allowed_prefs = set()
+ base_prefs = []
user_config = actor.universe.contents.get("mudpy.user")
if user_config:
- allowed_prefs.update(user_config.get("pref_allow", []))
+ base_prefs = user_config.get("pref_allow", [])
+ allowed_prefs.update(base_prefs)
if actor.owner.account.get("administrator"):
allowed_prefs.update(user_config.get("pref_admin", []))
if not arguments:
message += "These are your current preferences:"
- for pref in allowed_prefs:
- message += ("$(eol) $(red)%s $(grn)%s$(nrm)"
- % (pref, actor.owner.account.get(pref)))
+
+ # color-code base and admin prefs
+ for pref in sorted(allowed_prefs):
+ if pref in base_prefs:
+ color = "grn"
+ else:
+ color = "red"
+ message += ("$(eol) $(%s)%s$(nrm) - %s" % (
+ color, pref, actor.owner.account.get(pref, "<not set>")))
+
elif arguments[0] not in allowed_prefs:
message += (
'Preference "%s" does not exist. Try the `preferences` command by '
"itself for a list of valid preferences." % arguments[0])
elif len(arguments) == 1:
- message += "%s" % actor.owner.account.get(arguments[0])
+ message += "%s" % actor.owner.account.get(arguments[0], "<not set>")
else:
pref = arguments[0]
value = " ".join(arguments[1:])
'Preference "%s" cannot be set to type "%s".' % (
pref, type(value)))
actor.send(message)
+ return True
def quit(actor, parameters):
if actor.owner:
actor.owner.state = "main_utility"
actor.owner.deactivate_avatar()
+ return True
def reload(actor, parameters):
# set a flag to reload
actor.universe.reload_flag = True
+ return True
def say(actor, parameters):
# there was no message
else:
actor.send("What do you want to say?")
+ return True
def c_set(actor, parameters):
+ '". Try "show element ' +
element + '" for verification.')
actor.send(message)
+ return True
def show(actor, parameters):
message = "You need to specify an expression."
else:
try:
- message = repr(eval(" ".join(arguments[1:])))
+ # there is no other option than to use eval() for this, since
+ # its purpose is to evaluate arbitrary expressions, so do what
+ # we can to secure it and allow it for bandit analysis
+ message = repr(eval( # nosec
+ " ".join(arguments[1:]),
+ {"mudpy": mudpy, "universe": actor.universe}))
except Exception as e:
message = ("$(red)Your expression raised an exception...$(eol)"
"$(eol)$(bld)%s$(nrm)" % e)
else:
message = '''I don't know what "''' + parameters + '" is.'
actor.send(message)
+ return True