summaryrefslogtreecommitdiffstats
path: root/qmail-smtpd.c
diff options
context:
space:
mode:
Diffstat (limited to 'qmail-smtpd.c')
-rw-r--r--qmail-smtpd.c57
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:"
608static 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
606void smtp_helo(arg) char *arg; 656void 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);