// WindowsIdentityTest.cs - NUnit Test Cases for WindowsIdentity
//
// Author:
-// Sebastien Pouliot (spouliot@motus.com)
+// Sebastien Pouliot (sebastien@ximian.com)
//
// (C) 2003 Motus Technologies Inc. (http://www.motus.com)
+// (C) 2004 Novell (http://www.novell.com)
//
using NUnit.Framework;
using System;
+using System.IO;
+using System.Reflection;
using System.Runtime.Serialization;
+using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Principal;
namespace MonoTests.System.Security.Principal {
[TestFixture]
public class WindowsIdentityTest : Assertion {
+ private bool IsPosix {
+ get { return ((int) Environment.OSVersion.Platform == 128); }
+ }
+
+ // some features works only in Windows 2003 and later
+ private bool IsWin2k3orLater {
+ get {
+ // requires both a W2K3 client and server (domain)
+ // which I don't have access to debug/support
+ OperatingSystem os = Environment.OSVersion;
+ if (os.Platform != PlatformID.Win32NT)
+ return false;
+
+ if (os.Version.Major > 5) {
+ return false;
+ }
+ else if (os.Version.Major == 5) {
+ return (os.Version.Minor > 1);
+ }
+ return false;
+ }
+ }
+
[Test]
- [ExpectedException (typeof (ArgumentException))]
public void ConstructorIntPtrZero ()
{
- WindowsIdentity id = new WindowsIdentity (IntPtr.Zero);
+ // should fail on Windows (invalid token)
+ // should not fail on Posix (root uid)
+ try {
+ WindowsIdentity id = new WindowsIdentity (IntPtr.Zero);
+ if (!IsPosix)
+ Fail ("Expected ArgumentException on Windows platforms");
+ }
+ catch (ArgumentException) {
+ if (IsPosix)
+ throw;
+ }
}
-
+#if !NET_1_0
[Test]
//[ExpectedException (typeof (ArgumentNullException))]
[ExpectedException (typeof (NullReferenceException))]
}
[Test]
- [ExpectedException (typeof (ArgumentException))]
public void ConstructorW2KS1 ()
{
- WindowsIdentity id = new WindowsIdentity (@"FARSCAPE\spouliot");
+ WindowsIdentity wi = WindowsIdentity.GetCurrent ();
+ // should fail with ArgumentException unless
+ // - running Windows 2003 or later (both client and domain server)
+ // - running Posix
+ try {
+ WindowsIdentity id = new WindowsIdentity (wi.Name);
+ /*if (!IsWin2k3orLater && !IsPosix)
+ Fail ("Expected ArgumentException but got none");*/
+ }
+ catch (ArgumentException) {
+ if (/*IsWin2k3orLater ||*/ IsPosix)
+ throw;
+ }
}
[Test]
//[ExpectedException (typeof (ArgumentNullException))]
[ExpectedException (typeof (NullReferenceException))]
- public void ConstructorW2KS2_NullType ()
+ public void ConstructorW2KS2_UserNull ()
{
WindowsIdentity id = new WindowsIdentity (null, "NTLM");
}
[Test]
- [ExpectedException (typeof (ArgumentException))]
- public void ConstructorW2KS2_UserNull()
+ public void ConstructorW2KS2_TypeNull()
{
- WindowsIdentity id = new WindowsIdentity (@"FARSCAPE\spouliot", null);
+ WindowsIdentity wi = WindowsIdentity.GetCurrent ();
+ // should fail with ArgumentException unless
+ // - running Windows 2003 or later (both client and domain server)
+ // - running Posix
+ try {
+ WindowsIdentity id = new WindowsIdentity (wi.Name, null);
+ /*if (!IsWin2k3orLater && !IsPosix)
+ Fail ("Expected ArgumentException but got none");*/
+ }
+ catch (ArgumentException) {
+ if (/*IsWin2k3orLater ||*/ IsPosix)
+ throw;
+ }
}
[Test]
- [ExpectedException (typeof (ArgumentException))]
public void ConstructorW2KS2 ()
{
- WindowsIdentity id = new WindowsIdentity (@"FARSCAPE\spouliot", "NTLM");
+ WindowsIdentity wi = WindowsIdentity.GetCurrent ();
+ // should fail with ArgumentException unless
+ // - running Windows 2003 or later (both client and domain server)
+ // - running Posix
+ try {
+ WindowsIdentity id = new WindowsIdentity (wi.Name, wi.AuthenticationType);
+ /*if (!IsWin2k3orLater && !IsPosix)
+ Fail ("Expected ArgumentException but got none");*/
+ }
+ catch (ArgumentException) {
+ if (/*IsWin2k3orLater ||*/ IsPosix)
+ throw;
+ }
}
-
+#endif
[Test]
public void Anonymous ()
{
Assert ("IsAuthenticated", !id.IsAuthenticated);
Assert ("IsGuest", !id.IsGuest);
Assert ("IsSystem", !id.IsSystem);
- AssertEquals ("Token", IntPtr.Zero, id.Token);
- AssertEquals ("Name", String.Empty, id.Name);
+ if (IsPosix) {
+ Assert ("Token", (IntPtr.Zero != id.Token));
+ AssertNotNull ("Name", id.Name);
+ }
+ else {
+ AssertEquals ("Token", IntPtr.Zero, id.Token);
+ AssertEquals ("Name", String.Empty, id.Name);
+ }
}
[Test]
- [Ignore ("not currently supported on mono")]
public void Current ()
{
WindowsIdentity id = WindowsIdentity.GetCurrent ();
- AssertEquals ("AuthenticationType", "NTLM", id.AuthenticationType);
+ AssertNotNull ("AuthenticationType", id.AuthenticationType);
Assert ("IsAnonymous", !id.IsAnonymous);
Assert ("IsAuthenticated", id.IsAuthenticated);
Assert ("IsGuest", !id.IsGuest);
- Assert ("IsSystem", !id.IsSystem);
- Assert ("Token", (IntPtr.Zero != id.Token));
- // e.g. FARSCAPE\spouliot
- Assert ("Name", (id.Name.IndexOf (@"\") > 0));
+ // root is 0 - so IntPtr.Zero is valid on Linux (but not on Windows)
+ Assert ("IsSystem", (!id.IsSystem || (id.Token == IntPtr.Zero)));
+ if (!IsPosix) {
+ Assert ("Token", (id.Token != IntPtr.Zero));
+ }
+ AssertNotNull ("Name", id.Name);
}
[Test]
- public void Interface ()
+ public void Interfaces ()
{
WindowsIdentity id = WindowsIdentity.GetAnonymous ();
AssertNotNull ("ISerializable", s);
#endif
}
+
+ // This is clearly a hack - but I've seen it too many times so I think we
+ // better support it too :(
+ // http://dotnetjunkies.com/WebLog/chris.taylor/archive/2004/02/25/7945.aspx
+ public string[] GetWindowsIdentityRoles (WindowsIdentity identity)
+ {
+ object result = typeof(WindowsIdentity).InvokeMember ("_GetRoles",
+ BindingFlags.Static | BindingFlags.InvokeMethod | BindingFlags.NonPublic,
+ null, identity, new object[] {identity.Token}, null);
+ return (string[]) result;
+ }
+
+ [Test]
+ public void GetRolesViaReflection ()
+ {
+ // remove g_warning from being show during unit tests
+ if (IsPosix)
+ return;
+
+ WindowsIdentity wi = WindowsIdentity.GetCurrent ();
+ WindowsPrincipal wp = new WindowsPrincipal (wi);
+ string[] roles = GetWindowsIdentityRoles (wi);
+ foreach (string role in roles) {
+ // somehow I got a null in there ?
+ if (role != null)
+ Assert (role, wp.IsInRole (role));
+ }
+ }
+
+ [Test]
+ public void SerializeRoundTrip ()
+ {
+ WindowsIdentity wi = WindowsIdentity.GetCurrent ();
+ MemoryStream ms = new MemoryStream ();
+ IFormatter formatter = new BinaryFormatter ();
+ formatter.Serialize (ms, wi);
+ ms.Position = 0;
+ WindowsIdentity back = (WindowsIdentity) formatter.Deserialize (ms);
+ AssertEquals ("AuthenticationType", wi.AuthenticationType, back.AuthenticationType);
+ AssertEquals ("IsAnonymous", wi.IsAnonymous, back.IsAnonymous);
+ AssertEquals ("IsAuthenticated", wi.IsAuthenticated, back.IsAuthenticated);
+ AssertEquals ("IsGuest", wi.IsGuest, back.IsGuest);
+ AssertEquals ("IsSystem", wi.IsSystem, back.IsSystem);
+ AssertEquals ("Name", wi.Name, back.Name);
+ // note: token may be different (no compare)
+ }
}
}