Added rough support for attaching messages to errors.
This commit is contained in:
60
NSspi/EnumMgr.cs
Normal file
60
NSspi/EnumMgr.cs
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace NSspi
|
||||||
|
{
|
||||||
|
[AttributeUsage( AttributeTargets.Enum )]
|
||||||
|
public class EnumStringAttribute : Attribute
|
||||||
|
{
|
||||||
|
public EnumStringAttribute( string text )
|
||||||
|
{
|
||||||
|
this.Text = text;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Text { get; private set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class EnumMgr
|
||||||
|
{
|
||||||
|
public static string Text( Enum value )
|
||||||
|
{
|
||||||
|
FieldInfo field = value.GetType().GetField( value.ToString() );
|
||||||
|
|
||||||
|
EnumStringAttribute[] attribs = (EnumStringAttribute[])field.GetCustomAttributes( typeof( EnumStringAttribute ), false );
|
||||||
|
|
||||||
|
if( attribs == null || attribs.Length == 0 )
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return attribs[0].Text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static T Enum<T>( string text )
|
||||||
|
{
|
||||||
|
FieldInfo[] fields = typeof( T ).GetFields();
|
||||||
|
|
||||||
|
EnumStringAttribute[] attribs;
|
||||||
|
|
||||||
|
foreach( FieldInfo field in fields )
|
||||||
|
{
|
||||||
|
attribs = (EnumStringAttribute[])field.GetCustomAttributes( typeof( EnumStringAttribute ), false );
|
||||||
|
|
||||||
|
foreach( EnumStringAttribute attrib in attribs )
|
||||||
|
{
|
||||||
|
if( attrib.Text == text )
|
||||||
|
{
|
||||||
|
return (T)field.GetValue( null );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new ArgumentException( "Could not find a matching enumeration value for the text '" + text + "'." );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -59,6 +59,7 @@
|
|||||||
<Compile Include="Contexts\ImpersonationHandle.cs" />
|
<Compile Include="Contexts\ImpersonationHandle.cs" />
|
||||||
<Compile Include="Contexts\SafeContextHandle.cs" />
|
<Compile Include="Contexts\SafeContextHandle.cs" />
|
||||||
<Compile Include="Credentials\CurrentCredential.cs" />
|
<Compile Include="Credentials\CurrentCredential.cs" />
|
||||||
|
<Compile Include="EnumMgr.cs" />
|
||||||
<Compile Include="SecPkgInfo.cs" />
|
<Compile Include="SecPkgInfo.cs" />
|
||||||
<Compile Include="Contexts\ServerContext.cs" />
|
<Compile Include="Contexts\ServerContext.cs" />
|
||||||
<Compile Include="Credentials\ClientCredential.cs" />
|
<Compile Include="Credentials\ClientCredential.cs" />
|
||||||
|
|||||||
@@ -70,7 +70,12 @@ namespace NSspi
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return string.Format( "{0}. Error Code = '{1:X}'.", this.message, this.errorCode );
|
return string.Format(
|
||||||
|
"{0}. Error Code = '{1:X}' - \"{2}\".",
|
||||||
|
this.message,
|
||||||
|
this.errorCode,
|
||||||
|
EnumMgr.Text(this.errorCode)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,56 +30,100 @@ namespace NSspi
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The request completed successfully
|
/// The request completed successfully
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[EnumString( "No error" )]
|
||||||
OK = 0x00000000,
|
OK = 0x00000000,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The token returned by the context needs to be provided to the cooperating party
|
/// The token returned by the context needs to be provided to the cooperating party
|
||||||
/// to continue construction of the context.
|
/// to continue construction of the context.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
ContinueNeeded = 0x00090312,
|
[EnumString( "Authentication cycle needs to continue" )]
|
||||||
|
ContinueNeeded = 0x00090312,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Occurs after a client calls InitializeSecurityContext to indicate that the client
|
/// Occurs after a client calls InitializeSecurityContext to indicate that the client
|
||||||
/// must call CompleteAuthToken.
|
/// must call CompleteAuthToken.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[EnumString( "Authentication cycle needs to perform a 'complete'." )]
|
||||||
CompleteNeeded = 0x00090313,
|
CompleteNeeded = 0x00090313,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Occurs after a client calls InitializeSecurityContext to indicate that the client
|
/// Occurs after a client calls InitializeSecurityContext to indicate that the client
|
||||||
/// must call CompleteAuthToken and pass the result to the server.
|
/// must call CompleteAuthToken and pass the result to the server.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
CompAndContinue = 0x00090314,
|
[EnumString( "Authentication cycle needs to perform a 'complete' and then continue." )]
|
||||||
|
CompAndContinue = 0x00090314,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// An attempt to use the context was performed after the context's expiration time elapsed.
|
/// An attempt to use the context was performed after the context's expiration time elapsed.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
ContextExpired = 0x00090317,
|
[EnumString( "The security context was used after its expiration time passed." )]
|
||||||
CredentialsNeeded = 0x00090320,
|
ContextExpired = 0x00090317,
|
||||||
|
|
||||||
|
[EnumString( "The credentials supplied to the security context were not fully initialized." )]
|
||||||
|
CredentialsNeeded = 0x00090320,
|
||||||
|
|
||||||
|
[EnumString( "The context data must be re-negotiated with the peer" )]
|
||||||
Renegotiate = 0x00090321,
|
Renegotiate = 0x00090321,
|
||||||
|
|
||||||
// Errors
|
// Errors
|
||||||
|
[EnumString( "Not enough memory.")]
|
||||||
OutOfMemory = 0x80090300,
|
OutOfMemory = 0x80090300,
|
||||||
|
|
||||||
|
[EnumString( "The handle provided to the API was invalid.")]
|
||||||
InvalidHandle = 0x80090301,
|
InvalidHandle = 0x80090301,
|
||||||
|
|
||||||
|
[EnumString( "The attempted operation is not supported")]
|
||||||
Unsupported = 0x80090302,
|
Unsupported = 0x80090302,
|
||||||
|
|
||||||
|
[EnumString( "The specified principle is not known in the authentication system.")]
|
||||||
TargetUnknown = 0x80090303,
|
TargetUnknown = 0x80090303,
|
||||||
|
|
||||||
|
[EnumString( "An internal error occurred" )]
|
||||||
InternalError = 0x80090304,
|
InternalError = 0x80090304,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// No security provider package was found with the given name.
|
/// No security provider package was found with the given name.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[EnumString( "The requested security package was not found.")]
|
||||||
PackageNotFound = 0x80090305,
|
PackageNotFound = 0x80090305,
|
||||||
|
|
||||||
NotOwner = 0x80090306,
|
NotOwner = 0x80090306,
|
||||||
CannotInstall = 0x80090307,
|
CannotInstall = 0x80090307,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A token was provided that contained incorrect or corrupted data.
|
||||||
|
/// </summary>
|
||||||
|
[EnumString("The provided authentication token is invalid or corrupted.")]
|
||||||
InvalidToken = 0x80090308,
|
InvalidToken = 0x80090308,
|
||||||
|
|
||||||
CannotPack = 0x80090309,
|
CannotPack = 0x80090309,
|
||||||
QopNotSupported = 0x8009030A,
|
QopNotSupported = 0x8009030A,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Impersonation is not supported.
|
||||||
|
/// </summary>
|
||||||
|
[EnumString("Impersonation is not supported with the current security package.")]
|
||||||
NoImpersonation = 0x8009030B,
|
NoImpersonation = 0x8009030B,
|
||||||
|
|
||||||
|
[EnumString("The logon was denied, perhaps because the provided credentials were incorrect.")]
|
||||||
LogonDenied = 0x8009030C,
|
LogonDenied = 0x8009030C,
|
||||||
|
|
||||||
|
|
||||||
|
[EnumString( "The credentials provided are not recognized by the selected security package.")]
|
||||||
UnknownCredentials = 0x8009030D,
|
UnknownCredentials = 0x8009030D,
|
||||||
|
|
||||||
|
[EnumString( "No credentials are available in the selected security package.")]
|
||||||
NoCredentials = 0x8009030E,
|
NoCredentials = 0x8009030E,
|
||||||
|
|
||||||
|
[EnumString( "A message that was provided to the Decrypt or VerifySignature functions was altered " +
|
||||||
|
"after it was created.")]
|
||||||
MessageAltered = 0x8009030F,
|
MessageAltered = 0x8009030F,
|
||||||
|
|
||||||
|
[EnumString( "A message was received out of the expected order.")]
|
||||||
OutOfSequence = 0x80090310,
|
OutOfSequence = 0x80090310,
|
||||||
|
|
||||||
|
[EnumString( "The current security package cannot contact an authenticating authority.")]
|
||||||
NoAuthenticatingAuthority = 0x80090311,
|
NoAuthenticatingAuthority = 0x80090311,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -9,6 +9,9 @@ namespace NSspi
|
|||||||
{
|
{
|
||||||
public static void Main( string[] args )
|
public static void Main( string[] args )
|
||||||
{
|
{
|
||||||
|
EnumMgr.Text( SecurityStatus.AlgorithmMismatch );
|
||||||
|
return;
|
||||||
|
|
||||||
CredTest( PackageNames.Negotiate );
|
CredTest( PackageNames.Negotiate );
|
||||||
CredTest( PackageNames.Kerberos );
|
CredTest( PackageNames.Kerberos );
|
||||||
CredTest( PackageNames.Ntlm );
|
CredTest( PackageNames.Ntlm );
|
||||||
|
|||||||
Reference in New Issue
Block a user