1*11788Ssam #ifndef lint 2*11788Ssam static char sccsid[] = "@(#)xget.c 4.1 03/30/83"; 3*11788Ssam #endif 4*11788Ssam 5*11788Ssam #include "xmail.h" 6*11788Ssam #include "sys/types.h" 7*11788Ssam #include "sys/dir.h" 8*11788Ssam #include "ctype.h" 9*11788Ssam #include "pwd.h" 10*11788Ssam #include "sys/stat.h" 11*11788Ssam char *myname; 12*11788Ssam int uid; 13*11788Ssam struct direct dbuf; 14*11788Ssam char *maildir = "/usr/spool/secretmail/"; 15*11788Ssam FILE *kf, *mf, *df; 16*11788Ssam MINT *x, *b, *one, *t45, *z, *q, *r; 17*11788Ssam MINT *two, *t15, *mbuf; 18*11788Ssam char buf[256], line[128]; 19*11788Ssam #define MXF 100 20*11788Ssam int fnum[MXF], fcnt; 21*11788Ssam struct stat stbuf; 22*11788Ssam main() 23*11788Ssam { int i; 24*11788Ssam char *p; 25*11788Ssam uid = getuid(); 26*11788Ssam myname = getlogin(); 27*11788Ssam if(myname == NULL) 28*11788Ssam myname = getpwuid(uid)->pw_name; 29*11788Ssam comminit(); 30*11788Ssam mbuf = itom(0); 31*11788Ssam files(); 32*11788Ssam setup(getpass("Key: ")); 33*11788Ssam mkb(); 34*11788Ssam mkx(); 35*11788Ssam #ifndef debug 36*11788Ssam invert(x, b, x); 37*11788Ssam #else 38*11788Ssam invert(x, b, z); 39*11788Ssam mult(x, z, z); 40*11788Ssam mdiv(z, b, q, z); 41*11788Ssam omout(z); 42*11788Ssam invert(x, b, x); 43*11788Ssam #endif 44*11788Ssam for(i=0; i<fcnt; i++) 45*11788Ssam { sprintf(line, "%s%s.%d", maildir, myname, fnum[i]); 46*11788Ssam if(stat(line, &stbuf)<0) 47*11788Ssam { perror(line); 48*11788Ssam continue; 49*11788Ssam } 50*11788Ssam if(stbuf.st_size == 0) 51*11788Ssam { printf("zero length mail file\n"); 52*11788Ssam unlink(line); 53*11788Ssam continue; 54*11788Ssam } 55*11788Ssam if((mf = fopen(line, "r"))==NULL) 56*11788Ssam { perror(line); 57*11788Ssam continue; 58*11788Ssam } 59*11788Ssam decipher(mf, stdout); 60*11788Ssam cmnd: 61*11788Ssam printf("? "); 62*11788Ssam fgets(buf, sizeof(buf), stdin); 63*11788Ssam if(feof(stdin)) exit(0); 64*11788Ssam switch(buf[0]) 65*11788Ssam { 66*11788Ssam case 'q': 67*11788Ssam exit(0); 68*11788Ssam case 'n': 69*11788Ssam case 'd': 70*11788Ssam case '\n': 71*11788Ssam unlink(line); 72*11788Ssam fclose(mf); 73*11788Ssam break; 74*11788Ssam case '!': 75*11788Ssam system(buf+1); 76*11788Ssam printf("!\n"); 77*11788Ssam goto cmnd; 78*11788Ssam case 's': 79*11788Ssam case 'w': 80*11788Ssam rewind(mf); 81*11788Ssam if(buf[1] == '\n' || buf[1] == '\0') 82*11788Ssam strcpy(buf, "s mbox\n"); 83*11788Ssam for(p=buf; !isspace(*p); p++); 84*11788Ssam for(; isspace(*p); p++); 85*11788Ssam p[strlen(p)-1] = 0; 86*11788Ssam kf = fopen(p, "a"); 87*11788Ssam if(kf == NULL) 88*11788Ssam { perror(p); 89*11788Ssam break; 90*11788Ssam } 91*11788Ssam decipher(mf, kf); 92*11788Ssam fclose(mf); 93*11788Ssam fclose(kf); 94*11788Ssam unlink(line); 95*11788Ssam break; 96*11788Ssam } 97*11788Ssam } 98*11788Ssam exit(0); 99*11788Ssam } 100*11788Ssam icmp(a, b) int *a, *b; 101*11788Ssam { 102*11788Ssam return(*a - *b); 103*11788Ssam } 104*11788Ssam files() 105*11788Ssam { int i; 106*11788Ssam if((df = fopen(maildir, "r")) == NULL) 107*11788Ssam { perror(maildir); 108*11788Ssam exit(1); 109*11788Ssam } 110*11788Ssam strcpy(line, myname); 111*11788Ssam strcat(line, ".%d"); 112*11788Ssam for(; !feof(df);) 113*11788Ssam { fread(&dbuf, sizeof(dbuf), 1, df); 114*11788Ssam if(feof(df)) break; 115*11788Ssam if(dbuf.d_ino == 0) continue; 116*11788Ssam if(sscanf(dbuf.d_name, line, &i) != 1) 117*11788Ssam continue; 118*11788Ssam if(fcnt >= MXF) 119*11788Ssam break; 120*11788Ssam fnum[fcnt++] = i; 121*11788Ssam } 122*11788Ssam if(fcnt == 0) 123*11788Ssam { printf("no secret mail\n"); 124*11788Ssam exit(0); 125*11788Ssam } 126*11788Ssam qsort(fnum, fcnt, sizeof(int), icmp); 127*11788Ssam } 128*11788Ssam decipher(u, w) FILE *u, *w; 129*11788Ssam { int i; 130*11788Ssam short a; 131*11788Ssam for(;;) 132*11788Ssam { nin(mbuf, u); 133*11788Ssam if(feof(u)) break; 134*11788Ssam mult(mbuf, x, mbuf); 135*11788Ssam mdiv(mbuf, b, q, mbuf); 136*11788Ssam for(i=1; i<=3; i++) 137*11788Ssam { a = mbuf->val[i]; 138*11788Ssam putc(a&0177, w); 139*11788Ssam a >>= 8; 140*11788Ssam putc(a&0177, w); 141*11788Ssam } 142*11788Ssam } 143*11788Ssam } 144