| 6 |
details. |
details. |
| 7 |
|
|
| 8 |
Process Cypherpunk remailer messages |
Process Cypherpunk remailer messages |
| 9 |
$Id: rem1.c,v 1.7 2002/09/18 23:26:17 rabbi Exp $ */ |
$Id: rem1.c,v 1.9 2003/04/29 12:03:32 weaselp Exp $ */ |
| 10 |
|
|
| 11 |
|
|
| 12 |
#include "mix3.h" |
#include "mix3.h" |
| 13 |
#include <ctype.h> |
#include <ctype.h> |
| 14 |
#include <time.h> |
#include <time.h> |
| 15 |
#include <string.h> |
#include <string.h> |
| 16 |
|
#include <assert.h> |
| 17 |
|
#include <stdlib.h> |
| 18 |
|
|
| 19 |
static int t1msg(BUFFER *in, int hdr); |
static int t1msg(BUFFER *in, int hdr); |
| 20 |
|
|
| 90 |
return (num); |
return (num); |
| 91 |
} |
} |
| 92 |
|
|
| 93 |
|
static int readdate(BUFFER *b) |
| 94 |
|
{ |
| 95 |
|
int num = -1; |
| 96 |
|
|
| 97 |
|
if (b->length > 0) |
| 98 |
|
num = parsedate(b->data); |
| 99 |
|
return (num); |
| 100 |
|
} |
| 101 |
|
|
| 102 |
|
static int reached_maxcount(BUFFER *md, int maxcount) |
| 103 |
|
{ |
| 104 |
|
FILE *f; |
| 105 |
|
char temp[LINELEN]; |
| 106 |
|
int count = 0; |
| 107 |
|
int err = 0; |
| 108 |
|
long then; |
| 109 |
|
time_t now = time(NULL); |
| 110 |
|
|
| 111 |
|
assert(md->length > 0); |
| 112 |
|
|
| 113 |
|
encode(md, 0); |
| 114 |
|
|
| 115 |
|
f = mix_openfile(PGPMAXCOUNT, "a+"); /* create file if it does not exist */ |
| 116 |
|
fseek(f,0,SEEK_SET); |
| 117 |
|
if (f == NULL) { |
| 118 |
|
errlog(ERRORMSG, "Can't open %s!\n", PGPMAXCOUNT); |
| 119 |
|
return (-1); |
| 120 |
|
} |
| 121 |
|
lock(f); |
| 122 |
|
while (fgets(temp, sizeof(temp), f) != NULL) |
| 123 |
|
if (sscanf(temp, "%ld", &then) && |
| 124 |
|
(then >= now - SECONDSPERDAY) && |
| 125 |
|
strstr (temp, md->data)) |
| 126 |
|
count++; |
| 127 |
|
|
| 128 |
|
if (count > maxcount) |
| 129 |
|
err = 1; |
| 130 |
|
else |
| 131 |
|
fprintf(f, "%ld %s\n", (long) time(NULL), md->data); |
| 132 |
|
|
| 133 |
|
unlock(f); |
| 134 |
|
fclose(f); |
| 135 |
|
return (err); |
| 136 |
|
} |
| 137 |
|
|
| 138 |
static int t1msg(BUFFER *in, int hdr) |
static int t1msg(BUFFER *in, int hdr) |
| 139 |
/* hdr = 1: mail header, hdr = 2: pasted header, hdr = 0: ignore */ |
/* hdr = 1: mail header, hdr = 2: pasted header, hdr = 0: ignore */ |
| 140 |
{ |
{ |
| 142 |
BUFFER *cutmarks, *to, *newsgroups, *ek, *ekdes, *ekcast, *esub, *subject; |
BUFFER *cutmarks, *to, *newsgroups, *ek, *ekdes, *ekcast, *esub, *subject; |
| 143 |
BUFFER *temp, *header, *out; |
BUFFER *temp, *header, *out; |
| 144 |
BUFFER *test, *testto, *remixto; |
BUFFER *test, *testto, *remixto; |
| 145 |
|
BUFFER *digest; |
| 146 |
int err = 0; |
int err = 0; |
| 147 |
int encrypted = 0; |
int encrypted = 0; |
| 148 |
int type = -1; |
int type = -1; |
| 149 |
int latent = 0; |
int latent = 0; |
| 150 |
int remix = 0, repgp = 0; |
int remix = 0, repgp = 0; |
| 151 |
int inflate = 0; |
int inflate = 0; |
| 152 |
|
int maxsize = -1; |
| 153 |
|
int maxcount = -1; |
| 154 |
|
int maxdate = -2; /* -2 not used, -1 parse error */ |
| 155 |
|
|
| 156 |
field = buf_new(); |
field = buf_new(); |
| 157 |
content = buf_new(); |
content = buf_new(); |
| 170 |
out = buf_new(); |
out = buf_new(); |
| 171 |
test = buf_new(); |
test = buf_new(); |
| 172 |
testto = buf_new(); |
testto = buf_new(); |
| 173 |
|
digest = buf_new(); |
| 174 |
|
|
| 175 |
if (REMIX == 1) |
if (REMIX == 1) |
| 176 |
remix = 2; |
remix = 2; |
| 270 |
buf_appendc(remixto, ','); |
buf_appendc(remixto, ','); |
| 271 |
buf_cat(remixto, temp); |
buf_cat(remixto, temp); |
| 272 |
} |
} |
| 273 |
} |
} else if (bufieq(field, "max-size") || bufieq(field, "maxsize")) |
| 274 |
|
maxsize = readnum(content, 1024); |
| 275 |
|
else if (bufieq(field, "max-count") || bufieq(field, "maxcount")) |
| 276 |
|
maxcount = readnum(content, 1); |
| 277 |
|
else if (bufieq(field, "max-date") || bufieq(field, "maxdate")) |
| 278 |
|
maxdate = readdate(content); |
| 279 |
#if USE_NSUB |
#if USE_NSUB |
| 280 |
else if (bufieq(field, "subject")) |
else if (bufieq(field, "subject")) |
| 281 |
buf_set(subject, content); |
buf_set(subject, content); |
| 310 |
err = pgp_dearmor(in, temp); |
err = pgp_dearmor(in, temp); |
| 311 |
if (err == 0) { |
if (err == 0) { |
| 312 |
BUFFER *pass; |
BUFFER *pass; |
| 313 |
|
digest_sha1(temp, digest); |
| 314 |
|
|
| 315 |
pass = buf_new(); |
pass = buf_new(); |
| 316 |
buf_sets(pass, PASSPHRASE); |
buf_sets(pass, PASSPHRASE); |
| 365 |
err = -2; |
err = -2; |
| 366 |
goto end; |
goto end; |
| 367 |
} |
} |
| 368 |
|
if (maxdate == -1) { |
| 369 |
|
if (testto->length == 0) |
| 370 |
|
errlog(LOG, "Could not parse Max-Date: header.\n"); |
| 371 |
|
buf_appends(test, "Could not parse Max-Date: header.\n"); |
| 372 |
|
err = -2; |
| 373 |
|
goto end; |
| 374 |
|
} else if (maxdate >= 0 && maxdate <= time(NULL)) { |
| 375 |
|
if (testto->length == 0) |
| 376 |
|
errlog(LOG, "Message is expired.\n"); |
| 377 |
|
buf_appends(test, "Message is expired.\n"); |
| 378 |
|
err = -2; |
| 379 |
|
goto end; |
| 380 |
|
} |
| 381 |
|
if (maxsize >= 0 && in->length >= maxsize) { |
| 382 |
|
if (testto->length == 0) |
| 383 |
|
errlog(LOG, "Message Size exceeds Max-Size.\n"); |
| 384 |
|
buf_appends(test, "Message Size exceeds Max-Size.\n"); |
| 385 |
|
err = -2; |
| 386 |
|
goto end; |
| 387 |
|
} |
| 388 |
|
if (maxcount >= 0) { |
| 389 |
|
if (digest->length == 0) { |
| 390 |
|
if (testto->length == 0) |
| 391 |
|
errlog(LOG, "Max-Count yet not encrypted.\n"); |
| 392 |
|
buf_appends(test, "Max-Count yet not encrypted.\n"); |
| 393 |
|
err = -2; |
| 394 |
|
goto end; |
| 395 |
|
} |
| 396 |
|
if (reached_maxcount(digest, maxcount)) { |
| 397 |
|
if (testto->length == 0) |
| 398 |
|
errlog(LOG, "Max-Count reached - discarding message.\n"); |
| 399 |
|
buf_appends(test, "Max-Count reached - discarding message.\n"); |
| 400 |
|
err = -2; |
| 401 |
|
goto end; |
| 402 |
|
} |
| 403 |
|
} |
| 404 |
|
|
| 405 |
if (type == MSG_POST && subject->length == 0) |
if (type == MSG_POST && subject->length == 0) |
| 406 |
buf_sets(subject, "(no subject)"); |
buf_sets(subject, "(no subject)"); |
| 407 |
|
|
| 544 |
remix = 0; |
remix = 0; |
| 545 |
if (remix && remixto->length == 0) |
if (remix && remixto->length == 0) |
| 546 |
buf_set(remixto, to); |
buf_set(remixto, to); |
| 547 |
if (remix && !repgp) |
if (remix && !repgp && remixto->length != 0) |
| 548 |
err = mix_encrypt(type, out, remixto->data, 1, line); |
err = mix_encrypt(type, out, remixto->data, 1, line); |
| 549 |
if (err != 0) { |
if (err != 0) { |
| 550 |
if (remix == 1 && !repgp) |
if (remix == 1 && !repgp) |
| 577 |
buf_free(header); |
buf_free(header); |
| 578 |
buf_free(test); |
buf_free(test); |
| 579 |
buf_free(testto); |
buf_free(testto); |
| 580 |
|
buf_free(digest); |
| 581 |
return (err); |
return (err); |
| 582 |
} |
} |