/* FILE main.c $Id$ mysqlRAD2.cgi created application file for iDNS.cgi (tAuthorize.cPasswd template set) mysqlRAD2 to mysqlRAD3 transition template PURPOSE Main cgi interface and common functions used for all the other table tx.c files and their schema independent txfunc.h files -until you mess with them in non standard ways...lol. LEGAL (C) Gary Wallis and Hugo Urquiza 2001-2009 for Unixservice. All Rights Reserved. GPL (see fsf.org) LICENSE file should be included in distribution. OTHER Only Linux and somewhat Solaris and FreeBSD supported by openisp.net/Unixservice LLC. Please share your ports with us. HELP support @ openisp . net supportgrp @ unixservice . com */ #include "mysqlrad.h" #include #ifdef Solaris char *crypt(char *passwd, char *salt); #endif #include "language.h" #include "local.h" //Global vars #define SHOWPAGE 30 MYSQL gMysql; MYSQL gMysql2; unsigned long gluRowid; unsigned guStart; unsigned guEnd; unsigned guI; unsigned guN=SHOWPAGE; char gcCommand[100]; char gcFilter[100]; char gcFind[100]; unsigned guMode; unsigned guJS=0; int guPermLevel=0; unsigned guLoginClient=0; unsigned guReseller=0; unsigned guCompany=0; char gcUser[100]={""}; char gcHost[100]={""}; char gcHostname[100]={""}; char gcCompany[100]={""}; //SSLLoginCookie() char gcCookie[1024]={""}; char gcLogin[100]={""}; char gcPasswd[100]={""}; unsigned guSSLCookieLogin=0; char gcFunction[100]={""}; unsigned guListMode=0; char gcQuery[8192]={""}; char *gcQstr=gcQuery; char *gcBuildInfo="$Id$"; char *gcRADStatus="Forked"; //Local void Footer_ism3(void); void Header_ism3(char *cMsg, int iJs); const char *ForeignKey(const char *cTableName, const char *cFieldName, unsigned uKey); char *cEmailInput(char *cInput); void GetClientOwner(unsigned uClient, unsigned *uOwner); //Ext int iExtMainCommands(pentry entries[], int x); void DashBoard(const char *cOptionalMsg); void ExtMainContent(void); void ExtMainShell(int iArgc, char *cArgv[]); //Only local void ConnectDb(void); void NoSuchFunction(void); void iDNS(const char *cResult); const char *cUserLevel(unsigned uPermLevel); int iValidLogin(int iMode); void SSLCookieLogin(void); void SetLogin(void); void EncryptPasswdWithSalt(char *gcPasswd, char *cSalt); void EncryptPasswd(char *pw); void GetPLAndClient(char *cUser); void htmlSSLLogin(void); //mainfunc.h for symbolic links to this program void CalledByAlias(int iArgc,char *cArgv[]); void MonthUsageData(unsigned uSimile); void DayUsageData(unsigned uLogType); int main(int iArgc, char *cArgv[]) { pentry entries[64]; entry gentries[16]; char *gcl; register int x; int cl=0; #if defined(Linux) gethostname(gcHostname, 98); #else //Solaris sysinfo(SI_HOSTNAME, gcHostname, 98); #endif if(!strstr(cArgv[0],"iDNS.cgi")) CalledByAlias(iArgc,cArgv); if(getenv("REMOTE_HOST")!=NULL) sprintf(gcHost,"%.99s",getenv("REMOTE_HOST")); else if(getenv("REMOTE_ADDR")!=NULL) { ConnectDb(); sprintf(gcHost,"%.99s",getenv("REMOTE_ADDR")); } else { ExtMainShell(iArgc,cArgv); } if(strcmp(getenv("REQUEST_METHOD"),"POST")) { SSLCookieLogin(); gcl = getenv("QUERY_STRING"); for(x=0;gcl[0] != '\0' && x<8;x++) { getword(gentries[x].val,gcl,'&'); plustospace(gentries[x].val); unescape_url(gentries[x].val); getword(gentries[x].name,gentries[x].val,'='); //basic anti hacker escape_shell_cmd(gentries[x].val); //Local vars if(!strcmp(gentries[x].name,"gcFunction")) sprintf(gcFunction,"%.99s",gentries[x].val); } if(gcFunction[0]) { if(!strcmp(gcFunction,"Main")) iDNS(""); else if(!strcmp(gcFunction,"Logout")) { printf("Set-Cookie: iDNSLogin=; expires=\"Mon, 01-Jan-1971 00:10:10 GMT\"\n"); printf("Set-Cookie: iDNSPasswd=; expires=\"Mon, 01-Jan-1971 00:10:10 GMT\"\n"); sprintf(gcQuery,"INSERT INTO tLog SET cLabel='logout %.99s',uLogType=6,uPermLevel=%u,uLoginClient=%u,cLogin='%.99s',cHost='%.99s',cServer='%.99s',uOwner=1,uCreatedBy=1,uCreatedDate=UNIX_TIMESTAMP(NOW())",gcLogin,guPermLevel,guLoginClient,gcLogin,gcHost,gcHostname); mysql_query(&gMysql,gcQuery); gcCookie[0]=0; guPermLevel=0; guLoginClient=0; gcUser[0]=0; gcCompany[0]=0; guSSLCookieLogin=0; htmlSSLLogin(); } else if(!strcmp(gcFunction,"tZone")) ExttZoneGetHook(gentries,x); else if(!strcmp(gcFunction,"tResource")) ExttResourceGetHook(gentries,x); else if(!strcmp(gcFunction,"tRRType")) ExttRRTypeGetHook(gentries,x); else if(!strcmp(gcFunction,"tJob")) ExttJobGetHook(gentries,x); else if(!strcmp(gcFunction,"tMailServer")) ExttMailServerGetHook(gentries,x); else if(!strcmp(gcFunction,"tNSType")) ExttNSTypeGetHook(gentries,x); else if(!strcmp(gcFunction,"tNSSet")) ExttNSSetGetHook(gentries,x); else if(!strcmp(gcFunction,"tNS")) ExttNSGetHook(gentries,x); else if(!strcmp(gcFunction,"tServer")) ExttServerGetHook(gentries,x); else if(!strcmp(gcFunction,"tConfiguration")) ExttConfigurationGetHook(gentries,x); else if(!strcmp(gcFunction,"tTemplate")) ExttTemplateGetHook(gentries,x); else if(!strcmp(gcFunction,"tTemplateSet")) ExttTemplateSetGetHook(gentries,x); else if(!strcmp(gcFunction,"tTemplateType")) ExttTemplateTypeGetHook(gentries,x); else if(!strcmp(gcFunction,"tLog")) ExttLogGetHook(gentries,x); else if(!strcmp(gcFunction,"tLogType")) ExttLogTypeGetHook(gentries,x); else if(!strcmp(gcFunction,"tBlock")) ExttBlockGetHook(gentries,x); else if(!strcmp(gcFunction,"tView")) ExttViewGetHook(gentries,x); else if(!strcmp(gcFunction,"tRegistrar")) ExttRegistrarGetHook(gentries,x); else if(!strcmp(gcFunction,"tGlossary")) ExttGlossaryGetHook(gentries,x); else if(!strcmp(gcFunction,"tZoneImport")) ExttZoneImportGetHook(gentries,x); else if(!strcmp(gcFunction,"tResourceImport")) ExttResourceImportGetHook(gentries,x); else if(!strcmp(gcFunction,"tMonthHit")) ExttMonthHitGetHook(gentries,x); else if(!strcmp(gcFunction,"tMonth")) ExttMonthGetHook(gentries,x); else if(!strcmp(gcFunction,"tLogMonth")) ExttLogMonthGetHook(gentries,x); else if(!strcmp(gcFunction,"tHit")) ExttHitGetHook(gentries,x); else if(!strcmp(gcFunction,"tHitMonth")) ExttHitMonthGetHook(gentries,x); else if(!strcmp(gcFunction,"tDeletedZone")) ExttDeletedZoneGetHook(gentries,x); else if(!strcmp(gcFunction,"tDeletedResource")) ExttDeletedResourceGetHook(gentries,x); else if(!strcmp(gcFunction,"tClient")) ExttClientGetHook(gentries,x); else if(!strcmp(gcFunction,"tAuthorize")) ExttAuthorizeGetHook(gentries,x); else if(!strcmp(gcFunction,"SimileMonthUsage")) { MonthUsageData(2); exit(0); } } iDNS(""); }//end get method interface section //Post method interface cl = atoi(getenv("CONTENT_LENGTH")); for(x=0;cl && (!feof(stdin)) && x<64 ;x++) { entries[x].val = fmakeword(stdin,'&',&cl); plustospace(entries[x].val); unescape_url(entries[x].val); entries[x].name = makeword(entries[x].val,'='); //basic anti hacker //Allow posted page cursors. See PageMachine() //escape_shell_cmd(entries[x].val); if(!strcmp(entries[x].name,"gcFunction")) sprintf(gcFunction,"%.99s",entries[x].val); else if(!strcmp(entries[x].name,"guListMode")) sscanf(entries[x].val,"%u",&guListMode); else if(!strcmp(entries[x].name,"gcLogin")) sprintf(gcLogin,"%.99s",entries[x].val); else if(!strcmp(entries[x].name,"gcPasswd")) sprintf(gcPasswd,"%.99s",entries[x].val); } //SSLCookieLogin() if(!strcmp(gcFunction,"Login")) SetLogin(); if(!guPermLevel || !gcUser[0] || !guLoginClient) SSLCookieLogin(); //Main Post Menu tZoneCommands(entries,x); tResourceCommands(entries,x); tRRTypeCommands(entries,x); tJobCommands(entries,x); tMailServerCommands(entries,x); tNSTypeCommands(entries,x); tNSSetCommands(entries,x); tNSCommands(entries,x); tServerCommands(entries,x); tConfigurationCommands(entries,x); tTemplateCommands(entries,x); tTemplateSetCommands(entries,x); tTemplateTypeCommands(entries,x); tLogCommands(entries,x); tLogTypeCommands(entries,x); tBlockCommands(entries,x); tViewCommands(entries,x); tRegistrarCommands(entries,x); tGlossaryCommands(entries,x); tZoneImportCommands(entries,x); tResourceImportCommands(entries,x); tMonthHitCommands(entries,x); tMonthCommands(entries,x); tLogMonthCommands(entries,x); tHitCommands(entries,x); tHitMonthCommands(entries,x); tDeletedZoneCommands(entries,x); tDeletedResourceCommands(entries,x); tClientCommands(entries,x); tAuthorizeCommands(entries,x); iExtMainCommands(entries,x); NoSuchFunction(); return(0); }//end of main() #include "mainfunc.h" void iDNS(const char *cResult) { if(cResult[0]) { if(!strncmp(cResult,"Database server",14)) { Header_ism3("Main",guJS); printf("%s",cResult); } else { char cuDashboardType[256]={""}; GetConfiguration("uDashboardType",cuDashboardType,0); if(cuDashboardType[0]) sscanf(cuDashboardType,"%u",&guJS); //This guJS is a test hack for now Header_ism3("Dashboard",guJS); DashBoard(cResult); } } else { Header_ism3("Main",guJS); ExtMainContent(); } Footer_ism3(); }//void iDNS(const char *cResult) void StyleSheet(void) { printf("\n"); }//void StyleSheet(void) void jsCalendarHeader(void) { printf("\n"); printf("\n"); printf("\n"); printf("\n"); }//void jsCalendarHeader(void) void jsCalendarInput(char *cInputName,char *cValue,unsigned uMode) { char cMode[16]={""}; if(!uMode) sprintf(cMode,"disabled"); printf("\n",cInputName,cInputName,cValue,cMode); if(uMode) { printf("\n",cInputName,cInputName); printf("\n",cInputName,cInputName); } else printf("\n",cInputName,cValue); }//void jsCalendarInput(char *cInputName,char *cValue,unsigned uMode) void Header_ism3(char *title, int js) { printf("Content-type: text/html\n\n"); printf("\n"); printf("iDNS %s ",title); printf("\n"); StyleSheet(); printf("
\n"); //ModuleRAD3NavBars() if(!strcmp(gcFunction,"tZone") || !strcmp(gcFunction,"tZoneTools") || !strcmp(gcFunction,"tZoneList")) ExttZoneNavBar(); else if(!strcmp(gcFunction,"tResource") || !strcmp(gcFunction,"tResourceTools") || !strcmp(gcFunction,"tResourceList")) ExttResourceNavBar(); else if(!strcmp(gcFunction,"tRRType") || !strcmp(gcFunction,"tRRTypeTools") || !strcmp(gcFunction,"tRRTypeList")) ExttRRTypeNavBar(); else if(!strcmp(gcFunction,"tJob") || !strcmp(gcFunction,"tJobTools") || !strcmp(gcFunction,"tJobList")) ExttJobNavBar(); else if(!strcmp(gcFunction,"tMailServer") || !strcmp(gcFunction,"tMailServerTools") || !strcmp(gcFunction,"tMailServerList")) ExttMailServerNavBar(); else if(!strcmp(gcFunction,"tNSType") || !strcmp(gcFunction,"tNSTypeTools") || !strcmp(gcFunction,"tNSTypeList")) ExttNSTypeNavBar(); else if(!strcmp(gcFunction,"tNSSet") || !strcmp(gcFunction,"tNSSetTools") || !strcmp(gcFunction,"tNSSetList")) ExttNSSetNavBar(); else if(!strcmp(gcFunction,"tNS") || !strcmp(gcFunction,"tNSTools") || !strcmp(gcFunction,"tNSList")) ExttNSNavBar(); else if(!strcmp(gcFunction,"tServer") || !strcmp(gcFunction,"tServerTools") || !strcmp(gcFunction,"tServerList")) ExttServerNavBar(); else if(!strcmp(gcFunction,"tConfiguration") || !strcmp(gcFunction,"tConfigurationTools") || !strcmp(gcFunction,"tConfigurationList")) ExttConfigurationNavBar(); else if(!strcmp(gcFunction,"tTemplate") || !strcmp(gcFunction,"tTemplateTools") || !strcmp(gcFunction,"tTemplateList")) ExttTemplateNavBar(); else if(!strcmp(gcFunction,"tTemplateSet") || !strcmp(gcFunction,"tTemplateSetTools") || !strcmp(gcFunction,"tTemplateSetList")) ExttTemplateSetNavBar(); else if(!strcmp(gcFunction,"tTemplateType") || !strcmp(gcFunction,"tTemplateTypeTools") || !strcmp(gcFunction,"tTemplateTypeList")) ExttTemplateTypeNavBar(); else if(!strcmp(gcFunction,"tLog") || !strcmp(gcFunction,"tLogTools") || !strcmp(gcFunction,"tLogList")) ExttLogNavBar(); else if(!strcmp(gcFunction,"tLogType") || !strcmp(gcFunction,"tLogTypeTools") || !strcmp(gcFunction,"tLogTypeList")) ExttLogTypeNavBar(); else if(!strcmp(gcFunction,"tBlock") || !strcmp(gcFunction,"tBlockTools") || !strcmp(gcFunction,"tBlockList")) ExttBlockNavBar(); else if(!strcmp(gcFunction,"tView") || !strcmp(gcFunction,"tViewTools") || !strcmp(gcFunction,"tViewList")) ExttViewNavBar(); else if(!strcmp(gcFunction,"tRegistrar") || !strcmp(gcFunction,"tRegistrarTools") || !strcmp(gcFunction,"tRegistrarList")) ExttRegistrarNavBar(); else if(!strcmp(gcFunction,"tGlossary") || !strcmp(gcFunction,"tGlossaryTools") || !strcmp(gcFunction,"tGlossaryList")) ExttGlossaryNavBar(); else if(!strcmp(gcFunction,"tZoneImport") || !strcmp(gcFunction,"tZoneImportTools") || !strcmp(gcFunction,"tZoneImportList")) ExttZoneImportNavBar(); else if(!strcmp(gcFunction,"tResourceImport") || !strcmp(gcFunction,"tResourceImportTools") || !strcmp(gcFunction,"tResourceImportList")) ExttResourceImportNavBar(); else if(!strcmp(gcFunction,"tMonthHit") || !strcmp(gcFunction,"tMonthHitTools") || !strcmp(gcFunction,"tMonthHitList")) ExttMonthHitNavBar(); else if(!strcmp(gcFunction,"tMonth") || !strcmp(gcFunction,"tMonthTools") || !strcmp(gcFunction,"tMonthList")) ExttMonthNavBar(); else if(!strcmp(gcFunction,"tLogMonth") || !strcmp(gcFunction,"tLogMonthTools") || !strcmp(gcFunction,"tLogMonthList")) ExttLogMonthNavBar(); else if(!strcmp(gcFunction,"tHit") || !strcmp(gcFunction,"tHitTools") || !strcmp(gcFunction,"tHitList")) ExttHitNavBar(); else if(!strcmp(gcFunction,"tHitMonth") || !strcmp(gcFunction,"tHitMonthTools") || !strcmp(gcFunction,"tHitMonthList")) ExttHitMonthNavBar(); else if(!strcmp(gcFunction,"tDeletedZone") || !strcmp(gcFunction,"tDeletedZoneTools") || !strcmp(gcFunction,"tDeletedZoneList")) ExttDeletedZoneNavBar(); else if(!strcmp(gcFunction,"tDeletedResource") || !strcmp(gcFunction,"tDeletedResourceTools") || !strcmp(gcFunction,"tDeletedResourceList")) ExttDeletedResourceNavBar(); else if(!strcmp(gcFunction,"tClient") || !strcmp(gcFunction,"tClientTools") || !strcmp(gcFunction,"tClientList")) ExttClientNavBar(); else if(!strcmp(gcFunction,"tAuthorize") || !strcmp(gcFunction,"tAuthorizeTools") || !strcmp(gcFunction,"tAuthorizeList")) ExttAuthorizeNavBar(); //Login info printf("iDNS \n "); if(!guPermLevel) { printf("   Your IP address %s has been logged",gcHost); } else { printf("   %s ",gcUser); if(strcmp(gcUser,gcCompany)) printf("(%s) ",gcCompany); printf("logged in from %s [%s]",gcHost,cUserLevel(guPermLevel)); } //Logout link if(guSSLCookieLogin) printf(" Logout "); //Generate Menu Items printf("\n\n"); printf("\n"); }//Header_ism3(char *title, int js) void Footer_ism3(void) { printf("
"); exit(0); }//Footer_ism3(void) void ConnectDb(void) { mysql_init(&gMysql); if (!mysql_real_connect(&gMysql,DBIP0,DBLOGIN,DBPASSWD,DBNAME,DBPORT,DBSOCKET,0)) { if (!mysql_real_connect(&gMysql,DBIP1,DBLOGIN,DBPASSWD,DBNAME,DBPORT,DBSOCKET,0)) iDNS("Database server unavailable. Did you run iDNS.cgi Initialize <mysqlpwd>?"); } }//end of ConnectDb() void NoSuchFunction(void) { sprintf(gcQuery,"[%s] Not Recognized",gcFunction); htmlPlainTextError(gcQuery); } void ProcessControlVars(pentry entries[], int x) { register int i; for(i=0;i(guN=((guI/SHOWPAGE)+1))) gluRowid=guN; if(!strcmp(gcFind," >")) { //If NOT on last page show next page if( gluRowid >= guN-1 ) { //If on last page adjust end guStart= ((guI/SHOWPAGE)*SHOWPAGE) + 1; guEnd=guI; } else { guStart=((gluRowid)*SHOWPAGE)+1; guEnd=guStart+SHOWPAGE-1; gluRowid++; } } else if(!strcmp(gcFind,"< ")) { if(gluRowid>1 ) { gluRowid--; guStart=(gluRowid)*SHOWPAGE-SHOWPAGE+1; guEnd=guStart+SHOWPAGE-1; } else { guStart=1; if(guI > SHOWPAGE) { guEnd=SHOWPAGE; } else { guEnd=guI; } gluRowid=1; } } else if(!strcmp(gcFind,">>")) { guStart= ((guI/SHOWPAGE)*SHOWPAGE) + 1; guEnd=guI; gluRowid=guN; } else if(1) { guStart=1; if(guI > SHOWPAGE) { guEnd=SHOWPAGE; } else { guEnd=guI; } gluRowid=1; } guListMode=1; Header_ism3(cFuncName,0); if(!guI) { printf(LANG_PAGEMACHINE_HINT); } printf(LANG_PAGEMACHINE_SHOWING,1+(guStart/SHOWPAGE),guN,guStart,guEnd,guI); printf("",gluRowid); printf("",cFuncName); printf("\n"); } else { //Page mode //on entry guI has number of rows //on entry gluRowid has current position unless guI=1 //if guI=1 then we need to figure out real guI guN=guI; if(gluRowid<1) { gluRowid=1; return; } if(!strcmp(gcFind," >")) { //If on last page stay there if( gluRowid >= guI ) { //If on last page adjust guEnd gluRowid=guI; } else { gluRowid++; } } else if(!strcmp(gcFind,"< ")) { if(gluRowid>1 ) { gluRowid--; } else { gluRowid=1; } } else if(!strcmp(gcFind,">>")) { gluRowid=guI; } else if(!strcmp(gcFind,"<<")) { gluRowid=1; } else if(1) { //If on last page stay there if( gluRowid >= guI ) { gluRowid=guI; } } }//guEnd iLmode }//PageMachine() void OpenFieldSet(char *cLabel, unsigned uWidth) { printf("
%s\n",cLabel,uWidth); }//void OpenFieldSet() void CloseFieldSet(void) { printf("
\n"); }//void CloseFieldSet(void) void OpenRow(const char *cFieldLabel, const char *cColor) { printf("%.32s",cFieldLabel,cColor,cFieldLabel); }//void OpenRow() void tTablePullDownOwner(const char *cTableName, const char *cFieldName, const char *cOrderby, unsigned uSelector, unsigned uMode) { register int i,n; char cLabel[128]; MYSQL_RES *mysqlRes; MYSQL_ROW mysqlField; char cSelectName[34]={""}; char cHidden[100]={""}; char cLocalTableName[256]={""}; char *cp; char *cMode=""; if(!uMode) cMode="disabled"; if(!cTableName[0] || !cFieldName[0] || !cOrderby[0]) { printf("Invalid input tTablePullDown()"); return; } //Extended functionality strncpy(cLocalTableName,cTableName,255); if((cp=strchr(cLocalTableName,';'))) { strncpy(cSelectName,cp+1,32); cSelectName[32]=0; *cp=0; } if(guLoginClient==1) sprintf(gcQuery,"SELECT _rowid,%s FROM %s ORDER BY %s", cFieldName,cLocalTableName,cOrderby); else sprintf(gcQuery,"SELECT _rowid,%s FROM %s WHERE uOwner=%u OR uOwner IN" " (SELECT uClient FROM " TCLIENT " WHERE uOwner=%u) ORDER BY %s", cFieldName,cLocalTableName,guCompany,guCompany,cOrderby); macro_mySQLRunAndStoreTextVoidRet(mysqlRes); i=mysql_num_rows(mysqlRes); if(cSelectName[0]) sprintf(cLabel,"%s",cSelectName); else sprintf(cLabel,"%s_%sPullDown",cLocalTableName,cFieldName); if(i>0) { printf("\n", cLabel,mysqlField[1]); } } } else { printf("\n" ,cLabel,cMode); if(!uMode) sprintf(cHidden,"\n",cLabel); } printf("\n"); if(cHidden[0]) printf("%s",cHidden); }//tTablePullDownOwner() void tTablePullDown(const char *cTableName, const char *cFieldName, const char *cOrderby, unsigned uSelector, unsigned uMode) { register int i,n; char cLabel[128]; MYSQL_RES *mysqlRes; MYSQL_ROW mysqlField; char cSelectName[34]={""}; char cHidden[100]={""}; char cLocalTableName[256]={""}; char *cp; char *cMode=""; if(!uMode) cMode="disabled"; if(!cTableName[0] || !cFieldName[0] || !cOrderby[0]) { printf("Invalid input tTablePullDown()"); return; } //Extended functionality strncpy(cLocalTableName,cTableName,255); if((cp=strchr(cLocalTableName,';'))) { strncpy(cSelectName,cp+1,32); cSelectName[32]=0; *cp=0; } sprintf(gcQuery,"SELECT _rowid,%s FROM %s ORDER BY %s", cFieldName,cLocalTableName,cOrderby); mysql_query(&gMysql,gcQuery); if(mysql_errno(&gMysql)) { printf("%s",mysql_error(&gMysql)); return; } mysqlRes=mysql_store_result(&gMysql); i=mysql_num_rows(mysqlRes); if(cSelectName[0]) sprintf(cLabel,"%s",cSelectName); else sprintf(cLabel,"%s_%sPullDown",cLocalTableName,cFieldName); if(i>0) { printf("\n", cLabel,mysqlField[1]); } } } else { printf("\n" ,cLabel,cMode); if(!uMode) sprintf(cHidden,"\n",cLabel); } printf("\n"); if(cHidden[0]) printf("%s",cHidden); }//tTablePullDown() int ReadPullDown(const char *cTableName,const char *cFieldName,const char *cLabel) { MYSQL_RES *mysqlRes; MYSQL_ROW mysqlField; unsigned int iRowid=0;//Not found sprintf(gcQuery,"select _rowid from %s where %s='%s'", cTableName,cFieldName,TextAreaSave((char *) cLabel)); mysql_query(&gMysql,gcQuery); if(mysql_errno(&gMysql)) htmlPlainTextError(mysql_error(&gMysql)); mysqlRes=mysql_store_result(&gMysql); if((mysqlField=mysql_fetch_row(mysqlRes))) sscanf(mysqlField[0],"%u",&iRowid); mysql_free_result(mysqlRes); return(iRowid); }//ReadPullDown(char *cTableName,char *cLabel) char *TextAreaSave(char *cField) { register unsigned int i=0,j=0,uNum=0,uCtrlM=0; char *cCopy=NULL; for(i=0;cField[i];i++) { if(cField[i]=='\'' || cField[i]=='\\') uNum++; if(cField[i]=='\r') uCtrlM++; } if(!uNum && !uCtrlM) return(cField); if(uNum) cCopy=(char *)malloc( ( (strlen(cField)) + (uNum*2) + 1 )); else cCopy=(char *)cField; if(!cCopy) htmlPlainTextError("TextAreaInput() malloc error"); i=0; while(cField[i]) { if( cField[i]=='\'' ) { cCopy[j++]='\\'; cCopy[j++]='\''; } else if( cField[i]=='\\') { cCopy[j++]='\\'; cCopy[j++]='\\'; } //Remove nasty ctrl-m's. fsck /u Bill! else if(cField[i]!='\r') { cCopy[j++]=cField[i]; } i++; } cCopy[j]=0; return(cCopy); }//char *TextAreaSave(char *cField) char *TransformAngleBrackets(char *cField) { register unsigned int i=0,j=0,uNum=0; char *cCopy=NULL; for(i=0;cField[i];i++) if(cField[i]=='<' || cField[i]=='>') uNum++; if(!uNum) return(cField); cCopy=(char *)malloc( ( (strlen(cField)) + (uNum*4) + 1 )); if(!cCopy) htmlPlainTextError("TransformAngleBrackets() malloc error"); i=0; while(cField[i]) { //Expand angle brackets into HTML codes if( cField[i]=='<' ) { cCopy[j++]='&'; cCopy[j++]='l'; cCopy[j++]='t'; cCopy[j++]=';'; } else if( cField[i]=='>' ) { cCopy[j++]='&'; cCopy[j++]='g'; cCopy[j++]='t'; cCopy[j++]=';'; } else if(1) { cCopy[j++]=cField[i]; } i++; } cCopy[j]=0; return(cCopy); }//char *TransformAngleBrackets(char *cField) char *EncodeDoubleQuotes(char *cField) { register unsigned int i=0,j=0,uNum=0; char *cCopy=NULL; for(i=0;cField[i];i++) if(cField[i]=='"') uNum++; if(!uNum) return(cField); cCopy=(char *)malloc( ( (strlen(cField)) + (uNum*5) + 1 )); if(!cCopy) htmlPlainTextError("EncodeDoubleQuotes() malloc error"); i=0; while(cField[i]) { //Expand double quote into HTML codes if( cField[i]=='"' ) { cCopy[j++]='&'; cCopy[j++]='q'; cCopy[j++]='u'; cCopy[j++]='o'; cCopy[j++]='t'; cCopy[j++]=';'; } else if(1) { cCopy[j++]=cField[i]; } i++; } cCopy[j]=0; return(cCopy); }//char *EncodeDoubleQuotes(char *cField) void YesNo(unsigned uSelect) { if(uSelect) printf("Yes"); else printf("No"); }//YesNo() void YesNoPullDown(char *cFieldName, unsigned uSelect, unsigned uMode) { char cHidden[100]={""}; char *cMode=""; if(!uMode) cMode="disabled"; printf("\n", cFieldName); } else { printf("\n"); } printf("\n"); if(cHidden[0]) printf("%s",cHidden); }//YesNoPullDown() int ReadYesNoPullDown(const char *cLabel) { if(!strcmp(cLabel,"Yes")) return(1); else return(0); }//ReadYesNoPullDown(char *cLabel) const char *ForeignKey(const char *cTableName, const char *cFieldName, unsigned uKey) { MYSQL_RES *mysqlRes; MYSQL_ROW mysqlField; static char cQuery[512]; static char cKey[16]; sprintf(cQuery,"SELECT %s FROM %s WHERE _rowid=%u", cFieldName,cTableName,uKey); mysql_query(&gMysql,cQuery); if(mysql_errno(&gMysql)) return(mysql_error(&gMysql)); mysqlRes=mysql_store_result(&gMysql); if(mysql_num_rows(mysqlRes)==1) { mysqlField=mysql_fetch_row(mysqlRes); return(mysqlField[0]); } if(!uKey) { return("---"); } else { sprintf(cKey,"%u",uKey); return(cKey); } }//const char *ForeignKey(const char *cTableName, const char *cFieldName, unsigned uKey) //tValidFunc functions: Form validation feedback const char *IsZero(unsigned uInput) { if(uInput) return("black"); else return("red"); }//const char *IsZero(unsigned uInput) const char *BadIPNum(const char *cInput) { if( cInput!=NULL && cInput[0] && strcmp(cInput,"0.0.0.0")) return("black"); else return("red"); }//const char *BadIPNum(const char *cInput) const char *EmptyString(const char *cInput) { if(cInput!=NULL && cInput[0]) return("black"); else return("red"); }//const char *EmptyString(const char *cInput) //tInputFunc functions: Convert data on cgi form post char *IPNumber(char *cInput) { unsigned a=0,b=0,c=0,d=0; sscanf(cInput,"%u.%u.%u.%u",&a,&b,&c,&d); if(a>255) a=0; if(b>255) b=0; if(c>255) c=0; if(d>255) d=0; sprintf(cInput,"%u.%u.%u.%u",a,b,c,d); return(cInput); }//char *IPNumber(char *cInput) char *IPv4CIDR(char *cInput) { unsigned a=0,b=0,c=0,d=0,e=0; sscanf(cInput,"%u.%u.%u.%u/%u",&a,&b,&c,&d,&e); if(a>255) a=0; if(b>255) b=0; if(c>255) c=0; if(d>255) d=0; if(e>32) e=32; if(e<20) e=20; //TODO ggw 8/2003 CIDR alignment math for a.b.c.d vs CIDR range 20-32 //16 class C's - one IP sprintf(cInput,"%u.%u.%u.%u/%u",a,b,c,d,e); return(cInput); }//char *IPv4CIDR(char *cInput) char *IPv4Range(char *cInput) { unsigned a=0,b=0,c=0,d=0,e=0; sscanf(cInput,"%u.%u.%u.%u-%u",&a,&b,&c,&d,&e); if(a>255) a=0; if(b>255) b=0; if(c>255) c=0; if(d>255) d=0; if(e>255) e=0; if(e0;i--) { if(cInput[i]=='.') { uCountPeriods++; if(uCountPeriods>1) cInput[i]=','; } } if(uCountPeriods>1) cMoneyInput(cInput); return(cInput); }//char *cMoneyInput(char *cInput) char *cMoneyDisplay(char *cInput) { double fBuffer; int i; // //We need to convert to double before calling strfmon fBuffer=atof(cInput); i=strlen(cInput); i+=3; //Of course you may change the locale if appropiate. setlocale(LC_MONETARY, "en_US"); strfmon(cInput,i, "%n",fBuffer); return(cInput); }//char *cMoneyDisplay(char *cInput) char *FQDomainName(char *cInput) { register int i; for(i=0;cInput[i];i++) { if(!isalnum(cInput[i]) && cInput[i]!='.' && cInput[i]!='-' && cInput[i]!='_' && cInput[i]!='@' && cInput[i]!='/') break; if(isupper(cInput[i])) cInput[i]=tolower(cInput[i]); } cInput[i]=0; return(cInput); }//char *FQDomainName(char *cInput) char *WordToLower(char *cInput) { register int i; for(i=0;cInput[i];i++) { if(!isalnum(cInput[i]) && cInput[i]!='_' && cInput[i]!='-' && cInput[i]!='@' && cInput[i]!='.' ) break; if(isupper(cInput[i])) cInput[i]=tolower(cInput[i]); } cInput[i]=0; return(cInput); }//char *WordToLower(char *cInput) //SSLCookieLogin() Functions void SetLogin(void) { if( iValidLogin(0) ) { printf("Set-Cookie: iDNSLogin=%s;\n",gcLogin); printf("Set-Cookie: iDNSPasswd=%s;\n",gcPasswd); sprintf(gcUser,"%.99s",gcLogin); GetPLAndClient(gcUser); if(!guPermLevel || !guLoginClient || guPermLevel<7) { printf("Set-Cookie: iDNSLogin=; expires=\"Mon, 01-Jan-1971 00:10:10 GMT\"\n"); printf("Set-Cookie: iDNSPasswd=; expires=\"Mon, 01-Jan-1971 00:10:10 GMT\"\n"); iDNS("Access denied to backend by configuration."); } guSSLCookieLogin=1; iDNS("DashBoard"); } else { guSSLCookieLogin=0; SSLCookieLogin(); } }//void SetLogin(void) char *cGetPasswd(char *gcLogin); int iValidLogin(int mode) { char cSalt[16]={""}; char cPassword[100]={""}; //Notes: //Mode=1 means we have encrypted passwd from cookie sprintf(cPassword,"%.99s",cGetPasswd(gcLogin)); if(cPassword[0]) { if(!mode) { //MD5 vs DES salt determination if(cPassword[0]=='$' && cPassword[2]=='$') sprintf(cSalt,"%.12s",cPassword); else sprintf(cSalt,"%.2s",cPassword); EncryptPasswdWithSalt(gcPasswd,cSalt); if(!strcmp(gcPasswd,cPassword)) { //tLogType.cLabel='backend login'->uLogType=6 sprintf(gcQuery,"INSERT INTO tLog SET cLabel='login ok %.99s',uLogType=6,uPermLevel=%u,uLoginClient=%u,cLogin='%.99s',cHost='%.99s',cServer='%.99s',uOwner=1,uCreatedBy=1,uCreatedDate=UNIX_TIMESTAMP(NOW())",gcLogin,guPermLevel,guLoginClient,gcLogin,gcHost,gcHostname); mysql_query(&gMysql,gcQuery); return(1); } } else { if(!strcmp(gcPasswd,cPassword)) return(1); } } if(!mode) { sprintf(gcQuery,"INSERT INTO tLog SET cLabel='login failed %.99s',uLogType=6,uPermLevel=%u,uLoginClient=%u,cLogin='%.99s',cHost='%.99s',cServer='%.99s',uOwner=1,uCreatedBy=1,uCreatedDate=UNIX_TIMESTAMP(NOW())",gcLogin,guPermLevel,guLoginClient,gcLogin,gcHost,gcHostname); mysql_query(&gMysql,gcQuery); } return(0); }//iValidLogin() char *cGetPasswd(char *gcLogin) { static char cPasswd[100]={""}; MYSQL_RES *mysqlRes; MYSQL_ROW mysqlField; char *cp; //SQL injection code if((cp=strchr(gcLogin,'\''))) *cp=0; sprintf(gcQuery,"SELECT cPasswd FROM " TAUTHORIZE " WHERE cLabel='%s'", gcLogin); mysql_query(&gMysql,gcQuery); if(mysql_errno(&gMysql)) htmlPlainTextError(mysql_error(&gMysql)); mysqlRes=mysql_store_result(&gMysql); cPasswd[0]=0; if((mysqlField=mysql_fetch_row(mysqlRes))) sprintf(cPasswd,"%.99s",mysqlField[0]); mysql_free_result(mysqlRes); return(cPasswd); }//char *cGetPasswd(char *gcLogin) void SSLCookieLogin(void) { char *ptr,*ptr2; //Parse out login and passwd from cookies #ifdef SSLONLY if(getenv("HTTPS")==NULL) iDNS("Non SSL access denied"); #endif if(getenv("HTTP_COOKIE")!=NULL) strncpy(gcCookie,getenv("HTTP_COOKIE"),1022); if(gcCookie[0]) { if((ptr=strstr(gcCookie,"iDNSLogin="))) { ptr+=strlen("iDNSLogin="); if((ptr2=strchr(ptr,';'))) { *ptr2=0; sprintf(gcLogin,"%.99s",ptr); *ptr2=';'; } else { sprintf(gcLogin,"%.99s",ptr); } } if((ptr=strstr(gcCookie,"iDNSPasswd="))) { ptr+=strlen("iDNSPasswd="); if((ptr2=strchr(ptr,';'))) { *ptr2=0; sprintf(gcPasswd,"%.99s",ptr); *ptr2=';'; } else { sprintf(gcPasswd,"%.99s",ptr); } } }//if gcCookie[0] time saver if(!iValidLogin(1)) htmlSSLLogin(); sprintf(gcUser,"%.99s",gcLogin); GetPLAndClient(gcUser); if(!guPermLevel || !guLoginClient || guPermLevel<7) { printf("Set-Cookie: iDNSLogin=; expires=\"Mon, 01-Jan-1971 00:10:10 GMT\"\n"); printf("Set-Cookie: iDNSPasswd=; expires=\"Mon, 01-Jan-1971 00:10:10 GMT\"\n"); iDNS("Access denied to backend by configuration."); } gcPasswd[0]=0; guSSLCookieLogin=1; }//SSLCookieLogin() void htmlSSLLogin(void) { Header_ism3("",0); printf("

