Support a "soft done" message from IAuth.
authorMichael Poole <mdpoole@troilus.org>
Fri, 20 Jan 2012 02:50:27 +0000 (21:50 -0500)
committerMichael Poole <mdpoole@troilus.org>
Fri, 20 Jan 2012 02:50:27 +0000 (21:50 -0500)
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.

doc/readme.iauth
ircd/s_auth.c

index 8b4aea7ba0778283c045468272d453628b866169..54a011f6a24989c327a12c2b0a55b45fb3c98449 100644 (file)
@@ -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 <id> <remoteip> <remoteport>
+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 <id> <remoteip> <remoteport> [class]
 Example: D 5 192.168.1.10 23367
index ff245d6d65423bcb3f30e82767a803294d1b8dc1..e250ae6736ef3a9348f32fd097e11c8d0bf77d71 100644 (file)
@@ -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