[1930] in Moira

home help back first fref pref prev next nref lref last post

reg_svr changes

daemon@ATHENA.MIT.EDU (Garry Zacheiss)
Thu Feb 21 00:08:13 2002

Message-Id: <200202210508.AAA05841@brad-majors.mit.edu>
To: moiradev@MIT.EDU
Date: Thu, 21 Feb 2002 00:08:11 -0500
From: Garry Zacheiss <zacheiss@MIT.EDU>

	The server side of the last patch.

Index: errors
===================================================================
RCS file: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/reg_svr/errors,v
retrieving revision 1.2
diff -u -r1.2 errors
--- errors	1998/08/25 15:58:19	1.2
+++ errors	2002/02/20 03:33:26
@@ -93,3 +93,8 @@
 username (%s) and the password you chose.
 
 Welcome to Athena!
+#21 BAD_PIN
+The PIN you typed was incorrect. Please make sure you typed it correctly.
+
+If you do not remember your PIN, you will need to contact the Athena
+User Accounts Office in N42-105A, x3-1325.
Index: protocol.c
===================================================================
RCS file: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/reg_svr/protocol.c,v
retrieving revision 1.2
diff -u -r1.2 protocol.c
--- protocol.c	1998/07/22 18:02:25	1.2
+++ protocol.c	2002/02/20 03:39:46
@@ -43,6 +43,7 @@
   { "LOGN", LOGN },
   { "PSWD", PSWD },
   { "QUIT", QUIT },
+  { "SPIN", SPIN },
   { NULL, NULL }
 };
 
Index: reg_svr.h
===================================================================
RCS file: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/reg_svr/reg_svr.h,v
retrieving revision 1.13
diff -u -r1.13 reg_svr.h
--- reg_svr.h	1998/07/31 21:35:37	1.13
+++ reg_svr.h	2002/02/20 03:34:31
@@ -21,6 +21,7 @@
 
 void RIFO(reg_client *rc, int argc, char **argv);
 void SWRD(reg_client *rc, int argc, char **argv);
+void SPIN(reg_client *rc, int argc, char **argv);
 void LOGN(reg_client *rc, int argc, char **argv);
 void PSWD(reg_client *rc, int argc, char **argv);
 void QUIT(reg_client *rc, int argc, char **argv);
@@ -37,7 +38,7 @@
        ACCOUNT_DELETED, NOT_ELIGIBLE, FOUND, FORCED_USERNAME,
        BAD_SIX_WORDS, BAD_USERNAME, USERNAME_UNAVAILABLE, 
        RESERVED_USERNAME_UNAVAILABLE, USERNAME_OK, PASSWORD_SHORT,
-       PASSWORD_SIMPLE, PASSWORD_SAMPLE, KADM_ERROR, DONE,
+       PASSWORD_SIMPLE, PASSWORD_SAMPLE, KADM_ERROR, DONE, BAD_PIN,
        NUM_REG_ERRORS };
 
 #define TIMEOUT 300 /* 5 minutes */
Index: reg_svr.pc
===================================================================
RCS file: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/reg_svr/reg_svr.pc,v
retrieving revision 1.9
diff -u -r1.9 reg_svr.pc
--- reg_svr.pc	2001/10/21 23:34:05	1.9
+++ reg_svr.pc	2002/02/20 04:29:20
@@ -300,7 +300,7 @@
   char login[USERS_LOGIN_SIZE], first[USERS_FIRST_SIZE];
   char middle[USERS_MIDDLE_SIZE], last[USERS_LAST_SIZE];
   char fullname[USERS_FIRST_SIZE + USERS_MIDDLE_SIZE + USERS_LAST_SIZE];
-  char class[USERS_TYPE_SIZE];
+  char class[USERS_TYPE_SIZE], pin[USERS_PIN_SIZE];
   int uid, status, secure, sqlstatus, string_id;
   EXEC SQL END DECLARE SECTION;
 
@@ -318,13 +318,13 @@
   /* "ORDER BY status" so that if there's both a matching state 0 entry
      and a matching state 3 entry, we'll get the former. */
   EXEC SQL DECLARE csr_id CURSOR FOR
-    SELECT login, unix_uid, status, secure, first, middle, last, type
+    SELECT login, unix_uid, status, secure, pin, first, middle, last, type
     FROM users WHERE clearid = :id ORDER BY status;
   EXEC SQL OPEN csr_id;
   while (1)
     {
       EXEC SQL FETCH csr_id INTO :login, :uid, :status,
-	:secure, :first, :middle, :last, :class;
+	:secure, :pin, :first, :middle, :last, :class;
       if (sqlca.sqlcode)
 	break;
       strtrim(login);
@@ -332,6 +332,7 @@
       strtrim(middle);
       strtrim(last);
       strtrim(class);
+      strtrim(pin);
 
       /* Check names, allowing for the possibility that Moira and the
 	 user might have them split up differently. eg, Mary/Ann/Singleton
@@ -416,7 +417,12 @@
     }
 
   if (rc->id)
-    reply(rc, FOUND, "GETW", "c", NULL, fullname, class);
+    {
+      if (*pin != '\0')
+	reply(rc, FOUND, "GETI", "c", NULL, fullname, class);
+      else
+	reply(rc, FOUND, "GETW", "c", NULL, fullname, class);
+    }
   else if (!rc->username)
     reply(rc, FOUND, "GETL", "c", rc->suggestions, fullname, class);
   else
@@ -476,6 +482,34 @@
   if (i != 6)
     {
       reply(rc, BAD_SIX_WORDS, "GETW", "d", NULL);
+      return;
+    }
+
+  free(rc->id);
+  rc->id = NULL;
+  if (!rc->username)
+    reply(rc, NO_MESSAGE, "GETL", "c", rc->suggestions);
+  else
+    reply(rc, FORCED_USERNAME, "GETP", "c", NULL, rc->username);
+}
+
+void SPIN(reg_client *rc, int argc, char **argv)
+{
+  EXEC SQL BEGIN DECLARE SECTION;
+  char pin[USERS_PIN_SIZE];
+  EXEC SQL END DECLARE SECTION;
+
+  if (!rc->id || argc != 1)
+    {
+      reply(rc, PROTOCOL_ERROR, "INIT", "c", NULL);
+      return;
+    }
+
+  EXEC SQL SELECT pin INTO :pin FROM users WHERE clearid = :rc->id;
+  strtrim(pin);
+  if (strcmp(argv[0], pin) != 0)
+    {
+      reply(rc, BAD_PIN, "GETI", "d", NULL);
       return;
     }
 

home help back first fref pref prev next nref lref last post