From 260875da7e222ad021424ce523ce9b7f81e1a61d Mon Sep 17 00:00:00 2001 From: Archi Date: Thu, 11 Nov 2021 19:34:21 +0100 Subject: [PATCH] Use shared Random across ASF This also removes PublicAPI of ASF's "shared random" --- .../SteamTokenDumperPlugin.cs | 8 +++-- ArchiSteamFarm/Core/Utilities.cs | 29 ------------------- ArchiSteamFarm/Steam/Cards/CardsFarmer.cs | 4 ++- 3 files changed, 9 insertions(+), 32 deletions(-) diff --git a/ArchiSteamFarm.OfficialPlugins.SteamTokenDumper/SteamTokenDumperPlugin.cs b/ArchiSteamFarm.OfficialPlugins.SteamTokenDumper/SteamTokenDumperPlugin.cs index ebd9218e1..3c9c46aa6 100644 --- a/ArchiSteamFarm.OfficialPlugins.SteamTokenDumper/SteamTokenDumperPlugin.cs +++ b/ArchiSteamFarm.OfficialPlugins.SteamTokenDumper/SteamTokenDumperPlugin.cs @@ -132,7 +132,9 @@ internal sealed class SteamTokenDumperPlugin : OfficialPlugin, IASF, IBot, IBotS } } - TimeSpan startIn = TimeSpan.FromMinutes(Utilities.RandomNext(SharedInfo.MinimumMinutesBeforeFirstUpload, SharedInfo.MaximumMinutesBeforeFirstUpload)); +#pragma warning disable CA5394 // This call isn't used in a security-sensitive manner + TimeSpan startIn = TimeSpan.FromMinutes(Random.Shared.Next(SharedInfo.MinimumMinutesBeforeFirstUpload, SharedInfo.MaximumMinutesBeforeFirstUpload)); +#pragma warning restore CA5394 // This call isn't used in a security-sensitive manner // ReSharper disable once SuspiciousLockOverSynchronizationPrimitive - this is not a mistake, we need extra synchronization, and we can re-use the semaphore object for that lock (SubmissionSemaphore) { @@ -517,7 +519,9 @@ internal sealed class SteamTokenDumperPlugin : OfficialPlugin, IASF, IBot, IBotS #else if (response.StatusCode == HttpStatusCode.TooManyRequests) { #endif - TimeSpan startIn = TimeSpan.FromMinutes(Utilities.RandomNext(SharedInfo.MinimumMinutesBeforeFirstUpload, SharedInfo.MaximumMinutesBeforeFirstUpload)); +#pragma warning disable CA5394 // This call isn't used in a security-sensitive manner + TimeSpan startIn = TimeSpan.FromMinutes(Random.Shared.Next(SharedInfo.MinimumMinutesBeforeFirstUpload, SharedInfo.MaximumMinutesBeforeFirstUpload)); +#pragma warning restore CA5394 // This call isn't used in a security-sensitive manner // ReSharper disable once SuspiciousLockOverSynchronizationPrimitive - this is not a mistake, we need extra synchronization, and we can re-use the semaphore object for that lock (SubmissionSemaphore) { diff --git a/ArchiSteamFarm/Core/Utilities.cs b/ArchiSteamFarm/Core/Utilities.cs index a902278cb..ed5d850bc 100644 --- a/ArchiSteamFarm/Core/Utilities.cs +++ b/ArchiSteamFarm/Core/Utilities.cs @@ -49,9 +49,6 @@ public static class Utilities { // normally we'd just use words like "steam" and "farm", but the library we're currently using is a bit iffy about banned words, so we need to also add combinations such as "steamfarm" private static readonly ImmutableHashSet ForbiddenPasswordPhrases = ImmutableHashSet.Create(StringComparer.InvariantCultureIgnoreCase, "archisteamfarm", "archi", "steam", "farm", "archisteam", "archifarm", "steamfarm", "asf", "asffarm", "password"); - // Normally we wouldn't need to use this singleton, but we want to ensure decent randomness across entire program's lifetime - private static readonly Random Random = new(); - [PublicAPI] public static string GetArgsAsText(string[] args, byte argsToSkip, string delimiter) { if (args == null) { @@ -209,32 +206,6 @@ public static class Utilities { return (text.Length % 2 == 0) && text.All(Uri.IsHexDigit); } - [PublicAPI] - public static int RandomNext() { - lock (Random) { -#pragma warning disable CA5394 // This call isn't used in a security-sensitive manner - return Random.Next(); -#pragma warning restore CA5394 // This call isn't used in a security-sensitive manner - } - } - - [PublicAPI] - public static int RandomNext(int minValue, int maxValue) { - if (minValue > maxValue) { - throw new InvalidOperationException($"{nameof(minValue)} && {nameof(maxValue)}"); - } - - if (minValue >= maxValue - 1) { - return minValue; - } - - lock (Random) { -#pragma warning disable CA5394 // This call isn't used in a security-sensitive manner - return Random.Next(minValue, maxValue); -#pragma warning restore CA5394 // This call isn't used in a security-sensitive manner - } - } - [PublicAPI] public static IEnumerable SelectNodes(this IDocument document, string xpath) { if (document == null) { diff --git a/ArchiSteamFarm/Steam/Cards/CardsFarmer.cs b/ArchiSteamFarm/Steam/Cards/CardsFarmer.cs index e1747bb20..f01863097 100644 --- a/ArchiSteamFarm/Steam/Cards/CardsFarmer.cs +++ b/ArchiSteamFarm/Steam/Cards/CardsFarmer.cs @@ -1180,7 +1180,9 @@ public sealed class CardsFarmer : IAsyncDisposable { break; case BotConfig.EFarmingOrder.Random: - orderedGamesToFarm = orderedGamesToFarm.ThenBy(static _ => Utilities.RandomNext()); +#pragma warning disable CA5394 // This call isn't used in a security-sensitive manner + orderedGamesToFarm = orderedGamesToFarm.ThenBy(static _ => Random.Shared.Next()); +#pragma warning restore CA5394 // This call isn't used in a security-sensitive manner break; case BotConfig.EFarmingOrder.RedeemDateTimesAscending: