diff --git a/.gitignore b/.gitignore index 847e1e6..cb993b4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # intellji idea /.idea +*.iml # java stuff diff --git a/pom.xml b/pom.xml index 229c9e9..56114f1 100644 --- a/pom.xml +++ b/pom.xml @@ -4,8 +4,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - net.glomc.networking - SpigotNebulaVpn + net.limework.networking + AppleTunneler 1.0-SNAPSHOT @@ -13,4 +13,58 @@ 17 + + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.3.1-SNAPSHOT + + false + + + + package + + shade + + + + + + + + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + + + + com.github.mwiede + jsch + 0.1.72 + + + + org.spigotmc + spigot-api + 1.18.1-R0.1-SNAPSHOT + provided + + \ No newline at end of file diff --git a/src/main/java/net/limework/networking/AppleTunneler.java b/src/main/java/net/limework/networking/AppleTunneler.java new file mode 100644 index 0000000..f009f2a --- /dev/null +++ b/src/main/java/net/limework/networking/AppleTunneler.java @@ -0,0 +1,109 @@ +package net.limework.networking; + +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.JSchException; +import com.jcraft.jsch.Session; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitRunnable; + +import java.io.File; + +public class AppleTunneler extends JavaPlugin { + + private Session sshSession; + private final JSch jsch = new JSch(); + + private synchronized void createNewConnection() throws JSchException { + if (sshSession != null) { + sshSession.disconnect(); + } + java.util.Properties config = new java.util.Properties(); + config.put("StrictHostKeyChecking", "no"); + sshSession = jsch.getSession(getUsername(), getHost(), getPort()); + sshSession.setConfig(config); + sshSession.connect(2000); + loadRemoteToLocalPortForwarding(); + } + + private void connectionFailedLog(JSchException exception) { + getLogger().severe("=========================="); + getLogger().severe("failed to start a connection"); + exception.printStackTrace(); + getLogger().severe("=========================="); + + } + + private void loadIds() throws JSchException { + File file = new File(getDataFolder(), "Identities"); + if (file.mkdir()) { + getLogger().info("created Identities folder."); + } + File[] files = file.listFiles(); + + if (files == null) { + return; + } + if (files.length == 0) { + getLogger().warning("no Identities files found, please put them in " + file.getPath()); + throw new RuntimeException("no Identities files found"); + } + for (File id : files) { + jsch.addIdentity(id.getPath()); + } + } + + private void loadRemoteToLocalPortForwarding() throws JSchException { + for (String line : getConfig().getStringList("ports")) { + String[] array = line.split(":"); + sshSession.setPortForwardingL(Integer.parseInt(array[0]), array[1], Integer.parseInt(array[2])); + } + } + + @Override + public void onEnable() { + this.saveDefaultConfig(); + try { + loadIds(); + } catch (JSchException e) { + throw new RuntimeException(e); + } + try { + createNewConnection(); + } catch (JSchException e) { + connectionFailedLog(e); + } + new BukkitRunnable() { + private boolean isConnecting = false; + + @Override + public void run() { + if (isConnecting) { + return; + } + if (!sshSession.isConnected()) { + isConnecting = true; + try { + createNewConnection(); + } catch (JSchException e) { + connectionFailedLog(e); + } + isConnecting = false; + } + } + }.runTaskTimerAsynchronously(this, 0, 20); + + } + + private int getPort() { + return this.getConfig().getInt("port"); + } + + private String getUsername() { + return this.getConfig().getString("username"); + } + + private String getHost() { + return this.getConfig().getString("host"); + } + +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..e23d751 --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,13 @@ +# welcome to the config of ${project.artifactId} + +# username for ssh +username: apple +# host eg: domains can be used. +host: 192.168.0.100 +# port +port: 22 + +# Syntax is "local-port:remote-host:remote-port" +ports: + - "25565:127.0.0.1:25565" + diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..a2c0f50 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,4 @@ +main: net.limework.networking.AppleTunneler +version: ${project.version} +name: ${project.artifactId} +api-version: 1.13 \ No newline at end of file