internal void LoadPage(string path)
        {
            Contract.Page page = Contract.Page.FromString(File.ReadAllText(path));

            if (page != null)
            {
                if (this.GetPageByID(page.ID) == null)
                {
                    if (page.VerifySignature())
                    {
                        Pages.Add(page);
                    }
                    else
                    {
                        Debug.WriteLine("{0} has invalid signature", path);
                    }
                }
                else
                {
                    Debug.WriteLine("{0} is already loaded", path);
                }
            }
            else
            {
                Debug.WriteLine("{0} is not a valid page format", path);
            }
        }
Beispiel #2
0
        internal string ParseTemplate(string template, Contract.Page page, dynamic instance, ModuleSession moduleSession)
        {
            Debug.StartTimer("ThemeManager:ParseTemplate()");
            template = ParseBlocks(template, page, instance, moduleSession);
            Debug.StopTimer("ThemeManager:ParseTemplate()");

            return(template);
        }
        internal bool CompilePage(string path, out CompilerErrorCollection compilerErrorCollection)
        {
            Contract.Page page     = Contract.Page.FromString(File.ReadAllText(path));
            bool          compiled = page.CompileClasses(out compilerErrorCollection);

            Contract.Page oldPage   = this.Pages.Where(p => p.ID == page.ID).FirstOrDefault();
            int           pageIndex = Pages.IndexOf(oldPage);

            if (pageIndex != -1)
            {
                Pages[pageIndex] = page;
            }
            else
            {
                Pages.Add(page);
            }

            Debug.WriteLine("{0} = {1}", page.ID, compiled);

            return(compiled);
        }
        public bool DeletePage(string ID)
        {
            RequireSystemSigned();

            Contract.Page Page = PageManager.Session.Pages.Where(P => P.ID == ID).FirstOrDefault();
            if (Page == null)
            {
                return(false);
            }

            PageManager.Session.Pages.Remove(Page);

            string FilePath = HttpContext.Current.Server.MapPath(SettingsManager.Session.GetSystemSetting("PageDirectory") + "/" + ID + ".bpf");

            if (File.Exists(FilePath))
            {
                File.Delete(FilePath);
            }

            return(true);
        }
        /// <summary>
        /// Tries to compile a page to any possible return errors.
        /// This method does not save the page like <see cref="SystemLink.UpdatePage"/>.
        /// </summary>
        /// <param name="pageObject"></param>
        /// <returns></returns>
        public CompilerErrorCollection TryCompilePage(dynamic pageObject)
        {
            RequireSystemSigned();

            CompilerErrorCollection compilerErrors = new CompilerErrorCollection();

            Contract.Page page = PageManager.Session.Pages.Where(P => P.ID == pageObject.ID).FirstOrDefault();

            if (page != null && !page.IsLocked)
            {
                page = Contract.Page.FromString(page.ToString()); // Create a copy of the page

                page.Domain           = pageObject.Domain;
                page.Url              = pageObject.Url;
                page.CompilerLanguage = pageObject.CompilerLanguage;
                page.References       = ((ThirdParty.JsonArray)pageObject.References).Select(r => (string)r).ToList();

                PageReversion pageReversion = new PageReversion()
                {
                    Version = page.LatestReversion.Version + 1, Updated = DateTime.UtcNow, Classes = new List <PageClass>()
                };

                pageReversion.Classes = ((ThirdParty.JsonArray)pageObject.LatestReversion.Classes).Select(p => new PageClass()
                {
                    Name = ((dynamic)p).Name, Data = ((dynamic)p).Data
                }).ToList();
                page.LatestReversion = pageReversion;

                page.CompileClasses(out compilerErrors, false);
            }
            else
            {
                compilerErrors.Add(new CompilerError("", 0, 0, "", "Page is locked."));
            }

            return(compilerErrors);
        }
        public dynamic GetPageProperties(string pageID)
        {
            RequireSystemSigned();

            Contract.Page page = PageManager.Session.Pages.Where(P => P.ID == pageID).FirstOrDefault();

            if (page != null)
            {
                return new
                       {
                           ID               = page.ID,
                           Name             = page.Name,
                           Domain           = page.Domain,
                           Url              = page.Url,
                           CompilerLanguage = page.CompilerLanguage,
                           Locked           = page.IsLocked,
                           References       = page.References,
                           LatestReversion  = page.LatestReversion
                       }
            }
            ;

            return(null);
        }
        public CompilerErrorCollection UpdatePage(dynamic pageObject)
        {
            RequireSystemSigned();

            CompilerErrorCollection compilerErrors = new CompilerErrorCollection();

            Contract.Page page = PageManager.Session.Pages.Where(P => P.ID == pageObject.ID).FirstOrDefault();

            if (page == null)
            {
                page = new Contract.Page()
                {
                    ID               = pageObject.ID,
                    Domain           = pageObject.Domain,
                    Url              = pageObject.Url,
                    CompilerLanguage = pageObject.CompilerLanguage,
                    References       = ((ThirdParty.JsonArray)pageObject.References).Select(r => (string)r).ToList(),
                };

                PageReversion pageReversion = new PageReversion()
                {
                    Version = 1, Updated = DateTime.UtcNow, Classes = new List <PageClass>()
                };
                pageReversion.Classes = ((ThirdParty.JsonArray)pageObject.LatestReversion.Classes).Select(p => new PageClass()
                {
                    Name = ((dynamic)p).Name, Data = ((dynamic)p).Data
                }).ToList();

                page.LatestReversion = pageReversion;
                PageManager.Session.AppendPageReversion(page.ID, pageReversion);

                PageManager.Session.Pages.Add(page);
                page.CompileClasses(out compilerErrors);
                page.Save();
            }
            else if (!page.IsLocked)
            {
                page.Domain           = pageObject.Domain;
                page.Url              = pageObject.Url;
                page.CompilerLanguage = pageObject.CompilerLanguage;
                page.References       = ((ThirdParty.JsonArray)pageObject.References).Select(r => (string)r).ToList();

                PageReversion pageReversion = new PageReversion()
                {
                    Version = page.LatestReversion.Version + 1, Updated = DateTime.UtcNow, Classes = new List <PageClass>()
                };
                pageReversion.Classes = ((ThirdParty.JsonArray)pageObject.LatestReversion.Classes).Where(p => p != null).Select(p => new PageClass()
                {
                    Name = ((dynamic)p).Name, Data = ((dynamic)p).Data
                }).ToList();
                //page.Reversions.Add(pageReversion);

                page.LatestReversion = pageReversion;
                PageManager.Session.AppendPageReversion(page.ID, pageReversion);

                page.CompileClasses(out compilerErrors);
                page.Save();
            }
            else
            {
                compilerErrors.Add(new CompilerError("", 0, 0, "", "Page is locked."));
            }

            return(compilerErrors);
        }
