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 -----------------------