FxCopAnalyzer fixes for Wox.Core (#7209)

* FxCop Fixes- added InvarientCulture info, suppressed warnings for general exception types

* Used IsNullOrEmpty to test for empty strings (CA1820: Test for empty strings using string length)

* Check if arguments are null and throw ArgumentNullException

* Removed unused function argument from PluginsLoader.cs

* Addressing comments- Using attributes to suppress errors for general exception types

* Addressing comments- Using attributes to suppress errors

* Addressed comments and changed InvariantCulture to CurrentCulture/Ordinal where appropriate

* Addressing comments - catching and logging specific exception in FontHelper.cs
This commit is contained in:
Avneet Kaur
2020-10-19 15:46:56 -07:00
committed by GitHub
parent 0aae535986
commit 8b759094f7
6 changed files with 80 additions and 23 deletions

View File

@@ -32,6 +32,7 @@ namespace Wox.Core.Plugin
return PluginMetadatas; return PluginMetadatas;
} }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "All exception information is being logged")]
private static void ParsePluginConfigs(IEnumerable<string> directories) private static void ParsePluginConfigs(IEnumerable<string> directories)
{ {
// todo use linq when diable plugin is implemented since parallel.foreach + list is not thread saft // todo use linq when diable plugin is implemented since parallel.foreach + list is not thread saft
@@ -59,6 +60,7 @@ namespace Wox.Core.Plugin
} }
} }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "All exception information is being logged")]
private static PluginMetadata GetPluginMetadata(string pluginDirectory) private static PluginMetadata GetPluginMetadata(string pluginDirectory)
{ {
string configPath = Path.Combine(pluginDirectory, PluginConfigName); string configPath = Path.Combine(pluginDirectory, PluginConfigName);

View File

@@ -41,15 +41,16 @@ namespace Wox.Core.Plugin
string pluginFolderPath = Infrastructure.Constant.PluginsDirectory; string pluginFolderPath = Infrastructure.Constant.PluginsDirectory;
// Using Ordinal since this is part of a path
string newPluginName = plugin.Name string newPluginName = plugin.Name
.Replace("/", "_") .Replace("/", "_", StringComparison.Ordinal)
.Replace("\\", "_") .Replace("\\", "_", StringComparison.Ordinal)
.Replace(":", "_") .Replace(":", "_", StringComparison.Ordinal)
.Replace("<", "_") .Replace("<", "_", StringComparison.Ordinal)
.Replace(">", "_") .Replace(">", "_", StringComparison.Ordinal)
.Replace("?", "_") .Replace("?", "_", StringComparison.Ordinal)
.Replace("*", "_") .Replace("*", "_", StringComparison.Ordinal)
.Replace("|", "_") .Replace("|", "_", StringComparison.Ordinal)
+ "-" + Guid.NewGuid(); + "-" + Guid.NewGuid();
string newPluginPath = Path.Combine(pluginFolderPath, newPluginName); string newPluginPath = Path.Combine(pluginFolderPath, newPluginName);
string content = $"Do you want to install following plugin?{Environment.NewLine}{Environment.NewLine}" + string content = $"Do you want to install following plugin?{Environment.NewLine}{Environment.NewLine}" +
@@ -157,12 +158,13 @@ namespace Wox.Core.Plugin
/// <param name="overWrite">overwrite</param> /// <param name="overWrite">overwrite</param>
private static void UnZip(string zippedFile, string strDirectory, bool overWrite) private static void UnZip(string zippedFile, string strDirectory, bool overWrite)
{ {
if (strDirectory == string.Empty) if (string.IsNullOrEmpty(strDirectory))
{ {
strDirectory = Directory.GetCurrentDirectory(); strDirectory = Directory.GetCurrentDirectory();
} }
if (!strDirectory.EndsWith("\\")) // Using Ordinal since this is a path
if (!strDirectory.EndsWith("\\", StringComparison.Ordinal))
{ {
strDirectory += "\\"; strDirectory += "\\";
} }
@@ -177,7 +179,7 @@ namespace Wox.Core.Plugin
string pathToZip = string.Empty; string pathToZip = string.Empty;
pathToZip = theEntry.Name; pathToZip = theEntry.Name;
if (pathToZip != string.Empty) if (!string.IsNullOrEmpty(pathToZip))
{ {
directoryName = Path.GetDirectoryName(pathToZip) + "\\"; directoryName = Path.GetDirectoryName(pathToZip) + "\\";
} }
@@ -186,7 +188,7 @@ namespace Wox.Core.Plugin
Directory.CreateDirectory(strDirectory + directoryName); Directory.CreateDirectory(strDirectory + directoryName);
if (fileName != string.Empty) if (!string.IsNullOrEmpty(fileName))
{ {
if ((File.Exists(strDirectory + directoryName + fileName) && overWrite) || (!File.Exists(strDirectory + directoryName + fileName))) if ((File.Exists(strDirectory + directoryName + fileName) && overWrite) || (!File.Exists(strDirectory + directoryName + fileName)))
{ {

View File

@@ -5,6 +5,7 @@
using System; using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
@@ -79,17 +80,18 @@ namespace Wox.Core.Plugin
public static void LoadPlugins(PluginSettings settings) public static void LoadPlugins(PluginSettings settings)
{ {
_metadatas = PluginConfig.Parse(Directories); _metadatas = PluginConfig.Parse(Directories);
Settings = settings; Settings = settings ?? throw new ArgumentNullException(nameof(settings));
Settings.UpdatePluginSettings(_metadatas); Settings.UpdatePluginSettings(_metadatas);
AllPlugins = PluginsLoader.Plugins(_metadatas, Settings); AllPlugins = PluginsLoader.Plugins(_metadatas);
} }
/// <summary> /// <summary>
/// Call initialize for all plugins /// Call initialize for all plugins
/// </summary> /// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "All exception information is being logged")]
public static void InitializePlugins(IPublicAPI api) public static void InitializePlugins(IPublicAPI api)
{ {
API = api; API = api ?? throw new ArgumentNullException(nameof(api));
var failedPlugins = new ConcurrentQueue<PluginPair>(); var failedPlugins = new ConcurrentQueue<PluginPair>();
Parallel.ForEach(AllPlugins, pair => Parallel.ForEach(AllPlugins, pair =>
{ {
@@ -142,6 +144,11 @@ namespace Wox.Core.Plugin
public static List<PluginPair> ValidPluginsForQuery(Query query) public static List<PluginPair> ValidPluginsForQuery(Query query)
{ {
if (query == null)
{
throw new ArgumentNullException(nameof(query));
}
if (NonGlobalPlugins.ContainsKey(query.ActionKeyword)) if (NonGlobalPlugins.ContainsKey(query.ActionKeyword))
{ {
var plugin = NonGlobalPlugins[query.ActionKeyword]; var plugin = NonGlobalPlugins[query.ActionKeyword];
@@ -153,8 +160,14 @@ namespace Wox.Core.Plugin
} }
} }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "All exception information is being logged")]
public static List<Result> QueryForPlugin(PluginPair pair, Query query, bool delayedExecution = false) public static List<Result> QueryForPlugin(PluginPair pair, Query query, bool delayedExecution = false)
{ {
if (pair == null)
{
throw new ArgumentNullException(nameof(pair));
}
try try
{ {
List<Result> results = null; List<Result> results = null;
@@ -201,7 +214,8 @@ namespace Wox.Core.Plugin
if (!string.IsNullOrEmpty(query.ActionKeyword)) if (!string.IsNullOrEmpty(query.ActionKeyword))
{ {
result.QueryTextDisplay = string.Format("{0} {1}", query.ActionKeyword, result.QueryTextDisplay); // Using CurrentCulture since this is user facing
result.QueryTextDisplay = string.Format(CultureInfo.CurrentCulture, "{0} {1}", query.ActionKeyword, result.QueryTextDisplay);
} }
} }
@@ -210,6 +224,16 @@ namespace Wox.Core.Plugin
public static void UpdatePluginMetadata(List<Result> results, PluginMetadata metadata, Query query) public static void UpdatePluginMetadata(List<Result> results, PluginMetadata metadata, Query query)
{ {
if (results == null)
{
throw new ArgumentNullException(nameof(results));
}
if (metadata == null)
{
throw new ArgumentNullException(nameof(metadata));
}
foreach (var r in results) foreach (var r in results)
{ {
r.PluginDirectory = metadata.PluginDirectory; r.PluginDirectory = metadata.PluginDirectory;
@@ -239,6 +263,7 @@ namespace Wox.Core.Plugin
return AllPlugins.Where(p => p.Plugin is T); return AllPlugins.Where(p => p.Plugin is T);
} }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "All exception information is being logged")]
public static List<ContextMenuResult> GetContextMenusForPlugin(Result result) public static List<ContextMenuResult> GetContextMenusForPlugin(Result result)
{ {
var pluginPair = _contextMenuPlugins.FirstOrDefault(o => o.Metadata.ID == result.PluginID); var pluginPair = _contextMenuPlugins.FirstOrDefault(o => o.Metadata.ID == result.PluginID);

View File

@@ -17,7 +17,7 @@ namespace Wox.Core.Plugin
{ {
public const string PATH = "PATH"; public const string PATH = "PATH";
public static List<PluginPair> Plugins(List<PluginMetadata> metadatas, PluginSettings settings) public static List<PluginPair> Plugins(List<PluginMetadata> metadatas)
{ {
var csharpPlugins = CSharpPlugins(metadatas).ToList(); var csharpPlugins = CSharpPlugins(metadatas).ToList();
var executablePlugins = ExecutablePlugins(metadatas); var executablePlugins = ExecutablePlugins(metadatas);
@@ -25,10 +25,11 @@ namespace Wox.Core.Plugin
return plugins; return plugins;
} }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "All exception information is being logged")]
public static IEnumerable<PluginPair> CSharpPlugins(List<PluginMetadata> source) public static IEnumerable<PluginPair> CSharpPlugins(List<PluginMetadata> source)
{ {
var plugins = new List<PluginPair>(); var plugins = new List<PluginPair>();
var metadatas = source.Where(o => o.Language.ToUpper() == AllowedLanguage.CSharp); var metadatas = source.Where(o => o.Language.ToUpperInvariant() == AllowedLanguage.CSharp);
foreach (var metadata in metadatas) foreach (var metadata in metadatas)
{ {
@@ -89,7 +90,7 @@ namespace Wox.Core.Plugin
public static IEnumerable<PluginPair> ExecutablePlugins(IEnumerable<PluginMetadata> source) public static IEnumerable<PluginPair> ExecutablePlugins(IEnumerable<PluginMetadata> source)
{ {
var metadatas = source.Where(o => o.Language.ToUpper() == AllowedLanguage.Executable); var metadatas = source.Where(o => o.Language.ToUpperInvariant() == AllowedLanguage.Executable);
var plugins = metadatas.Select(metadata => new PluginPair var plugins = metadatas.Select(metadata => new PluginPair
{ {

View File

@@ -13,6 +13,16 @@ namespace Wox.Core.Plugin
{ {
public static Dictionary<PluginPair, Query> Build(ref string text, Dictionary<string, PluginPair> nonGlobalPlugins) public static Dictionary<PluginPair, Query> Build(ref string text, Dictionary<string, PluginPair> nonGlobalPlugins)
{ {
if (text == null)
{
throw new ArgumentNullException(nameof(text));
}
if (nonGlobalPlugins == null)
{
throw new ArgumentNullException(nameof(nonGlobalPlugins));
}
// replace multiple white spaces with one white space // replace multiple white spaces with one white space
var terms = text.Split(new[] { Query.TermSeparator }, StringSplitOptions.RemoveEmptyEntries); var terms = text.Split(new[] { Query.TermSeparator }, StringSplitOptions.RemoveEmptyEntries);
if (terms.Length == 0) if (terms.Length == 0)
@@ -32,7 +42,8 @@ namespace Wox.Core.Plugin
foreach (string pluginActionKeyword in nonGlobalPlugins.Keys) foreach (string pluginActionKeyword in nonGlobalPlugins.Keys)
{ {
if (possibleActionKeyword.StartsWith(pluginActionKeyword)) // Using Ordinal since this is used internally
if (possibleActionKeyword.StartsWith(pluginActionKeyword, StringComparison.Ordinal))
{ {
if (nonGlobalPlugins.TryGetValue(pluginActionKeyword, out var pluginPair) && !pluginPair.Metadata.Disabled) if (nonGlobalPlugins.TryGetValue(pluginActionKeyword, out var pluginPair) && !pluginPair.Metadata.Disabled)
{ {

View File

@@ -3,9 +3,12 @@
// See the LICENSE file in the project root for more information. // See the LICENSE file in the project root for more information.
using System; using System;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Reflection;
using System.Windows; using System.Windows;
using System.Windows.Media; using System.Windows.Media;
using Wox.Infrastructure.Logger;
namespace Wox.Core.Resource namespace Wox.Core.Resource
{ {
@@ -24,8 +27,9 @@ namespace Wox.Core.Resource
{ {
return (FontWeight)_fontWeightConverter.ConvertFromInvariantString(value); return (FontWeight)_fontWeightConverter.ConvertFromInvariantString(value);
} }
catch catch (NotSupportedException e)
{ {
Log.Exception($"Can't convert {value} to FontWeight", e, MethodBase.GetCurrentMethod().DeclaringType);
return FontWeights.Normal; return FontWeights.Normal;
} }
} }
@@ -43,8 +47,9 @@ namespace Wox.Core.Resource
{ {
return (FontStyle)_fontStyleConverter.ConvertFromInvariantString(value); return (FontStyle)_fontStyleConverter.ConvertFromInvariantString(value);
} }
catch catch (NotSupportedException e)
{ {
Log.Exception($"Can't convert {value} to FontStyle", e, MethodBase.GetCurrentMethod().DeclaringType);
return FontStyles.Normal; return FontStyles.Normal;
} }
} }
@@ -62,14 +67,20 @@ namespace Wox.Core.Resource
{ {
return (FontStretch)_fontStretchConverter.ConvertFromInvariantString(value); return (FontStretch)_fontStretchConverter.ConvertFromInvariantString(value);
} }
catch catch (NotSupportedException e)
{ {
Log.Exception($"Can't convert {value} to FontStretch", e, MethodBase.GetCurrentMethod().DeclaringType);
return FontStretches.Normal; return FontStretches.Normal;
} }
} }
public static FamilyTypeface ChooseRegularFamilyTypeface(this FontFamily family) public static FamilyTypeface ChooseRegularFamilyTypeface(this FontFamily family)
{ {
if (family == null)
{
throw new ArgumentNullException(nameof(family));
}
return family.FamilyTypefaces.OrderBy(o => return family.FamilyTypefaces.OrderBy(o =>
{ {
return (Math.Abs(o.Stretch.ToOpenTypeStretch() - FontStretches.Normal.ToOpenTypeStretch()) * 100) + return (Math.Abs(o.Stretch.ToOpenTypeStretch() - FontStretches.Normal.ToOpenTypeStretch()) * 100) +
@@ -80,6 +91,11 @@ namespace Wox.Core.Resource
public static FamilyTypeface ConvertFromInvariantStringsOrNormal(this FontFamily family, string style, string weight, string stretch) public static FamilyTypeface ConvertFromInvariantStringsOrNormal(this FontFamily family, string style, string weight, string stretch)
{ {
if (family == null)
{
throw new ArgumentNullException(nameof(family));
}
var styleObj = GetFontStyleFromInvariantStringOrNormal(style); var styleObj = GetFontStyleFromInvariantStringOrNormal(style);
var weightObj = GetFontWeightFromInvariantStringOrNormal(weight); var weightObj = GetFontWeightFromInvariantStringOrNormal(weight);
var stretchObj = GetFontStretchFromInvariantStringOrNormal(stretch); var stretchObj = GetFontStretchFromInvariantStringOrNormal(stretch);