]> SAFE projects GIT repository - jmp/mailleur/commitdiff
Allowing to change realm for authentication failed (not possible at protocol level)
authorJean-Marc Pigeon (Delson) <jmp@safe.ca>
Wed, 9 Jul 2025 02:30:18 +0000 (22:30 -0400)
committerJean-Marc Pigeon (Delson) <jmp@safe.ca>
Wed, 9 Jul 2025 02:30:18 +0000 (22:30 -0400)
lib/devsql.c
lib/lvleml.c
lib/unidig.c
lib/unidig.h
lib/unisql.c
lib/unisql.h

index 80e0bf9372c92fded76c4975a325f2c223d60148..3af20679ed8082a759da932e0d9d7919fc44c231 100644 (file)
@@ -49,6 +49,7 @@ const FLDTYP usrfield[]={
           {4,"mxspace"},
           {5,"locked"},
           {6,"hash"},
+          {7,"realm"},
           {0,(char *)0}
           };
 
@@ -382,6 +383,9 @@ while (proceed==true) {
           case 6        :       //'email:realm:password' MD5
             usr->hash=strdup(locval);
             break;
+          case 7        :       //'realm
+            usr->realm=strdup(locval);
+            break;
           default       :
             (void) rou_alert(0,"%s field <%d:%s> not implemented (Bug?)",
                                    OPEP,usrfield[i].num,usrfield[i].name);
index 3cf523076eb30aa1337618919ff1cd8240ea3aa8..06d4965d9894db7ff8b7a9077def92d649e4fafe 100644 (file)
@@ -655,6 +655,8 @@ static void get_auth_digest_md5(CONTYP *contact,char **rmtpass)
 
 char *challenge;
 RSPTYP *resp;
+char realm[200];
+char usrrealm[200];
 char answer[300];
 char hash[40];
 int phase;
@@ -662,6 +664,11 @@ _Bool proceed;
 
 *rmtpass=strdup("$1(ukn as digest_md5)");
 challenge=(char *)0;
+(void) memset(realm,'\000',sizeof(realm));
+(void) memset(usrrealm,'\000',sizeof(usrrealm));
+(void) strncpy(realm,REALM,sizeof(realm)-1);
+if ((getenv("REALM"))!=(char *)0) 
+  (void) strncpy(realm,getenv("REALM"),sizeof(realm)-1);
 resp=(RSPTYP *)0;
 (void) memset(answer,'\000',sizeof(answer));
 (void) memset(hash,'\000',sizeof(hash));
@@ -670,13 +677,15 @@ proceed=true;
 while (proceed==true) {
   //(void) rou_alert(0,"%s JMPDBG phase='%d'",OPEP,phase);
   switch (phase) {
-    case 0      :       //Building the challenge sequence
-      if ((challenge=dig_getchallenge())==(char *)0) {
+    case 0      :       //assign the reaml challeng
+      break;
+    case 1      :       //Building the challenge sequence
+      if ((challenge=dig_getchallenge(realm))==(char *)0) {
         (void) rou_alert(0,"%s Unable to get challenge sequence (Bug!)",OPEP);
         phase=999;
         }
       break;
-    case 1      :  {    //sending challenge to remote
+    case 2      :  {    //sending challenge to remote
       char *b64;
 
       b64=cnv_setb64(challenge);
@@ -684,7 +693,7 @@ while (proceed==true) {
       b64=rou_freestr(b64);
       }
       break;
-    case 2      :  {    //getting the challenge answer
+    case 3      :  {    //getting the challenge answer
       char *line;
 
       if (tcp_getline(contact->socptr,contact->delay,&line)>0) {
@@ -703,17 +712,17 @@ while (proceed==true) {
         phase=999;      //no need to go further
       }
       break;
-    case 3      :       //Parsing the answer
+    case 4      :       //Parsing the answer
       if ((resp=dig_parseresp(answer))==(RSPTYP *)0)
         phase=999;      //Unable to parse answer
       break;
-    case 4      :       //checking if we have a user name
+    case 5      :       //checking if we have a user name
       if (resp->username==(char *)0) {
         (void) rou_alert(0,"%s No username in challenge answer!",OPEP);
         phase=999;      //Unable to parse answer
         }
       break;
-    case 5      :  {    //getting the user name and password
+    case 6      :  {    //getting the user name and password
       USRTYP *usr;
 
       contact->authname=rou_freestr(contact->authname);
@@ -721,6 +730,8 @@ while (proceed==true) {
       if (sql_mngusr(contact->sqlptr,sql_select,resp->username,&usr)==true) {
         if (usr->hash!=(char *)0)
           (void) strncpy(hash,usr->hash,sizeof(hash)-1);
+        if (usr->realm!=(char *)0)
+          (void) strncpy(usrrealm,usr->realm,sizeof(usrrealm)-1);
         usr=sql_freeusr(usr);
         }
       if (strlen(hash)==0) {
@@ -729,7 +740,7 @@ while (proceed==true) {
         }
       }
       break;
-    case 6      :  {    //sending the rspauth sequence.
+    case 7      :  {    //sending the rspauth sequence.
       char *HAS;
       char *rspauth;
       char *b64;
@@ -745,7 +756,7 @@ while (proceed==true) {
       HAS=rou_freestr(HAS);
       }
       break;
-    case 7      :  {    //waiting client to send an empty line
+    case 8      :  {    //waiting client to send an empty line
       char *line;
       int count;
 
@@ -755,9 +766,13 @@ while (proceed==true) {
         (void) rou_alert(0,"%s delay expired to get remote empty line (network?)",
                             OPEP);
       line=rou_freestr(line);      //EMPTY Line!
+      if (strcmp(realm,usrrealm)!=0) {
+        (void) strncpy(realm,usrrealm,sizeof(realm)-1);
+        phase=0;
+        }
       }
       break;
-    case 8      :  {    //comparing result.
+    case 9      :  {    //comparing result.
       char *HA0;
 
       if ((HA0=dig_hashresp(resp,"AUTHENTICATE",hash))==(char *)0) {
index fa31f90b8d57293a9965c648a045aa16ea46f268..aea7e8c688310e94b87ec5898951a70b630005a6 100644 (file)
@@ -353,7 +353,7 @@ return plain;
 /*      challenge as an B64 string.                     */
 /*                                                      */
 /********************************************************/
-PUBLIC char *dig_getchallenge()
+PUBLIC char *dig_getchallenge(char *realm)
 
 {
 #define OPEP    "unidig.c:dig_getchallenge,"
@@ -368,11 +368,8 @@ static char *comp[]={
         };
 
 char *challenge;
-char *realm;
 
 challenge=(char *)calloc(MAXBUF,sizeof(char));
-if ((realm=getenv("REALM"))==(char *)0)
-  realm=REALM;
 for (int num=0;comp[num]!=(char *)0;num++) {
   char loc[MAXBUF/2];
 
index 8b1856c0a0ba1c74f0c3f2d4a4610ede6f67fa02..1e48b4c540908aa57b8f88181459fec0508a658b 100644 (file)
@@ -42,7 +42,7 @@ extern char *dig_cryptmd5(const void *key,unsigned char *seq);
 
 //Procedure to generate a DISGEST-MD5 challaneg as a
 //b64 string.
-extern char *dig_getchallenge();
+extern char *dig_getchallenge(char *realm);
 
 //Procedure to compute local response to challenge and
 //check if the remote session is the same
index 909a356fc345ca2b5b09719630f01d85a4fcee35..c1b9e30ed181eedfffb7061983e7d0eadd13faa9 100644 (file)
@@ -106,6 +106,7 @@ PUBLIC USRTYP *sql_freeusr(USRTYP *usr)
 
 {
 if (usr!=(USRTYP *)0) {
+  usr->realm=rou_freestr(usr->realm);
   usr->hash=rou_freestr(usr->hash);
   usr->passwd=rou_freestr(usr->passwd);
   usr->email=rou_freestr(usr->email);
index e0dcab8e2ca6edec8772e40e23c8ca4ebe2a61e6..ba59dea4b8293fc6ed5c189e9b96e69a4edd3555 100644 (file)
@@ -21,6 +21,7 @@ typedef enum    {
 typedef struct  {
         char *email;    //user emails
         char *passwd;   //user password
+        char *realm;    //user realm
         u_int  lock;    //account is lock
         u_long space;   //user space used
         u_long mxspace; //user maximun space