Add robust validation for hosts provided through URI or Base64 pairing
strings to prevent Server-Side Request Forgery (SSRF). The application
now rejects loopback addresses (like localhost, 127.0.0.1, 0.0.0.0),
link-local addresses, and any-local addresses, while continuing to allow
remote connections to site-local addresses, custom remote domains,
and VPN networks (like Tailscale). The DNS resolution operates securely
on the IO dispatcher to ensure main-thread safety. Included tests verify
both rejection of invalid hosts and seamless parsing of valid ones.
* fix(#287): fix empty-state subtitles and content description on Keys and Profiles screens
- Added `keys_empty_desc` and `profiles_empty_desc` string resources.
- Updated `KeysScreen.kt` and `ProfilesScreen.kt` to use correct empty-state subtitles instead of the copy-pasted `toolsets_empty_desc`.
- Added `content_desc_edit` string resource and applied it to the edit icon in `KeysScreen.kt` for accessibility.
* fix(#287): correct empty-state descriptions and accessibility content descriptions
- Replaced incorrect `toolsets_empty_desc` with newly added `keys_empty_desc` on the Keys screen.
- Replaced incorrect `toolsets_empty_desc` with newly added `profiles_empty_desc` on the Profiles screen.
- Updated the content description of the edit icon on the Keys screen to use newly added `content_desc_edit` instead of `nav_drawer_section_converse`.
* fix(#298): internationalize ConnectViewModel strings, fix null-assert crash on profile selector
E1: Add all connect error resources to strings.xml for i18n readiness
E2: Migrate ConnectViewModel to AndroidViewModel, replace all hardcoded
user-facing strings with getString(R.string.*) calls
F1: Replace state.selectedProfile!! with .?.let { } pattern in
ConnectScreen.kt to eliminate NPE risk on mutable state copy
Closes#298
* fix(#298): update test files for AndroidViewModel constructor
Update ConnectViewModelTest.kt and E2eIntegrationTest.kt to pass
mock Application to the new ConnectViewModel(app) constructor.
Add getString() MockK stubs matching the string resource keys.
* fix(#298): add missing LocalContext import and restore connect_pairing_string
Two compilation errors:
- ConnectScreen.kt was missing import for LocalContext
- strings.xml was missing connect_pairing_string resource
(accidentally removed in earlier patch)
* fix(#298): extract ViewModelFactory to avoid composable-in-non-composable error
LocalContext.current cannot be called inside a viewModel { } factory
lambda because the lambda is not @Composable. Fix by extracting a
ConnectViewModelFactory class and using run { } to capture the
Application value at the composable call site before passing to
the factory constructor.
* fix(#298): fix MockK varargs matching in test stubs
getString(int, Object...) takes varargs. MockK's any<Int>() and
any<String>() didn't match the vararg Object... slot. Changed to
any() (untyped) which matches correctly.
* fix(#298): fix MockK answers — arg indexing was wrong
In getString(int, Object...), firstArg is the resource ID,
secondArg is the format argument. Using firstArg<Int>() in
the answers block was returning the res ID, not 500/etc.
Changed to secondArg<Any>().
* fix(#298): replace getString(int,Object...) with String.format(getString(int),...)
Avoid MockK varargs matching issues by calling app.getString(int)
for the format template and String.format() to apply args.
Simplifies test stubs to pure getString(int) returns.
---------
Co-authored-by: M57 <hy4ri@users.noreply.github.com>
* fix(#220): implement edit soul and set model dialogs
* fix(#211): make UI more compact and information dense
* fix(#211): make navigation drawer sidebar more compact
* feat(#252): move settings item to end of navigation drawer
* feat(#250): add bottom navigation bar display mode settings
* feat(#225): add search bar filtering to remaining screens
* fix: make bottom navigation bar display modes more compact
* fix: resolve compilation error in KanbanScreen by referencing assignedTo
* feat: add search to achievements screen and top padding for icon-only navigation bar
* fix: adjust icon-only bottom bar height and remove padding
* fix(#249): remove unused PaddingValues imports in 6 screens
---------
Co-authored-by: M57 <hy4ri@users.noreply.github.com>
* fix(#130): fix compilation errors in scroll-to-bottom FAB
* fix(#130): add missing R import, context, and string resources
* fix(#130): use stringResource() instead of context.getString() for Compose lint
---------
Co-authored-by: M57 <hy4ri@users.noreply.github.com>