Skip to content

Commit

Permalink
[fido] use Rufus existing alert handler to close Fido's cookie prompts
Browse files Browse the repository at this point in the history
* Addresses pbatard/Fido#1 while being much more effective than an all-script solution
  • Loading branch information
pbatard committed Mar 5, 2019
1 parent 8823c0c commit db68bcd
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 37 deletions.
4 changes: 2 additions & 2 deletions res/loc/rufus.loc
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,7 @@ t MSG_136 "Release"
t MSG_137 "Edition"
t MSG_138 "Language"
t MSG_139 "Architecture"
t MSG_140 "Confirm"
t MSG_140 "Continue"
t MSG_141 "Back"
t MSG_142 "Please wait..."
t MSG_143 "Download ISO Image"
Expand Down Expand Up @@ -4285,7 +4285,7 @@ t MSG_133 "Rufus a détecté que vous êtes en train de créer un média 'Window
t MSG_134 "Parce que MBR a été sélectionné pour le schéma de partition, Rufus peut seulement créer une partition sur ce média occupant jusqu’à 2 To, ce qui laissera %s d’espace disque non-disponible.\n\nEtes-vous sûr de vouloir continuer ?"
t MSG_137 "Édition"
t MSG_138 "Langue de produit"
t MSG_140 "Confirmer"
t MSG_140 "Continuer"
t MSG_141 "Retour"
t MSG_142 "Veuillez patienter..."
t MSG_143 "Télécharger une image ISO"
Expand Down
9 changes: 6 additions & 3 deletions src/net.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ BYTE* fido_script = NULL;

extern loc_cmd* selected_locale;
extern HANDLE dialog_handle;
extern BOOL force_update, is_x86_32;
extern BOOL force_update, is_x86_32, close_fido_cookie_prompts;
static DWORD error_code, fido_len = 0;
static BOOL update_check_in_progress = FALSE;
static BOOL force_update_check = FALSE;
Expand Down Expand Up @@ -385,7 +385,7 @@ static uint64_t DownloadToFileOrBuffer(const char* url, const char* file, BYTE**
uprintf("No buffer pointer provided for download");
goto out;
}
*buffer = malloc(total_size);
*buffer = malloc((size_t)total_size);
if (*buffer == NULL) {
uprintf("Could not allocate buffer for download");
goto out;
Expand Down Expand Up @@ -897,9 +897,12 @@ static DWORD WINAPI DownloadISOThread(LPVOID param)
}

