mirror of
https://github.com/TermoraDev/termora.git
synced 2026-01-15 18:02:58 +08:00
chore: improve x11
This commit is contained in:
@@ -3,8 +3,10 @@ package app.termora.x11
|
||||
import org.apache.sshd.client.channel.ChannelShell
|
||||
import org.apache.sshd.common.SshConstants
|
||||
import org.apache.sshd.common.channel.PtyChannelConfigurationHolder
|
||||
import java.math.BigInteger
|
||||
import kotlin.random.Random
|
||||
|
||||
|
||||
class ChannelShell(
|
||||
configHolder: PtyChannelConfigurationHolder?,
|
||||
env: MutableMap<String, *>?
|
||||
@@ -22,7 +24,7 @@ class ChannelShell(
|
||||
buffer.putBoolean(false) // want-reply
|
||||
buffer.putBoolean(false)
|
||||
buffer.putString("MIT-MAGIC-COOKIE-1")
|
||||
buffer.putBytes(getFakedCookie())
|
||||
buffer.putString(getFakedCookie())
|
||||
buffer.putInt(0)
|
||||
writePacket(buffer)
|
||||
}
|
||||
@@ -30,30 +32,26 @@ class ChannelShell(
|
||||
super.doOpenPty()
|
||||
}
|
||||
|
||||
private fun getFakedCookie(): ByteArray {
|
||||
private fun getFakedCookie(): String {
|
||||
val session = super.getSession()
|
||||
var cookie = ChannelX11.X11_COOKIE_HEX.getOrNull(session)
|
||||
var cookie = session.getAttribute(ChannelX11.X11_COOKIE_HEX)
|
||||
if (cookie != null) {
|
||||
return cookie as ByteArray
|
||||
return cookie
|
||||
}
|
||||
|
||||
synchronized(session) {
|
||||
cookie = ChannelX11.X11_COOKIE_HEX.getOrNull(session)
|
||||
cookie = session.getAttribute(ChannelX11.X11_COOKIE_HEX)
|
||||
if (cookie != null) {
|
||||
return cookie as ByteArray
|
||||
return cookie
|
||||
}
|
||||
|
||||
val foo = Random.nextBytes(16)
|
||||
ChannelX11.X11_COOKIE.set(session, foo)
|
||||
session.setAttribute(ChannelX11.X11_COOKIE, foo)
|
||||
|
||||
val bar = foo.copyOf(32)
|
||||
for (i in 0..15) {
|
||||
bar[2 * i] = ChannelX11.COOKIE_TABLE[(foo[i].toInt() ushr 4) and 0xf]
|
||||
bar[2 * i + 1] = ChannelX11.COOKIE_TABLE[foo[i].toInt() and 0xf]
|
||||
}
|
||||
ChannelX11.X11_COOKIE_HEX.set(session, bar)
|
||||
cookie = String.format("%032x", BigInteger(1, foo))
|
||||
session.setAttribute(ChannelX11.X11_COOKIE_HEX, cookie)
|
||||
|
||||
return bar
|
||||
return cookie
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ import org.apache.sshd.client.channel.AbstractClientChannel
|
||||
import org.apache.sshd.client.future.DefaultOpenFuture
|
||||
import org.apache.sshd.client.future.OpenFuture
|
||||
import org.apache.sshd.client.session.ClientConnectionService
|
||||
import org.apache.sshd.common.Property
|
||||
import org.apache.sshd.common.AttributeRepository
|
||||
import org.apache.sshd.common.SshConstants
|
||||
import org.apache.sshd.common.channel.ChannelOutputStream
|
||||
import org.apache.sshd.common.io.IoConnectFuture
|
||||
@@ -21,12 +21,8 @@ class ChannelX11(
|
||||
) : AbstractClientChannel("x11") {
|
||||
|
||||
companion object {
|
||||
val X11_COOKIE: Property<Any> = Property.`object`("x11-cookie")
|
||||
val X11_COOKIE_HEX: Property<Any> = Property.`object`("x11-cookie-hex")
|
||||
val COOKIE_TABLE = byteArrayOf(
|
||||
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61,
|
||||
0x62, 0x63, 0x64, 0x65, 0x66
|
||||
)
|
||||
val X11_COOKIE = AttributeRepository.AttributeKey<ByteArray>()
|
||||
val X11_COOKIE_HEX = AttributeRepository.AttributeKey<String>()
|
||||
}
|
||||
|
||||
private lateinit var x11: IoSession
|
||||
@@ -69,7 +65,7 @@ class ChannelX11(
|
||||
|
||||
override fun doWriteData(data: ByteArray, off: Int, len: Long) {
|
||||
if (isInitialized.compareAndSet(false, true)) {
|
||||
val cookie = X11_COOKIE.getOrNull(session) ?: return
|
||||
val cookie = session.getAttribute(X11_COOKIE) ?: return
|
||||
val foo = data.copyOfRange(off, off + len.toInt())
|
||||
val s = 0
|
||||
val l = foo.size
|
||||
|
||||
Reference in New Issue
Block a user