From: Jean-Marc Pigeon Date: Mon, 17 Nov 2025 16:06:54 +0000 (-0500) Subject: Stating to implement "note_status" within lvleml.c X-Git-Tag: tag-0.18~30 X-Git-Url: https://jmp-git.ovh.safe.ca/?a=commitdiff_plain;h=e4344489d08377815aae24e23ef5a56937a063e3;p=jmp%2Fmailleur Stating to implement "note_status" within lvleml.c --- diff --git a/lib/lvleml.c b/lib/lvleml.c index 0623a31..63b8740 100644 --- a/lib/lvleml.c +++ b/lib/lvleml.c @@ -198,6 +198,52 @@ while (proceed==true) { phase++; } return done; +#undef OPEP +} +/* + +*/ +/************************************************/ +/* */ +/* Procedure to report the contact status */ +/* store this status within the database */ +/* */ +/************************************************/ +static void note_status(CONTYP *contact,int smtpcode,char *rcpt,const char *fmt,...) + +{ +#define OPEP "lvleml.c:note_status" + +va_list args; +char **resp; +char *report; +char *info; +ACTTYP action; + +va_start(args,fmt); +resp=(char **)0; +(void) rou_vasprintf(&report,fmt,args); +(void) rou_asprintf(&info,"%d %s",smtpcode,report); +resp=(char **)rou_addlist((void **)resp,(void *)info); +(void) memset(&action,'\000',sizeof(ACTTYP)); +action.sessid=contact->session->sessid; +action.code='X'; +action.reverse=contact->peername; +action.remoteip=contact->peerip; +action.sfrom=contact->mailfrom; +if (contact->session->hfrom!=(char *)0) + action.hfrom=contact->session->hfrom; +if (contact->session->hsubject!=(char *)0) + action.hsubject=contact->session->hsubject; +action.rcptto=rcpt; +action.resp=resp; +if (sql_mngact(contact->sqlptr,&action)==false) + (void) rou_alert(0,"%s, unable to store report within database (bug?",OPEP); +(void) eml_transmit(contact,true,"%s",info); +resp=(char **)rou_freelist((void **)resp,(genfree_t)rou_freestr); +report=rou_freestr(report); +va_end(args); + #undef OPEP } /* @@ -354,27 +400,27 @@ while (proceed==true) { case 1 : //checking credential if (srv->links>1) { status=ALREADY; - (void) eml_transmit(contact,true,"%d-4.5.6 Server already connected", - status); + (void) note_status(contact,status,"---", + "%d-4.5.6 Server already connected",status); phase=999; //To many server connected } break; case 2 : //checking if black listed (low credit) if (srv->credit<0) { char *cmt; + const char *ninfo; cmt=srv->listing; + ninfo="%d-4.5.7 Originator server IP [%s] black listed <%s>"; if (cmt==(char *)0) cmt="credit too low"; (void) log_fprintlog(contact->logptr,false,"(Remote %s[%s] credit='%d' %s)", contact->peername, contact->peerip, srv->credit,"too low"); - (void) setterminator(contact,"Remote server credit is too low"); status=BLCKLST; - (void) eml_transmit(contact,true,"%d-4.5.7 Originator server IP " - "[%s] black listed <%s>", - status,contact->peerip,cmt); + (void) note_status(contact,status,"---",ninfo,status,contact->peerip,cmt); + (void) setterminator(contact,"Remote server credit is too low"); phase=999; //To many server connected } break; @@ -787,15 +833,15 @@ rmtpass=(char *)0; phase=0; proceed=true; while (proceed==true) { - //(void) rou_alert(0,"%s JMPDBG phase='%d'",OPEP,phase); + (void) rou_dbglive(9,OPEP,"phase='%d'",OPEP,phase); switch (phase) { - case 0 : //are we encrypted and on the right port + case 0 : //are we encrypted and on the right port if (soc_iscrypted(contact->socptr)==false) { - static char *cmt="no authentication on clear chanel"; - (void) eml_transmit(contact,true,"%d 5.7.0 %s",FAILED,cmt); + static char *cmt="no authentication allowed on clear chanel"; + (void) note_status(contact,FAILED,"---","%d 5.7.0 %s",FAILED,cmt); (void) setterminator(contact,cmt); contact->credit-=1; //"Bad boy" - phase=999; //No need to go further + phase=999; //No need to go further } break; case 1 : //check buffer @@ -883,52 +929,6 @@ rmtpass=rou_freestr(rmtpass); return (contact->privilege==rel_authentic); #undef DISP -#undef OPEP -} -/* - -*/ -/************************************************/ -/* */ -/* Procedure to report rcpt problem and */ -/* store status within the database. */ -/* */ -/************************************************/ -static void note_rcpt(CONTYP *contact,char *rcpt,int smtpcode,char *fmt,...) - -{ -#define OPEP "lvleml.c:note_rcpt," - -va_list args; -char **resp; -char *report; -char *info; -ACTTYP action; - -va_start(args,fmt); -resp=(char **)0; -(void) rou_vasprintf(&report,fmt,args); -(void) rou_asprintf(&info,"%d %s",smtpcode,report); -resp=(char **)rou_addlist((void **)resp,(void *)info); -(void) memset(&action,'\000',sizeof(ACTTYP)); -action.sessid=contact->session->sessid; -action.code='X'; -action.reverse=contact->peername; -action.remoteip=contact->peerip; -action.sfrom=contact->mailfrom; -if (contact->session->hfrom!=(char *)0) - action.hfrom=contact->session->hfrom; -if (contact->session->hsubject!=(char *)0) - action.hsubject=contact->session->hsubject; -action.rcptto=rcpt; -action.resp=resp; -if (sql_mngact(contact->sqlptr,&action)==false) - (void) rou_alert(0,"%s unable to store report within database (bug?",OPEP); -(void) eml_transmit(contact,true,"%s",info); -resp=(char **)rou_freelist((void **)resp,(genfree_t)rou_freestr); -report=rou_freestr(report); -va_end(args); - #undef OPEP } /* @@ -955,13 +955,13 @@ while (proceed==true) { switch (phase) { case 0 : //is user a local user if ((sql_mngusr(contact->sqlptr,sql_select,rcptto,&usr))==false) { - (void) note_rcpt(contact,rcptto,UKNUSER,"5.6.0 <%s> unknown user",rcptto); + (void) note_status(contact,UKNUSER,rcptto,"5.6.0 <%s> unknown user",rcptto); phase=999; //No user found in database } break; case 1 : //is user lock? if (usr->lock==1) { - (void) note_rcpt(contact,rcptto,EXPIRED,"5.6.1 <%s> account lock",rcptto); + (void) note_status(contact,EXPIRED,rcptto,"5.6.1 <%s> account lock",rcptto); phase=999; //No user found in database } break; @@ -1049,8 +1049,8 @@ while (proceed==true) { char *rcptto; (void) rou_asprintf(&rcptto,"%s@%s",rmtusr->userid,rmtusr->domain); - (void) note_rcpt(contact,rcptto,NORELAY,"2.8.0 %s for domain <%s>", - cmt,rmtusr->domain); + (void) note_status(contact,NORELAY,rcptto,"2.8.0 %s for domain <%s>", + cmt,rmtusr->domain); rcptto=rou_freestr(rcptto); } proceed=false; @@ -1831,13 +1831,14 @@ while (proceed==true) { break; case 1 : //do we have an originator if ((rcptto==(char *)0)||(strlen(rcptto)==0)) { - (void) note_rcpt(contact,rcptto,BADPAR,"5.6.1 recipient not specified"); + (void) note_status(contact,BADPAR,rcptto,"5.6.1 recipient not specified"); phase=999; //no need to go further } break; case 2 : //check rcpt format if ((rcptto[0]!='<')||(rcptto[strlen(rcptto)-1]!='>')) { - (void) note_rcpt(contact,rcptto,BADPAR,"5.6.2 '%s' bad Format error",rcptto); + (void) note_status(contact,BADPAR,rcptto,"5.6.2 '%s' bad Format error", + rcptto); phase=999; //no need to go further } rcptto[strlen(rcptto)-1]='\000'; @@ -1846,16 +1847,16 @@ while (proceed==true) { case 3 : //checking rcptto format neu=eml_isemailok(rcptto,&report); if (neu==(RCPTYP *)0) { - (void) note_rcpt(contact,rcptto,NOTEML,"5.6.3 %s",report); + (void) note_status(contact,NOTEML,rcptto,"5.6.3 %s",report); report=rou_freestr(report); phase=999; //no need to go further } break; case 4 : //Do we have a domain MX if (setlocdom(contact,neu)==false) { - (void) note_rcpt(contact,rcptto,MISSMX,"5.6.4 %s (domain=%s)", - "No valid MX found for recipient " - "domain name",neu->domain); + (void) note_status(contact,MISSMX,rcptto,"5.6.4 %s (domain=%s)", + "No valid MX found for recipient " + "domain name",neu->domain); phase=999; //no need to go further } break; @@ -1909,7 +1910,7 @@ while (proceed==true) { } break; case 8 : //everything ok - (void) note_rcpt(contact,rcptto,CMDOK,"5.6.7 %s <%s>",detail,rcptto); + (void) note_status(contact,CMDOK,rcptto,"5.6.7 %s <%s>",detail,rcptto); success=true; break; default : //SAFE guard