else if ((this->fwd) && (ServerInstance->SE->GetRef(this->bound_fd) == this->bound_user))
{
/* Both lookups completed */
- std::string result2 = "0::ffff:";
+ std::string result2("0::ffff:");
result2.append(result);
if (this->bound_user->GetIPString() == result || this->bound_user->GetIPString() == result2)
{
{
/* Hostnames starting with : are not a good thing (tm) */
if (*(hostname.c_str()) == ':')
- hostname = "0" + hostname;
+ hostname.insert(0, "0");
this->bound_user->WriteServ("NOTICE Auth :*** Found your hostname (%s)%s", hostname.c_str(), (cached ? " -- cached" : ""));
this->bound_user->dns_done = true;
operquit = cached_fullhost = cached_hostip = cached_makehost = cached_fullrealhost = NULL;
}
+void userrec::RemoveCloneCounts()
+{
+ clonemap::iterator x = ServerInstance->local_clones.find(this->GetIPString());
+ if (x != ServerInstance->local_clones.end())
+ {
+ x->second--;
+ if (!x->second)
+ {
+ ServerInstance->local_clones.erase(x);
+ }
+ }
+
+ clonemap::iterator y = ServerInstance->global_clones.find(this->GetIPString());
+ if (y != ServerInstance->global_clones.end())
+ {
+ y->second--;
+ if (!y->second)
+ {
+ ServerInstance->global_clones.erase(y);
+ }
+ }
+}
+
userrec::~userrec()
{
this->InvalidateCache();
free(operquit);
if (ip)
{
- clonemap::iterator x = ServerInstance->local_clones.find(this->GetIPString());
- if (x != ServerInstance->local_clones.end())
- {
- x->second--;
- if (!x->second)
- {
- ServerInstance->local_clones.erase(x);
- }
- }
-
- clonemap::iterator y = ServerInstance->global_clones.find(this->GetIPString());
- if (y != ServerInstance->global_clones.end())
- {
- y->second--;
- if (!y->second)
- {
- ServerInstance->global_clones.erase(y);
- }
- }
+ this->RemoveCloneCounts();
if (this->GetProtocolFamily() == AF_INET)
{
userrec::QuitUser(ServerInstance, this, "Unauthorised connection");
return;
}
- else if ((!a->GetPass().empty()) && (!this->haspassed))
- {
- userrec::QuitUser(ServerInstance, this, "Invalid password");
- return;
- }
else if ((a->GetMaxLocal()) && (this->LocalCloneCount() > a->GetMaxLocal()))
{
userrec::QuitUser(ServerInstance, this, "No more connections allowed from your host via this connect class (local)");
* Don't remove this! -- w00t
*/
this->CheckClass();
-
+
+ /* Check the password, if one is required by the user's connect class.
+ * This CANNOT be in CheckClass(), because that is called prior to PASS as well!
+ */
+ if ((!this->GetClass()->GetPass().empty()) && (!this->haspassed))
+ {
+ userrec::QuitUser(ServerInstance, this, "Invalid password");
+ return;
+ }
+
if (!this->exempt)
{
GLine* r = ServerInstance->XLines->matches_gline(this);
if (this->registered == REG_ALL)
{
- const char* pars[1];
- pars[0] = newnick;
- std::string cmd = "NICK";
- return (ServerInstance->Parser->CallHandler(cmd, pars, 1, this) == CMD_SUCCESS);
+ return (ServerInstance->Parser->CallHandler("NICK", &newnick, 1, this) == CMD_SUCCESS);
}
return false;
}
{
try
{
+ /* XXX: The lack of buffering here is NOT a bug, modules implementing this interface have to
+ * implement their own buffering mechanisms
+ */
ServerInstance->Config->GetIOHook(this->GetPort())->OnRawSocketWrite(this->fd, text.data(), text.length());
}
catch (CoreException& modexcept)
if (!IS_OPER(this) && IS_LOCAL(this))
return;
- std::string wallop = "WALLOPS :" + text;
+ std::string wallop("WALLOPS :");
+ wallop.append(text);
for (std::vector<userrec*>::const_iterator i = ServerInstance->local_users.begin(); i != ServerInstance->local_users.end(); i++)
{