this->bound_fd = user->GetFd();
}
-void UserResolver::OnLookupComplete(const std::string &result, unsigned int ttl, bool cached)
+void UserResolver::OnLookupComplete(const std::string &result, unsigned int ttl, bool cached, int resultnum)
{
+ /* We are only interested in the first matching result */
+ if (resultnum)
+ return;
+
if ((!this->fwd) && (ServerInstance->SE->GetRef(this->bound_fd) == this->bound_user))
{
this->bound_user->stored_host = result;
{
/* Fatal error, set write error and bail
*/
- this->SetWriteError(strerror(errno));
+ this->SetWriteError(errno ? strerror(errno) : "EOF from client");
return;
}
}
return;
}
+ /*
+ * Check connect class settings and initialise settings into userrec.
+ * This will be done again after DNS resolution. -- w00t
+ */
New->CheckClass();
- New->pingmax = i->GetPingTime();
- New->nping = Instance->Time() + i->GetPingTime() + Instance->Config->dns_timeout;
- New->timeout = Instance->Time() + i->GetRegTimeout();
- New->flood = i->GetFlood();
- New->threshold = i->GetThreshold();
- New->sendqmax = i->GetSendqMax();
- New->recvqmax = i->GetRecvqMax();
-
Instance->local_users.push_back(New);
if ((Instance->local_users.size() > Instance->Config->SoftLimit) || (Instance->local_users.size() >= MAXCLIENTS))
/*
* Check class restrictions
*/
-void userrec::CheckClass()
+void userrec::CheckClass(const std::string &explicit_class)
{
- ConnectClass* a = this->GetClass();
+ ConnectClass* a = this->GetClass(explicit_class);
if ((!a) || (a->GetType() == CC_DENY))
{
ServerInstance->WriteOpers("*** WARNING: maximum GLOBAL connections (%ld) exceeded for IP %s", a->GetMaxGlobal(), this->GetIPString());
return;
}
+
+ this->pingmax = a->GetPingTime();
+ this->nping = ServerInstance->Time() + a->GetPingTime() + ServerInstance->Config->dns_timeout;
+ this->timeout = ServerInstance->Time() + a->GetRegTimeout();
+ this->flood = a->GetFlood();
+ this->threshold = a->GetThreshold();
+ this->sendqmax = a->GetSendqMax();
+ this->recvqmax = a->GetRecvqMax();
+ this->MaxChans = a->GetMaxChans();
}
void userrec::FullConnect()
if (*ServerInstance->Config->MoronBanner)
this->WriteServ("NOTICE %s :*** %s", this->nick, ServerInstance->Config->MoronBanner);
snprintf(reason,MAXBUF,"G-Lined: %s",r->reason);
- ServerInstance->GlobalCulls.AddItem(this, reason);
+ userrec::QuitUser(ServerInstance, this, reason);
return;
}
if (*ServerInstance->Config->MoronBanner)
this->WriteServ("NOTICE %s :*** %s", this, ServerInstance->Config->MoronBanner);
snprintf(reason,MAXBUF,"K-Lined: %s",n->reason);
- ServerInstance->GlobalCulls.AddItem(this, reason);
+ userrec::QuitUser(ServerInstance, this, reason);
return;
}
}
*/
void userrec::Write(std::string text)
{
-#ifdef WINDOWS
- if ((this->fd < 0) || (this->m_internalFd > MAX_DESCRIPTORS))
-#else
- if ((this->fd < 0) || (this->fd > MAX_DESCRIPTORS))
-#endif
+ if (!ServerInstance->SE->BoundsCheckFd(this))
return;
try
for (std::vector<userrec*>::const_iterator i = ServerInstance->local_users.begin(); i != ServerInstance->local_users.end(); i++)
{
userrec* t = *i;
- if (t->modes[UM_WALLOPS])
+ if (t->IsModeSet('w'))
this->WriteTo(t,wallop);
}
}
* If the channel is NOT private/secret OR the user shares a common channel
* If the user is an oper, and the <options:operspywhois> option is set.
*/
- if ((source == this) || (IS_OPER(source) && ServerInstance->Config->OperSpyWhois) || (((!i->first->modes[CM_PRIVATE]) && (!i->first->modes[CM_SECRET])) || (i->first->HasUser(source))))
+ if ((source == this) || (IS_OPER(source) && ServerInstance->Config->OperSpyWhois) || (((!i->first->IsModeSet('p')) && (!i->first->IsModeSet('s'))) || (i->first->HasUser(source))))
{
list.append(i->first->GetPrefixChar(this)).append(i->first->name).append(" ");
}
}
}
+unsigned int userrec::GetMaxChans()
+{
+ return this->MaxChans;
+}
/* looks up a users password for their connection class (<ALLOW>/<DENY> tags)
* NOTE: If the <ALLOW> or <DENY> tag specifies an ip, and this user resolves,
* then their ip will be taken as 'priority' anyway, so for example,
* <connect allow="127.0.0.1"> will match joe!bloggs@localhost
*/
-ConnectClass* userrec::GetClass()
+ConnectClass* userrec::GetClass(const std::string &explicit_name)
{
- for (ClassVector::iterator i = ServerInstance->Config->Classes.begin(); i != ServerInstance->Config->Classes.end(); i++)
+ if (!explicit_name.empty())
{
- if (((match(this->GetIPString(),i->GetHost().c_str(),true)) || (match(this->host,i->GetHost().c_str()))))
+ for (ClassVector::iterator i = ServerInstance->Config->Classes.begin(); i != ServerInstance->Config->Classes.end(); i++)
{
- if (i->GetPort())
+ if (explicit_name == i->GetName())
+ return &(*i);
+ }
+ }
+ else
+ {
+ 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()))))
{
- if (this->GetPort() == i->GetPort())
- return &(*i);
+ if (i->GetPort())
+ {
+ if (this->GetPort() == i->GetPort())
+ return &(*i);
+ else
+ continue;
+ }
else
- continue;
+ return &(*i);
}
- else
- return &(*i);
}
}
return NULL;
{
if (!ServerInstance->Config->RULES.size())
{
- this->WriteServ("NOTICE %s :Rules file is missing.",this->nick);
+ this->WriteServ("434 %s :RULES File is missing",this->nick);
return;
}
- this->WriteServ("NOTICE %s :%s rules",this->nick,ServerInstance->Config->ServerName);
+
+ this->WriteServ("308 %s :- %s Server Rules -",this->nick,ServerInstance->Config->ServerName);
for (file_cache::iterator i = ServerInstance->Config->RULES.begin(); i != ServerInstance->Config->RULES.end(); i++)
- this->WriteServ("NOTICE %s :%s",this->nick,i->c_str());
+ this->WriteServ("232 %s :- %s",this->nick,i->c_str());
- this->WriteServ("NOTICE %s :End of %s rules.",this->nick,ServerInstance->Config->ServerName);
+ this->WriteServ("309 %s :End of RULES command.",this->nick);
}
void userrec::HandleEvent(EventType et, int errornum)