示例#1
0
 public RecycleBinManager(IMailServerManagementApi api)
 {
     this.m_pApi            = api;
     this.m_pTimer          = new Timer();
     this.m_pTimer.Interval = 3600000.0;
     this.m_pTimer.Elapsed += new ElapsedEventHandler(this.m_pTimer_Elapsed);
     this.m_pTimer.Enabled  = true;
     this.m_LastCleanTime   = DateTime.MinValue;
 }
示例#2
0
 public FetchPop3(VirtualServer server, IMailServerManagementApi api)
 {
     this.m_pServer         = server;
     this.m_pApi            = api;
     this.m_LastFetch       = DateTime.Now.AddMinutes(-5.0);
     this.m_pTimer          = new Timer();
     this.m_pTimer.Interval = 15000.0;
     this.m_pTimer.Elapsed += new ElapsedEventHandler(this.m_pTimer_Elapsed);
 }
示例#3
0
 public static void RestoreFromRecycleBin(string messageID, IMailServerManagementApi api)
 {
     using (FileStream file = RecycleBinManager.GetFile())
     {
         int num = 0;
         StreamLineReader streamLineReader = new StreamLineReader(file);
         long             position         = file.Position;
         for (string text = streamLineReader.ReadLineString(); text != null; text = streamLineReader.ReadLineString())
         {
             if (!text.StartsWith("#"))
             {
                 if (text.StartsWith("\0"))
                 {
                     num++;
                 }
                 else
                 {
                     string[] array = TextUtils.SplitQuotedString(text, ' ');
                     if (array[0] == messageID)
                     {
                         string text2 = array[2];
                         string text3 = TextUtils.UnQuoteString(array[3]);
                         using (FileStream fileStream = File.OpenRead(RecycleBinManager.m_RecycleBinPath + messageID + ".eml"))
                         {
                             if (!api.FolderExists(text2 + "/" + text3))
                             {
                                 api.CreateFolder("system", text2, text3);
                             }
                             api.StoreMessage("system", text2, text3, fileStream, DateTime.Now, new string[]
                             {
                                 "Recent"
                             });
                         }
                         byte[] array2 = new byte[file.Position - position - 2L];
                         file.Position = position;
                         file.Write(array2, 0, array2.Length);
                         file.Position += 2L;
                         num++;
                         File.Delete(RecycleBinManager.m_RecycleBinPath + messageID + ".eml");
                         break;
                     }
                 }
             }
             position = file.Position;
         }
         if (num > 500)
         {
             RecycleBinManager.Vacuum(file);
         }
     }
 }
