diff --git a/src/main/java/net/minecraft/server/RemoteControlSession.java b/src/main/java/net/minecraft/server/RemoteControlSession.java new file mode 100644 index 0000000000..3467220ab5 --- /dev/null +++ b/src/main/java/net/minecraft/server/RemoteControlSession.java @@ -0,0 +1,145 @@ +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; + +public class RemoteControlSession extends RemoteConnectionThread { + + private boolean g = false; + private Socket h; + private byte[] i = new byte[1460]; + private String j; + + RemoteControlSession(IMinecraftServer iminecraftserver, Socket socket) { + super(iminecraftserver); + this.h = socket; + this.j = iminecraftserver.a("rcon.password", ""); + this.info("Rcon connection from: " + socket.getInetAddress()); + } + + public void run() { + while (true) { + try { + if (!this.running) { + return; + } + + try { + BufferedInputStream bufferedinputstream = new BufferedInputStream(this.h.getInputStream()); + int i = bufferedinputstream.read(this.i, 0, 1460); + + if (10 <= i) { + byte b0 = 0; + int j = StatusChallengeUtils.b(this.i, 0, i); + + if (j != i - 4) { + return; + } + + int k = b0 + 4; + int l = StatusChallengeUtils.b(this.i, k, i); + + k += 4; + int i1 = StatusChallengeUtils.a(this.i, k); + + k += 4; + switch (i1) { + case 2: + if (this.g) { + String s = StatusChallengeUtils.a(this.i, k, i); + + try { + this.a(l, this.server.d(s)); + } catch (Exception exception) { + this.a(l, "Error executing: " + s + " (" + exception.getMessage() + ")"); + } + continue; + } + + this.e(); + continue; + + case 3: + String s1 = StatusChallengeUtils.a(this.i, k, i); + int j1 = k + s1.length(); + + if (0 != s1.length() && s1.equals(this.j)) { + this.g = true; + this.a(l, 2, ""); + continue; + } + + this.g = false; + this.e(); + continue; + + default: + this.a(l, String.format("Unknown request %s", new Object[] { Integer.toHexString(i1)})); + continue; + } + } + } catch (SocketTimeoutException sockettimeoutexception) { + continue; + } catch (IOException ioexception) { + if (this.running) { + this.info("IO: " + ioexception.getMessage()); + } + continue; + } + } catch (Exception exception1) { + System.out.println(exception1); + return; + } finally { + this.f(); + } + + return; + } + } + + private void a(int i, int j, String s) { + ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream(1248); + DataOutputStream dataoutputstream = new DataOutputStream(bytearrayoutputstream); + + dataoutputstream.writeInt(Integer.reverseBytes(s.length() + 10)); + dataoutputstream.writeInt(Integer.reverseBytes(i)); + dataoutputstream.writeInt(Integer.reverseBytes(j)); + dataoutputstream.writeBytes(s); + dataoutputstream.write(0); + dataoutputstream.write(0); + this.h.getOutputStream().write(bytearrayoutputstream.toByteArray()); + } + + private void e() { + this.a(-1, 2, ""); + } + + private void a(int i, String s) { + 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); + + } + + private void f() { + if (null != this.h) { + try { + this.h.close(); + } catch (IOException ioexception) { + this.warning("IO: " + ioexception.getMessage()); + } + + this.h = null; + } + } +}