private void printPluginDetails(PluginInfo pluginInfo) { out.println("Plugin details:"); out.println("- ID: " + pluginInfo.getPluginId()); out.println("- Name: " + pluginInfo.getPluginName()); out.println("- Version: " + pluginInfo.getPluginVersion()); out.println(); }
private PluginInfo readPluginInfoFromJar(File pluginJarFile) throws Exception { try (JarInputStream jarStream = new JarInputStream(new FileInputStream(pluginJarFile))) { Manifest jarManifest = jarStream.getManifest(); if (jarManifest == null) { throw new Exception("Given file is not a valid Syncany plugin file (not a JAR file, or no manifest)."); } String pluginId = jarManifest.getMainAttributes().getValue("Plugin-Id"); if (pluginId == null) { throw new Exception("Given file is not a valid Syncany plugin file (no plugin ID in manifest)."); } PluginInfo pluginInfo = new PluginInfo(); pluginInfo.setPluginId(pluginId); pluginInfo.setPluginName(jarManifest.getMainAttributes().getValue("Plugin-Name")); pluginInfo.setPluginVersion(jarManifest.getMainAttributes().getValue("Plugin-Version")); pluginInfo.setPluginDate(jarManifest.getMainAttributes().getValue("Plugin-Date")); pluginInfo.setPluginAppMinVersion(jarManifest.getMainAttributes().getValue("Plugin-App-Min-Version")); pluginInfo.setPluginRelease(Boolean.parseBoolean(jarManifest.getMainAttributes().getValue("Plugin-Release"))); if (jarManifest.getMainAttributes().getValue("Plugin-Conflicts-With") != null) { pluginInfo.setConflictingPluginIds(Arrays.asList(jarManifest.getMainAttributes().getValue("Plugin-Conflicts-With"))); } return pluginInfo; } }
private File installPlugin(File pluginJarFile, PluginInfo pluginInfo) throws IOException { File globalUserPluginDir = UserConfig.getUserPluginLibDir(); globalUserPluginDir.mkdirs(); File targetPluginJarFile = new File(globalUserPluginDir, String.format("syncany-plugin-%s-%s.jar", pluginInfo.getPluginId(), pluginInfo.getPluginVersion())); logger.log(Level.INFO, "Installing plugin from " + pluginJarFile + " to " + targetPluginJarFile + " ..."); FileUtils.copyFile(pluginJarFile, targetPluginJarFile); return targetPluginJarFile; }
private List<PluginInfo> getLocalList() { List<PluginInfo> localPluginInfos = new ArrayList<PluginInfo>(); for (Plugin plugin : Plugins.list()) { PluginInfo pluginInfo = new PluginInfo(); pluginInfo.setPluginId(plugin.getId()); pluginInfo.setPluginName(plugin.getName()); pluginInfo.setPluginVersion(plugin.getVersion()); localPluginInfos.add(pluginInfo); } return localPluginInfos; }
PluginInfo pluginInfo = (extPluginInfo.isInstalled()) ? extPluginInfo.getLocalPluginInfo() : extPluginInfo.getRemotePluginInfo(); String localVersionStr = (extPluginInfo.isInstalled()) ? extPluginInfo.getLocalPluginInfo().getPluginVersion() : ""; String installedStr = extPluginInfo.isInstalled() ? (extPluginInfo.canUninstall() ? "User" : "Global") : ""; String remoteVersionStr = (extPluginInfo.isRemoteAvailable()) ? extPluginInfo.getRemotePluginInfo().getPluginVersion() : ""; String thirdPartyStr = (pluginInfo.isPluginThirdParty()) ? "Third Party" : "Syncany Team"; String updatableStr = ""; if (pluginInfo.isPluginThirdParty()) { thirdPartyCount++; tableValues.add(new String[]{pluginInfo.getPluginId(), pluginInfo.getPluginName(), localVersionStr, installedStr, remoteVersionStr, updatableStr, thirdPartyStr});
if (options.getPluginId() != null && !localPluginInfo.getPluginId().equals(options.getPluginId())) { continue; Plugin plugin = Plugins.get(localPluginInfo.getPluginId()); File pluginJarFile = getJarFile(plugin); boolean canUninstall = canUninstall(pluginJarFile); pluginInfos.put(localPluginInfo.getPluginId(), extendedPluginInfo); if (options.getPluginId() != null && !remotePluginInfo.getPluginId().equals(options.getPluginId())) { continue; ExtendedPluginInfo extendedPluginInfo = pluginInfos.get(remotePluginInfo.getPluginId()); boolean localPluginInstalled = extendedPluginInfo != null; extendedPluginInfo.setRemoteAvailable(true); Version localVersion = Version.valueOf(extendedPluginInfo.getLocalPluginInfo().getPluginVersion()); Version remoteVersion = Version.valueOf(remotePluginInfo.getPluginVersion()); Version remoteMinAppVersion = Version.valueOf(remotePluginInfo.getPluginAppMinVersion()); pluginInfos.put(remotePluginInfo.getPluginId(), extendedPluginInfo);
@Override public String apply(ExtendedPluginInfo pluginInfo) { return pluginInfo.getLocalPluginInfo().getPluginId(); } });
private void checkPluginCompatibility(PluginInfo pluginInfo) throws Exception { Version applicationVersion = Version.valueOf(Client.getApplicationVersion()); Version pluginAppMinVersion = Version.valueOf(pluginInfo.getPluginAppMinVersion()); logger.log(Level.INFO, "Checking plugin compatibility:"); logger.log(Level.INFO, "- Application version: " + Client.getApplicationVersion() + "(" + applicationVersion + ")"); logger.log(Level.INFO, "- Plugin min. application version: " + pluginInfo.getPluginAppMinVersion() + "(" + pluginAppMinVersion + ")"); if (applicationVersion.lessThan(pluginAppMinVersion)) { throw new Exception("Plugin is incompatible to this application version. Plugin min. application version is " + pluginInfo.getPluginAppMinVersion() + ", current application version is " + Client.getApplicationVersion()); } // Verify if any conflicting plugins are installed logger.log(Level.INFO, "Checking for conflicting plugins."); List<String> conflictingIds = pluginInfo.getConflictingPluginIds(); List<String> conflictingInstalledIds = new ArrayList<String>(); if (conflictingIds != null) { for (String pluginId : conflictingIds) { Plugin plugin = Plugins.get(pluginId); if (plugin != null) { logger.log(Level.INFO, "- Conflicting plugin " + pluginId + " found."); conflictingInstalledIds.add(pluginId); } logger.log(Level.FINE, "- Conflicting plugin " + pluginId + " not installed"); } } result.setConflictingPlugins(conflictingInstalledIds); }
private PluginOperationResult executeInstallFromApiHost(String pluginId) throws Exception { checkPluginNotInstalled(pluginId); PluginInfo pluginInfo = getRemotePluginInfo(pluginId); if (pluginInfo == null) { throw new Exception("Plugin with ID '" + pluginId + "' not found"); } checkPluginCompatibility(pluginInfo); eventBus.post(new PluginInstallExternalEvent(pluginInfo.getDownloadUrl())); File tempPluginJarFile = downloadPluginJar(pluginInfo.getDownloadUrl()); String expectedChecksum = pluginInfo.getSha256sum(); String actualChecksum = calculateChecksum(tempPluginJarFile); if (expectedChecksum == null || !expectedChecksum.equals(actualChecksum)) { throw new Exception("Checksum mismatch. Expected: " + expectedChecksum + ", but was: " + actualChecksum); } logger.log(Level.INFO, "Plugin JAR checksum verified: " + actualChecksum); File targetPluginJarFile = installPlugin(tempPluginJarFile, pluginInfo); result.setSourcePluginPath(pluginInfo.getDownloadUrl()); result.setTargetPluginPath(targetPluginJarFile.getAbsolutePath()); result.setAffectedPluginInfo(pluginInfo); result.setResultCode(PluginResultCode.OK); return result; }
private PluginOperationResult executeInstallFromLocalFile(File pluginJarFile) throws Exception { eventBus.post(new PluginInstallExternalEvent(pluginJarFile.getAbsolutePath())); PluginInfo pluginInfo = readPluginInfoFromJar(pluginJarFile); checkPluginNotInstalled(pluginInfo.getPluginId()); checkPluginCompatibility(pluginInfo); File targetPluginJarFile = installPlugin(pluginJarFile, pluginInfo); result.setSourcePluginPath(pluginJarFile.getPath()); result.setTargetPluginPath(targetPluginJarFile.getPath()); result.setAffectedPluginInfo(pluginInfo); result.setResultCode(PluginResultCode.OK); return result; }
private PluginOperationResult executeInstallFromUrl(String downloadJarUrl) throws Exception { eventBus.post(new PluginInstallExternalEvent(downloadJarUrl)); File tempPluginJarFile = downloadPluginJar(downloadJarUrl); PluginInfo pluginInfo = readPluginInfoFromJar(tempPluginJarFile); checkPluginNotInstalled(pluginInfo.getPluginId()); checkPluginCompatibility(pluginInfo); File targetPluginJarFile = installPlugin(tempPluginJarFile, pluginInfo); result.setSourcePluginPath(downloadJarUrl); result.setTargetPluginPath(targetPluginJarFile.getPath()); result.setAffectedPluginInfo(pluginInfo); result.setResultCode(PluginResultCode.OK); return result; }
private void printPluginConflictWarning(PluginOperationResult operationResult) { List<String> conflictingPluginIds = operationResult.getConflictingPluginIds(); if (conflictingPluginIds != null && conflictingPluginIds.size() > 0) { out.println("---------------------------------------------------------------------------"); out.printf(" WARNING: The installed plugin '%s' conflicts with other installed:\n", operationResult.getAffectedPluginInfo().getPluginId()); out.printf(" plugin(s): %s\n", StringUtil.join(conflictingPluginIds, ", ")); out.println(); out.println(" If you'd like to use these plugins in the daemon, it is VERY likely"); out.println(" that parts of the application WILL CRASH. Data corruption might occur!"); out.println(); out.println(" Using the plugins outside of the daemon (sy <command> ...) might also"); out.println(" be an issue. Details about this in issue #154."); out.println("---------------------------------------------------------------------------"); out.println(); } }