X-Git-Url: https://mudpy.org/gitweb?p=mudpy.git;a=blobdiff_plain;f=mudpy%2Fmisc.py;h=074f53855494bfa952200c6c181236d630423e57;hp=2cd7992b9fbe1ec0e0ed677fffdc42bdc426f9ae;hb=8b0085791954dc96a909d49d3611c049a96b5c21;hpb=a657b530f33267e5e1237355db4a79d40c914baf diff --git a/mudpy/misc.py b/mudpy/misc.py index 2cd7992..074f538 100644 --- a/mudpy/misc.py +++ b/mudpy/misc.py @@ -1,6 +1,6 @@ """Miscellaneous 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. @@ -501,8 +501,10 @@ class User: self.output_queue = [] self.partial_input = b"" self.password_tries = 0 + self.rows = 23 self.state = "telopt_negotiation" self.telopts = {} + self.ttype = None self.universe = universe def quit(self): @@ -805,6 +807,13 @@ class User: else: self.check_idle() + # ask the client for their current terminal type (RFC 1091); it's None + # if it's not been initialized, the empty string if it has but the + # output was indeterminate, "UNKNOWN" if the client specified it has no + # terminal types to supply + if self.ttype is None: + mudpy.telnet.request_ttype(self) + # if output is paused, decrement the counter if self.state == "telopt_negotiation": if self.negotiation_pause: @@ -850,7 +859,7 @@ class User: # check for some input try: raw_input = self.connection.recv(1024) - except (BlockingIOError, OSError): + except OSError: raw_input = b"" # we got something @@ -1218,7 +1227,9 @@ def weighted_choice(data): expanded.append(key) # return one at random - return random.choice(expanded) + # Whitelist the random.randrange() call in bandit since it's not used for + # security/cryptographic purposes + return random.choice(expanded) # nosec def random_name(): @@ -1265,7 +1276,9 @@ def random_name(): name = "" # create a name of random length from the syllables - for _syllable in range(random.randrange(2, 6)): + # Whitelist the random.randrange() call in bandit since it's not used for + # security/cryptographic purposes + for _syllable in range(random.randrange(2, 6)): # nosec name += weighted_choice(syllables) # strip any leading quotemark, capitalize and return the name @@ -1432,9 +1445,12 @@ def reload_data(): """Reload all relevant objects.""" universe.save() old_userlist = universe.userlist[:] + old_loglines = universe.loglines[:] for element in list(universe.contents.values()): element.destroy() universe.load() + new_loglines = universe.loglines[:] + universe.loglines = old_loglines + new_loglines for user in old_userlist: user.reload() @@ -1680,13 +1696,6 @@ def get_choice_action(user): def call_hook_function(fname, arglist): """Safely execute named function with supplied arguments, return result.""" - # strip any explicit leader or parameter - # TODO(fungi) remove this once the menu functions transition is complete - if fname.startswith("mudpy."): - fname = fname[6:] - if fname.endswith("(user)"): - fname = fname[:-6] - # all functions relative to mudpy package function = mudpy @@ -1918,33 +1927,14 @@ def handler_active(user): command = find_command(command_name) # if it's allowed, do it - ran = False + result = None if actor.can_run(command): - # dereference the relative object path for the requested function - # TODO(fungi) use call_hook_function() here instead - action = mudpy action_fname = command.get("action", command.key) - for component in action_fname.split("."): - try: - action = getattr(action, component) - ran = True - except AttributeError: - log('Could not find action function "%s" for command "%s"' - % (action_fname, command_name)) - action = None - break - if action: - try: - action(actor, parameters) - except Exception: - log('Command string "%s" from user %s raised an ' - 'exception...\n%s' % ( - input_data, actor.owner.account.get("name"), - traceback.format_exc())) - mudpy.command.error(actor, input_data) + if action_fname: + result = call_hook_function(action_fname, (actor, parameters)) # if the command was not run, give an error - if not ran: + if not result: mudpy.command.error(actor, input_data) # if no input, just idle back with a prompt