Click here to Skip to main content
15,892,965 members
Articles / Programming Languages / C#

LumiSoft MailServer

Rate me:
Please Sign up or sign in to vote.
3.79/5 (22 votes)
17 Nov 2006CPOL1 min read 323K   4.9K   74  
Full featured SMTP/POP3/IMAP server
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Data;

using LumiSoft.Net;

namespace LumiSoft.MailServer.API.UserAPI
{
    /// <summary>
    /// The IPSecurityCollection object represents IP security entries in LumiSoft Mail Server virtual server.
    /// </summary>
    public class IPSecurityCollection : IEnumerable
    {
        private VirtualServer    m_pVirtualServer = null;
        private List<IPSecurity> m_pEntries       = null;

        /// <summary>
        /// Default constructor.
        /// </summary>
        /// <param name="virtualServer">Owner virtual server.</param>
        internal IPSecurityCollection(VirtualServer virtualServer)
        {
            m_pVirtualServer = virtualServer;
            m_pEntries       = new List<IPSecurity>();

            Bind();
        }


        #region method Add

        /// <summary>
        /// Adds new security enrty to collection.
        /// </summary>
        /// <param name="enabled">Specifies if security entry is enabled.</param>
        /// <param name="description">Security entry description text.</param>
        /// <param name="service">Specifies service for what security entry applies.</param>
        /// <param name="action">Specifies what action done if IP matches to security entry range.</param>
        /// <param name="startIP">Range start IP.</param>
        /// <param name="endIP">Range end IP.</param>
        /// <returns></returns>
        public IPSecurity Add(bool enabled,string description,Service_enum service,IPSecurityAction_enum action,IPAddress startIP,IPAddress endIP)
        {
            /* AddIPSecurityEntry <virtualServerID> "<securityEntryID>" enabled "<description>" <service> <action> "<startIP>" "<endIP>"
                  Responses:
                    +OK                     
                    -ERR <errorText>
            */

            string id = Guid.NewGuid().ToString();

            // Call TCP AddIPSecurityEntry
            m_pVirtualServer.Server.Socket.WriteLine("AddIPSecurityEntry " + 
                m_pVirtualServer.VirtualServerID + " " + 
                TextUtils.QuoteString(id) + " " + 
                enabled + " " + 
                TextUtils.QuoteString(description) + " " +
                (int)service + " " +
                (int)action + " " +
                TextUtils.QuoteString(startIP.ToString()) + " " +
                TextUtils.QuoteString(endIP.ToString())
            );
                        
            string response = m_pVirtualServer.Server.Socket.ReadLine();
            if(!response.ToUpper().StartsWith("+OK")){
                throw new Exception(response);
            }

            IPSecurity entry = new IPSecurity(
                this,
                id,
                enabled,
                description,
                service,
                action,
                startIP,
                endIP
            );
            m_pEntries.Add(entry);

            return entry;
        }

        #endregion

        #region method Remove

        /// <summary>
        /// Deletes and removes specified security entry from collection.
        /// </summary>
        /// <param name="entry"></param>
        public void Remove(IPSecurity entry)
        {
            /* DeleteIPSecurityEntry <virtualServerID> "<securityEntryID>"
                  Responses:
                    +OK                     
                    -ERR <errorText>
            */

            string id = Guid.NewGuid().ToString();

            // Call TCP DeleteIPSecurityEntry
            m_pVirtualServer.Server.Socket.WriteLine("DeleteIPSecurityEntry " + m_pVirtualServer.VirtualServerID + " " + TextUtils.QuoteString(entry.ID));
                        
            string response = m_pVirtualServer.Server.Socket.ReadLine();
            if(!response.ToUpper().StartsWith("+OK")){
                throw new Exception(response);
            }

            m_pEntries.Remove(entry);
        }

        #endregion

        #region method ToArray

