From f507354f845e22308f35eac11a0fb3431a33dfca Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 25 Jan 2018 12:06:28 -0500 Subject: [PATCH] Remove external plugin support Jagex has requested I take steps to prevent users from making plugins which are in violation of the game rules. This limits plugins to the core plugins. --- pom.xml | 2 - .../java/net/runelite/client/RuneLite.java | 4 - .../client/config/RuneLiteConfig.java | 14 - .../client/plugins/PluginManager.java | 8 - .../client/plugins/PluginWatcher.java | 273 ------------------ runelite-plugin-archetype/pom.xml | 86 ------ .../META-INF/maven/archetype-metadata.xml | 13 - .../resources/archetype-resources/pom.xml | 54 ---- .../src/main/java/ExampleOverlay.java | 47 --- .../src/main/java/ExamplePlugin.java | 73 ----- .../main/java/ExamplePluginConfiguration.java | 26 -- .../compilationtest/archetype.properties | 5 - .../projects/compilationtest/goal.txt | 1 - travis/settings.xml | 1 - 14 files changed, 607 deletions(-) delete mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/PluginWatcher.java delete mode 100644 runelite-plugin-archetype/pom.xml delete mode 100644 runelite-plugin-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml delete mode 100644 runelite-plugin-archetype/src/main/resources/archetype-resources/pom.xml delete mode 100644 runelite-plugin-archetype/src/main/resources/archetype-resources/src/main/java/ExampleOverlay.java delete mode 100644 runelite-plugin-archetype/src/main/resources/archetype-resources/src/main/java/ExamplePlugin.java delete mode 100644 runelite-plugin-archetype/src/main/resources/archetype-resources/src/main/java/ExamplePluginConfiguration.java delete mode 100644 runelite-plugin-archetype/src/test/resources/projects/compilationtest/archetype.properties delete mode 100644 runelite-plugin-archetype/src/test/resources/projects/compilationtest/goal.txt diff --git a/pom.xml b/pom.xml index 1e432491a7..9e104f2184 100644 --- a/pom.xml +++ b/pom.xml @@ -42,7 +42,6 @@ true true - true 161 @@ -124,7 +123,6 @@ runescape-client runescape-client-injector runescape-client-injector-plugin - runelite-plugin-archetype http-api http-service protocol-api diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index 7fde52249e..9d942f36bb 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -55,7 +55,6 @@ public class RuneLite { public static final File RUNELITE_DIR = new File(System.getProperty("user.home"), ".runelite"); public static final File PROFILES_DIR = new File(RUNELITE_DIR, "profiles"); - public static final File PLUGIN_DIR = new File(RUNELITE_DIR, "plugins"); public static final File SCREENSHOT_DIR = new File(RUNELITE_DIR, "screenshots"); private static Injector injector; @@ -162,9 +161,6 @@ public class RuneLite // Load the session, including saved configuration sessionManager.loadSession(); - // Begin watching for new plugins - pluginManager.watch(); - SwingUtilities.invokeAndWait(() -> gui.showWithChrome(runeliteConfig.enableCustomChrome())); eventBus.post(new ClientUILoaded()); diff --git a/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java index 08b0188676..bc15f62a42 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java @@ -51,18 +51,4 @@ public interface RuneLiteConfig extends Config { return true; } - - @ConfigItem( - keyName = "enablePlugins", - name = "Enable loading of external plugins", - description = "Enable loading of external plugins", - confirmationWarining = "WARNING: Using untrusted third party plugins is a SECURITY RISK\n" - + " and can result in loss of YOUR ACCOUNT, and compromise the security\n" - + "of your computer. Are you sure you want to do this?", - warnOnEnable = true - ) - default boolean enablePlugins() - { - return false; - } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java index a4b0a0194d..491b173ed9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java @@ -65,9 +65,6 @@ public class PluginManager @Inject Scheduler scheduler; - @Inject - PluginWatcher pluginWatcher; - @Setter boolean isOutdated; @@ -95,11 +92,6 @@ public class PluginManager } } - public void watch() - { - pluginWatcher.start(); - } - List scanAndInstantiate(ClassLoader classLoader, String packageName) throws IOException { boolean developerPlugins = RuneLite.getOptions().has("developer-mode"); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/PluginWatcher.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginWatcher.java deleted file mode 100644 index cea1491dc5..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/PluginWatcher.java +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Copyright (c) 2016-2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins; - -import com.google.inject.Injector; -import com.google.inject.Key; -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URLClassLoader; -import java.nio.file.FileSystems; -import java.nio.file.Path; -import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE; -import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; -import java.nio.file.WatchEvent; -import java.nio.file.WatchEvent.Kind; -import java.nio.file.WatchKey; -import java.nio.file.WatchService; -import java.util.List; -import javax.inject.Inject; -import javax.inject.Singleton; -import lombok.extern.slf4j.Slf4j; -import net.runelite.client.RuneLite; -import net.runelite.client.config.Config; -import net.runelite.client.config.ConfigManager; -import net.runelite.client.config.RuneLiteConfig; - -@Singleton -@Slf4j -public class PluginWatcher extends Thread -{ - private static final File BASE = RuneLite.PLUGIN_DIR; - - private final RuneLiteConfig runeliteConfig; - private final PluginManager pluginManager; - private final WatchService watchService; - private final WatchKey watchKey; - - @Inject - private ConfigManager configManager; - - @Inject - public PluginWatcher(RuneLiteConfig runeliteConfig, PluginManager pluginManager) throws IOException - { - this.runeliteConfig = runeliteConfig; - this.pluginManager = pluginManager; - - setName("Plugin Watcher"); - setDaemon(true); - - watchService = FileSystems.getDefault().newWatchService(); - BASE.mkdirs(); - Path dir = BASE.toPath(); - watchKey = dir.register(watchService, ENTRY_MODIFY, ENTRY_DELETE); - } - - public void cancel() - { - watchKey.cancel(); - } - - @Override - public void run() - { - if (runeliteConfig.enablePlugins()) - { - scan(); - } - - for (;;) - { - try - { - WatchKey key = watchService.take(); - Thread.sleep(50); - - if (!runeliteConfig.enablePlugins()) - { - key.reset(); - continue; - } - - for (WatchEvent event : key.pollEvents()) - { - Kind kind = event.kind(); - Path path = (Path) event.context(); - File file = new File(BASE, path.toFile().getName()); - - log.debug("Event {} file {}", kind, file); - - if (kind == ENTRY_MODIFY) - { - Plugin existing = findPluginForFile(file); - if (existing != null) - { - log.info("Reloading plugin {}", file); - unload(existing); - } - else - { - log.info("Loading plugin {}", file); - } - - load(file); - } - else if (kind == ENTRY_DELETE) - { - Plugin existing = findPluginForFile(file); - if (existing != null) - { - log.info("Unloading plugin {}", file); - - unload(existing); - } - } - } - key.reset(); - - } - catch (InterruptedException ex) - { - log.warn("error polling for plugins", ex); - } - } - } - - private void scan() - { - for (File file : BASE.listFiles()) - { - if (!file.getName().endsWith(".jar")) - { - continue; - } - - log.info("Loading plugin from {}", file); - load(file); - } - } - - private Plugin findPluginForFile(File file) - { - for (Plugin plugin : pluginManager.getPlugins()) - { - if (plugin.file != null && plugin.file.equals(file)) - { - return plugin; - } - } - return null; - } - - private void load(File pluginFile) - { - PluginClassLoader loader; - try - { - loader = new PluginClassLoader(pluginFile, getClass().getClassLoader()); - } - catch (MalformedURLException ex) - { - log.warn("Error loading plugin", ex); - return; - } - - List loadedPlugins; - try - { - loadedPlugins = pluginManager.scanAndInstantiate(loader, null); - } - catch (IOException ex) - { - close(loader); - log.warn("Error loading plugin", ex); - return; - } - - if (loadedPlugins.isEmpty()) - { - close(loader); - log.warn("No plugin found in plugin {}", pluginFile); - return; - } - - if (loadedPlugins.size() != 1) - { - close(loader); - log.warn("You can not have more than one plugin per jar"); - return; - } - - Plugin plugin = loadedPlugins.get(0); - plugin.file = pluginFile; - plugin.loader = loader; - - // Initialize default configuration - Injector injector = plugin.getInjector(); - for (Key key : injector.getAllBindings().keySet()) - { - Class type = key.getTypeLiteral().getRawType(); - if (Config.class.isAssignableFrom(type)) - { - Config config = (Config) injector.getInstance(key); - configManager.setDefaultConfiguration(config); - } - } - - try - { - pluginManager.startPlugin(plugin); - } - catch (PluginInstantiationException ex) - { - close(loader); - log.warn("unable to start plugin", ex); - return; - } - - // Plugin is now running - pluginManager.add(plugin); - } - - private void unload(Plugin plugin) - { - try - { - pluginManager.stopPlugin(plugin); - } - catch (PluginInstantiationException ex) - { - log.warn("unable to stop plugin", ex); - } - - pluginManager.remove(plugin); // remove it regardless - - close(plugin.loader); - } - - private void close(URLClassLoader classLoader) - { - try - { - classLoader.close(); - } - catch (IOException ex1) - { - log.warn(null, ex1); - } - } - -} diff --git a/runelite-plugin-archetype/pom.xml b/runelite-plugin-archetype/pom.xml deleted file mode 100644 index c9d01389c8..0000000000 --- a/runelite-plugin-archetype/pom.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - - 4.0.0 - - - net.runelite - runelite-parent - 1.2.13-SNAPSHOT - - - runelite-plugin-archetype - maven-archetype - RuneLite Plugin Archetype - - - - - - src/main/resources - true - - archetype-resources/pom.xml - - - - src/main/resources - false - - archetype-resources/pom.xml - - - - - - - org.apache.maven.archetype - archetype-packaging - 3.0.1 - - - - - - - maven-archetype-plugin - 3.0.1 - - - org.apache.maven.plugins - maven-resources-plugin - 3.0.2 - - - \ - - - - - - diff --git a/runelite-plugin-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/runelite-plugin-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml deleted file mode 100644 index b67d8cde67..0000000000 --- a/runelite-plugin-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - src/main/java - - **/*.java - - - - diff --git a/runelite-plugin-archetype/src/main/resources/archetype-resources/pom.xml b/runelite-plugin-archetype/src/main/resources/archetype-resources/pom.xml deleted file mode 100644 index 7994fd1f77..0000000000 --- a/runelite-plugin-archetype/src/main/resources/archetype-resources/pom.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - 4.0.0 - \${groupId} - \${artifactId} - \${version} - jar - - - UTF-8 - 1.8 - 1.8 - - - - - runelite - RuneLite - http://repo.runelite.net - - - - - - net.runelite - client - ${project.version} - provided - - - - - - - org.apache.maven.plugins - maven-antrun-plugin - 1.8 - - - install - - - - - - - run - - - - - - - diff --git a/runelite-plugin-archetype/src/main/resources/archetype-resources/src/main/java/ExampleOverlay.java b/runelite-plugin-archetype/src/main/resources/archetype-resources/src/main/java/ExampleOverlay.java deleted file mode 100644 index 6655afd7a1..0000000000 --- a/runelite-plugin-archetype/src/main/resources/archetype-resources/src/main/java/ExampleOverlay.java +++ /dev/null @@ -1,47 +0,0 @@ -#set( $symbol_pound = '#' ) -#set( $symbol_dollar = '$' ) -#set( $symbol_escape = '\' ) -package ${package}; - -import java.awt.Dimension; -import java.awt.Graphics2D; -import javax.annotation.Nullable; -import javax.inject.Inject; -import net.runelite.api.Client; -import net.runelite.api.GameState; -import net.runelite.api.Player; -import net.runelite.api.Point; -import net.runelite.client.ui.overlay.Overlay; -import net.runelite.client.ui.overlay.OverlayPosition; - -public class ExampleOverlay extends Overlay -{ - private final Client client; - private final ExamplePluginConfiguration config; - - @Inject - public ExampleOverlay(@Nullable Client client, ExamplePluginConfiguration config) - { - setPosition(OverlayPosition.DYNAMIC); - this.client = client; - this.config = config; - } - - @Override - public Dimension render(Graphics2D graphics, java.awt.Point parent) - { - if (client.getGameState() != GameState.LOGGED_IN || !config.enabled()) - { - return null; - } - - Player player = client.getLocalPlayer(); - String text = player.getName() + " (Level: " + player.getCombatLevel() + ")"; - - Point textLocation = player.getCanvasTextLocation(graphics, text, player.getModelHeight()); - graphics.drawString(text, textLocation.getX(), textLocation.getY()); - - return null; - } - -} diff --git a/runelite-plugin-archetype/src/main/resources/archetype-resources/src/main/java/ExamplePlugin.java b/runelite-plugin-archetype/src/main/resources/archetype-resources/src/main/java/ExamplePlugin.java deleted file mode 100644 index 2fd573724c..0000000000 --- a/runelite-plugin-archetype/src/main/resources/archetype-resources/src/main/java/ExamplePlugin.java +++ /dev/null @@ -1,73 +0,0 @@ -#set( $symbol_pound = '#' ) -#set( $symbol_dollar = '$' ) -#set( $symbol_escape = '\' ) -package ${package}; - -import com.google.common.eventbus.Subscribe; -import com.google.inject.Binder; -import com.google.inject.Provides; -import javax.inject.Inject; -import net.runelite.api.Client; -import net.runelite.api.GameState; -import net.runelite.api.ChatMessageType; -import net.runelite.api.events.GameStateChanged; -import net.runelite.client.config.ConfigManager; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.ui.overlay.Overlay; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -@PluginDescriptor( - name = "Example plugin" -) -public class ExamplePlugin extends Plugin -{ - private static final Logger logger = LoggerFactory.getLogger(ExamplePlugin.class); - - @Inject - Client client; - - @Inject - ExampleOverlay overlay; - - @Override - protected void startUp() throws Exception - { - logger.info("Example plugin started!"); - } - - @Override - protected void shutDown() throws Exception - { - logger.info("Example plugin stopped!"); - } - - @Subscribe - public void onGameStateChanged(GameStateChanged gameStateChanged) - { - if (gameStateChanged.getGameState() == GameState.LOGGED_IN) - { - client.sendGameMessage(ChatMessageType.GAME, "Example plugin is running!"); - } - } - - @Override - public void configure(Binder binder) - { - binder.bind(ExampleOverlay.class); - } - - @Override - public Overlay getOverlay() - { - return overlay; - } - - @Provides - ExamplePluginConfiguration provideConfig(ConfigManager configManager) - { - return configManager.getConfig(ExamplePluginConfiguration.class); - } - -} diff --git a/runelite-plugin-archetype/src/main/resources/archetype-resources/src/main/java/ExamplePluginConfiguration.java b/runelite-plugin-archetype/src/main/resources/archetype-resources/src/main/java/ExamplePluginConfiguration.java deleted file mode 100644 index 4017349734..0000000000 --- a/runelite-plugin-archetype/src/main/resources/archetype-resources/src/main/java/ExamplePluginConfiguration.java +++ /dev/null @@ -1,26 +0,0 @@ -#set( $symbol_pound = '#' ) -#set( $symbol_dollar = '$' ) -#set( $symbol_escape = '\' ) -package ${package}; - -import net.runelite.client.config.Config; -import net.runelite.client.config.ConfigGroup; -import net.runelite.client.config.ConfigItem; - -@ConfigGroup( - keyName = "exampleplugin", - name = "Example plugin", - description = "Configuration for example plugin" -) -public interface ExamplePluginConfiguration extends Config -{ - @ConfigItem( - keyName = "enabled", - name = "Enable overlay", - description = "Configures whether the overlay is enabled" - ) - default boolean enabled() - { - return true; - } -} diff --git a/runelite-plugin-archetype/src/test/resources/projects/compilationtest/archetype.properties b/runelite-plugin-archetype/src/test/resources/projects/compilationtest/archetype.properties deleted file mode 100644 index ace9df8523..0000000000 --- a/runelite-plugin-archetype/src/test/resources/projects/compilationtest/archetype.properties +++ /dev/null @@ -1,5 +0,0 @@ -sourceEncoding=UTF-8 -groupId=org.example.runelite -artifactId=exampleplugin -version=1.0.0-SNAPSHOT -package=org.example.runelite.exampleplugin \ No newline at end of file diff --git a/runelite-plugin-archetype/src/test/resources/projects/compilationtest/goal.txt b/runelite-plugin-archetype/src/test/resources/projects/compilationtest/goal.txt deleted file mode 100644 index 0b5987362f..0000000000 --- a/runelite-plugin-archetype/src/test/resources/projects/compilationtest/goal.txt +++ /dev/null @@ -1 +0,0 @@ -verify diff --git a/travis/settings.xml b/travis/settings.xml index e9afec7eb3..e4c8b717cb 100644 --- a/travis/settings.xml +++ b/travis/settings.xml @@ -265,7 +265,6 @@ under the License. http://api.runelite.net/manager/text false false - false