示例#4
0
 internal void LoadVirtualServers()
 {
     try
     {
         DataSet dataSet = new DataSet();
         dataSet.Tables.Add("Servers");
         dataSet.Tables["Servers"].Columns.Add("ID");
         dataSet.Tables["Servers"].Columns.Add("Enabled");
         dataSet.Tables["Servers"].Columns.Add("Name");
         dataSet.Tables["Servers"].Columns.Add("API_assembly");
         dataSet.Tables["Servers"].Columns.Add("API_class");
         dataSet.Tables["Servers"].Columns.Add("API_initstring");
         this.ReadXmlSetting(dataSet, "LocalServers", "Servers");
         if (dataSet.Tables.Contains("Servers"))
         {
             for (int i = 0; i < this.m_pVirtualServers.Count; i++)
             {
                 VirtualServer virtualServer = this.m_pVirtualServers[i];
                 bool          flag          = false;
                 foreach (DataRow dataRow in dataSet.Tables["Servers"].Rows)
                 {
                     if (virtualServer.ID == dataRow["ID"].ToString())
                     {
                         flag = true;
                         break;
                     }
                 }
                 if (!flag)
                 {
                     virtualServer.Stop();
                     this.m_pVirtualServers.Remove(virtualServer);
                     i--;
                 }
             }
             foreach (DataRow dataRow2 in dataSet.Tables["Servers"].Rows)
             {
                 bool flag2 = false;
                 foreach (VirtualServer current in this.m_pVirtualServers)
                 {
                     if (current.ID == dataRow2["ID"].ToString())
                     {
                         flag2           = true;
                         current.Enabled = ConvertEx.ToBoolean(dataRow2["Enabled"], true);
                         break;
                     }
                 }
                 if (!flag2)
                 {
                     string id       = dataRow2["ID"].ToString();
                     string name     = dataRow2["Name"].ToString();
                     string assembly = dataRow2["API_assembly"].ToString();
                     string typeName = dataRow2["API_class"].ToString();
                     string text     = dataRow2["API_initstring"].ToString();
                     IMailServerManagementApi api            = this.LoadApi(assembly, typeName, text);
                     VirtualServer            virtualServer2 = new VirtualServer(this, id, name, text, api);
                     virtualServer2.Owner = this;
                     this.m_pVirtualServers.Add(virtualServer2);
                     virtualServer2.Enabled = ConvertEx.ToBoolean(dataRow2["Enabled"], true);
                 }
             }
         }
     }
     catch (Exception x)
     {
         Error.DumpError(x);
     }
 }
        public bool Filter(string from, IMailServerManagementApi api, SMTP_Session session, out string errorText)
        {
            errorText = null;
            bool result = true;

            if (session.IsAuthenticated || this.IsPrivateIP(session.RemoteEndPoint.Address))
            {
                return(true);
            }
            try
            {
                DataSet dataSet = new DataSet();
                dataSet.Tables.Add("General");
                dataSet.Tables["General"].Columns.Add("CheckHelo");
                dataSet.Tables["General"].Columns.Add("LogRejections");
                dataSet.Tables.Add("BlackListSettings");
                dataSet.Tables["BlackListSettings"].Columns.Add("ErrorText");
                dataSet.Tables.Add("BlackList");
                dataSet.Tables["BlackList"].Columns.Add("IP");
                dataSet.Tables.Add("Servers");
                dataSet.Tables["Servers"].Columns.Add("Cost");
                dataSet.Tables["Servers"].Columns.Add("Server");
                dataSet.Tables["Servers"].Columns.Add("DefaultRejectionText");
                dataSet.ReadXml(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\DnsBlackList.xml");
                bool flag = false;
                if (dataSet.Tables["General"].Rows.Count == 1)
                {
                    if (Convert.ToBoolean(dataSet.Tables["General"].Rows[0]["CheckHelo"]))
                    {
                        DnsServerResponse dnsServerResponse = Dns_Client.Static.Query(session.EhloHost, DNS_QType.A);
                        if (dnsServerResponse.ConnectionOk && dnsServerResponse.ResponseCode != DNS_RCode.SERVER_FAILURE)
                        {
                            bool       flag2    = false;
                            DNS_rr_A[] aRecords = dnsServerResponse.GetARecords();
                            for (int i = 0; i < aRecords.Length; i++)
                            {
                                DNS_rr_A dNS_rr_A = aRecords[i];
                                if (session.RemoteEndPoint.Address.Equals(dNS_rr_A.IP))
                                {
                                    flag2 = true;
                                    break;
                                }
                            }
                            if (!flag2)
                            {
                                errorText = "Not valid DNS EHLO/HELO name for your IP '" + session.EhloHost + "' !";
                                bool result2 = false;
                                return(result2);
                            }
                        }
                    }
                    flag = ConvertEx.ToBoolean(dataSet.Tables["General"].Rows[0]["LogRejections"]);
                }
                foreach (DataRow dataRow in dataSet.Tables["BlackList"].Rows)
                {
                    if (this.IsAstericMatch(dataRow["IP"].ToString(), session.RemoteEndPoint.Address.ToString()))
                    {
                        errorText = dataSet.Tables["BlackListSettings"].Rows[0]["ErrorText"].ToString();
                        bool result2 = false;
                        return(result2);
                    }
                }
                foreach (DataRow dataRow2 in dataSet.Tables["Servers"].Rows)
                {
                    DnsServerResponse dnsServerResponse2 = Dns_Client.Static.Query(this.ReverseIP(session.RemoteEndPoint.Address) + "." + dataRow2["Server"].ToString(), DNS_QType.ANY);
                    DNS_rr_A[]        aRecords2          = dnsServerResponse2.GetARecords();
                    if (aRecords2.Length > 0)
                    {
                        if (flag)
                        {
                            this.WriteFilterLog(string.Concat(new string[]
                            {
                                "Sender:",
                                from,
                                " IP:",
                                session.RemoteEndPoint.Address.ToString(),
                                " blocked\r\n"
                            }));
                        }
                        errorText = dataRow2["DefaultRejectionText"].ToString();
                        if (dnsServerResponse2.GetTXTRecords().Length > 0)
                        {
                            errorText = dnsServerResponse2.GetTXTRecords()[0].Text;
                        }
                        if (errorText == "")
                        {
                            errorText = "You are in '" + dataRow2["Server"].ToString() + "' rejection list !";
                        }
                        bool result2 = false;
                        return(result2);
                    }
                }
            }
            catch
            {
            }
            return(result);
        }
示例#6
0
        public FilterResult Filter(Stream messageStream, out Stream filteredStream, string sender, string[] recipients, IMailServerManagementApi api, SMTP_Session session, out string errorText)
        {
            errorText      = null;
            filteredStream = null;
            string text = PathHelper.PathFix(Path.GetTempPath() + "\\" + Guid.NewGuid().ToString() + ".eml");

            try
            {
                using (FileStream fileStream = File.Create(text))
                {
                    byte[] array = new byte[messageStream.Length];
                    messageStream.Read(array, 0, array.Length);
                    fileStream.Write(array, 0, array.Length);
                }
                DataSet dataSet = new DataSet();
                dataSet.Tables.Add("Settings");
                dataSet.Tables["Settings"].Columns.Add("Program");
                dataSet.Tables["Settings"].Columns.Add("Arguments");
                dataSet.Tables["Settings"].Columns.Add("VirusExitCode");
                dataSet.ReadXml(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\VirusScan.xml");
                string  fileName  = dataSet.Tables["Settings"].Rows[0]["Program"].ToString();
                string  arguments = dataSet.Tables["Settings"].Rows[0]["Arguments"].ToString().Replace("#FileName", text);
                int     num       = ConvertEx.ToInt32(dataSet.Tables["Settings"].Rows[0]["Program"], 1);
                int     num2      = 0;
                Process process   = Process.Start(new ProcessStartInfo(fileName, arguments)
                {
                    CreateNoWindow  = true,
                    UseShellExecute = false
                });
                if (process != null)
                {
                    process.WaitForExit(60000);
                    num2 = process.ExitCode;
                }
                if (File.Exists(text))
                {
                    using (FileStream fileStream2 = File.OpenRead(text))
                    {
                        byte[] array2 = new byte[fileStream2.Length];
                        fileStream2.Read(array2, 0, array2.Length);
                        filteredStream = new MemoryStream(array2);
                    }
                    File.Delete(text);
                }
                else
                {
                    num = num2;
                }
                if (num == num2)
                {
                    errorText = "Message is blocked, contains virus !";
                    return(FilterResult.Error);
                }
            }
            catch (Exception ex)
            {
                string arg_243_0 = ex.Message;
                filteredStream = messageStream;
            }
            finally
            {
                if (File.Exists(text))
                {
                    File.Delete(text);
                }
            }
            return(FilterResult.Store);
        }