From 31565a827223c059e0453b3361a4c81df4a67529 Mon Sep 17 00:00:00 2001 From: Stef Walter Date: Wed, 21 Jul 2004 00:13:23 +0000 Subject: - Intercept banner instead of HELO command. --- ChangeLog | 2 +- common/smtppass.c | 68 +++++++++++++++++++++---------------------------------- src/clamsmtpd.c | 68 +++++++++++++++++++++---------------------------------- 3 files changed, 53 insertions(+), 85 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6d21a60..57f61ba 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,7 +3,7 @@ - When no port specified for out address, connect back to original IP - Bug fixes to address parsing and formatting code - Fixed problem with AV header not being added - - Send our own HELO command to prevent complaints about loops + - Send our own initial banner to prevent complaints about loops 0.2 - Initial public release diff --git a/common/smtppass.c b/common/smtppass.c index 92dc5f5..b3decb0 100644 --- a/common/smtppass.c +++ b/common/smtppass.c @@ -90,7 +90,7 @@ clamsmtp_thread_t; #define SMTP_OK "250 Ok" CRLF #define SMTP_DATA "DATA" CRLF -#define SMTP_HELO "HELO " +#define SMTP_START "220 " #define SMTP_DELIMS "\r\n\t :" #define HELO_CMD "HELO" @@ -104,6 +104,7 @@ clamsmtp_thread_t; #define DATA_RSP "354" #define OK_RSP "250" +#define START_RSP "220" #define CLAM_OK "OK" #define CLAM_ERROR "ERROR" @@ -574,6 +575,10 @@ cleanup: disconnect_clam(&ctx); + /* Let the client know about fatal errors */ + if(ret == -1 && ctx.client != -1) + write_data(&ctx, &(ctx.client), SMTP_STARTFAILED); + if(ctx.client != -1) { shutdown(ctx.client, SHUT_RDWR); @@ -599,14 +604,10 @@ static int smtp_passthru(clamsmtp_context_t* ctx) char logline[LINE_LENGTH]; int processing = 0; int r, ret = 0; - int helo = 0; + int first_rsp = 1; fd_set mask; ASSERT(ctx->clam != -1 && ctx->server != -1); - - /* This changes the error code sent to the client when an - * error occurs. See cleanup below */ - processing = 1; logline[0] = 0; for(;;) @@ -686,35 +687,6 @@ static int smtp_passthru(clamsmtp_context_t* ctx) continue; } - /* - * Because many mail servers check for mail loops, we - * intercept HELO commands and send one withour own - * host name. - */ - else if(is_first_word(ctx->line, HELO_CMD, KL(HELO_CMD))) - { - messagex(ctx, LOG_DEBUG, "intercepting HELO"); - - strlcpy(ctx->line, SMTP_HELO, LINE_LENGTH); - - r = KL(SMTP_HELO); - - if(gethostname(ctx->line + r, LINE_LENGTH - r) == -1) - strlcat(ctx->line, "clamsmtp", LINE_LENGTH); - - strlcat(ctx->line, CRLF, LINE_LENGTH); - ctx->line[LINE_LENGTH - 1] = 0; - - if(write_data(ctx, &(ctx->server), ctx->line) == -1) - RETURN(-1); - - /* The 250 response from the server also needs changing */ - helo = 1; - - /* Command handled */ - continue; - } - /* Append recipients to log line */ else if((r = check_first_word(ctx->line, FROM_CMD, KL(FROM_CMD), SMTP_DELIMS)) > 0) add_to_logline(logline, "from=", ctx->line + r); @@ -747,17 +719,29 @@ static int smtp_passthru(clamsmtp_context_t* ctx) messagex(ctx, LOG_WARNING, "SMTP response line too long. discarded extra"); /* - * After we've seen a HELO we need to edit the response that - * gets sent back to the client to prevent the server from - * thinking we're in a wierd loop. + * We intercept the first response we get from the server. + * This allows us to change header so that it doesn't look + * to the client server that we're in a wierd loop. */ - if(helo) + if(first_rsp) { - helo = 0; + first_rsp = 0; - if(is_first_word(ctx->line, OK_RSP, KL(OK_RSP))) + if(is_first_word(ctx->line, START_RSP, KL(START_RSP))) { - if(write_data(ctx, &(ctx->client), SMTP_OK) == -1) + messagex(ctx, LOG_DEBUG, "intercepting initial response"); + + strlcpy(ctx->line, SMTP_START, LINE_LENGTH); + + r = KL(SMTP_START); + + if(gethostname(ctx->line + r, LINE_LENGTH - r) == -1) + strlcat(ctx->line, "clamsmtp", LINE_LENGTH); + + strlcat(ctx->line, CRLF, LINE_LENGTH); + ctx->line[LINE_LENGTH - 1] = 0; + + if(write_data(ctx, &(ctx->client), ctx->line) == -1) RETURN(-1); /* Command handled */ diff --git a/src/clamsmtpd.c b/src/clamsmtpd.c index 92dc5f5..b3decb0 100644 --- a/src/clamsmtpd.c +++ b/src/clamsmtpd.c @@ -90,7 +90,7 @@ clamsmtp_thread_t; #define SMTP_OK "250 Ok" CRLF #define SMTP_DATA "DATA" CRLF -#define SMTP_HELO "HELO " +#define SMTP_START "220 " #define SMTP_DELIMS "\r\n\t :" #define HELO_CMD "HELO" @@ -104,6 +104,7 @@ clamsmtp_thread_t; #define DATA_RSP "354" #define OK_RSP "250" +#define START_RSP "220" #define CLAM_OK "OK" #define CLAM_ERROR "ERROR" @@ -574,6 +575,10 @@ cleanup: disconnect_clam(&ctx); + /* Let the client know about fatal errors */ + if(ret == -1 && ctx.client != -1) + write_data(&ctx, &(ctx.client), SMTP_STARTFAILED); + if(ctx.client != -1) { shutdown(ctx.client, SHUT_RDWR); @@ -599,14 +604,10 @@ static int smtp_passthru(clamsmtp_context_t* ctx) char logline[LINE_LENGTH]; int processing = 0; int r, ret = 0; - int helo = 0; + int first_rsp = 1; fd_set mask; ASSERT(ctx->clam != -1 && ctx->server != -1); - - /* This changes the error code sent to the client when an - * error occurs. See cleanup below */ - processing = 1; logline[0] = 0; for(;;) @@ -686,35 +687,6 @@ static int smtp_passthru(clamsmtp_context_t* ctx) continue; } - /* - * Because many mail servers check for mail loops, we - * intercept HELO commands and send one withour own - * host name. - */ - else if(is_first_word(ctx->line, HELO_CMD, KL(HELO_CMD))) - { - messagex(ctx, LOG_DEBUG, "intercepting HELO"); - - strlcpy(ctx->line, SMTP_HELO, LINE_LENGTH); - - r = KL(SMTP_HELO); - - if(gethostname(ctx->line + r, LINE_LENGTH - r) == -1) - strlcat(ctx->line, "clamsmtp", LINE_LENGTH); - - strlcat(ctx->line, CRLF, LINE_LENGTH); - ctx->line[LINE_LENGTH - 1] = 0; - - if(write_data(ctx, &(ctx->server), ctx->line) == -1) - RETURN(-1); - - /* The 250 response from the server also needs changing */ - helo = 1; - - /* Command handled */ - continue; - } - /* Append recipients to log line */ else if((r = check_first_word(ctx->line, FROM_CMD, KL(FROM_CMD), SMTP_DELIMS)) > 0) add_to_logline(logline, "from=", ctx->line + r); @@ -747,17 +719,29 @@ static int smtp_passthru(clamsmtp_context_t* ctx) messagex(ctx, LOG_WARNING, "SMTP response line too long. discarded extra"); /* - * After we've seen a HELO we need to edit the response that - * gets sent back to the client to prevent the server from - * thinking we're in a wierd loop. + * We intercept the first response we get from the server. + * This allows us to change header so that it doesn't look + * to the client server that we're in a wierd loop. */ - if(helo) + if(first_rsp) { - helo = 0; + first_rsp = 0; - if(is_first_word(ctx->line, OK_RSP, KL(OK_RSP))) + if(is_first_word(ctx->line, START_RSP, KL(START_RSP))) { - if(write_data(ctx, &(ctx->client), SMTP_OK) == -1) + messagex(ctx, LOG_DEBUG, "intercepting initial response"); + + strlcpy(ctx->line, SMTP_START, LINE_LENGTH); + + r = KL(SMTP_START); + + if(gethostname(ctx->line + r, LINE_LENGTH - r) == -1) + strlcat(ctx->line, "clamsmtp", LINE_LENGTH); + + strlcat(ctx->line, CRLF, LINE_LENGTH); + ctx->line[LINE_LENGTH - 1] = 0; + + if(write_data(ctx, &(ctx->client), ctx->line) == -1) RETURN(-1); /* Command handled */ -- cgit v1.2.3