# tongtf/sshinjector architecture

> Architecture diagram of the GitHub repository tongtf/sshinjector, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/tongtf/sshinjector
- Repository: https://github.com/tongtf/sshinjector

## Overview

SSHInjector is an Android VPN proxy that routes selected applications’ traffic through an in-app SOCKS5 service and SSH direct-tcpip channels. Users configure servers and keys, choose allowed apps, then connect from the dashboard; the VPN service establishes the TUN interface and delegates connection and packet handling to the controller. The graph includes documented DNS, domain-routing, provisioning, and settings capabilities. Some internal wiring is based on README descriptions because the supplied source excerpts are partial.

Main entry points: [`app/src/main/java/cn/srv0/sshinjector/ui/MainActivity.kt`](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/ui/MainActivity.kt) (App Activity), [`app/src/main/java/cn/srv0/sshinjector/domain/usecase/VpnController.kt`](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/domain/usecase/VpnController.kt) (VPN Controller), [`app/src/main/java/cn/srv0/sshinjector/data/remote/ssh/JschSshClient.kt`](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/data/remote/ssh/JschSshClient.kt) (JSch SSH Client), [`app/src/main/java/cn/srv0/sshinjector/ui/screen/server/ServerListScreen.kt`](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/ui/screen/server/ServerListScreen.kt) (Server Management)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Android UI"]
  node_activity["App Activity<br/>[MainActivity.kt]"]
  node_dashboard["Dashboard<br/>[DashboardScreen.kt]"]
  node_serverui["Server Management"]
  node_whitelistui["App Whitelist<br/>[WhitelistScreen.kt]"]
  node_settingsui["Proxy Settings<br/>[SettingsScreen.kt]"]
  node_keyui["Key Manager"]
end

subgraph group_domain["VPN and Domain"]
  node_vpnservice["VPN Service<br/>[SshVpnService.kt]"]
  node_controller["VPN Controller<br/>[VpnController.kt]"]
  node_packets["Packet Processor<br/>[PacketProcessor.kt]"]
  node_socks["SOCKS5 Proxy"]
  node_dns["DNS Interceptor<br/>[DnsInterceptor.kt]"]
  node_tunnelmgr["Tunnel Manager<br/>[TunnelManager.kt]"]
  node_domainlist["Domain Rules"]
end

subgraph group_remote["SSH and Provisioning"]
  node_keymanager["SSH Key Manager<br/>[SshKeyManager.kt]"]
  node_sshclient["JSch SSH Client<br/>[JschSshClient.kt]"]
  node_provisioner["Server Provisioner"]
end

subgraph group_storage["Local Data"]
  node_repository["Server Repository"]
  node_database[("Room Database<br/>[AppDatabase.kt]")]
  node_settings[("Settings Store")]
end

node_user(("User"))
node_server{{"SSH Server"}}
node_apps(("Selected Apps"))

node_user -->|"opens"| node_activity
node_activity -->|"navigates"| node_dashboard
node_activity -->|"navigates"| node_serverui
node_activity -->|"navigates"| node_whitelistui
node_activity -->|"navigates"| node_settingsui
node_activity -->|"navigates"| node_keyui
node_dashboard -->|"starts or stops"| node_vpnservice
node_vpnservice -->|"connects"| node_controller
node_controller -->|"starts plugin"| node_tunnelmgr
node_controller -->|"processes traffic"| node_packets
node_packets -->|"dispatches TCP"| node_socks
node_packets -->|"dispatches DNS"| node_dns
node_controller -->|"checks domains"| node_domainlist
node_tunnelmgr -->|"uses SSH channel"| node_sshclient
node_sshclient -->|"loads identity"| node_keymanager
node_sshclient -->|"opens SSH channels"| node_server
node_serverui -->|"manages servers"| node_repository
node_whitelistui -->|"manages allowed apps"| node_repository
node_repository -->|"reads and writes"| node_database
node_settingsui -->|"updates preferences"| node_settings
node_domainlist -->|"reads list settings"| node_settings
node_domainlist -.->|"fetches rules"| node_server
node_keyui -->|"generates and imports"| node_keymanager
node_serverui -->|"provisions server"| node_provisioner
node_provisioner -->|"executes commands"| node_sshclient
node_whitelistui -->|"selects apps"| node_apps
node_vpnservice -->|"allows VPN traffic"| node_apps

