Click here to Skip to main content
15,896,201 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 323.3K   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.Data;

using LumiSoft.Net;

namespace LumiSoft.MailServer.API.UserAPI
{
    /// <summary>
    /// The MailingListAclCollection object represents mailing list access list in mailing list.
    /// </summary>
    public class MailingListAclCollection
    {
        private MailingList  m_pMailingList = null;
        private List<string> m_pAcl         = null;

        /// <summary>
        /// Default constructor.
        /// </summary>
        /// <param name="mailingList">Owner mailing list.</param>
        internal MailingListAclCollection(MailingList mailingList)
        {
            m_pMailingList = mailingList;
            m_pAcl         = new List<string>();

            Bind();
        }


        #region method Add

        /// <summary>
        /// Adds specified ACL entry to mailing list.
        /// </summary>
        /// <param name="userOrGroup">User or group.</param>
        public void Add(string userOrGroup)
        {
            /* AddMailingListAcl <virtualServerID> "<mailingListID>" "<userOrGroup>"
                  Responses:
                    +OK                     
                    -ERR <errorText>
            */

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

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

            m_pAcl.Add(userOrGroup);
        }

        #endregion

        #region method Remove

        /// <summary>
        /// Deletes specified ACL entry from mailing list.
        /// </summary>
        /// <param name="userOrGroup">User or group.</param>
        public void Remove(string userOrGroup)
        {
            /* DeleteMailingListAcl <virtualServerID> "<mailingListID>" "<userOrGroup>"
                  Responses:
                    +OK                     
                    -ERR <errorText>
            */

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

            // Call TCP AddMailingListMember
            m_pMailingList.VirtualServer.Server.Socket.WriteLine("DeleteMailingListAcl " + m_pMailingList.VirtualServer.VirtualServerID + " " + TextUtils.QuoteString(m_pMailingList.ID) + " " + TextUtils.QuoteString(userOrGroup));
                        
            string response = m_pMailingList.VirtualServer.Server.Socket.ReadLine();
            if(!response.ToUpper().StartsWith("+OK")){
                throw new Exception(response);
            }

            m_pAcl.Remove(userOrGroup);
        }

        #endregion


        #region method Bind

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

            lock(m_pMailingList.VirtualServer.Server.LockSynchronizer){
                // Call TCP GetMailingListAcl
                m_pMailingList.VirtualServer.Server.Socket.WriteLine("GetMailingListAcl " + m_pMailingList.VirtualServer.VirtualServerID + " " + m_pMailingList.ID);

                string response = m_pMailingList.VirtualServer.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_pMailingList.VirtualServer.Server.Socket.ReadSpecifiedLength(sizeOfData,ms);
                
                // Decompress dataset
                DataSet ds = Utils.DecompressDataSet(ms);
                
                if(ds.Tables.Contains("ACL")){
                    if(ds.Tables.Contains("ACL")){
                        foreach(DataRow dr in ds.Tables["ACL"].Rows){
                            m_pAcl.Add(dr["UserOrGroup"].ToString());
                        }
                    }
                }
            }
        }

        #endregion


        #region interface IEnumerator

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

		#endregion


        #region Properties Implementation

        /// <summary>
        /// Gets number of ACL entries on that mailing list.
        /// </summary>
        public int Count
        {
            get{ return m_pAcl.Count; }
        }
        
        /// <summary>
        /// Gets a ACL entry in the collection by index number.
        /// </summary>
        /// <param name="index">An Int32 value that specifies the position of the ACL entry in the MailingListAclCollection collection.</param>
        /// <returns></returns>
        public string this[int index]
        {
            get{ return m_pAcl[index]; }
        }

        /// <summary>
        /// Gets a ACL entry in the collection by ACL entry name.
        /// </summary>
        /// <param name="aclEntry">A String value that specifies the ACL entry name in the MailingListAclCollection collection.</param>
        /// <returns></returns>
        public string this[string aclEntry]
        {
            get{  
                foreach(string m in m_pAcl){
                    if(m.ToLower() == aclEntry.ToLower()){
                        return m;
                    }
                }

                throw new Exception("Mailing list ACL entry '" + aclEntry + "' 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