/* ** ** Copyright (C) 1993 Swedish University Network (SUNET) ** ** ** This program is developed by UDAC, Uppsala University by commission ** of the Swedish University Network (SUNET). ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITTNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ** ** ** Martin.Wendel@its.uu.se ** Torbjorn.Wictorin@its.uu.se ** ** ITS ** P.O. Box 887 ** S-751 08 Uppsala ** Sweden ** */ #include "emil.h" char toqp[256] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; int encode_quoted_printable(struct message *m) { struct data *inbuf, *outbuf; static int linelen; char lastspace; char cbuf[5]; char *inb; logger(LOG_DEBUG, "encode quoted-printabel"); inbuf = m->td; /* Exit on empty input */ if (!inbuf->size) return(NOK); linelen = 0; outbuf = (struct data *)Yalloc(sizeof(struct data)); outbuf->encoding = EQP; outbuf->charset = m->td->charset; /* Initialize working pointers */ inb = inbuf->contents + inbuf->offset; lastspace = 0; /* * Process entire inbuf. */ while (inbuf->offset < inbuf->bodyend) { if (linelen > 71 && *inb != '\n') { append_data(outbuf, "=\n", 2, pz); outbuf ->lineend += 1; linelen = 0; lastspace = 0; } if (toqp[(unsigned char)*inb]) { sprintf(cbuf, "=%.2X", (unsigned char)*inb); append_data(outbuf, cbuf, 3, pz); linelen += 3; lastspace = 0; } else { if (*inb == '\n') { if (lastspace != 0) { /* Quote space before end of line */ sprintf(cbuf, "=%.2X\n", (unsigned char)lastspace); outbuf->end -= 1; outbuf->bodyend -= 1; append_data(outbuf, cbuf, 4, pz); outbuf ->lineend += 1; } else append_char(outbuf, *inb, pz); linelen = 0; } else { append_char(outbuf, *inb, pz); linelen++; } if (*inb == ' ' || *inb == '\t') lastspace = *inb; else lastspace = 0; } inb++; inbuf->offset += 1; } safe_mchange(m, outbuf); return(OK); } int decode_quoted_printable(struct message *m) { struct data *inbuf, *outbuf; char *inb; char *endpointer; char t[3]; char c; inbuf = m->td; logger(LOG_DEBUG, "decode quoted-printable"); #ifdef DEBUG if (edebug) fprintf(stderr, "decode quoted-printable at offset: %lu\n", inbuf->offset); #endif /* Exit on empty input */ if (!inbuf->size) return(NOK); /* Initialize working pointers */ inb = inbuf->contents + inbuf->offset; if (process) { outbuf = (struct data *)Yalloc(sizeof(struct data)); outbuf->encoding = E7BIT; outbuf->charset = m->td->charset; } bzero(t, 3); /* * Process entire inbuf. */ while (inbuf->offset < inbuf->bodyend) { switch (*inb) { case '\n': if (process) { append_char(outbuf, *inb, pz); outbuf->lineend += 1; } inb++; inbuf->offset += 1; break; case '=': inb++; inbuf->offset += 1; if (*inb == '\n' || (*inb == '\r' && *(inb+1) == '\n')) /* Soft line break */ { inb++; inbuf->offset += 1; if (*inb == '\r') { inb++; inbuf->offset += 1; } } else { if (inbuf->offset + 2 >= inbuf->end) return(NOK); strncpy(t, inb, 2); if ((c = (char) strtol(t, &endpointer, 16)) == 0 && endpointer == t) { /* Illegal encoding */ logger(LOG_WARNING, "WARNING: decode_quoted_printable: Illegal encoding"); return(NOK); } else { if (process) append_char(outbuf, c, pz); inb += 2; inbuf->offset += 2; } } break; default: if (process) append_char(outbuf, *inb, pz); inb++; inbuf->offset += 1; break; } } if (process) safe_mchange(m, outbuf); return(OK); }