/* * FTP/HTTP daemon * users.cc Copyright (C) 1995, 96 Alex Belits * * This source/code is public free; you can distribute it and/or modify * it under terms of the GNU General Public License (published by the * Free Software Foundation) either version two of this License, or any * later version. * */ #include "fhttpd.h" #ifdef NEED_CRYPT_H #include #endif User::User(char *xusername,char *xpasswd,int xuserid,int xgroupid, char *xrealname,char *xhomedir,char *xshell){ username=NULL; passwd=NULL; userid=xuserid; groupid=xgroupid; realname=NULL; homedir=NULL; shell=NULL; if(xusername) username=(char*)malloc(strlen(xusername)+1); if(username) strcpy(username,xusername); if(xpasswd) passwd=(char*)malloc(strlen(xpasswd)+1); if(passwd) strcpy(passwd,xpasswd); if(xrealname) realname=(char*)malloc(strlen(xrealname)+1); if(realname) strcpy(realname,xrealname); if(xhomedir) homedir=(char*)malloc(strlen(xhomedir)+1); if(homedir) strcpy(homedir,xhomedir); if(xshell) shell=(char*)malloc(strlen(xshell)+1); if(shell) strcpy(shell,xshell); if(username){ charvalue=username; charvaluelength=strlen(username); } } User::~User(void){ charvalue=NULL; charvaluelength=0; if(username) free(username); if(passwd) free(passwd); if(realname) free(realname); if(homedir) free(homedir); if(shell) free(shell); } AccessRealm::AccessRealm(char *xrealmname,char *xfilename){ realmname=(char*)malloc(strlen(xrealmname)+1); if(realmname) strcpy(realmname,xrealmname); filename=(char*)malloc(strlen(xfilename)+1); if(realmname){ charvalue=realmname; charvaluelength=strlen(realmname); } if(filename){ strcpy(filename,xfilename); } } int AccessRealm::readfile(void){ FILE *f; User *curruser; char *p,buffer[MESSAGE_BUFFER_SIZE],*param[20]; int nline,nparam,i,l,userid=0,groupid=0; if(filename){ nline=0; f=fopen(filename,"rt"); if(f){ while((curruser=(User*)users.start)){ delete curruser; } while(fgets(buffer,MESSAGE_BUFFER_SIZE,f)){ nline++; buffer[(MESSAGE_BUFFER_SIZE-1)]=0; p=strchr(buffer,'\n'); if(p) *p=0; p=strchr(buffer,'\r'); if(p) *p=0; p=strchr(buffer,':'); if(p){ i=0; nparam=0; l=strlen(buffer); if(buffer[i]){ do{ param[nparam]=buffer+i; for(;buffer[i]&&buffer[i]!=':';i++); if(buffer[i]){ buffer[i]=0; i++; } nparam++; }while(i2){ userid=strtol(param[2],NULL,10); if(errno==ERANGE) userid=-1; } if(nparam>3){ groupid=strtol(param[3],NULL,10); if(errno==ERANGE) groupid=-1; } curruser=NULL; switch(nparam){ case 2: curruser=new User(param[0],param[1]); break; case 3: curruser=new User(param[0],param[1],userid); break; case 4: curruser=new User(param[0],param[1],userid,groupid); break; case 5: curruser=new User(param[0],param[1],userid,groupid,param[4]); break; case 6: curruser=new User(param[0],param[1],userid,groupid,param[4],param[5]); break; case 7: curruser=new User(param[0],param[1],userid,groupid,param[4],param[5],param[6]); break; } if(curruser) users.Add(curruser); else{ if(logfd>=0) log("Syntax error in file %s at line %d\r\n",filename,nline); else fprintf(stderr,"fhttpd: Syntax error in file %s at line %d\r\n",filename,nline); } } } fclose(f); }else{ if(logfd>=0) log("File %s not found\r\n",filename); else fprintf(stderr,"fhttpd: file %s not found\r\n",filename); return -2; } }else{ if(logfd>=0) log("Password file is not defined for realm %s\r\n",realmname); else fprintf(stderr,"fhttpd: password file is not defined for realm %s\r\n",realmname); return -1; } return 0; } User *AccessRealm::FindUser(char *name){ return (User*)users.Find(name); } int AccessRealm::CheckPassword(char *username,char *password){ if(!username) return 0; User *curruser=FindUser(username); if(!curruser) return -1; if(!curruser->passwd) return 0; if(strlen(curruser->passwd)<2) return 0; return !strcmp(curruser->passwd,crypt(password,curruser->passwd)); } AccessRealm::~AccessRealm(void){ User *curruser; charvalue=NULL; charvaluelength=0; while((curruser=(User*)users.start)){ delete curruser; } if(realmname) free(realmname); if(filename) free(filename); } AccessRights::AccessRights(char *xpattern,AccessRealm *xrealm,char *xuser){ realm=xrealm; pattern=(char*)malloc(strlen(xpattern)+1); if(pattern) strcpy(pattern,xpattern); user=(char*)malloc(strlen(xuser)+1); if(user) strcpy(user,xuser); } AccessRights::~AccessRights(void){ if(pattern) free(pattern); if(user) free(user); }