コード例 #1
0
        protected dynamic HandleContentRequest(dynamic arg)
        {
            var url = (string)arg.path;

            if (url == null)
            {
                url = "/";
            }

            if (url.StartsWith("/") == false)
            {
                url = "/" + url;
            }

            url = url.ToLowerInvariant();

            // invalid admin links
            if (url.StartsWith("/admin", StringComparison.InvariantCultureIgnoreCase))
            {
                return(404);
            }

            // invalid system links
            if (url.StartsWith("/_", StringComparison.InvariantCultureIgnoreCase))
            {
                return(404);
            }

            // invalid table get request
            if (url.StartsWith("/tables", StringComparison.InvariantCultureIgnoreCase))
            {
                return(404);
            }

            IContent requestedContent = null;

            // see if the url is collection request or content request
            var parts = url.Split('/');

            url = ContentModule.RewriteUrl(this.Context, arg, url);

            if (parts.Length > 2 && parts[1].EndsWith("s"))
            {
                // seems to be a collection
                var typeName = parts[1].Substring(0, parts[1].Length - 1);
                var datatype = this.SiteDatabase.DataType.FromName(typeName);

                var result = this.SiteDatabase.Query(typeName, string.Format("Url eq '{0}'", url)).FirstOrDefault();
                if (result != null)
                {
                    // convert it to IContent
                    if (result is IContent)
                    {
                        requestedContent = result as IContent;
                        requestedContent = ContentModule.MapPage(this.Context, requestedContent);
                    }
                    else
                    {
                        requestedContent = JObject.FromObject(result).ToObject <Page>();
                        (requestedContent as Page).SetTableName(typeName);
                    }
                }
            }

            // if it is not table, use content table instead
            if (requestedContent == null)
            {
                requestedContent = ContentModule.GetPage(this.SiteDatabase, url);
            }

            if (requestedContent == null)
            {
                // won't generate path which contains extension
                // as user might be requesting file
                if (string.IsNullOrEmpty(Path.GetExtension(url)) == false)
                {
                    return(404);
                }

                // only admin can generate
                if (this.CurrentUser.HasClaim("admin") == false)
                {
                    return(404);
                }

                requestedContent = ContentModule.CreatePage(this.SiteDatabase, url);
            }

            if (string.IsNullOrEmpty((string)requestedContent.RequiredClaims) == false)
            {
                var required = ((string)requestedContent.RequiredClaims).Split(',');
                var user     = this.Context.CurrentUser as NcbUser;
                if (required.Any(c => user.HasClaim(c)) == false)
                {
                    // user does not have any required claims
                    if (this.Context.CurrentUser == NcbUser.Anonymous)
                    {
                        return(401);
                    }

                    return(403);
                }
            }

            this.SiteDatabase.DelayedInsert(new PageView()
            {
                ContentId = requestedContent.Id,
                TableName = requestedContent.TableName,
                Request   = new
                {
                    QueryString = this.Request.Url.Query,
                    Path        = this.Request.Url.Path,
                    UserIP      = this.Request.Headers.Host,
                    Referer     = this.Request.Headers.Referrer,
                    UserAgent   = this.Request.Headers.UserAgent
                }
            });

            if (string.IsNullOrEmpty(requestedContent.Layout))
            {
                requestedContent.Layout = "Content";
            }

            this.GenerateLayoutPage(this.CurrentSite, requestedContent);

            ContentModule.ProcessPage(this.Context, requestedContent);

            return(View[(string)requestedContent.Layout, new StandardModel(this, requestedContent, requestedContent)]);
        }
