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); } }
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); }
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); } }
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(); }
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); }
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); }