{
}
+ internal SemaphoreSecurity (SafeHandle handle, AccessControlSections includeSections)
+ : base (false, ResourceType.KernelObject, handle, includeSections)
+ {
+ }
+
public override Type AccessRightType {
get { return typeof (SemaphoreRights); }
}
{
SetAuditRule((AuditRule)rule);
}
+
+ internal void PersistModifications (SafeHandle handle)
+ {
+ WriteLock();
+ try {
+ Persist (handle, (AccessRulesModified ? AccessControlSections.Access : 0) |
+ (AuditRulesModified ? AccessControlSections.Audit : 0) |
+ (OwnerModified ? AccessControlSections.Owner : 0) |
+ (GroupModified ? AccessControlSections.Group : 0), null);
+ } finally {
+ WriteUnlock ();
+ }
+ }
}
}
{
}
- [MonoTODO ("Does not support access control, semaphoreSecurity is ignored")]
+ [MonoTODO ("CreateSemaphore_internal does not support access control, semaphoreSecurity is ignored")]
public Semaphore (int initialCount, int maximumCount, string name, out bool createdNew,
SemaphoreSecurity semaphoreSecurity)
{
out createdNew);
}
- [MonoTODO]
public SemaphoreSecurity GetAccessControl ()
{
- throw new NotImplementedException ();
+ return new SemaphoreSecurity (SafeWaitHandle,
+ AccessControlSections.Owner |
+ AccessControlSections.Group |
+ AccessControlSections.Access);
}
[PrePrepareMethod]
return (ret);
}
- [MonoTODO]
public void SetAccessControl (SemaphoreSecurity semaphoreSecurity)
{
if (semaphoreSecurity == null)
throw new ArgumentNullException ("semaphoreSecurity");
-
- throw new NotImplementedException ();
+
+ semaphoreSecurity.PersistModifications (SafeWaitHandle);
}
// static methods
--- /dev/null
+// SemaphoreSecurityTest.cs - NUnit Test Cases for SemaphoreSecurity
+//
+// Authors:
+// James Bellinger <jfb@zer7.com>
+//
+// Copyright (C) 2012 James Bellinger
+
+using System;
+using System.Collections.Generic;
+using System.Security.AccessControl;
+using System.Security.Principal;
+using System.Threading;
+using NUnit.Framework;
+
+namespace MonoTests.System.Security.AccessControl
+{
+ [TestFixture]
+ public class SemaphoreSecurityTest
+ {
+ // TODO: Mono System.Threading.Semaphore does not throw exceptions on failure (except in OpenExisting).
+ [Test, ExpectedExceptionAttribute (typeof (UnauthorizedAccessException))]
+ public void PermissionsActuallyWork ()
+ {
+ if (PlatformID.Win32NT != Environment.OSVersion.Platform) {
+ Assert.Ignore (); return;
+ }
+
+ bool createdNew; SemaphoreSecurity security;
+ string name = @"Local\MonoTestSemaphore";
+
+ using (Semaphore semaphore = new Semaphore (1, 1, name, out createdNew)) {
+ Assert.IsFalse (semaphore.SafeWaitHandle.IsInvalid);
+ Assert.IsTrue (createdNew);
+
+ // Make sure our later error will be due to permissions and not some sharing bug.
+ bool createdAnotherNew;
+ using (Semaphore anotherSemaphore = new Semaphore (1, 1, name, out createdAnotherNew)) {
+ Assert.IsFalse (anotherSemaphore.SafeWaitHandle.IsInvalid);
+ Assert.IsFalse (createdAnotherNew);
+ }
+
+ // Let's make a deny all.
+ security = semaphore.GetAccessControl ();
+
+ foreach (SemaphoreAccessRule rule in security.GetAccessRules
+ (true, false, typeof (SecurityIdentifier))) {
+ security.RemoveAccessRuleSpecific (rule);
+ }
+
+ Assert.AreEqual (0, security.GetAccessRules (true, false, typeof (SecurityIdentifier)).Count);
+ semaphore.SetAccessControl (security);
+
+ security = semaphore.GetAccessControl ();
+ Assert.AreEqual (0, security.GetAccessRules (true, false, typeof (SecurityIdentifier)).Count);
+
+ // MS.NET will throw on the first line below.
+ // For Mono testing the latter verifies the rest until the Semaphore bug is fixed.
+ // Also, NUnit 2.4 appears to lacks Assert.Pass ().
+ Semaphore badSemaphore = new Semaphore (1, 1, name);
+ if (badSemaphore.SafeWaitHandle.IsInvalid)
+ throw new UnauthorizedAccessException ();
+ }
+ }
+ }
+}
+