예제 #1
0
파일: user.py 프로젝트: jon-stewart/mud
    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()
예제 #2
0
파일: user.py 프로젝트: jon-stewart/mud
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)