char *challenge;
RSPTYP *resp;
+char realm[200];
+char usrrealm[200];
char answer[300];
char hash[40];
int phase;
*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));
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);
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) {
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);
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) {
}
}
break;
- case 6 : { //sending the rspauth sequence.
+ case 7 : { //sending the rspauth sequence.
char *HAS;
char *rspauth;
char *b64;
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;
(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) {