Exemplo n.º 1
0
 public void Execute(ExecutionStage stage)
 {
     foreach (WorkItem workItem in this.workItems)
     {
         if ((stage & workItem.Stage) != (ExecutionStage)0)
         {
             string stageDescription = FolderEvaluationResult.GetStageDescription(stage);
             try
             {
                 this.context.CurrentRule = workItem.Rule;
                 RuleUtil.FaultInjection((FaultInjectionLid)4175834429U);
                 workItem.Execute();
                 this.context.LogWorkItemExecution(workItem);
             }
             catch (InvalidRuleException exception)
             {
                 this.context.RecordError(exception, stageDescription);
                 this.context.DisableAndMarkRuleInError(workItem.Rule, workItem.Rule.Actions[workItem.ActionIndex].ActionType, workItem.ActionIndex, DeferredError.RuleError.Execution);
             }
             catch (StoragePermanentException exception2)
             {
                 this.context.RecordError(exception2, stageDescription);
             }
             catch (ExchangeDataException exception3)
             {
                 this.context.RecordError(exception3, stageDescription);
             }
             catch (MapiPermanentException exception4)
             {
                 this.context.RecordError(exception4, stageDescription);
             }
             catch (DataValidationException exception5)
             {
                 this.context.RecordError(exception5, stageDescription);
             }
             finally
             {
                 this.context.CurrentRule = null;
             }
         }
     }
 }
        public bool CompareAddresses(object messageValue, object ruleValue)
        {
            ProxyAddress proxyAddressFromSearchKey  = RuleUtil.GetProxyAddressFromSearchKey(messageValue);
            ProxyAddress proxyAddressFromSearchKey2 = RuleUtil.GetProxyAddressFromSearchKey(ruleValue);

            if (proxyAddressFromSearchKey2 == null || proxyAddressFromSearchKey2 is InvalidProxyAddress || string.IsNullOrEmpty(proxyAddressFromSearchKey2.ValueString))
            {
                string recipient = ServerStrings.Null;
                if (proxyAddressFromSearchKey2 != null)
                {
                    recipient = proxyAddressFromSearchKey2.ToString();
                }
                this.DisableAndMarkRuleInError(this.CurrentRule, RuleAction.Type.OP_INVALID, 0, DeferredError.RuleError.Parsing);
                this.RecordError(ServerStrings.FolderRuleErrorInvalidRecipient(recipient));
                return(false);
            }
            this.TraceDebug <ProxyAddress, ProxyAddress>("Comparing recipients, message address {0}, rule address {1}", proxyAddressFromSearchKey, proxyAddressFromSearchKey2);
            RuleUtil.FaultInjection((FaultInjectionLid)4257530192U);
            return(RuleUtil.IsSameUser(this, this.RecipientCache, proxyAddressFromSearchKey, proxyAddressFromSearchKey2));
        }
