From: Jean-Marc Pigeon (Delson) Date: Sat, 12 Jul 2025 00:58:32 +0000 (-0400) Subject: function creditchecking seems to be working X-Git-Tag: tag-0.14~126 X-Git-Url: https://jmp-git.ovh.safe.ca/?a=commitdiff_plain;h=d8ada2b529a0fd6f952dce3b2071c6408fa998e5;p=jmp%2Fmailleur function creditchecking seems to be working --- diff --git a/data-feed/feed05.tst b/data-feed/feed05.tst index f77302d..9adf397 100644 --- a/data-feed/feed05.tst +++ b/data-feed/feed05.tst @@ -6,7 +6,7 @@ R:220 mailleur.example.com, ESMTP (cleartext) mailleur... S:helo example.com R:250 mailleur.example.com, link (cleartext) ready, your IP/FQDN=[127.127.99.25/No.Reverse] S:MAIL FROM: -R:457-5.5.3 Your Credential need to be checked +R:457-4.5.7 Your Credential need to be checked R:457 5.5.3 Closing connection R:Disconnected #------------------------------------------------------------------------- diff --git a/lib/devsql.c b/lib/devsql.c index 1a627e5..f24686c 100644 --- a/lib/devsql.c +++ b/lib/devsql.c @@ -75,6 +75,71 @@ return value; */ /********************************************************/ /* */ +/* Procedure to make sure a string to be use to */ +/* access database is clean. */ +/* (no character to be misunderstood by database) */ +/* */ +/********************************************************/ +PUBLIC char *sql_gooddata(SQLPTR *sqlptr,char *key) + +{ +#define OPEP "devsql.c:sql_gooddata," + +char *gooddata; +char *sqlkey; +SQLTYP *sql; +int phase; +_Bool proceed; + +gooddata=(char *)0; +sqlkey=(char *)0; +sql=(SQLTYP *)sqlptr; +phase=0; +proceed=true; +while (proceed==true) { + switch (phase) { + case 0 : //do we have a string to encode + if ((key==(char *)0)||(strlen(key)==0)) { + gooddata=strdup("NULL"); //no, force a 'NULL' string. + phase=999; + } + break; + case 1 : //checking the key encoding + if ((sqlkey=sql_checkencoding(key))==(char *)0) { + (void) rou_alert(0,"%s dbkey <%s> encoding is wrong (config?)",OPEP,key); + gooddata=strdup("NULL"); //Let assum NULL + phase=999; //trouble trouble + } + break; + case 2 : //cleaning quote according daemon type + switch(sql->sqldb) { + case (db_postgres) : + gooddata=pos_cleanquote(sqlkey); + break; + case (db_maria) : + gooddata=mar_cleanquote(sqlkey); + break; + case (db_unknown) : + default : + (void) rou_alert(0,"%s Unknown SQL daemon (type='%d')",OPEP,sql->sqldb); + break; + } + sqlkey=rou_freestr(sqlkey); + break; + default : //SAFE Guard + proceed=false; + break; + } + phase++; + } +return gooddata; +#undef OPEP +} +/* + +*/ +/********************************************************/ +/* */ /* Procedure to create an SQL pointer for proper */ /* database type. */ /* */ @@ -314,71 +379,6 @@ if (sqlptr!=(SQLPTR *)0) { } return unlocked; -#undef OPEP -} -/* - -*/ -/********************************************************/ -/* */ -/* Procedure to make sure a string to be use to */ -/* access database is clean. */ -/* (no character to be misunderstood by database) */ -/* */ -/********************************************************/ -PUBLIC char *sql_gooddata(SQLPTR *sqlptr,char *key) - -{ -#define OPEP "devsql.c:sql_gooddata," - -char *gooddata; -char *sqlkey; -SQLTYP *sql; -int phase; -_Bool proceed; - -gooddata=(char *)0; -sqlkey=(char *)0; -sql=(SQLTYP *)sqlptr; -phase=0; -proceed=true; -while (proceed==true) { - switch (phase) { - case 0 : //do we have a string to encode - if ((key==(char *)0)||(strlen(key)==0)) { - gooddata=strdup("NULL"); //no, force a 'NULL' string. - phase=999; - } - break; - case 1 : //checking the key encoding - if ((sqlkey=sql_checkencoding(key))==(char *)0) { - (void) rou_alert(0,"%s dbkey <%s> encoding is wrong (config?)",OPEP,key); - gooddata=strdup("NULL"); //Let assum NULL - phase=999; //trouble trouble - } - break; - case 2 : //cleaning quote according daemon type - switch(sql->sqldb) { - case (db_postgres) : - gooddata=pos_cleanquote(sqlkey); - break; - case (db_maria) : - gooddata=mar_cleanquote(sqlkey); - break; - case (db_unknown) : - default : - (void) rou_alert(0,"%s Unknown SQL daemon (type='%d')",OPEP,sql->sqldb); - break; - } - sqlkey=rou_freestr(sqlkey); - break; - default : //SAFE Guard - proceed=false; - break; - } - phase++; - } -return gooddata; #undef OPEP } /* diff --git a/lib/devsql.h b/lib/devsql.h index 6ec49d2..4c5d5de 100644 --- a/lib/devsql.h +++ b/lib/devsql.h @@ -16,6 +16,10 @@ typedef void SQLPTR; //An SQL database result reference typedef void SQLRES; +//procedure to make sure a string is acceptable +//as key search by database +extern char *sql_gooddata(SQLPTR *sqlptr,char *key); + //to connect a remote SQL server extern SQLPTR *sql_opensql(); @@ -28,10 +32,6 @@ extern _Bool sql_lock(SQLPTR *sqlptr,char *tablename); //procedure to UNLOCK access to a database table extern _Bool sql_unlock(SQLPTR *sqlptr,_Bool commit); -//procedure to make sure a string is acceptable -//as key search by database -extern char *sql_gooddata(SQLPTR *sqlptr,char *key); - //procedure to transmit a simple data-base action extern int sql_request(SQLPTR *sqlptr,const char *fmt,...); diff --git a/lib/lvleml.c b/lib/lvleml.c index 2f5a0f0..eca1017 100644 --- a/lib/lvleml.c +++ b/lib/lvleml.c @@ -111,22 +111,6 @@ return contact; */ /********************************************************/ /* */ -/* Procedure to check remote IP credit */ -/* */ -/********************************************************/ -static _Bool checkcredit(CONTYP *contact) - -{ -_Bool goodcredit; - -goodcredit=false; -return goodcredit; -} -/* -^L -*/ -/********************************************************/ -/* */ /* Procedure to get the domain code */ /* */ /********************************************************/ @@ -333,6 +317,66 @@ return status; */ /********************************************************/ /* */ +/* Procedure to check remote IP credit */ +/* */ +/********************************************************/ +static int checkcredit(CONTYP *contact) + +{ +#define OPEP "lvleml.c:checkcredit," + +int status; +SRVTYP *srv; +int phase; +_Bool proceed; + +status=FAILED; +srv=(SRVTYP *)0; +phase=0; +proceed=true; +while (proceed==true) { + switch (phase) { + case 0 : //reading remote server information + if (sql_mngremote(contact->sqlptr,sql_select,contact->peerip,&srv)==false) { + (void) rou_alert(0,"%s Unable to find server data for remote <%s> (BUg?)", + OPEP,contact->peerip); + phase=999; + } + break; + case 1 : //checking credential + if (srv->links>1) { + status=ALREADY; + (void) transmit(contact,true,"%d-4.5.6 Server already connected",status); + phase=999; //To many server connected + } + break; + case 2 : //freeing memory + if (srv->credit<0) { + status=NEWSITE; + (void) transmit(contact,true,"%d-4.5.7 Your Credential need to be checked", + status); + phase=999; //To many server connected + } + break; + case 3 : //freeing memory + status=CMDOK; + break; + default : //SAFE Guard + srv=sql_freesrv(srv); + proceed=false; + break; + } + phase++; + } +return status; + +#undef OPEP +} +/* +^L +*/ +/********************************************************/ +/* */ /* Procedure to split a plain authentication string*/ /* Match with the user provided. */ /* */ @@ -1291,9 +1335,11 @@ static _Bool checkfrom(CONTYP *contact,char *mailfrom) { _Bool success; _Bool proceed; +int status; int phase; success=false; +status=CMDOK; proceed=true; phase=0; while (proceed==true) { @@ -1327,10 +1373,8 @@ while (proceed==true) { phase++; //No need to check remote "credits break; case 4 : //check remote credit - if (checkcredit(contact)==false) { - (void) transmit(contact,true,"%d-5.5.3 Your Credential need to be checked", - NEWSITE); - (void) transmit(contact,true,"%d 5.5.3 Closing connection",NEWSITE); + if ((status=checkcredit(contact))!=CMDOK) { + (void) transmit(contact,true,"%d 5.5.3 Closing connection",status); phase=999; //bad credit not need to go further } break; diff --git a/lib/unieml.h b/lib/unieml.h index c12a74b..e1bd85a 100644 --- a/lib/unieml.h +++ b/lib/unieml.h @@ -22,6 +22,7 @@ #define SENDB64 334 //send a B64 sequence #define DATAOK 354 //Ready to accept EMAIL data #define ERRPROC 451 //local processing error +#define ALREADY 456 //remote server already connected #define NEWSITE 457 //Site credential need to be checked #define NOANSWR 460 //no answer from remote #define BADPAR 501 //error in parameters