def test_disallowed_name(): assert not util.disallowed_name('Chris Norman') assert util.disallowed_name('F**k You') assert util.disallowed_name('C**t.lick') assert not util.disallowed_name('Jessica') assert util.disallowed_name('*****@*****.**') assert util.disallowed_name('a.b.c') assert util.disallowed_name('fhm123')
def handle_line(self, line): """The threaded version of lineReceived.""" if self.state == FROZEN: self.sendLine('You are totally frozen.') self.logger.info('attempted command while frozen: %s', line) elif self.state == READY: commands.do_command(connections[self.transport], line) else: self.reset_timeout() if self.state == USERNAME: if line: if line == 'new': self.create_username() else: self.uid = line self.state = PASSWORD self.sendLine('Password: '******'You must provide a username.', True) elif self.state == PASSWORD: for p in db.players: if p.authenticate(self.uid, line): logger.info('Authenticated as %s.', p.title()) self.sendLine('Welcome back, {name}.{delimiter}{delimiter}You last logged in on {connect_time} from {connect_host}.'.format(name = p.title(), delimiter = self.delimiter.decode(options.args.default_encoding) if hasattr(self.delimiter, 'decode') else self.delimiter, connect_time = ctime(p.last_connected_time), connect_host = p.last_connected_host)) self.post_login(p) break else: self.logger.info('Failed to authenticate with username: %s.', self.uid) self.sendLine('Invalid username and password combination.', True) elif self.state == CREATE_USERNAME: self.tries += 1 if self.tries >= get_config('max_create_retries'): return self.sendLine(get_config('max_create_retries_exceeded'), True) if line: for p in db.players: if p.uid == line: self.sendLine('That username is already taken.') self.create_username() break else: self.uid = line self.tries = 0 self.create_password() else: self.sendLine('Usernames must not be blank.', True) elif self.state == CREATE_PASSWORD_1: self.tries += 1 if self.tries >= get_config('max_create_retries'): return self.sendLine(get_config('max_create_retries_exceeded'), True) if not line: self.sendLine('Passwords must not be blank.') self.create_password() else: self.sendLine('Retype password: '******'Passwords do not match.') self.create_password() elif self.state == CREATE_NAME: self.tries += 1 if self.tries >= get_config('max_create_retries'): return self.sendLine(get_config('max_create_retries_exceeded'), True) if line: line = line.title() for p in db.players: if p.name == line: self.sendLine('Sorry, but that name is already taken.') self.create_name() else: msg = util.disallowed_name(line) if msg: self.sendLine(msg) self.create_name() else: self.name = line self.tries = 0 self.create_gender() else: self.sendLine('You must choose a name.') self.create_name() elif self.state == CREATE_SEX: if line == '1': gender = genders.MALE elif line == '2': gender = genders.FEMALE else: self.sendLine('Invalid input: %s. Try again.' % line) return self.create_gender() self.sendLine('You are now a %s.' % gender.sex) p = objects.PlayerObject(self.name) p.gender = gender p.uid = self.uid p.pwd = self.pwd if len(list(db.get_players())) == 1: # This is the only player. p.access = objects.players.WIZARD for o in db.objects: o.owner = p self.logger.info('Created %s player: %s.', 'wizard' if p.access else 'normal', p.title()) p.move(db.objects_config['start_room']) self.post_login(p) elif self.state == READING: try: self.transport.read_func(line.decode(options.args.default_encoding) if hasattr(line, 'decode') else line) except Exception as e: self.sendLine('An error was raised while passing the line to the target function. See log for details.') self.logger.exception(e) finally: self.state = READY self.transport.read_func = None else: self.logger.warning('Unknown connection state: %s.', self.state) self.sendLine('Sorry, but an unknown error occurred. Please log in again.') if connections[self.transport]: connections[self.transport].transport = None connections[self.transport] = None self.get_username()