diff options
| -rw-r--r-- | qmail-smtpd.c | 57 | ||||
| -rw-r--r-- | received.c | 31 | ||||
| -rw-r--r-- | received.h | 1 |
3 files changed, 87 insertions, 2 deletions
diff --git a/qmail-smtpd.c b/qmail-smtpd.c index 95993eb..6b4262f 100644 --- a/qmail-smtpd.c +++ b/qmail-smtpd.c | |||
| @@ -1,3 +1,4 @@ | |||
| 1 | #include <arpa/inet.h> | ||
| 1 | #include "sig.h" | 2 | #include "sig.h" |
| 2 | #include "readwrite.h" | 3 | #include "readwrite.h" |
| 3 | #include "stralloc.h" | 4 | #include "stralloc.h" |
| @@ -594,7 +595,7 @@ void mailfrom_parms(arg) char *arg; | |||
| 594 | if (case_starts(mfparms.s,"SMTPUTF8")) smtputf8 = 1; | 595 | if (case_starts(mfparms.s,"SMTPUTF8")) smtputf8 = 1; |
| 595 | #endif | 596 | #endif |
| 596 | if (case_starts(mfparms.s,"SIZE=")) if (mailfrom_size(mfparms.s+5)) { flagsize = 1; return; } | 597 | if (case_starts(mfparms.s,"SIZE=")) if (mailfrom_size(mfparms.s+5)) { flagsize = 1; return; } |
| 597 | if (case_starts(mfparms.s,"AUTH=")) mailfrom_auth(mfparms.s+5,mfparms.len-5); | 598 | if (case_starts(mfparms.s,"AUTH=")) mailfrom_auth(mfparms.s+5,mfparms.len-5); |
| 598 | if (!stralloc_copys(&mfparms,"")) die_nomem; | 599 | if (!stralloc_copys(&mfparms,"")) die_nomem; |
| 599 | } | 600 | } |
| 600 | else | 601 | else |
| @@ -603,6 +604,55 @@ void mailfrom_parms(arg) char *arg; | |||
| 603 | } | 604 | } |
| 604 | } | 605 | } |
| 605 | 606 | ||
| 607 | #define V4MAPPREFIX "::ffff:" | ||
| 608 | static const stralloc *client_get_session_id() | ||
| 609 | { | ||
| 610 | static stralloc buf = {0}, base64_buf = {0}; | ||
| 611 | const char *tmp; | ||
| 612 | struct timeval tv; | ||
| 613 | uint64_t timestamp; | ||
| 614 | unsigned int i; | ||
| 615 | unsigned long port; | ||
| 616 | int family = AF_INET; | ||
| 617 | |||
| 618 | if (base64_buf.s) | ||
| 619 | return &base64_buf; | ||
| 620 | |||
| 621 | if (!stralloc_ready(&buf, 24)) die_nomem(); | ||
| 622 | |||
| 623 | /* add lowest 48 bits of the timestamp. this gives us a bit less than | ||
| 624 | 9 years until it wraps */ | ||
| 625 | gettimeofday(&tv, NULL); | ||
| 626 | timestamp = tv.tv_usec + (long long)tv.tv_sec * 1000ULL*1000ULL; | ||
| 627 | for (i = 0; i < 48; i += 8) | ||
| 628 | buf.s[buf.len++] = (timestamp >> i) & 0xff; | ||
| 629 | |||
| 630 | if ((tmp = getenv("TCPREMOTEPORT")) != NULL && scan_ulong(tmp, &port)) | ||
| 631 | { | ||
| 632 | buf.s[buf.len] = port & 0xff; | ||
| 633 | buf.s[buf.len+1] = (port >> 8) & 0xff; | ||
| 634 | } | ||
| 635 | buf.len += 2; | ||
| 636 | |||
| 637 | family = ((tmp = getenv("PROTO")) && strcmp(tmp, "TCP6") == 0) | ||
| 638 | ? AF_INET6 : AF_INET; | ||
| 639 | if ((tmp = getenv("TCPREMOTEIP"))) | ||
| 640 | { | ||
| 641 | if (family == AF_INET6 && !strncmp(tmp, V4MAPPREFIX, strlen(V4MAPPREFIX))) | ||
| 642 | { | ||
| 643 | tmp += strlen(V4MAPPREFIX); | ||
| 644 | family = AF_INET; | ||
| 645 | } | ||
| 646 | (void)inet_pton(family, tmp, buf.s + buf.len); | ||
| 647 | buf.len += (family == AF_INET) ? 4 : 16; | ||
| 648 | } | ||
| 649 | |||
| 650 | if (b64encode(&buf, &base64_buf) < 0) die_nomem(); | ||
| 651 | if (!stralloc_0(&base64_buf)) die_nomem(); | ||
| 652 | if (!env_put2("SMTPSESSION", base64_buf.s)) die_nomem(); | ||
| 653 | return &base64_buf; | ||
| 654 | } | ||
| 655 | |||
| 606 | void smtp_helo(arg) char *arg; | 656 | void smtp_helo(arg) char *arg; |
| 607 | { | 657 | { |
| 608 | if(!spp_helo(arg)) return; | 658 | if(!spp_helo(arg)) return; |
| @@ -878,7 +928,10 @@ void smtp_data(arg) char *arg; { | |||
| 878 | protocol = utf8proto.s; | 928 | protocol = utf8proto.s; |
| 879 | } | 929 | } |
| 880 | 930 | ||
| 881 | received(&qqt,protocol,local,remoteip,remotehost,remoteinfo,fakehelo); | 931 | if (flagauth) |
| 932 | received_authed(&qqt,protocol,local,remoteinfo,client_get_session_id()->s); | ||
| 933 | else | ||
| 934 | received(&qqt,protocol,local,remoteip,remotehost,remoteinfo,fakehelo); | ||
| 882 | qmail_put(&qqt,sppheaders.s,sppheaders.len); /* set in qmail-spp.c */ | 935 | qmail_put(&qqt,sppheaders.s,sppheaders.len); /* set in qmail-spp.c */ |
| 883 | spp_rset(); | 936 | spp_rset(); |
| 884 | blast(&hops); | 937 | blast(&hops); |
| @@ -69,3 +69,34 @@ char *helo; | |||
| 69 | datetime_tai(&dt,now()); | 69 | datetime_tai(&dt,now()); |
| 70 | qmail_put(qqt,buf,date822fmt(buf,&dt)); | 70 | qmail_put(qqt,buf,date822fmt(buf,&dt)); |
| 71 | } | 71 | } |
| 72 | |||
| 73 | /* "Received: by silverton.berkeley.edu with SMTP; 26 Sep 1995 04:46:54 -0000\n" | ||
| 74 | * "X-UD-Smtp-Session: user@sessionid */ | ||
| 75 | |||
| 76 | void received_authed(qqt,protocol,local,remoteinfo,remotesession) | ||
| 77 | struct qmail *qqt; | ||
| 78 | char *protocol; | ||
| 79 | char *local; | ||
| 80 | char *remoteinfo; | ||
| 81 | char *remotesession; | ||
| 82 | { | ||
| 83 | struct datetime dt; | ||
| 84 | |||
| 85 | qmail_puts(qqt,"Received: by "); | ||
| 86 | safeput(qqt,local); | ||
| 87 | qmail_puts(qqt," with "); | ||
| 88 | qmail_puts(qqt,protocol); | ||
| 89 | qmail_puts(qqt,"; "); | ||
| 90 | datetime_tai(&dt,now()); | ||
| 91 | qmail_put(qqt,buf,date822fmt(buf,&dt)); | ||
| 92 | if (remoteinfo || remotesession) { | ||
| 93 | qmail_puts(qqt,"X-UD-Smtp-Session: "); | ||
| 94 | if (remoteinfo) { | ||
| 95 | safeput(qqt,remoteinfo); | ||
| 96 | qmail_puts(qqt,"@"); | ||
| 97 | } | ||
| 98 | if (remotesession) | ||
| 99 | qmail_puts(qqt,remotesession); | ||
| 100 | qmail_put(qqt,"\n",1); | ||
| 101 | } | ||
| 102 | } | ||
| @@ -2,5 +2,6 @@ | |||
| 2 | #define RECEIVED_H | 2 | #define RECEIVED_H |
| 3 | 3 | ||
| 4 | extern void received(); | 4 | extern void received(); |
| 5 | extern void received_authed(); | ||
| 5 | 6 | ||
| 6 | #endif | 7 | #endif |
