X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fsmtp%2Fsmtp_clienthandlers.c;h=6762016c5bd11fd1f1fb125c35909ef6ab5f60b0;hb=a5e759daa03e43dfdd940e96c13cded7ba8de39c;hp=0a01805c6dae39dd9430b038d7dbd03977a638ea;hpb=94ef7564c4585129c6025debe797c8dade2e6885;p=citadel.git diff --git a/citadel/modules/smtp/smtp_clienthandlers.c b/citadel/modules/smtp/smtp_clienthandlers.c index 0a01805c6..6762016c5 100644 --- a/citadel/modules/smtp/smtp_clienthandlers.c +++ b/citadel/modules/smtp/smtp_clienthandlers.c @@ -92,6 +92,7 @@ Msg->MyQEntry->Status = WHICH_ERR; \ StrBufAppendBufPlain(Msg->MyQEntry->StatusMessage, \ HKEY(ERRSTR), 0); \ + StrBufTrim(Msg->MyQEntry->StatusMessage); \ return eAbort; } \ while (0) @@ -100,16 +101,17 @@ StrBufPlain(Msg->MyQEntry->StatusMessage, \ ChrPtr(Msg->IO.IOBuf) + 4, \ StrLength(Msg->IO.IOBuf) - 4); \ + StrBufTrim(Msg->MyQEntry->StatusMessage); \ return eAbort; } \ while (0) #define SMTP_IS_STATE(WHICH_STATE) (ChrPtr(Msg->IO.IOBuf)[0] == WHICH_STATE) #define SMTP_DBG_SEND() \ - EVS_syslog(LOG_DEBUG, "SMTP: > %s\n", ChrPtr(Msg->IO.SendBuf.Buf)) + EVS_syslog(LOG_DEBUG, "> %s\n", ChrPtr(Msg->IO.SendBuf.Buf)) #define SMTP_DBG_READ() \ - EVS_syslog(LOG_DEBUG, "SMTP: < %s\n", ChrPtr(Msg->IO.IOBuf)) + EVS_syslog(LOG_DEBUG, "< %s\n", ChrPtr(Msg->IO.IOBuf)) /*****************************************************************************/ @@ -120,6 +122,7 @@ eNextState SMTPC_read_greeting(SmtpOutMsg *Msg) /* Process the SMTP greeting from the server */ AsyncIO *IO = &Msg->IO; SMTP_DBG_READ(); + SetSMTPState(IO, eSTMPsmtp); if (!SMTP_IS_STATE('2')) { if (SMTP_IS_STATE('4')) @@ -154,6 +157,11 @@ eNextState SMTPC_read_EHLO_reply(SmtpOutMsg *Msg) if ((Msg->pCurrRelay == NULL) || (Msg->pCurrRelay->User == NULL)) Msg->State ++; /* Skip auth... */ + if (Msg->pCurrRelay != NULL) + { + if (strstr(ChrPtr(Msg->IO.IOBuf), "LOGIN") != NULL) + Msg->SendLogin = 1; + } } /* else we fall back to 'helo' */ return eSendReply; @@ -181,6 +189,11 @@ eNextState SMTPC_read_HELO_reply(SmtpOutMsg *Msg) else SMTP_VERROR(5); } + if (Msg->pCurrRelay != NULL) + { + if (strstr(ChrPtr(Msg->IO.IOBuf), "LOGIN") != NULL) + Msg->SendLogin = 1; + } if ((Msg->pCurrRelay == NULL) || (Msg->pCurrRelay->User == NULL)) Msg->State ++; /* Skip auth... */ @@ -199,17 +212,44 @@ eNextState SMTPC_send_auth(SmtpOutMsg *Msg) Msg->State ++; /* Skip auth, shouldn't even come here!... */ else { /* Do an AUTH command if necessary */ - sprintf(buf, "%s%c%s%c%s", - Msg->pCurrRelay->User, '\0', - Msg->pCurrRelay->User, '\0', - Msg->pCurrRelay->Pass); - - CtdlEncodeBase64(encoded, buf, - strlen(Msg->pCurrRelay->User) * 2 + - strlen(Msg->pCurrRelay->Pass) + 2, 0); - - StrBufPrintf(Msg->IO.SendBuf.Buf, - "AUTH PLAIN %s\r\n", encoded); + if (Msg->SendLogin) + { + sprintf(buf, "%s", + Msg->pCurrRelay->User); + + CtdlEncodeBase64(encoded, buf, + strlen(Msg->pCurrRelay->User) * 2 + + strlen(Msg->pCurrRelay->Pass) + 2, 0); + + StrBufPrintf(Msg->IO.SendBuf.Buf, + "AUTH LOGIN %s\r\n", + encoded); + sprintf(buf, "%s", + Msg->pCurrRelay->Pass); + + CtdlEncodeBase64(encoded, buf, + strlen(Msg->pCurrRelay->User) * 2 + + strlen(Msg->pCurrRelay->Pass) + 2, 0); + + StrBufAppendPrintf(Msg->IO.SendBuf.Buf, + "%s\r\n", + encoded); + } + else + { + sprintf(buf, "%s%c%s%c%s", + Msg->pCurrRelay->User, '\0', + Msg->pCurrRelay->User, '\0', + Msg->pCurrRelay->Pass); + + CtdlEncodeBase64(encoded, buf, + strlen(Msg->pCurrRelay->User) * 2 + + strlen(Msg->pCurrRelay->Pass) + 2, 0); + + StrBufPrintf(Msg->IO.SendBuf.Buf, + "AUTH PLAIN %s\r\n", + encoded); + } } SMTP_DBG_SEND(); return eReadMessage; @@ -302,11 +342,13 @@ eNextState SMTPC_read_DATAcmd_reply(SmtpOutMsg *Msg) SMTP_DBG_READ(); if (!SMTP_IS_STATE('3')) { + SetSMTPState(IO, eSTMPfailOne); if (SMTP_IS_STATE('4')) SMTP_VERROR(3); else SMTP_VERROR(5); } + SetSMTPState(IO, eSTMPsmtpdata); return eSendReply; } @@ -350,10 +392,12 @@ eNextState SMTPC_read_data_body_reply(SmtpOutMsg *Msg) SMTP_VERROR(5); } + SetSMTPState(IO, eSTMPsmtpdone); /* We did it! */ StrBufPlain(Msg->MyQEntry->StatusMessage, &ChrPtr(Msg->IO.RecvBuf.Buf)[4], StrLength(Msg->IO.RecvBuf.Buf) - 4); + StrBufTrim(Msg->MyQEntry->StatusMessage); Msg->MyQEntry->Status = 2; return eSendReply; } @@ -374,8 +418,7 @@ eNextState SMTPC_read_QUIT_reply(SmtpOutMsg *Msg) SMTP_DBG_READ(); EVS_syslog(LOG_DEBUG, - "SMTP client[%ld]: delivery to <%s> @ <%s> (%s) succeeded\n", - Msg->n, + "delivery to <%s> @ <%s> (%s) succeeded\n", Msg->user, Msg->node, Msg->name); @@ -475,7 +518,7 @@ int smtp_resolve_recipients(SmtpOutMsg *Msg) int lp, rp; int i; - EVNCS_syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__); + EVNCS_syslog(LOG_DEBUG, "%s\n", __FUNCTION__); if ((Msg==NULL) || (Msg->MyQEntry == NULL) || @@ -490,9 +533,7 @@ int smtp_resolve_recipients(SmtpOutMsg *Msg) Msg->name); EVNCS_syslog(LOG_DEBUG, - "SMTP client[%ld]: Attempting delivery to " - "<%s> @ <%s> (%s)\n", - Msg->n, + "Attempting delivery to <%s> @ <%s> (%s)\n", Msg->user, Msg->node, Msg->name);