Skip to content

v1.1.1

Choose a tag to compare

@PIXELQUADRO07 PIXELQUADRO07 released this 17 May 10:07

CoreShell v1.1 β€” Bug Fix Release

What's fixed

πŸ”΄ Critical β€” SSH connection

Fixed infinite loading on connect
The app would hang indefinitely with no error message when connecting to modern SSH servers (including Windows OpenSSH via Tailscale). Three separate issues caused this:

  • GSSAPIAuthentication was not disabled. On Windows without Kerberos configured, JSch silently attempted GSSAPI auth and stalled waiting for a response that never came.
  • Session.connect() was called without an explicit timeout argument. The session-level timeout only applies to read operations, not to the TCP handshake and key exchange β€” the connection could block for minutes.
  • The supported algorithm lists (server_host_key, kex) did not include modern algorithms used by current OpenSSH builds (ssh-ed25519, curve25519-sha256, ecdh-sha2-nistp256), causing negotiation to fail silently on some servers.

Fixed terminal freezing on command output
executeCommand() used a simple while (!channel.isClosed) delay(50) loop. When a command produced more output than the internal buffer could hold, the channel never closed β€” the terminal froze indefinitely. Output is now read continuously from both stdout and stderr streams while the channel is open.


🟑 Important β€” File manager & data

Fixed back navigation skipping two levels
navigateBack() called removeLast() twice on the path stack β€” once to remove the current path, then again to get the previous one, which discarded it. Navigation now uses last() (peek) after removing the current entry, so each back press correctly goes up exactly one directory level.

Fixed file manager loading before SSH is ready
FileManagerViewModel called loadDirectory("~") in its init block. Since the ViewModel is created when the user navigates to the tab, SFTP was opened before the SSH session was established, causing an immediate error. Directory loading now starts only after connectedServer becomes non-null.

Fixed crash when keystore is unavailable
decryptServer() propagated a raw SecurityException if the Android Keystore was inaccessible (e.g. after app reinstall or backup restore). The app would crash silently when loading the saved servers list. The exception is now caught and the encrypted record is returned as-is, so the app stays functional β€” the user just needs to re-enter the password for that server.


🟒 Minor β€” Reliability & diagnostics

Fixed SFTP channel race condition
getSftpChannel() accessed and assigned sftpChannel outside the mutex, making it possible for two coroutines to open duplicate channels concurrently. The check and assignment are now inside mutex.withLock.

Added full JSch debug logging
JSch internal logging is now routed to Android Logcat under the JSch tag. Filter by JSch or SSH_LOG in Logcat to see the full key exchange, authentication, and channel lifecycle β€” makes diagnosing connection issues significantly easier.

Added modern kex and cipher algorithm lists
Explicitly configured kex, cipher.s2c, cipher.c2s, mac.s2c, mac.c2s to prefer modern algorithms and maintain compatibility with both current and older OpenSSH servers.


Upgrade notes

No database migration required. Saved servers are preserved.
If a saved server fails to decrypt after updating, delete and re-add it β€” this is a one-time issue for installations affected by bug #8.