From: Tom C. <tom...@us...> - 2005-01-23 05:11:56
|
Update of /cvsroot/qmailadmin/qmailadmin In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4059 Modified Files: Tag: stable-1_2 ChangeLog qmailadmin.c template.c Log Message: Added single page for changing password. [775208] Index: qmailadmin.c =================================================================== RCS file: /cvsroot/qmailadmin/qmailadmin/qmailadmin.c,v retrieving revision 1.6.2.6 retrieving revision 1.6.2.7 diff -u -d -r1.6.2.6 -r1.6.2.7 --- qmailadmin.c 12 Jan 2005 15:14:27 -0000 1.6.2.6 +++ qmailadmin.c 23 Jan 2005 05:11:45 -0000 1.6.2.7 @@ -47,6 +47,7 @@ #include "printh.h" #include "qmailadmin.h" #include "show.h" +#include "template.h" #include "user.h" #include "util.h" @@ -115,10 +116,10 @@ const char *ip_addr=getenv("REMOTE_ADDR"); const char *x_forward=getenv("HTTP_X_FORWARDED_FOR"); char *pi; - int i,j; char *rm; char returnhttp[MAX_BUFF]; char returntext[MAX_BUFF]; + struct vqpasswd *pw; init_globals(); @@ -127,21 +128,18 @@ pi=getenv("PATH_INFO"); if ( pi ) pi = strdup(pi); - if (pi && strncmp(pi, "/com/", 5) == 0) { - struct vqpasswd *pw; - - memset(TmpBuf2, 0, sizeof(TmpBuf2)); - for(j=0,i=5;pi[i]!=0&&j<99;++i,++j) TmpBuf2[j] = pi[i]; - rm = getenv("REQUEST_METHOD"); - rm = (rm == NULL ? "" : strdup(rm)); + if (pi) strcpy (TmpBuf2, pi+5); + rm = getenv("REQUEST_METHOD"); + rm = (rm == NULL ? "" : strdup(rm)); - if ( strncmp(rm , "POST", 4) == 0 ) { - get_cgi(); - } else { - TmpCGI = getenv("QUERY_STRING"); - TmpCGI = (TmpCGI == NULL ? "" : strdup(TmpCGI)); - } + if ( strncmp(rm , "POST", 4) == 0 ) { + get_cgi(); + } else { + TmpCGI = getenv("QUERY_STRING"); + TmpCGI = (TmpCGI == NULL ? "" : strdup(TmpCGI)); + } + if (pi && strncmp(pi, "/com/", 5) == 0) { GetValue(TmpCGI, Username, "user=", sizeof(Username)); GetValue(TmpCGI, Domain, "dom=", sizeof(Domain)); GetValue(TmpCGI, Time, "time=", sizeof(Time)); @@ -170,53 +168,74 @@ process_commands(); - } else if (pi && strncmp(pi, "/open/", 6) == 0) { - memset(TmpBuf2, 0, sizeof(TmpBuf2)); - for(j=0,i=6;pi[i]!=0&&j<99;++i,++j) TmpBuf2[j] = pi[i]; - rm = getenv("REQUEST_METHOD"); - rm = (rm == NULL ? "" : strdup(rm)); + } else if (pi && strncmp(pi, "/passwd/", 7) == 0) { + char User[MAX_BUFF]; + char *dom; - if ( strncmp(rm , "POST", 4) == 0 ) { - get_cgi(); - } else { - TmpCGI = getenv("QUERY_STRING"); - TmpCGI = (TmpCGI == NULL ? "" : strdup(TmpCGI)); - } + GetValue(TmpCGI, Username, "address=", sizeof(Username)); + GetValue(TmpCGI, Password, "oldpass=", sizeof(Password)); + GetValue(TmpCGI, Password1, "newpass1=", sizeof(Password1)); + GetValue(TmpCGI, Password2, "newpass2=", sizeof(Password2)); - GetValue(TmpCGI, Username, "user=", sizeof(Username)); - GetValue(TmpCGI, Domain, "dom=", sizeof(Domain)); - GetValue(TmpCGI, Time, "time=", sizeof(Time)); - Mytime = atoi(Time); + if (*Username && (*Password == '\0') && (*Password1 || *Password2)) { + /* username entered, but no password */ + snprintf (StatusMessage, sizeof(StatusMessage), "%s", get_html_text("198")); + } else if (*Username && *Password) { + /* attempt to authenticate user */ + vget_assign (Domain, RealDir, sizeof(RealDir), &Uid, &Gid); + if ( geteuid() == 0 ) { + if ( setgid(Gid) != 0 ) perror("setgid"); + if ( setuid(Uid) != 0 ) perror("setuid"); + } - vget_assign(Domain,RealDir,sizeof(RealDir),&Uid,&Gid); - if ( geteuid() == 0 ) { - if ( setgid(Gid) != 0 ) perror("setgid"); - if ( setuid(Uid) != 0 ) perror("setuid"); - } - vclose(); - exit(0); - + strcpy (User, Username); + if ((dom = strchr (User, '@')) != NULL) { + strcpy (Domain, dom+1); + *dom = '\0'; + } - } else { - char *rm; - struct vqpasswd *pw; - FILE *fs; + if ( *Domain == '\0' ) { + snprintf (StatusMessage, sizeof(StatusMessage), "%s", get_html_text("198")); + } else { + chdir(RealDir); + load_limits(); + + pw = vauth_user( User, Domain, Password, "" ); + if ( pw == NULL ) { + snprintf (StatusMessage, sizeof(StatusMessage), "%s", get_html_text("198")); + } else if (pw->pw_flags & NO_PASSWD_CHNG) { + strcpy (StatusMessage, "You don't have permission to change your password."); + } else if (strcmp (Password1, Password2) != 0) { + snprintf (StatusMessage, sizeof(StatusMessage), "%s", get_html_text("200")); + } else if (*Password1 == '\0') { + snprintf (StatusMessage, sizeof(StatusMessage), "%s", get_html_text("234")); + } else if (vpasswd (User, Domain, Password1, USE_POP) != VA_SUCCESS) { + snprintf (StatusMessage, sizeof(StatusMessage), "%s", get_html_text("140")); + } else { + /* success */ + snprintf (StatusMessage, sizeof(StatusMessage), "%s", get_html_text("139")); + *Password = '\0'; + send_template ("change_password_success.html"); + return 0; + } + } + } - rm = getenv("REQUEST_METHOD"); - if ( rm ) rm = strdup(rm); + send_template ("change_password.html"); + return 0; - if ( rm && ( strncmp(rm,"POST",4)==0 || strncmp(rm,"GET",3)==0)) { - if ( strncmp(rm , "POST", 4) == 0 ) { - get_cgi(); - } else { - TmpCGI = getenv("QUERY_STRING"); - TmpCGI = (TmpCGI == NULL ? "" : strdup(TmpCGI)); - } + } else if (*rm) { + FILE *fs; + char *dom; GetValue(TmpCGI, Username, "username=", sizeof(Username)); GetValue(TmpCGI, Domain, "domain=", sizeof(Domain)); GetValue(TmpCGI, Password, "password=", sizeof(Password)); + if ((dom = strchr (Username, '@')) != NULL) { + strcpy (Domain, dom+1); + *dom = '\0'; + } vget_assign(Domain,RealDir,sizeof(RealDir),&Uid,&Gid); if ( geteuid() == 0 ) { @@ -271,7 +290,6 @@ vclose(); exit(0); } - } } show_login(); vclose(); Index: template.c =================================================================== RCS file: /cvsroot/qmailadmin/qmailadmin/template.c,v retrieving revision 1.7.2.11 retrieving revision 1.7.2.12 diff -u -d -r1.7.2.11 -r1.7.2.12 --- template.c 5 Jan 2005 04:54:52 -0000 1.7.2.11 +++ template.c 23 Jan 2005 05:11:45 -0000 1.7.2.12 @@ -78,6 +78,7 @@ char *qnote = " MB"; struct vqpasswd *vpw; char value[MAX_BUFF]; + char value2[MAX_BUFF]; if (strstr(filename, "/")!= NULL||strstr(filename,"..")!=NULL) { printf("warning: invalid file name %s\n", filename ); @@ -268,6 +269,12 @@ show_autorespond_line(Username,Domain,Mytime,RealDir); break; + /* show returnhttp (from TmpCGI) */ + case 'H': + GetValue (TmpCGI, value, "returnhttp=", sizeof(value)); + printh ("%H", value); + break; + /* show the counts */ case 'h': show_counts(); @@ -374,6 +381,12 @@ } break; + /* show returntext (from TmpCGI) */ + case 'n': + GetValue (TmpCGI, value, "returntext=", sizeof(value)); + printh ("%H", value); + break; + /* build a pulldown menu of all POP/IMAP users */ case 'O': { @@ -423,6 +436,15 @@ } break; + /* show returntext/returnhttp if set in CGI vars */ + case 'R': + GetValue (TmpCGI, value, "returntext=", sizeof(value)); + GetValue (TmpCGI, value2, "returnhttp=", sizeof(value2)); + if (*value != '\0') { + printh ("<A HREF=\"%s\">%H</A>", value2, value); + } + break; + /* show the autoresponder stuff */ case 'r': if (AdminType == DOMAIN_ADMIN) { @@ -583,6 +605,11 @@ } break; + /* Password */ + case 'W': + printh ("%H", Password); + break; + /* dictionary line, we three more chars for the line */ case 'X': for(i=0;i<3;++i) dchar[i] = fgetc(fs); Index: ChangeLog =================================================================== RCS file: /cvsroot/qmailadmin/qmailadmin/ChangeLog,v retrieving revision 1.15.2.55 retrieving revision 1.15.2.56 diff -u -d -r1.15.2.55 -r1.15.2.56 --- ChangeLog 12 Jan 2005 15:14:27 -0000 1.15.2.55 +++ ChangeLog 23 Jan 2005 05:11:44 -0000 1.15.2.56 @@ -23,6 +23,7 @@ - INSTALL: Add note about running `libtoolize --force` on x86_64. - Update config.guess and config.sub scripts. - Include charset in HTTP Content-Type header. [1098891] + - Added single page for changing password. [775208] 1.2.6 - released 24-Dec-04 |