Пример #1
0
    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()
Пример #2
0
    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())