def login(self, session_id, loginid, nick, password, group_name, status="", remote_address=""): self.log.debug("User login: loginid=%s, nick=%s, password=%s", loginid, nick, hide_chars(password)) if not validate.is_valid_loginid(loginid): raise LtdErrorException( "loginid must consist of at least %d and at most %d alphabetic characters." % (validate.LOGINID_MIN, validate.LOGINID_MAX)) if not validate.is_valid_nick(nick): raise LtdErrorException( "Nickname must consist of at least %d and at most %d alphanumeric characters." % (validate.NICK_MIN, validate.NICK_MAX)) self.__resolve_bridged_user__(session_id, loginid, remote_address) self.broker.deliver(session_id, ltd.encode_empty_cmd("a")) if nick == core.NICKSERV: raise LtdStatusException("Register", "Nick already in use.") ACTION(Motd).receive(session_id) registered = self.config.server_unsecure_login and self.__try_login_unsecure__( session_id, loginid, nick) if not registered: if not password: self.__login_no_password__(session_id, loginid, nick) else: registered = self.__login_password__(session_id, loginid, nick, password) self.session.update(session_id, signon=dateutils.now()) registration = ACTION(Registration) if registered: registration.mark_registered(session_id) self.__test_connection_limit__(session_id) self.__test_ip__(session_id) registration.notify_messagebox(session_id) if not group_name: group_name = core.DEFAULT_GROUP self.join(session_id, group_name, status) ACTION(Notify).notify_signon(session_id) s = self.resolve(shutdown.Shutdown) request = s.pending_request if request != shutdown.PendingRequest.NONE: msg = "Server is %s in %s." % ( "restarting" if request == shutdown.PendingRequest.RESTART else "shutting down", s.time_left_str) self.broker.deliver(session_id, ltd.encode_status_msg("Shutdown", msg)) with self.statsdb_connection.enter_scope() as scope: self.statsdb.add_signon(scope) self.statsdb.set_max_logins(scope, self.session.count_logins()) scope.complete()
def rename(self, session_id, nick): if not validate.is_valid_nick(nick): raise LtdErrorException("Nickname is invalid.") state = self.session.get(session_id) old_nick = state.nick was_authenticated = False if old_nick: self.log.debug("Renaming %s to %s.", old_nick, nick) was_authenticated = state.authenticated if self.session.find_nick(nick): self.reputation.warning(session_id) raise LtdErrorException("Nick already in use.") if state.group: self.log.debug("Renaming %s to %s in channel %s.", old_nick, nick, state.group) self.broker.to_channel( state.group, ltd.encode_status_msg( "Name", "%s changed nickname to %s." % (old_nick, nick))) if self.groups.get(state.group).moderator == session_id: self.broker.to_channel( state.group, ltd.encode_status_msg("Pass", "%s is now mod." % nick)) self.session.update(session_id, nick=nick, authenticated=False) registered = False is_admin = False with self.nickdb_connection.enter_scope() as scope: if was_authenticated and self.nickdb.exists(scope, old_nick): self.nickdb.set_signoff(scope, old_nick) if self.nickdb.exists(scope, nick): is_admin = self.nickdb.is_admin(scope, nick) if self.nickdb.is_secure(scope, nick): self.broker.deliver( session_id, ltd.encode_status_msg( "Register", "Send password to authenticate your nickname.") ) else: self.log.debug( "Nick not secure, trying to register automatically." ) lastlogin = self.nickdb.get_lastlogin(scope, nick) if lastlogin: self.log.debug("Last login: %s@%s", lastlogin[0], lastlogin[1]) registered = (lastlogin[0] == state.loginid and lastlogin[1] == state.host) else: self.broker.deliver( session_id, ltd.encode_status_msg( "No-Pass", "To register your nickname type /m server p password." )) registration = ACTION(Registration) if registered: registration.mark_registered(session_id) elif is_admin: self.broker.deliver( session_id, ltd.encode_str( "e", "Registration failed, administrative account requires a password." )) self.reputation.fatal(session_id) self.__auto_rename__(session_id) else: registration.notify_messagebox(session_id) self.session.update(session_id, signon=dateutils.now())