From: Michael Poole Date: Fri, 20 Jan 2012 02:50:27 +0000 (-0500) Subject: Support a "soft done" message from IAuth. X-Git-Url: http://git.pk910.de/?p=ircu2.10.12-pk.git;a=commitdiff_plain;h=8a0fce5ce44018405ec3aab7115f7b7028c90329 Support a "soft done" message from IAuth. This lets clients onto the network if a login-on-connect response times out, without requiring the IAuth process to know ircu's authorization deadline. --- diff --git a/doc/readme.iauth b/doc/readme.iauth index 8b4aea7..54a011f 100644 --- a/doc/readme.iauth +++ b/doc/readme.iauth @@ -446,6 +446,18 @@ Next State: GONE Comments: Indicates that the specified client should be disconnected for the reason given. Operators should be notified. +d - "Soft" Done Checking +Syntax: d +Example: d 5 192.168.1.10 23367 +States: REGISTER, HURRY +Next State: - +Comments: Indicates that the iauth instance has no objection to letting + the specified client onto the network, but that some further work is + in process. In particular, an account stamp and/or connection class + might be available later. +Compatibility: This is an Undernet extension and ircd does not support + this message. + D - Done Checking Syntax: D [class] Example: D 5 192.168.1.10 23367 diff --git a/ircd/s_auth.c b/ircd/s_auth.c index ff245d6..e250ae6 100644 --- a/ircd/s_auth.c +++ b/ircd/s_auth.c @@ -84,6 +84,7 @@ enum AuthRequestFlag { AR_IAUTH_HURRY, /**< we told iauth to hurry up */ AR_IAUTH_USERNAME, /**< iauth sent a username (preferred or forced) */ AR_IAUTH_FUSERNAME, /**< iauth sent a forced username */ + AR_IAUTH_SOFT_DONE, /**< iauth has no objection to client */ AR_PASSWORD_CHECKED, /**< client password already checked */ AR_NUM_FLAGS }; @@ -791,7 +792,8 @@ int auth_ping_timeout(struct Client *cptr) /* Check for iauth timeout. */ if (FlagHas(&auth->flags, AR_IAUTH_PENDING)) { - if (IAuthHas(iauth, IAUTH_REQUIRED)) { + if (IAuthHas(iauth, IAUTH_REQUIRED) + && !FlagHas(&auth->flags, AR_IAUTH_SOFT_DONE)) { sendheader(cptr, REPORT_FAIL_IAUTH); return exit_client_msg(cptr, cptr, &me, "Authorization Timeout"); } @@ -1880,6 +1882,22 @@ static struct ConfItem *auth_find_class_conf(const char *class_name) return aconf; } +/** Tentatively accept a client in IAuth. + * @param[in] iauth Active IAuth session. + * @param[in] cli Client referenced by command. + * @param[in] parc Number of parameters. + * @param[in] params Optional class name for client. + * @return Negative (CPTR_KILLED) if the connection is refused, one otherwise. + */ +static int iauth_cmd_soft_done(struct IAuth *iauth, struct Client *cli, + int parc, char **params) +{ + /* Clear iauth pending flag. */ + assert(cli_auth(cli) != NULL); + FlagSet(&cli_auth(cli)->flags, AR_IAUTH_SOFT_DONE); + return 1; +} + /** Accept a client in IAuth. * @param[in] iauth Active IAuth session. * @param[in] cli Client referenced by command. @@ -2099,6 +2117,7 @@ static void iauth_parse(struct IAuth *iauth, char *message) case 'I': handler = iauth_cmd_ip_address; has_cli = 1; break; case 'M': handler = iauth_cmd_usermode; has_cli = 1; break; case 'C': handler = iauth_cmd_challenge; has_cli = 1; break; + case 'd': handler = iauth_cmd_soft_done; has_cli = 1; break; case 'D': handler = iauth_cmd_done_client; has_cli = 1; break; case 'R': handler = iauth_cmd_done_account; has_cli = 1; break; case 'k': /* The 'k' command indicates the user should be booted