* ---------------------------------------------------
*/
+/* $Core: libIRCDuserprocess */
+
#include "inspircd.h"
#include "wildcard.h"
#include "xline.h"
current->registered == REG_ALL ? current->nick : "",
current->registered == REG_ALL ? "!" : "", current->ident, current->host);
User::QuitUser(Server, current, "Excess flood");
+
if (current->registered != REG_ALL)
{
- Server->XLines->add_zline(120, Server->Config->ServerName, "Flood from unregistered connection", current->GetIPString());
- Server->XLines->apply_lines(APPLY_ZLINES);
+ ZLine* zl = new ZLine(Server, Server->Time(), 0, Server->Config->ServerName, "Flood from unregistered connection", current->GetIPString());
+ if (Server->XLines->AddLine(zl,NULL))
+ Server->XLines->ApplyLines();
+ else
+ delete zl;
}
}
try
{
- MOD_RESULT = Server->Config->GetIOHook(cu->GetPort())->OnRawSocketRead(cu->GetFd(),ReadBuffer,sizeof(ReadBuffer),result2);
+ MOD_RESULT = Server->Config->GetIOHook(cu->GetPort())->OnRawSocketRead(cu->GetFd(),ReadBuffer,Server->Config->NetBufferSize,result2);
}
catch (CoreException& modexcept)
{
// AddBuffer returned false, theres too much data in the user's buffer and theyre up to no good.
if (current->registered == REG_ALL)
{
- // Make sure they arn't flooding long lines.
- if (Server->Time() > current->reset_due)
+ if (current->MyClass)
{
- current->reset_due = Server->Time() + current->threshold;
- current->lines_in = 0;
- }
-
- current->lines_in++;
-
- if (current->flood && current->lines_in > current->flood)
- Server->FloodQuitUser(current);
- else
- {
- current->WriteServ("NOTICE %s :Your previous line was too long and was not delivered (Over %d chars) Please shorten it.", current->nick, MAXBUF-2);
- current->recvq.clear();
+ // Make sure they arn't flooding long lines.
+ if (Server->Time() > current->reset_due)
+ {
+ current->reset_due = Server->Time() + current->MyClass->GetThreshold();
+ current->lines_in = 0;
+ }
+
+ current->lines_in++;
+
+ if (current->MyClass->GetFlood() && current->lines_in > current->MyClass->GetFlood())
+ Server->FloodQuitUser(current);
+ else
+ {
+ current->WriteServ("NOTICE %s :Your previous line was too long and was not delivered (Over %d chars) Please shorten it.", current->nick, MAXBUF-2);
+ current->recvq.clear();
+ }
}
}
else
return;
}
- Server->Parser->DoLines(current);
+ /* If user is over penalty, dont process here, just build up */
+ if (!current->OverPenalty)
+ Server->Parser->DoLines(current);
return;
}
{
User *curr = *count2;
- if (curr->OverPenalty)
- Parser->DoLines(curr, true);
-
- /* Knock a second off */
if (curr->Penalty)
{
curr->Penalty--;
- if (!curr->Penalty)
+ if (curr->Penalty < 10)
+ Parser->DoLines(curr, true);
+ }
+
+ if (curr->OverPenalty)
+ {
+ if (curr->sendq.empty())
curr->OverPenalty = false;
}
/*
* `ready` means that the user has provided NICK/USER(/PASS), and all modules agree
- * that the user is okay to proceed. The one thing we are then waiting for is DNS, which we do here...
+ * that the user is okay to proceed. The one thing we are then waiting for now is DNS...
*/
bool ready = ((curr->registered == REG_NICKUSER) && AllModulesReportReady(curr));
if (ready)
{
- if (!curr->dns_done)
- {
- /*
- * DNS isn't done yet?
- * Cool. Check for timeout.
- */
- if (TIME > curr->signon)
- {
- /* FZZZZZZZZT, timeout! */
- curr->WriteServ("NOTICE Auth :*** Could not resolve your hostname: Request timed out; using your IP address (%s) instead.", curr->GetIPString());
- curr->dns_done = true;
- this->stats->statsDnsBad++;
- curr->FullConnect();
- continue;
- }
- }
- else
+ if (curr->dns_done)
{
/* DNS passed, connect the user */
curr->FullConnect();
// This user didn't answer the last ping, remove them
if (!curr->lastping)
{
- time_t time = this->Time(false) - (curr->nping - curr->pingmax);
+ time_t time = this->Time(false) - (curr->nping - curr->MyClass->GetPingTime());
char message[MAXBUF];
snprintf(message, MAXBUF, "Ping timeout: %ld second%s", (long)time, time > 1 ? "s" : "");
curr->muted = true;
curr->lastping = 1;
- curr->nping = TIME+curr->pingmax;
+ curr->nping = TIME + curr->MyClass->GetPingTime();
User::QuitUser(this, curr, message);
continue;
}
curr->Write("PING :%s",this->Config->ServerName);
curr->lastping = 0;
- curr->nping = TIME+curr->pingmax;
+ curr->nping = TIME +curr->MyClass->GetPingTime();
}
}
}