From 3c46d49704de86635508439f524c684903dc81d3 Mon Sep 17 00:00:00 2001 From: mathieui Date: Wed, 28 Jan 2015 09:46:51 +0100 Subject: [PATCH] Minor fixes to the certificate warning prompt (#2949) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - slightly lower the CPU usage (callback instead of active waiting w/ sleep) - make the terminal beep so the user knows something happened - prevent the user “escaping” the prompt by pressing /, s, or S --- src/core/handlers.py | 28 +++++++++++----------------- src/tabs/rostertab.py | 6 ++++++ src/windows/input_placeholders.py | 5 ++++- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/core/handlers.py b/src/core/handlers.py index 03a6d32d..b16b8c0f 100644 --- a/src/core/handlers.py +++ b/src/core/handlers.py @@ -1196,20 +1196,7 @@ def validate_ssl(self, pem): self.information('New certificate found (sha-2 hash:' ' %s)\nPlease validate or abort' % sha2_found_cert, 'Warning') - input = windows.YesNoInput(text="WARNING! Server certificate has changed, accept? (y/n)") - self.current_tab().input = input - input.resize(1, self.current_tab().width, self.current_tab().height-1, 0) - input.refresh() - self.doupdate() - old_loop = asyncio.get_event_loop() - new_loop = asyncio.new_event_loop() - asyncio.set_event_loop(new_loop) - new_loop.add_reader(sys.stdin, self.on_input_readable) - future = asyncio.Future() - @asyncio.coroutine - def check_input(future): - while input.value is None: - yield from asyncio.sleep(0.01) + def check_input(): self.current_tab().input = saved_input self.paused = False if input.value: @@ -1222,10 +1209,17 @@ def validate_ssl(self, pem): self.disconnect() new_loop.stop() asyncio.set_event_loop(old_loop) - asyncio.async(check_input(future)) + input = windows.YesNoInput(text="WARNING! Server certificate has changed, accept? (y/n)", callback=check_input) + self.current_tab().input = input + input.resize(1, self.current_tab().width, self.current_tab().height-1, 0) + input.refresh() + self.doupdate() + old_loop = asyncio.get_event_loop() + new_loop = asyncio.new_event_loop() + asyncio.set_event_loop(new_loop) + new_loop.add_reader(sys.stdin, self.on_input_readable) + curses.beep() new_loop.run_forever() - - else: log.debug('First time. Setting certificate to %s', sha2_found_cert) if not config.silent_set('certificate', sha2_found_cert): diff --git a/src/tabs/rostertab.py b/src/tabs/rostertab.py index e923bef9..349058a3 100644 --- a/src/tabs/rostertab.py +++ b/src/tabs/rostertab.py @@ -1012,6 +1012,8 @@ class RosterInfoTab(Tab): """ '/' is pressed, we enter "input mode" """ + if isinstance(self.input, windows.YesNoInput): + return curses.curs_set(1) self.input = windows.CommandInput("", self.reset_help_message, self.execute_slash_command) self.input.resize(1, self.width, self.height-1, 0) @@ -1187,6 +1189,8 @@ class RosterInfoTab(Tab): Start the search. The input should appear with a short instruction in it. """ + if isinstance(self.input, windows.YesNoInput): + return curses.curs_set(1) self.input = windows.CommandInput("[Search]", self.on_search_terminate, self.on_search_terminate, self.set_roster_filter) self.input.resize(1, self.width, self.height-1, 0) @@ -1197,6 +1201,8 @@ class RosterInfoTab(Tab): @refresh_wrapper.always def start_search_slow(self): + if isinstance(self.input, windows.YesNoInput): + return curses.curs_set(1) self.input = windows.CommandInput("[Search]", self.on_search_terminate, self.on_search_terminate, self.set_roster_filter_slow) self.input.resize(1, self.width, self.height-1, 0) diff --git a/src/windows/input_placeholders.py b/src/windows/input_placeholders.py index 4a6c6d72..496417d1 100644 --- a/src/windows/input_placeholders.py +++ b/src/windows/input_placeholders.py @@ -41,7 +41,7 @@ class YesNoInput(Win): A Window just displaying a Yes/No input Used to ask a confirmation """ - def __init__(self, text=''): + def __init__(self, text='', callback=None): Win.__init__(self) self.key_func = { 'y' : self.on_yes, @@ -49,6 +49,7 @@ class YesNoInput(Win): } self.txt = text self.value = None + self.callback = callback def on_yes(self): self.value = True @@ -68,6 +69,8 @@ class YesNoInput(Win): def do_command(self, key, raw=False): if key.lower() in self.key_func: self.key_func[key]() + if self.value is not None and self.callback is not None: + return self.callback() def on_delete(self): return