using System;
using Renci.SshNet.Common;
namespace Renci.SshNet.Messages.Authentication
{
///
/// Represents SSH_MSG_USERAUTH_REQUEST message. Server as a base message for other user authentication requests.
///
[Message("SSH_MSG_USERAUTH_REQUEST", AuthenticationMessageCode)]
public abstract class RequestMessage : Message
{
///
/// Returns the authentication message code for SSH_MSG_USERAUTH_REQUEST.
///
internal const int AuthenticationMessageCode = 50;
private readonly byte[] _serviceName;
private readonly byte[] _userName;
private readonly byte[] _methodNameBytes;
private readonly string _methodName;
///
/// Gets authentication username as UTF-8 encoded byte array.
///
public byte[] Username
{
get { return _userName; }
}
///
/// Gets the name of the service as ASCII encoded byte array.
///
///
/// The name of the service.
///
public byte[] ServiceName
{
get { return _serviceName; }
}
///
/// Gets the name of the authentication method.
///
///
/// The name of the method.
///
public virtual string MethodName
{
get { return _methodName; }
}
///
/// Gets the size of the message in bytes.
///
///
/// The size of the messages in bytes.
///
protected override int BufferCapacity
{
get
{
var capacity = base.BufferCapacity;
capacity += 4; // Username length
capacity += Username.Length; // Username
capacity += 4; // ServiceName length
capacity += ServiceName.Length; // ServiceName
capacity += 4; // MethodName length
capacity += _methodNameBytes.Length; // MethodName
return capacity;
}
}
///
/// Initializes a new instance of the class.
///
/// Name of the service.
/// Authentication username.
/// The name of the authentication method.
protected RequestMessage(ServiceName serviceName, string username, string methodName)
{
_serviceName = serviceName.ToArray();
_userName = Utf8.GetBytes(username);
_methodNameBytes = Ascii.GetBytes(methodName);
_methodName = methodName;
}
///
/// Called when type specific data need to be loaded.
///
protected override void LoadData()
{
throw new InvalidOperationException("Load data is not supported.");
}
///
/// Called when type specific data need to be saved.
///
protected override void SaveData()
{
WriteBinaryString(_userName);
WriteBinaryString(_serviceName);
WriteBinaryString(_methodNameBytes);
}
internal override void Process(Session session)
{
throw new NotImplementedException();
}
}
}