\n"); printf("Login: \n"); printf(" Passwd: \n"); printf(" \n"); Footer_ism3(); }//void htmlSSLLogin(void) void EncryptPasswdWithSalt(char *gcPasswd, char *cSalt) { char cPasswd[100]={""}; char *cp; sprintf(cPasswd,"%.99s",gcPasswd); cp=crypt(cPasswd,cSalt); sprintf(gcPasswd,"%.99s",cp); //Debug only //printf("Content-type: text/html\n\n"); //printf("gcPasswd=(%s),cSalt=(%s)",gcPasswd,cSalt); //exit(0); }//void EncryptPasswdWithSalt(char *gcPasswd, char *cSalt) void GetPLAndClient(char *cUser) { MYSQL_RES *mysqlRes; MYSQL_ROW mysqlField; //SQL FROM the defined external tables must provide db.tAuthorize and db.tClient for the other SQL // to work. sprintf(gcQuery,"SELECT tAuthorize.uPerm,tAuthorize.uCertClient,tAuthorize.uOwner," "tClient.cLabel" " FROM " TAUTHORIZE "," TCLIENT " WHERE tAuthorize.uOwner=tClient.uClient" " AND tAuthorize.cLabel='%s'",cUser); macro_mySQLRunAndStore(mysqlRes); if(mysql_num_rows(mysqlRes)) { mysqlField=mysql_fetch_row(mysqlRes); sscanf(mysqlField[0],"%d",&guPermLevel); sscanf(mysqlField[1],"%u",&guLoginClient); sscanf(mysqlField[2],"%u",&guCompany); sprintf(gcCompany,"%.99s",mysqlField[3]); } mysql_free_result(mysqlRes); }//void GetPLAndClient() void GetClientOwner(unsigned uClient, unsigned *uOwner) { MYSQL_RES *mysqlRes; MYSQL_ROW mysqlField; char cQuery[254]; sprintf(cQuery,"SELECT uOwner FROM " TCLIENT " WHERE uClient=%u",uClient); mysql_query(&gMysql,cQuery); if(mysql_errno(&gMysql)) htmlPlainTextError(mysql_error(&gMysql)); mysqlRes=mysql_store_result(&gMysql); *uOwner=0; if((mysqlField=mysql_fetch_row(mysqlRes))) sscanf(mysqlField[0],"%u",uOwner); mysql_free_result(mysqlRes); }//void GetClientOwner(unsigned uClient, unsigned *uOwner) void iDNSLog(unsigned uTablePK, char *cTableName, char *cLogEntry) { char cQuery[512]; //uLogType==1 is this back-end cgi by default tLogType install sprintf(cQuery,"INSERT INTO tLog SET cLabel='%.63s',uLogType=1,uPermLevel=%u,uLoginClient=%u,cLogin='%.99s',cHost='%.99s',uTablePK=%u,cTableName='%.31s',uOwner=1,uCreatedBy=1,uCreatedDate=UNIX_TIMESTAMP(NOW())",cLogEntry,guPermLevel,guLoginClient,gcLogin,gcHost,uTablePK,cTableName); mysql_query(&gMysql,cQuery); }//void iDNSLog(unsigned uTablePK, char *cTableName, char *cLogEntry) long luGetCreatedDate(char *cTableName, unsigned uTablePK) { MYSQL_RES *mysqlRes; MYSQL_ROW mysqlField; char cQuery[254]; long luCreatedDate=0; sprintf(cQuery,"SELECT uCreatedDate FROM %s WHERE _rowid=%u", cTableName,uTablePK); mysql_query(&gMysql,cQuery); if(mysql_errno(&gMysql)) htmlPlainTextError(mysql_error(&gMysql)); mysqlRes=mysql_store_result(&gMysql); if((mysqlField=mysql_fetch_row(mysqlRes))) sscanf(mysqlField[0],"%lu",&luCreatedDate); mysql_free_result(mysqlRes); return(luCreatedDate); }//long luGetCreatedDate(char *cTableName, unsigned uTablePK) long luGetModDate(char *cTableName, unsigned uTablePK) { MYSQL_RES *mysqlRes; MYSQL_ROW mysqlField; char cQuery[254]; long luModDate=0; sprintf(cQuery,"SELECT uModDate FROM %s WHERE _rowid=%u", cTableName,uTablePK); mysql_query(&gMysql,cQuery); if(mysql_errno(&gMysql)) htmlPlainTextError(mysql_error(&gMysql)); mysqlRes=mysql_store_result(&gMysql); if((mysqlField=mysql_fetch_row(mysqlRes))) sscanf(mysqlField[0],"%lu",&luModDate); mysql_free_result(mysqlRes); return(luModDate); }//long luGetModDate(char *cTableName, unsigned uTablePK) void htmlPlainTextError(const char *cError) { char cQuery[1024]; printf("Content-type: text/plain\n\n"); printf("Please report this iDNS error message ASAP:\n%s\n",cError); //Attempt to report error in tLog sprintf(cQuery,"INSERT INTO tLog SET cLabel='htmlPlainTextError',uLogType=4,uPermLevel=%u,uLoginClient=%u,cLogin='%s',cHost='%s',cMessage=\"%s\",cServer='%s',uOwner=1,uCreatedBy=%u,uCreatedDate=UNIX_TIMESTAMP(NOW())",guPermLevel,guLoginClient,gcLogin,gcHost,cError,gcHostname,guLoginClient); mysql_query(&gMysql,cQuery); if(mysql_errno(&gMysql)) printf("Another error occurred while attempting to log: %s\n", mysql_error(&gMysql)); exit(0); }//void htmlPlainTextError(const char *cError) //This algo is based on GPL work in php-4.0.4p11 url.c and FSF face file urlencode.c //Then modified to suit our needs and readability and UK style guidelines char *cURLEncode(char *cURL) { register int x,y; unsigned char *cp; int len=strlen(cURL); static unsigned char hexchars[] = "0123456789ABCDEF"; cp=(unsigned char *)malloc(3*strlen(cURL)+1); for(x=0,y=0;len--;x++,y++) { cp[y]=(unsigned char)cURL[x]; if(cp[y]==' ') { cp[y]='+'; } else if( (cp[y]<'0' && cp[y]!='-' && cp[y]!='.') || (cp[y]<'A' && cp[y]>'9') || (cp[y]>'Z' && cp[y]<'a' && cp[y]!='_') || (cp[y]>'z') ) { cp[y++]='%'; cp[y++]=hexchars[(unsigned char) cURL[x] >> 4]; cp[y]=hexchars[(unsigned char) cURL[x] & 15]; } } cp[y]='\0'; return((char *)cp); }//char *cURLEncode(char *cURL) //Starting cleanup of current client contact role permissions model //Description //1-. Root user == 1. Initial install super user, sets up root tClient ASP company // and thus the uOwner of this tClient entry is root. There should be only one // such company but this is not mandatory. This company will have the only // contacts that may have access to everything. // Root user if owner of a record blocks delete operations done by others. //2-. If record uOwner is 0 something is broken and only Root can delete or modify. //3-. Any contact of a company with perm level >= admin can mod any record // owned by parent company. For delete with perm level >= root. //4-. Any company contact with perm level >= root can delete or mod any record // of companies owned by parent company. //5-. Any contact of perm level >=user that created a record and is owned by parent company can mod that record. // Similarly for delete if user is admin level // //7 user level //10 admin level //12 root level unsigned uAllowDel(const unsigned uOwner, const unsigned uCreatedBy) { if(guListMode || !uOwner) return(0); if(uOwner) GetClientOwner(uOwner,&guReseller);//Get owner of the owner if( (guPermLevel>11 && uOwner==guCompany) //r3 || (guPermLevel>11 && guCompany==guReseller) //r4 || (guPermLevel>9 && uCreatedBy==guLoginClient && uOwner==guCompany) //r5 || (guPermLevel>11 && guCompany==1) //r1 || (guPermLevel>11 && guLoginClient==1) )//r2 return(1); return(0); }//unsigned uAllowDel(...) unsigned uAllowMod(const unsigned uOwner, const unsigned uCreatedBy) { if(guListMode || !uOwner) return(0); if(uOwner) GetClientOwner(uOwner,&guReseller);//Get owner of the owner if( (guPermLevel>9 && uOwner==guCompany) //r3 || (guPermLevel>11 && guCompany==guReseller) //r4 || (guPermLevel>6 && uCreatedBy==guLoginClient && uOwner==guCompany) //r5 || (guPermLevel>11 && guCompany==1) //r1 || (guPermLevel>11 && guLoginClient==1) )//r2 return(1); return(0); }//unsigned uAllowMod(...) void ExtListSelect(const char *cTable,const char *cVarList) { if(guPermLevel>11)//Root can read access all sprintf(gcQuery,"SELECT %s FROM %s", cVarList,cTable); else sprintf(gcQuery,"SELECT %1$s FROM %3$s," TCLIENT " WHERE %3$s.uOwner=" TCLIENT ".uClient" " AND (" TCLIENT ".uClient=%2$u OR " TCLIENT ".uOwner" " IN (SELECT uClient FROM " TCLIENT " WHERE uOwner=%2$u OR uClient=%2$u))", cVarList,guCompany,cTable); }//void ExtListSelect(...) void ExtSelect(const char *cTable,const char *cVarList,unsigned uMaxResults) { if(guPermLevel>11)//Root can read access all sprintf(gcQuery,"SELECT %1$s FROM %2$s ORDER BY %2$s._rowid", cVarList,cTable); else sprintf(gcQuery,"SELECT %1$s FROM %3$s," TCLIENT " WHERE %3$s.uOwner=" TCLIENT ".uClient" " AND (" TCLIENT ".uClient=%2$u OR " TCLIENT ".uOwner" " IN (SELECT uClient FROM " TCLIENT " WHERE uOwner=%2$u OR uClient=%2$u))" " ORDER BY %3$s._rowid", cVarList,guCompany, cTable); if(uMaxResults) { char cLimit[33]={""}; sprintf(cLimit," LIMIT %u",uMaxResults); strcat(gcQuery,cLimit); } }//void ExtSelect(...) void ExtSelectSearch(const char *cTable,const char *cVarList,const char *cSearchField,const char *cSearch,const char *cExtraCond,unsigned uMaxResults) { if(guPermLevel>11)//Root can read access all { if(cExtraCond!=NULL) sprintf(gcQuery,"SELECT %1$s FROM %2$s WHERE %3$s LIKE '%4$s%%' AND %5$s ORDER BY %3$s", cVarList,cTable,cSearchField,cSearch,cExtraCond); else sprintf(gcQuery,"SELECT %1$s FROM %2$s WHERE %3$s LIKE '%4$s%%' ORDER BY %3$s", cVarList,cTable,cSearchField,cSearch); } else { if(cExtraCond!=NULL) sprintf(gcQuery,"SELECT %1$s FROM %3$s," TCLIENT " WHERE %4$s LIKE '%5$s%%' AND %6$s AND %3$s.uOwner=" TCLIENT ".uClient" " AND (" TCLIENT ".uClient=%2$u OR " TCLIENT ".uOwner" " IN (SELECT uClient FROM " TCLIENT " WHERE uOwner=%2$u OR uClient=%2$u))" " ORDER BY %4$s", cVarList,guCompany, cTable,cSearchField,cSearch,cExtraCond); else sprintf(gcQuery,"SELECT %1$s FROM %3$s," TCLIENT " WHERE %4$s LIKE '%5$s%%' AND %3$s.uOwner=" TCLIENT ".uClient" " AND (" TCLIENT ".uClient=%2$u OR " TCLIENT ".uOwner" " IN (SELECT uClient FROM " TCLIENT " WHERE uOwner=%2$u OR uClient=%2$u))" " ORDER BY %4$s", cVarList,guCompany, cTable,cSearchField,cSearch); } if(uMaxResults) { char cLimit[33]={""}; sprintf(cLimit," LIMIT %u",uMaxResults); strcat(gcQuery,cLimit); } }//void ExtSelectSearch(...) void ExtSelectRow(const char *cTable,const char *cVarList,unsigned uRow) { if(guPermLevel>11)//Root can read access all sprintf(gcQuery,"SELECT %s FROM %s WHERE %s._rowid=%u", cVarList,cTable,cTable,uRow); else sprintf(gcQuery,"SELECT %1$s FROM %3$s," TCLIENT " WHERE %3$s.uOwner=" TCLIENT ".uClient" " AND %3$s._rowid=%4$u" " AND (" TCLIENT ".uClient=%2$u OR " TCLIENT ".uOwner" " IN (SELECT uClient FROM " TCLIENT " WHERE uOwner=%2$u OR uClient=%2$u))", cVarList,guCompany, cTable,uRow); }//void ExtSelectRow(...) //Passwd stuff static unsigned char itoa64[] = /* 0 ... 63 => ascii - 64 */ "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; void to64(s, v, n) register char *s; register long v; register int n; { while (--n >= 0) { *s++ = itoa64[v&0x3f]; v >>= 6; } }//void to64(s, v, n) void EncryptPasswd(char *pw) { //Notes: // We should change time based salt // (could be used for faster dictionary attack) // to /dev/random based system. char salt[3]; char passwd[102]={""}; char *cpw; char cMethod[16] ={""}; GetConfiguration("cCryptMethod",cMethod,0); if(!strcmp(cMethod,"MD5")) { char cSalt[] = "$1$01234567$"; (void)srand((int)time((time_t *)NULL)); to64(&cSalt[3],rand(),8); cpw = crypt(pw,cSalt); // error not verified, str NULL ("") returned } else { // default DES method sprintf(passwd,"%.99s",pw); (void)srand((int)time((time_t *)NULL)); to64(&salt[0],rand(),2); cpw=crypt(passwd,salt); } sprintf(pw,"%.99s",cpw); }//void EncryptPasswd(char *pw)