]> andersk Git - moira.git/commitdiff
add the ability to fix signatures
authormar <mar>
Tue, 13 Jul 1993 16:46:57 +0000 (16:46 +0000)
committermar <mar>
Tue, 13 Jul 1993 16:46:57 +0000 (16:46 +0000)
regtape/verify.dc

index 6a505eeff05643674e93b2f39414c262911ce091..30e57f6860cb3ebdd2a52991e48b9bde51dd62f4 100644 (file)
@@ -12,6 +12,7 @@
 #include <des.h>
 #include <krb.h>
 #include <gdss.h>
+EXEC SQL INCLUDE sqlca;
 
 
 char *program;
@@ -19,40 +20,70 @@ char *program;
 main(argc, argv)
 int argc;
 char **argv;
-##{
-     char buf[BUFSIZ], *usercheck[100], sigbuf[256];
-     SigInfo si;
-     int status, i, wait, check, debug;
-##   char login[10], mid[32], rawsig[256], who[257];
-##   int id, timestamp;
+{
+    char buf[BUFSIZ], *usercheck[100], sigbuf[256];
+    SigInfo si;
+    int status, i, wait, check, debug, fix;
+    EXEC SQL BEGIN DECLARE SECTION;
+    char login[10], mid[32], rawsig[256], who[257];
+    int id, timestamp, sms;
+    EXEC SQL END DECLARE SECTION;
 
-     initialize_sms_error_table();
-     initialize_krb_error_table();
-     initialize_gdss_error_table();
+    initialize_sms_error_table();
+    initialize_krb_error_table();
+    initialize_gdss_error_table();
 
-     program = "sign";
-     check = debug = 0;
+    program = "sign";
+    check = debug = fix = 0;
 
-     for (i = 1; i < argc; i++) {
+    for (i = 1; i < argc; i++) {
        if (!strcmp(argv[i], "-w"))
          wait++;
        else if (!strcmp(argv[i], "-d"))
          debug++;
        else if (!strcmp(argv[i], "-D"))
          setenv("ING_SET", "set printqry");
+       else if (!strcmp(argv[i], "-fix"))
+         fix++;
        else if (argv[i][0] == '-')
-         fprintf(stderr, "Usage: %s [-w] [-D]\n", argv[0]);
+         fprintf(stderr, "Usage: %s [-w] [-D] [-fix]\n", argv[0]);
        else usercheck[check++] = argv[i];
     }
 
-##   ingres sms
-##   range of u is users
-##   range of s is strings
+    EXEC SQL CONNECT moira;
+
+    if (fix) {
+       /* Set the name of our kerberos ticket file */
+       krb_set_tkt_string("/tmp/tkt_sign");
+       status = 1;
+       while (status) {
+           printf("Authenticating as moira.extra:\n");
+           status = krb_get_pw_in_tkt("moira", "extra", "ATHENA.MIT.EDU",
+                                      "krbtgt", "ATHENA.MIT.EDU",
+                                      DEFAULT_TKT_LIFE, 0);
+           if (status != 0)
+             com_err(program, status + krb_err_base, " in krb_get_pw_in_tkt");
+       }
 
-     if (check == 0) {
-##     retrieve (login = u.#login, mid = u.mit_id, rawsig = u.signature,
-##               who = s.string, timestamp = u.sigdate)
-##           where u.signature != "" and u.sigwho = s.string_id {
+       sms = 0;
+       EXEC SQL SELECT string_id INTO :sms FROM strings 
+         WHERE string='moira.extra@ATHENA.MIT.EDU';
+       if (sms == 0) {
+           com_err(program, 0, " failed to find string moira.extra@ATHENA.MIT.EDU in database");
+           dest_tkt();
+           exit(1);
+       }
+    }
+
+    if (check == 0) {
+       EXEC SQL DECLARE c CURSOR FOR
+         SELECT login, clearid, signature, string, sigdate
+         FROM users, strings
+         WHERE signature != '' and sigwho = string_id;
+       EXEC SQL OPEN c;
+       while (1) {
+           EXEC SQL FETCH c INTO :login, :mid, :rawsig, :who, :timestamp;
+           if (sqlca.sqlcode != 0) break;
            sprintf(buf, "%s:%s", strtrim(login), strtrim(mid));
            si.timestamp = timestamp;
            si.SigInfoVersion = 0;
@@ -60,7 +91,8 @@ char **argv;
            si.rawsig = (unsigned char *) &rawsig[0];
            status = GDSS_Recompose(&si, sigbuf);
            if (status) {
-               com_err(program, gdss2et(status), "recomposing for user %s", login);
+               com_err(program, gdss2et(status), "recomposing for user %s",
+                       login);
                continue;
            }
            si.rawsig = NULL;
@@ -68,19 +100,51 @@ char **argv;
            if (status) {
                com_err(program, gdss2et(status), "verifying user %s", login);
            }
+           if (fix && status == GDSS_ET_BADSIG) {
+           again:
+               status = GDSS_Sign(buf, strlen(buf), sigbuf, &si);
+               if (status) {
+                   com_err(program, gdss2et(status), "signing data");
+                   continue;
+               }
+               status = GDSS_Verify(data, strlen(data), buf, &si);
+               if (status) {
+                   com_err(program, gdss2et(status), "verifying data");
+                   continue;
+               }
+               if (strlen(rawsig) > 68) {
+                   sleep(1);
+                   goto again;
+               }
+
+               timestamp = si.timestamp;
+               EXEC SQL REPEATED UPDATE users 
+                 SET signature = :rawsig, sigwho = :sms, sigdate = :timestamp
+                   WHERE login = :login;
+               if (sqlca.sqlcode != 0) {
+                   com_err(program, 0, "ingres error %d", sqlca.sqlcode);
+                   dest_tkt();
+                   exit(1);
+               }
+               EXEC SQL COMMIT WORK;
+           }
            if (wait) {
                printf("Next");
                fflush(stdout);
                gets(buf);
            }
-##     }
+       }
     } else {
        for (i = check - 1; i >= 0; i--) {
            strcpy(login, usercheck[i]);
-##         retrieve (mid = u.mit_id, rawsig = u.signature,
-##                   who = s.string, timestamp = u.sigdate)
-##               where u.signature != "" and u.sigwho = s.string_id 
-##                     and u.#login = login {
+           EXEC SQL DECLARE s CURSOR FOR
+             SELECT clearid, signature, string, sigdate
+             FROM users, strings
+             WHERE signature != '' and sigwho = string_id and login = :login;
+           EXEC SQL OPEN s;
+           while (1) {
+               EXEC SQL FETCH s INTO :mid, :rawsig, :who, :timestamp;
+               if (sqlca.sqlcode != 0) break;
                sprintf(buf, "%s:%s", strtrim(login), strtrim(mid));
                if (debug) {
                    printf("Verifying \"%s\"\n", buf);
@@ -104,18 +168,46 @@ char **argv;
                        hex_dump(sigbuf);
                    }
                }
+               if (fix && status == GDSS_ET_BADSIG) {
+               again:
+                   status = GDSS_Sign(buf, strlen(buf), sigbuf, &si);
+                   if (status) {
+                       com_err(program, gdss2et(status), "signing data");
+                       continue;
+                   }
+                   status = GDSS_Verify(data, strlen(data), buf, &si);
+                   if (status) {
+                       com_err(program, gdss2et(status), "verifying data");
+                       continue;
+                   }
+                   if (strlen(rawsig) > 68) {
+                       sleep(1);
+                       goto again;
+                   }
+
+                   timestamp = si.timestamp;
+                   EXEC SQL REPEATED UPDATE users 
+                     SET signature = :rawsig, sigwho = :sms, sigdate = :timestamp
+                       WHERE login = :login;
+                   if (sqlca.sqlcode != 0) {
+                       com_err(program, 0, "ingres error %d", sqlca.sqlcode);
+                       dest_tkt();
+                       exit(1);
+                   }
+                   EXEC SQL COMMIT WORK;
+               }
                if (wait) {
                    printf("Next");
                    fflush(stdout);
                    gets(buf);
                }
-##         }
+           }
        }
     }
 
-##   exit
-     exit(0);
-##}
+    dest_tkt();
+    exit(0);
+}
 
 
 hex_dump(p)
This page took 0.41904 seconds and 5 git commands to generate.