Beispiel #8
0
        private void Page_Load(object sender, EventArgs e)
        {
            try
            {
                #region Signing stuff
                //string CompiledKeySignature = "ACQAAASAAACUAAAABgIAAAAkAABSU0ExAAQAAAEAAQDdmZjq3STJVDfs8UsPnWlObTAO3q2S6ksjcEcNZyjndUVSBsg7Taeyl13TQIZvdcs7JotZxqFN/6Ix+A5D3luYGwfalRsPUm4MSo8tHgVg2frb8KkgxJnb8ma7d+KWdliykrAFfaCamF9xDAUxNPapzO4u2ip1m0IiL9Y9JCGFnw==";
                //string AssemblyKeySignature = Convert.ToBase64String(Assembly.GetExecutingAssembly().GetName().GetPublicKey());

                //if (CompiledKeySignature != AssemblyKeySignature)
                //throw new Exception("WebCore modification has been detected. This is a voilation of the BlazeSoft terms of service and has been reported to BlazeSoft.");
                #endregion

                Debug.StartTimer("PageLoad");
                Debug.WriteLine("Page Access Count: {0}", ++PageAccessCount);

                string httpProtocol = (Request.IsSecureConnection) ? "https://" : "http://";
                this.pageUri = new Uri(httpProtocol + Request.Url.Host + Request.RawUrl);

                #if !DEBUG
                if (SettingsManager.Session.GetSystemSetting("IsSetup", false) == false)
                {
                    if (Request.UserHostAddress != "::1")
                    {
                        Response.Write("We're sorry. This web site has not been set up yet.");
                        return;
                    }
                    else
                    {
                        pageUri = pageUri.ChangePageUriPath("/administration/setup");
                    }
                }
                #endif

                if (pageUri.AbsolutePath.ToLower().StartsWith("/themes"))
                {
                    string[] urlParts = pageUri.AbsolutePath.ToLower().Split('/');

                    if (urlParts.Length >= 4)
                    {
                        string themeKey = urlParts[2];
                        string assetKey = string.Join("/", urlParts, 3, urlParts.Length - 3);

                        Theme theme = ThemeManager.Session.GetTheme(themeKey);

                        if (theme == null)
                        {
                            throw new Exceptions.PageNotFoundException();
                        }

                        Asset asset = theme.GetAsset(assetKey);

                        if (asset == null)
                        {
                            throw new Exceptions.PageNotFoundException();
                        }

                        Response.ContentType = asset.MimeType;
                        Response.BinaryWrite(asset.Data);

                        Response.End();
                    }
                    else
                    {
                        throw new Exceptions.PageNotFoundException();
                    }
                }
                else
                {
                    moduleSession = new ModuleSession(HttpContext.Current);

                    foreach (Contract.Module module in moduleSession.GetLoadedModules())
                    {
                        if (moduleSession.GetInstance(module) != null)
                        {
                            pageUri = moduleSession.GetInstance(module).GetPageUri(pageUri);
                        }
                    }

                    Uri newPageUri = pageUri;

                    foreach (Contract.Module module in moduleSession.GetLoadedModules())
                    {
                        if (moduleSession.GetInstance(module) != null)
                        {
                            newPageUri = moduleSession.GetInstance(module).GetPageRedirect(newPageUri);
                        }
                    }

                    if (newPageUri.ToString() != pageUri.ToString())
                    {
                        Response.Redirect(newPageUri.ToString());
                    }

                    Contract.Page page = PageManager.Session.GetPageByUri(pageUri);

                    if (page == null)
                    {
                        throw new Exceptions.PageNotFoundException();
                    }

                    if (page.CompilerLanguage == "Html")
                    {
                        var htmlPageInstance = new Page();
                        htmlPageInstance.CorePage      = page;
                        htmlPageInstance.ModuleSession = moduleSession;

                        Response.Write(ThemeManager.Session.ParseTemplate(string.Join("\r\n", page.LatestReversion.Classes.Select(c => c.Data)), page, htmlPageInstance, moduleSession));
                    }
                    else
                    {
                        //PageManager.Session.CompilePages();

                        Page PageInstance = page.Instance;

                        if (PageInstance != null)
                        {
                            PageInstance.CorePage      = page;
                            PageInstance.ModuleSession = moduleSession;

                            Debug.StartTimer("Page:" + page.ID + ":Initialize()");
                            PageInstance.Initialize();
                            Debug.StopTimer("Page:" + page.ID + ":Initialize()");
                            string Output = PageInstance.Themes.GetHtmlOutput(page, PageInstance, moduleSession);
                            Debug.StartTimer("Page:" + page.ID + ":Deinitialize()");
                            PageInstance.Deinitialize();
                            Debug.StopTimer("Page:" + page.ID + ":Deinitialize()");

                            Response.Write(Output);
                        }
                    }
                }

                Debug.StopTimer("PageLoad");

                #if DEBUG
                Response.Write(Debug.Output);
                #else
                //if(SettingsCore.Instance.GetSystemSetting("InDev", false))
                Response.Write(Debug.Output);
                #endif
            }
            catch (ThreadAbortException) { this.Page_Unload(sender, e); }
        }
