Only allow ascii chars in input (#3244)

This commit is contained in:
Daniel Girtler 2025-03-24 20:17:37 +11:00 committed by GitHub
parent 9ee9dcec4d
commit d3330ff3ab
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 24 additions and 13 deletions

View File

@ -7,6 +7,7 @@ import signal
import sys import sys
from abc import ABCMeta, abstractmethod from abc import ABCMeta, abstractmethod
from collections.abc import Callable from collections.abc import Callable
from curses.ascii import isprint
from curses.textpad import Textbox from curses.textpad import Textbox
from types import FrameType, TracebackType from types import FrameType, TracebackType
from typing import TYPE_CHECKING, Literal, override from typing import TYPE_CHECKING, Literal, override
@ -317,7 +318,7 @@ class EditViewport(AbstractViewport):
self._edit_height = edit_height self._edit_height = edit_height
self.x_start = x_start self.x_start = x_start
self.y_start = y_start self.y_start = y_start
self.process_key = process_key self._process_key_cb = process_key
self._frame = frame self._frame = frame
self._alignment = alignment self._alignment = alignment
self._hide_input = hide_input self._hide_input = hide_input
@ -390,7 +391,7 @@ class EditViewport(AbstractViewport):
self._textbox = Textbox(self._edit_win) self._textbox = Textbox(self._edit_win)
self._main_win.refresh() self._main_win.refresh()
self._textbox.edit(self.process_key) # type: ignore[arg-type] self._textbox.edit(self._process_key_cb) # type: ignore[arg-type]
class Viewport(AbstractViewport): class Viewport(AbstractViewport):
@ -500,7 +501,10 @@ class EditMenu(AbstractCurses):
self._help_vp: Viewport | None = None self._help_vp: Viewport | None = None
self._header_vp: Viewport | None = None self._header_vp: Viewport | None = None
self._input_vp: EditViewport | None = None self._input_vp: EditViewport | None = None
self._error_vp: Viewport | None = None self._info_vp: Viewport | None = None
self._set_default_info = True
self._only_ascii_text = ViewportEntry(str(_('Only ASCII characters are supported')), 0, 0, STYLE.NORMAL)
self._init_viewports() self._init_viewports()
@ -532,7 +536,7 @@ class EditMenu(AbstractCurses):
) )
y_offset += 3 y_offset += 3
self._error_vp = Viewport(self._max_width, 1, 0, y_offset, alignment=self._alignment) self._info_vp = Viewport(self._max_width, 1, 0, y_offset, alignment=self._alignment)
def input(self) -> Result: def input(self) -> Result:
result = Tui.run(self) result = Tui.run(self)
@ -553,12 +557,12 @@ class EditMenu(AbstractCurses):
self._header_vp.erase() self._header_vp.erase()
if self._input_vp: if self._input_vp:
self._input_vp.erase() self._input_vp.erase()
if self._error_vp: if self._info_vp:
self._error_vp.erase() self._info_vp.erase()
def _get_input_text(self) -> str | None: def _get_input_text(self) -> str | None:
assert self._input_vp assert self._input_vp
assert self._error_vp assert self._info_vp
text = self._real_input text = self._real_input
@ -568,7 +572,8 @@ class EditMenu(AbstractCurses):
if (err := self._validator(text)) is not None: if (err := self._validator(text)) is not None:
self.clear_all() self.clear_all()
entry = ViewportEntry(err, 0, 0, STYLE.ERROR) entry = ViewportEntry(err, 0, 0, STYLE.ERROR)
self._error_vp.update([entry], 0) self._info_vp.update([entry], 0)
self._set_default_info = False
self._real_input = '' self._real_input = ''
return None return None
@ -583,6 +588,10 @@ class EditMenu(AbstractCurses):
if self._input_vp: if self._input_vp:
self._input_vp.update() self._input_vp.update()
if self._set_default_info and self._info_vp:
self._info_vp.update([self._only_ascii_text], 0)
self._input_vp.edit(default_text=self._default_text) self._input_vp.edit(default_text=self._default_text)
@override @override
@ -648,14 +657,16 @@ class EditMenu(AbstractCurses):
if len(self._real_input) > 0: if len(self._real_input) > 0:
self._real_input = self._real_input[:-1] self._real_input = self._real_input[:-1]
case _: case _:
if isprint(key):
self._real_input += chr(key)
if self._hide_input:
key = 42
else:
try:
if isprint(key):
self._real_input += chr(key) self._real_input += chr(key)
if self._hide_input: if self._hide_input:
key = 42 key = 42
else:
try:
self._real_input += chr(key)
if self._hide_input:
key = 42
except Exception: except Exception:
pass pass