Commit 0c21af12 authored by mathieui's avatar mathieui
Browse files

Use the confirmtab for TLS cert validation

And wipe the YesNoInput from the codebase
parent 82d00d49
......@@ -1204,30 +1204,39 @@ class HandlerCore:
config.set_and_save('certificate', sha2_found_cert)
return
elif sha2_found_cert == cert:
log.debug('Cert %s OK', sha2_found_cert)
return
else:
saved_input = self.core.current_tab().input
log.debug('\nWARNING: CERTIFICATE CHANGED old: %s, new: %s\n', cert, sha2_found_cert)
self.core.information('New certificate found (sha-2 hash:'
' %s)\nPlease validate or abort' % sha2_found_cert,
'Warning')
def check_input():
self.core.current_tab().input = saved_input
if input.value:
self.core.information('Setting new certificate: old: %s, new: %s' % (cert, sha2_found_cert), 'Info')
def cb(result):
if result:
self.core.information('New certificate accepted.', 'Info')
log.debug('Setting certificate to %s', sha2_found_cert)
if not config.silent_set('certificate', sha2_found_cert):
self.core.information('Unable to write in the config file', 'Error')
self.core.information(
'Unable to write in the config file',
'Error')
else:
self.core.information('You refused to validate the certificate. You are now disconnected', 'Info')
self.core.information('You refused to validate the certificate. You are now disconnected.', 'Info')
self.core.disconnect()
new_loop.stop()
asyncio.set_event_loop(old_loop)
input = windows.YesNoInput(text="WARNING! Server certificate has changed, accept? (y/n)", callback=check_input)
self.core.current_tab().input = input
input.resize(1, self.core.current_tab().width, self.core.current_tab().height-1, 0)
input.refresh()
confirm_tab = tabs.ConfirmTab(
self.core,
'Certificate check required',
"""
WARNING: CERTIFICATE FOR %s CHANGED
This can be part of a normal renewal process, but can also mean that \
an attacker is performing a man-in-the-middle attack on your connection.
When in doubt, check with your administrator using another channel.
SHA-512 of the old certificate: %s
SHA-512 of the new certificate: %s
""" % (self.core.xmpp.boundjid.domain, cert, sha2_found_cert),
'You need to accept or reject the certificate',
cb,
critical=True)
self.core.add_tab(confirm_tab, True)
self.core.doupdate()
old_loop = asyncio.get_event_loop()
new_loop = asyncio.new_event_loop()
......
......@@ -1018,8 +1018,6 @@ 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)
......@@ -1195,8 +1193,6 @@ 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)
......@@ -1207,8 +1203,6 @@ 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)
......
......@@ -11,7 +11,7 @@ from poezio.windows.info_bar import GlobalInfoBar, VerticalGlobalInfoBar
from poezio.windows.info_wins import InfoWin, XMLInfoWin, PrivateInfoWin, MucListInfoWin, \
ConversationInfoWin, DynamicConversationInfoWin, MucInfoWin, \
ConversationStatusMessageWin, BookmarksInfoWin, ConfirmStatusWin
from poezio.windows.input_placeholders import HelpText, YesNoInput
from poezio.windows.input_placeholders import HelpText
from poezio.windows.inputs import Input, HistoryInput, MessageInput, CommandInput
from poezio.windows.list import ListWin, ColumnHeaderWin
from poezio.windows.misc import VerticalSeparator
......
......@@ -35,43 +35,3 @@ class HelpText(Win):
def on_delete(self):
return
class YesNoInput(Win):
"""
A Window just displaying a Yes/No input
Used to ask a confirmation
"""
def __init__(self, text='', callback=None):
Win.__init__(self)
self.key_func = {
'y' : self.on_yes,
'n' : self.on_no,
}
self.txt = text
self.value = None
self.callback = callback
def on_yes(self):
self.value = True
def on_no(self):
self.value = False
def refresh(self, txt=None):
log.debug('Refresh: %s', self.__class__.__name__)
if txt:
self.txt = txt
self._win.erase()
self.addstr(0, 0, self.txt[:self.width-1], to_curses_attr(get_theme().COLOR_WARNING_PROMPT))
self.finish_line(get_theme().COLOR_WARNING_PROMPT)
self._refresh()
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
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment