]> andersk Git - moira.git/blame - regtape/sign.pc
minor bugfix to previous commit
[moira.git] / regtape / sign.pc
CommitLineData
0138e073 1/* $Header$
2 *
3 * This program will bulk sign user records in the database.
4 */
5
6#include <stdio.h>
9f5e5c05 7#include <string.h>
0138e073 8#include <ctype.h>
9#include <sys/time.h>
10#include <moira.h>
11#include <moira_site.h>
12#include <des.h>
13#include <krb.h>
14#include <krb_err.h>
15#include <gdss.h>
02cd9ede 16EXEC SQL INCLUDE sqlca;
0138e073 17
18
19char *program;
20
21main(argc, argv)
22int argc;
23char **argv;
02cd9ede 24{
0138e073 25 char buf[BUFSIZ], *data, *p;
26 struct save_queue *sq;
27 SigInfo si;
28 int found, status, i, wait;
02cd9ede 29 EXEC SQL BEGIN DECLARE SECTION;
9f5e5c05 30 char login[10], mid[32], rawsig[256], *db="moira";
02cd9ede 31 int id, timestamp, sms;
32 EXEC SQL END DECLARE SECTION;
0138e073 33
34 program = "sign";
35 init_krb_err_tbl();
36 init_sms_err_tbl();
7ee9aacd 37 initialize_gdss_error_table();
0138e073 38
39 for (i = 1; i < argc; i++) {
40 if (!strcmp(argv[i], "-w"))
41 wait++;
42 else if (!strcmp(argv[i], "-D"))
43 setenv("ING_SET", "set printqry");
44 else
45 fprintf(stderr, "Usage: %s [-w] [-D]\n", argv[0]);
46 }
47
48 /* Set the name of our kerberos ticket file */
49 krb_set_tkt_string("/tmp/tkt_sign");
50 status = 1;
51 while (status) {
52 printf("Authenticating as moira.extra:\n");
53 status = krb_get_pw_in_tkt("moira", "extra", "ATHENA.MIT.EDU",
54 "krbtgt", "ATHENA.MIT.EDU",
55 DEFAULT_TKT_LIFE, 0);
56 if (status != 0)
57 com_err(program, status + krb_err_base, " in krb_get_pw_in_tkt");
58 }
59
9f5e5c05 60 EXEC SQL CONNECT :db IDENTIFIED BY :db;
53308ec2 61 if (sqlca.sqlcode != 0) {
9f5e5c05 62 com_err(program, 0, "dbms error %d", sqlca.sqlcode);
53308ec2 63 exit(1);
64 }
0138e073 65
66 sms = 0;
02cd9ede 67 EXEC SQL SELECT string_id INTO :sms FROM strings
68 WHERE string='moira.extra@ATHENA.MIT.EDU';
0138e073 69 if (sms == 0) {
70 com_err(program, 0, " failed to find string moira.extra@ATHENA.MIT.EDU in database");
71 dest_tkt();
72 exit(1);
73 }
74
75 found = 0;
76 sq = sq_create();
77
02cd9ede 78 EXEC SQL DECLARE c CURSOR FOR
79 SELECT users_id, login, clearid
7ee9aacd 80 FROM users WHERE signature = CHR(0);
53308ec2 81 if (sqlca.sqlcode != 0) {
9f5e5c05 82 com_err(program, 0, "dbms error %d", sqlca.sqlcode);
53308ec2 83 exit(1);
84 }
02cd9ede 85 EXEC SQL OPEN c;
53308ec2 86 if (sqlca.sqlcode != 0) {
9f5e5c05 87 com_err(program, 0, "dbms error %d", sqlca.sqlcode);
53308ec2 88 exit(1);
89 }
02cd9ede 90 while (1) {
91 EXEC SQL FETCH c INTO :id, :login, :mid;
92 if (sqlca.sqlcode != 0) break;
93 if (login[0] == '#' || !isdigit(mid[0]))
94 continue;
95 sprintf(buf, "%d:%s:%s", id, strtrim(login), strtrim(mid));
96 sq_save_data(sq, strsave(buf));
97 found++;
98 }
53308ec2 99 EXEC SQL CLOSE c;
100 EXEC SQL COMMIT WORK;
0138e073 101 printf("Found %d users to sign.\n", found);
102
103 si.rawsig = (unsigned char *) &rawsig[0];
104
105 while (sq_get_data(sq, &data)) {
9f5e5c05 106 p = strchr(data, ':');
0138e073 107 if (!p) {
108 com_err(program, 0, " malformatted data");
109 continue;
110 }
111 *p++ = 0;
112 id = atoi(data);
113 data = p;
02cd9ede 114 again:
0138e073 115 status = GDSS_Sign(data, strlen(data), buf);
116 if (status) {
117 com_err(program, gdss2et(status), "signing data");
118 continue;
119 }
120 status = GDSS_Verify(data, strlen(data), buf, &si);
121 if (status) {
122 com_err(program, gdss2et(status), "verifying data");
123 continue;
124 }
02cd9ede 125 if (strlen(rawsig) > 68) {
126 sleep(1);
127 goto again;
128 }
0138e073 129
130 timestamp = si.timestamp;
9f5e5c05 131 EXEC SQL UPDATE users
02cd9ede 132 SET signature = :rawsig, sigwho = :sms, sigdate = :timestamp
133 WHERE users_id = :id;
53308ec2 134 if (sqlca.sqlcode != 0) {
9f5e5c05 135 com_err(program, 0, "dbms error %d", sqlca.sqlcode);
53308ec2 136 exit(1);
137 }
138 EXEC SQL COMMIT WORK;
0138e073 139 if (wait) {
140 printf("Next");
141 fflush(stdout);
142 gets(buf);
143 }
144 }
145 dest_tkt();
0138e073 146 exit(0);
02cd9ede 147}
This page took 0.923064 seconds and 5 git commands to generate.