/* $Header$ * * This program will bulk sign user records in the database. */ #include #include #include #include #include #include #include #include #include #include EXEC SQL INCLUDE sqlca; char *program; main(argc, argv) int argc; char **argv; { char buf[BUFSIZ], *data, *p; struct save_queue *sq; SigInfo si; int found, status, i, wait; EXEC SQL BEGIN DECLARE SECTION; char login[10], mid[32], rawsig[256]; int id, timestamp, sms; EXEC SQL END DECLARE SECTION; program = "sign"; init_krb_err_tbl(); init_sms_err_tbl(); for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-w")) wait++; else if (!strcmp(argv[i], "-D")) setenv("ING_SET", "set printqry"); else fprintf(stderr, "Usage: %s [-w] [-D]\n", argv[0]); } /* 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"); } EXEC SQL CONNECT moira; if (sqlca.sqlcode != 0) { com_err(program, 0, "ingres error %d", sqlca.sqlcode); exit(1); } 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); } found = 0; sq = sq_create(); EXEC SQL DECLARE c CURSOR FOR SELECT users_id, login, clearid FROM users WHERE signature = ''; if (sqlca.sqlcode != 0) { com_err(program, 0, "ingres error %d", sqlca.sqlcode); exit(1); } EXEC SQL OPEN c; if (sqlca.sqlcode != 0) { com_err(program, 0, "ingres error %d", sqlca.sqlcode); exit(1); } while (1) { EXEC SQL FETCH c INTO :id, :login, :mid; if (sqlca.sqlcode != 0) break; if (login[0] == '#' || !isdigit(mid[0])) continue; sprintf(buf, "%d:%s:%s", id, strtrim(login), strtrim(mid)); sq_save_data(sq, strsave(buf)); found++; } EXEC SQL CLOSE c; EXEC SQL COMMIT WORK; printf("Found %d users to sign.\n", found); si.rawsig = (unsigned char *) &rawsig[0]; while (sq_get_data(sq, &data)) { p = index(data, ':'); if (!p) { com_err(program, 0, " malformatted data"); continue; } *p++ = 0; id = atoi(data); data = p; again: status = GDSS_Sign(data, strlen(data), buf); 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 users_id = :id; if (sqlca.sqlcode != 0) { com_err(program, 0, "ingres error %d", sqlca.sqlcode); exit(1); } EXEC SQL COMMIT WORK; if (wait) { printf("Next"); fflush(stdout); gets(buf); } } dest_tkt(); exit(0); }