コード例 #2
0
        /// <summary>
        /// Read Content from given URL in arg
        /// </summary>
        /// <param name="arg"></param>
        /// <param name="processContentPart">Whether to process the content</param>
        /// <returns></returns>
        protected dynamic HandleContentRequest(dynamic arg, bool processContentPart)
        {
            var url = (string)arg.path;

            if (url == null)
            {
                url = "/";
            }

            if (url.StartsWith("/") == false)
            {
                url = "/" + url;
            }

            url = url.ToLowerInvariant();

            // invalid admin links
            if (url.StartsWith("/admin", StringComparison.InvariantCultureIgnoreCase))
            {
                return(404);
            }

            // invalid system links
            if (url.StartsWith("/_", StringComparison.InvariantCultureIgnoreCase))
            {
                return(404);
            }

            // invalid table get request
            if (url.StartsWith("/tables", StringComparison.InvariantCultureIgnoreCase))
            {
                return(404);
            }

            IContent requestedContent = null;

            // see if the url is collection request or content request
            var parts = url.Split('/');

            url = ContentModule.RewriteUrl(this.Context, arg, url);
            var subSiteName = (string)this.Context.Items[ContextItems.SubSite];

            // can be /products/product1
            if (parts.Length > 2 && parts[1].EndsWith("s"))
            {
                // seems to be a collection
                var typeName   = parts[1].Substring(0, parts[1].Length - 1);
                var datatype   = this.SiteDatabase.DataType.FromName(typeName);
                var contentUrl = url;

                // edit url when using subsite example: convert "/products/..." to "/products/subSiteName/..."
                // for products, blogs (end with 's') and etc
                if (!string.IsNullOrEmpty(subSiteName))
                {
                    contentUrl = string.Join("/", "/" + parts[1], subSiteName);
                    contentUrl = contentUrl + "/" + string.Join("/", parts.Skip(2).ToArray());
                }

                var result = this.SiteDatabase.Query(typeName, string.Format("Url eq '{0}'", contentUrl)).FirstOrDefault();

                if (result != null)
                {
                    // convert it to IContent
                    if (result is IContent)
                    {
                        requestedContent = result as IContent;
                        requestedContent = ContentModule.MapPage(this.Context, requestedContent);
                    }
                    else
                    {
                        requestedContent = JObject.FromObject(result).ToObject <Page>();
                        (requestedContent as Page).SetTableName(typeName);
                    }
                }
            }

            // change url to subsite url ex: /contact to /micronics.in.th/contact
            if (!string.IsNullOrEmpty(subSiteName))
            {
                url = "/" + subSiteName + url;
            }

            // if it is not table, use content table instead
            if (requestedContent == null)
            {
                requestedContent = ContentModule.GetPage(this.SiteDatabase, url);
            }

            if (requestedContent == null)
            {
                // won't generate path which contains extension
                // as user might be requesting file
                if (string.IsNullOrEmpty(Path.GetExtension(url)) == false)
                {
                    return(404);
                }

                // only admin can generate
                if (this.CurrentUser.HasClaim("admin") == false)
                {
                    return(404);
                }

                requestedContent = ContentModule.CreatePage(this.SiteDatabase, url);
            }

            if (string.IsNullOrEmpty((string)requestedContent.RequiredClaims) == false)
            {
                var required = ((string)requestedContent.RequiredClaims).Split(',');
                var user     = this.Context.CurrentUser as NcbUser;
                if (required.Any(c => user.HasClaim(c)) == false)
                {
                    // user does not have any required claims
                    if (this.Context.CurrentUser.UserName == NcbUser.Anonymous)
                    {
                        return(401);
                    }

                    return(403);
                }
            }

            string source = null;

            if (this.Request.Cookies.ContainsKey("source") == true)
            {
                source = this.Request.Cookies["source"];
            }

            if (string.IsNullOrEmpty(requestedContent.Layout))
            {
                requestedContent.Layout = "Content";
            }

            this.GenerateLayoutPage(this.CurrentSite, requestedContent);

            ContentModule.ProcessPage(this.Context, requestedContent);

            this.SendPageView(requestedContent);

            if (processContentPart)
            {
                ContentModule.ProcessContentPart(this.Context, requestedContent);
            }

            return(requestedContent);
        }