Exemplo n.º 1
0
        /// <summary>
        /// Insert new or update existing row
        /// </summary>
        /// <param name="data"></param>
        /// <param name="status"></param>
        private void UpdateDatabase(ClamWinScan.FilterNotifyData data, string status)
        {
            int    result  = 0;
            string command = "SELECT * FROM FilterNotifications WHERE Path = '" + data.FileName + "'";

            command += " AND Message = '" + data.Message + "' AND Time = '" + data.Time.ToBinary().ToString() + "';";

            ArrayList items;

            ClamWinDatabase.ExecReader(command, out items);

            if (items.Count == 0)
            {
                // Insert new item
                command  = "INSERT INTO FilterNotifications(Path,Message,Status,Time) VALUES(";
                command += "'" + data.FileName + "',";
                command += "'" + data.Message + "',";
                command += "'" + status + "',";
                command += "'" + data.Time.ToBinary().ToString() + "');";
                ClamWinDatabase.ExecCommand(command, out result);
            }
            else
            {
                // Update existing
                command  = "UPDATE FilterNotifications SET Status = '" + status;
                command += "' WHERE Path = '" + data.FileName + "' AND Message = '" + data.Message + "'";
                command += " AND Time = '" + data.Time.ToBinary().ToString() + "';";
                ClamWinDatabase.ExecCommand(command, out result);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Saves file info to database and removes file
        /// </summary>
        /// <param name="FileName"></param>
        /// <returns></returns>
        private static bool PostCompressProcessing(string FileName, string QuarantineName)
        {
            long Size = 0;

            try
            {
                FileInfo fi = new FileInfo(QuarantineName);
                if (!fi.Exists)
                {
                    return(false);
                }

                fi = new FileInfo(FileName);

                if (!fi.Exists)
                {
                    return(false);
                }

                Size = fi.Length;
            }
            catch
            {
                return(false);
            }

            string command = "INSERT INTO QuarantineItems(InitialPath,QuarantinePath,QuarantineTime,Size) VALUES(";

            command += "'" + FileName + "',";
            command += "'" + QuarantineName + "',";
            command += "'" + DateTime.Now.ToBinary().ToString() + "',";
            command += "'" + Size.ToString() + "');";

            int result;

            ClamWinDatabase.ExecCommand(command, out result);

            // Let we ensure record has been inserted successfully
            command = "SELECT * FROM QuarantineItems WHERE InitialPath='" + FileName + "';";
            ArrayList list;

            if (ClamWinDatabase.ExecReader(command, out list))
            {
                if (list.Count != 0)
                {
                    RemoveFile(FileName);
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            else
            {
                return(false);
            }
        }
        /// <summary>
        /// Add new notifcation
        /// </summary>
        public static int AddNotification(string message, NotificationCodes code, NotificationType type)
        {
            lock (MainLocker)
            {
                for (int i = 0; i < Notifications.Count; i++)
                {
                    NotificationData item = (NotificationData)Notifications[i];
                    if (code == item.Code)
                    {
                        //Already exist
                        CurrentNotification = i;
                        PostCurrentChanged();

                        return(-1);
                    }
                }
                NotificationData data = new NotificationData();
                data.Message = message;
                data.Code    = code;
                data.Type    = type;
                data.Time    = DateTime.Now;

                string command = "INSERT INTO MainFormNotifications(Message,Code,Type,Time) VALUES(";
                command += "'" + data.Message + "',";
                command += "'" + ((int)data.Code).ToString() + "',";
                command += "'" + ((int)data.Type).ToString() + "',";
                command += "'" + data.Time.ToBinary().ToString() + "');";

                int result;
                ClamWinDatabase.ExecCommand(command, out result);

                command = "SELECT * FROM MainFormNotifications WHERE Time=(SELECT max(Time) FROM MainFormNotifications);";

                ArrayList Items;
                if (!ClamWinDatabase.ExecReader(command, out Items))
                {
                    return(-1);
                }
                else if (Items.Count == 0)
                {
                    return(-1);
                }

                data.ID = int.Parse((string)Items[0]);

                Notifications.Add(data);

                CurrentNotification = Notifications.Count - 1;

                PostCurrentChanged();

                return(data.ID);
            }
        }
        /// <summary>
        /// Opens notifications
        /// </summary>
        public static bool Open(IntPtr Handle)
        {
            string    command = "SELECT * FROM MainFormNotifications;";
            ArrayList Items;

            if (!ClamWinDatabase.ExecReader(command, out Items))
            {
                return(false);
            }

            if (Items.Count > 0)
            {
                const int FieldsPerRecord = ClamWinDatabase.MainFormNotificationsFPR;

                int RecordsCount = Items.Count / FieldsPerRecord;

                for (int i = 0; i < RecordsCount; i++)
                {
                    NotificationData Data = new NotificationData();
                    // [ID]
                    Data.ID = int.Parse((string)Items[i * FieldsPerRecord + 0]);
                    // [Message]
                    Data.Message = (string)Items[i * FieldsPerRecord + 1];
                    // [Code]
                    Data.Code = (NotificationCodes)int.Parse((string)Items[i * FieldsPerRecord + 2]);
                    // [Type]
                    Data.Type = (NotificationType)int.Parse((string)Items[i * FieldsPerRecord + 3]);
                    // [Time]
                    Data.Time = DateTime.FromBinary(long.Parse((string)Items[i * FieldsPerRecord + 4]));

                    lock (MainLocker)
                    {
                        Notifications.Add(Data);
                    }
                }
                lock (MainLocker)
                {
                    CurrentNotification = Notifications.Count - 1;
                }
            }

            lock (MainLocker)
            {
                MainFormHandle = Handle;
            }

            PostCurrentChanged();

            return(true);
        }
Exemplo n.º 5
0
        /// <summary>
        /// Check exctracted file size and removes database recod
        /// </summary>
        /// <returns></returns>
        private static bool PostExtractProcessing(string CompressedFileName, string FileName)
        {
            // Let we ensure record has been inserted successfully
            string    command = "SELECT * FROM QuarantineItems WHERE InitialPath='" + FileName + "';";
            ArrayList list;

            if (ClamWinDatabase.ExecReader(command, out list))
            {
                if (list.Count != 0)
                {
                    long size = long.Parse((string)list[4]);
                    try
                    {
                        FileInfo fi = new FileInfo(FileName);
                        if (!fi.Exists)
                        {
                            return(false);
                        }

                        if (fi.Length != size)
                        {
                            return(false);
                        }
                    }
                    catch
                    {
                        return(false);
                    }
                }
                else
                {
                    return(false);
                }
            }
            else
            {
                return(false);
            }

            command = "DELETE FROM QuarantineItems WHERE QuarantinePath='" + CompressedFileName + "';";
            int result;

            ClamWinDatabase.ExecCommand(command, out result);

            RemoveFile(CompressedFileName);

            return(true);
        }
Exemplo n.º 6
0
        /// <summary>
        /// Fill quarantine items list with database records
        /// </summary>
        private void UpdateQuarantineItems()
        {
            listViewQuarantineItems.Items.Clear();

            //ListViewItem item = listViewQuarantineItems.Items

            string command = "SELECT * FROM QuarantineItems;";

            ArrayList list;

            ClamWinDatabase.ExecReader(command, out list);

            if (list.Count == 0)
            {
                return;
            }

            int FieldsPerRecord = ClamWinDatabase.QuarantineItemsFPR;
            int RecordsCount    = list.Count / FieldsPerRecord;

            for (int i = 0; i < RecordsCount; i++)
            {
                string   PathName           = (string)list[i * FieldsPerRecord + 1];
                string   QuarantinePathName = (string)list[i * FieldsPerRecord + 2];
                string   time = (string)list[i * FieldsPerRecord + 3];
                DateTime Time = DateTime.FromBinary(long.Parse(time));
                long     Size = long.Parse((string)list[i * FieldsPerRecord + 4]);

                if (!ClamWinQuarantine.CheckQuarantinedFile(QuarantinePathName, Size))
                {
                    continue;
                }


                string FileName = System.IO.Path.GetFileName(PathName);

                ListViewItem item = listViewQuarantineItems.Items.Add(FileName);
                item.SubItems.Add(PathName);
                item.SubItems.Add(Time.ToShortDateString() + " " + Time.ToShortTimeString());
                item.SubItems.Add(Size.ToString());
            }
        }
Exemplo n.º 7
0
        /// <summary>
        /// Find out if file is quarantined
        /// </summary>
        /// <param name="FileName"></param>
        /// <returns></returns>
        public static bool IsFileInQuarantine(string FileName)
        {
            string command = "SELECT * FROM QuarantineItems WHERE InitialPath='" + FileName + "';";
            ArrayList list;
            if (ClamWinDatabase.ExecReader(command, out list))
            {
                if (list.Count == 0)
                {
                    return false;
                }
            }
            else
            {
                return false;
            }

            string QuarantineName = (string)list[2];

            return FileExists(QuarantineName);
        }
Exemplo n.º 8
0
        /// <summary>
        /// Load FileAntiVirus statistics from database
        /// </summary>
        /// <returns></returns>
        private static bool LoadFileAntiVirusStatistics()
        {
            lock (MainLock)
            {
                ArrayList list;
                string    command = "SELECT * FROM Statistics WHERE ScanID='-1' AND Object='FileAntiVirus';";
                ClamWinDatabase.ExecReader(command, out list);

                if (list.Count == ClamWinDatabase.StatisticsFPR)
                {
                    // [Object]
                    FileAntiVirus.Object = (string)list[1];
                    // [Scanned]
                    FileAntiVirus.Scanned = ulong.Parse((string)list[2]);
                    // [Threats]
                    FileAntiVirus.Threats = ulong.Parse((string)list[3]);
                    // [Deleted]
                    FileAntiVirus.Deleted = ulong.Parse((string)list[4]);
                    // [MovedToQuarantine]
                    FileAntiVirus.MovedToQuarantine = ulong.Parse((string)list[5]);
                    // [Archived]
                    FileAntiVirus.Archived = ulong.Parse((string)list[6]);
                    // [Packed]
                    FileAntiVirus.Packed = ulong.Parse((string)list[7]);
                    // [PasswordProtected]
                    FileAntiVirus.PasswordProtected = ulong.Parse((string)list[8]);
                    // [Corrupted]
                    FileAntiVirus.Corrupted = ulong.Parse((string)list[9]);
                    // [LastScanned]
                    FileAntiVirus.LastScanned = (string)list[10];

                    return(true);
                }
                else
                {
                    return(false);
                }
            }
        }
Exemplo n.º 9
0
        /// <summary>
        /// Loads undefined notifications
        /// </summary>
        private void LoadNotifications()
        {
            int    result  = 0;
            string command = "SELECT * FROM FilterNotifications WHERE Status = 'Undefined';";

            ArrayList list;

            ClamWinDatabase.ExecReader(command, out list);

            if (list.Count == 0)
            {
                return;
            }

            const int FieldsPerRecord = ClamWinDatabase.FilterNotificationsFPR;

            int RecordsCount = list.Count / FieldsPerRecord;

            FilterNotifications.Clear();

            for (int i = 0; i < RecordsCount; i++)
            {
                ClamWinScan.FilterNotifyData data = new ClamWinScan.FilterNotifyData();
                // [id]

                // [Path]
                data.FileName = list[i * FieldsPerRecord + 1].ToString();
                // [Message]
                data.Message = list[i * FieldsPerRecord + 2].ToString();
                // [Status]

                // [Time]
                data.Time = DateTime.FromBinary(long.Parse(list[i * FieldsPerRecord + 4].ToString()));

                AddNotifyData(data);
            }
        }
Exemplo n.º 10
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="FileName"></param>
        /// <param name="Listeners"></param>
        /// <returns></returns>
        public static QuarantineResults UnquarantineFile(string FileName, IntPtr[] Listeners, bool Temp)
        {
            lock (MainLock)
            {
                if (QueueLocked)
                {
                    return QuarantineResults.FailedQueueLocked;
                }
            }

            if (!IsFileInQuarantine(FileName))
            {
                return QuarantineResults.FailedFileIsNotInQuarantine;
            }

            long InitialSize = 0;
            string ComressedFileName = "";

            long id = 0;
            lock (MainLock)
            {
                foreach (QuarantineItem queued in ItemsQueue)
                {
                    if (queued.FileName == FileName && queued.Quarantine == false)
                    {
                        return QuarantineResults.FailedAlreadyQueued;
                    }
                }

                string command = "SELECT * FROM QuarantineItems WHERE InitialPath='" + FileName + "';";
                ArrayList list;
                if (ClamWinDatabase.ExecReader(command, out list))
                {
                    if (list.Count != 0)
                    {
                        InitialSize = long.Parse((string)list[4]);
                        ComressedFileName = (string)list[2];
                    }
                    else
                    {
                        return QuarantineResults.Failed;
                    }
                }
                else
                {
                    return QuarantineResults.Failed;
                }

                id = ItemsCounter++;
                QuarantineItem item = new QuarantineItem();
                item.FileName = Temp ? GetQuarantineTempFolder() + Path.GetFileName(FileName) : FileName;
                item.Listeners = Listeners;
                item.Quarantine = false;
                item.InitialSize = InitialSize;
                item.CompressedFileName = ComressedFileName;
                item.Temp = Temp;
                item.ID = id;

                ItemsQueue.Add(item);

                Win32API.SetEvent(NewItemAddedEvent);
            }

            NotifyData data = new NotifyData();
            data.FileName = FileName;
            data.Quarantine = false;
            data.Size = InitialSize;
            data.ID = id;

            SendQuarantineNotify(UM_QUARANTINE_QUEUE_NEW_ITEM, data, Listeners);

            return QuarantineResults.Success;
        }