def __init__(self, socket): self.socket = socket self.character = Character(socket) self.name = None self.pw = None self.jmptable = { UserState.prompt_name : self.prompt_name, UserState.store_name : self.store_name, UserState.prompt_pw : self.prompt_pw, UserState.store_pw : self.store_pw, UserState.auth : self.auth, UserState.active : self.character.command } Switch.__init__(self, UserState.prompt_name) if User.debug: self.skip_login() self.jmp()
class User(Switch): ''' ''' active_users = [] debug = False def __init__(self, socket): self.socket = socket self.character = Character(socket) self.name = None self.pw = None self.jmptable = { UserState.prompt_name : self.prompt_name, UserState.store_name : self.store_name, UserState.prompt_pw : self.prompt_pw, UserState.store_pw : self.store_pw, UserState.auth : self.auth, UserState.active : self.character.command } Switch.__init__(self, UserState.prompt_name) if User.debug: self.skip_login() self.jmp() def handle_input(self, message): ''' Remove non-alphanumeric characters from input ''' message = re.sub("[^a-zA-Z0-9\\s]", "", message) self.jmp(message) def send(self, message): ''' ''' self.socket(message) def prompt_name(self, _): ''' Send name prompt ''' self.send("What is your name?") self.shift(UserState.store_name) def store_name(self, name=None): ''' Receive and store name ''' if name: self.name = name self.shift(UserState.prompt_pw, True) else: self.shift(UserState.prompt_name, True) def prompt_pw(self, _): ''' Send password prompt ''' self.send("What is the password?") self.shift(UserState.store_pw) def store_pw(self, password): ''' Receive and store password ''' if password: self.pw = hashlib.sha256(bytes(password, 'utf-8')).hexdigest() self.shift(UserState.auth, True) else: self.shift(UserState.prompt_name, True) def auth(self, _): ''' Authenticate the name/password. Ensure hashed password wiped in memory. ''' result = database.view("user", "auth", self.name) assert(len(result) <= 1) if len(result) and (self.pw == result[0]["value"]): self.send("Authenticated") self.character.load(self.name) self.shift(UserState.active, True) else: self.send("Invalid name/password") self.shift(UserState.prompt_name, True) self.pw = "x" * len(self.pw) def skip_login(self): ''' ''' self.name = "jon" self.character.load(self.name) self.shift(UserState.active, True)