def create_password(caller, string_input): """Ask the user to create a password. This node is at the end of the menu for account creation. If a proper MULTI_SESSION is configured, a character is also created with the same name (we try to login into it). """ menutree = caller.ndb._menutree text = "" options = ( {"key": "", "exec": lambda caller: caller.msg("", options={"echo": True}), "goto": "start"}, {"key": "_default", "goto": "create_password"}) password = string_input.strip() accountname = menutree.accountname if len(password) < LEN_PASSWD: # The password is too short text = dedent(""" |rYour password must be at least {} characters long.|n Enter another password or leave it empty to go back. """.strip("\n")).format(LEN_PASSWD) else: # Everything's OK. Create the new player account and # possibly the character, depending on the multisession mode from evennia.commands.default import unloggedin # We make use of the helper functions from the default set here. try: permissions = settings.PERMISSION_ACCOUNT_DEFAULT typeclass = settings.BASE_CHARACTER_TYPECLASS new_account = unloggedin._create_account(caller, accountname, password, permissions) if new_account: if settings.MULTISESSION_MODE < 2: default_home = ObjectDB.objects.get_id( settings.DEFAULT_HOME) unloggedin._create_character(caller, new_account, typeclass, default_home, permissions) except Exception: # We are in the middle between logged in and -not, so we have # to handle tracebacks ourselves at this point. If we don't, we # won't see any errors at all. caller.msg(dedent(""" |rAn error occurred.|n Please e-mail an admin if the problem persists. Try another password or leave it empty to go back to the login screen. """.strip("\n"))) logger.log_trace() else: text = "" caller.msg("|gWelcome, your new account has been created!|n") caller.msg("", options={"echo": True}) caller.sessionhandler.login(caller, new_account) return text, options
def create_password(caller, string_input): """Ask the user to create a password. This node is at the end of the menu for account creation. If a proper MULTI_SESSION is configured, a character is also created with the same name (we try to login into it). """ menutree = caller.ndb._menutree text = "" options = ({ "key": "", "exec": lambda caller: caller.msg("", options={"echo": True}), "goto": "start" }, { "key": "_default", "goto": "create_password" }) password = string_input.strip() accountname = menutree.accountname if len(password) < LEN_PASSWD: # The password is too short text = dedent(""" |rYour password must be at least {} characters long.|n Enter another password or leave it empty to go back. """.strip("\n")).format(LEN_PASSWD) else: # Everything's OK. Create the new player account and # possibly the character, depending on the multisession mode from evennia.commands.default import unloggedin # We make use of the helper functions from the default set here. try: permissions = settings.PERMISSION_ACCOUNT_DEFAULT typeclass = settings.BASE_CHARACTER_TYPECLASS new_account = unloggedin._create_account(caller, accountname, password, permissions) if new_account: if settings.MULTISESSION_MODE < 2: default_home = ObjectDB.objects.get_id( settings.DEFAULT_HOME) unloggedin._create_character(caller, new_account, typeclass, default_home, permissions) except Exception: # We are in the middle between logged in and -not, so we have # to handle tracebacks ourselves at this point. If we don't, we # won't see any errors at all. caller.msg( dedent(""" |rAn error occurred.|n Please e-mail an admin if the problem persists. Try another password or leave it empty to go back to the login screen. """.strip("\n"))) logger.log_trace() else: text = "" caller.msg("|gWelcome, your new account has been created!|n") caller.msg("", options={"echo": True}) caller.sessionhandler.login(caller, new_account) return text, options
def create_password(caller, string_input): """Ask the user to create a password. This node is at the end of the menu for account creation. If a proper MULTI_SESSION is configured, a character is also created with the same name (we try to login into it). """ menutree = caller.ndb._menutree text = "" options = ( { "key": "r", "exec": lambda caller: caller.msg("", options={"echo": True}), "goto": "start", }, { "key": "_default", "goto": "create_password", }, ) password = string_input.strip() accountname = menutree.accountname if len(password) < LEN_PASSWD: # The password is too short text = dedent(""" |rLe mot de passe doit comporter au moins {} caractères.|n Entrez un nouveau mot de passe ou entrez |yr|n pour revenir à l'écran d'accueil. """.strip("\n")).format(LEN_PASSWD) else: from evennia.commands.default import unloggedin try: permissions = settings.PERMISSION_ACCOUNT_DEFAULT typeclass = settings.BASE_CHARACTER_TYPECLASS new_account = unloggedin._create_account(caller, accountname, password, permissions) if new_account: new_account.email = "" new_account.save() if settings.MULTISESSION_MODE < 2: default_home = ObjectDB.objects.get_id( settings.DEFAULT_HOME) unloggedin._create_character(caller, new_account, typeclass, default_home, permissions) except Exception: # We are in the middle between logged in and -not, so we have # to handle tracebacks ourselves at this point. If we don't, we # won't see any errors at all. caller.msg( dedent(""" |rUne erreur inattendue s'est produite..|n S'il vous plaît, envoyez un e-mail à [email protected] pour signaler ce problème. """.strip("\n"))) logger.log_trace() else: menutree.account = new_account caller.msg("", options={"echo": True}) text = dedent(""" Le nouvel utilisateur a bien été créé. Pour l'utiliser, il vous faut préciser une adresse e-mail valide. Un code de validation vous sera envoyé par e-mail. Vous devrez entrer ce code de validation dans votre client pour utiliser ce compte. Veuillez entrer une adresse e-mail valide : """).strip() options = ({ "key": "_default", "goto": "create_email_address", }, ) return text, options
def func(self): """Do checks and create account""" session = self.caller try: accountname, email, password = self.accountinfo except ValueError: string = "\n\r Usage (without <>): create \"<accountname>\" <email> <password>" session.msg(string) return if not email or not password: session.msg("\n\r You have to supply an e-mail address followed by a password.") return if not utils.validate_email_address(email): # check so the email at least looks ok. session.msg("'%s' is not a valid e-mail address." % email) return # sanity checks if not re.findall(r"^[\w. @+\-']+$", accountname) or not (0 < len(accountname) <= 30): # this echoes the restrictions made by django's auth # module (except not allowing spaces, for convenience of # logging in). string = "\n\r Accountname can max be 30 characters or fewer. Letters, spaces, digits and @/./+/-/_/' only." session.msg(string) return # strip excessive spaces in accountname accountname = re.sub(r"\s+", " ", accountname).strip() if AccountDB.objects.filter(username__iexact=accountname): # account already exists (we also ignore capitalization here) session.msg("Sorry, there is already an account with the name '%s'." % accountname) return if AccountDB.objects.get_account_from_email(email): # email already set on an account session.msg("Sorry, there is already an account with that email address.") return # Reserve accountnames found in GUEST_LIST if settings.GUEST_LIST and accountname.lower() in (guest.lower() for guest in settings.GUEST_LIST): string = "\n\r That name is reserved. Please choose another Accountname." session.msg(string) return if not re.findall(r"^[\w. @+\-']+$", password) or not (3 < len(password)): string = "\n\r Password should be longer than 3 characers. Letters, spaces, digits and @/./+/-/_/' only." \ "\nFor best security, make it longer than 8 characters. You can also use a phrase of" \ "\nmany words if you enclose the password in double quotes." session.msg(string) return # Check IP and/or name bans bans = ServerConfig.objects.conf("server_bans") if bans and (any(tup[0] == accountname.lower() for tup in bans) or any(tup[2].match(session.address) for tup in bans if tup[2])): # this is a banned IP or name! string = "|rYou have been banned and cannot continue from here." \ "\nIf you feel this ban is in error, please email an admin.|x" session.msg(string) session.sessionhandler.disconnect(session, "Good bye! Disconnecting.") return # everything's ok. Create the new player account. try: permissions = settings.PERMISSION_ACCOUNT_DEFAULT typeclass = settings.BASE_CHARACTER_TYPECLASS new_account = default_unloggedin._create_account(session, accountname, password, permissions, email=email) if new_account: if MULTISESSION_MODE < 2: default_home = ObjectDB.objects.get_id(settings.DEFAULT_HOME) default_unloggedin._create_character(session, new_account, typeclass, default_home, permissions) # tell the caller everything went well. string = "A new account '%s' was created. Welcome!" if " " in accountname: string += "\n\nYou can now log in with the command 'connect \"%s\" <your password>'." else: string += "\n\nYou can now log with the command 'connect %s <your password>'." session.msg(string % (accountname, email)) except Exception: # We are in the middle between logged in and -not, so we have # to handle tracebacks ourselves at this point. If we don't, # we won't see any errors at all. session.msg("An error occurred. Please e-mail an admin if the problem persists.") logger.log_trace() raise
def func(self): """Do checks and create account""" session = self.caller try: accountname, email, password = self.accountinfo except ValueError: string = "\n\r Usage (without <>): create \"<accountname>\" <email> <password>" session.msg(string) return if not email or not password: session.msg("\n\r You have to supply an e-mail address followed by a password.") return if not utils.validate_email_address(email): # check so the email at least looks ok. session.msg("'%s' is not a valid e-mail address." % email) return # sanity checks if not re.findall(r"^[\w. @+\-']+$", accountname) or not (0 < len(accountname) <= 30): # this echoes the restrictions made by django's auth # module (except not allowing spaces, for convenience of # logging in). string = "\n\r Accountname can max be 30 characters or fewer. Letters, spaces, digits and @/./+/-/_/' only." session.msg(string) return # strip excessive spaces in accountname accountname = re.sub(r"\s+", " ", accountname).strip() if AccountDB.objects.filter(username__iexact=accountname): # account already exists (we also ignore capitalization here) session.msg("Sorry, there is already an account with the name '%s'." % accountname) return if AccountDB.objects.get_account_from_email(email): # email already set on an account session.msg("Sorry, there is already an account with that email address.") return # Reserve accountnames found in GUEST_LIST if settings.GUEST_LIST and accountname.lower() in (guest.lower() for guest in settings.GUEST_LIST): string = "\n\r That name is reserved. Please choose another Accountname." session.msg(string) return if not re.findall(r"^[\w. @+\-']+$", password) or not (3 < len(password)): string = "\n\r Password should be longer than 3 characters. Letters, spaces, digits and @/./+/-/_/' only." \ "\nFor best security, make it longer than 8 characters. You can also use a phrase of" \ "\nmany words if you enclose the password in double quotes." session.msg(string) return # Check IP and/or name bans bans = ServerConfig.objects.conf("server_bans") if bans and (any(tup[0] == accountname.lower() for tup in bans) or any(tup[2].match(session.address) for tup in bans if tup[2])): # this is a banned IP or name! string = "|rYou have been banned and cannot continue from here." \ "\nIf you feel this ban is in error, please email an admin.|x" session.msg(string) session.sessionhandler.disconnect(session, "Good bye! Disconnecting.") return # everything's ok. Create the new player account. try: permissions = settings.PERMISSION_ACCOUNT_DEFAULT typeclass = settings.BASE_CHARACTER_TYPECLASS new_account = default_unloggedin._create_account(session, accountname, password, permissions, email=email) if new_account: if MULTISESSION_MODE < 2: default_home = ObjectDB.objects.get_id(settings.DEFAULT_HOME) default_unloggedin._create_character(session, new_account, typeclass, default_home, permissions) # tell the caller everything went well. string = "A new account '%s' was created. Welcome!" if " " in accountname: string += "\n\nYou can now log in with the command 'connect \"%s\" <your password>'." else: string += "\n\nYou can now log with the command 'connect %s <your password>'." session.msg(string % (accountname, email)) except Exception: # We are in the middle between logged in and -not, so we have # to handle tracebacks ourselves at this point. If we don't, # we won't see any errors at all. session.msg("An error occurred. Please e-mail an admin if the problem persists.") logger.log_trace() raise