mirror of
https://github.com/ViaVersion/VIAaaS.git
synced 2024-10-03 05:27:44 +02:00
"viaaas:reauth" plugin message
This commit is contained in:
parent
1b4eda7884
commit
3682a0f011
@ -12,6 +12,9 @@ import com.viaversion.aas.handler.MinecraftHandler
|
|||||||
import com.viaversion.aas.handler.forward
|
import com.viaversion.aas.handler.forward
|
||||||
import com.viaversion.aas.util.StacklessException
|
import com.viaversion.aas.util.StacklessException
|
||||||
import com.viaversion.viaversion.api.protocol.packet.State
|
import com.viaversion.viaversion.api.protocol.packet.State
|
||||||
|
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion
|
||||||
|
import com.viaversion.viaversion.api.type.Type
|
||||||
|
import io.netty.buffer.ByteBufAllocator
|
||||||
import io.netty.channel.Channel
|
import io.netty.channel.Channel
|
||||||
import io.netty.channel.ChannelHandlerContext
|
import io.netty.channel.ChannelHandlerContext
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
@ -19,6 +22,7 @@ import kotlinx.coroutines.future.await
|
|||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.concurrent.CompletableFuture
|
import java.util.concurrent.CompletableFuture
|
||||||
|
import java.util.concurrent.ThreadLocalRandom
|
||||||
|
|
||||||
class LoginState : ConnectionState {
|
class LoginState : ConnectionState {
|
||||||
val callbackPlayerId = CompletableFuture<UUID>()
|
val callbackPlayerId = CompletableFuture<UUID>()
|
||||||
@ -34,12 +38,14 @@ class LoginState : ConnectionState {
|
|||||||
get() = State.LOGIN
|
get() = State.LOGIN
|
||||||
override val logDc: Boolean
|
override val logDc: Boolean
|
||||||
get() = true
|
get() = true
|
||||||
|
var callbackPluginReauth = CompletableFuture<Boolean>()
|
||||||
|
var pendingReauth: Int? = null
|
||||||
|
|
||||||
override fun handlePacket(handler: MinecraftHandler, ctx: ChannelHandlerContext, packet: Packet) {
|
override fun handlePacket(handler: MinecraftHandler, ctx: ChannelHandlerContext, packet: Packet) {
|
||||||
when (packet) {
|
when (packet) {
|
||||||
is LoginStart -> handleLoginStart(handler, packet)
|
is LoginStart -> handleLoginStart(handler, packet)
|
||||||
is CryptoResponse -> handleCryptoResponse(handler, packet)
|
is CryptoResponse -> handleCryptoResponse(handler, packet)
|
||||||
is PluginResponse -> forward(handler, packet)
|
is PluginResponse -> handlePluginResponse(handler, packet)
|
||||||
is LoginDisconnect -> forward(handler, packet)
|
is LoginDisconnect -> forward(handler, packet)
|
||||||
is CryptoRequest -> handleCryptoRequest(handler, packet)
|
is CryptoRequest -> handleCryptoRequest(handler, packet)
|
||||||
is LoginSuccess -> handleLoginSuccess(handler, packet)
|
is LoginSuccess -> handleLoginSuccess(handler, packet)
|
||||||
@ -49,6 +55,16 @@ class LoginState : ConnectionState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun handlePluginResponse(handler: MinecraftHandler, packet: PluginResponse) {
|
||||||
|
if (packet.id == pendingReauth) {
|
||||||
|
callbackPluginReauth.complete(packet.success)
|
||||||
|
pendingReauth = null
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
forward(handler, packet)
|
||||||
|
}
|
||||||
|
|
||||||
private fun handleLoginSuccess(handler: MinecraftHandler, loginSuccess: LoginSuccess) {
|
private fun handleLoginSuccess(handler: MinecraftHandler, loginSuccess: LoginSuccess) {
|
||||||
handler.data.state = PlayState
|
handler.data.state = PlayState
|
||||||
forward(handler, loginSuccess)
|
forward(handler, loginSuccess)
|
||||||
@ -89,6 +105,28 @@ class LoginState : ConnectionState {
|
|||||||
send(frontChannel, cryptoRequest, true)
|
send(frontChannel, cryptoRequest, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun reauthMessage(handler: MinecraftHandler, backName: String, backHash: String): CompletableFuture<Boolean> {
|
||||||
|
if (handler.data.frontVer!! < ProtocolVersion.v1_13.version) {
|
||||||
|
callbackPluginReauth.complete(false)
|
||||||
|
} else {
|
||||||
|
val buf = ByteBufAllocator.DEFAULT.buffer()
|
||||||
|
try {
|
||||||
|
Type.STRING.write(buf, backName)
|
||||||
|
Type.STRING.write(buf, backHash)
|
||||||
|
|
||||||
|
val packet = PluginRequest()
|
||||||
|
packet.id = ThreadLocalRandom.current().nextInt()
|
||||||
|
packet.channel = "viaaas:reauth"
|
||||||
|
packet.data = readRemainingBytes(buf)
|
||||||
|
send(handler.data.frontChannel, packet, true)
|
||||||
|
pendingReauth = packet.id
|
||||||
|
} finally {
|
||||||
|
buf.release()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return callbackPluginReauth
|
||||||
|
}
|
||||||
|
|
||||||
fun handleCryptoRequest(handler: MinecraftHandler, cryptoRequest: CryptoRequest) {
|
fun handleCryptoRequest(handler: MinecraftHandler, cryptoRequest: CryptoRequest) {
|
||||||
val backServerId = cryptoRequest.serverId
|
val backServerId = cryptoRequest.serverId
|
||||||
val backPublicKey = cryptoRequest.publicKey
|
val backPublicKey = cryptoRequest.publicKey
|
||||||
@ -108,6 +146,8 @@ class LoginState : ConnectionState {
|
|||||||
val backHash = generateServerHash(backServerId, backKey, backPublicKey)
|
val backHash = generateServerHash(backServerId, backKey, backPublicKey)
|
||||||
|
|
||||||
mcLogger.info("Session req: ${handler.data.frontHandler.endRemoteAddress} ($playerId $frontName) $backName")
|
mcLogger.info("Session req: ${handler.data.frontHandler.endRemoteAddress} ($playerId $frontName) $backName")
|
||||||
|
val pluginReauthed = reauthMessage(handler, backName!!, backHash).await()
|
||||||
|
if (!pluginReauthed) {
|
||||||
AspirinServer.viaWebServer.requestSessionJoin(
|
AspirinServer.viaWebServer.requestSessionJoin(
|
||||||
playerId,
|
playerId,
|
||||||
backName!!,
|
backName!!,
|
||||||
@ -115,6 +155,7 @@ class LoginState : ConnectionState {
|
|||||||
frontHandler.endRemoteAddress,
|
frontHandler.endRemoteAddress,
|
||||||
handler.data.backHandler!!.endRemoteAddress
|
handler.data.backHandler!!.endRemoteAddress
|
||||||
).await()
|
).await()
|
||||||
|
}
|
||||||
|
|
||||||
val cryptoResponse = CryptoResponse()
|
val cryptoResponse = CryptoResponse()
|
||||||
cryptoResponse.encryptedKey = encryptRsa(backPublicKey, backKey)
|
cryptoResponse.encryptedKey = encryptRsa(backPublicKey, backKey)
|
||||||
|
Loading…
Reference in New Issue
Block a user