|
|
1.1 ! root 1: ! 2: /* pgppager, designed to be possibly integrated with elm mail reader ! 3: * ! 4: * by Alessandro Bottonelli (c)1993, [email protected] ! 5: * version 1.0 - 29/Jan/93 ! 6: * ! 7: * This program is put in the public domain and permission is granted ! 8: * to use it for any purpose, provided this copyright notice is retained. ! 9: * NO WARRANTIES expressed or implied are given. USE THIS PROGRAM AT ! 10: * YOUR OWN RISK! ! 11: * ! 12: * This programs reads from a specified file or from stdin if no file is ! 13: * specified and creates three temporary files (header, encrypted, and ! 14: * trailer) as needed, in order to store the header portion in cleartext, ! 15: * the encrypted portion still in cypher text, and the trailer portion of ! 16: * the clear text. Then, if applicable, the cleartext header is outputted, ! 17: * the encrypted portion is piped through pgp as needed, then the trailer ! 18: * (if any) is outputted. THIS PROCESS IS TRANSPARENT TO NON PGP ENCRYPTED ! 19: * TEXTS ! 20: * ! 21: * For use with ELM, it is necessary to specify the display to be: ! 22: * ! 23: * <whatever_path>/pgppager | pg ! 24: * ! 25: * in the elm option menu. ! 26: * ! 27: */ ! 28: ! 29: #include <stdio.h> ! 30: ! 31: /* ! 32: * you may need to customize the next DEFINEs ! 33: */ ! 34: ! 35: #define PGP "/usr/local/bin/pgp -f" ! 36: #define BEGIN "-----BEGIN PGP MESSAGE---" ! 37: #define END "-----END PGP MESSAGE---" ! 38: ! 39: ! 40: #define TEMP "/usr/tmp" /* Temporary dir of your choice */ ! 41: #define CAT "cat -s" /* -s option to avoid cat complaining */ ! 42: /* about missing files */ ! 43: ! 44: /* ! 45: * program should be invoked as "pgppager [file] | pg" ! 46: * actually no check is made to verify that the program ! 47: * is piped through "pg" or "more", just in case someone ! 48: * wants to redirect it to a file or a printer. ! 49: * BEWARE: redirecting it to a file or printer may be ! 50: * not good for your security if the file or printer level ! 51: * of security is unknown or poor ... ! 52: */ ! 53: ! 54: /* ! 55: * This three variables global to be visible to the Exit() routine ! 56: */ ! 57: ! 58: char fh[128]; /* Header temporary file */ ! 59: char fe[128]; /* Encrypted temporary file */ ! 60: char fr[128]; /* Trailer temporary file */ ! 61: ! 62: main(ac,av) ! 63: int ac; ! 64: char **av; ! 65: { ! 66: FILE *fp; /* File pointer to read file(s) */ ! 67: FILE *ft; /* File pointer to temp file(s) */ ! 68: char line[256]; /* Read/Write buffer */ ! 69: char cmd[128]; /* command string */ ! 70: ! 71: ! 72: ! 73: /* ! 74: * Must be invoked as "pgppager [file_name]" ! 75: */ ! 76: ! 77: if ( ac > 2 ) ! 78: { ! 79: fprintf(stderr,"Usage: %s [file_name]\n", av[0]); ! 80: Exit(1); ! 81: } ! 82: ! 83: /* ! 84: * File ( if specified ) must exist and be readable ! 85: */ ! 86: ! 87: if ( ac == 2 ) ! 88: { ! 89: if ( ( fp = fopen( av[1], "r") ) == NULL ) ! 90: { ! 91: fprintf(stderr,"%s: cannot read %s\n", av[0], av[1]); ! 92: Exit(2); ! 93: } ! 94: } ! 95: else ! 96: fp=stdin; /* if no file specified assume standard input */ ! 97: ! 98: /* ! 99: * Build temporary file names ! 100: * ! 101: * please note how, as files are created for writing, they are ! 102: * also chmod(ed) to 0600. I expect most PGP users to have their ! 103: * umask set to 077, but just to be on the safe side ... :-) ! 104: */ ! 105: ! 106: sprintf ( fh, "%s/pgpm.head.%d", TEMP, (int )getpid() ); ! 107: sprintf ( fe, "%s/pgpm.encr.%d", TEMP, (int )getpid() ); ! 108: sprintf ( fr, "%s/pgpm.trai.%d", TEMP, (int )getpid() ); ! 109: ! 110: ! 111: /* ! 112: * READ file until Eof, redirect to "fe" only those portions of the ! 113: * file that are between the BEGIN PGP and END PGP MESSAGE lines. ! 114: */ ! 115: if ( ( ft = fopen ( fh, "w") ) == NULL ) ! 116: { ! 117: fprintf(stderr,"%s: error opening temp file\n", av[0]); ! 118: Exit(4); ! 119: } ! 120: ! 121: if ( (int )chmod( fh, 0600) != 0 ) ! 122: { ! 123: fprintf(stderr,"%s: cannot chmod temp file\n", av[0]); ! 124: Exit(5); ! 125: } ! 126: ! 127: fprintf( ft, "\n"); /* Just to start with a blank line */ ! 128: ! 129: while ( fgets( line, 128, fp) != NULL ) ! 130: { ! 131: if ( !strncmp( BEGIN, line, strlen( BEGIN) )) ! 132: { ! 133: fprintf(ft, "\n===pgp encrypted message begins===\n"); ! 134: fclose(ft); ! 135: ! 136: if ( ( ft = fopen ( fe, "w") ) == NULL ) ! 137: { ! 138: fprintf(stderr,"%s: error opening temp file\n", av[0]); ! 139: Exit(4); ! 140: } ! 141: ! 142: if ( (int )chmod( fe, 0600) != 0 ) ! 143: { ! 144: fprintf(stderr,"%s: cannot chmod temp file\n", av[0]); ! 145: Exit(5); ! 146: } ! 147: } ! 148: ! 149: fprintf( ft, "%s", line); ! 150: ! 151: if ( !strncmp( END, line, strlen( END) )) ! 152: { ! 153: fclose(ft); ! 154: ! 155: if ( ( ft = fopen ( fr, "w") ) == NULL ) ! 156: { ! 157: fprintf(stderr,"%s: error opening temp file\n", av[0]); ! 158: Exit(4); ! 159: } ! 160: ! 161: if ( (int )chmod( fr, 0600) != 0 ) ! 162: { ! 163: fprintf(stderr,"%s: cannot chmod temp file\n", av[0]); ! 164: Exit(5); ! 165: } ! 166: ! 167: fprintf(ft, "\n===pgp encrypted message ends===\n"); ! 168: } ! 169: } ! 170: ! 171: fclose(fp); ! 172: fclose(ft); ! 173: ! 174: sprintf( cmd, "%s %s", CAT, fh); ! 175: system(cmd); ! 176: sprintf( cmd, "%s %s | %s", CAT, fe, PGP); ! 177: system(cmd); ! 178: sprintf( cmd, "%s %s", CAT, fr); ! 179: system(cmd); ! 180: ! 181: Exit(0); /* That's all folks ... */ ! 182: } ! 183: ! 184: /* ! 185: * Exit(s) are centralized in this routine to make sure we wipe out ! 186: * temporary files in any case ... ! 187: */ ! 188: ! 189: Exit(n) ! 190: int n; /* value to be returned to the shell (0 = OK) */ ! 191: { ! 192: /* ! 193: * Remove temporary files (if any) ! 194: * and sync() just for the sake of it ! 195: */ ! 196: ! 197: unlink(fh); ! 198: unlink(fe); ! 199: unlink(fr); ! 200: sync(); ! 201: ! 202: exit(n); ! 203: } ! 204:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.