]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/users.cpp
Change SetClientIP to take a C++ string instead of a char array.
[user/henk/code/inspircd.git] / src / users.cpp
index 5d1c12b136c1979863d90af3dc4e0b46ce64bee9..9fef906d16d83de783acfe89e93de293563443bf 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->NeedsParam(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)
@@ -494,7 +494,7 @@ void LocalUser::CheckClass(bool clone_count)
                }
        }
 
-       this->nping = ServerInstance->Time() + a->GetPingTime() + ServerInstance->Config->dns_timeout;
+       this->nping = ServerInstance->Time() + a->GetPingTime();
 }
 
 bool LocalUser::CheckLines(bool doZline)
@@ -539,10 +539,10 @@ void LocalUser::FullConnect()
 
        this->WriteNumeric(RPL_WELCOME, InspIRCd::Format("Welcome to the %s IRC Network %s", ServerInstance->Config->Network.c_str(), GetFullRealHost().c_str()));
        this->WriteNumeric(RPL_YOURHOSTIS, InspIRCd::Format("Your host is %s, running version %s", ServerInstance->Config->ServerName.c_str(), INSPIRCD_BRANCH));
-       this->WriteNumeric(RPL_SERVERCREATED, InspIRCd::Format("This server was created %s %s", __TIME__, __DATE__));
+       this->WriteNumeric(RPL_SERVERCREATED, InspIRCd::TimeString(ServerInstance->startup_time, "This server was created %H:%M:%S %b %d %Y"));
 
-       const std::string& modelist = ServerInstance->Modes->GetModeListFor004Numeric();
-       this->WriteNumeric(RPL_SERVERVERSION, ServerInstance->Config->ServerName, INSPIRCD_BRANCH, modelist);
+       const TR1NS::array<std::string, 3>& modelist = ServerInstance->Modes->GetModeListFor004Numeric();
+       this->WriteNumeric(RPL_SERVERVERSION, ServerInstance->Config->ServerName, INSPIRCD_BRANCH, modelist[0], modelist[1], modelist[2]);
 
        ServerInstance->ISupport.SendTo(this);
 
@@ -588,6 +588,7 @@ void LocalUser::FullConnect()
 void User::InvalidateCache()
 {
        /* Invalidate cache */
+       cachedip.clear();
        cached_fullhost.clear();
        cached_hostip.clear();
        cached_makehost.clear();
@@ -627,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
                        {
@@ -659,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)
@@ -673,10 +681,9 @@ int LocalUser::GetServerPort()
 
 const std::string& User::GetIPString()
 {
-       int port;
        if (cachedip.empty())
        {
-               irc::sockets::satoap(client_sa, cachedip, port);
+               cachedip = client_sa.addr();
                /* IP addresses starting with a : on irc are a Bad Thing (tm) */
                if (cachedip[0] == ':')
                        cachedip.insert(cachedip.begin(),1,'0');
@@ -700,11 +707,10 @@ irc::sockets::cidr_mask User::GetCIDRMask()
        return irc::sockets::cidr_mask(client_sa, range);
 }
 
-bool User::SetClientIP(const char* sip, bool recheck_eline)
+bool User::SetClientIP(const std::string& address, bool recheck_eline)
 {
-       cachedip.clear();
-       cached_hostip.clear();
-       return irc::sockets::aptosa(sip, 0, client_sa);
+       this->InvalidateCache();
+       return irc::sockets::aptosa(address, 0, client_sa);
 }
 
 void User::SetClientIP(const irc::sockets::sockaddrs& sa, bool recheck_eline)
@@ -714,10 +720,10 @@ void User::SetClientIP(const irc::sockets::sockaddrs& sa, bool recheck_eline)
        memcpy(&client_sa, &sa, sizeof(irc::sockets::sockaddrs));
 }
 
-bool LocalUser::SetClientIP(const char* sip, bool recheck_eline)
+bool LocalUser::SetClientIP(const std::string& address, bool recheck_eline)
 {
        irc::sockets::sockaddrs sa;
-       if (!irc::sockets::aptosa(sip, 0, sa))
+       if (!irc::sockets::aptosa(address, 0, sa))
                // Invalid
                return false;
 
@@ -1096,14 +1102,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())
@@ -1166,13 +1172,11 @@ ConnectClass::ConnectClass(ConfigTag* tag, char t, const std::string& mask)
 }
 
 ConnectClass::ConnectClass(ConfigTag* tag, char t, const std::string& mask, const ConnectClass& parent)
-       : config(tag), type(t), fakelag(parent.fakelag), name("unnamed"),
-       registration_timeout(parent.registration_timeout), host(mask), pingtime(parent.pingtime),
-       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)
 {
+       Update(&parent);
+       name = "unnamed";
+       type = t;
+       config = tag;
 }
 
 void ConnectClass::Update(const ConnectClass* src)
@@ -1195,4 +1199,5 @@ void ConnectClass::Update(const ConnectClass* src)
        maxchans = src->maxchans;
        limit = src->limit;
        resolvehostnames = src->resolvehostnames;
+       ports = src->ports;
 }