Esempio n. 1
0
        private int Save(MailSieveFilterData filterDataObj)
        {
            var filterData = GetValidFilter(filterDataObj);

            var filterJsonStr = JsonConvert.SerializeObject(filterData, Formatting.Indented, new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore,
                ContractResolver  = new ShouldSerializeContractResolver()
            });

            var filter = new Filter
            {
                Id         = filterData.Id,
                User       = User,
                Tenant     = Tenant,
                Enabled    = filterData.Enabled,
                FilterData = filterJsonStr,
                Position   = filterData.Position
            };

            using (var daoFactory = new DaoFactory())
            {
                var dao = daoFactory.CreateFilterDao(Tenant, User);

                var id = dao.Save(filter);

                return(id);
            }
        }
Esempio n. 2
0
        public MailSieveFilterData CreateFilter(MailSieveFilterData filter)
        {
            var id = MailEngineFactory.FilterEngine.Create(filter);

            filter.Id = id;
            return(filter);
        }
Esempio n. 3
0
        public int Create(MailSieveFilterData filterData)
        {
            if (filterData == null)
            {
                throw new ArgumentNullException("filterData");
            }

            if (filterData.Id != 0)
            {
                throw new ArgumentException("filterData.Id should be 0");
            }

            return(Save(filterData));
        }
Esempio n. 4
0
        public bool Update(MailSieveFilterData filterData)
        {
            if (filterData == null)
            {
                throw new ArgumentNullException("filterData");
            }

            if (filterData.Id <= 0)
            {
                throw new InvalidDataException("filterData.Id should be more then 0");
            }

            return(Save(filterData) > 0);
        }
        public FilterSieveMessagesExp(List <int> ids, int tenant, string user, MailSieveFilterData filter, int page,
                                      int pageSize)
        {
            Filter = filter;
            Tenant = tenant;
            User   = user;

            if (ids.Any())
            {
                Ids = ids.Skip(page * pageSize).Take(pageSize).ToList();
                return;
            }

            StartIndex = page * pageSize;
            Limit      = pageSize;
        }
Esempio n. 6
0
        public List <MailMessageData> CheckFilter(MailSieveFilterData filter, int?page, int?pageSize)
        {
            if (!page.HasValue)
            {
                page = 0;
            }

            if (!pageSize.HasValue)
            {
                pageSize = 10;
            }

            long total;
            var  messages = MailEngineFactory.MessageEngine.GetFilteredMessages(filter, page.Value, pageSize.Value, out total);

            _context.SetTotalCount(total);

            return(messages);
        }
        public static bool TryGetFullTextSearchIds(MailSieveFilterData filter, string user, out List <int> ids)
        {
            ids = new List <int>();

            if (!FactoryIndexer <MailWrapper> .Support)
            {
                return(false);
            }

            var userId = new Guid(user);

            Func <ConditionKeyType, Expression <Func <MailWrapper, object> > > getExp = (c) =>
            {
                switch (c)
                {
                case ConditionKeyType.From:
                    return(w => w.FromText);

                case ConditionKeyType.To:
                    return(w => w.ToText);

                case ConditionKeyType.Cc:
                    return(w => w.Cc);

                case ConditionKeyType.Subject:
                    return(w => w.Subject);

                default:
                    throw new ArgumentOutOfRangeException("c", c, null);
                }
            };

            Func <MailSieveFilterConditionData, Selector <MailWrapper> > setSelector = (c) =>
            {
                var sel = new Selector <MailWrapper>().Match(
                    c.Key == ConditionKeyType.ToOrCc
                        ? w => new object[] { w.ToText, w.Cc }
                        : getExp(c.Key),
                    c.Operation == ConditionOperationType.Matches || c.Operation == ConditionOperationType.NotMatches
                        ? "\"" + c.Value + "\""
                        : c.Value);

                if (c.Operation == ConditionOperationType.NotMatches ||
                    c.Operation == ConditionOperationType.NotContains)
                {
                    return(new Selector <MailWrapper>().Not(s => sel));
                }

                return(sel);
            };

            var selector = new Selector <MailWrapper>();

            foreach (var c in filter.Conditions)
            {
                if (filter.Options.MatchMultiConditions == MatchMultiConditionsType.MatchAll ||
                    filter.Options.MatchMultiConditions == MatchMultiConditionsType.None)
                {
                    selector &= setSelector(c);
                }
                else
                {
                    selector |= setSelector(c);
                }
            }

            if (filter.Options.ApplyTo.Folders.Any())
            {
                selector.In(r => r.Folder, filter.Options.ApplyTo.Folders);
            }

            if (filter.Options.ApplyTo.Mailboxes.Any())
            {
                selector.In(r => r.MailboxId, filter.Options.ApplyTo.Mailboxes);
            }

            if (filter.Options.ApplyTo.WithAttachments != ApplyToAttachmentsType.WithAndWithoutAttachments)
            {
                selector.Where(r => r.HasAttachments,
                               filter.Options.ApplyTo.WithAttachments == ApplyToAttachmentsType.WithAttachments);
            }

            selector
            .Where(r => r.UserId, userId)
            .Sort(r => r.DateSent, true);

            List <int> mailIds;

            if (!FactoryIndexer <MailWrapper> .TrySelectIds(s => selector, out mailIds))
            {
                return(false);
            }

            ids = mailIds;

            return(true);
        }
