1: #ifndef lint 2: static char sccsid[] = "@(#)xsend.c 4.5 2/14/84"; 3: #endif 4: 5: #include "xmail.h" 6: #include <sys/types.h> 7: #include <pwd.h> 8: #include <sys/stat.h> 9: #include <sys/dir.h> 10: extern int errno; 11: struct stat stbuf; 12: int uid, destuid; 13: char *myname, *dest, *keyfile[128], line[128]; 14: struct direct *dbuf; 15: char *maildir = "/usr/spool/secretmail/"; 16: FILE *kf, *mf; 17: DIR *df; 18: MINT *a[42], *cd[6][128]; 19: MINT *msg; 20: char buf[256], eof; 21: int dbg; 22: extern char *malloc(), *getlogin(); 23: 24: main(argc, argv) char **argv; 25: { int i, nmax, len; 26: char *p; 27: long now; 28: if(argc != 2) 29: xfatal("mail to exactly one person"); 30: uid = getuid(); 31: p =getlogin(); 32: if(p == NULL) 33: p = getpwuid(uid)->pw_name; 34: myname = malloc(strlen(p)+1); 35: strcpy(myname, p); 36: dest = argv[1]; 37: strcpy(keyfile, maildir); 38: strcat(keyfile, dest); 39: strcat(keyfile, ".key"); 40: if(stat(keyfile, &stbuf) <0) 41: xfatal("addressee not enrolled"); 42: destuid = getpwnam(dest)->pw_uid; 43: if(destuid != stbuf.st_uid) 44: fprintf(stderr, "warning: addressee's key file may be subverted\n"); 45: errno = 0; 46: kf = fopen(keyfile, "r"); 47: if(kf == NULL) 48: xfatal("addressee's key weird"); 49: df = opendir(maildir); 50: if(df == NULL) 51: { perror(maildir); 52: exit(1); 53: } 54: strcpy(line, dest); 55: strcat(line, ".%d"); 56: nmax = -1; 57: while ((dbuf=readdir(df))!=NULL) 58: { if(sscanf(dbuf->d_name, line, &i) != 1) 59: continue; 60: if(i>nmax) nmax = i; 61: } 62: nmax ++; 63: for(i=0; i<10; i++) 64: { sprintf(line, "%s%s.%d", maildir, dest, nmax+i); 65: if(creat(line, 0666) >= 0) break; 66: } 67: if(i==10) xfatal("cannot create mail file"); 68: mf = fopen(line, "w"); 69: init(); 70: time(&now); 71: sprintf(buf, "From %s %s", myname, ctime(&now) ); 72: #ifdef DBG 73: dbg = 1; 74: #endif 75: run(); 76: { 77: char hostname[32]; 78: FILE *nf, *popen(); 79: struct passwd *passp; 80: 81: sprintf(buf, "/bin/mail %s", dest); 82: if ((nf = popen(buf, "w")) == NULL) 83: xfatal("cannot pipe to /bin/mail"); 84: passp = getpwuid(getuid()); 85: if (passp == 0){ 86: pclose(nf); 87: xfatal("Who are you?"); 88: } 89: gethostname(hostname, sizeof(hostname)); 90: fprintf(nf, "Subject: %s@%s sent you secret mail\n", 91: passp->pw_name, hostname); 92: fprintf(nf, 93: "Your secret mail can be read on host %s using ``xget''.\n", 94: hostname); 95: pclose(nf); 96: } 97: exit(0); 98: } 99: mkcd() 100: { int i, j, k, n; 101: for(i=0; i<42; i++) 102: nin(a[i], kf); 103: fclose(kf); 104: for(i=0; i<6; i++) 105: for(j=0; j<128; j++) 106: for(k=j, n=0; k>0 && n<7; n++, k>>=1) 107: if(k&01) madd(cd[i][j], a[7*i+n], cd[i][j]); 108: } 109: encipher(s) char s[6]; 110: { int i; 111: msub(msg, msg, msg); 112: for(i=0; i<6; i++) 113: madd(msg, cd[i][s[i]&0177], msg); 114: } 115: init() 116: { int i, j; 117: msg = itom(0); 118: for(i=0; i<42; i++) 119: a[i] = itom(0); 120: for(i=0; i<6; i++) 121: for(j=0; j<128; j++) 122: cd[i][j] = itom(0); 123: mkcd(); 124: } 125: run() 126: { char *p; 127: int i, len, eof = 0; 128: for(;;) 129: { len = strlen(buf); 130: for(i=0; i<len/6; i++) 131: { 132: encipher(buf+6*i); 133: nout(msg, mf); 134: } 135: p = buf; 136: for(i *= 6; i<len; i++) 137: *p++ = buf[i]; 138: if(eof) return; 139: fgets(p, sizeof(buf)-6, stdin); 140: if(strcmp(p, ".\n") == 0 || feof(stdin)) 141: { for(i=0; i<6; i++) *p++ = ' '; 142: *p = 0; 143: eof = 1; 144: } 145: } 146: }