Example #1
0
        public object Post([FromBody] dynamic model)
        {
            if (model == null)
            {
                throw new ApiArgumentException("model");
            }

            RewriteId parentId = RewriteHelper.GetRewriteIdFromBody(model);

            if (parentId == null)
            {
                throw new ApiArgumentException("url_rewrite");
            }

            Site site = parentId.SiteId == null ? null : SiteHelper.GetSite(parentId.SiteId.Value);

            string configPath            = ManagementUnit.ResolveConfigScope(model);
            OutboundRulesSection section = OutboundRulesHelper.GetSection(site, parentId.Path, configPath);

            TagsElement tags = OutboundRulesHelper.CreateCustomTags(model, section);

            OutboundRulesHelper.AddCustomTags(tags, section);

            ManagementUnit.Current.Commit();

            dynamic pc = OutboundRulesHelper.TagsToJsonModel(tags, site, parentId.Path, Context.Request.GetFields(), true);

            return(Created(OutboundRulesHelper.GetCustomTagsLocation(pc.id), pc));
        }
Example #2
0
        public object Patch([FromBody] dynamic model, string id)
        {
            var customTagsId = new CustomTagsId(id);

            Site site = customTagsId.SiteId == null ? null : SiteHelper.GetSite(customTagsId.SiteId.Value);

            if (customTagsId.SiteId != null && site == null)
            {
                return(NotFound());
            }

            OutboundRulesSection section = OutboundRulesHelper.GetSection(site, customTagsId.Path);
            TagsElement          tags    = section.Tags.FirstOrDefault(t => t.Name.Equals(customTagsId.Name, StringComparison.OrdinalIgnoreCase));

            if (tags == null)
            {
                return(NotFound());
            }

            OutboundRulesHelper.UpdateCustomTags(model, tags, section);

            ManagementUnit.Current.Commit();

            dynamic updatedCustomTags = OutboundRulesHelper.TagsToJsonModel(tags, site, customTagsId.Path, Context.Request.GetFields(), true);

            if (updatedCustomTags.id != id)
            {
                return(LocationChanged(OutboundRulesHelper.GetCustomTagsLocation(updatedCustomTags.id), updatedCustomTags));
            }

            return(updatedCustomTags);
        }
        public static void DeleteCustomTags(TagsElement tags, OutboundRulesSection section)
        {
            if (tags == null)
            {
                return;
            }

            tags = section.Tags.FirstOrDefault(t => t.Name.Equals(tags.Name));

            if (tags != null)
            {
                try
                {
                    section.Tags.Remove(tags);
                }
                catch (FileLoadException e)
                {
                    throw new LockedException(section.SectionPath, e);
                }
                catch (DirectoryNotFoundException e)
                {
                    throw new ConfigScopeNotFoundException(e);
                }
            }
        }
        public static void AddCustomTags(TagsElement tags, OutboundRulesSection section)
        {
            if (tags == null)
            {
                throw new ArgumentNullException(nameof(tags));
            }

            if (tags.Name == null)
            {
                throw new ArgumentNullException("tags.Name");
            }

            if (section.PreConditions.Any(r => r.Name.Equals(tags.Name)))
            {
                throw new AlreadyExistsException("name");
            }

            try
            {
                section.Tags.Add(tags);
            }
            catch (FileLoadException e)
            {
                throw new LockedException(section.SectionPath, e);
            }
            catch (DirectoryNotFoundException e)
            {
                throw new ConfigScopeNotFoundException(e);
            }
        }
 public static object TagsToJsonModelRef(TagsElement tags, Site site, string path, Fields fields = null)
 {
     if (fields == null || !fields.HasFields)
     {
         return(TagsToJsonModel(tags, site, path, CustomTagsRefFields, false));
     }
     else
     {
         return(TagsToJsonModel(tags, site, path, fields, false));
     }
 }
        public static object TagsToJsonModel(TagsElement tags, Site site, string path, Fields fields = null, bool full = true)
        {
            if (tags == null)
            {
                return(null);
            }

            if (fields == null)
            {
                fields = Fields.All;
            }

            dynamic obj = new ExpandoObject();

            //
            // name
            if (fields.Exists("name"))
            {
                obj.name = tags.Name;
            }

            //
            // id
            if (fields.Exists("id"))
            {
                obj.id = new CustomTagsId(site?.Id, path, tags.Name).Uuid;
            }

            //
            // tags
            if (fields.Exists("tags"))
            {
                obj.tags = tags.Tags.Select(t => new {
                    name      = t.Name,
                    attribute = t.Attribute
                });
            }

            //
            // url_rewrite
            if (fields.Exists("url_rewrite"))
            {
                obj.url_rewrite = RewriteHelper.ToJsonModelRef(site, path, fields.Filter("url_rewrite"));
            }

            return(Core.Environment.Hal.Apply(Defines.CustomTagsResource.Guid, obj, full));
        }
        public static TagsElement CreateCustomTags(dynamic model, OutboundRulesSection section)
        {
            if (model == null)
            {
                throw new ApiArgumentException("model");
            }

            if (string.IsNullOrEmpty(DynamicHelper.Value(model.name)))
            {
                throw new ApiArgumentException("name");
            }

            TagsElement tags = section.Tags.CreateElement();

            SetCustomTags(model, tags, section);

            return(tags);
        }
