mirror of
https://github.com/KDE/kdeconnect-android
synced 2025-08-31 22:25:08 +00:00
fix: remove sshd instance when start second time due to sshd can't be start after stop
This commit is contained in:
committed by
Albert Vaca Cintora
parent
cd8237d773
commit
7fbfc9df90
@@ -79,7 +79,7 @@ class SftpPlugin : Plugin(), OnSharedPreferenceChangeListener {
|
|||||||
override fun onPacketReceived(np: NetworkPacket): Boolean {
|
override fun onPacketReceived(np: NetworkPacket): Boolean {
|
||||||
if (!np.getBoolean("startBrowsing")) return false
|
if (!np.getBoolean("startBrowsing")) return false
|
||||||
|
|
||||||
if (!server.isInitialized) {
|
if (!server.isInitialized || server.isClosed) {
|
||||||
try {
|
try {
|
||||||
server.initialize(context, device)
|
server.initialize(context, device)
|
||||||
} catch (e: GeneralSecurityException) {
|
} catch (e: GeneralSecurityException) {
|
||||||
|
@@ -24,15 +24,22 @@ import org.apache.sshd.server.auth.pubkey.PublickeyAuthenticator
|
|||||||
import org.apache.sshd.server.kex.DHGServer
|
import org.apache.sshd.server.kex.DHGServer
|
||||||
import org.apache.sshd.server.session.ServerSession
|
import org.apache.sshd.server.session.ServerSession
|
||||||
import org.apache.sshd.server.subsystem.SubsystemFactory
|
import org.apache.sshd.server.subsystem.SubsystemFactory
|
||||||
|
import org.apache.sshd.sftp.server.FileHandle
|
||||||
|
import org.apache.sshd.sftp.server.SftpFileSystemAccessor
|
||||||
import org.apache.sshd.sftp.server.SftpSubsystemFactory
|
import org.apache.sshd.sftp.server.SftpSubsystemFactory
|
||||||
|
import org.apache.sshd.sftp.server.SftpSubsystemProxy
|
||||||
import org.kde.kdeconnect.Device
|
import org.kde.kdeconnect.Device
|
||||||
import org.kde.kdeconnect.Helpers.RandomHelper
|
import org.kde.kdeconnect.Helpers.RandomHelper
|
||||||
import org.kde.kdeconnect.Helpers.SecurityHelpers.RsaHelper
|
import org.kde.kdeconnect.Helpers.SecurityHelpers.RsaHelper
|
||||||
import org.kde.kdeconnect.Helpers.SecurityHelpers.constantTimeCompare
|
import org.kde.kdeconnect.Helpers.SecurityHelpers.constantTimeCompare
|
||||||
import org.kde.kdeconnect.Plugins.SftpPlugin.saf.SafFileSystemFactory
|
import org.kde.kdeconnect.Plugins.SftpPlugin.saf.SafFileSystemFactory
|
||||||
|
import org.kde.kdeconnect.Plugins.SftpPlugin.saf.SafPath
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
import java.nio.channels.SeekableByteChannel
|
||||||
import java.nio.charset.StandardCharsets
|
import java.nio.charset.StandardCharsets
|
||||||
|
import java.nio.file.OpenOption
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
|
import java.nio.file.attribute.FileAttribute
|
||||||
import java.security.GeneralSecurityException
|
import java.security.GeneralSecurityException
|
||||||
import java.security.KeyPair
|
import java.security.KeyPair
|
||||||
import java.security.MessageDigest
|
import java.security.MessageDigest
|
||||||
@@ -50,7 +57,9 @@ internal class SimpleSftpServer {
|
|||||||
|
|
||||||
var isInitialized: Boolean = false
|
var isInitialized: Boolean = false
|
||||||
|
|
||||||
private lateinit var sshd: SshServer
|
private var sshd: SshServer? = null
|
||||||
|
val isClosed: Boolean
|
||||||
|
get() = sshd!!.isClosed
|
||||||
|
|
||||||
private var safFileSystemFactory: SafFileSystemFactory? = null
|
private var safFileSystemFactory: SafFileSystemFactory? = null
|
||||||
|
|
||||||
@@ -60,7 +69,7 @@ internal class SimpleSftpServer {
|
|||||||
|
|
||||||
@Throws(GeneralSecurityException::class)
|
@Throws(GeneralSecurityException::class)
|
||||||
fun initialize(context: Context?, device: Device) {
|
fun initialize(context: Context?, device: Device) {
|
||||||
sshd = ServerBuilder.builder().apply {
|
val sshd = ServerBuilder.builder().apply {
|
||||||
signatureFactories(
|
signatureFactories(
|
||||||
listOf(
|
listOf(
|
||||||
BuiltinSignatures.nistp256,
|
BuiltinSignatures.nistp256,
|
||||||
@@ -102,7 +111,23 @@ internal class SimpleSftpServer {
|
|||||||
|
|
||||||
sshd.commandFactory = ScpCommandFactory()
|
sshd.commandFactory = ScpCommandFactory()
|
||||||
sshd.subsystemFactories =
|
sshd.subsystemFactories =
|
||||||
listOf<SubsystemFactory>(SftpSubsystemFactory())
|
listOf<SubsystemFactory>(SftpSubsystemFactory.Builder().apply {
|
||||||
|
withFileSystemAccessor(object: SftpFileSystemAccessor {
|
||||||
|
override fun openFile(
|
||||||
|
subsystem: SftpSubsystemProxy?,
|
||||||
|
fileHandle: FileHandle?,
|
||||||
|
file: Path?,
|
||||||
|
handle: String?,
|
||||||
|
options: MutableSet<out OpenOption>?,
|
||||||
|
vararg attrs: FileAttribute<*>?
|
||||||
|
): SeekableByteChannel {
|
||||||
|
if (file is SafPath) {
|
||||||
|
return file.fileSystem.provider().newByteChannel(file, options, *attrs)
|
||||||
|
}
|
||||||
|
return super.openFile(subsystem, fileHandle, file, handle, options, *attrs)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}.build())
|
||||||
|
|
||||||
keyAuth.deviceKey = device.certificate.publicKey
|
keyAuth.deviceKey = device.certificate.publicKey
|
||||||
|
|
||||||
@@ -110,6 +135,8 @@ internal class SimpleSftpServer {
|
|||||||
sshd.passwordAuthenticator = passwordAuth
|
sshd.passwordAuthenticator = passwordAuth
|
||||||
|
|
||||||
this.isInitialized = true
|
this.isInitialized = true
|
||||||
|
|
||||||
|
this.sshd = sshd
|
||||||
}
|
}
|
||||||
|
|
||||||
fun start(): Boolean {
|
fun start(): Boolean {
|
||||||
@@ -119,8 +146,8 @@ internal class SimpleSftpServer {
|
|||||||
port = STARTPORT
|
port = STARTPORT
|
||||||
while (!isStarted) {
|
while (!isStarted) {
|
||||||
try {
|
try {
|
||||||
sshd.port = port
|
sshd!!.port = port
|
||||||
sshd.start()
|
sshd!!.start()
|
||||||
isStarted = true
|
isStarted = true
|
||||||
} catch (e: IOException) {
|
} catch (e: IOException) {
|
||||||
port++
|
port++
|
||||||
@@ -139,7 +166,7 @@ internal class SimpleSftpServer {
|
|||||||
fun stop() {
|
fun stop() {
|
||||||
try {
|
try {
|
||||||
isStarted = false
|
isStarted = false
|
||||||
sshd.stop(true)
|
sshd!!.stop(true)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Log.e("SFTP", "Exception while stopping the server", e)
|
Log.e("SFTP", "Exception while stopping the server", e)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user