Skip to content

Commit d3330ff

Browse files
authored
Only allow ascii chars in input (#3244)
1 parent 9ee9dce commit d3330ff

1 file changed

Lines changed: 24 additions & 13 deletions

File tree

archinstall/tui/curses_menu.py

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import sys
88
from abc import ABCMeta, abstractmethod
99
from collections.abc import Callable
10+
from curses.ascii import isprint
1011
from curses.textpad import Textbox
1112
from types import FrameType, TracebackType
1213
from typing import TYPE_CHECKING, Literal, override
@@ -317,7 +318,7 @@ def __init__(
317318
self._edit_height = edit_height
318319
self.x_start = x_start
319320
self.y_start = y_start
320-
self.process_key = process_key
321+
self._process_key_cb = process_key
321322
self._frame = frame
322323
self._alignment = alignment
323324
self._hide_input = hide_input
@@ -390,7 +391,7 @@ def edit(self, default_text: str | None = None) -> None:
390391
self._textbox = Textbox(self._edit_win)
391392
self._main_win.refresh()
392393

393-
self._textbox.edit(self.process_key) # type: ignore[arg-type]
394+
self._textbox.edit(self._process_key_cb) # type: ignore[arg-type]
394395

395396

396397
class Viewport(AbstractViewport):
@@ -500,7 +501,10 @@ def __init__(
500501
self._help_vp: Viewport | None = None
501502
self._header_vp: Viewport | None = None
502503
self._input_vp: EditViewport | None = None
503-
self._error_vp: Viewport | None = None
504+
self._info_vp: Viewport | None = None
505+
506+
self._set_default_info = True
507+
self._only_ascii_text = ViewportEntry(str(_('Only ASCII characters are supported')), 0, 0, STYLE.NORMAL)
504508

505509
self._init_viewports()
506510

@@ -532,7 +536,7 @@ def _init_viewports(self) -> None:
532536
)
533537

534538
y_offset += 3
535-
self._error_vp = Viewport(self._max_width, 1, 0, y_offset, alignment=self._alignment)
539+
self._info_vp = Viewport(self._max_width, 1, 0, y_offset, alignment=self._alignment)
536540

537541
def input(self) -> Result:
538542
result = Tui.run(self)
@@ -553,12 +557,12 @@ def _clear_all(self) -> None:
553557
self._header_vp.erase()
554558
if self._input_vp:
555559
self._input_vp.erase()
556-
if self._error_vp:
557-
self._error_vp.erase()
560+
if self._info_vp:
561+
self._info_vp.erase()
558562

559563
def _get_input_text(self) -> str | None:
560564
assert self._input_vp
561-
assert self._error_vp
565+
assert self._info_vp
562566

563567
text = self._real_input
564568

@@ -568,7 +572,8 @@ def _get_input_text(self) -> str | None:
568572
if (err := self._validator(text)) is not None:
569573
self.clear_all()
570574
entry = ViewportEntry(err, 0, 0, STYLE.ERROR)
571-
self._error_vp.update([entry], 0)
575+
self._info_vp.update([entry], 0)
576+
self._set_default_info = False
572577
self._real_input = ''
573578
return None
574579

@@ -583,6 +588,10 @@ def _draw(self) -> None:
583588

584589
if self._input_vp:
585590
self._input_vp.update()
591+
592+
if self._set_default_info and self._info_vp:
593+
self._info_vp.update([self._only_ascii_text], 0)
594+
586595
self._input_vp.edit(default_text=self._default_text)
587596

588597
@override
@@ -648,14 +657,16 @@ def _process_edit_key(self, key: int) -> int | None:
648657
if len(self._real_input) > 0:
649658
self._real_input = self._real_input[:-1]
650659
case _:
660+
if isprint(key):
661+
self._real_input += chr(key)
662+
if self._hide_input:
663+
key = 42
664+
else:
665+
try:
666+
if isprint(key):
651667
self._real_input += chr(key)
652668
if self._hide_input:
653669
key = 42
654-
else:
655-
try:
656-
self._real_input += chr(key)
657-
if self._hide_input:
658-
key = 42
659670
except Exception:
660671
pass
661672

0 commit comments

Comments
 (0)