Skip to content

Commit de0c31c

Browse files
Merge branch 'master' into feature/improve-transfers-2008
2 parents 0cce141 + 6e06d55 commit de0c31c

22 files changed

Lines changed: 726 additions & 50 deletions

src/ByteSync.Client/Business/Configurations/ApplicationSettings.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,8 +309,13 @@ private void InitializeClientId()
309309
var modulo = (long) (value % Math.Pow(base26Converter.FiguresCount, 10));
310310
var identifier = base26Converter.ConvertTo(modulo, 10).ToUpper();
311311

312+
var regex = new Regex(
313+
@"^(....)(...)(...)$",
314+
RegexOptions.None,
315+
TimeSpan.FromMilliseconds(200)
316+
);
312317
// https://stackoverflow.com/questions/3968845/format-string-with-dashes
313-
identifier = Regex.Replace(identifier, @"^(....)(...)(...)$", "$1-$2-$3");
318+
identifier = regex.Replace(identifier, "$1-$2-$3");
314319

315320
ClientId = identifier;
316321
}

src/ByteSync.Client/Business/Filtering/Evaluators/ActionComparisonExpressionEvaluator.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,10 @@ private int GetActionCount(ComparisonItem item, string[] pathParts)
8181

8282
private int FilterActionsByType(List<AtomicAction> actions, string actionType)
8383
{
84-
var actionTypePattern = new Regex(@"^([a-zA-Z-]+)$", RegexOptions.IgnoreCase);
84+
var actionTypePattern = new Regex(
85+
@"^([a-zA-Z-]+)$",
86+
RegexOptions.IgnoreCase,
87+
TimeSpan.FromMilliseconds(500));
8588
var match = actionTypePattern.Match(actionType);
8689

8790
if (!match.Success)

src/ByteSync.Client/Business/Filtering/Evaluators/BaseElementPathExpressionEvaluator.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,20 @@ public override bool Evaluate(BaseElementPathExpression expression, ComparisonIt
3434

3535
searchText = "^" + Regex.Escape(expression.SearchText).Replace("\\*", ".*") + "$";
3636
}
37-
37+
38+
var regex = new Regex(
39+
searchText,
40+
RegexOptions.IgnoreCase,
41+
TimeSpan.FromMilliseconds(200)
42+
);
43+
44+
// https://stackoverflow.com/questions/3968845/format-string-with-dashes
3845
return comparisonOperator switch
3946
{
4047
ComparisonOperator.Equals => string.Equals(targetValue, searchText, StringComparison.OrdinalIgnoreCase),
4148
ComparisonOperator.NotEquals => !string.Equals(targetValue, searchText, StringComparison.OrdinalIgnoreCase),
42-
ComparisonOperator.RegexMatch => Regex.IsMatch(targetValue, searchText, RegexOptions.IgnoreCase),
43-
ComparisonOperator.RegexNotMatch => !Regex.IsMatch(targetValue, searchText, RegexOptions.IgnoreCase),
49+
ComparisonOperator.RegexMatch => regex.IsMatch(targetValue),
50+
ComparisonOperator.RegexNotMatch => !regex.IsMatch(targetValue),
4451
_ => false
4552
};
4653
}

src/ByteSync.Client/Business/Filtering/Evaluators/PropertyComparer.cs

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,20 +41,37 @@ private bool CompareStrings(PropertyValueCollection collection1, PropertyValueCo
4141
{
4242
var s2 = (value2.Value as string)!;
4343

44-
if (op switch
45-
{
46-
ComparisonOperator.Equals => string.Equals(s1, s2, StringComparison.OrdinalIgnoreCase),
47-
ComparisonOperator.NotEquals => !string.Equals(s1, s2, StringComparison.OrdinalIgnoreCase),
48-
ComparisonOperator.GreaterThan => string.Compare(s1, s2, StringComparison.OrdinalIgnoreCase) > 0,
49-
ComparisonOperator.LessThan => string.Compare(s1, s2, StringComparison.OrdinalIgnoreCase) < 0,
50-
ComparisonOperator.GreaterThanOrEqual => string.Compare(s1, s2, StringComparison.OrdinalIgnoreCase) >= 0,
51-
ComparisonOperator.LessThanOrEqual => string.Compare(s1, s2, StringComparison.OrdinalIgnoreCase) <= 0,
52-
ComparisonOperator.RegexMatch => Regex.IsMatch(s1, s2),
53-
_ => throw new ArgumentException($"Unsupported string operator: {op}")
54-
})
55-
{
56-
return true;
57-
}
44+
bool isMatch;
45+
if (op == ComparisonOperator.RegexMatch)
46+
{
47+
try
48+
{
49+
var safeRegex = new Regex(s2, RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(500));
50+
isMatch = safeRegex.IsMatch(s1);
51+
}
52+
catch (ArgumentException)
53+
{
54+
isMatch = false;
55+
}
56+
}
57+
else
58+
{
59+
isMatch = op switch
60+
{
61+
ComparisonOperator.Equals => string.Equals(s1, s2, StringComparison.OrdinalIgnoreCase),
62+
ComparisonOperator.NotEquals => !string.Equals(s1, s2, StringComparison.OrdinalIgnoreCase),
63+
ComparisonOperator.GreaterThan => string.Compare(s1, s2, StringComparison.OrdinalIgnoreCase) > 0,
64+
ComparisonOperator.LessThan => string.Compare(s1, s2, StringComparison.OrdinalIgnoreCase) < 0,
65+
ComparisonOperator.GreaterThanOrEqual => string.Compare(s1, s2, StringComparison.OrdinalIgnoreCase) >= 0,
66+
ComparisonOperator.LessThanOrEqual => string.Compare(s1, s2, StringComparison.OrdinalIgnoreCase) <= 0,
67+
_ => throw new ArgumentException($"Unsupported string operator: {op}")
68+
};
69+
}
70+
71+
if (isMatch)
72+
{
73+
return true;
74+
}
5875
}
5976
}
6077

