[1930] in Moira
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;
}