Beispiel #9
0
        private void Page_Error(object sender, EventArgs e)
        {
            SettingsManager.Session.CheckForFileException();

            Exception exception = CoreUtilities.GetInnerMostException(Server.GetLastError());

            Response.Clear();

            var fakePage = new Contract.Page();

            fakePage.References.AddRange("BlazeSoft.Net.Web.dll,System.dll,System.Core.dll,System.Data.dll,System.Net.dll,System.Xml.dll,System.Xml.Linq.dll,System.Web.dll,Microsoft.CSharp.dll".Split(','));
            var accessObject = exception;

            if (exception.GetType() == typeof(Exceptions.PageNotFoundException))
            {
                Response.StatusCode = 404;

                try
                {
                    Response.Write(ThemeManager.Session.ParseTemplate(ThemeManager.Session.GetTheme("Errors").GetTemplate("404.html"), fakePage, accessObject, moduleSession));
                }
                catch (Exception ex)
                {
                    Response.Write("404");
                    Response.Write(ex.ToString());
                }
            }
            else if (exception.GetType() == typeof(Exceptions.AuthorizationLevelException))
            {
                Response.StatusCode = 403;

                try
                {
                    Response.Write(ThemeManager.Session.ParseTemplate(ThemeManager.Session.GetTheme("Errors").GetTemplate("403.html"), fakePage, accessObject, moduleSession));
                }
                catch
                {
                    Response.Write("403");
                }
            }
            else
            {
                Response.StatusCode = 500;

                try
                {
                    Response.Write(ThemeManager.Session.ParseTemplate(ThemeManager.Session.GetTheme("Errors").GetTemplate("500.html"), fakePage, accessObject, moduleSession));
                }
                catch
                {
                    Response.Write("500<br />");
                    Response.Write("<pre>" + exception.ToString() + "</pre>");
                }
            }

#if DEBUG
            Response.Write(Debug.Output);
#else
            //if(SettingsCore.Instance.GetSystemSetting("InDev", false))
            Response.Write(Debug.Output);
#endif
            Response.End();
        }
