*/
/********************************************************/
/* */
+/* checking if remote recipient is relayable. */
+/* */
+/********************************************************/
+static _Bool is_remote_good(CONTYP *contact,RCPTYP *rmtusr)
+
+{
+#define OPEP "lvleml.c:is_remote_good,"
+
+_Bool remotegood;
+const char *cmt;
+int phase;
+_Bool proceed;
+
+remotegood=false;
+cmt=(const char *)0;
+phase=0;
+proceed=true;
+while (proceed==true) {
+ (void) rou_alert(0,"JMPDBG %s phase='%d'",OPEP,phase);
+ switch (phase) {
+ case 0 : { //Is there an MX for the user remote domain
+ MXTYP **mxs;
+
+ cmt="No MX nor IP for";
+ if ((mxs=dns_getmx(rmtusr->domain))!=(MXTYP **)0) {
+ for (int i=0;mxs[i]!=(MXTYP *)0;i++) {
+ if (mxs[i]->mxip!=(char **)0) {
+ phase++; //No need to check for domain IP
+ break;
+ }
+ }
+ mxs=dns_freemxlist(mxs);
+ }
+ }
+ break;
+ case 1 : //is the domain with an IP address
+ break;
+ case 2 : //is connection acceptable
+ switch (contact->privilege) {
+ case rel_authentic :
+ case rel_isrelay : //everything fine
+ break;
+ case rel_plain :
+ cmt="No relay accepted";
+ phase=999; //not relaiable
+ break;
+ default :
+ cmt="Unchecked status";
+ phase=999; //not relaiable
+ break;
+ }
+ break;
+ case 3 : //so it a good remote
+ remotegood=true;
+ break;
+ default : //SAFE Guard
+ if (remotegood==false) {
+
+ (void) transmit(contact,true,"%d 2.7.0 %s for domain <%s>",
+ NORELAY,cmt,rmtusr->domain);
+ }
+ proceed=false;
+ break;
+ }
+ phase++;
+ }
+return remotegood;
+
+#undef OPEP
+}
+/*
+^L
+*/
+/********************************************************/
+/* */
/* Procedure to check if helo or ehlo paratmeter */
/* is a correct one */
/* */
proceed=true;
phase=0;
while (proceed==true) {
- //(void) rou_alert(0,"JMPDBG %s phase='%d' rcptto=<%s>",OPEP,phase,rcptto);
+ (void) rou_alert(0,"JMPDBG %s phase='%d' rcptto=<%s>",OPEP,phase,rcptto);
switch (phase) {
case 0 : //do we have a mailfrom
if ((contact->mailfrom==(char *)0)||(strlen(contact->mailfrom)==0)) {
MISSMX,
"No valid MX found for recipient domain name",
neu->domain);
- neu=eml_freerecipient(neu); //free recipient
phase=999; //no need to go further
}
break;
case 5 : //if the local user acceptable
- if ((neu->code=='L')&&(is_user_good(contact,rcptto)==false)) {
- neu=eml_freerecipient(neu);
- phase=999;
+ switch (neu->code) {
+ case 'L' : //local user/domain
+ if (is_user_good(contact,rcptto)==false)
+ phase=999;
+ break;
+ case 'R' : //remote user/domain
+ if (is_remote_good(contact,neu)==false)
+ phase=999;
+ break;
+ default :
+ (void) transmit(contact,true,"%d 5.6.5 %s (domain=%s,code='%c')",
+ FAILED,
+ "system error with domain status",
+ neu->domain,neu->code);
+ phase=999; //no need to go further
+ break;
}
break;
case 6 : //Storing rcpt to
success=true;
break;
default : //SAFE guard
+ if (success==false)
+ neu=eml_freerecipient(neu);
proceed=false;
break;
}