]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/users.cpp
Merge pull request #1267 from SaberUK/master+config
[user/henk/code/inspircd.git] / src / users.cpp
index 24b2928ae052e55503013aa696782be294604bcd..d5493164483f4a2fa4c0dde41c04844c7cc907dc 100644 (file)
@@ -33,34 +33,34 @@ bool User::IsNoticeMaskSet(unsigned char sm)
        return (snomasks[sm-65]);
 }
 
-bool User::IsModeSet(unsigned char m)
+bool User::IsModeSet(unsigned char m) const
 {
        ModeHandler* mh = ServerInstance->Modes->FindMode(m, MODETYPE_USER);
        return (mh && modes[mh->GetId()]);
 }
 
-const char* User::FormatModes(bool showparameters)
+std::string User::GetModeLetters(bool includeparams) const
 {
-       static std::string data;
+       std::string ret(1, '+');
        std::string params;
-       data.clear();
 
-       for (unsigned char n = 0; n < 64; n++)
+       for (unsigned char i = 'A'; i < 'z'; i++)
        {
-               ModeHandler* mh = ServerInstance->Modes->FindMode(n + 65, MODETYPE_USER);
-               if (mh && IsModeSet(mh))
+               const ModeHandler* const mh = ServerInstance->Modes.FindMode(i, MODETYPE_USER);
+               if ((!mh) || (!IsModeSet(mh)))
+                       continue;
+
+               ret.push_back(mh->GetModeChar());
+               if ((includeparams) && (mh->NeedsParam(true)))
                {
-                       data.push_back(n + 65);
-                       if (showparameters && mh->GetNumParams(true))
-                       {
-                               std::string p = mh->GetUserParameter(this);
-                               if (p.length())
-                                       params.append(" ").append(p);
-                       }
+                       const std::string val = mh->GetUserParameter(this);
+                       if (!val.empty())
+                               params.append(1, ' ').append(val);
                }
        }
-       data += params;
-       return data.c_str();
+
+       ret += params;
+       return ret;
 }
 
 User::User(const std::string& uid, Server* srv, int type)
@@ -153,19 +153,20 @@ const std::string& User::GetFullRealHost()
        return this->cached_fullrealhost;
 }
 
-bool User::HasModePermission(unsigned char, ModeType)
+bool User::HasModePermission(const ModeHandler* mh) const
 {
        return true;
 }
 
-bool LocalUser::HasModePermission(unsigned char mode, ModeType type)
+bool LocalUser::HasModePermission(const ModeHandler* mh) const
 {
        if (!this->IsOper())
                return false;
 
+       const unsigned char mode = mh->GetModeChar();
        if (mode < 'A' || mode > ('A' + 64)) return false;
 
-       return ((type == MODETYPE_USER ? oper->AllowedUserModes : oper->AllowedChanModes))[(mode - 'A')];
+       return ((mh->GetModeType() == MODETYPE_USER ? oper->AllowedUserModes : oper->AllowedChanModes))[(mode - 'A')];
 
 }
 /*
@@ -587,6 +588,7 @@ void LocalUser::FullConnect()
 void User::InvalidateCache()
 {
        /* Invalidate cache */
+       cachedip.clear();
        cached_fullhost.clear();
        cached_hostip.clear();
        cached_makehost.clear();
@@ -626,11 +628,8 @@ bool User::ChangeNick(const std::string& newnick, time_t newts)
                        if (InUse->registered != REG_ALL)
                        {
                                /* force the camper to their UUID, and ask them to re-send a NICK. */
-                               InUse->WriteFrom(InUse, "NICK %s", InUse->uuid.c_str());
-                               InUse->WriteNumeric(ERR_NICKNAMEINUSE, InUse->nick, "Nickname overruled.");
-
-                               InUse->registered &= ~REG_NICK;
-                               InUse->ChangeNick(InUse->uuid);
+                               LocalUser* const localuser = static_cast<LocalUser*>(InUse);
+                               localuser->OverruleNick();
                        }
                        else
                        {
@@ -658,6 +657,16 @@ bool User::ChangeNick(const std::string& newnick, time_t newts)
        return true;
 }
 
+void LocalUser::OverruleNick()
+{
+       this->WriteFrom(this, "NICK %s", this->uuid.c_str());
+       this->WriteNumeric(ERR_NICKNAMEINUSE, this->nick, "Nickname overruled.");
+
+       // Clear the bit before calling ChangeNick() to make it NOT run the OnUserPostNick() hook
+       this->registered &= ~REG_NICK;
+       this->ChangeNick(this->uuid);
+}
+
 int LocalUser::GetServerPort()
 {
        switch (this->server_sa.sa.sa_family)
@@ -701,8 +710,7 @@ irc::sockets::cidr_mask User::GetCIDRMask()
 
 bool User::SetClientIP(const char* sip, bool recheck_eline)
 {
-       cachedip.clear();
-       cached_hostip.clear();
+       this->InvalidateCache();
        return irc::sockets::aptosa(sip, 0, client_sa);
 }
 
@@ -1095,14 +1103,14 @@ void LocalUser::SetClass(const std::string &explicit_name)
                        }
 
                        /* if it requires a port ... */
-                       int port = c->config->getInt("port");
-                       if (port)
+                       if (!c->ports.empty())
                        {
-                               ServerInstance->Logs->Log("CONNECTCLASS", LOG_DEBUG, "Requires port (%d)", port);
-
                                /* and our port doesn't match, fail. */
-                               if (this->GetServerPort() != port)
+                               if (!c->ports.count(this->GetServerPort()))
+                               {
+                                       ServerInstance->Logs->Log("CONNECTCLASS", LOG_DEBUG, "Requires a different port, skipping");
                                        continue;
+                               }
                        }
 
                        if (regdone && !c->config->getString("password").empty())
@@ -1170,7 +1178,7 @@ ConnectClass::ConnectClass(ConfigTag* tag, char t, const std::string& mask, cons
        softsendqmax(parent.softsendqmax), hardsendqmax(parent.hardsendqmax), recvqmax(parent.recvqmax),
        penaltythreshold(parent.penaltythreshold), commandrate(parent.commandrate),
        maxlocal(parent.maxlocal), maxglobal(parent.maxglobal), maxconnwarn(parent.maxconnwarn), maxchans(parent.maxchans),
-       limit(parent.limit), resolvehostnames(parent.resolvehostnames)
+       limit(parent.limit), resolvehostnames(parent.resolvehostnames), ports(parent.ports)
 {
 }
 
@@ -1194,4 +1202,5 @@ void ConnectClass::Update(const ConnectClass* src)
        maxchans = src->maxchans;
        limit = src->limit;
        resolvehostnames = src->resolvehostnames;
+       ports = src->ports;
 }