You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SecurePluginManagerWrapper.java 9.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. package org.pf4j;
  2. import java.nio.file.Path;
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.Collections;
  6. import java.util.List;
  7. import java.util.Set;
  8. import java.util.stream.Collectors;
  9. /**
  10. * Use this class to wrap the original plugin manager to prevent full access from within plugins.
  11. * Override AbstractPluginManager.createPluginWrapper to use this class.
  12. * @deprecated Use application custom {@code PluginContext} instead of {@code PluginWrapper} to communicate with {@link Plugin}.
  13. * See demo for more details.
  14. *
  15. * @author Wolfram Haussig
  16. */
  17. @Deprecated()
  18. public class SecurePluginManagerWrapper implements PluginManager {
  19. private static final String PLUGIN_PREFIX = "Plugin ";
  20. /**
  21. * the current plugin
  22. */
  23. private String currentPluginId;
  24. /**
  25. * the original plugin manager
  26. */
  27. private PluginManager original;
  28. /**
  29. * The registered {@link PluginStateListener}s.
  30. */
  31. protected List<PluginStateListener> pluginStateListeners = new ArrayList<>();
  32. /**
  33. * wrapper for pluginStateListeners
  34. */
  35. private PluginStateListenerWrapper listenerWrapper = new PluginStateListenerWrapper();
  36. /**
  37. * constructor
  38. * @param original the original plugin manager
  39. * @param currentPluginId the current pluginId
  40. */
  41. public SecurePluginManagerWrapper(PluginManager original, String currentPluginId) {
  42. this.original = original;
  43. this.currentPluginId = currentPluginId;
  44. }
  45. @Override
  46. public boolean isDevelopment() {
  47. return original.isDevelopment();
  48. }
  49. @Override
  50. public boolean isNotDevelopment() {
  51. return original.isNotDevelopment();
  52. }
  53. @Override
  54. public List<PluginWrapper> getPlugins() {
  55. return Arrays.asList(getPlugin(currentPluginId));
  56. }
  57. @Override
  58. public List<PluginWrapper> getPlugins(PluginState pluginState) {
  59. return getPlugins().stream().filter(p -> p.getPluginState() == pluginState).collect(Collectors.toList());
  60. }
  61. @Override
  62. public List<PluginWrapper> getResolvedPlugins() {
  63. return getPlugins().stream().filter(p -> p.getPluginState().ordinal() >= PluginState.RESOLVED.ordinal()).collect(Collectors.toList());
  64. }
  65. @Override
  66. public List<PluginWrapper> getUnresolvedPlugins() {
  67. return Collections.emptyList();
  68. }
  69. @Override
  70. public List<PluginWrapper> getStartedPlugins() {
  71. return getPlugins(PluginState.STARTED);
  72. }
  73. @Override
  74. public PluginWrapper getPlugin(String pluginId) {
  75. if (currentPluginId.equals(pluginId)) {
  76. return original.getPlugin(pluginId);
  77. } else {
  78. throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getPlugin for foreign pluginId!");
  79. }
  80. }
  81. @Override
  82. public void loadPlugins() {
  83. throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute loadPlugins!");
  84. }
  85. @Override
  86. public String loadPlugin(Path pluginPath) {
  87. throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute loadPlugin!");
  88. }
  89. @Override
  90. public void startPlugins() {
  91. throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute startPlugins!");
  92. }
  93. @Override
  94. public PluginState startPlugin(String pluginId) {
  95. throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute startPlugin!");
  96. }
  97. @Override
  98. public void stopPlugins() {
  99. throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute stopPlugins!");
  100. }
  101. @Override
  102. public PluginState stopPlugin(String pluginId) {
  103. if (currentPluginId.equals(pluginId)) {
  104. return original.stopPlugin(pluginId);
  105. } else {
  106. throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute stopPlugin for foreign pluginId!");
  107. }
  108. }
  109. @Override
  110. public void unloadPlugins() {
  111. throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute unloadPlugins!");
  112. }
  113. @Override
  114. public boolean unloadPlugin(String pluginId) {
  115. if (currentPluginId.equals(pluginId)) {
  116. return original.unloadPlugin(pluginId);
  117. } else {
  118. throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute unloadPlugin for foreign pluginId!");
  119. }
  120. }
  121. @Override
  122. public boolean disablePlugin(String pluginId) {
  123. if (currentPluginId.equals(pluginId)) {
  124. return original.disablePlugin(pluginId);
  125. } else {
  126. throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute disablePlugin for foreign pluginId!");
  127. }
  128. }
  129. @Override
  130. public boolean enablePlugin(String pluginId) {
  131. throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute enablePlugin!");
  132. }
  133. @Override
  134. public boolean deletePlugin(String pluginId) {
  135. if (currentPluginId.equals(pluginId)) {
  136. return original.deletePlugin(pluginId);
  137. } else {
  138. throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute deletePlugin for foreign pluginId!");
  139. }
  140. }
  141. @Override
  142. public ClassLoader getPluginClassLoader(String pluginId) {
  143. if (currentPluginId.equals(pluginId)) {
  144. return original.getPluginClassLoader(pluginId);
  145. } else {
  146. throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getPluginClassLoader for foreign pluginId!");
  147. }
  148. }
  149. @Override
  150. public List<Class<?>> getExtensionClasses(String pluginId) {
  151. if (currentPluginId.equals(pluginId)) {
  152. return original.getExtensionClasses(pluginId);
  153. } else {
  154. throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getExtensionClasses for foreign pluginId!");
  155. }
  156. }
  157. @Override
  158. public <T> List<Class<? extends T>> getExtensionClasses(Class<T> type) {
  159. return getExtensionClasses(type, currentPluginId);
  160. }
  161. @Override
  162. public <T> List<Class<? extends T>> getExtensionClasses(Class<T> type, String pluginId) {
  163. if (currentPluginId.equals(pluginId)) {
  164. return original.getExtensionClasses(type, pluginId);
  165. } else {
  166. throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getExtensionClasses for foreign pluginId!");
  167. }
  168. }
  169. @Override
  170. public <T> List<T> getExtensions(Class<T> type) {
  171. return getExtensions(type, currentPluginId);
  172. }
  173. @Override
  174. public <T> List<T> getExtensions(Class<T> type, String pluginId) {
  175. if (currentPluginId.equals(pluginId)) {
  176. return original.getExtensions(type, pluginId);
  177. } else {
  178. throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getExtensions for foreign pluginId!");
  179. }
  180. }
  181. @Override
  182. public List<?> getExtensions(String pluginId) {
  183. if (currentPluginId.equals(pluginId)) {
  184. return original.getExtensions(pluginId);
  185. } else {
  186. throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getExtensions for foreign pluginId!");
  187. }
  188. }
  189. @Override
  190. public Set<String> getExtensionClassNames(String pluginId) {
  191. if (currentPluginId.equals(pluginId)) {
  192. return original.getExtensionClassNames(pluginId);
  193. } else {
  194. throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getExtensionClassNames for foreign pluginId!");
  195. }
  196. }
  197. @Override
  198. public ExtensionFactory getExtensionFactory() {
  199. return original.getExtensionFactory();
  200. }
  201. @Override
  202. public RuntimeMode getRuntimeMode() {
  203. return original.getRuntimeMode();
  204. }
  205. @Override
  206. public PluginWrapper whichPlugin(Class<?> clazz) {
  207. ClassLoader classLoader = clazz.getClassLoader();
  208. PluginWrapper plugin = getPlugin(currentPluginId);
  209. if (plugin.getPluginClassLoader() == classLoader) {
  210. return plugin;
  211. }
  212. return null;
  213. }
  214. @Override
  215. public void addPluginStateListener(PluginStateListener listener) {
  216. if (pluginStateListeners.isEmpty()) {
  217. this.original.addPluginStateListener(listenerWrapper);
  218. }
  219. pluginStateListeners.add(listener);
  220. }
  221. @Override
  222. public void removePluginStateListener(PluginStateListener listener) {
  223. pluginStateListeners.remove(listener);
  224. if (pluginStateListeners.isEmpty()) {
  225. this.original.removePluginStateListener(listenerWrapper);
  226. }
  227. }
  228. @Override
  229. public void setSystemVersion(String version) {
  230. throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute setSystemVersion!");
  231. }
  232. @Override
  233. public String getSystemVersion() {
  234. return original.getSystemVersion();
  235. }
  236. @Override
  237. public Path getPluginsRoot() {
  238. throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getPluginsRoot!");
  239. }
  240. @Override
  241. public List<Path> getPluginsRoots() {
  242. throw new IllegalAccessError(PLUGIN_PREFIX + currentPluginId + " tried to execute getPluginsRoots!");
  243. }
  244. @Override
  245. public VersionManager getVersionManager() {
  246. return original.getVersionManager();
  247. }
  248. /**
  249. * Wrapper for PluginStateListener events. will only propagate events if they match the current pluginId
  250. * @author Wolfram Haussig
  251. *
  252. */
  253. private class PluginStateListenerWrapper implements PluginStateListener {
  254. @Override
  255. public void pluginStateChanged(PluginStateEvent event) {
  256. if (event.getPlugin().getPluginId().equals(currentPluginId)) {
  257. for (PluginStateListener listener : pluginStateListeners) {
  258. listener.pluginStateChanged(event);
  259. }
  260. }
  261. }
  262. }
  263. }