Esempio n. 8
0
        public static MailSieveFilterData GetValidFilter(MailSieveFilterData filterData)
        {
            var validFilter = new MailSieveFilterData
            {
                Id      = filterData.Id,
                Enabled = filterData.Enabled
            };

            validFilter.Name = !string.IsNullOrEmpty(filterData.Name) && filterData.Name.Length > 64
                ? filterData.Name.Substring(0, 64)
                : filterData.Name;

            validFilter.Position = filterData.Position < 0 ? 0 : filterData.Position;

            if (filterData.Options == null)
            {
                throw new ArgumentException("No options");
            }

            if (filterData.Options.ApplyTo == null)
            {
                throw new ArgumentException("No options apply to section");
            }

            if (filterData.Options.ApplyTo.Folders == null || !filterData.Options.ApplyTo.Folders.Any())
            {
                throw new ArgumentException("No folders in options");
            }

            var aceptedFolders = new[] { (int)FolderType.Inbox, (int)FolderType.Sent, (int)FolderType.Spam };

            if (filterData.Options.ApplyTo.Folders.Any(f => !aceptedFolders.Contains(f)))
            {
                throw new ArgumentException("Some folder is not accepted in the options");
            }

            if (filterData.Options.ApplyTo.Mailboxes == null)
            {
                filterData.Options.ApplyTo.Mailboxes = new int[] {}
            }
            ;

            validFilter.Options = filterData.Options;

            if (filterData.Conditions.Any(c => string.IsNullOrEmpty(c.Value)))
            {
                throw new ArgumentException("No condition value");
            }

            if (filterData.Conditions.Any(c => c.Value.Length > 200))
            {
                throw new ArgumentException("Too long condition value (limit is 200)");
            }

            validFilter.Conditions = filterData.Conditions;

            if (!filterData.Actions.Any())
            {
                throw new ArgumentException("No actions");
            }

            validFilter.Actions = filterData.Actions.Distinct(new FilterActionEqualityComparer()).ToList();

            if (filterData.Actions.Count > 1 && filterData.Actions.Any(a => a.Action == ActionType.DeleteForever))
            {
                validFilter.Actions = new List <MailSieveFilterActionData>
                {
                    new MailSieveFilterActionData
                    {
                        Action = ActionType.DeleteForever
                    }
                };
            }
            else
            {
                foreach (var actionData in validFilter.Actions)
                {
                    switch (actionData.Action)
                    {
                    case ActionType.MoveTo:
                        if (string.IsNullOrEmpty(actionData.Data))
                        {
                            throw new ArgumentException("Empty folder of 'Move to' action");
                        }

                        JObject dataJson;

                        try
                        {
                            dataJson = JObject.Parse(actionData.Data);
                        }
                        catch (Exception)
                        {
                            throw new ArgumentException("Not json data of 'Move to' action");
                        }

                        if (!dataJson.HasValues)
                        {
                            throw new ArgumentException("Have no values in json data of 'Move to' action");
                        }

                        if (!dataJson.ContainsKey("type"))
                        {
                            throw new ArgumentException("Have no type value in json data of 'Move to' action");
                        }

                        FolderType folderType;

                        if (!Enum.TryParse(dataJson["type"].ToString(), true, out folderType) ||
                            !Enum.IsDefined(typeof(FolderType), folderType))
                        {
                            throw new ArgumentException("Not valid type value in json data of 'Move to' action");
                        }

                        if (folderType == FolderType.UserFolder)
                        {
                            if (!dataJson.ContainsKey("userFolderId"))
                            {
                                throw new ArgumentException(
                                          "Have no userFolderId value in json data of 'Move to' action");
                            }

                            uint userFolderId;

                            if (!uint.TryParse(dataJson["userFolderId"].ToString(), out userFolderId))
                            {
                                throw new ArgumentException(
                                          "Not valid userFolderId value in json data of 'Move to' action");
                            }
                        }

                        break;

                    case ActionType.MarkTag:
                        if (string.IsNullOrEmpty(actionData.Data))
                        {
                            throw new ArgumentException("Empty tag of 'Add tag' action");
                        }

                        int parsedId;
                        if (!int.TryParse(actionData.Data, out parsedId))
                        {
                            throw new ArgumentException("Not numeric tag id of 'Add tag' action");
                        }

                        break;

                    case ActionType.MarkAsImportant:
                    case ActionType.MarkAsRead:
                    case ActionType.DeleteForever:

                        if (!string.IsNullOrEmpty(actionData.Data))
                        {
                            actionData.Data = null;
                        }

                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }
            }

            return(validFilter);
        }
Esempio n. 9
0
        public MailSieveFilterData UpdateFilter(MailSieveFilterData filter)
        {
            MailEngineFactory.FilterEngine.Update(filter);

            return(filter);
        }