click node_activity "https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/ui/MainActivity.kt"
click node_dashboard "https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/ui/screen/dashboard/DashboardScreen.kt"
click node_serverui "https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/ui/screen/server/ServerListScreen.kt"
click node_whitelistui "https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/ui/screen/whitelist/WhitelistScreen.kt"
click node_settingsui "https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/ui/screen/settings/SettingsScreen.kt"
click node_keyui "https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/ui/screen/keymanager/KeyManagerScreen.kt"
click node_vpnservice "https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/vpn/SshVpnService.kt"
click node_controller "https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/domain/usecase/VpnController.kt"
click node_packets "https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/domain/vpn/PacketProcessor.kt"
click node_socks "https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/domain/vpn/Socks5ProxyServer.kt"
click node_dns "https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/domain/vpn/DnsInterceptor.kt"
click node_tunnelmgr "https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/domain/vpn/tunnel/TunnelManager.kt"
click node_domainlist "https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/data/local/DomainListManager.kt"
click node_repository "https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/domain/usecase/ServerRepository.kt"
click node_database "https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/data/local/database/AppDatabase.kt"
click node_settings "https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/data/local/preferences/SettingsDataStore.kt"
click node_keymanager "https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/data/remote/ssh/SshKeyManager.kt"
click node_sshclient "https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/data/remote/ssh/JschSshClient.kt"
click node_provisioner "https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/data/remote/config/ServerProvisioner.kt"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_activity,node_dashboard,node_serverui,node_whitelistui,node_settingsui,node_keyui,node_user toneBlue
class node_vpnservice,node_controller,node_packets,node_socks,node_dns,node_tunnelmgr,node_domainlist toneAmber
class node_keymanager,node_sshclient,node_provisioner,node_server toneMint
class node_repository,node_database,node_settings toneRose
class node_apps toneIndigo
```

## Components

### Android UI

- [App Activity](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/ui/MainActivity.kt): `app/src/main/java/cn/srv0/sshinjector/ui/MainActivity.kt`
- [Dashboard](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/ui/screen/dashboard/DashboardScreen.kt): `app/src/main/java/cn/srv0/sshinjector/ui/screen/dashboard/DashboardScreen.kt`
- [Server Management](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/ui/screen/server/ServerListScreen.kt): `app/src/main/java/cn/srv0/sshinjector/ui/screen/server/ServerListScreen.kt`
- [App Whitelist](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/ui/screen/whitelist/WhitelistScreen.kt): `app/src/main/java/cn/srv0/sshinjector/ui/screen/whitelist/WhitelistScreen.kt`
- [Proxy Settings](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/ui/screen/settings/SettingsScreen.kt): `app/src/main/java/cn/srv0/sshinjector/ui/screen/settings/SettingsScreen.kt`
- [Key Manager](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/ui/screen/keymanager/KeyManagerScreen.kt): `app/src/main/java/cn/srv0/sshinjector/ui/screen/keymanager/KeyManagerScreen.kt`

### VPN and Domain

- [VPN Service](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/vpn/SshVpnService.kt): `app/src/main/java/cn/srv0/sshinjector/vpn/SshVpnService.kt`
- [VPN Controller](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/domain/usecase/VpnController.kt): `app/src/main/java/cn/srv0/sshinjector/domain/usecase/VpnController.kt`
- [Packet Processor](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/domain/vpn/PacketProcessor.kt): `app/src/main/java/cn/srv0/sshinjector/domain/vpn/PacketProcessor.kt`
- [SOCKS5 Proxy](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/domain/vpn/Socks5ProxyServer.kt): `app/src/main/java/cn/srv0/sshinjector/domain/vpn/Socks5ProxyServer.kt`
- [DNS Interceptor](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/domain/vpn/DnsInterceptor.kt): `app/src/main/java/cn/srv0/sshinjector/domain/vpn/DnsInterceptor.kt`
- [Tunnel Manager](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/domain/vpn/tunnel/TunnelManager.kt): `app/src/main/java/cn/srv0/sshinjector/domain/vpn/tunnel/TunnelManager.kt`
- [Domain Rules](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/data/local/DomainListManager.kt): `app/src/main/java/cn/srv0/sshinjector/data/local/DomainListManager.kt`

### SSH and Provisioning

- [SSH Key Manager](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/data/remote/ssh/SshKeyManager.kt): `app/src/main/java/cn/srv0/sshinjector/data/remote/ssh/SshKeyManager.kt`
- [JSch SSH Client](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/data/remote/ssh/JschSshClient.kt): `app/src/main/java/cn/srv0/sshinjector/data/remote/ssh/JschSshClient.kt`
- [Server Provisioner](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/data/remote/config/ServerProvisioner.kt): `app/src/main/java/cn/srv0/sshinjector/data/remote/config/ServerProvisioner.kt`

### Local Data

- [Server Repository](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/domain/usecase/ServerRepository.kt): `app/src/main/java/cn/srv0/sshinjector/domain/usecase/ServerRepository.kt`
- [Room Database](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/data/local/database/AppDatabase.kt): `app/src/main/java/cn/srv0/sshinjector/data/local/database/AppDatabase.kt`
- [Settings Store](https://github.com/tongtf/sshinjector/blob/main/app/src/main/java/cn/srv0/sshinjector/data/local/preferences/SettingsDataStore.kt): `app/src/main/java/cn/srv0/sshinjector/data/local/preferences/SettingsDataStore.kt`

### Other components

- **User**
- **SSH Server**
- **Selected Apps**

## Connections

- User → App Activity: opens
- App Activity → Dashboard: navigates
- App Activity → Server Management: navigates
- App Activity → App Whitelist: navigates
- App Activity → Proxy Settings: navigates
- App Activity → Key Manager: navigates
- Dashboard → VPN Service: starts or stops
- VPN Service → VPN Controller: connects
- VPN Controller → Tunnel Manager: starts plugin
- VPN Controller → Packet Processor: processes traffic
- Packet Processor → SOCKS5 Proxy: dispatches TCP
- Packet Processor → DNS Interceptor: dispatches DNS
- VPN Controller → Domain Rules: checks domains
- Tunnel Manager → JSch SSH Client: uses SSH channel
- JSch SSH Client → SSH Key Manager: loads identity
- JSch SSH Client → SSH Server: opens SSH channels
- Server Management → Server Repository: manages servers
- App Whitelist → Server Repository: manages allowed apps
- Server Repository → Room Database: reads and writes
- Proxy Settings → Settings Store: updates preferences
- Domain Rules → Settings Store: reads list settings
- Domain Rules → SSH Server: fetches rules
- Key Manager → SSH Key Manager: generates and imports
- Server Management → Server Provisioner: provisions server
- Server Provisioner → JSch SSH Client: executes commands
- App Whitelist → Selected Apps: selects apps
- VPN Service → Selected Apps: allows VPN traffic
