Ejemplo n.º 1
0
 public void StartFetching()
 {
     if (this.m_Fetching)
     {
         return;
     }
     this.m_Fetching = true;
     try
     {
         DataView users = this.m_pApi.GetUsers("ALL");
         using (DataView userRemoteServers = this.m_pApi.GetUserRemoteServers(""))
         {
             foreach (DataRowView dataRowView in userRemoteServers)
             {
                 try
                 {
                     if (ConvertEx.ToBoolean(dataRowView["Enabled"]))
                     {
                         users.RowFilter = "UserID='" + dataRowView["UserID"] + "'";
                         if (users.Count > 0)
                         {
                             string userName = users[0]["UserName"].ToString();
                             string host     = dataRowView.Row["RemoteServer"].ToString();
                             int    port     = Convert.ToInt32(dataRowView.Row["RemotePort"]);
                             string user     = dataRowView.Row["RemoteUserName"].ToString();
                             string password = dataRowView.Row["RemotePassword"].ToString();
                             bool   ssl      = ConvertEx.ToBoolean(dataRowView["UseSSL"]);
                             using (POP3_Client pOP3_Client = new POP3_Client())
                             {
                                 pOP3_Client.Logger           = new System.NetworkToolkit.Log.Logger();
                                 pOP3_Client.Logger.WriteLog += new EventHandler <WriteLogEventArgs>(this.Pop3_WriteLog);
                                 pOP3_Client.Connect(host, port, ssl);
                                 pOP3_Client.Login(user, password);
                                 foreach (POP3_ClientMessage pOP3_ClientMessage in pOP3_Client.Messages)
                                 {
                                     this.m_pServer.ProcessUserMsg("", "", userName, "Inbox", new MemoryStream(pOP3_ClientMessage.MessageToByte()), null);
                                     pOP3_ClientMessage.MarkForDeletion();
                                 }
                             }
                         }
                     }
                 }
                 catch
                 {
                 }
             }
         }
         this.m_LastFetch = DateTime.Now;
     }
     catch (Exception x)
     {
         Error.DumpError(this.m_pServer.Name, x);
     }
     this.m_Fetching = false;
 }
Ejemplo n.º 2
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);
        }
Ejemplo n.º 4
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);
        }