3 * This program will bulk sign user records in the database.
5 * Copyright (C) 1992-1998 by the Massachusetts Institute of Technology
6 * For copying and distribution information, please see the file
10 #include <mit-copyright.h>
12 #include <moira_site.h>
13 #include <moira_schema.h>
24 EXEC SQL INCLUDE sqlca;
30 int main(int argc, char **argv)
32 char buf[BUFSIZ], *data, *p;
33 struct save_queue *sq;
35 int found, status, i, wait;
36 EXEC SQL BEGIN DECLARE SECTION;
37 char login[USERS_LOGIN_SIZE], mid[USERS_CLEARID_SIZE];
38 char rawsig[512], *db = "moira";
39 int id, timestamp, sms;
40 EXEC SQL END DECLARE SECTION;
45 initialize_gdss_error_table();
47 for (i = 1; i < argc; i++)
49 if (!strcmp(argv[i], "-w"))
52 fprintf(stderr, "Usage: %s [-w] [-D]\n", argv[0]);
55 /* Set the name of our kerberos ticket file */
56 krb_set_tkt_string("/tmp/tkt_sign");
60 printf("Authenticating as moira.extra:\n");
61 status = krb_get_pw_in_tkt("moira", "extra", "ATHENA.MIT.EDU",
62 "krbtgt", "ATHENA.MIT.EDU",
65 com_err(program, status + krb_err_base, " in krb_get_pw_in_tkt");
68 EXEC SQL CONNECT :db IDENTIFIED BY :db;
71 com_err(program, 0, "dbms error %d", sqlca.sqlcode);
76 EXEC SQL SELECT string_id INTO :sms FROM strings
77 WHERE string = 'moira.extra@ATHENA.MIT.EDU';
80 com_err(program, 0, " failed to find string moira.extra@ATHENA.MIT.EDU "
89 EXEC SQL DECLARE c CURSOR FOR
90 SELECT users_id, login, clearid
91 FROM users WHERE signature = CHR(0);
94 com_err(program, 0, "dbms error %d", sqlca.sqlcode);
100 com_err(program, 0, "dbms error %d", sqlca.sqlcode);
105 EXEC SQL FETCH c INTO :id, :login, :mid;
108 if (login[0] == '#' || !isdigit(mid[0]))
110 sprintf(buf, "%d:%s:%s", id, strtrim(login), strtrim(mid));
111 sq_save_data(sq, strdup(buf));
115 EXEC SQL COMMIT WORK;
116 printf("Found %d users to sign.\n", found);
118 si.rawsig = (unsigned char *) &rawsig[0];
120 while (sq_get_data(sq, &data))
122 p = strchr(data, ':');
125 com_err(program, 0, " malformatted data");
132 status = GDSS_Sign(data, strlen(data), buf);
135 com_err(program, gdss2et(status), "signing data");
138 status = GDSS_Verify(data, strlen(data), buf, &si);
141 com_err(program, gdss2et(status), "verifying data");
144 if (strlen(rawsig) > 68)
150 timestamp = si.timestamp;
151 EXEC SQL UPDATE users
152 SET signature = :rawsig, sigwho = :sms, sigdate = :timestamp
153 WHERE users_id = :id;
156 com_err(program, 0, "dbms error %d", sqlca.sqlcode);
159 EXEC SQL COMMIT WORK;