From 2380c420893b07f826b40bdaa7030c89ac90c403 Mon Sep 17 00:00:00 2001 From: Haarolean Date: Sat, 10 Feb 2018 19:13:21 +0300 Subject: [PATCH] Added RPC mode without preamble and annoying stuff. --- .../ryanmichela/sshd/ConsoleShellFactory.java | 33 +++++---- .../implementations/SSHDCommandSender.java | 69 +++++++++++++++++++ src/main/resources/config.yml | 3 + 3 files changed, 92 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/ryanmichela/sshd/implementations/SSHDCommandSender.java diff --git a/src/main/java/com/ryanmichela/sshd/ConsoleShellFactory.java b/src/main/java/com/ryanmichela/sshd/ConsoleShellFactory.java index 14533c2..ef9b3c6 100644 --- a/src/main/java/com/ryanmichela/sshd/ConsoleShellFactory.java +++ b/src/main/java/com/ryanmichela/sshd/ConsoleShellFactory.java @@ -1,5 +1,6 @@ package com.ryanmichela.sshd; +import com.ryanmichela.sshd.implementations.SSHDCommandSender; import jline.console.ConsoleReader; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.Logger; @@ -12,9 +13,13 @@ import org.bukkit.Bukkit; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.logging.Level; import java.util.logging.StreamHandler; public class ConsoleShellFactory implements Factory { + + static SSHDCommandSender sshdCommandSender = new SSHDCommandSender(); + public Command get() { return this.create(); } @@ -24,7 +29,6 @@ public class ConsoleShellFactory implements Factory { } public static class ConsoleShell implements Command, Runnable { - private InputStream in; private OutputStream out; private OutputStream err; @@ -33,7 +37,7 @@ public class ConsoleShellFactory implements Factory { private Thread thread; StreamHandlerAppender streamHandlerAppender; - ConsoleReader consoleReader; + public static ConsoleReader consoleReader; public InputStream getIn() { return in; @@ -68,7 +72,6 @@ public class ConsoleShellFactory implements Factory { } public void start(Environment env) throws IOException { - try { consoleReader = new ConsoleReader(in, new FlushyOutputStream(out), new SshTerminal()); consoleReader.setExpandEvents(true); @@ -93,21 +96,25 @@ public class ConsoleShellFactory implements Factory { public void run() { try { - printPreamble(consoleReader); + if (!SshdPlugin.instance.getConfig().getString("mode").equals("RPC")) + printPreamble(consoleReader); while (true) { String command = consoleReader.readLine("\r>", null); - if (command != null) { - if (command.equals("exit")) { - break; - } - SshdPlugin.instance.getLogger().info("<" + environment.getEnv().get(Environment.ENV_USER) + "> " + command); - Bukkit.getScheduler().runTask(SshdPlugin.instance, () -> { + if (command == null) continue; + if (command.equals("exit")) break; + Bukkit.getScheduler().runTask(SshdPlugin.instance, () -> { + if (SshdPlugin.instance.getConfig().getString("mode").equals("RPC") && command.startsWith("rpc")) { + //NO ECHO NO PREAMBLE AND SHIT + String cmd = command.substring("rpc".length() + 1, command.length()); + Bukkit.dispatchCommand(sshdCommandSender, cmd); + } else { + SshdPlugin.instance.getLogger().info("<" + environment.getEnv().get(Environment.ENV_USER) + "> " + command); Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command); - }); - } + } + }); } } catch (IOException e) { - SshdPlugin.instance.getLogger().severe("Error processing command from SSH"); + SshdPlugin.instance.getLogger().log(Level.SEVERE, "Error processing command from SSH", e); } finally { callback.onExit(0); } diff --git a/src/main/java/com/ryanmichela/sshd/implementations/SSHDCommandSender.java b/src/main/java/com/ryanmichela/sshd/implementations/SSHDCommandSender.java new file mode 100644 index 0000000..5f6a570 --- /dev/null +++ b/src/main/java/com/ryanmichela/sshd/implementations/SSHDCommandSender.java @@ -0,0 +1,69 @@ +package com.ryanmichela.sshd.implementations; + +import com.ryanmichela.sshd.ConsoleShellFactory; +import com.ryanmichela.sshd.SshdPlugin; +import org.bukkit.ChatColor; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.conversations.Conversation; +import org.bukkit.conversations.ConversationAbandonedEvent; +import org.bukkit.conversations.ManuallyAbandonedConversationCanceller; +import org.bukkit.craftbukkit.v1_12_R1.command.ServerCommandSender; +import org.bukkit.craftbukkit.v1_12_R1.conversations.ConversationTracker; + +import java.io.IOException; +import java.util.Arrays; +import java.util.logging.Level; + +public class SSHDCommandSender extends ServerCommandSender implements ConsoleCommandSender { + + private final ConversationTracker conversationTracker = new ConversationTracker(); + + public void sendMessage(String message) { + this.sendRawMessage(message); + } + + public void sendRawMessage(String message) { + try { + ConsoleShellFactory.ConsoleShell.consoleReader.println(ChatColor.stripColor(message) + "\r"); + } catch (IOException e) { + SshdPlugin.instance.getLogger().log(Level.SEVERE, "Error sending message to SSHDCommandSender", e); + } + } + + public void sendMessage(String[] messages) { + Arrays.asList(messages).forEach(this::sendMessage); + } + + public String getName() { + return "SSHD CONSOLE"; + } + + public boolean isOp() { + return true; + } + + public void setOp(boolean value) { + throw new UnsupportedOperationException("Cannot change operator status of server console"); + } + + public boolean beginConversation(Conversation conversation) { + return this.conversationTracker.beginConversation(conversation); + } + + public void abandonConversation(Conversation conversation) { + this.conversationTracker.abandonConversation(conversation, new ConversationAbandonedEvent(conversation, new ManuallyAbandonedConversationCanceller())); + } + + public void abandonConversation(Conversation conversation, ConversationAbandonedEvent details) { + this.conversationTracker.abandonConversation(conversation, details); + } + + public void acceptConversationInput(String input) { + this.conversationTracker.acceptConversationInput(input); + } + + public boolean isConversing() { + return this.conversationTracker.isConversing(); + } + +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index bd09d50..6d9b05c 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -4,6 +4,9 @@ listenAddress: all # The port the SSH server will listen on. port: 22 +# Operational mode. Don't touch if you don't know what you're doing. Can be either DEFAULT or RPC +mode: DEFAULT + # By default, only public key authentication is enabled. This is the most secure mode. # To authorize a user to log in with public key authentication, install their public # PEM certificate in the authorized_users directory. Name the key file with user's user