X-Git-Url: https://mudpy.org/gitweb?p=mudpy.git;a=blobdiff_plain;f=mudpy%2Fmisc.py;h=6d61085731a8e35778390a0cff63c91055788f2b;hp=babd42f04dd6e7e4612dec3a43caa5bb5629dad4;hb=8c920b5c4b87fd8b54fd566c462c47f9e7f47693;hpb=0de1cbedcdff936f461aa6b9421cb925295bba10 diff --git a/mudpy/misc.py b/mudpy/misc.py index babd42f..6d61085 100644 --- a/mudpy/misc.py +++ b/mudpy/misc.py @@ -1,6 +1,6 @@ """Miscellaneous functions for the mudpy engine.""" -# Copyright (c) 2004-2020 mudpy authors. Permission to use, copy, +# Copyright (c) 2004-2021 mudpy authors. Permission to use, copy, # modify, and distribute this software is granted under terms # provided in the LICENSE file distributed with this software. @@ -186,29 +186,33 @@ class Element: def is_restricted(self): """Boolean check whether command is administrative or debugging.""" - return(self.get("administrative", False)) + return bool(self.get("administrative") or self.get("debugging")) def is_admin(self): """Boolean check whether an actor is controlled by an admin owner.""" - return(self.owner and self.owner.is_admin()) + return self.owner and self.owner.is_admin() def can_run(self, command): """Check if the user can run this command object.""" # has to be in the commands group if command not in self.universe.groups["command"].values(): - return(False) + return False + + # debugging commands are not allowed outside debug mode + if command.get("debugging") and not self.universe.debug_mode(): + return False # avatars of administrators can run any command if self.is_admin(): - return(True) + return True # everyone can run non-administrative commands if not command.is_restricted(): - return(True) + return True # otherwise the command cannot be run by this actor - return(False) + return False def update_location(self): """Make sure the location's contents contain this element.""" @@ -401,6 +405,11 @@ class Universe: element.update_location() element.clean_contents() + # warn when debug mode has been engaged + if self.debug_mode(): + pending_loglines.append(( + "WARNING: Unsafe debugging mode is enabled!", 6)) + # done loading, so disallow updating elements from read-only files self.loading = False @@ -427,13 +436,13 @@ class Universe: host = self.contents["mudpy.network"].get("host") port = self.contents["mudpy.network"].get("port") - # if no host was specified, bind to all local addresses (preferring + # if no host was specified, bind to the loopback address (preferring # ipv6) if not host: if socket.has_ipv6: - host = "::" + host = "::1" else: - host = "0.0.0.0" + host = "127.0.0.1" # figure out if this is ipv4 or v6 family = socket.getaddrinfo(host, port)[0][0] @@ -481,6 +490,10 @@ class Universe: if fallback not in self.files: mudpy.data.Data(fallback, self, flags=flags) + def debug_mode(self): + """Boolean method to indicate whether unsafe debugging is enabled.""" + return self.groups["mudpy"]["limit"].get("debug", False) + class User: @@ -569,7 +582,7 @@ class User: self.remove() # get rid of the old user object - del(self) + del self # create a new user object new_user = User() @@ -633,7 +646,7 @@ class User: # take this one out of the list and delete self.remove() - del(self) + del self return_value = True break @@ -1005,7 +1018,7 @@ class User: def is_admin(self): """Boolean check whether user's account is an admin.""" - return(self.account.get("administrator", False)) + return self.account.get("administrator", False) def broadcast(message, add_prompt=True): @@ -1077,14 +1090,14 @@ def log(message, level=0): for line in lines: while 0 < len(universe.loglines) >= max_log_lines: del universe.loglines[0] - universe.loglines.append((level, timestamp + " " + line)) + universe.loglines.append((timestamp + " " + line, level)) def get_loglines(level, start, stop): """Return a specific range of loglines filtered by level.""" # filter the log lines - loglines = [x for x in universe.loglines if x[0] >= level] + loglines = [x for x in universe.loglines if x[1] >= level] # we need these in several places total_count = str(len(universe.loglines)) @@ -1106,11 +1119,10 @@ def get_loglines(level, start, stop): stop = 1 # some preamble - message = "There are " + str(total_count) - message += " log lines in memory and " + str(filtered_count) - message += " at or above level " + str(level) + "." - message += " The matching lines from " + str(stop) + " to " - message += str(start) + " are:$(eol)$(eol)" + message = ( + "There are %s log lines in memory and %s at or above level %s. " + "The matching lines from %s to %s are:$(eol)$(eol)" % + (total_count, filtered_count, level, stop, start)) # add the text from the selected lines if stop > 1: @@ -1118,14 +1130,13 @@ def get_loglines(level, start, stop): else: range_lines = loglines[-start:] for line in range_lines: - message += " (" + str(line[0]) + ") " + line[1].replace( - "$(", "$_(" - ) + "$(eol)" + message += " (%s) %s$(eol)" % ( + line[1], line[0].replace("$(", "$_(")) # there were no lines else: - message = "None of the " + str(total_count) - message += " lines in memory matches your request." + message = "None of the %s lines in memory matches your request." % ( + total_count) # pass it back return message @@ -1457,9 +1468,9 @@ def reload_data(): old_loglines = universe.loglines[:] for element in list(universe.contents.values()): element.destroy() - universe.load() + pending_loglines = universe.load() new_loglines = universe.loglines[:] - universe.loglines = old_loglines + new_loglines + universe.loglines = old_loglines + new_loglines + pending_loglines for user in old_userlist: user.reload()