67 lines
2.3 KiB
C#
67 lines
2.3 KiB
C#
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Microsoft Research Singularity - Singularity ABI
|
||
|
//
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//
|
||
|
// File: PrincipalId.cs
|
||
|
//
|
||
|
// Note:
|
||
|
//
|
||
|
|
||
|
using System;
|
||
|
using System.Runtime.CompilerServices;
|
||
|
using System.Threading;
|
||
|
using Microsoft.Singularity.Security;
|
||
|
|
||
|
namespace Microsoft.Singularity.V1.Security
|
||
|
{
|
||
|
[CLSCompliant(false)]
|
||
|
public struct PrincipalHandle
|
||
|
{
|
||
|
public readonly ulong val;
|
||
|
|
||
|
internal PrincipalHandle(ulong val)
|
||
|
{
|
||
|
this.val = val;
|
||
|
}
|
||
|
|
||
|
[ExternalEntryPoint]
|
||
|
public static PrincipalHandle SelfPrincipalHandle()
|
||
|
{
|
||
|
return new PrincipalHandle(Thread.CurrentProcess.Principal.Val);
|
||
|
}
|
||
|
|
||
|
/* For the following routine, assume that the length of the output string
|
||
|
is nchars. If nchars is larger than outNameLength, this routine returns
|
||
|
-nchars without touching outName. Otherwise, the output string is copied
|
||
|
into outName, and nchars is returns. */
|
||
|
[ExternalEntryPoint]
|
||
|
public static unsafe int GetPrincipalNameImpl(PrincipalHandle handle,
|
||
|
/*[out]*/ char *outName, int outNameLength)
|
||
|
{
|
||
|
Principal p = PrincipalImpl.MakePrincipal(handle.val);
|
||
|
string name = p.GetName();
|
||
|
if (name.Length > outNameLength)
|
||
|
return (-name.Length);
|
||
|
return name.InternalGetChars(outName, outNameLength);
|
||
|
}
|
||
|
|
||
|
[ExternalEntryPoint]
|
||
|
public static unsafe int ExpandAclIndirectionImpl(/*[in]*/ char *name, int nameLength,
|
||
|
/*[out]*/ char *outText, int outTextLength)
|
||
|
{
|
||
|
if (name == null || nameLength == 0)
|
||
|
return 0;
|
||
|
|
||
|
string myname = String.StringCTOR(name, 0, nameLength);
|
||
|
string res = PrincipalImpl.ExpandAclIndirection(myname);
|
||
|
if (res == null || res.Length == 0)
|
||
|
return 0;
|
||
|
if (res.Length > outTextLength)
|
||
|
return (-res.Length);
|
||
|
return res.InternalGetChars(outText, outTextLength);
|
||
|
}
|
||
|
}
|
||
|
}
|