summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuval Adam <_@yuv.al>2026-07-24 13:08:48 +0200
committerYuval Adam <_@yuv.al>2026-07-24 13:08:48 +0200
commitf2197687e18eb129fcf25462943aa75972560579 (patch)
treee3d4478be8f2083bc746e06b30e766d52f92a198
parent82cf24d5d53e359875f86067bd41425f327919ff (diff)
Remove password field handling claims
-rw-r--r--README.md1
-rw-r--r--SPEC.md10
-rw-r--r--docs/IBUS_BAKEOFF.md1
-rw-r--r--src/parley/ibus_engine.py13
4 files changed, 2 insertions, 23 deletions
diff --git a/README.md b/README.md
index ec54e4c..4fb952e 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,6 @@ Parley records your microphone, transcribes speech locally with Parakeet, and in
- GNOME top-bar status and controls
- global shortcut and command-line control
- transcript persistence under `~/.local/share/parley/transcripts/`
-- password and PIN field protection when reported by the application
## Usage
diff --git a/SPEC.md b/SPEC.md
index 451ded5..276565b 100644
--- a/SPEC.md
+++ b/SPEC.md
@@ -36,7 +36,7 @@ The supported target environment is deliberately narrow:
## 3. Non-goals and platform limits
-- Parley cannot guarantee insertion into literally every application. Password fields, lock/login screens, games, custom-rendered controls, unsupported XWayland clients, and applications without input-method support may reject insertion.
+- Parley cannot guarantee insertion into literally every application. Lock/login screens, games, custom-rendered controls, unsupported XWayland clients, and applications without input-method support may reject insertion.
- Parley will not bypass the lock screen or cross user/session boundaries.
- Continuous live captioning and partial streaming text are not required for v1.
- Flatpak packaging is not a v1 requirement. A Flatpak would require a separate portal-oriented audio and filesystem design.
@@ -256,8 +256,6 @@ The critical assumption is that the engine must be active for the focused input
The persistent mode is preferred only if it does not interfere with typing, shortcuts, compose behavior, keyboard layouts, or other input methods. Temporary activation is acceptable only if switching and focus are reliable. If neither is robust, IBus will not be the default.
-When IBus exposes input purpose/content type, Parley must refuse automatic insertion into password and PIN fields and retain the result on the clipboard.
-
### 7.2 Safe fallback: clipboard only
Copy the transcript and notify the user to press Ctrl+V. This requires one user action but does not synthesize input and should always remain available.
@@ -276,7 +274,7 @@ Requirements:
- recreate the session when required; and
- fall back to clipboard-only on any failure.
-This avoids root/uinput configuration and is preferred over `ydotool` for synthetic paste. It still has focus races, depends on the target accepting Ctrl+V, and cannot insert arbitrary Unicode directly—it pastes clipboard contents. Portal-based synthetic paste cannot reliably identify every sensitive field, so it must not claim universal password-field detection.
+This avoids root/uinput configuration and is preferred over `ydotool` for synthetic paste. It still has focus races, depends on the target accepting Ctrl+V, and cannot insert arbitrary Unicode directly—it pastes clipboard contents.
### 7.4 Last resort: `ydotool`
@@ -359,8 +357,6 @@ Secrets and portal restore tokens must not be exposed over D-Bus or written to l
- Temporary audio is deleted after transcription, cancellation, or error unless a future diagnostic option explicitly retains it.
- The recording state must always be visibly indicated.
- Do not log transcript contents by default.
-- Refuse IBus auto-insertion into known password/PIN purposes.
-- Never promise detection of all sensitive fields, especially with synthetic paste backends.
- Portal control is opt-in and revocable.
- `ydotool` support is opt-in and documents its elevated input capability.
- D-Bus methods are available only on the user's session bus; no system-wide service is needed.
@@ -405,7 +401,6 @@ Test both against:
- VS Code or another Electron application;
- a Qt application;
- representative XWayland applications;
-- password/PIN fields; and
- multiple keyboard layouts if available.
For IBus passthrough, explicitly test ordinary typing, modifiers, application shortcuts, compose/dead keys, layout switching, and interaction with any real IM engines. For temporary activation, test caret/focus retention and engine restoration.
@@ -427,7 +422,6 @@ Exit criterion: all daemon states and failures are represented without blocking
- Turn successful prototypes into selectable backends.
- Implement deterministic fallback behavior.
-- Add sensitive-field protections where information is available.
- Ensure every failed insertion leaves text saved and copied.
### Phase 6 — UX, performance, and packaging
diff --git a/docs/IBUS_BAKEOFF.md b/docs/IBUS_BAKEOFF.md
index adba84e..0b0c184 100644
--- a/docs/IBUS_BAKEOFF.md
+++ b/docs/IBUS_BAKEOFF.md
@@ -20,7 +20,6 @@ Environment for the initial test round:
| Visual Studio Code (Electron) | Pass | Not tested | End-to-end insertion succeeded. |
| Qt application | Not tested | Not tested | |
| XWayland application | Not tested | Not tested | |
-| Password/PIN fields | Not tested | Not tested | Must refuse when purpose is reported. |
Still required for passthrough validation: modifiers, application shortcuts,
compose/dead keys, layout switching, and interaction with other input methods.
diff --git a/src/parley/ibus_engine.py b/src/parley/ibus_engine.py
index 86c155c..6f0e642 100644
--- a/src/parley/ibus_engine.py
+++ b/src/parley/ibus_engine.py
@@ -18,10 +18,6 @@ class ParleyIBusEngine(IBus.Engine):
focused: "ParleyIBusEngine | None" = None
- def __init__(self, *args, **kwargs) -> None:
- super().__init__(*args, **kwargs)
- self._purpose = IBus.InputPurpose.FREE_FORM
-
def do_process_key_event(self, keyval: int, keycode: int, state: int) -> bool:
return False
@@ -32,16 +28,7 @@ class ParleyIBusEngine(IBus.Engine):
if ParleyIBusEngine.focused is self:
ParleyIBusEngine.focused = None
- def do_set_content_type(
- self, purpose: IBus.InputPurpose, hints: IBus.InputHints
- ) -> None:
- self._purpose = purpose
-
def commit(self, text: str) -> str:
- if self._purpose in (IBus.InputPurpose.PASSWORD, IBus.InputPurpose.PIN):
- raise IBusInsertionError(
- "refusing insertion into a password or PIN field"
- )
self.commit_text(IBus.Text.new_from_string(text))
return "text committed through IBus"