Committer  : decampos
CVSROOT    : /cvsroot/undernet-ircu
Module     : ircu2.10
Branch tags: u2_10_11_07
Commit time: 2004-06-20 19:20:42 UTC

Modified files:
  Tag: u2_10_11_07
     ChangeLog ircd/m_account.c

Log message:

Author: Alex Badea <[EMAIL PROTECTED]>
Log message:

Login-on-connect extensions, part 1. This only changes ms_account, to be
prepared for further changes. Not heavily tested. More details in the RFE
on SourceForge. Feel free to rollback.

---------------------- diff included ----------------------
Index: ircu2.10/ChangeLog
diff -u ircu2.10/ChangeLog:1.290.2.130.2.10 ircu2.10/ChangeLog:1.290.2.130.2.11
--- ircu2.10/ChangeLog:1.290.2.130.2.10 Fri Jun 18 06:41:43 2004
+++ ircu2.10/ChangeLog  Sun Jun 20 12:20:31 2004
@@ -1,3 +1,8 @@
+2004-06-20  Alex Badea  <[EMAIL PROTECTED]>
+
+       * ircd/m_account.c: login-on-connect extensions, part 1:
+       added message sub-types and implemented routing
+
 2004-06-18  Alex Badea  <[EMAIL PROTECTED]>
 
        * ircd/gline.c (gline_lookup): only return a gline if it's
