S:helo example.com
R:250 mailleur.example.com, link (cleartext) ready, your IP/FQDN=[127.127.99.25/No.Reverse]
S:MAIL FROM: <trouble@mailref1.example.com>
-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
#-------------------------------------------------------------------------
*/
/********************************************************/
/* */
+/* 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
+}
+/*
+\f
+*/
+/********************************************************/
+/* */
/* Procedure to create an SQL pointer for proper */
/* database type. */
/* */
}
return unlocked;
-#undef OPEP
-}
-/*
-\f
-*/
-/********************************************************/
-/* */
-/* 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
}
/*
//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();
//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,...);
*/
/********************************************************/
/* */
-/* Procedure to check remote IP credit */
-/* */
-/********************************************************/
-static _Bool checkcredit(CONTYP *contact)
-
-{
-_Bool goodcredit;
-
-goodcredit=false;
-return goodcredit;
-}
-/*
-^L
-*/
-/********************************************************/
-/* */
/* Procedure to get the domain code */
/* */
/********************************************************/
*/
/********************************************************/
/* */
+/* 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. */
/* */
{
_Bool success;
_Bool proceed;
+int status;
int phase;
success=false;
+status=CMDOK;
proceed=true;
phase=0;
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;
#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