Example #8
0
        public object Get(string id)
        {
            var customTagsId = new CustomTagsId(id);

            Site site = customTagsId.SiteId == null ? null : SiteHelper.GetSite(customTagsId.SiteId.Value);

            if (customTagsId.SiteId != null && site == null)
            {
                return(NotFound());
            }

            TagsElement tag = OutboundRulesHelper.GetSection(site, customTagsId.Path).Tags.FirstOrDefault(tags => tags.Name.Equals(customTagsId.Name, StringComparison.OrdinalIgnoreCase));

            if (tag == null)
            {
                return(NotFound());
            }

            return(OutboundRulesHelper.TagsToJsonModel(tag, site, customTagsId.Path, Context.Request.GetFields()));
        }
Example #9
0
        public void Delete(string id)
        {
            TagsElement tags   = null;
            var         tagsId = new CustomTagsId(id);

            Site site = tagsId.SiteId == null ? null : SiteHelper.GetSite(tagsId.SiteId.Value);

            if (tagsId.SiteId == null || site != null)
            {
                tags = OutboundRulesHelper.GetSection(site, tagsId.Path).Tags.FirstOrDefault(t => t.Name.Equals(tagsId.Name, StringComparison.OrdinalIgnoreCase));
            }

            if (tags != null)
            {
                var section = OutboundRulesHelper.GetSection(site, tagsId.Path, ManagementUnit.ResolveConfigScope());

                OutboundRulesHelper.DeleteCustomTags(tags, section);
                ManagementUnit.Current.Commit();
            }

            Context.Response.StatusCode = (int)HttpStatusCode.NoContent;
        }
        private static void AssignRuleFromModel(dynamic model, OutboundRule rule, OutboundRulesSection section)
        {
            if (model == null)
            {
                throw new ApiArgumentException("model");
            }

            //
            // Name, check for already existing name
            string name = DynamicHelper.Value(model.name);

            if (!string.IsNullOrEmpty(name))
            {
                if (!name.Equals(rule.Name, StringComparison.OrdinalIgnoreCase) &&
                    section.Rules.Any(r => r.Name.Equals(name, StringComparison.OrdinalIgnoreCase)))
                {
                    throw new AlreadyExistsException("name");
                }

                rule.Name = name;
            }

            DynamicHelper.If((object)model.pattern, v => rule.Match.Pattern                 = v);
            DynamicHelper.If <bool>((object)model.enabled, v => rule.Action.Type            = v ? OutboundActionType.Rewrite : OutboundActionType.None);
            DynamicHelper.If((object)model.rewrite_value, v => rule.Action.RewriteValue     = v);
            DynamicHelper.If <bool>((object)model.ignore_case, v => rule.Match.IgnoreCase   = v);
            DynamicHelper.If <bool>((object)model.negate, v => rule.Match.Negate            = v);
            DynamicHelper.If <bool>((object)model.stop_processing, v => rule.StopProcessing = v);
            DynamicHelper.If((object)model.pattern_syntax, v => rule.PatternSyntax          = PatternSyntaxHelper.FromJsonModel(v));

            //
            // Server Variable
            DynamicHelper.If((object)model.server_variable, v => rule.Match.ServerVariable = v);
            DynamicHelper.If <bool>((object)model.replace_server_variable, v => rule.Action.ReplaceServerVariable = v);

            //
            // Html Tags
            dynamic tagFilters = null;
            dynamic customTags = null;

            if (model.tag_filters != null)
            {
                tagFilters = model.tag_filters;

                if (!(tagFilters is JObject))
                {
                    throw new ApiArgumentException("tag_filters", ApiArgumentException.EXPECTED_OBJECT);
                }

                customTags = tagFilters.custom;

                // Clear custom tags
                rule.Match.CustomTags    = null;
                rule.Match.FilterByTags &= ~FilterByTags.CustomTags;
            }

            // Set standard tags
            if (tagFilters != null)
            {
                FilterByTags ruleTags = rule.Match.FilterByTags;

                DynamicHelper.If <bool>((object)tagFilters.a, v => SetTagFlag(ref ruleTags, FilterByTags.A, v));
                DynamicHelper.If <bool>((object)tagFilters.area, v => SetTagFlag(ref ruleTags, FilterByTags.Area, v));
                DynamicHelper.If <bool>((object)tagFilters.@base, v => SetTagFlag(ref ruleTags, FilterByTags.Base, v));
                DynamicHelper.If <bool>((object)tagFilters.form, v => SetTagFlag(ref ruleTags, FilterByTags.Form, v));
                DynamicHelper.If <bool>((object)tagFilters.frame, v => SetTagFlag(ref ruleTags, FilterByTags.Frame, v));
                DynamicHelper.If <bool>((object)tagFilters.head, v => SetTagFlag(ref ruleTags, FilterByTags.Head, v));
                DynamicHelper.If <bool>((object)tagFilters.iframe, v => SetTagFlag(ref ruleTags, FilterByTags.IFrame, v));
                DynamicHelper.If <bool>((object)tagFilters.img, v => SetTagFlag(ref ruleTags, FilterByTags.Img, v));
                DynamicHelper.If <bool>((object)tagFilters.input, v => SetTagFlag(ref ruleTags, FilterByTags.Input, v));
                DynamicHelper.If <bool>((object)tagFilters.link, v => SetTagFlag(ref ruleTags, FilterByTags.Link, v));
                DynamicHelper.If <bool>((object)tagFilters.script, v => SetTagFlag(ref ruleTags, FilterByTags.Script, v));

                rule.Match.FilterByTags = ruleTags;
            }

            // Set custom tags
            if (customTags != null)
            {
                if (!(customTags is JObject))
                {
                    throw new ApiArgumentException("tags.custom", ApiArgumentException.EXPECTED_OBJECT);
                }

                string ctId = DynamicHelper.Value(customTags.id);

                if (string.IsNullOrEmpty(ctId))
                {
                    throw new ArgumentException("tags.custom.id", "required");
                }

                TagsElement targetCustomTags = section.Tags.FirstOrDefault(t => t.Name.Equals(new CustomTagsId(ctId).Name, StringComparison.OrdinalIgnoreCase));

                if (targetCustomTags == null)
                {
                    throw new NotFoundException("tags.custom");
                }

                rule.Match.FilterByTags |= FilterByTags.CustomTags;
                rule.Match.CustomTags    = targetCustomTags.Name;
            }

            if (model.precondition != null)
            {
                dynamic precondition = model.precondition;

                if (!(precondition is JObject))
                {
                    throw new ApiArgumentException("precondition", ApiArgumentException.EXPECTED_OBJECT);
                }

                string id = DynamicHelper.Value(precondition.id);

                if (string.IsNullOrEmpty(id))
                {
                    throw new ApiArgumentException("precondition.id");
                }

                PreConditionId preconditionId = new PreConditionId(id);

                PreCondition pc = section.PreConditions.FirstOrDefault(p => p.Name.Equals(preconditionId.Name, StringComparison.OrdinalIgnoreCase));

                if (pc == null)
                {
                    throw new NotFoundException("precondition.id");
                }

                rule.PreCondition = pc.Name;
            }

            DynamicHelper.If((object)model.condition_match_constraints, v => rule.Conditions.LogicalGrouping = LogicalGroupingHelper.FromJsonModel(v));
            DynamicHelper.If <bool>((object)model.track_all_captures, v => rule.Conditions.TrackAllCaptures  = v);

            //
            // Conditions
            if (model.conditions != null)
            {
                IEnumerable <dynamic> conditions = model.conditions as IEnumerable <dynamic>;

                if (conditions == null)
                {
                    throw new ApiArgumentException("conditions", ApiArgumentException.EXPECTED_ARRAY);
                }

                rule.Conditions.Clear();

                foreach (dynamic condition in conditions)
                {
                    if (!(condition is JObject))
                    {
                        throw new ApiArgumentException("server_variables.item");
                    }

                    string input = DynamicHelper.Value(condition.input);

                    if (string.IsNullOrEmpty(input))
                    {
                        throw new ApiArgumentException("conditions.item.input", "Required");
                    }

                    var con = rule.Conditions.CreateElement();
                    con.Input      = input;
                    con.Pattern    = DynamicHelper.Value(condition.pattern);
                    con.Negate     = DynamicHelper.To <bool>(condition.negate);
                    con.IgnoreCase = DynamicHelper.To <bool>(condition.ignore_case);

                    // Schema only specifies pattern match type for outbound rules
                    con.MatchType = MatchType.Pattern;

                    rule.Conditions.Add(con);
                }
            }

            //
            // Set match type
            string type = DynamicHelper.Value(model.match_type);
            OutboundRuleMatchType matchType = string.IsNullOrEmpty(type) ? GetMatchType(rule) : OutboundMatchTypeHelper.FromJsonModel(type);

            if (matchType == OutboundRuleMatchType.Response)
            {
                rule.Match.ServerVariable = null;
            }
            else
            {
                rule.Match.FilterByTags = FilterByTags.None;
            }

            UpdatePriority(model, rule, section);
        }
 public static void UpdateCustomTags(dynamic model, TagsElement tags, OutboundRulesSection section)
 {
     SetCustomTags(model, tags, section);
 }
        public static object RuleToJsonModel(OutboundRule rule, Site site, string path, Fields fields = null, bool full = true)
        {
            if (rule == null)
            {
                return(null);
            }

            if (fields == null)
            {
                fields = Fields.All;
            }

            var outboundRuleId = new OutboundRuleId(site?.Id, path, rule.Name);
            var section        = GetSection(site, path);
            OutboundRuleMatchType matchType = GetMatchType(rule);

            dynamic obj = new ExpandoObject();

            //
            // name
            if (fields.Exists("name"))
            {
                obj.name = rule.Name;
            }

            //
            // id
            if (fields.Exists("id"))
            {
                obj.id = outboundRuleId.Uuid;
            }

            //
            // priority
            if (fields.Exists("priority"))
            {
                obj.priority = GetSection(site, path).Rules.IndexOf(rule);
            }

            // precondition
            if (fields.Exists("precondition"))
            {
                var precondition = section.PreConditions.FirstOrDefault(pc => pc.Name.Equals(rule.PreCondition, StringComparison.OrdinalIgnoreCase));
                obj.precondition = PreConditionToJsonModelRef(precondition, site, path, fields.Filter("precondition"));
            }

            // match_type
            if (fields.Exists("match_type"))
            {
                obj.match_type = OutboundMatchTypeHelper.ToJsonModel(matchType);
            }

            // server_variable
            if (fields.Exists("server_variable") && matchType == OutboundRuleMatchType.ServerVariable)
            {
                obj.server_variable = string.IsNullOrEmpty(rule.Match.ServerVariable) ? null : rule.Match.ServerVariable;
            }

            // tag_filters
            if (fields.Exists("tag_filters") && matchType == OutboundRuleMatchType.Response)
            {
                obj.tag_filters = CreateTagsModel(rule.Match.FilterByTags);

                TagsElement customTags = rule.Match.FilterByTags.HasFlag(FilterByTags.CustomTags) ?
                                         section.Tags.FirstOrDefault(t => t.Name.Equals(rule.Match.CustomTags, StringComparison.OrdinalIgnoreCase)) :
                                         null;

                obj.tag_filters.custom = customTags == null ? null : TagsToJsonModelRef(customTags, site, path, fields.Filter("tag_filters.custom"));
            }

            //
            // pattern
            if (fields.Exists("pattern"))
            {
                obj.pattern = rule.Match.Pattern;
            }

            //
            // pattern_syntax
            if (fields.Exists("pattern_syntax"))
            {
                obj.pattern_syntax = PatternSyntaxHelper.ToJsonModel(rule.PatternSyntax);
            }

            //
            // ignore_case
            if (fields.Exists("ignore_case"))
            {
                obj.ignore_case = rule.Match.IgnoreCase;
            }

            //
            // negate
            if (fields.Exists("negate"))
            {
                obj.negate = rule.Match.Negate;
            }

            //
            // stop_processing
            if (fields.Exists("stop_processing"))
            {
                obj.stop_processing = rule.StopProcessing;
            }

            //
            // enabled
            if (fields.Exists("enabled"))
            {
                obj.enabled = rule.Action.Type == OutboundActionType.Rewrite ? true : false;
            }

            //
            // rewrite_value
            if (fields.Exists("rewrite_value"))
            {
                obj.rewrite_value = rule.Action.RewriteValue;
            }

            //
            // replace_server_variable
            if (fields.Exists("replace_server_variable") && matchType == OutboundRuleMatchType.ServerVariable)
            {
                obj.replace_server_variable = rule.Action.ReplaceServerVariable;
            }

            //
            // condition_match_constraints
            if (fields.Exists("condition_match_constraints"))
            {
                obj.condition_match_constraints = LogicalGroupingHelper.ToJsonModel(rule.Conditions.LogicalGrouping);
            }

            //
            // track_all_captures
            if (fields.Exists("track_all_captures"))
            {
                obj.track_all_captures = rule.Conditions.TrackAllCaptures;
            }

            //
            // conditions
            if (fields.Exists("conditions"))
            {
                obj.conditions = rule.Conditions.Select(c => new {
                    input       = c.Input,
                    pattern     = c.Pattern,
                    negate      = c.Negate,
                    ignore_case = c.IgnoreCase,
                    match_type  = MatchTypeHelper.ToJsonModel(c.MatchType)
                });
            }

            //
            // url_rewrite
            if (fields.Exists("url_rewrite"))
            {
                obj.url_rewrite = RewriteHelper.ToJsonModelRef(site, path, fields.Filter("url_rewrite"));
            }

            return(Core.Environment.Hal.Apply(Defines.OutboundRulesResource.Guid, obj, full));
        }
        private static void SetCustomTags(dynamic model, TagsElement tagsSet, OutboundRulesSection section)
        {
            if (model == null)
            {
                throw new ApiArgumentException("model");
            }

            try {
                string name = DynamicHelper.Value(model.name);
                if (!string.IsNullOrEmpty(name))
                {
                    if (!name.Equals(tagsSet.Name, StringComparison.OrdinalIgnoreCase) &&
                        section.PreConditions.Any(pc => pc.Name.Equals(name, StringComparison.OrdinalIgnoreCase)))
                    {
                        throw new AlreadyExistsException("name");
                    }

                    tagsSet.Name = name;
                }

                //
                // tags
                if (model.tags != null)
                {
                    IEnumerable <dynamic> tags = model.tags as IEnumerable <dynamic>;

                    if (tags == null)
                    {
                        throw new ApiArgumentException("requirements", ApiArgumentException.EXPECTED_ARRAY);
                    }

                    tagsSet.Tags.Clear();

                    foreach (dynamic requirement in tags)
                    {
                        if (!(requirement is JObject))
                        {
                            throw new ApiArgumentException("tags.item");
                        }

                        string tagName   = DynamicHelper.Value(requirement.name);
                        string attribute = DynamicHelper.Value(requirement.attribute);

                        if (string.IsNullOrEmpty(tagName))
                        {
                            throw new ApiArgumentException("tags.item.name", "Required");
                        }

                        if (string.IsNullOrEmpty(attribute))
                        {
                            throw new ApiArgumentException("tags.item.attribute", "Required");
                        }

                        var t = tagsSet.Tags.CreateElement();
                        t.Name      = tagName;
                        t.Attribute = attribute;

                        tagsSet.Tags.Add(t);
                    }
                }
            }
            catch (FileLoadException e) {
                throw new LockedException(section.SectionPath, e);
            }
            catch (DirectoryNotFoundException e) {
                throw new ConfigScopeNotFoundException(e);
            }
        }