History

Added lock to avoid race condition for ProviderFactory

Christoph Lackner committed 5 years ago

Commit ffd630f1 parent 24ac0611 file · +12 −10Browse files

Unified · Split

Source/Libraries/GSF.Security/SecurityProviderUtility.cs+12−10
@@ -58,7 +58,6 @@ namespace GSF.Security · 57 unmodified lines
5858
5959 //Constants
6060 private const string SettingsCategory = "SecurityProvider";
61− private const string AlternateSettingsCategory = "AlternateSecurityProvider";
6261 private const string DefaultProviderType = "GSF.Security.LdapSecurityProvider, GSF.Security";
6362 private const string DefaultIncludedResources = "*=*";
6463 private const string DefaultExcludedResources = "";
@@ -75,7 +74,8 @@ namespace GSF.Security · 10 unmodified lines
7574 private static readonly string s_notificationSmtpServer;
7675 private static readonly string s_notificationSenderEmail;
7776
78− private static Dictionary<string,Func<string, ISecurityProvider>> s_providerFactory;
77+ private static Dictionary<string, Func<string, ISecurityProvider>> s_providerFactory;
78+ private static readonly object s_providerFactoryLock = new object();
7979
8080 // Static Constructor
8181 static SecurityProviderUtility()
@@ -87,7 +87,7 @@ namespace GSF.Security · 5 unmodified lines
8787 settings.Add("ExcludedResources", DefaultExcludedResources, "Semicolon delimited list of resources to be excluded from being secured.");
8888 settings.Add("NotificationSmtpServer", DefaultNotificationSmtpServer, "SMTP server to be used for sending out email notification messages.");
8989 settings.Add("NotificationSenderEmail", DefaultNotificationSenderEmail, "Email address of the sender of email notification messages.");
90−
90+
9191 s_includedResources = settings["IncludedResources"].ValueAsString().ParseKeyValuePairs();
9292 s_excludedResources = settings["ExcludedResources"].ValueAsString().Split(';');
9393 s_notificationSmtpServer = settings["NotificationSmtpServer"].ValueAsString();
@@ -150,7 +150,7 @@ namespace GSF.Security · 56 unmodified lines
150150 /// </summary>
151151 /// <param name="userData">Object that contains data about the user to be used by the security provider.</param>
152152 /// <returns>An object that implements <see cref="ISecurityProvider"/>.</returns>
153− public static ISecurityProvider CreateProvider(UserData userData, string settingsCategory=null)
153+ public static ISecurityProvider CreateProvider(UserData userData, string settingsCategory = null)
154154 {
155155 // Initialize the username
156156 string username = userData.Username;
@@ -304,14 +304,16 @@ namespace GSF.Security · 147 unmodified lines
304304 if (settingsCategory == null)
305305 settingsCategory = SettingsCategory;
306306
307− if (s_providerFactory is null)
308− s_providerFactory = new Dictionary<string, Func<string, ISecurityProvider>>() { };
307+ lock (s_providerFactoryLock)
308+ {
309+ if (s_providerFactory is null)
310+ s_providerFactory = new Dictionary<string, Func<string, ISecurityProvider>>() { };
309311
310− if (s_providerFactory.ContainsKey(settingsCategory))
312+ if (s_providerFactory.ContainsKey(settingsCategory))
313+ return s_providerFactory[settingsCategory];
314+ s_providerFactory.Add(settingsCategory, CreateSecurityProviderFactory(settingsCategory));
311315 return s_providerFactory[settingsCategory];
312− s_providerFactory.Add(settingsCategory,CreateSecurityProviderFactory(settingsCategory));
313− return s_providerFactory[settingsCategory];
314−
316+ }
315317 }
316318 #endregion
317319 }

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t