Exemplo n.º 3
0
        private FolderEvaluationResult EvaluateRulesOnCurrentFolder()
        {
            FolderEvaluationResult folderEvaluationResult = null;
            string stage = ServerStrings.FolderRuleStageLoading;

            try
            {
                RuleUtil.FaultInjection((FaultInjectionLid)3353750845U);
                List <Rule> list = this.context.LoadRules();
                if (list == null)
                {
                    return(null);
                }
                stage = ServerStrings.FolderRuleStageEvaluation;
                folderEvaluationResult = new FolderEvaluationResult(this.context, list);
                if (this.context.SharedPropertiesBetweenAgents == null)
                {
                    this.context.SharedPropertiesBetweenAgents = new Dictionary <PropertyDefinition, object>();
                }
                foreach (Rule rule in folderEvaluationResult.Rules)
                {
                    this.context.CurrentRule = rule;
                    if (this.EvaluateRule(rule, folderEvaluationResult))
                    {
                        if ((rule.StateFlags & RuleStateFlags.ExitAfterExecution) != (RuleStateFlags)0)
                        {
                            this.context.TraceDebug <string>("Encountered exit level rule {0} ", rule.Name);
                            folderEvaluationResult.ExitExecution = true;
                            this.context.SharedPropertiesBetweenAgents[ItemSchema.IsStopProcessingRuleApplicable] = true;
                        }
                        if (RuleLoader.IsJunkEmailRule(rule))
                        {
                            this.context.TraceDebug <string>("Processed junk email rule {0} ", rule.Name);
                            this.context.SharedPropertiesBetweenAgents[SharedProperties.ItemMovedByJunkMailRule] = folderEvaluationResult.IsMessageMoved;
                            break;
                        }
                        if (RuleLoader.IsNeverClutterOverrideRule(rule))
                        {
                            this.context.SharedPropertiesBetweenAgents[ItemSchema.InferenceNeverClutterOverrideApplied] = true;
                        }
                        this.context.SharedPropertiesBetweenAgents[ItemSchema.ItemMovedByConversationAction] = this.context.ShouldSkipMoveRule;
                        this.context.SharedPropertiesBetweenAgents[ItemSchema.ItemMovedByRule] = folderEvaluationResult.IsMessageMoved;
                        if (!folderEvaluationResult.ShouldContinue)
                        {
                            this.context.TraceDebug("Terminate rules processing on current folder");
                            break;
                        }
                    }
                }
                this.context.CurrentRule = null;
            }
            catch (StoragePermanentException exception)
            {
                this.context.RecordError(exception, stage);
            }
            catch (ExchangeDataException exception2)
            {
                this.context.RecordError(exception2, stage);
            }
            catch (MapiPermanentException exception3)
            {
                this.context.RecordError(exception3, stage);
            }
            catch (DataValidationException exception4)
            {
                this.context.RecordError(exception4, stage);
            }
            finally
            {
                this.context.CurrentRule = null;
            }
            return(folderEvaluationResult);
        }
Exemplo n.º 4
0
        private bool EvaluateRule(Rule rule, FolderEvaluationResult result)
        {
            if (rule == null)
            {
                throw new ArgumentNullException("rule");
            }
            if (result == null)
            {
                throw new ArgumentNullException("result");
            }
            if (rule.Actions == null)
            {
                throw new ArgumentException("Rule.Actions must not be null.");
            }
            this.context.CurrentRule = rule;
            this.context.NestedLevel = 0;
            this.context.TraceDebug <string>("Evaluate rule {0}", rule.Name);
            int  i = 0;
            bool result2;

            try
            {
                RuleUtil.FaultInjection((FaultInjectionLid)3102092605U);
                if (!RestrictionEvaluator.Evaluate(rule.Condition, this.context))
                {
                    result2 = false;
                }
                else
                {
                    this.context.TraceDebug <string>("Rule {0} evaluated to true", rule.Name);
                    if (this.context.HasRuleFiredBefore(rule))
                    {
                        this.context.TraceDebug <string>("Rule history loop detected on rule {0}", rule.Name);
                        result2 = false;
                    }
                    else
                    {
                        while (i < rule.Actions.Length)
                        {
                            RuleAction ruleAction = rule.Actions[i];
                            if (ruleAction == null)
                            {
                                this.context.TraceDebug <string, int>("For rule \"{0}\", action at index {1} is null.", rule.Name, i);
                            }
                            else
                            {
                                this.CreateWorkItemForAction(result, ruleAction, i++);
                                if (!result.ShouldContinue)
                                {
                                    this.context.TraceDebug <Type>("Stop evaluation process after action {0}", ruleAction.GetType());
                                    break;
                                }
                            }
                        }
                        result2 = true;
                    }
                }
            }
            catch (InvalidRuleException exception)
            {
                this.context.DisableAndMarkRuleInError(rule, rule.Actions[i].ActionType, i, DeferredError.RuleError.Parsing);
                this.context.RecordError(exception, ServerStrings.FolderRuleStageEvaluation);
                result2 = false;
            }
            return(result2);
        }