src/ByteSync.Client/Business/Filtering/Evaluators/PropertyComparisonExpressionEvaluator.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,11 @@ private bool CompareWithLiteral(PropertyValueCollection sourceValues, string tar
4848
// Handle special case for regex
4949
if (op == ComparisonOperator.RegexMatch && sourceValues.Any(sv => sv.Value is string))
5050
{
51-
try
52-
{
53-
return sourceValues.Any(sv => Regex.IsMatch(sv.Value.ToString()!, targetValue));
54-
}
51+
try
52+
{
53+
var safeRegex = new Regex(targetValue, RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(500));
54+
return sourceValues.Any(sv => safeRegex.IsMatch(sv.Value.ToString()!));
55+
}
5556
catch (ArgumentException)
5657
{
5758
// Invalid regex

src/ByteSync.Client/Business/Filtering/Extensions/DurationExtensions.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ public static class DurationExtensions
77
{
88
public static TimeSpan ToTimeSpan(this string durationWithUnit)
99
{
10-
var match = Regex.Match(durationWithUnit, @"^(\d+(?:\.\d+)?)\s*([a-zA-Z]+)$");
10+
var safeRegex = new Regex(@"^(\d+(?:\.\d+)?)\s*([a-zA-Z]+)$", RegexOptions.None, TimeSpan.FromMilliseconds(500));
11+
12+
var match = safeRegex.Match(durationWithUnit);
1113
if (!match.Success)
1214
return TimeSpan.FromSeconds(double.Parse(durationWithUnit)); // Assume seconds if no unit
1315

src/ByteSync.Client/Business/Filtering/Extensions/SizeUnitExtensions.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ public static class SizeUnitExtensions
77
{
88
public static long ToBytes(this string sizeWithUnit)
99
{
10-
var match = Regex.Match(sizeWithUnit, @"^(\d+(?:\.\d+)?)\s*([a-zA-Z]+)$");
10+
var safeRegex = new Regex(@"^(\d+(?:\.\d+)?)\s*([a-zA-Z]+)$", RegexOptions.None, TimeSpan.FromMilliseconds(500));
11+
var match = safeRegex.Match(sizeWithUnit);
1112
if (!match.Success)
1213
return long.Parse(sizeWithUnit); // Assume bytes if no unit specified
1314

src/ByteSync.Client/Services/Communications/SafetyWordsComputer.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ public string[] Compute(string hexInput)
2424
{
2525
throw new ArgumentOutOfRangeException(nameof(hexInput), "input can not be empty");
2626
}
27-
if (!Regex.IsMatch(hexInput, "^[0-9a-f]+$", RegexOptions.IgnoreCase))
27+
var safeRegex = new Regex("^[0-9a-f]+$", RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(500));
28+
if (!safeRegex.IsMatch(hexInput))
2829
{
2930
throw new ArgumentOutOfRangeException(nameof(hexInput), "wrong input format");
3031
}

src/ByteSync.Client/Services/Communications/WebAccessor.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Runtime.InteropServices;
1+
using System.IO;
2+
using System.Runtime.InteropServices;
23
using System.Threading.Tasks;
34
using ByteSync.Interfaces;
45
using ByteSync.Interfaces.Controls.Communications;
@@ -150,16 +151,19 @@ private static void DoOpenUrl(string url)
150151
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
151152
{
152153
url = url.Replace("&", "^&");
153-
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo("cmd", $"/c start {url}")
154+
var cmdTrustedPath = Path.Combine(Environment.SystemDirectory, "cmd.exe");
155+
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(cmdTrustedPath, $"/c start {url}")
154156
{ CreateNoWindow = true });
155157
}
156158
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
157159
{
158-
System.Diagnostics.Process.Start("xdg-open", url);
160+
var xdgTrustedPath = "/usr/bin/xdg-open";
161+
System.Diagnostics.Process.Start(xdgTrustedPath, url);
159162
}
160163
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
161164
{
162-
System.Diagnostics.Process.Start("open", url);
165+
var openTrustedPath = "/usr/bin/open";
166+
System.Diagnostics.Process.Start(openTrustedPath, url);
163167
}
164168
else
165169
{

src/ByteSync.Client/Services/Comparisons/SynchronizationRuleMatcher.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,8 @@ private bool ConditionMatchesName(AtomicCondition condition, ComparisonItem comp
375375
condition.ConditionOperator.In(ConditionOperatorTypes.Equals, ConditionOperatorTypes.NotEquals))
376376
{
377377
var regex = "^" + Regex.Escape(pattern).Replace("\\*", ".*") + "$";
378-
var isMatch = Regex.IsMatch(name, regex, RegexOptions.IgnoreCase);
378+
var safeRegex = new Regex(regex,RegexOptions.IgnoreCase,TimeSpan.FromMilliseconds(500));
379+
var isMatch = safeRegex.IsMatch(name);
379380
result = condition.ConditionOperator == ConditionOperatorTypes.Equals ? isMatch : !isMatch;
380381
}
381382
else

0 commit comments

Comments
 (0)