Beispiel #10
0
        private string EvalCode(string code, Contract.Page page, dynamic instance)
        {
            Assembly assembly = null;
            string   codeHash = code.Hash();

            if (!CacheManager.Session.CachedItemExists("themeCode", codeHash))
            {
                CodeDomProvider    codeDomProvider    = CodeDomProvider.CreateProvider("CSharp");
                CompilerParameters compilerParameters = new CompilerParameters();

                compilerParameters.ReferencedAssemblies.AddRange(page.References.ToArray());

                compilerParameters.CompilerOptions  = string.Format("/t:library /lib:{0},{1}", HttpContext.Current.Server.MapPath("./bin/"), HttpContext.Current.Server.MapPath("./bin/Libraries/"));
                compilerParameters.GenerateInMemory = false;

                #region sourceCode
                string sourceCode = @"using System;
using System.Xml;
using System.Data;
using System.Web;
using System.Text;

using BlazeSoft.Net.Web;
using BlazeSoft.Net.Web.Core;
using BlazeSoft.Net.Web.Link;

public class CodeEvaler
{
    public string Output = string.Empty;

    public dynamic Parent;

    public HttpContext Http;
    public ThemeLink Themes;
    public SettingsLink Settings;
    public dynamic Modules;
    public PageLink Pages;

    public void Write(object message, params object[] parameters)
    {
        string text = message != null ? message.ToString() : """";
        for (int parameter = 0; parameter < parameters.Length; parameter++)
            text = text.Replace(""{"" + parameter + ""}"", parameters[parameter] != null ? parameters[parameter].ToString() : ""{NULL}"");
        Output += text;
    }

    public void WriteLine(object message, params object[] parameters)
    {
        string text = message != null ? message.ToString() : """";
        for (int parameter = 0; parameter < parameters.Length; parameter++)
            text = text.Replace(""{"" + parameter + ""}"", parameters[parameter] != null ? parameters[parameter].ToString() : ""{NULL}"");
        Output += text + ""\r\n"";
    }

    public void Include(string templateFile)
    {
        Write(Themes.GetTheme().GetTemplateAndParse(templateFile, Parent));
    }

    public void Eval()
    {
        " + code + @"
    }
}";
                #endregion

                CompilerResults compilerResults = codeDomProvider.CompileAssemblyFromSource(compilerParameters, sourceCode);

                if (compilerResults.Errors.Count > 0)
                {
                    throw new Exceptions.TemplateSyntaxException(string.Format("{0} on line {1}", compilerResults.Errors[0].ErrorText, compilerResults.Errors[0].Line));
                }

                assembly = Assembly.Load(File.ReadAllBytes(compilerResults.PathToAssembly));
                CacheManager.Session.AddCachedItem("themeCode", codeHash, assembly);
            }

            assembly = CacheManager.Session.GetCachedItem("themeCode", codeHash);

            dynamic evalInstance = assembly.CreateInstance("CodeEvaler");

            try
            {
                evalInstance.Http     = instance.Http;
                evalInstance.Themes   = instance.Themes;
                evalInstance.Settings = instance.Settings;
                evalInstance.Modules  = instance.Modules;
                evalInstance.Pages    = instance.Pages;
            }
            catch (RuntimeBinderException)
            {
                evalInstance.Http = HttpContext.Current;
            }

            evalInstance.Parent = instance;

            try
            {
                evalInstance.Eval();
            }
            catch (Exception e)
            {
                throw new Exceptions.TemplateSyntaxException(e.Message);
            }

            return(evalInstance.Output);
        }
