diff -Nur sendmail-8.11.0.orig/sendmail/conf.c sendmail-8.11.0/sendmail/conf.c --- sendmail-8.11.0.orig/sendmail/conf.c Sat Jul 15 19:35:18 2000 +++ sendmail-8.11.0/sendmail/conf.c Sat Dec 23 00:58:26 2000 @@ -311,6 +311,8 @@ ColonOkInAddr = TRUE; DontLockReadFiles = TRUE; DoubleBounceAddr = "postmaster"; + DetectTelnet = FALSE; + ExitOnTelnet = TRUE; MaxHeadersLength = MAXHDRSLEN; MaxForwardEntries = 0; #if SASL diff -Nur sendmail-8.11.0.orig/sendmail/err.c sendmail-8.11.0/sendmail/err.c --- sendmail-8.11.0.orig/sendmail/err.c Fri May 26 02:08:29 2000 +++ sendmail-8.11.0/sendmail/err.c Sat Dec 23 01:00:25 2000 @@ -786,15 +786,15 @@ (void) snprintf(eb, spaceleft, "%s... ", shortenstring(to, MAXSHORTSTR)); spaceleft -= strlen(eb); - while (*eb != '\0') - *eb++ &= 0177; +/* while (*eb != '\0') + *eb++ &= 0177; */ } /* output the message */ (void) vsnprintf(eb, spaceleft, fmt, ap); spaceleft -= strlen(eb); - while (*eb != '\0') - *eb++ &= 0177; +/* while (*eb != '\0') + *eb++ &= 0177; */ /* output the error code, if any */ if (eno != 0) diff -Nur sendmail-8.11.0.orig/sendmail/readcf.c sendmail-8.11.0/sendmail/readcf.c --- sendmail-8.11.0.orig/sendmail/readcf.c Wed Jul 12 18:44:09 2000 +++ sendmail-8.11.0/sendmail/readcf.c Sat Dec 23 01:08:28 2000 @@ -1709,6 +1709,10 @@ # endif /* _FFR_TLS_1 */ # define O_RANDFILE 0xc1 { "RandFile", O_RANDFILE, OI_NONE }, +#define O_DETECTTELNET 0xc2 + { "DetectTelnet", O_DETECTTELNET, OI_NONE }, +#define O_EXITONTELNET 0xc3 + { "ExitOnTelnet", O_EXITONTELNET, OI_NONE }, { NULL, '\0', OI_NONE } }; @@ -2943,6 +2947,14 @@ QueueFileMode = atooct(val) & 0777; break; #endif /* _FFR_QUEUE_FILE_MODE */ + + case O_DETECTTELNET: /* detect telnet */ + DetectTelnet = atobool(val); + break; + + case O_EXITONTELNET: /* exit if telnet detected */ + ExitOnTelnet = atobool(val); + break; default: if (tTd(37, 1)) diff -Nur sendmail-8.11.0.orig/sendmail/sendmail.h sendmail-8.11.0/sendmail/sendmail.h --- sendmail-8.11.0.orig/sendmail/sendmail.h Tue Jul 18 04:24:47 2000 +++ sendmail-8.11.0/sendmail/sendmail.h Sat Dec 23 01:12:30 2000 @@ -1682,6 +1682,8 @@ EXTERN bool UseErrorsTo; /* use Errors-To: header (back compat) */ EXTERN bool UseHesiod; /* using Hesiod -- interpret Hesiod errors */ EXTERN bool UseNameServer; /* using DNS -- interpret h_errno & MX RRs */ +EXTERN bool DetectTelnet; /* force telnet detection on/off */ +EXTERN bool ExitOnTelnet; /* exit if telnet detected */ EXTERN char InetMode; /* default network for daemon mode */ EXTERN char OpMode; /* operation mode, see below */ EXTERN char SpaceSub; /* substitution for */ diff -Nur sendmail-8.11.0.orig/sendmail/srvrsmtp.c sendmail-8.11.0/sendmail/srvrsmtp.c --- sendmail-8.11.0.orig/sendmail/srvrsmtp.c Wed Jul 19 22:21:35 2000 +++ sendmail-8.11.0/sendmail/srvrsmtp.c Sat Dec 23 01:41:30 2000 @@ -13,6 +13,7 @@ #include +#include #ifndef lint # if SMTP @@ -207,6 +208,9 @@ char *args[MAXSMTPARGS]; char inp[MAXLINE]; char cmdbuf[MAXLINE]; + char telnet_request[] = {IAC, DO, TELOPT_SGA, 0}; + char telnet_response[] = {IAC, WILL, TELOPT_SGA, 0}; + char *telnet_tmp; # if SASL sasl_conn_t *conn; volatile bool sasl_ok; @@ -429,12 +433,8 @@ id = strchr(inp, ' '); if (id == NULL) id = &inp[strlen(inp)]; - if (p == NULL) - snprintf(cmdbuf, sizeof cmdbuf, - "%s %%.*s ESMTP%%s", greetcode); - else - snprintf(cmdbuf, sizeof cmdbuf, - "%s-%%.*s ESMTP%%s", greetcode); + snprintf(cmdbuf,sizeof cmdbuf,"%s%c%%.*s ESMTP%%s%s", greetcode, + (p == NULL)? ' ' : '-', DetectTelnet ? telnet_request : ""); message(cmdbuf, id - inp, inp, id); /* output remaining lines */ @@ -520,6 +520,20 @@ e->e_sendqueue = NULL; goto doquit; } + + if (DetectTelnet && strlen(inp) >= 3) + for (telnet_tmp = inp; *(telnet_tmp+2); telnet_tmp++) + if (!strncmp(telnet_tmp, telnet_response, 3)) + { + sm_syslog(LOG_NOTICE, e->e_id, + "telnet detected from %.100s (%.100s)", + CurSmtpClient, anynet_ntoa(&RealHostAddr)); + if (ExitOnTelnet) + { + message("571 Unauthorized usage prohibited"); + goto doquit; + } + } /* clean up end of line */ fixcrlf(inp, TRUE);