package net.minecraft.server; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.net.SocketTimeoutException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class RemoteControlSession extends RemoteConnectionThread { private static final Logger LOGGER = LogManager.getLogger(); private boolean i; private Socket j; private final byte[] k = new byte[1460]; private final String l; RemoteControlSession(IMinecraftServer iminecraftserver, String s, Socket socket) { super(iminecraftserver, "RCON Client"); this.j = socket; try { this.j.setSoTimeout(0); } catch (Exception exception) { this.a = false; } this.l = s; this.b("Rcon connection from: " + socket.getInetAddress()); } public void run() { while (true) { try { if (!this.a) { return; } BufferedInputStream bufferedinputstream = new BufferedInputStream(this.j.getInputStream()); int i = bufferedinputstream.read(this.k, 0, 1460); if (10 > i) { return; } byte b0 = 0; int j = StatusChallengeUtils.b(this.k, 0, i); if (j == i - 4) { int k = b0 + 4; int l = StatusChallengeUtils.b(this.k, k, i); k += 4; int i1 = StatusChallengeUtils.a(this.k, k); k += 4; switch (i1) { case 2: if (this.i) { String s = StatusChallengeUtils.a(this.k, k, i); try { this.a(l, this.b.executeRemoteCommand(s)); } catch (Exception exception) { this.a(l, "Error executing: " + s + " (" + exception.getMessage() + ")"); } continue; } this.f(); continue; case 3: String s1 = StatusChallengeUtils.a(this.k, k, i); int j1 = k + s1.length(); if (!s1.isEmpty() && s1.equals(this.l)) { this.i = true; this.a(l, 2, ""); continue; } this.i = false; this.f(); continue; default: this.a(l, String.format("Unknown request %s", Integer.toHexString(i1))); continue; } } } catch (SocketTimeoutException sockettimeoutexception) { return; } catch (IOException ioexception) { return; } catch (Exception exception1) { RemoteControlSession.LOGGER.error("Exception whilst parsing RCON input", exception1); return; } finally { this.g(); } return; } } private void a(int i, int j, String s) throws IOException { ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream(1248); DataOutputStream dataoutputstream = new DataOutputStream(bytearrayoutputstream); byte[] abyte = s.getBytes("UTF-8"); dataoutputstream.writeInt(Integer.reverseBytes(abyte.length + 10)); dataoutputstream.writeInt(Integer.reverseBytes(i)); dataoutputstream.writeInt(Integer.reverseBytes(j)); dataoutputstream.write(abyte); dataoutputstream.write(0); dataoutputstream.write(0); this.j.getOutputStream().write(bytearrayoutputstream.toByteArray()); } private void f() throws IOException { this.a(-1, 2, ""); } private void a(int i, String s) throws IOException { int j = s.length(); do { int k = 4096 <= j ? 4096 : j; this.a(i, 0, s.substring(0, k)); s = s.substring(k); j = s.length(); } while (0 != j); } @Override public void b() { super.b(); this.g(); } private void g() { if (null != this.j) { try { this.j.close(); } catch (IOException ioexception) { this.c("IO: " + ioexception.getMessage()); } this.j = null; } } }