- SSH 2.x via sshj, PTY xterm-256color interaktif - Terminal emulator self-contained (model + parser ANSI + custom View): 16/256/TrueColor, cursor, clear, scrollback, seleksi+copas, pinch-zoom - SSH engine: auth password/private-key, reconnect dengan backoff, keep-alive 60s - Profil server tersimpan dengan kredensial terenkripsi (EncryptedSharedPreferences) - UI: daftar profil, editor profil, layar terminal + keyboard khusus + toolbar - 6 tema terminal build-in + font monospace - Build terverifikasi: assembleDebug SUCCESS, lintDebug 0 error (APK 11MB)
109 lines
5.3 KiB
Markdown
109 lines
5.3 KiB
Markdown
# SSH Mobile Client — Android
|
||
|
||
A proper, interactive SSH client for Android, built natively in Kotlin. Designed like
|
||
Termux-style terminals so **vim, nano, htop, tmux, top, ssh, and other interactive CLIs**
|
||
work correctly over a real PTY.
|
||
|
||
> **Status: ter-build & terverifikasi.** Pada 2026-08-30 proyek ini berhasil dikompilasi
|
||
> penuh (Gradle `assembleDebug`) dan diproduksi APK (11 MB). Repo berisi project
|
||
> Kotlin/AndroidStudio lengkap — tinggal buka di Android Studio atau build via CLI.
|
||
|
||
## ✨ Fitur (versi 1.0)
|
||
|
||
| Area | Dukungan |
|
||
|------|----------|
|
||
| **SSH 2.x** | sshj 0.38 (SSH-2), handshake modern (RSA/ECDSA/ED25519) |
|
||
| **PTY interaktif** | `xterm-256color` PTY, shell interaktif penuh |
|
||
| **ANSI warna** | 16 + 256 + TrueColor (24-bit) SGR — parser ditulis sendiri |
|
||
| **Font custom** | ukuran font diatur (pinch-to-zoom 14–60px), monospace |
|
||
| **Tema terminal** | 6 tema built-in (Hijau, Tango, Solarized×2, Gruvbox, Material) + Dark UI |
|
||
| **Keyboard khusus** | Baris Ctrl/Alt/Esc/Tab/panah/PgUp/PgDn/Del |
|
||
| **Copy/paste & seleksi** | Seleksi teks → salin ke clipboard, tempel ke sesi |
|
||
| **Autentikasi** | Password / private key (+passphrase) |
|
||
| **Profil server** | Simpan banyak profil (nama, host, port, user, tema, ukuran font) |
|
||
| **Kredensial aman** | `EncryptedSharedPreferences` (Tink/GCM) — semua tersimpan terenkripsi |
|
||
| **Reconnect & keep-alive** | Reconnect otomatis dengan backoff + keep-alive SSH (60s) |
|
||
| **Orientasi** | Portrait & landscape — PTY di-resize otomatis mengikuti layout |
|
||
|
||
> **Backlog:** SFTP browser, host-key pinning (known_hosts), manajemen key dari file,
|
||
> toggle Dark/Light saat runtime.
|
||
|
||
## 🏗️ Arsitektur
|
||
|
||
```
|
||
app/src/main/java/com/kosbarokah/sshclient/
|
||
├── data/
|
||
│ ├── ServerProfile.kt # model profil + ThemePreset (16-warna & tema)
|
||
│ └── SecureStore.kt # simpan profil + kredensial terenkripsi
|
||
├── ssh/
|
||
│ └── SshEngine.kt # koneksi SSH (sshj), PTY, auth, reconnect, keep-alive
|
||
├── terminal/
|
||
│ ├── TerminalModel.kt # buffer layar + scrollback + sel (warna/atribut)
|
||
│ ├── TerminalParser.kt # parser ANSI/VT100 (16/256/TrueColor, cursor, clear)
|
||
│ ├── TerminalView.kt # View custom: render, seleksi, copy, pinch-zoom
|
||
│ ├── TerminalScheme.kt # data skema warna (palette + bg/fg/cursor)
|
||
│ └── TerminalController.kt # perekat: parser ↔ SSH ↔ View
|
||
├── keyboard/
|
||
│ └── KeySequences.kt # byte sequence key khusus (Esc, panah, Ctrl, dst)
|
||
└── ui/
|
||
├── ConnectActivity.kt # daftar profil ter-simpan
|
||
├── ProfileEditorActivity.kt # tambah/edit/delete profil + kredensial
|
||
└── TerminalActivity.kt # layar terminal + toolbar + key bar
|
||
```
|
||
|
||
## 🚀 Cara Membangun (Android Studio)
|
||
|
||
1. **Buka** folder ini di Android Studio (Flutter? Tidak — ini native Kotlin/Gradle).
|
||
2. Pastikan SDK `android-34` & build-tools `34.0.0` terinstal (Android Studio akan
|
||
menawarkan secara otomatis).
|
||
3. Sync Gradle — semua dependensi (sshj, security-crypto, Material, coroutines)
|
||
diambil dari Maven Central / Google.
|
||
4. **Run** di emulator atau perangkat Android (minSdk 26 / Android 8.0+).
|
||
|
||
Bisa juga via **command-line** (tanpa Android Studio):
|
||
|
||
```bash
|
||
# Prasyarat di mesin pengembang:
|
||
# - JDK 17
|
||
# - Android SDK command-line tools (platform android-34, build-tools 34.0.0)
|
||
# - Gradle 8.9 (atau buka di Android Studio yang membawa Gradle sendiri)
|
||
export ANDROID_HOME=/path/to/Sdk # sesuaikan dengan lokasi SDK-mu
|
||
gradle :app:assembleDebug # hasil: app/build/outputs/apk/debug/app-debug.apk
|
||
```
|
||
|
||
> Catatan: tidak ada `gradlew` wrapper di proyek ini; gunakan Gradle yang terinstal
|
||
> (8.9) atau buka via Android Studio (yang menyediakan Gradle sendiri).
|
||
|
||
## 🧪 Verifikasi Build
|
||
|
||
Pada 2026-08-30 yang lalu, hasil build di jalur produksi:
|
||
|
||
- `gradle :app:assembleDebug` → **BUILD SUCCESSFUL**, APK 11 MB diproduksi
|
||
- `gradle :app:lintDebug` → **0 error** (hanya warning versi dependency yang tidak wajib di-*upgrade*)
|
||
- Struktur lengkap: 13 file Kotlin, 10 resource XML, `AndroidManifest.xml`, Gradle config
|
||
|
||
> Catatan: terminal emulator **diimplementasikan sendiri** (tanpa library pihak ketiga)
|
||
> supaya build bersih & dependable. `TerminalParser` menangani subset ANSI yang cukup
|
||
> untuk vim/nano/htop/tmux/top: SGR warna (16/256/TrueColor), cursor movement/clear,
|
||
> scrollback, dan OSC (ignored body). Karena tidak ada emulator Android di lingkungan
|
||
> build ini, verifikasi dibatasi pada compile + resource + lint; uji runtime tetap perlu
|
||
> di perangkat/emulator.
|
||
|
||
## 🔐 Keamanan
|
||
|
||
- Semua profil & kredensial disimpan lewat `EncryptedSharedPreferences` (master key
|
||
AES256-GCM dari Android Keystore, nilai dienkripsi AES256-GCM).
|
||
- Private key & passphrase tidak pernah diserialisasi sebagai teks polos ke disk.
|
||
- Host key verifier v1 bersifat "terima semua" dengan catatan TODO untuk pinning
|
||
known_hosts di rilis berikut (terbilang di backlog).
|
||
|
||
## 🖥️ Skenario Penggunaan
|
||
|
||
- SSH ke server/cantor untuk akses shell jarak jauh.
|
||
- Menjalankan editor terkesan: `vim`, `nano`, `htop`, `tmux`, `ssh`, `kubectl`.
|
||
- Warna penuh untuk `ls -la --color`, `bat`, `lsd`, `fzf`, `grep --color`.
|
||
- Simpan beberapa profil server untuk akses satu-ketukan.
|
||
|
||
## 📄 Lisensi
|
||
Kode contoh internal — untuk digunakan oleh project Kos Barokah.
|