        /// <summary>
        /// Copies collection to array.
        /// </summary>
        /// <returns></returns>
        public IPSecurity[] ToArray()
        {
            return m_pEntries.ToArray();
        }

        #endregion

        #region method Refresh

        /// <summary>
        /// Refreshes IP security entries.
        /// </summary>
        public void Refresh()
        {
            m_pEntries.Clear();
            Bind();
        }

        #endregion


        #region method Bind

        /// <summary>
        /// Gets server mailing list members and binds them to this, if not binded already.
        /// </summary>
        private void Bind()
        {
            /* GetIPSecurity <virtualServerID>
                  Responses:
                    +OK <sizeOfData>
                    <data>
                    
                    + ERR <errorText>
            */

            lock(m_pVirtualServer.Server.LockSynchronizer){
                // Call TCP GetIPSecurity
                m_pVirtualServer.Server.Socket.WriteLine("GetIPSecurity " + m_pVirtualServer.VirtualServerID);
                            
                string response = m_pVirtualServer.Server.Socket.ReadLine();
                if(!response.ToUpper().StartsWith("+OK")){
                    throw new Exception(response);
                }

                int sizeOfData = Convert.ToInt32(response.Split(new char[]{' '},2)[1]);
                MemoryStream ms = new MemoryStream();
                m_pVirtualServer.Server.Socket.ReadSpecifiedLength(sizeOfData,ms);
                
                // Decompress dataset
                DataSet ds = Utils.DecompressDataSet(ms);
                
                if(ds.Tables.Contains("IPSecurity")){
                    foreach(DataRow dr in ds.Tables["IPSecurity"].Rows){
                        m_pEntries.Add(new IPSecurity(
                            this,
                            dr["ID"].ToString(),
                            Convert.ToBoolean(dr["Enabled"]),
                            dr["Description"].ToString(),
                            (Service_enum)Convert.ToInt32(dr["Service"]),
                            (IPSecurityAction_enum)Convert.ToInt32(dr["Action"]),
                            IPAddress.Parse(dr["StartIP"].ToString()),
                            IPAddress.Parse(dr["EndIP"].ToString())
                        ));
                    }
                }
            }
        }

        #endregion


        #region interface IEnumerator

        /// <summary>
		/// Gets enumerator.
		/// </summary>
		/// <returns></returns>
		public IEnumerator GetEnumerator()
		{
			return m_pEntries.GetEnumerator();
		}

		#endregion


        #region Properties Implementation

        /// <summary>
        /// Gets the VirtualServer object that is the owner of this collection.
        /// </summary>
        public VirtualServer VirtualServer
        {
            get{ return m_pVirtualServer; }
        }

        /// <summary>
        /// Gets number of IP security entries in virtual server.
        /// </summary>
        public int Count
        {
            get{ return m_pEntries.Count; }
        }

        /// <summary>
        /// Gets a IPSecurity object in the collection by index number.
        /// </summary>
        /// <param name="index">An Int32 value that specifies the position of the IPSecurity object in the IPSecurityCollection collection.</param>
        /// <returns>A IPSecurity object value that represents the filter in virtual server.</returns>
        public IPSecurity this[int index]
        {
            get{ return m_pEntries[index]; }
        }

        /// <summary>
        /// Gets a IPSecurity object in the collection by filter ID.
        /// </summary>
        /// <param name="securityEntryID">A String value that specifies the IP security entry ID of the IPSecurity object in the IPSecurityCollection collection.</param>
        /// <returns>A IPSecurity object value that represents the filter in virtual server.</returns>
        public IPSecurity this[string securityEntryID]
        {
            get{ 
                foreach(IPSecurity securityEntry in m_pEntries){
                    if(securityEntry.ID.ToLower() == securityEntryID.ToLower()){
                        return securityEntry;
                    }
                }

                throw new Exception("IPSecurity with specified ID '" + securityEntryID + "' doesn't exist !"); 
            }
        }

        #endregion

    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Estonia Estonia
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions