diff options
Diffstat (limited to 'qmail-smtpd.c')
| -rw-r--r-- | qmail-smtpd.c | 57 |
1 files changed, 55 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); |