Index: ircu2.10/ircd/m_account.c
diff -u ircu2.10/ircd/m_account.c:1.1.2.4.8.1 ircu2.10/ircd/m_account.c:1.1.2.4.8.2
--- ircu2.10/ircd/m_account.c:1.1.2.4.8.1       Thu May 13 22:48:13 2004
+++ ircu2.10/ircd/m_account.c   Sun Jun 20 12:20:32 2004
@@ -19,7 +19,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * $Id: m_account.c,v 1.1.2.4.8.1 2004/05/14 05:48:13 klmitch Exp $
+ * $Id: m_account.c,v 1.1.2.4.8.2 2004/06/20 19:20:32 decampos Exp $
  */
 
 /*
@@ -99,12 +99,26 @@
  *
  * parv[0] = sender prefix
  * parv[1] = numeric of client to act on
- * parv[2] = account name (12 characters or less)
+ * parv[2] = message sub-type
+ *
+ * for parv[2] == 'R' (remote auth):
+ * parv[3] = account name (12 characters or less)
+ * parv[4] = account TS (optional)
+ *
+ * for parv[2] == 'C' (auth check):
+ * parv[3] = request id (transparent, uninterpreted string)
+ * parv[4] = username
+ * parv[parc-1] = password
+ *
+ * for parv[2] == 'A' (auth ok) or
+ * for parv[2] == 'D' (auth denied):
+ * parv[3] = request id (transparent, uninterpreted string)
  */
 int ms_account(struct Client* cptr, struct Client* sptr, int parc,
               char* parv[])
 {
   struct Client *acptr;
+  char type;
 
   if (parc < 3)
     return need_more_params(sptr, "ACCOUNT");
@@ -113,33 +127,79 @@
     return protocol_violation(cptr, "ACCOUNT from non-server %s",
                              cli_name(sptr));
 
-  if (!(acptr = findNUser(parv[1])))
-    return 0; /* Ignore ACCOUNT for a user that QUIT; probably crossed */
-
-  if (IsAccount(acptr))
-    return protocol_violation(cptr, "ACCOUNT for already registered user %s "
-                             "(%s -> %s)", cli_name(acptr),
-                             cli_user(acptr)->account, parv[2]);
-
-  assert(0 == cli_user(acptr)->account[0]);
-
-  if (strlen(parv[2]) > ACCOUNTLEN) {
-    return protocol_violation(cptr, "Received account (%s) longer than %d for %s; 
ignoring.", parv[2], ACCOUNTLEN, cli_name(acptr));
+#if 1
+  /* XXX HACK -- remove when all servers understand the new syntax */
+  if (parc < 4) {
+    /* old-school message, remap it to 'R' */
+    parv[4] = NULL;
+    parv[3] = parv[2];
+    parv[2] = "R";
+    parc = 4;
+  } else if (parc == 4 && atoi(parv[3])) {
+    /* old-school message with timestamp, remap it to 'R' */
+    parv[5] = NULL;
+    parv[4] = parv[3];
+    parv[3] = parv[2];
+    parv[2] = "R";
+    parc = 5;
   }
+#endif
 
-  if (parc > 3) {
-    cli_user(acptr)->acc_create = atoi(parv[3]);
-    Debug((DEBUG_DEBUG, "Received timestamped account: account \"%s\", "
-          "timestamp %Tu", parv[2], cli_user(acptr)->acc_create));
+  type = parv[2][0];
+  if (type == 'R') {
+    if (!(acptr = findNUser(parv[1])))
+      return 0; /* Ignore ACCOUNT for a user that QUIT; probably crossed */
+
+    if (IsAccount(acptr))
+      return protocol_violation(cptr, "ACCOUNT for already registered user %s "
+                               "(%s -> %s)", cli_name(acptr),
+                               cli_user(acptr)->account, parv[3]);
+
+    assert(0 == cli_user(acptr)->account[0]);
+
+    if (strlen(parv[3]) > ACCOUNTLEN) {
+      return protocol_violation(cptr, "Received account (%s) longer than %d for %s; 
ignoring.", parv[3], ACCOUNTLEN, cli_name(acptr));
+    }
+
+    if (parc > 4) {
+      cli_user(acptr)->acc_create = atoi(parv[4]);
+      Debug((DEBUG_DEBUG, "Received timestamped account: account \"%s\", "
+            "timestamp %Tu", parv[3], cli_user(acptr)->acc_create));
+    }
+
+    ircd_strncpy(cli_user(acptr)->account, parv[3], ACCOUNTLEN);
+    hide_hostmask(acptr, FLAG_ACCOUNT);
+
+#if 1
+  /* remove when all servers understand the new syntax */
+    sendcmdto_serv_butone(sptr, CMD_ACCOUNT, cptr,
+                         cli_user(acptr)->acc_create ? "%C %s %Tu" : "%C %s",
+                         acptr, cli_user(acptr)->account,
+                         cli_user(acptr)->acc_create);
+#else
+    sendcmdto_serv_butone(sptr, CMD_ACCOUNT, cptr,
+                         cli_user(acptr)->acc_create ? "%C R %s %Tu" : "%C R %s",
+                         acptr, cli_user(acptr)->account,
+                         cli_user(acptr)->acc_create);
+#endif
+  } else {
+    if (type == 'C' && parc < 6)
+      return need_more_params(sptr, "ACCOUNT");
+
+    if (!(acptr = findNUser(parv[1])) && !(acptr = FindNServer(parv[1])))
+      return 0; /* target not online, ignore */
+    
+    if (!IsMe(acptr)) {
+      /* in-transit message, forward it */
+      sendcmdto_one(sptr, CMD_ACCOUNT, acptr,
+                   type == 'C' ? "%C %s %s %s :%s" : "%C %s %s",
+                   acptr, parv[2], parv[3], parv[4], parv[parc-1]);
+      return 0;
+    }
+    
+    /* the message is for &me, process it */
+    return protocol_violation(cptr, "ACCOUNT sub-type '%s' not implemented.", 
parv[2]);
   }
 
-  ircd_strncpy(cli_user(acptr)->account, parv[2], ACCOUNTLEN);
-  hide_hostmask(acptr, FLAG_ACCOUNT);
-
-  sendcmdto_serv_butone(sptr, CMD_ACCOUNT, cptr,
-                       cli_user(acptr)->acc_create ? "%C %s %Tu" : "%C %s",
-                       acptr, cli_user(acptr)->account,
-                       cli_user(acptr)->acc_create);
-
   return 0;
 }
----------------------- End of diff -----------------------

Reply via email to