Beispiel #11
0
        public string ParseBlocks(string Template, Contract.Page Page, dynamic This, ModuleSession ModuleSession)
        {
            int OpenCodeTags        = 0;
            int StartingCodeTag     = 0;
            int StartCodeIndex      = 0;
            int OpenVariableTags    = 0;
            int StartingVariableTag = 0;
            int StartVariableIndex  = 0;

            for (int i = 0; i < Template.Length; i++)
            {
                if (Template[i] == '{' && (i > 0 && Template[i - 1] != '\\'))
                {
                    OpenCodeTags++;
                }
                else if (Template[i] == '}' && (i > 0 && Template[i - 1] != '\\') && OpenCodeTags > 0)
                {
                    OpenCodeTags--;
                }

                if (Template[i] == '[' && (i > 0 && Template[i - 1] != '\\'))
                {
                    OpenVariableTags++;
                }
                else if (Template[i] == ']' && (i > 0 && Template[i - 1] != '\\') && OpenVariableTags > 0)
                {
                    OpenVariableTags--;
                }

                if (Template[i] == '{' && (i > 0 && Template[i - 1] == '#') && StartingCodeTag == 0)
                {
                    StartCodeIndex  = i;
                    StartingCodeTag = OpenCodeTags;
                }
                if (OpenCodeTags == StartingCodeTag - 1 && Template[i] == '}')
                {
                    StartingCodeTag = 0;

                    string Code       = Template.Substring(StartCodeIndex + 1, i - StartCodeIndex - 1).Replace("\\}", "}").Replace("\\{", "{");
                    string EvaledCode = this.EvalCode(Code, Page, This);

                    string tmpTemplate = Template.Substring(0, StartCodeIndex - 1) + EvaledCode + Template.Substring(i + 1);

                    i += tmpTemplate.Length - Template.Length;

                    Template = tmpTemplate;
                }

                if (Template[i] == '[' && (i > 0 && Template[i - 1] == '#') && StartingVariableTag == 0)
                {
                    StartVariableIndex  = i;
                    StartingVariableTag = OpenVariableTags;
                }
                if (OpenVariableTags == StartingVariableTag - 1 && Template[i] == ']')
                {
                    StartingVariableTag = 0;

                    string Code       = "Write(" + Template.Substring(StartVariableIndex + 1, i - StartVariableIndex - 1).Replace("\\]", "]").Replace("\\[", "[") + ");";
                    string EvaledCode = this.EvalCode(Code, Page, This);

                    string tmpTemplate = Template.Substring(0, StartVariableIndex - 1) + EvaledCode + Template.Substring(i + 1);

                    i += tmpTemplate.Length - Template.Length;

                    Template = tmpTemplate;
                }
            }

            return(Template);
        }