#include "wfm.h" //char ICO_FAV[256]; char ICO_DIR[256], ICO_AUP[256], ICO_ADN[256], ICO_GEN[256], ICO_NEW[256], ICO_ZIP[256]; char ICO_IMG[256], ICO_OFF[256], ICO_PDF[256]; char ICO_TXT[256], ICO_EXE[256], ICO_MED[257], ICO_ISO[256], ICO_LNK[256], ICO_DSK[256], ICO_EDT[256]; regex_t reg_zip, reg_img, reg_pdf, reg_exe, reg_txt, reg_off, reg_med, reg_iso, reg_lnk; 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(ICO_FAV, sizeof(ICO_FAV), "\"Favicon\"", rt.iconsurl, rt.favicon); snprintf(ICO_DIR, sizeof(ICO_DIR), "\"Dir\"", rt.iconsurl); snprintf(ICO_LNK, sizeof(ICO_LNK), "\"Link/Shortcut\"", rt.iconsurl); snprintf(ICO_AUP, sizeof(ICO_AUP), "\"Up\"", rt.iconsurl); snprintf(ICO_ADN, sizeof(ICO_ADN), "\"Down\"", rt.iconsurl); snprintf(ICO_GEN, sizeof(ICO_GEN), "\"Unknown\"", rt.iconsurl); snprintf(ICO_NEW, sizeof(ICO_NEW), "\"New\"", rt.iconsurl); snprintf(ICO_ZIP, sizeof(ICO_ZIP), "\"Archive\"", rt.iconsurl); snprintf(ICO_IMG, sizeof(ICO_IMG), "\"Image\"", rt.iconsurl); snprintf(ICO_OFF, sizeof(ICO_OFF), "\"Office", rt.iconsurl); snprintf(ICO_PDF, sizeof(ICO_PDF), "\"PDF\"", rt.iconsurl); snprintf(ICO_TXT, sizeof(ICO_TXT), "\"Text\"", rt.iconsurl); snprintf(ICO_EXE, sizeof(ICO_EXE), "\"Exec\"", rt.iconsurl); snprintf(ICO_MED, sizeof(ICO_MED), "\"Multimedia\"", rt.iconsurl); snprintf(ICO_ISO, sizeof(ICO_ISO), "\"Disk", rt.iconsurl); snprintf(ICO_DSK, sizeof(ICO_DSK), "\"Save\"", rt.iconsurl); snprintf(ICO_EDT, sizeof(ICO_EDT), "\"Edit\"", rt.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(®_exe, "\\.(exe|com|pif)$", REG_EXTENDED | REG_ICASE)!=0 || regcomp(®_lnk, "\\.(url|lnk|desktop|shortcut|webloc)$", REG_EXTENDED | REG_ICASE)!=0 || regcomp(®_txt, "\\.(txt|asc|nfo|me|md|log|htm|html|shtml|js|jsp|php|xml|dtd|css|bas|c|h|cpp|cmd|bat|sh|ksh|awk|reg|log|bak|cfg|conf|py|json|yaml)$", 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[sizeof(wp.virt_filename)]={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, *action, *raction, *ricon, *laction, *licon; int nentr=0, e=0, n=1; int editable, is_link; 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, sizeof(wp.virt_filename)-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(wp.phys_dirname, &direntry, namesort); else if(strcmp(sortby, "rname")==0) nentr=asscandir(wp.phys_dirname, &direntry, rnamesort); else if(strcmp(sortby, "size")==0) nentr=asscandir(wp.phys_dirname, &direntry, sizesort); else if(strcmp(sortby, "rsize")==0) nentr=asscandir(wp.phys_dirname, &direntry, rsizesort); else if(strcmp(sortby, "date")==0) nentr=asscandir(wp.phys_dirname, &direntry, timesort); else if(strcmp(sortby, "rdate")==0) nentr=asscandir(wp.phys_dirname, &direntry, rtimesort); else nentr=asscandir(wp.phys_dirname, &direntry, namesort); dir_icoinita(); cgiHeaderContentType("text/html"); // // HTML HEADER // fprintf(cgiOut, "\n" "\n%s\n" "\n" "\n" "%s : %c%s\n", COPYRIGHT, cfg.tagline, (strlen(wp.virt_dirname)>0) ? ' ' : '/', wp.virt_dirname); if(rt.js) fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "
\n", FONT_SIZE, FONT_SIZE, rt.iconsurl, cfg.favicon, cgiScriptName, /*(rt.js>=2) ? "onsubmit=\"start()\"" :*/ ""); // // TITLE // fprintf(cgiOut, " \n" "\n" "\n" "\n"\ "\n"\ "
\n" " \"WFM\"\n" "%s : %c%s \n" "\n", rt.iconsurl, cfg.favicon, cfg.tagline, (strlen(wp.virt_dirname)>0) ? ' ' : '/', wp.virt_dirname ); // lock / unlock if(!rt.access_as_user && cfg.users_defined) fprintf(cgiOut, "" " \"Access\" %s\n", cgiScriptName, wp.virt_dirname_urlencoded, rt.iconsurl, access_string[rt.access_level], access_string[rt.access_level]); else if(rt.auth_method==3) fprintf(cgiOut, "" "\"Access\"" " %s \"User\" %s \n", cgiScriptName, rt.iconsurl, access_string[rt.access_level], access_string[rt.access_level], rt.iconsurl, rt.loggedinuser); else fprintf(cgiOut, "\"Access\"" " %s \"User\" %s \n", cgiScriptName, wp.virt_dirname_urlencoded, rt.iconsurl, access_string[rt.access_level], access_string[rt.access_level], rt.iconsurl, rt.loggedinuser); // about / version fprintf(cgiOut, " \"Client %s " "\"Version\" v%s " "
\n", rt.iconsurl, cgiRemoteAddr, cgiScriptName, wp.virt_dirname_urlencoded, rt.token, rt.iconsurl, VERSION); // // TOOLBAR // fprintf(cgiOut, "\n"\ "\n" "\n" "\n" "\n", cgiScriptName, sortby, wp.virt_parent_urlencoded, rt.token, rt.iconsurl); fprintf(cgiOut, "\n" "\n", cgiScriptName, sortby, rt.token, rt.iconsurl); fprintf(cgiOut, "\n" "\n", cgiScriptName, sortby, wp.virt_dirname_urlencoded, rt.token, rt.iconsurl); fprintf(cgiOut, "\n"\ "\n", rt.iconsurl, (rt.js) ? "onMouseOver=\"this.className='hovin';\" onMouseOut=\"this.className='hovout';\"" : ""); fprintf(cgiOut, "\n" "\n", rt.iconsurl, (rt.js) ? "onMouseOver=\"this.className='hovin';\" onMouseOut=\"this.className='hovout';\"" : ""); fprintf(cgiOut, "\n" "\n", cgiScriptName, wp.virt_dirname_urlencoded, rt.token, rt.iconsurl); fprintf(cgiOut, "\n"\ "\n", cgiScriptName, wp.virt_dirname_urlencoded, rt.token, rt.iconsurl); fprintf(cgiOut, "\n" "\n", cgiScriptName, wp.virt_dirname_urlencoded, rt.token, ICO_LNK); 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" "" "%s New URL" "\n" "\n" "\n" "\n" "\n" " \n" "\n" "
\n", wp.virt_dirname, rt.token, upload_id, (rt.access_level==PERM_RW) ? " " : "DISABLED"); // // SORT BY // if(strcmp(sortby, "size")==0) { snprintf(namepfx, 1024, " Filename", cgiScriptName, wp.virt_dirname_urlencoded, rt.token); snprintf(sizepfx, 1024, " Size %s", cgiScriptName, wp.virt_dirname_urlencoded, rt.token, ICO_ADN); snprintf(datepfx, 1024, " Modified", cgiScriptName, wp.virt_dirname_urlencoded, rt.token); } else if(strcmp(sortby, "rsize")==0) { snprintf(namepfx, 1024, " Filename", cgiScriptName, wp.virt_dirname_urlencoded, rt.token); snprintf(sizepfx, 1024, " Size %s", cgiScriptName, wp.virt_dirname_urlencoded, rt.token, ICO_AUP); snprintf(datepfx, 1024, " Modified", cgiScriptName, wp.virt_dirname_urlencoded, rt.token); } else if(strcmp(sortby, "date")==0) { snprintf(namepfx, 1024, " Filename", cgiScriptName, wp.virt_dirname_urlencoded, rt.token); snprintf(sizepfx, 1024, " Size", cgiScriptName, wp.virt_dirname_urlencoded, rt.token); snprintf(datepfx, 1024, " Modified %s", cgiScriptName, wp.virt_dirname_urlencoded, rt.token, ICO_ADN); } else if(strcmp(sortby, "rdate")==0) { snprintf(namepfx, 1024, " Filename", cgiScriptName, wp.virt_dirname_urlencoded, rt.token); snprintf(sizepfx, 1024, " Size", cgiScriptName, wp.virt_dirname_urlencoded, rt.token); snprintf(datepfx, 1024, " Modified %s", cgiScriptName, wp.virt_dirname_urlencoded, rt.token, ICO_AUP); } else if(strcmp(sortby, "name")==0) { snprintf(namepfx, 1024, " Filename %s", cgiScriptName, wp.virt_dirname_urlencoded, rt.token, ICO_ADN); snprintf(sizepfx, 1024, " Size", cgiScriptName, wp.virt_dirname_urlencoded, rt.token); snprintf(datepfx, 1024, " Modified", cgiScriptName, wp.virt_dirname_urlencoded, rt.token); } else if(strcmp(sortby, "rname")==0) { snprintf(namepfx, 1024, " Filename %s", cgiScriptName, wp.virt_dirname_urlencoded, rt.token, ICO_AUP); snprintf(sizepfx, 1024, " Size", cgiScriptName, wp.virt_dirname_urlencoded, rt.token); snprintf(datepfx, 1024, " Modified", cgiScriptName, wp.virt_dirname_urlencoded, rt.token); } else { snprintf(namepfx, 1024, " Filename", cgiScriptName, wp.virt_dirname_urlencoded, rt.token); snprintf(sizepfx, 1024, " Size", cgiScriptName, wp.virt_dirname_urlencoded, rt.token); snprintf(datepfx, 1024, " Modified", cgiScriptName, wp.virt_dirname_urlencoded, rt.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, wp.virt_dirname_urlencoded, name_urlencoded, rt.token, name, rt.iconsurl); totalsize+=size; n++; } // regular files for(e=0; e\n"); fprintf(cgiOut, "\n\n", name, cgiScriptName, action, wp.virt_dirname_urlencoded, name_urlencoded, rt.token, action, 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" ); totalsize+=size; n++; } tstop(); // // footer line // fprintf(cgiOut, "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "
\n" "\n"); if(rt.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(wp.virt_dirname, "/")==0) ? "" : wp.virt_dirname_urlencoded, name_urlencoded, rt.token, icon, name, buprintf(size, TRUE), rtime, mtime, atime, stime, mtime); // rename fprintf(cgiOut, "\n"\ "\n"\ "\"Rename\n"\ "\n", cgiScriptName, wp.virt_dirname_urlencoded, name_urlencoded, rt.token, name, rt.iconsurl); // move fprintf(cgiOut, "\n"\ "\n"\ "\"Move\n"\ "\n", cgiScriptName, wp.virt_dirname_urlencoded, name_urlencoded, rt.token, name, rt.iconsurl); // delete fprintf(cgiOut, "\n"\ "\n"\ "\"Delete\n"\ "\n"\ "
" "%s %s%s%s %s \n"); // rename fprintf(cgiOut, "\n" "\"Rename\n" "\n", cgiScriptName, wp.virt_dirname_urlencoded, name_urlencoded, rt.token, name, rt.iconsurl); // move fprintf(cgiOut, "\n" "" "\"Move\n" "\n", cgiScriptName, wp.virt_dirname_urlencoded, name_urlencoded, rt.token, name, rt.iconsurl, name); // delete fprintf(cgiOut, "\n" " \n" "\"Delete\n" "\n", cgiScriptName, wp.virt_dirname_urlencoded, name_urlencoded, rt.token, name, rt.iconsurl); // edit for text files.. if(editable) fprintf(cgiOut, "\n" "\n" "%s\n" "\n", cgiScriptName, raction, wp.virt_dirname_urlencoded, name_urlencoded, rt.token, raction, name, ricon); // links if(is_link) fprintf(cgiOut, "\n" "\n" "%s\n" "\n", cgiScriptName, laction, wp.virt_dirname_urlencoded, name_urlencoded, rt.token, laction, name, licon); // view via external link if(strlen(cfg.homeurl)>4 && !is_link) fprintf(cgiOut, "\n" "\n" "%s\n" "\n", cfg.homeurl, (wp.virt_dirname[0]!='/') ? "/" : "", (strcmp(wp.virt_dirname, "/")==0) ? "" : wp.virt_dirname, name, name, ICO_LNK); fprintf(cgiOut, "\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 ); }