X-Git-Url: https://mudpy.org/gitweb?a=blobdiff_plain;f=lib%2Fmudpy%2Fmisc.py;h=b39610be5b177f959af9509ef6732974a981f9b9;hb=e27b1c4b71ab9cad6b2e41d7ff2cf41c3d8b8d3e;hp=1ae039c2b9a9066640e8451ed6c9189a53aa926e;hpb=4eb4a44bb63c666d6b4cbb6816d3082449dcdccb;p=mudpy.git diff --git a/lib/mudpy/misc.py b/lib/mudpy/misc.py index 1ae039c..b39610b 100644 --- a/lib/mudpy/misc.py +++ b/lib/mudpy/misc.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Miscellaneous functions for the mudpy engine.""" -# Copyright (c) 2004-2012 Jeremy Stanley . Permission +# Copyright (c) 2004-2013 Jeremy Stanley . Permission # to use, copy, modify, and distribute this software is granted under # terms provided in the LICENSE file distributed with this software. @@ -142,7 +142,7 @@ class Element: return default def getint(self, facet, default=None): - """Return values as int/long type.""" + """Return values as int type.""" if default is None: default = 0 if self.origin.data.has_option(self.key, facet): @@ -192,18 +192,17 @@ class Element: def set(self, facet, value): """Set values.""" if not self.has_facet(facet) or not self.get(facet) == value: - if type(value) is long or repr(type(value)) == "": + # TODO: remove this check after the switch to py3k + if repr(type(value)) == "": value = str(value) - elif not type(value) is str: + if not type(value) is str: value = repr(value) self.origin.data.set(self.key, facet, value) self.origin.modified = True def append(self, facet, value): - """Append value tp a list.""" - if type(value) is long: - value = str(value) - elif not type(value) is str: + """Append value to a list.""" + if not type(value) is str: value = repr(value) newlist = self.getlist(facet) newlist.append(value) @@ -590,7 +589,7 @@ class User: self.menu_seen = False self.negotiation_pause = 0 self.output_queue = [] - self.partial_input = "" + self.partial_input = b"" self.password_tries = 0 self.state = "initial" self.telopts = {} @@ -801,15 +800,15 @@ class User: # and the ansi escape to return to normal text if not just_prompt and prepend_padding: if not self.output_queue \ - or not self.output_queue[-1].endswith("\r\n"): + or not self.output_queue[-1].endswith(b"\r\n"): output = "$(eol)" + output elif not self.output_queue[-1].endswith( - "\r\n\x1b[0m\r\n" + b"\r\n\x1b[0m\r\n" ) and not self.output_queue[-1].endswith( - "\r\n\r\n" + b"\r\n\r\n" ): output = "$(eol)" + output - output += eol + unichr(27) + "[0m" + output += eol + chr(27) + "[0m" # tack on a prompt if active if self.state == "active": @@ -925,7 +924,7 @@ class User: try: raw_input = self.connection.recv(1024) except: - raw_input = "" + raw_input = b"" # we got something if raw_input: @@ -937,18 +936,18 @@ class User: mudpy.telnet.negotiate_telnet_options(self) # separate multiple input lines - new_input_lines = self.partial_input.split("\n") + new_input_lines = self.partial_input.split(b"\n") # if input doesn't end in a newline, replace the # held partial input with the last line of it - if not self.partial_input.endswith("\n"): + if not self.partial_input.endswith(b"\n"): self.partial_input = new_input_lines.pop() # otherwise, chop off the extra null input and reset # the held partial input else: new_input_lines.pop() - self.partial_input = "" + self.partial_input = b"" # iterate over the remaining lines for line in new_input_lines: @@ -959,7 +958,8 @@ class User: # log non-printable characters remaining if mudpy.telnet.is_enabled(self, mudpy.telnet.TELOPT_BINARY, mudpy.telnet.HIM): - asciiline = filter(lambda x: " " <= x <= "~", line) + asciiline = b"".join( + filter(lambda x: b" " <= x <= b"~", line)) if line != asciiline: logline = "Non-ASCII characters from " if self.account and self.account.get("name"): @@ -970,10 +970,22 @@ class User: log(logline, 4) line = asciiline + try: + line = line.decode("utf-8") + except UnicodeDecodeError: + logline = "Non-UTF-8 characters from " + if self.account and self.account.get("name"): + logline += self.account.get("name") + ": " + else: + logline += "unknown user: " + logline += repr(line) + log(logline, 4) + return + + line = unicodedata.normalize("NFKC", line) + # put on the end of the queue - self.input_queue.append( - unicodedata.normalize("NFKC", line.decode("utf-8")) - ) + self.input_queue.append(line) def new_avatar(self): """Instantiate a new, unconfigured avatar for this user.""" @@ -1342,15 +1354,15 @@ def replace_macros(user, text, is_input=False): # a dict of replacement macros macros = { "eol": "\r\n", - "bld": unichr(27) + "[1m", - "nrm": unichr(27) + "[0m", - "blk": unichr(27) + "[30m", - "blu": unichr(27) + "[34m", - "cyn": unichr(27) + "[36m", - "grn": unichr(27) + "[32m", - "mgt": unichr(27) + "[35m", - "red": unichr(27) + "[31m", - "yel": unichr(27) + "[33m", + "bld": chr(27) + "[1m", + "nrm": chr(27) + "[0m", + "blk": chr(27) + "[30m", + "blu": chr(27) + "[34m", + "cyn": chr(27) + "[36m", + "grn": chr(27) + "[32m", + "mgt": chr(27) + "[35m", + "red": chr(27) + "[31m", + "yel": chr(27) + "[33m", } # add dynamic macros where possible @@ -1773,9 +1785,9 @@ def handler_entering_account_name(user): name = input_data.lower() # fail if there are non-alphanumeric characters - if name != filter( - lambda x: x >= "0" and x <= "9" or x >= "a" and x <= "z", name - ): + if name != "".join(filter( + lambda x: x >= "0" and x <= "9" or x >= "a" and x <= "z", + name)): user.error = "bad_name" # if that account exists, time to request a password @@ -1839,11 +1851,11 @@ def handler_entering_new_password(user): # make sure the password is strong--at least one upper, one lower and # one digit, seven or more characters in length if len(input_data) > 6 and len( - filter(lambda x: x >= "0" and x <= "9", input_data) + list(filter(lambda x: x >= "0" and x <= "9", input_data)) ) and len( - filter(lambda x: x >= "A" and x <= "Z", input_data) + list(filter(lambda x: x >= "A" and x <= "Z", input_data)) ) and len( - filter(lambda x: x >= "a" and x <= "z", input_data) + list(filter(lambda x: x >= "a" and x <= "z", input_data)) ): # hash and store it, then move on to verification @@ -2430,9 +2442,8 @@ def daemonize(universe): if universe.contents["internal:process"].getboolean("daemon"): # if possible, we want to rename the process to the same as the script - # (these will need to be byte type during 2to3 migration) - new_argv = "\0".join(sys.argv) + "\0" - new_short_argv0 = os.path.basename(sys.argv[0]) + "\0" + new_argv = b"\x00".join(x.encode("utf-8") for x in sys.argv) + b"\x00" + short_argv0 = os.path.basename(sys.argv[0]).encode("utf-8") + b"\x00" # attempt the linux way first try: @@ -2451,7 +2462,7 @@ def daemonize(universe): ctypes.memmove(argc.contents, new_argv, len(new_argv)) ctypes.CDLL(ctypes.util.find_library("c")).prctl( 15, - new_short_argv0, + short_argv0, 0, 0, 0