]> andersk Git - moira.git/blob - regtape/sign.pc
oops. we were filtering out lincoln labs in two different places
[moira.git] / regtape / sign.pc
1 /* $Header$
2  *
3  * This program will bulk sign user records in the database.
4  */
5
6 #include <stdio.h>
7 #include <string.h>
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>
16 EXEC SQL INCLUDE sqlca;
17
18
19 char *program;
20
21 main(argc, argv)
22 int argc;
23 char **argv;
24 {
25      char buf[BUFSIZ], *data, *p;
26      struct save_queue *sq;
27      SigInfo si;
28      int found, status, i, wait;
29      EXEC SQL BEGIN DECLARE SECTION;
30      char login[10], mid[32], rawsig[256], *db="moira";
31      int id, timestamp, sms;
32      EXEC SQL END DECLARE SECTION;
33
34      program = "sign";
35      init_krb_err_tbl();
36      init_sms_err_tbl();
37      initialize_gdss_error_table();
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
60      EXEC SQL CONNECT :db IDENTIFIED BY :db;
61      if (sqlca.sqlcode != 0) {
62          com_err(program, 0, "dbms error %d", sqlca.sqlcode);
63          exit(1);
64      }
65
66      sms = 0;
67      EXEC SQL SELECT string_id INTO :sms FROM strings 
68        WHERE string='moira.extra@ATHENA.MIT.EDU';
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
78      EXEC SQL DECLARE c CURSOR FOR
79        SELECT users_id, login, clearid
80        FROM users WHERE signature = CHR(0);
81      if (sqlca.sqlcode != 0) {
82          com_err(program, 0, "dbms error %d", sqlca.sqlcode);
83          exit(1);
84      }
85      EXEC SQL OPEN c;
86      if (sqlca.sqlcode != 0) {
87          com_err(program, 0, "dbms error %d", sqlca.sqlcode);
88          exit(1);
89      }
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      }
99      EXEC SQL CLOSE c;
100      EXEC SQL COMMIT WORK;
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)) {
106          p = strchr(data, ':');
107          if (!p) {
108              com_err(program, 0, " malformatted data");
109              continue;
110          }
111          *p++ = 0;
112          id = atoi(data);
113          data = p;
114      again:
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          }
125          if (strlen(rawsig) > 68) {
126              sleep(1);
127              goto again;
128          }
129
130          timestamp = si.timestamp;
131          EXEC SQL UPDATE users 
132            SET signature = :rawsig, sigwho = :sms, sigdate = :timestamp
133            WHERE users_id = :id;
134          if (sqlca.sqlcode != 0) {
135              com_err(program, 0, "dbms error %d", sqlca.sqlcode);
136              exit(1);
137          }
138          EXEC SQL COMMIT WORK;
139          if (wait) {
140              printf("Next");
141              fflush(stdout);
142              gets(buf);
143          }
144      }
145      dest_tkt();
146      exit(0);
147 }
This page took 1.40596 seconds and 5 git commands to generate.