From de3df031561a6109e98e18cafd336c82600fac77 Mon Sep 17 00:00:00 2001 From: simon Date: Mon, 25 Sep 2000 15:47:57 +0000 Subject: [PATCH] Implement "putty -cleanup" git-svn-id: svn://svn.tartarus.org/sgt/putty@626 cda61777-01e9-0310-a592-d414129be87e --- noise.c | 10 ++++++++++ putty.h | 6 ++++++ windlg.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ window.c | 27 +++++++++++++++++++++++++++ 4 files changed, 104 insertions(+) diff --git a/noise.c b/noise.c index 31004ddf..383e6c33 100644 --- a/noise.c +++ b/noise.c @@ -108,6 +108,16 @@ void random_save_seed(void) { } /* + * This function is called from `putty -cleanup'. It removes the + * random seed file. + */ +void random_destroy_seed(void) { + if (!seedpath[0]) + get_seedpath(); + remove(seedpath); +} + +/* * This function is called every time the random pool needs * stirring, and will acquire the system time in all available * forms and the battery status. diff --git a/putty.h b/putty.h index 5307c8a1..1ab5b99e 100644 --- a/putty.h +++ b/putty.h @@ -2,6 +2,10 @@ #define PUTTY_PUTTY_H #define PUTTY_REG_POS "Software\\SimonTatham\\PuTTY" +#define PUTTY_REG_PARENT "Software\\SimonTatham" +#define PUTTY_REG_PARENT_CHILD "PuTTY" +#define PUTTY_REG_GPARENT "Software" +#define PUTTY_REG_GPARENT_CHILD "SimonTatham" /* * Global variables. Most modules declare these `extern', but @@ -254,6 +258,7 @@ void noise_get_heavy(void (*func) (void *, int)); void noise_get_light(void (*func) (void *, int)); void noise_ultralight(DWORD data); void random_save_seed(void); +void random_destroy_seed(void); /* * Exports from windlg.c. @@ -266,6 +271,7 @@ void showeventlog (HWND); void showabout (HWND); void verify_ssh_host_key(char *host, char *keystr); void get_sesslist(int allocate); +void registry_cleanup(void); GLOBAL int nsessions; GLOBAL char **sessions; diff --git a/windlg.c b/windlg.c index 2a9516ff..71cc634b 100644 --- a/windlg.c +++ b/windlg.c @@ -1708,3 +1708,64 @@ void verify_ssh_host_key(char *host, char *keystr) { RegCloseKey(rkey); } } + +/* + * Recursively delete a registry key and everything under it. + */ +static void registry_recursive_remove(HKEY key) { + DWORD i; + char name[MAX_PATH+1]; + HKEY subkey; + + i = 0; + while (RegEnumKey(key, i, name, sizeof(name)) == ERROR_SUCCESS) { + if (RegOpenKey(key, name, &subkey) == ERROR_SUCCESS) { + registry_recursive_remove(subkey); + RegCloseKey(subkey); + } + RegDeleteKey(key, name); + } +} + +/* + * Destroy all registry information associated with PuTTY. + */ +void registry_cleanup(void) { + HKEY key; + int ret; + char name[MAX_PATH+1]; + + /* + * Open the main PuTTY registry key and remove everything in it. + */ + if (RegOpenKey(HKEY_CURRENT_USER, PUTTY_REG_POS, &key) == ERROR_SUCCESS) { + registry_recursive_remove(key); + RegCloseKey(key); + } + /* + * Now open the parent key and remove the PuTTY main key. Once + * we've done that, see if the parent key has any other + * children. + */ + if (RegOpenKey(HKEY_CURRENT_USER, PUTTY_REG_PARENT, + &key) == ERROR_SUCCESS) { + RegDeleteKey(key, PUTTY_REG_PARENT_CHILD); + ret = RegEnumKey(key, 0, name, sizeof(name)); + RegCloseKey(key); + /* + * If the parent key had no other children, we must delete + * it in its turn. That means opening the _grandparent_ + * key. + */ + if (ret != ERROR_SUCCESS) { + if (RegOpenKey(HKEY_CURRENT_USER, PUTTY_REG_GPARENT, + &key) == ERROR_SUCCESS) { + RegDeleteKey(key, PUTTY_REG_GPARENT_CHILD); + RegCloseKey(key); + } + } + } + /* + * Now we're done. + */ +} diff --git a/window.c b/window.c index e966b431..5b05a0b0 100644 --- a/window.c +++ b/window.c @@ -153,6 +153,33 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { tolower(p[1]) == 'o' && tolower(p[2]) == 'g') { logfile = "putty.log"; + } else if (q == p + 7 && + tolower(p[0]) == 'c' && + tolower(p[1]) == 'l' && + tolower(p[2]) == 'e' && + tolower(p[3]) == 'a' && + tolower(p[4]) == 'n' && + tolower(p[5]) == 'u' && + tolower(p[6]) == 'p') { + /* + * `putty -cleanup'. Remove all registry entries + * associated with PuTTY, and also find and delete + * the random seed file. + */ + if (MessageBox(NULL, + "This procedure will remove ALL Registry\n" + "entries associated with PuTTY, and will\n" + "also remove the PuTTY random seed file.\n" + "\n" + "THIS PROCESS WILL DESTROY YOUR SAVED\n" + "SESSIONS. Are you really sure you want\n" + "to continue?", + "PuTTY Warning", + MB_YESNO | MB_ICONWARNING) == IDYES) { + random_destroy_seed(); + registry_cleanup(); + } + exit(0); } p = q + strspn(q, " \t"); } -- 2.11.0