void wildcard_expansion(std::vector<std::string> &my_args, const std::string &pattern, std::ofstream &logfile) { int count_matches = 0; if (pattern.find("*") != std::string::npos) { std::cout << "WILDCARD DETECTED:" << pattern << std::endl; char buf[DIR_PATH_MAX]; getcwd( buf, DIR_PATH_MAX ); DIR* dir = opendir(buf); assert (dir != NULL); struct dirent *ent; while (1) { ent = readdir(dir); if (ent == NULL) break; std::string thing = ent->d_name; if (wildcard_match(pattern,thing,logfile)) { std::cout << " MATCHED! " << thing << std::endl; validate_filename(thing); my_args.push_back(thing); count_matches++; } } closedir(dir); } else { my_args.push_back(pattern); } if (count_matches == 0) { logfile << "WARNING: No matches to wildcard pattern: " << pattern << std::endl; } }
TCHAR *ValidateTempDir() { validate_filename(state_temp_dir); if (!validpathspec(state_temp_dir)) return NULL; addtrailingslash(state_temp_dir); CreateDirectory(state_temp_dir, NULL); // state_language is used as a temp var here return my_GetTempFileName(state_language, state_temp_dir); }
static void pg_show(struct req *req, const char *fullpath) { char *manpath; const char *file; if ((file = strchr(fullpath, '/')) == NULL) { pg_error_badrequest( "You did not specify a page to show."); return; } manpath = mandoc_strndup(fullpath, file - fullpath); file++; if ( ! validate_manpath(req, manpath)) { pg_error_badrequest( "You specified an invalid manpath."); free(manpath); return; } /* * Begin by chdir()ing into the manpath. * This way we can pick up the database files, which are * relative to the manpath root. */ if (chdir(manpath) == -1) { fprintf(stderr, "chdir %s: %s\n", manpath, strerror(errno)); pg_error_internal(); free(manpath); return; } if (strcmp(manpath, "mandoc")) { free(req->q.manpath); req->q.manpath = manpath; } else free(manpath); if ( ! validate_filename(file)) { pg_error_badrequest( "You specified an invalid manual file."); return; } resp_begin_html(200, NULL); resp_searchform(req); resp_show(req, file); resp_end_html(); }
void parse_command_line(const std::string &cmd, std::string &my_program, std::vector<std::string> &my_args, std::string &my_stdin, std::string &my_stdout, std::string &my_stderr, std::ofstream &logfile) { std::stringstream ss(cmd); std::string tmp; bool bare_double_dash = false; while (ss >> tmp) { assert (tmp.size() >= 1); // grab the program name if (my_program == "") { assert (my_args.size() == 0); // program name my_program = tmp; validate_program(my_program); } // grab the arguments else { assert (my_program != ""); // look for the bare double dash if (tmp == "--") { assert (bare_double_dash == false); bare_double_dash = true; my_args.push_back(tmp); } // look for stdin/stdout/stderr else if (tmp.size() >= 1 && tmp.substr(0,1) == "<") { assert (my_stdin == ""); if (tmp.size() == 1) { ss >> tmp; bool success = ss.good(); assert (success); my_stdin = tmp; } else { my_stdin = tmp.substr(1,tmp.size()-1); } validate_filename(my_stdin); }
static INT_PTR CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static int dontsetdefstyle; page *thispage = g_this_page; TCHAR *dir = g_usrvars[thispage->parms[4]]; int browse_text = thispage->parms[3]; if (uMsg == WM_NOTIFY_INIGO_MONTOYA) { GetUIText(IDC_DIR,dir); validate_filename(dir); #ifdef NSIS_CONFIG_LOG #if !defined(NSIS_CONFIG_LOG_ODS) && !defined(NSIS_CONFIG_LOG_STDOUT) build_g_logfile(); #endif if (GetUIItem(IDC_CHECK1) != NULL) log_dolog = IsDlgButtonChecked(hwndDlg,IDC_CHECK1); #endif } if (uMsg == WM_INITDIALOG) { HWND hDir = GetUIItem(IDC_DIR); #ifdef NSIS_CONFIG_LOG if (GetAsyncKeyState(VK_SHIFT)&0x8000) { HWND h=GetUIItem(IDC_CHECK1); SetUITextFromLang(IDC_CHECK1,LANG_LOG_INSTALL_PROCESS); ShowWindow(h,SW_SHOWNA); } #endif if (validpathspec(dir) && !skip_root(dir)) addtrailingslash(dir); // workaround for bug #1209843 // // m_curwnd is only updated once WM_INITDIALOG returns. // my_SetWindowText triggers an EN_CHANGE message that // triggers a WM_IN_UPDATEMSG message that uses m_curwnd // to get the selected directory (GetUIText). // because m_curwnd is still outdated, dir varialble is // filled with an empty string. by default, dir points // to $INSTDIR. // // to solve this, m_curwnd is manually set to the correct // window handle. m_curwnd=hwndDlg; my_SetWindowText(hDir,dir); SetUITextFromLang(IDC_BROWSE,this_page->parms[2]); SetUITextFromLang(IDC_SELDIRTEXT,this_page->parms[1]); SetActiveCtl(hDir); { typedef HRESULT (WINAPI *SHAutoCompletePtr)(HWND, DWORD); SHAutoCompletePtr fSHAutoComplete; fSHAutoComplete = (SHAutoCompletePtr) myGetProcAddress(MGA_SHAutoComplete); if (fSHAutoComplete) { fSHAutoComplete(hDir, SHACF_FILESYSTEM); } } } if (uMsg == WM_COMMAND) { int id=LOWORD(wParam); if (id == IDC_DIR && HIWORD(wParam) == EN_CHANGE) { uMsg = WM_IN_UPDATEMSG; } if (id == IDC_BROWSE) { static TCHAR bt[NSIS_MAX_STRLEN]; BROWSEINFO bi = {0,}; ITEMIDLIST *idlist; bi.hwndOwner = hwndDlg; bi.pszDisplayName = g_tmp; bi.lpfn = BrowseCallbackProc; bi.lParam = (LPARAM)dir; bi.lpszTitle = GetNSISString(bt, browse_text); bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE; idlist = SHBrowseForFolder(&bi); if (idlist) { // free idlist CoTaskMemFree(idlist); addtrailingslash(dir); if (g_header->install_directory_auto_append && dir == state_install_directory) // only append to $INSTDIR (bug #1174184) { const TCHAR *post_str = ps_tmpbuf; GetNSISStringTT(g_header->install_directory_auto_append); // display name gives just the folder name if (lstrcmpi(post_str, g_tmp)) { mystrcat(dir, post_str); } } dontsetdefstyle++; SetUITextNT(IDC_DIR,dir); } else { uMsg = WM_IN_UPDATEMSG; } } } if (uMsg == WM_IN_UPDATEMSG || uMsg == WM_NOTIFY_START) { static TCHAR s[NSIS_MAX_STRLEN]; int error = 0; int available_set = 0; unsigned total, available; GetUIText(IDC_DIR,dir); if (!is_valid_instpath(dir)) error = NSIS_INSTDIR_INVALID; /** * This part is tricky. We need to make sure a few things: * * 1. GetDiskFreeSpaceEx is always called at least once for large HD. * Even if skip_root() returned NULL (e.g. "C:"). * Note that trimslashtoend() will nullify "C:". * 2. GetDiskFreeSpaceEx is called with the deepest valid directory. * e.g. C:\drive when the user types C:\drive\folder1\folder2. * This makes sure NTFS mount points are treated properly (#1946112). * 3. `s' stays valid after the loop for GetDiskFreeSpace. * This means there is no cutting beyond what skip_root() returns. * Or `s' could be recreated when GetDiskFreeSpace is called. * 4. If GetDiskFreeSpaceEx doesn't exist, GetDiskFreeSpace is used. * 5. Both functions require a trailing backslash * 6. `dir' is never modified. * */ mystrcpy(s,dir); // Test for and use the GetDiskFreeSpaceEx API { BOOL (WINAPI *GDFSE)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER) = myGetProcAddress(MGA_GetDiskFreeSpaceEx); if (GDFSE) { ULARGE_INTEGER available64; ULARGE_INTEGER a, b; TCHAR *p; TCHAR *pw = NULL; while (pw != s) // trimslashtoend() cut the entire string { if (GDFSE(s, &available64, &a, &b)) { #ifndef _NSIS_NO_INT64_SHR available = (int)(available64.QuadPart >> 10); #else available = (int)(Int64ShrlMod32(available64.QuadPart, 10)); #endif available_set++; break; } if (pw) // if pw was set, remove the backslash so trimslashtoend() will cut a new one *pw = 0; p = trimslashtoend(s); // trim last backslash // bring it back, but make the next char null pw = p; *pw = 0; --pw; *pw = _T('\\'); } } } if (!available_set) { DWORD spc, bps, fc, tc; TCHAR *root; // GetDiskFreeSpaceEx accepts any path, but GetDiskFreeSpace accepts only the root mystrcpy(s,dir); root=skip_root(s); if (root) *root=0; // GetDiskFreeSpaceEx is not available if (GetDiskFreeSpace(s, &spc, &bps, &fc, &tc)) { available = (int)MulDiv(bps * spc, fc, 1 << 10); available_set++; } } total = (unsigned) sumsecsfield(size_kb); #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wmaybe-uninitialized" // available_set is checked first so available is initialized #endif if (available_set && available < total) error = NSIS_INSTDIR_NOT_ENOUGH_SPACE; #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) #pragma GCC diagnostic pop #endif if (LANG_STR_TAB(LANG_SPACE_REQ)) { SetSizeText(IDC_SPACEREQUIRED,LANG_SPACE_REQ,total); if (available_set) SetSizeText(IDC_SPACEAVAILABLE,LANG_SPACE_AVAIL,available); else SetUITextNT(IDC_SPACEAVAILABLE,_T("")); } g_exec_flags.instdir_error = error; #ifdef NSIS_SUPPORT_CODECALLBACKS if (!error) error = ExecuteCallbackFunction(CB_ONVERIFYINSTDIR); #endif if (thispage->flags & PF_DIR_NO_BTN_DISABLE) error = 0; EnableNext(!error); if (!error && !dontsetdefstyle) SetNextDef(); dontsetdefstyle = 0; }
static INT_PTR CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static int dontsetdefstyle; page *thispage = g_this_page; TCHAR *dir = g_usrvars[thispage->parms[4]]; int browse_text = thispage->parms[3]; if (uMsg == WM_NOTIFY_INIGO_MONTOYA) { GetUIText(IDC_DIR,dir); validate_filename(dir); #ifdef NSIS_CONFIG_LOG #if !defined(NSIS_CONFIG_LOG_ODS) && !defined(NSIS_CONFIG_LOG_STDOUT) build_g_logfile(); #endif if (GetUIItem(IDC_CHECK1) != NULL) log_dolog = IsDlgButtonChecked(hwndDlg,IDC_CHECK1); #endif } if (uMsg == WM_INITDIALOG) { HWND hDir = GetUIItem(IDC_DIR); #ifdef NSIS_CONFIG_LOG if (GetAsyncKeyState(VK_SHIFT)&0x8000) { HWND h=GetUIItem(IDC_CHECK1); SetUITextFromLang(IDC_CHECK1,LANG_LOG_INSTALL_PROCESS); ShowWindow(h,SW_SHOWNA); } #endif if (validpathspec(dir) && !skip_root(dir)) addtrailingslash(dir); // workaround for bug #1209843 // // m_curwnd is only updated once WM_INITDIALOG returns. // my_SetWindowText triggers an EN_CHANGE message that // triggers a WM_IN_UPDATEMSG message that uses m_curwnd // to get the selected directory (GetUIText). // because m_curwnd is still outdated, dir varialble is // filled with an empty string. by default, dir points // to $INSTDIR. // // to solve this, m_curwnd is manually set to the correct // window handle. m_curwnd=hwndDlg; my_SetWindowText(hDir,dir); SetUITextFromLang(IDC_BROWSE,this_page->parms[2]); SetUITextFromLang(IDC_SELDIRTEXT,this_page->parms[1]); SetActiveCtl(hDir); { typedef HRESULT (WINAPI *SHAutoCompletePtr)(HWND, DWORD); SHAutoCompletePtr fSHAutoComplete; static const TCHAR shlwapi[] = TEXT("shlwapi.dll"); static const char shac[] = "SHAutoComplete"; fSHAutoComplete = (SHAutoCompletePtr) myGetProcAddress((TCHAR *)shlwapi, (char *) shac); if (fSHAutoComplete) { fSHAutoComplete(hDir, SHACF_FILESYSTEM); } } } if (uMsg == WM_COMMAND) { int id=LOWORD(wParam); if (id == IDC_DIR && HIWORD(wParam) == EN_CHANGE) { uMsg = WM_IN_UPDATEMSG; } if (id == IDC_BROWSE) { static TCHAR bt[NSIS_MAX_STRLEN]; BROWSEINFO bi = {0,}; ITEMIDLIST *idlist; bi.hwndOwner = hwndDlg; bi.pszDisplayName = g_tmp; bi.lpfn = BrowseCallbackProc; bi.lParam = (LPARAM)dir; bi.lpszTitle = GetNSISString(bt, browse_text); bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE; idlist = SHBrowseForFolder(&bi); if (idlist) { // free idlist FreePIDL(idlist); addtrailingslash(dir); if (g_header->install_directory_auto_append && dir == state_install_directory) // only append to $INSTDIR (bug #1174184) { const TCHAR *post_str = ps_tmpbuf; GetNSISStringTT(g_header->install_directory_auto_append); // display name gives just the folder name if (lstrcmpi(post_str, g_tmp)) { mystrcat(dir, post_str); } } dontsetdefstyle++; SetUITextNT(IDC_DIR,dir); } else { uMsg = WM_IN_UPDATEMSG; } } } if (uMsg == WM_IN_UPDATEMSG || uMsg == WM_NOTIFY_START) { static TCHAR s[NSIS_MAX_STRLEN]; TCHAR *p; int error = 0; int available_set = 0; unsigned total, available = 0xFFFFFFFF; GetUIText(IDC_DIR,dir); if (!is_valid_instpath(dir)) error = NSIS_INSTDIR_INVALID; mystrcpy(s,dir); p=skip_root(s); if (p) *p=0; // Test for and use the GetDiskFreeSpaceEx API { #ifdef UNICODE BOOL (WINAPI *GDFSE)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER) = myGetProcAddress(L"KERNEL32.dll", "GetDiskFreeSpaceExW"); #else BOOL (WINAPI *GDFSE)(LPCSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER) = myGetProcAddress("KERNEL32.dll", "GetDiskFreeSpaceExA"); #endif if (GDFSE) { ULARGE_INTEGER available64; ULARGE_INTEGER a, b; if (GDFSE(s, &available64, &a, &b)) { #ifndef _NSIS_NO_INT64_SHR available = (int)(available64.QuadPart >> 10); #else available = (int)(Int64ShrlMod32(available64.QuadPart, 10)); #endif available_set++; } } } if (!available_set) { // GetDiskFreeSpaceEx is not available DWORD spc, bps, fc, tc; if (GetDiskFreeSpace(s, &spc, &bps, &fc, &tc)) { available = (int)MulDiv(bps * spc, fc, 1 << 10); available_set++; } } total = (unsigned) sumsecsfield(size_kb); if (available < total) error = NSIS_INSTDIR_NOT_ENOUGH_SPACE; if (LANG_STR_TAB(LANG_SPACE_REQ)) { SetSizeText(IDC_SPACEREQUIRED,LANG_SPACE_REQ,total); if (available_set) SetSizeText(IDC_SPACEAVAILABLE,LANG_SPACE_AVAIL,available); else SetUITextNT(IDC_SPACEAVAILABLE,TEXT("")); } g_exec_flags.instdir_error = error; #ifdef NSIS_SUPPORT_CODECALLBACKS if (!error) error = ExecuteCallbackFunction(CB_ONVERIFYINSTDIR); #endif if (thispage->flags & PF_DIR_NO_BTN_DISABLE) error = 0; EnableNext(!error); if (!error && !dontsetdefstyle) SetNextDef(); dontsetdefstyle = 0; }
static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { page *thispage = g_this_page; char *dir = g_usrvars[thispage->parms[4]]; int browse_text = thispage->parms[3]; if (uMsg == WM_NOTIFY_INIGO_MONTOYA) { GetUIText(IDC_DIR,dir,NSIS_MAX_STRLEN); validate_filename(dir); #ifdef NSIS_CONFIG_LOG #ifndef NSIS_CONFIG_LOG_ODS build_g_logfile(); #endif log_dolog = IsDlgButtonChecked(hwndDlg,IDC_CHECK1); #endif } if (uMsg == WM_INITDIALOG) { #ifdef NSIS_CONFIG_LOG if (GetAsyncKeyState(VK_SHIFT)&0x8000) { HWND h=GetUIItem(IDC_CHECK1); SetUITextFromLang(IDC_CHECK1,LANG_LOG_INSTALL_PROCESS); ShowWindow(h,SW_SHOWNA); } #endif if (validpathspec(dir) && !skip_root(dir)) addtrailingslash(dir); SetUITextNT(IDC_DIR,dir); SetUITextFromLang(IDC_BROWSE,this_page->parms[2]); SetUITextFromLang(IDC_SELDIRTEXT,this_page->parms[1]); } if (uMsg == WM_COMMAND) { int id=LOWORD(wParam); if (id == IDC_DIR && HIWORD(wParam) == EN_CHANGE) { uMsg = WM_IN_UPDATEMSG; } if (id == IDC_BROWSE) { char name[MAX_PATH]; BROWSEINFO bi = {0,}; ITEMIDLIST *idlist; bi.hwndOwner = hwndDlg; bi.pszDisplayName = name; bi.lpfn = BrowseCallbackProc; bi.lParam = (LPARAM)dir; bi.lpszTitle = GetNSISStringTT(browse_text); #ifndef BIF_NEWDIALOGSTYLE #define BIF_NEWDIALOGSTYLE 0x0040 #endif bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE; idlist = SHBrowseForFolder(&bi); if (idlist) { // Get and free idlist my_PIDL2Path(name, idlist); if (g_header->install_directory_auto_append) { const char *post_str=ps_tmpbuf; GetNSISStringTT(g_header->install_directory_auto_append); // name gives just the folder name if (lstrcmpi(post_str,name)) { lstrcat(addtrailingslash(dir),post_str); } } SetUITextNT(IDC_DIR,dir); } } } if (uMsg == WM_IN_UPDATEMSG || uMsg == WM_NOTIFY_START) { static char s[NSIS_MAX_STRLEN]; char *p; int error = 0; int total, available=-1; DWORD spc,bps,fc,tc; GetUIText(IDC_DIR,dir,NSIS_MAX_STRLEN); if (!is_valid_instpath(dir)) error = NSIS_INSTDIR_INVALID; mystrcpy(s,dir); p=skip_root(s); if (p) *p=0; if (GetDiskFreeSpace(s,&spc,&bps,&fc,&tc)) { DWORD r=MulDiv(bps*spc,fc,1<<10); if (r > 0x7fffffff) r=0x7fffffff; available=(int)r; } total = getreqsize(); if ((unsigned int)available < (unsigned int)total) error = NSIS_INSTDIR_NOT_ENOUGH_SPACE; if (LANG_STR_TAB(LANG_SPACE_REQ)) { SetUITextNT(IDC_SPACEREQUIRED,inttosizestr(total,GetNSISString(s,LANG_SPACE_REQ))); if (available != -1) SetUITextNT(IDC_SPACEAVAILABLE,inttosizestr(available,GetNSISString(s,LANG_SPACE_AVAIL))); else SetUITextNT(IDC_SPACEAVAILABLE,""); } g_exec_flags.instdir_error = error; #ifdef NSIS_SUPPORT_CODECALLBACKS if (!error) error = ExecuteCodeSegment(g_header->code_onVerifyInstDir,NULL); #endif if (thispage->flags & PF_DIR_NO_BTN_DISABLE) error = 0; EnableWindow(m_hwndOK, !error); } return HandleStaticBkColor(); }
static void pg_searchres(const struct req *req, struct manpage *r, size_t sz) { char *arch, *archend; size_t i, iuse, isec; int archprio, archpriouse; int prio, priouse; char sec; for (i = 0; i < sz; i++) { if (validate_filename(r[i].file)) continue; fprintf(stderr, "invalid filename %s in %s database\n", r[i].file, req->q.manpath); pg_error_internal(); return; } if (1 == sz) { /* * If we have just one result, then jump there now * without any delay. */ printf("Status: 303 See Other\r\n"); printf("Location: http://%s%s/%s/%s?", HTTP_HOST, scriptname, req->q.manpath, r[0].file); http_printquery(req, "&"); printf("\r\n" "Content-Type: text/html; charset=utf-8\r\n" "\r\n"); return; } resp_begin_html(200, NULL); resp_searchform(req); puts("<DIV CLASS=\"results\">"); puts("<TABLE>"); for (i = 0; i < sz; i++) { printf("<TR>\n" "<TD CLASS=\"title\">\n" "<A HREF=\"%s/%s/%s?", scriptname, req->q.manpath, r[i].file); http_printquery(req, "&"); printf("\">"); html_print(r[i].names); printf("</A>\n" "</TD>\n" "<TD CLASS=\"desc\">"); html_print(r[i].output); puts("</TD>\n" "</TR>"); } puts("</TABLE>\n" "</DIV>"); /* * In man(1) mode, show one of the pages * even if more than one is found. */ if (req->q.equal) { puts("<HR>"); iuse = 0; priouse = 10; archpriouse = 3; for (i = 0; i < sz; i++) { isec = strcspn(r[i].file, "123456789"); sec = r[i].file[isec]; if ('\0' == sec) continue; prio = sec_prios[sec - '1']; if (NULL == req->q.arch) { archprio = (NULL == (arch = strchr( r[i].file + isec, '/'))) ? 3 : (NULL == (archend = strchr( arch + 1, '/'))) ? 0 : strncmp(arch, "amd64/", archend - arch) ? 2 : 1; if (archprio < archpriouse) { archpriouse = archprio; priouse = prio; iuse = i; continue; } if (archprio > archpriouse) continue; } if (prio >= priouse) continue; priouse = prio; iuse = i; } resp_show(req, r[iuse].file); } resp_end_html(); }
static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static int dontsetdefstyle; page *thispage = g_this_page; char *dir = g_usrvars[thispage->parms[4]]; int browse_text = thispage->parms[3]; if (uMsg == WM_NOTIFY_INIGO_MONTOYA) { GetUIText(IDC_DIR,dir); validate_filename(dir); #ifdef NSIS_CONFIG_LOG #ifndef NSIS_CONFIG_LOG_ODS build_g_logfile(); #endif log_dolog = IsDlgButtonChecked(hwndDlg,IDC_CHECK1); #endif } if (uMsg == WM_INITDIALOG) { #ifdef NSIS_CONFIG_LOG if (GetAsyncKeyState(VK_SHIFT)&0x8000) { HWND h=GetUIItem(IDC_CHECK1); SetUITextFromLang(IDC_CHECK1,LANG_LOG_INSTALL_PROCESS); ShowWindow(h,SW_SHOWNA); } #endif if (validpathspec(dir) && !skip_root(dir)) addtrailingslash(dir); SetUITextNT(IDC_DIR,dir); SetUITextFromLang(IDC_BROWSE,this_page->parms[2]); SetUITextFromLang(IDC_SELDIRTEXT,this_page->parms[1]); SetActiveCtl(GetUIItem(IDC_DIR)); } if (uMsg == WM_COMMAND) { int id=LOWORD(wParam); if (id == IDC_DIR && HIWORD(wParam) == EN_CHANGE) { uMsg = WM_IN_UPDATEMSG; } if (id == IDC_BROWSE) { BROWSEINFO bi = {0,}; ITEMIDLIST *idlist; bi.hwndOwner = hwndDlg; bi.pszDisplayName = g_tmp; bi.lpfn = BrowseCallbackProc; bi.lParam = (LPARAM)dir; bi.lpszTitle = GetNSISStringTT(browse_text); bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE; idlist = SHBrowseForFolder(&bi); if (idlist) { // free idlist FreePIDL(idlist); if (g_header->install_directory_auto_append) { const char *post_str = ps_tmpbuf; GetNSISStringTT(g_header->install_directory_auto_append); // display name gives just the folder name if (lstrcmpi(post_str, g_tmp)) { lstrcat(addtrailingslash(dir), post_str); } } dontsetdefstyle++; SetUITextNT(IDC_DIR,dir); } } } if (uMsg == WM_IN_UPDATEMSG || uMsg == WM_NOTIFY_START) { static char s[NSIS_MAX_STRLEN]; char *p; int error = 0; int available_set=0; unsigned total, available; HMODULE hLib; GetUIText(IDC_DIR,dir); if (!is_valid_instpath(dir)) error = NSIS_INSTDIR_INVALID; mystrcpy(s,dir); p=skip_root(s); if (p) *p=0; // Test for and use the GetDiskFreeSpaceEx API hLib = GetModuleHandle("KERNEL32.dll"); if (hLib) { BOOL (WINAPI *GDFSE)(LPCSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER) = (void*)GetProcAddress(hLib, "GetDiskFreeSpaceExA"); if (GDFSE) { ULARGE_INTEGER available64; ULARGE_INTEGER a, b; if (GDFSE(s, &available64, &a, &b)) { available = (int)(available64.QuadPart >> 10); available_set++; } } } if (!available_set) { // GetDiskFreeSpaceEx is not available DWORD spc, bps, fc, tc; if (GetDiskFreeSpace(s, &spc, &bps, &fc, &tc)) { available = (int)MulDiv(bps * spc, fc, 1 << 10); available_set++; } } total = (unsigned) sumsecsfield(size_kb); if (available < total) error = NSIS_INSTDIR_NOT_ENOUGH_SPACE; if (LANG_STR_TAB(LANG_SPACE_REQ)) { SetUITextNT(IDC_SPACEREQUIRED,inttosizestr(total,GetNSISString(s,LANG_SPACE_REQ))); // Did we get a usable value above? if (available >= 0) SetUITextNT(IDC_SPACEAVAILABLE,inttosizestr(available,GetNSISString(s,LANG_SPACE_AVAIL))); else SetUITextNT(IDC_SPACEAVAILABLE,""); } g_exec_flags.instdir_error = error; #ifdef NSIS_SUPPORT_CODECALLBACKS if (!error) error = ExecuteCallbackFunction(CB_ONVERIFYINSTDIR); #endif if (thispage->flags & PF_DIR_NO_BTN_DISABLE) error = 0; EnableNext(!error); if (!error && !dontsetdefstyle) SetNextDef(); dontsetdefstyle = 0; }
/* Do all the dirty work of recursing through a directory structure * check everything for validitiy and update everything properly. * Note it does not check filesizes !!!, it doesn't know anything * about them */ static int add_dir_to_filelist(struct benchfiles *bf, DIR *subdir, char *subdir_path, fl_validation_func_t vfunc, void *vf_data) { int retval = 0; struct dirent *d_ent = NULL; while ((d_ent = readdir(subdir)) != NULL) { DIR *tmp = NULL; char filename_buf[FILENAME_MAX*2]; if (FILENAME_MAX < snprintf(filename_buf, FILENAME_MAX, "%s/%s", subdir_path, d_ent->d_name)) { printf("filename \"%s\" too long aborting\n", filename_buf); return -1; } tmp = opendir(filename_buf); if (tmp == NULL) { struct ffsb_file *ffsb_file = NULL; if (validate_filename(bf, d_ent->d_name) < 0) { printf("filename \"%s\" is invalid aborting\n", d_ent->d_name); return -1; } /* Verify size/other attributes via callback */ if (vfunc(bf, filename_buf, vf_data)) { printf("filename \"%s\" didn't pass " "validation\n", d_ent->d_name); return -1; } /* Add file to data structure */ ffsb_file = add_file_named(bf, ffsb_get_filesize(filename_buf), filename_buf); unlock_file_writer(ffsb_file); } else { /* Check for the usual suspects and skip them */ if ((0 == strcmp(".", d_ent->d_name)) || (0 == strcmp("..", d_ent->d_name))) { closedir(tmp); continue; } if (validate_dirname(bf, d_ent->d_name) < 0) { printf("dirname \"%s\" is invalid aborting\n", d_ent->d_name); closedir(tmp); return -1; } if (vfunc(bf, filename_buf, vf_data)) { printf("dir \"%s\" didn't pass validation\n", d_ent->d_name); closedir(tmp); return -1; } /* Update filelist */ bf->numsubdirs++; /* recurse */ retval += add_dir_to_filelist(bf, tmp, filename_buf, vfunc, vf_data); /* clean up */ closedir(tmp); } } return retval; }
BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { HWND hwLocation = GetDlgItem(hwndDlg, IDC_LOCATION); HWND hwDirList = GetDlgItem(hwndDlg, IDC_DIRLIST); HWND hwCheckBox = GetDlgItem(hwndDlg, IDC_CHECK); switch (uMsg) { case WM_INITDIALOG: { HWND hwIcon; HWND hwText; RECT dialog_r, temp_r; HFONT hFont = (HFONT) SendMessage(hwParent, WM_GETFONT, 0, 0); int y_offset = 0; int width, height; int baseUnitY; // Init dialog unit conversion { TEXTMETRIC tm; HDC hDC; hDC = GetDC(hwndDlg); SelectObject(hDC, hFont); GetTextMetrics(hDC, &tm); baseUnitY = tm.tmHeight; ReleaseDC(hwndDlg, hDC); } GetWindowRect(hwChild, &dialog_r); ScreenToClient(hwParent, (LPPOINT) &dialog_r); ScreenToClient(hwParent, ((LPPOINT) &dialog_r) + 1); width = dialog_r.right - dialog_r.left; height = dialog_r.bottom - dialog_r.top; MoveWindow( hwndDlg, dialog_r.left, dialog_r.top, width, height, FALSE ); hwIcon = GetDlgItem(hwndDlg, IDC_NSISICON); hwText = GetDlgItem(hwndDlg, IDC_TEXT); g_hwDirList = hwDirList; SendMessage(hwndDlg, WM_SETFONT, (WPARAM) hFont, TRUE); SendMessage(hwIcon, WM_SETFONT, (WPARAM) hFont, TRUE); SendMessage(hwText, WM_SETFONT, (WPARAM) hFont, TRUE); SendMessage(hwLocation, WM_SETFONT, (WPARAM) hFont, TRUE); SendMessage(hwDirList, WM_SETFONT, (WPARAM) hFont, TRUE); SendMessage(hwCheckBox, WM_SETFONT, (WPARAM) hFont, TRUE); if (rtl) { AddRTLStyle(hwText, SS_RIGHT); AddRTLStyle(hwLocation, ES_RIGHT); AddRTLStyle(hwDirList, 0); AddRTLStyle(hwCheckBox, BS_RIGHT | BS_LEFTTEXT); } GetClientRect(hwIcon, &temp_r); if (!noicon) { SendMessage( hwIcon, STM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadIcon(GetModuleHandle(0), MAKEINTRESOURCE(103)) ); MoveWindow( hwIcon, rtl ? width - temp_r.right : 0, 0, temp_r.right, temp_r.bottom, FALSE ); temp_r.right += 3; } else { ShowWindow(hwIcon, SW_HIDE); temp_r.right = 0; } if (rtl) { ProgressiveSetWindowPos( hwText, 0, width - temp_r.right, 3 * baseUnitY //MulDiv(24, baseUnitY, 8); ); } else { ProgressiveSetWindowPos( hwText, temp_r.right, width - temp_r.right + 3, 3 * baseUnitY //MulDiv(24, baseUnitY, 8); ); } SetWindowText(hwText, *text ? text : "Select the Start Menu folder in which you would like to create the program's shortcuts:"); ProgressiveSetWindowPos( hwLocation, 0, width, MulDiv(12, baseUnitY, 8) ); if (*lastused == '>') { CheckDlgButton(hwndDlg, IDC_CHECK, BST_CHECKED); lstrcpy(lastused, lstrcpy(buf, lastused) + 1); EnableWindow(hwDirList, FALSE); EnableWindow(hwLocation, FALSE); } SetWindowText(hwLocation, *lastused ? lastused : progname); temp_r.bottom = MulDiv(8, baseUnitY, 8); ProgressiveSetWindowPos( hwDirList, 0, width, height - y_offset - (*checkbox ? temp_r.bottom + 3 : 0) ); if (*checkbox) { ProgressiveSetWindowPos( hwCheckBox, 0, width, temp_r.bottom ); ShowWindow(hwCheckBox, SW_SHOWNA); SetWindowText(hwCheckBox, checkbox); } AddFolderFromReg(CSIDL_COMMON_PROGRAMS); AddFolderFromReg(CSIDL_PROGRAMS); // Tell NSIS to remove old inner dialog and pass handle of the new inner dialog SendMessage(hwParent, WM_NOTIFY_CUSTOM_READY, (WPARAM)hwndDlg, 0); ShowWindow(hwndDlg, SW_SHOWNA); if (IsDlgButtonChecked(hwndDlg, IDC_CHECK) == BST_CHECKED) SendMessage(hwndDlg, WM_NEXTDLGCTL, (WPARAM) hwCheckBox, TRUE); else SendMessage(hwndDlg, WM_NEXTDLGCTL, (WPARAM) hwLocation, TRUE); } break; case WM_COMMAND: if (LOWORD(wParam) == IDC_DIRLIST && HIWORD(wParam) == LBN_SELCHANGE) { SendMessage(hwDirList, LB_GETTEXT, SendMessage(hwDirList, LB_GETCURSEL, 0, 0), (WPARAM)buf); if (autoadd) lstrcat(lstrcat(buf, "\\"), progname); SetWindowText(hwLocation, buf); } else if (LOWORD(wParam) == IDC_CHECK && HIWORD(wParam) == BN_CLICKED) { BOOL bEnable = IsDlgButtonChecked(hwndDlg, IDC_CHECK) != BST_CHECKED; EnableWindow(hwDirList, bEnable); EnableWindow(hwLocation, bEnable); } else if (LOWORD(wParam) == IDC_LOCATION && HIWORD(wParam) == EN_CHANGE) { GetWindowText(hwLocation, buf, MAX_PATH); validate_filename(buf); EnableWindow(GetDlgItem(hwParent, IDOK), *buf != '\0'); } break; case WM_USER+666: g_done = 1; if (wParam == NOTIFY_BYE_BYE) pushstring("cancel"); else { GetWindowText(hwLocation, buf + 1, MAX_PATH); validate_filename(buf); if (IsDlgButtonChecked(hwndDlg, IDC_CHECK) == BST_CHECKED) { buf[0] = '>'; pushstring(buf); } else { pushstring(buf + 1); } pushstring("success"); } case WM_CTLCOLORSTATIC: case WM_CTLCOLOREDIT: case WM_CTLCOLORDLG: case WM_CTLCOLORBTN: case WM_CTLCOLORLISTBOX: // let the NSIS window handle colors, it knows best return SendMessage(hwParent, uMsg, wParam, lParam); break; } return 0; }
static void pg_searchres(const struct req *req, struct manpage *r, size_t sz) { char *arch, *archend; const char *sec; size_t i, iuse; int archprio, archpriouse; int prio, priouse; for (i = 0; i < sz; i++) { if (validate_filename(r[i].file)) continue; warnx("invalid filename %s in %s database", r[i].file, req->q.manpath); pg_error_internal(); return; } if (req->isquery && sz == 1) { /* * If we have just one result, then jump there now * without any delay. */ printf("Status: 303 See Other\r\n"); printf("Location: http://%s/%s%s%s/%s", HTTP_HOST, scriptname, *scriptname == '\0' ? "" : "/", req->q.manpath, r[0].file); printf("\r\n" "Content-Type: text/html; charset=utf-8\r\n" "\r\n"); return; } resp_begin_html(200, NULL); resp_searchform(req, req->q.equal || sz == 1 ? FOCUS_NONE : FOCUS_QUERY); if (sz > 1) { puts("<div class=\"results\">"); puts("<table>"); for (i = 0; i < sz; i++) { printf("<tr>\n" "<td class=\"title\">\n" "<a href=\"/%s%s%s/%s", scriptname, *scriptname == '\0' ? "" : "/", req->q.manpath, r[i].file); printf("\">"); html_print(r[i].names); printf("</a>\n" "</td>\n" "<td class=\"desc\">"); html_print(r[i].output); puts("</td>\n" "</tr>"); } puts("</table>\n" "</div>"); } /* * In man(1) mode, show one of the pages * even if more than one is found. */ if (req->q.equal || sz == 1) { puts("<hr>"); iuse = 0; priouse = 20; archpriouse = 3; for (i = 0; i < sz; i++) { sec = r[i].file; sec += strcspn(sec, "123456789"); if (sec[0] == '\0') continue; prio = sec_prios[sec[0] - '1']; if (sec[1] != '/') prio += 10; if (req->q.arch == NULL) { archprio = ((arch = strchr(sec + 1, '/')) == NULL) ? 3 : ((archend = strchr(arch + 1, '/')) == NULL) ? 0 : strncmp(arch, "amd64/", archend - arch) ? 2 : 1; if (archprio < archpriouse) { archpriouse = archprio; priouse = prio; iuse = i; continue; } if (archprio > archpriouse) continue; } if (prio >= priouse) continue; priouse = prio; iuse = i; } resp_show(req, r[iuse].file); } resp_end_html(); }
int main(int argc, char **argv) { bool non_batch = false; bool batch = false; bool employee = false; bool guest = false; bool arrival = false; bool departure = false; int32_t timestamp = -1; const char *token = NULL; const char *name = NULL; int32_t room = -1; const char *filename = NULL; struct log_entry l; int opt; static const char *optstr = "T:K:E:G:ALR:B"; opterr = 0; while((opt = getopt(argc, argv, optstr)) != -1) { switch(opt) { case 'T': non_batch = true; if (!parse_num(optarg, ×tamp)) invalid(true); if (!validate_int_range(timestamp, TIMESTAMP_MIN, TIMESTAMP_MAX)) invalid(true); break; case 'K': non_batch = true; token = optarg; if (!validate_token(token)) invalid(true); break; case 'E': non_batch = true; if (guest) invalid(true); employee = true; name = optarg; if (!validate_name(name)) invalid(true); break; case 'G': non_batch = true; if (employee) invalid(true); guest = true; name = optarg; if (!validate_name(name)) invalid(true); break; case 'A': non_batch = true; if (departure) invalid(true); arrival = true; break; case 'L': non_batch = true; if (arrival) invalid(true); departure = true; break; case 'R': non_batch = true; if (!parse_num(optarg, &room)) invalid(true); if (!validate_int_range(room, ROOM_MIN, ROOM_MAX)) invalid(true); break; case 'B': if (non_batch) invalid(true); batch = true; break; default: invalid(true); break; } } if (optind >= argc) invalid(true); else filename = argv[optind]; if (filename && !validate_filename(filename)) invalid(true); if (batch && non_batch) invalid(true); if (batch) { batch_mode(filename); } else { int ret; if (!timestamp || !token || !(employee || guest) || !(arrival || departure)) invalid(true); if (employee && guest) invalid(true); l.timestamp = (uint32_t) timestamp; l.room = room; l.action = arrival ? ARRIVAL : DEPARTURE; l.type = guest ? GUEST : EMPLOYEE; l.name = strdup(name); ret = append_log_entry(&l, filename, token); free((void *)l.name); l.name = NULL; if (ret != CAPSTONE_EXIT_SUCCESS) { invalid(true); } } exit(CAPSTONE_EXIT_SUCCESS); }
void batch_mode(const char *filename) { FILE *fp; char *buf; char *ext_buf; int argc; const char **argv; poptContext optCon; int c; bool is_invalid = false; bool employee = false; bool guest = false; bool arrival = false; bool departure = false; int32_t timestamp = -1; const char *token = NULL; const char *name = NULL; int32_t room = -1; const char *log_file_name = NULL; struct log_entry l; int ret; const char *tmp = NULL; const char *last_log_file = NULL; int fd = -1; int64_t data_size = 0; uint8_t *data_buf = NULL; uint8_t salt[SALT_SIZE]; uint8_t key_buf[KEY_LEN]; uint8_t nonce[NONCE_SIZE]; uint8_t *mac_key = key_buf; uint8_t *enc_key = key_buf + MAC_KEY_LEN; struct gallery g; size_t log_entry_buf_size; struct poptOption optionsTable[] = { { NULL, 'T', POPT_ARG_INT, ×tamp, 0, NULL, NULL}, { NULL, 'K', POPT_ARG_STRING, &token, 'K', NULL, NULL}, { NULL, 'E', POPT_ARG_STRING, &name, 'E', NULL, NULL}, { NULL, 'G', POPT_ARG_STRING, &name, 'G', NULL, NULL}, { NULL, 'A', POPT_ARG_NONE, NULL, 'A', NULL, NULL}, { NULL, 'L', POPT_ARG_NONE, NULL, 'L', NULL, NULL}, { NULL, 'R', POPT_ARG_INT, &room, 0, NULL, NULL}, { NULL, 0, 0, NULL, 0, NULL, NULL} }; buf = calloc(BATCH_BUFSIZ, 1); if (!buf) invalid(true); fp = fopen(filename, "r"); if (!fp) invalid(true); while (fgets(buf, BATCH_BUFSIZ, fp)) { ext_buf = calloc(2 + strlen(buf) + 1, 1); memcpy(ext_buf, "l ", 2); memcpy(ext_buf + 2, buf, strlen(buf)); poptParseArgvString(ext_buf, &argc, &argv); optCon = poptGetContext(NULL, argc, argv, optionsTable, 0); is_invalid = false; employee = guest = arrival = departure = false; timestamp = -1; token = NULL; name = NULL; room = -1; log_file_name = NULL; while ((c = poptGetNextOpt(optCon)) >= 0) { switch(c) { case 'E': if (guest) is_invalid = true; employee = true; break; case 'G': if (employee) is_invalid = true; guest = true; break; case 'A': if (departure) is_invalid = true; arrival = true; break; case 'L': if (arrival) is_invalid = true; departure = true; break; case 'K': break; } } log_file_name = poptGetArg(optCon); if (!log_file_name) is_invalid = true; tmp = poptPeekArg(optCon); if (tmp) { is_invalid = true; } if (log_file_name && !validate_filename(log_file_name)) is_invalid = true; if (!timestamp || !token || !(employee || guest) || !(arrival || departure)) is_invalid = true; if (employee && guest) is_invalid = true; if (is_invalid) { invalid(false); free(ext_buf); continue; } l.timestamp = (uint32_t) timestamp; l.room = room; l.action = arrival ? ARRIVAL : DEPARTURE; l.type = guest ? GUEST : EMPLOYEE; l.name = strdup(name); integrity_violation = false; if (!last_log_file || (strcmp(last_log_file, log_file_name) != 0)) { if (last_log_file && (fd > -1)) { ret = enc_mac_write(fd, enc_key, mac_key, salt, data_buf, data_size); if (ret != CAPSTONE_EXIT_SUCCESS) { invalid(false); continue; } close(fd); fd = -1; } fd = read_or_create_log(log_file_name, token, salt, nonce, key_buf, &data_buf, &data_size); if (fd == -1) { invalid(false); continue; } init_gallery_state(&g); ret = read_log_buf(data_buf, data_size, &g); last_log_file = strdup(log_file_name); } if (!update_gallery_state(&g, &l)) { invalid(false); continue; } log_entry_buf_size = append_log_entry_to_buffer(&data_buf, data_size, &l); if (log_entry_buf_size == 0) { invalid(false); continue; } data_size += log_entry_buf_size; free((void *)l.name); l.name = NULL; free(ext_buf); } ret = enc_mac_write(fd, enc_key, mac_key, salt, data_buf, data_size); if (ret != CAPSTONE_EXIT_SUCCESS) { invalid(false); } close(fd); fclose(fp); free(buf); buf = NULL; }