+2005-10-05 Michael Poole <mdpoole@troilus.org>
+
+ * ircd/class.c (do_find_class): Fix bug from previous commit.
+
+ * ircd/ircd_parser.y (clientblock): Allow setting Client port.
+
+ * ircd/s_conf.c (check_limit_and_attach): Merge into attach_iline.
+ (attach_iline): Only set FLAG_DOID when we are sure we will attach
+ this Client block to the client. [Credit: Jukka Ollila and others]
+
2005-10-04 Michael Poole <mdpoole@troilus.org>
[Based on a patch by Jukka Ollila]
clientblock: CLIENT
{
maxlinks = 65535;
+ port = 0;
}
'{' clientitems '}' ';'
{
memcpy(&aconf->address.addr, &addr, sizeof(aconf->address.addr));
else
memset(&aconf->address.addr, 0, sizeof(aconf->address.addr));
+ aconf->address.port = port;
aconf->addrbits = addrbits;
aconf->name = ip;
aconf->conn_class = c_class;
c_class = NULL;
ip = NULL;
pass = NULL;
+ port = 0;
};
clientitems: clientitem clientitems | clientitem;
-clientitem: clienthost | clientip | clientusername | clientclass | clientpass | clientmaxlinks;
+clientitem: clienthost | clientip | clientusername | clientclass | clientpass | clientmaxlinks | clientport;
clienthost: HOST '=' QSTRING ';'
{
char *sep = strchr($3, '@');
{
maxlinks = $3;
};
+clientport: PORT '=' expr ';'
+{
+ port = $3;
+};
killblock: KILL
{
}
}
-/** Check client limits and attach Client block.
- * If there are more connections from the IP than \a aconf->maximum
- * allows, return ACR_TOO_MANY_FROM_IP. Otherwise, attach \a aconf to
- * \a cptr.
- * @param cptr Client getting \a aconf.
- * @param aconf Configuration item to attach.
- * @return Authorization check result.
- */
-static enum AuthorizationCheckResult
-check_limit_and_attach(struct Client* cptr, struct ConfItem* aconf)
-{
- if (IPcheck_nr(cptr) > aconf->maximum)
- return ACR_TOO_MANY_FROM_IP;
- return attach_conf(cptr, aconf);
-}
-
/** Find the first (best) Client block to attach.
* @param cptr Client for whom to check rules.
* @return Authorization check result.
*/
if (aconf->address.port && aconf->address.port != cli_listener(cptr)->addr.port)
continue;
- if (aconf->username) {
- SetFlag(cptr, FLAG_DOID);
- if (match(aconf->username, cli_username(cptr)))
- continue;
- }
+ if (aconf->username && match(aconf->username, cli_username(cptr)))
+ continue;
if (aconf->host && match(aconf->host, cli_sockhost(cptr)))
continue;
if ((aconf->addrbits >= 0)
&& !ipmask_check(&cli_ip(cptr), &aconf->address.addr, aconf->addrbits))
continue;
- return check_limit_and_attach(cptr, aconf);
+ if (IPcheck_nr(cptr) > aconf->maximum)
+ return ACR_TOO_MANY_FROM_IP;
+ if (aconf->username)
+ SetFlag(cptr, FLAG_DOID);
+ return attach_conf(cptr, aconf);
}
return ACR_NO_AUTHORIZATION;
}