this->SetNoticeMask(*c, adding);
output += *c;
+ oldadding = adding;
}
}
else
this->WriteNumeric(ERR_UNKNOWNSNOMASK, "%s %c :is unknown snomask char to me", this->nick.c_str(), *c);
- oldadding = adding;
break;
}
ServerInstance->Users->QuitUser(user, "RecvQ exceeded");
ServerInstance->SNO->WriteToSnoMask('a', "User %s RecvQ of %lu exceeds connect class maximum of %lu",
user->nick.c_str(), (unsigned long)recvq.length(), user->MyClass->GetRecvqMax());
+ return;
}
unsigned long sendqmax = ULONG_MAX;
if (!user->HasPrivPermission("users/flood/increased-buffers"))
// overwritten in UserManager::AddUser() with the real iterator so this check
// is only a precaution currently.
if (localuseriter != ServerInstance->Users->local_users.end())
+ {
+ ServerInstance->Users->local_count--;
ServerInstance->Users->local_users.erase(localuseriter);
+ }
+ else
+ ServerInstance->Logs->Log("USERS", DEFAULT, "ERROR: LocalUserIter does not point to a valid entry for " + this->nick);
ClearInvites();
eh.cull();
{
this->AllowedUserModes.set();
}
- else if (*c >= 'A' && *c < 'z')
+ else if (*c >= 'A' && *c <= 'z')
{
this->AllowedUserModes[*c - 'A'] = true;
}
{
this->AllowedChanModes.set();
}
- else if (*c >= 'A' && *c < 'z')
+ else if (*c >= 'A' && *c <= 'z')
{
this->AllowedChanModes[*c - 'A'] = true;
}
bool User::ChangeNick(const std::string& newnick, bool force)
{
+ if (quitting)
+ {
+ ServerInstance->Logs->Log("USERS", DEFAULT, "ERROR: Attempted to change nick of a quitting user: " + this->nick);
+ return false;
+ }
+
ModResult MOD_RESULT;
if (force)
irc::sockets::satoap(client_sa, cachedip, port);
/* IP addresses starting with a : on irc are a Bad Thing (tm) */
if (cachedip.c_str()[0] == ':')
- cachedip.insert(0,1,'0');
+ cachedip.insert(cachedip.begin(),1,'0');
}
return cachedip.c_str();
return irc::sockets::cidr_mask(client_sa, range);
}
-bool User::SetClientIP(const char* sip)
+bool User::SetClientIP(const char* sip, bool recheck_eline)
{
cachedip.clear();
cached_hostip.clear();
return irc::sockets::aptosa(sip, 0, client_sa);
}
-void User::SetClientIP(const irc::sockets::sockaddrs& sa)
+void User::SetClientIP(const irc::sockets::sockaddrs& sa, bool recheck_eline)
{
cachedip.clear();
cached_hostip.clear();
memcpy(&client_sa, &sa, sizeof(irc::sockets::sockaddrs));
}
-bool LocalUser::SetClientIP(const char* sip)
+bool LocalUser::SetClientIP(const char* sip, bool recheck_eline)
{
irc::sockets::sockaddrs sa;
if (!irc::sockets::aptosa(sip, 0, sa))
// Invalid
return false;
- LocalUser::SetClientIP(sa);
+ LocalUser::SetClientIP(sa, recheck_eline);
return true;
}
-void LocalUser::SetClientIP(const irc::sockets::sockaddrs& sa)
+void LocalUser::SetClientIP(const irc::sockets::sockaddrs& sa, bool recheck_eline)
{
if (sa != client_sa)
{
User::SetClientIP(sa);
+ if (recheck_eline)
+ this->exempt = (ServerInstance->XLines->MatchesLine("E", this) != NULL);
+
FOREACH_MOD(I_OnSetUserIP,OnSetUserIP(this));
}
}
void User::SendText(const std::string &LinePrefix, std::stringstream &TextStream)
{
- char line[MAXBUF];
- int start_pos = LinePrefix.length();
- int pos = start_pos;
- memcpy(line, LinePrefix.data(), pos);
+ std::string line;
std::string Word;
while (TextStream >> Word)
{
- int len = Word.length();
- if (pos + len + 12 > MAXBUF)
+ size_t lineLength = LinePrefix.length() + line.length() + Word.length() + 13;
+ if (lineLength > MAXBUF)
{
- line[pos] = '\0';
- SendText(std::string(line));
- pos = start_pos;
+ SendText(LinePrefix + line);
+ line.clear();
}
- line[pos] = ' ';
- memcpy(line + pos + 1, Word.data(), len);
- pos += len + 1;
+ line += " " + Word;
}
- line[pos] = '\0';
- SendText(std::string(line));
+ SendText(LinePrefix + line);
}
/* return 0 or 1 depending if users u and u2 share one or more common channels
{
std::string line;
std::ostringstream prefix;
- std::string::size_type start, pos, length;
+ std::string::size_type start, pos;
prefix << this->nick << " " << dest->nick << " :";
line = prefix.str();
for (start = 0; (pos = cl.find(' ', start)) != std::string::npos; start = pos+1)
{
- length = (pos == std::string::npos) ? cl.length() : pos;
-
- if (line.length() + namelen + length - start > 510)
+ if (line.length() + namelen + pos - start > 510)
{
ServerInstance->SendWhoisLine(this, dest, 319, "%s", line.c_str());
line = prefix.str();
}
- if(pos == std::string::npos)
- {
- line.append(cl.substr(start, length - start));
- break;
- }
- else
- {
- line.append(cl.substr(start, length - start + 1));
- }
+ line.append(cl.substr(start, pos - start + 1));
}
if (line.length() != prefix.str().length())