From: Michael Poole Date: Sat, 15 May 2004 17:17:20 +0000 (+0000) Subject: Forward port 2.10.11 fixes for pre-registration client timeouts X-Git-Url: http://git.pk910.de/?a=commitdiff_plain;h=3c0b6f8f028511c1775584d40e3cab70617946d0;p=ircu2.10.12-pk.git Forward port 2.10.11 fixes for pre-registration client timeouts git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/trunk@1058 c9e4aea6-c8fd-4c43-8297-357d70d61c8c --- diff --git a/ChangeLog b/ChangeLog index 64f8366..e195089 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2004-05-15 hikari + + [Original ChangeLog date: 2003-06-27 -MDP] + + * ircd/ircd.c: After thought, update the next check time based on + when an unregistered client should expire. + +2004-05-15 hikari + + [Original ChangeLog date: 2003-06-22 -MDP] + + * ircd/ircd.c: Fixed check_pings() - shouldn't be any problem with + clients not being able to connect anymore. + 2004-05-15 Michael Poole * ircd/channel.c (can_join): Revert to using IsInvited() rather diff --git a/ircd/ircd.c b/ircd/ircd.c index 065487c..4e1364b 100644 --- a/ircd/ircd.c +++ b/ircd/ircd.c @@ -363,18 +363,54 @@ static void check_pings(struct Event* ev) { cli_name(cptr), IsPingSent(cptr) ? "[Ping Sent]" : "[]", max_ping, (int)(CurrentTime - cli_lasttime(cptr)))); - /* Ok, the thing that will happen most frequently, is that someone will * have sent something recently. Cover this first for speed. + * -- + * If it's an unregisterd client and hasn't managed to register within + * max_ping then it's obviously having problems (broken client) or it's + * just up to no good, so we won't skip it, even if its been sending + * data to us. + * -- hikari */ - if (CurrentTime-cli_lasttime(cptr) < max_ping) { + if ((CurrentTime-cli_lasttime(cptr) < max_ping) && IsRegistered(cptr)) { expire = cli_lasttime(cptr) + max_ping; if (expire < next_check) next_check = expire; continue; } + /* Unregistered clients pingout after max_ping seconds, they don't + * get given a second chance - if they were then people could not quite + * finish registration and hold resources without being subject to k/g + * lines + */ + if (!IsRegistered(cptr)) { + assert(!IsServer(cptr)); + if ((CurrentTime-cli_firsttime(cptr) >= max_ping)) { + /* Display message if they have sent a NICK and a USER but no + * nospoof PONG. + */ + if (*(cli_name(cptr)) && cli_user(cptr) && *(cli_user(cptr))->username) { + send_reply(cptr, SND_EXPLICIT | ERR_BADPING, + ":Your client may not be compatible with this server."); + send_reply(cptr, SND_EXPLICIT | ERR_BADPING, + ":Compatible clients are available at %s", + feature_str(FEAT_URL_CLIENTS)); + } + exit_client_msg(cptr,cptr,&me, "Registration Timeout"); + continue; + } else { + /* OK, they still have enough time left, so we'll just skip to the + * next client. Set the next check to be when their time is up, if + * that's before the currently scheduled next check -- hikari */ + expire = cli_firsttime(cptr) + max_ping; + if (expire < next_check) + next_check = expire; + continue; + } + } + /* Quit the client after max_ping*2 - they should have answered by now */ if (CurrentTime-cli_lasttime(cptr) >= (max_ping*2) ) { @@ -386,28 +422,6 @@ static void check_pings(struct Event* ev) { exit_client_msg(cptr, cptr, &me, "Ping timeout"); continue; } - - /* Unregistered clients pingout after max_ping seconds, they don't - * get given a second chance - if they were then people could not quite - * finish registration and hold resources without being subject to k/g - * lines - */ - if (!IsRegistered(cptr)) - { - /* Display message if they have sent a NICK and a USER but no - * nospoof PONG. - */ - if (*(cli_name(cptr)) && cli_user(cptr) && *(cli_user(cptr))->username) - { - send_reply(cptr, SND_EXPLICIT | ERR_BADPING, - ":Your client may not be compatible with this server."); - send_reply(cptr, SND_EXPLICIT | ERR_BADPING, - ":Compatible clients are available at %s", - feature_str(FEAT_URL_CLIENTS)); - } - exit_client_msg(cptr,cptr,&me, "Ping Timeout"); - continue; - } if (!IsPingSent(cptr)) {