static_sprintf(cmdline, "%s -NonInteractive -NoProfile –ExecutionPolicy Bypass "
"-File %s -PipeName %s -LocData \"%s\" -Icon %s -AppTitle \"%s\" -ShowBrowserOption",
"-File %s -PipeName %s -LocData \"%s\" -Icon %s -AppTitle \"%s\"",
powershell_path, script_path, &pipe[9], locale_str, icon_path, lmprintf(MSG_143));
// Signal our Windows alerts hook that it should close the IE cookie prompts from Fido
close_fido_cookie_prompts = TRUE;
FormatStatus = RunCommand(cmdline, app_dir, TRUE);
close_fido_cookie_prompts = FALSE;
if ((FormatStatus == 0) && PeekNamedPipe(hPipe, NULL, dwPipeSize, NULL, &dwAvail, NULL) && (dwAvail != 0)) {
url = malloc(dwAvail + 1);
if ((url != NULL) && ReadFile(hPipe, url, dwAvail, &dwSize, NULL) && (dwSize > 4)) {
Expand Down
4 changes: 2 additions & 2 deletions src/rufus.c
Original file line number Diff line number Diff line change
Expand Up @@ -3152,7 +3152,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
ChangeWindowMessageFilter(WM_COPYGLOBALDATA, MSGFLT_ADD);

// Set the hook to automatically close Windows' "You need to format the disk in drive..." prompt
if (!SetFormatPromptHook())
if (!SetAlertPromptHook())
uprintf("Warning: Could not set 'Format Disk' prompt auto-close");

ShowWindow(hDlg, SW_SHOWNORMAL);
Expand Down Expand Up @@ -3402,7 +3402,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
if ((!external_loc_file) && (loc_file[0] != 0))
DeleteFileU(loc_file);
DestroyAllTooltips();
ClrFormatPromptHook();
ClrAlertPromptHook();
exit_localization();
safe_free(image_path);
safe_free(locale_name);
Expand Down
4 changes: 2 additions & 2 deletions src/rufus.h
Original file line number Diff line number Diff line change
Expand Up @@ -567,8 +567,8 @@ extern BOOL IsBufferInDB(const unsigned char* buf, const size_t len);
extern char* _printbits(size_t const size, void const * const ptr, int leading_zeroes);
extern BOOL IsCurrentProcessElevated(void);
extern char* GetCurrentMUI(void);
extern BOOL SetFormatPromptHook(void);
extern void ClrFormatPromptHook(void);
extern BOOL SetAlertPromptHook(void);
extern void ClrAlertPromptHook(void);
extern BYTE SearchProcess(char* HandleName, DWORD dwTimeout, BOOL bPartialMatch, BOOL bIgnoreSelf, BOOL bQuiet);
extern BOOL EnablePrivileges(void);
extern void FlashTaskbar(HANDLE handle);
Expand Down
10 changes: 5 additions & 5 deletions src/rufus.rc
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_DIALOG DIALOGEX 12, 12, 232, 326
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_ACCEPTFILES
CAPTION "Rufus 3.5.1451"
CAPTION "Rufus 3.5.1452"
FONT 9, "Segoe UI Symbol", 400, 0, 0x0
BEGIN
LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP
Expand Down Expand Up @@ -394,8 +394,8 @@ END
//

VS_VERSION_INFO VERSIONINFO
FILEVERSION 3,5,1451,0
PRODUCTVERSION 3,5,1451,0
FILEVERSION 3,5,1452,0
PRODUCTVERSION 3,5,1452,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
Expand All @@ -413,13 +413,13 @@ BEGIN
VALUE "Comments", "https://akeo.ie"
VALUE "CompanyName", "Akeo Consulting"
VALUE "FileDescription", "Rufus"
VALUE "FileVersion", "3.5.1451"
VALUE "FileVersion", "3.5.1452"
VALUE "InternalName", "Rufus"
VALUE "LegalCopyright", "� 2011-2019 Pete Batard (GPL v3)"
VALUE "LegalTrademarks", "https://www.gnu.org/copyleft/gpl.html"
VALUE "OriginalFilename", "rufus-3.5.exe"
VALUE "ProductName", "Rufus"
VALUE "ProductVersion", "3.5.1451"
VALUE "ProductVersion", "3.5.1452"
END
END
BLOCK "VarFileInfo"
Expand Down
61 changes: 38 additions & 23 deletions src/stdlg.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,10 @@ static BOOL notification_is_question;
static const notification_info* notification_more_info;
static const char* notification_dont_display_setting;
static WNDPROC update_original_proc = NULL;
static HWINEVENTHOOK fp_weh = NULL;
static HWINEVENTHOOK ap_weh = NULL;
static char *fp_title_str = "Microsoft Windows", *fp_button_str = "Format disk";
static char *cp_title_str = "Windows Security Warning";
BOOL close_fido_cookie_prompts = FALSE;

static int update_settings_reposition_ids[] = {
IDC_POLICY,
Expand Down Expand Up @@ -1929,17 +1931,18 @@ INT_PTR MyDialogBox(HINSTANCE hInstance, int Dialog_ID, HWND hWndParent, DLGPROC

/*
* The following function calls are used to automatically detect and close the native
* Windows format prompt "You must format the disk in drive X:". To do that, we use an
* event hook that gets triggered whenever a window is placed in the foreground.
* Windows format prompt "You must format the disk in drive X:" as well as the cookies
* alert being popped by Windows when running our Download script. To do that, we use
* an event hook that gets triggered whenever a window is placed in the foreground.
* In that hook, we look for a dialog that has style WS_POPUPWINDOW and has the relevant
* title. However, because the title in itself is too generic (the expectation is that
* it will be "Microsoft Windows") we also enumerate all the child controls from that
* prompt, using another callback, until we find one that contains the text we expect
* for the "Format disk" button.
* title. However, in case of the Format prompt, because the title in itself is too
* generic (the expectation is that it will be "Microsoft Windows") we also enumerate
* all the child controls from that prompt, using another callback, until we find one
* that contains the text we expect for the "Format disk" button.
* Oh, and since all of these strings are localized, we must first pick them up from
* the relevant mui (something like "C:\Windows\System32\en-GB\shell32.dll.mui")
* the relevant mui's.
*/
static BOOL CALLBACK FormatPromptCallback(HWND hWnd, LPARAM lParam)
static BOOL CALLBACK AlertPromptCallback(HWND hWnd, LPARAM lParam)
{
char str[128];
BOOL *found = (BOOL*)lParam;
Expand All @@ -1951,7 +1954,7 @@ static BOOL CALLBACK FormatPromptCallback(HWND hWnd, LPARAM lParam)
return TRUE;
}

static void CALLBACK FormatPromptHook(HWINEVENTHOOK hWinEventHook, DWORD Event, HWND hWnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime)
static void CALLBACK AlertPromptHook(HWINEVENTHOOK hWinEventHook, DWORD Event, HWND hWnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime)
{
char str[128];
BOOL found;
Expand All @@ -1960,25 +1963,27 @@ static void CALLBACK FormatPromptHook(HWINEVENTHOOK hWinEventHook, DWORD Event,
if (GetWindowLongPtr(hWnd, GWL_STYLE) & WS_POPUPWINDOW) {
str[0] = 0;
GetWindowTextU(hWnd, str, sizeof(str));
if (safe_strcmp(str, fp_title_str) == 0) {
if (strcmp(str, fp_title_str) == 0) {
found = FALSE;
EnumChildWindows(hWnd, FormatPromptCallback, (LPARAM)&found);
EnumChildWindows(hWnd, AlertPromptCallback, (LPARAM)&found);
if (found) {
SendMessage(hWnd, WM_COMMAND, (WPARAM)IDCANCEL, (LPARAM)0);
uprintf("Closed Windows format prompt");
}
} else if (close_fido_cookie_prompts && strcmp(str, cp_title_str) == 0) {
SendMessage(hWnd, WM_COMMAND, (WPARAM)IDCANCEL, (LPARAM)0);
}
}
}
}

BOOL SetFormatPromptHook(void)
BOOL SetAlertPromptHook(void)
{
HMODULE mui_lib;
char mui_path[MAX_PATH];
static char title_str[128], button_str[128];
static char title_str[2][128], button_str[128];

if (fp_weh != NULL)
if (ap_weh != NULL)
return TRUE; // No need to set again if active

// Fetch the localized strings in the relevant MUI
Expand All @@ -1988,8 +1993,8 @@ BOOL SetFormatPromptHook(void)
// 4097 = "You need to format the disk in drive %c: before you can use it." (dialog text)
// 4125 = "Microsoft Windows" (dialog title)
// 4126 = "Format disk" (button)
if (LoadStringU(mui_lib, 4125, title_str, sizeof(title_str)) > 0)
fp_title_str = title_str;
if (LoadStringU(mui_lib, 4125, title_str[0], sizeof(title_str[0])) > 0)
fp_title_str = title_str[0];
else
uprintf("Warning: Could not locate localized format prompt title string in '%s': %s", mui_path, WindowsErrorString());
if (LoadStringU(mui_lib, 4126, button_str, sizeof(button_str)) > 0)
Expand All @@ -1998,15 +2003,25 @@ BOOL SetFormatPromptHook(void)
uprintf("Warning: Could not locate localized format prompt button string in '%s': %s", mui_path, WindowsErrorString());
FreeLibrary(mui_lib);
}
static_sprintf(mui_path, "%s\\%s\\urlmon.dll.mui", system_dir, GetCurrentMUI());
mui_lib = LoadLibraryU(mui_path);
if (mui_lib != NULL) {
// 2070 = "Windows Security Warning" (yes, that's what MS uses for a stupid cookie!)
if (LoadStringU(mui_lib, 2070, title_str[1], sizeof(title_str[1])) > 0)
cp_title_str = title_str[1];
else
uprintf("Warning: Could not locate localized cookie prompt title string in '%s': %s", mui_path, WindowsErrorString());
FreeLibrary(mui_lib);
}

fp_weh = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, NULL,
FormatPromptHook, 0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
return (fp_weh != NULL);
ap_weh = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, NULL,
AlertPromptHook, 0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
return (ap_weh != NULL);
}

void ClrFormatPromptHook(void) {
UnhookWinEvent(fp_weh);
fp_weh = NULL;
void ClrAlertPromptHook(void) {
UnhookWinEvent(ap_weh);
ap_weh = NULL;
}

void FlashTaskbar(HANDLE handle)
Expand Down

0 comments on commit db68bcd

Please sign in to comment.