if (hostname.length() < 65)
{
/* Check we didnt time out */
- if (this->bound_user->registered != REG_ALL)
+ if ((this->bound_user->registered != REG_ALL) && (!this->bound_user->dns_done))
{
/* Hostnames starting with : are not a good thing (tm) */
if (*(hostname.c_str()) == ':')
}
else
{
- this->bound_user->WriteServ("NOTICE Auth :*** Your hostname is longer than the maximum of 64 characters, using your IP address (%s) instead.", this->bound_user->GetIPString());
+ if (!this->bound_user->dns_done)
+ {
+ this->bound_user->WriteServ("NOTICE Auth :*** Your hostname is longer than the maximum of 64 characters, using your IP address (%s) instead.", this->bound_user->GetIPString());
+ this->bound_user->dns_done = true;
+ }
}
}
else
{
- this->bound_user->WriteServ("NOTICE Auth :*** Your hostname does not match up with your IP address. Sorry, using your IP address (%s) instead.", this->bound_user->GetIPString());
+ if (!this->bound_user->dns_done)
+ {
+ this->bound_user->WriteServ("NOTICE Auth :*** Your hostname does not match up with your IP address. Sorry, using your IP address (%s) instead.", this->bound_user->GetIPString());
+ this->bound_user->dns_done = true;
+ }
}
}
}
{
if (ServerInstance->SE->GetRef(this->bound_fd) == this->bound_user)
{
- /* Error message here */
- this->bound_user->WriteServ("NOTICE Auth :*** Could not resolve your hostname: %s; using your IP address (%s) instead.", errormessage.c_str(), this->bound_user->GetIPString());
- this->bound_user->dns_done = true;
+ /* Since dns timeout is implemented outside of the resolver, this was a race condition that could result in this message being sent *after*
+ * the user was fully connected. This check fixes that issue - Special */
+ if (!this->bound_user->dns_done)
+ {
+ /* Error message here */
+ this->bound_user->WriteServ("NOTICE Auth :*** Could not resolve your hostname: %s; using your IP address (%s) instead.", errormessage.c_str(), this->bound_user->GetIPString());
+ this->bound_user->dns_done = true;
+ }
}
}
sendq = "";
WriteError = "";
res_forward = res_reverse = NULL;
+ Visibility = NULL;
ip = NULL;
chans.clear();
invites.clear();
memset(modes,0,sizeof(modes));
memset(snomasks,0,sizeof(snomasks));
/* Invalidate cache */
- cached_fullhost = cached_hostip = cached_makehost = cached_fullrealhost = NULL;
+ operquit = cached_fullhost = cached_hostip = cached_makehost = cached_fullrealhost = NULL;
}
userrec::~userrec()
{
this->InvalidateCache();
this->DecrementModes();
+ if (operquit)
+ free(operquit);
if (ip)
{
clonemap::iterator x = ServerInstance->local_clones.find(this->GetIPString());
{
ServerInstance->Log(DEBUG,"Exception in userrec::FlushWriteBuf()");
}
+
+ if (this->sendq.empty())
+ {
+ FOREACH_MOD(I_OnBufferFlushed,OnBufferFlushed(this));
+ }
}
void userrec::SetWriteError(const std::string &error)
return;
}
- if (this->LocalCloneCount() > a->GetMaxLocal())
+ if ((a->GetMaxLocal()) && (this->LocalCloneCount() > a->GetMaxLocal()))
{
this->muted = true;
ServerInstance->GlobalCulls.AddItem(this, "No more connections allowed from your host via this connect class (local)");
ServerInstance->WriteOpers("*** WARNING: maximum LOCAL connections (%ld) exceeded for IP %s", a->GetMaxLocal(), this->GetIPString());
return;
}
- else if (this->GlobalCloneCount() > a->GetMaxGlobal())
+ else if ((a->GetMaxGlobal()) && (this->GlobalCloneCount() > a->GetMaxGlobal()))
{
this->muted = true;
ServerInstance->GlobalCulls.AddItem(this, "No more connections allowed from your host via this connect class (global)");
{
for (ClassVector::iterator i = ServerInstance->Config->Classes.begin(); i != ServerInstance->Config->Classes.end(); i++)
{
- if ((match(this->GetIPString(),i->GetHost().c_str(),true)) || (match(this->host,i->GetHost().c_str())))
- return &(*i);
+ if (((match(this->GetIPString(),i->GetHost().c_str(),true)) || (match(this->host,i->GetHost().c_str()))))
+ {
+ if (i->GetPort())
+ {
+ if (this->GetPort() == i->GetPort())
+ return &(*i);
+ else
+ continue;
+ }
+ else
+ return &(*i);
+ }
}
return NULL;
}
}
}
+void userrec::SetOperQuit(const std::string &oquit)
+{
+ if (operquit)
+ return;
+
+ operquit = strdup(oquit.c_str());
+}
+
+const char* userrec::GetOperQuit()
+{
+ return operquit ? operquit : "";
+}
+
+VisData::VisData()
+{
+}
+
+VisData::~VisData()
+{
+}
+
+bool VisData::VisibleTo(userrec* user)
+{
+ return true;
+}
+