#include "wfm.h" char DIRIMG[256], AUPIMG[256], ADNIMG[256], GENIMG[256], NEWIMG[256], ZIPIMG[256]; char IMGIMG[256], OFFIMG[256], PDFIMG[256]; char TXTIMG[256], EXEIMG[256], MEDIMG[257], ISOIMG[256], LNKIMG[256]; regex_t reg_zip, reg_img, reg_pdf, reg_exe, reg_txt, reg_off, reg_med, reg_iso; char M_HR[]="(Last Hour)"; char M_DAY[]="(Last Day)"; char M_WK[]="(Last Week)"; //char M_2WK[]="(Last 2 Weeks)"; char M_MO[]="(Last Month)"; //char M_2MO[]="(Last 2 Months)"; //char M_6MO[]="(Last 6 Months)"; char M_YR[]="(Last Year)"; char M_OLD[]="(Old)"; char tNORMAL_COLOR[]="FFFFFF"; char tALTER_COLOR[]="F0F0F0"; // for alternating lines char tHIGH_COLOR[]="33CC33"; char tHL_COLOR[]="FFD700"; static const char *access_string[]={ "none", "readonly", "readwrite" }; void dir_icoinita(void) { snprintf(DIRIMG, sizeof(DIRIMG), "\"Dir\"", ICONSURL); snprintf(LNKIMG, sizeof(LNKIMG), "\"Symlink\"", ICONSURL); snprintf(AUPIMG, sizeof(AUPIMG), "\"Up\"", ICONSURL); snprintf(ADNIMG, sizeof(ADNIMG), "\"Down\"", ICONSURL); snprintf(GENIMG, sizeof(GENIMG), "\"Unknown\"", ICONSURL); snprintf(NEWIMG, sizeof(NEWIMG), "\"New\"", ICONSURL); snprintf(ZIPIMG, sizeof(ZIPIMG), "\"Archive\"", ICONSURL); snprintf(IMGIMG, sizeof(IMGIMG), "\"Image\"", ICONSURL); snprintf(OFFIMG, sizeof(OFFIMG), "\"Office", ICONSURL); snprintf(PDFIMG, sizeof(PDFIMG), "\"PDF\"", ICONSURL); snprintf(TXTIMG, sizeof(TXTIMG), "\"Text\"", ICONSURL); snprintf(EXEIMG, sizeof(EXEIMG), "\"Exec\"", ICONSURL); snprintf(MEDIMG, sizeof(MEDIMG), "\"Multimedia\"", ICONSURL); snprintf(ISOIMG, sizeof(ISOIMG), "\"Disk", ICONSURL); if( regcomp(®_zip, "\\.(zip|rar|tar|gz|tgz|z|arj|bz|tbz|7z|xz)$", REG_EXTENDED | REG_ICASE)!=0 || regcomp(®_img, "\\.(gif|png|tif|tiff|jpg|jpeg)$", REG_EXTENDED | REG_ICASE)!=0 || regcomp(®_off, "\\.(doc|docx|rtf|dot|xls|xlsx|ppt|pptx|off)$", REG_EXTENDED | REG_ICASE)!=0 || regcomp(®_iso, "\\.(iso|flp|img|nrg|dmg)$", REG_EXTENDED | REG_ICASE)!=0 || regcomp(®_med, "\\.(mp3|mp4|vaw|mov|avi|ivr|mkv)$", REG_EXTENDED | REG_ICASE)!=0 || regcomp(®_pdf, "\\.(pdf|ps|eps|ai)$", REG_EXTENDED | REG_ICASE)!=0 || regcomp(®_txt, "\\.(txt|asc|nfo|me|log|htm|html|shtml|js|jsp|php|xml|dtd|css|bas|c|h|cpp|cmd|bat|sh|ksh|awk|reg|log|bak|cfg|py)$", REG_EXTENDED | REG_ICASE)!=0 || regcomp(®_exe, "\\.(exe|com|pif)$", REG_EXTENDED | REG_ICASE)!=0 ) error("Unable to compile regex."); } // // Display directory list main panel // void dirlist(void) { ASDIR *direntry; off_t size, totalsize=0; char highlight[VIRT_FILENAME_SIZE]={0}; char namepfx[1024], sizepfx[1024], datepfx[1024]; char rtime[64], mtime[64], atime[64]; char *stime; char sortby[64]={0}; char *name, *name_urlencoded, *icon, *linecolor; int nentr=0, e=0, n=1; int editable; int upload_id=0; time_t now; time(&now); upload_id=ftok(getenv("SCRIPT_FILENAME"), getpid()); if(upload_id<1) upload_id=now; // holy shit cgiFormStringNoNewlines("highlight", highlight, VIRT_FILENAME_SIZE-1); //TODO: urlencode ? cgiFormStringNoNewlines("sortby", sortby, 63); if(strlen(sortby)<4) snprintf(sortby, 63, "name"); // // Get and Print Directory Entries // if(strcmp(sortby, "name")==0) nentr=asscandir(phys_dirname, &direntry, namesort); else if(strcmp(sortby, "rname")==0) nentr=asscandir(phys_dirname, &direntry, rnamesort); else if(strcmp(sortby, "size")==0) nentr=asscandir(phys_dirname, &direntry, sizesort); else if(strcmp(sortby, "rsize")==0) nentr=asscandir(phys_dirname, &direntry, rsizesort); else if(strcmp(sortby, "date")==0) nentr=asscandir(phys_dirname, &direntry, timesort); else if(strcmp(sortby, "rdate")==0) nentr=asscandir(phys_dirname, &direntry, rtimesort); else nentr=asscandir(phys_dirname, &direntry, namesort); dir_icoinita(); cgiHeaderContentType("text/html"); // // HTML HEADER // fprintf(cgiOut, "\n" "\n%s" "" "\n" "%s : %c%s\n", copyright, TAGLINE, (strlen(virt_dirname)>0) ? ' ' : '/', virt_dirname); if(js) fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n" "\n" "\n" "\n" "\n" "
\n", ICONSURL, FAVICON, cgiScriptName, (js>=2) ? "onsubmit=\"start()\"" : ""); // // TITLE // fprintf(cgiOut, " \n" "\n" "\n" "\n"\ "\n"\ "
\n" " \"WFM\"\n" "%s : %c%s \n" "\n", ICONSURL, FAVICON, TAGLINE, (strlen(virt_dirname)>0) ? ' ' : '/', virt_dirname ); // lock / unlock if(!access_as_user && users_defined) fprintf(cgiOut, "" " \"Access\" %s\n", cgiScriptName, virt_dirname_urlencoded, ICONSURL, access_string[access_level], access_string[access_level]); else fprintf(cgiOut, "\"Access\"" " %s \"User\" %s \n", cgiScriptName, virt_dirname_urlencoded, ICONSURL, access_string[access_level], access_string[access_level], ICONSURL, loggedinuser); // about / version fprintf(cgiOut, " \"Client %s " "\"Version\" v%s " "
\n", ICONSURL, cgiRemoteAddr, cgiScriptName, virt_dirname_urlencoded, token, ICONSURL, VERSION); // // TOOLBAR // fprintf(cgiOut, "\n"\ "\n" "\n" "\n" "\n", cgiScriptName, sortby, virt_parent_urlencoded, token, ICONSURL); fprintf(cgiOut, "\n" "\n", cgiScriptName, sortby, token, ICONSURL); fprintf(cgiOut, "\n" "\n", cgiScriptName, sortby, virt_dirname_urlencoded, token, ICONSURL); fprintf(cgiOut, "\n"\ "\n", ICONSURL, (js) ? "onMouseOver=\"this.className='hovin';\" onMouseOut=\"this.className='hovout';\"" : ""); fprintf(cgiOut, "\n" "\n", ICONSURL, (js) ? "onMouseOver=\"this.className='hovin';\" onMouseOut=\"this.className='hovout';\"" : ""); fprintf(cgiOut, "\n" "\n", cgiScriptName, virt_dirname_urlencoded, token, ICONSURL); fprintf(cgiOut, "\n"\ "\n", cgiScriptName, virt_dirname_urlencoded, token, ICONSURL); fprintf(cgiOut, "\n" "\n" "\n" "
\n" "" "\"Dir Up" "\n" "\n" "" "\"Home\" Home" "\n" "\n" "" "\"Reload\" Refresh" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\"New New Folder\n" "\n" "\n" "" "\"New New File" "\n" "\n" "\n" "\n" "\n" " \n" "\n" "
\n", virt_dirname, token, upload_id); // // SORT BY // if(strcmp(sortby, "size")==0) { snprintf(namepfx, 1024, " Filename", cgiScriptName, virt_dirname_urlencoded, token); snprintf(sizepfx, 1024, " Size %s", cgiScriptName, virt_dirname_urlencoded, token, ADNIMG); snprintf(datepfx, 1024, " Modified", cgiScriptName, virt_dirname_urlencoded, token); } else if(strcmp(sortby, "rsize")==0) { snprintf(namepfx, 1024, " Filename", cgiScriptName, virt_dirname_urlencoded, token); snprintf(sizepfx, 1024, " Size %s", cgiScriptName, virt_dirname_urlencoded, token, AUPIMG); snprintf(datepfx, 1024, " Modified", cgiScriptName, virt_dirname_urlencoded, token); } else if(strcmp(sortby, "date")==0) { snprintf(namepfx, 1024, " Filename", cgiScriptName, virt_dirname_urlencoded, token); snprintf(sizepfx, 1024, " Size", cgiScriptName, virt_dirname_urlencoded, token); snprintf(datepfx, 1024, " Modified %s", cgiScriptName, virt_dirname_urlencoded, token, ADNIMG); } else if(strcmp(sortby, "rdate")==0) { snprintf(namepfx, 1024, " Filename", cgiScriptName, virt_dirname_urlencoded, token); snprintf(sizepfx, 1024, " Size", cgiScriptName, virt_dirname_urlencoded, token); snprintf(datepfx, 1024, " Modified %s", cgiScriptName, virt_dirname_urlencoded, token, AUPIMG); } else if(strcmp(sortby, "name")==0) { snprintf(namepfx, 1024, " Filename %s", cgiScriptName, virt_dirname_urlencoded, token, ADNIMG); snprintf(sizepfx, 1024, " Size", cgiScriptName, virt_dirname_urlencoded, token); snprintf(datepfx, 1024, " Modified", cgiScriptName, virt_dirname_urlencoded, token); } else if(strcmp(sortby, "rname")==0) { snprintf(namepfx, 1024, " Filename %s", cgiScriptName, virt_dirname_urlencoded, token, AUPIMG); snprintf(sizepfx, 1024, " Size", cgiScriptName, virt_dirname_urlencoded, token); snprintf(datepfx, 1024, " Modified", cgiScriptName, virt_dirname_urlencoded, token); } else { snprintf(namepfx, 1024, " Filename", cgiScriptName, virt_dirname_urlencoded, token); snprintf(sizepfx, 1024, " Size", cgiScriptName, virt_dirname_urlencoded, token); snprintf(datepfx, 1024, " Modified", cgiScriptName, virt_dirname_urlencoded, token); } // SORTBY ROW + dir files display fprintf(cgiOut, " \n" "\n" "\n" "\n" "\n" "\n" "\n" "" "\n" "\n" "\n\n", namepfx, sizepfx, datepfx); // // Enumerate Directories // for(e=0; e\n"); fprintf(cgiOut, "\n \n"\ "\n"\ "\n"\ ""\ "\n"\ "\n\n\n", cgiScriptName, virt_dirname_urlencoded, name_urlencoded, token, name, ICONSURL); totalsize+=size; n++; } // regular files for(e=0; e\n"); fprintf(cgiOut, "\n\n", name, cgiScriptName, (edit_by_default && editable) ? "edit" : "sendfile", virt_dirname_urlencoded, name_urlencoded, token, name, icon, name); // size / date fprintf(cgiOut, "\n" "\n" "\n", buprintf(size, TRUE), rtime, mtime, atime, stime, mtime); // file tools fprintf(cgiOut, "\n\n" "\n\n", cgiScriptName, virt_dirname_urlencoded, name_urlencoded, token, name, ICONSURL); else fprintf(cgiOut, "\n" "\n" "\"Edit\n" "\n" "\n" "\n\n", cgiScriptName, virt_dirname_urlencoded, name_urlencoded, token, name, ICONSURL); } else { fprintf(cgiOut, "\n" " \n" "\n" "\n\n" ); } totalsize+=size; n++; } tstop(); // // footer line // fprintf(cgiOut, "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "
\n" "\n"); if(js) fprintf(cgiOut, "\n"); fprintf(cgiOut, "%s\n" "\n" "\n" "\n" "%s\n" "\n" "\n" "\n" "%s\n" "\n" "\n" " " "\n" "\n" " \n" "\n" "
\n" "", name); fprintf(cgiOut, "%s %s%s%s %s ", cgiScriptName, sortby, (strcmp(virt_dirname, "/")==0) ? "" : virt_dirname_urlencoded, name_urlencoded, token, icon, name, buprintf(size, TRUE), rtime, mtime, atime, stime, mtime); // rename fprintf(cgiOut, "\n"\ "\n"\ "\"Rename\n"\ "\n", cgiScriptName, virt_dirname_urlencoded, name_urlencoded, token, name, ICONSURL); // move fprintf(cgiOut, "\n"\ "\n"\ "\"Move\n"\ "\n", cgiScriptName, virt_dirname_urlencoded, name_urlencoded, token, name, ICONSURL); // delete fprintf(cgiOut, "\n"\ "\n"\ "\"Delete\n"\ "\n"\ "
" "%s %s%s%s %s \n"); // rename fprintf(cgiOut, "\n" "\"Rename\n" "\n", cgiScriptName, virt_dirname_urlencoded, name_urlencoded, token, name, ICONSURL); // move fprintf(cgiOut, "\n" "" "\"Move\n" "\n", cgiScriptName, virt_dirname_urlencoded, name_urlencoded, token, name, ICONSURL, name); // delete fprintf(cgiOut, "\n" " \n" "\"Delete\n" "\n", cgiScriptName, virt_dirname_urlencoded, name_urlencoded, token, name, ICONSURL); // view if(strlen(HOMEURL)>4) fprintf(cgiOut, "\n" "\n" "\"Preview\n" "\n", HOMEURL, (virt_dirname[0]!='/') ? "/" : "", (strcmp(virt_dirname, "/")==0) ? "" : virt_dirname, name, name, ICONSURL, name); // edit for text files.. if(editable) { if(edit_by_default) fprintf(cgiOut, "\n" "\n" "\"Download\n" "\n" "
 total %s %.1f ms  
\n
\n\n\n\n\n", tNORMAL_COLOR, tNORMAL_COLOR, buprintf(totalsize, TRUE), tNORMAL_COLOR, (t2-t1)*1000, tNORMAL_COLOR, tNORMAL_COLOR, t2-t1 ); }