From b69c415669600361e43065772f182d093d40923e Mon Sep 17 00:00:00 2001 From: Christian Schulz Date: Sat, 9 Aug 2025 16:38:32 +0200 Subject: [PATCH] Fix: Define plugin name for exclusion in INI (#644) Fixes #642 #648 --- .../AssemblyPluginIdentifierAttribute.cs | 46 ++++++++++++++ .../Properties/AssemblyInfo.cs | 2 + .../Properties/AssemblyInfo.cs | 34 ++++++++++ .../Properties/AssemblyInfo.cs | 2 + .../Properties/AssemblyInfo.cs | 34 ++++++++++ .../Properties/AssemblyInfo.cs | 2 + .../Properties/AssemblyInfo.cs | 5 ++ .../Properties/AssemblyInfo.cs | 2 + .../Properties/AssemblyInfo.cs | 34 ++++++++++ .../Properties/AssemblyInfo.cs | 2 + .../Properties/AssemblyInfo.cs | 2 + .../Properties/AssemblyInfo.cs | 25 +++++++- src/Greenshot/Helpers/PluginHelper.cs | 62 ++++++++++++++++--- 13 files changed, 243 insertions(+), 9 deletions(-) create mode 100644 src/Greenshot.Base/Interfaces/Plugin/AssemblyPluginIdentifierAttribute.cs create mode 100644 src/Greenshot.Plugin.Confluence/Properties/AssemblyInfo.cs create mode 100644 src/Greenshot.Plugin.ExternalCommand/Properties/AssemblyInfo.cs create mode 100644 src/Greenshot.Plugin.Jira/Properties/AssemblyInfo.cs diff --git a/src/Greenshot.Base/Interfaces/Plugin/AssemblyPluginIdentifierAttribute.cs b/src/Greenshot.Base/Interfaces/Plugin/AssemblyPluginIdentifierAttribute.cs new file mode 100644 index 000000000..2be14c7a8 --- /dev/null +++ b/src/Greenshot.Base/Interfaces/Plugin/AssemblyPluginIdentifierAttribute.cs @@ -0,0 +1,46 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2025 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System; + +namespace Greenshot.Base.Interfaces.Plugin +{ + /// + /// Attribute to specify a custom plugin identifier at assembly level + /// + [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)] + public class AssemblyPluginIdentifierAttribute : Attribute + { + /// + /// The identifier used for the plugin in configuration + /// + public string Identifier { get; } + + /// + /// Constructor for the plugin identifier attribute + /// + /// The identifier for the plugin in configuration + public AssemblyPluginIdentifierAttribute(string identifier) + { + Identifier = identifier; + } + } +} \ No newline at end of file diff --git a/src/Greenshot.Plugin.Box/Properties/AssemblyInfo.cs b/src/Greenshot.Plugin.Box/Properties/AssemblyInfo.cs index 2ffb6f6fd..0379e4a65 100644 --- a/src/Greenshot.Plugin.Box/Properties/AssemblyInfo.cs +++ b/src/Greenshot.Plugin.Box/Properties/AssemblyInfo.cs @@ -21,11 +21,13 @@ using System.Reflection; using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyDescription("A plugin to upload images to Box")] +[assembly: AssemblyPluginIdentifier("Box Plugin")] // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. diff --git a/src/Greenshot.Plugin.Confluence/Properties/AssemblyInfo.cs b/src/Greenshot.Plugin.Confluence/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..8d2833e17 --- /dev/null +++ b/src/Greenshot.Plugin.Confluence/Properties/AssemblyInfo.cs @@ -0,0 +1,34 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System.Reflection; +using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyDescription("A plugin to upload images to Confluence")] +[assembly: AssemblyPluginIdentifier("Confluence Plugin")] + +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] \ No newline at end of file diff --git a/src/Greenshot.Plugin.Dropbox/Properties/AssemblyInfo.cs b/src/Greenshot.Plugin.Dropbox/Properties/AssemblyInfo.cs index d01359e25..b95b9af6d 100644 --- a/src/Greenshot.Plugin.Dropbox/Properties/AssemblyInfo.cs +++ b/src/Greenshot.Plugin.Dropbox/Properties/AssemblyInfo.cs @@ -21,11 +21,13 @@ using System.Reflection; using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyDescription("A plugin to upload images to Dropbox")] +[assembly: AssemblyPluginIdentifier("Dropbox Plugin")] // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. diff --git a/src/Greenshot.Plugin.ExternalCommand/Properties/AssemblyInfo.cs b/src/Greenshot.Plugin.ExternalCommand/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..acbe80370 --- /dev/null +++ b/src/Greenshot.Plugin.ExternalCommand/Properties/AssemblyInfo.cs @@ -0,0 +1,34 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2025 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System.Reflection; +using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyDescription("A plugin to send screenshots to other applications")] +[assembly: AssemblyPluginIdentifier("External command Plugin")] + +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] \ No newline at end of file diff --git a/src/Greenshot.Plugin.Flickr/Properties/AssemblyInfo.cs b/src/Greenshot.Plugin.Flickr/Properties/AssemblyInfo.cs index 30eafc83e..9701ef654 100644 --- a/src/Greenshot.Plugin.Flickr/Properties/AssemblyInfo.cs +++ b/src/Greenshot.Plugin.Flickr/Properties/AssemblyInfo.cs @@ -21,11 +21,13 @@ using System.Reflection; using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyDescription("A plugin to upload images to Flickr")] +[assembly: AssemblyPluginIdentifier("Flickr Plugin")] // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. diff --git a/src/Greenshot.Plugin.GooglePhotos/Properties/AssemblyInfo.cs b/src/Greenshot.Plugin.GooglePhotos/Properties/AssemblyInfo.cs index a49045818..3ff014500 100644 --- a/src/Greenshot.Plugin.GooglePhotos/Properties/AssemblyInfo.cs +++ b/src/Greenshot.Plugin.GooglePhotos/Properties/AssemblyInfo.cs @@ -21,12 +21,17 @@ using System.Reflection; using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyDescription("A plugin to upload images to GooglePhotos")] +// Still using the old name 'Picasa-Web Plugin' as identifier for backwards compatibility +// TODO: replace plugin identifier with "GooglePhotos Plugin" in the future +[assembly: AssemblyPluginIdentifier("Picasa-Web Plugin")] + // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. [assembly: ComVisible(false)] \ No newline at end of file diff --git a/src/Greenshot.Plugin.Imgur/Properties/AssemblyInfo.cs b/src/Greenshot.Plugin.Imgur/Properties/AssemblyInfo.cs index befa881fd..4f9d4afb5 100644 --- a/src/Greenshot.Plugin.Imgur/Properties/AssemblyInfo.cs +++ b/src/Greenshot.Plugin.Imgur/Properties/AssemblyInfo.cs @@ -21,11 +21,13 @@ using System.Reflection; using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyDescription("A plugin to upload images to Imgur")] +[assembly: AssemblyPluginIdentifier("Imgur Plugin")] // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. diff --git a/src/Greenshot.Plugin.Jira/Properties/AssemblyInfo.cs b/src/Greenshot.Plugin.Jira/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..44f8800ce --- /dev/null +++ b/src/Greenshot.Plugin.Jira/Properties/AssemblyInfo.cs @@ -0,0 +1,34 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2025 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System.Reflection; +using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyDescription("A plugin to upload images to Jira")] +[assembly: AssemblyPluginIdentifier("Jira Plugin")] + +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] \ No newline at end of file diff --git a/src/Greenshot.Plugin.Office/Properties/AssemblyInfo.cs b/src/Greenshot.Plugin.Office/Properties/AssemblyInfo.cs index 9dcc75892..6b14a40f5 100644 --- a/src/Greenshot.Plugin.Office/Properties/AssemblyInfo.cs +++ b/src/Greenshot.Plugin.Office/Properties/AssemblyInfo.cs @@ -21,11 +21,13 @@ using System.Reflection; using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyDescription("A plugin to export images to Office applications")] +[assembly: AssemblyPluginIdentifier("Office Plugin")] // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. diff --git a/src/Greenshot.Plugin.Photobucket/Properties/AssemblyInfo.cs b/src/Greenshot.Plugin.Photobucket/Properties/AssemblyInfo.cs index 783762320..231ca594d 100644 --- a/src/Greenshot.Plugin.Photobucket/Properties/AssemblyInfo.cs +++ b/src/Greenshot.Plugin.Photobucket/Properties/AssemblyInfo.cs @@ -21,12 +21,14 @@ using System.Reflection; using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyDescription("A plugin to upload images to Photobucket")] +[assembly: AssemblyPluginIdentifier("Photobucket Plugin")] // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. diff --git a/src/Greenshot.Plugin.Win10/Properties/AssemblyInfo.cs b/src/Greenshot.Plugin.Win10/Properties/AssemblyInfo.cs index d1b6cbd1b..3f4b5bef2 100644 --- a/src/Greenshot.Plugin.Win10/Properties/AssemblyInfo.cs +++ b/src/Greenshot.Plugin.Win10/Properties/AssemblyInfo.cs @@ -1,10 +1,33 @@ -using System.Reflection; +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2025 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System.Reflection; using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyDescription("A plug-in for Windows 10 only functionality")] +[assembly: AssemblyPluginIdentifier("Win10 Plugin")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from diff --git a/src/Greenshot/Helpers/PluginHelper.cs b/src/Greenshot/Helpers/PluginHelper.cs index 3ed3d97c3..e5724a4f5 100644 --- a/src/Greenshot/Helpers/PluginHelper.cs +++ b/src/Greenshot/Helpers/PluginHelper.cs @@ -219,17 +219,14 @@ namespace Greenshot.Helpers { var assembly = Assembly.LoadFrom(pluginFile); - var assemblyName = assembly.GetName().Name; - - var pluginEntryName = $"{assemblyName}.{assemblyName.Replace("Greenshot.Plugin.", string.Empty)}Plugin"; - var pluginEntryType = assembly.GetType(pluginEntryName, false, true); - - if (CoreConfig.ExcludePlugins != null && CoreConfig.ExcludePlugins.Contains(pluginEntryName)) + if (IsPluginExcludedByConfig(assembly, pluginFile) ) { - Log.WarnFormat("Exclude list: {0}", string.Join(",", CoreConfig.ExcludePlugins)); - Log.WarnFormat("Skipping the excluded plugin {0} with version {1} from {2}", pluginEntryName, assembly.GetName().Version, pluginFile); continue; } + + var assemblyName = assembly.GetName().Name; + var pluginEntryName = $"{assemblyName}.{assemblyName.Replace("Greenshot.Plugin.", string.Empty)}Plugin"; + var pluginEntryType = assembly.GetType(pluginEntryName, false, true); var plugin = (IGreenshotPlugin) Activator.CreateInstance(pluginEntryType); if (plugin != null) @@ -255,5 +252,54 @@ namespace Greenshot.Helpers } } } + /// + /// This method checks the plugin against the configured include and exclude plugin + /// lists. If a plugin is excluded, a warning is logged with details about the exclusion. + /// + private bool IsPluginExcludedByConfig(Assembly assembly, string pluginFile) + { + // Get plugin identifier from assembly attributes + string pluginConfigIdentifier = GetPluginIdentifier(assembly, pluginFile); + + if (CoreConfig.IncludePlugins is { } includePlugins + && includePlugins.Count(p => !string.IsNullOrWhiteSpace(p)) > 0 // ignore empty entries i.e. a whitespace + && !includePlugins.Contains(pluginConfigIdentifier)) + { + Log.WarnFormat("Include plugin list: {0}", string.Join(",", includePlugins)); + Log.WarnFormat("Skipping the not included plugin '{0}' with version {1} from {2}", pluginConfigIdentifier, assembly.GetName().Version, pluginFile); + return true; + } + + if (CoreConfig.ExcludePlugins is { } excludePlugins + && excludePlugins.Contains(pluginConfigIdentifier)) + { + Log.WarnFormat("Exclude plugin list: {0}", string.Join(",", excludePlugins)); + Log.WarnFormat("Skipping the excluded plugin '{0}' with version {1} from {2}", pluginConfigIdentifier, assembly.GetName().Version, pluginFile); + return true; + } + + return false; + } + + /// + /// Retrieves the plugin identifier for the specified assembly. + /// + private string GetPluginIdentifier(Assembly assembly, string pluginFile) + { + // Try to find PluginIdentifierAttribute + var attribute = assembly + .GetCustomAttributes() + .FirstOrDefault(); + + if (!string.IsNullOrEmpty(attribute?.Identifier)) + { + return attribute.Identifier; + } + + // If no attribute found, fall back to the sub namespace + var pluginSubNamespace = assembly.GetName().Name.Replace("Greenshot.Plugin.", string.Empty); + Log.WarnFormat("No '{0}' found in '{1}'. Use plugin namespace '{2}' as fallback.", nameof(AssemblyPluginIdentifierAttribute), pluginFile, pluginSubNamespace); + return pluginSubNamespace; + } } } \ No newline at end of file