162 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| namespace Unosquare.Swan.Networking
 | |
| {
 | |
|     using System.Collections.Generic;
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Represents the state of an SMTP session associated with a client.
 | |
|     /// </summary>
 | |
|     public class SmtpSessionState
 | |
|     {
 | |
|         #region Constructors
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Initializes a new instance of the <see cref="SmtpSessionState"/> class.
 | |
|         /// </summary>
 | |
|         public SmtpSessionState()
 | |
|         {
 | |
|             DataBuffer = new List<byte>();
 | |
|             Reset(true);
 | |
|             ResetAuthentication();
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region Properties
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets the contents of the data buffer.
 | |
|         /// </summary>
 | |
|         public List<byte> DataBuffer { get; protected set; }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets a value indicating whether this instance has initiated.
 | |
|         /// </summary>
 | |
|         public bool HasInitiated { get; set; }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets a value indicating whether the current session supports extensions.
 | |
|         /// </summary>
 | |
|         public bool SupportsExtensions { get; set; }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets the client hostname.
 | |
|         /// </summary>
 | |
|         public string ClientHostname { get; set; }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets a value indicating whether the session is currently receiving DATA.
 | |
|         /// </summary>
 | |
|         public bool IsInDataMode { get; set; }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets the sender address.
 | |
|         /// </summary>
 | |
|         public string SenderAddress { get; set; }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets the recipients.
 | |
|         /// </summary>
 | |
|         public List<string> Recipients { get; } = new List<string>();
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets the extended data supporting any additional field for storage by a responder implementation.
 | |
|         /// </summary>
 | |
|         public object ExtendedData { get; set; }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region AUTH State
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets a value indicating whether this instance is in authentication mode.
 | |
|         /// </summary>
 | |
|         public bool IsInAuthMode { get; set; }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets the username.
 | |
|         /// </summary>
 | |
|         public string Username { get; set; }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets the password.
 | |
|         /// </summary>
 | |
|         public string Password { get; set; }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets a value indicating whether this instance has provided username.
 | |
|         /// </summary>
 | |
|         public bool HasProvidedUsername => string.IsNullOrWhiteSpace(Username) == false;
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets a value indicating whether this instance is authenticated.
 | |
|         /// </summary>
 | |
|         public bool IsAuthenticated { get; set; }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets the authentication mode.
 | |
|         /// </summary>
 | |
|         public string AuthMode { get; set; }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets a value indicating whether this instance is channel secure.
 | |
|         /// </summary>
 | |
|         public bool IsChannelSecure { get; set; }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Resets the authentication state.
 | |
|         /// </summary>
 | |
|         public void ResetAuthentication()
 | |
|         {
 | |
|             Username = string.Empty;
 | |
|             Password = string.Empty;
 | |
|             AuthMode = string.Empty;
 | |
|             IsInAuthMode = false;
 | |
|             IsAuthenticated = false;
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region Methods
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Resets the data mode to false, clears the recipients, the sender address and the data buffer.
 | |
|         /// </summary>
 | |
|         public void ResetEmail()
 | |
|         {
 | |
|             IsInDataMode = false;
 | |
|             Recipients.Clear();
 | |
|             SenderAddress = string.Empty;
 | |
|             DataBuffer.Clear();
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Resets the state table entirely.
 | |
|         /// </summary>
 | |
|         /// <param name="clearExtensionData">if set to <c>true</c> [clear extension data].</param>
 | |
|         public void Reset(bool clearExtensionData)
 | |
|         {
 | |
|             HasInitiated = false;
 | |
|             SupportsExtensions = false;
 | |
|             ClientHostname = string.Empty;
 | |
|             ResetEmail();
 | |
| 
 | |
|             if (clearExtensionData)
 | |
|                 ExtendedData = null;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Creates a new object that is a copy of the current instance.
 | |
|         /// </summary>
 | |
|         /// <returns>A clone.</returns>
 | |
|         public virtual SmtpSessionState Clone()
 | |
|         {
 | |
|             var clonedState = this.CopyPropertiesToNew<SmtpSessionState>(new[] {nameof(DataBuffer)});
 | |
|             clonedState.DataBuffer.AddRange(DataBuffer);
 | |
|             clonedState.Recipients.AddRange(Recipients);
 | |
| 
 | |
|             return clonedState;
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
|     }
 | |
| } |