From 46412054c4626cf9743a9e000e292bf4fb207cd6 Mon Sep 17 00:00:00 2001 From: hstyi Date: Tue, 1 Apr 2025 17:51:15 +0800 Subject: [PATCH] chore: improve x11 --- .../kotlin/app/termora/x11/ChannelShell.kt | 26 +++++++++---------- src/main/kotlin/app/termora/x11/ChannelX11.kt | 12 +++------ 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/src/main/kotlin/app/termora/x11/ChannelShell.kt b/src/main/kotlin/app/termora/x11/ChannelShell.kt index 83efa9a..63e61ef 100644 --- a/src/main/kotlin/app/termora/x11/ChannelShell.kt +++ b/src/main/kotlin/app/termora/x11/ChannelShell.kt @@ -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? @@ -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 } } } diff --git a/src/main/kotlin/app/termora/x11/ChannelX11.kt b/src/main/kotlin/app/termora/x11/ChannelX11.kt index 15a582a..b7c6f19 100644 --- a/src/main/kotlin/app/termora/x11/ChannelX11.kt +++ b/src/main/kotlin/app/termora/x11/ChannelX11.kt @@ -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 = Property.`object`("x11-cookie") - val X11_COOKIE_HEX: Property = 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() + val X11_COOKIE_HEX = AttributeRepository.AttributeKey() } 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