using System; using System.Drawing; using System.Globalization; using System.IO; using System.Net; using System.Text; using System.Web; using System.Web.UI.WebControls; using System.Xml; namespace FastReport.Web { /// /// /// public static class WebUtils { /// /// Contain the filename of httphandler /// public const string HandlerFileName = "FastReport.Export.axd"; internal const string PicsPrefix = "frximg"; internal const string PrintPrefix = "frxprint"; internal const string ReportPrefix = "frxreport"; internal const string StartupScriptName = "FrxStartup"; internal const string ConstID = "ID"; internal const string DefaultCreator = "FastReport"; internal const string DefaultProducer = "FastReport .NET"; internal const string HiddenIDSuffix = "FRID"; /// /// Determines whether the path is an absolute physical path. /// /// The path to check. /// true if the path is absolute physical path. public static bool IsAbsolutePhysicalPath(string path) { if ((path == null) || (path.Length < 3)) { return false; } return Path.IsPathRooted(path); } /// /// /// /// /// public static string ToHtmlString(Unit unit) { switch (unit.Type) { case UnitType.Pixel: return unit.Value + "px"; case UnitType.Percentage: return unit.Value + "%"; default: return unit.Value.ToString(); } } /// /// Returns the HTML color representation; /// /// /// public static string HTMLColor(Color color) { if (color == Color.Transparent) return "transparent"; #if DOTNET_4 return ColorTranslator.ToHtml(color); #else return String.Join(String.Empty, new String[] { "#", color.R.ToString("X2"), color.G.ToString("X2"), color.B.ToString("X2") }); #endif } private static bool CheckNewHandlerInLocationTags(XmlNode element) { foreach (XmlNode locationNode in element.SelectNodes("location")) if (CheckNewHandler(locationNode)) return true; return false; } private static bool CheckNewHandler(XmlNode element) { bool found = false; XmlNode node = element.SelectSingleNode("system.webServer"); if (node != null) { XmlNode node2 = node.SelectSingleNode("handlers"); if (node2 != null) { XmlNode node3 = node2.SelectSingleNode(String.Format("add[@path=\"{0}\"]", HandlerFileName)); found = (node3 != null); } } return found; } private static bool CheckOldHandler(XmlNode element) { bool found = false; XmlNode node = element.SelectSingleNode("system.web"); if (node != null) { XmlNode node2 = node.SelectSingleNode("httpHandlers"); if (node2 != null) { XmlNode node3 = node2.SelectSingleNode(String.Format("add[@path=\"{0}\"]", HandlerFileName)); found = (node3 != null); } } return found; } /// /// Check http handlers in web.config /// /// public static bool CheckHandlers() { string webConfigFile = HttpContext.Current.Server.MapPath("~/web.config"); if (!File.Exists(webConfigFile)) webConfigFile = HttpContext.Current.Server.MapPath("~/Web.config"); bool found1 = false; bool found2 = false; bool found3 = false; if (File.Exists(webConfigFile)) { XmlDocument xml = new XmlDocument(); xml.Load(webConfigFile); XmlElement element = xml.DocumentElement; found1 = CheckOldHandler(element); found2 = CheckNewHandler(element); found3 = CheckNewHandlerInLocationTags(element); } return found1 || found2 || found3; } /// /// Add http handlers in web.config /// public static void AddHandlers(string webConfigFile) { if (File.Exists(webConfigFile)) { bool modified = false; XmlDocument xml = new XmlDocument(); xml.Load(webConfigFile); XmlElement element = xml.DocumentElement; // integrated style string s = "system.webServer"; XmlNode node = element.SelectSingleNode(s); if (node == null) { node = xml.CreateElement(s); element.AppendChild(node); } XmlNode node2 = node.SelectSingleNode("validation[@validateIntegratedModeConfiguration=\"false\"]"); if (node2 == null) { node2 = xml.CreateElement("validation"); XmlAttribute a = xml.CreateAttribute("validateIntegratedModeConfiguration"); a.Value = "false"; node2.Attributes.Append(a); node.AppendChild(node2); modified = true; } s = "handlers"; node2 = node.SelectSingleNode(s); if (node2 == null) { node2 = xml.CreateElement(s); node.AppendChild(node2); } XmlNode node3 = node2.SelectSingleNode(String.Format("add[@path=\"{0}\"]", HandlerFileName)); if (node3 == null) { node3 = xml.CreateElement("add"); XmlAttribute a = xml.CreateAttribute("name"); a.Value = "FastReportHandler"; node3.Attributes.Append(a); a = xml.CreateAttribute("path"); a.Value = HandlerFileName; node3.Attributes.Append(a); a = xml.CreateAttribute("verb"); a.Value = "*"; node3.Attributes.Append(a); a = xml.CreateAttribute("type"); a.Value = "FastReport.Web.Handlers.WebExport"; node3.Attributes.Append(a); node2.AppendChild(node3); modified = true; } // standard style s = "system.web"; node = element.SelectSingleNode(s); if (node == null) { node = xml.CreateElement(s); element.AppendChild(node); } s = "httpHandlers"; node2 = node.SelectSingleNode(s); if (node2 == null) { node2 = xml.CreateElement(s); node.AppendChild(node2); } node3 = node2.SelectSingleNode(String.Format("add[@path=\"{0}\"]", HandlerFileName)); if (node3 == null) { node3 = xml.CreateElement("add"); XmlAttribute a = xml.CreateAttribute("path"); a.Value = HandlerFileName; node3.Attributes.Append(a); a = xml.CreateAttribute("verb"); a.Value = "*"; node3.Attributes.Append(a); a = xml.CreateAttribute("type"); a.Value = "FastReport.Web.Handlers.WebExport"; node3.Attributes.Append(a); node2.AppendChild(node3); modified = true; } // save config if (modified) xml.Save(webConfigFile); } } /// /// /// public static void CheckHandlersRuntime() { if (!CheckHandlers()) throw new Exception(GetHandlerError()); } /// /// /// /// public static string GetHandlerError() { StringBuilder e = new StringBuilder(); e.AppendLine("FastReport handler not found or its extension has been changed . Please check your web.config:"); e.AppendLine("IIS6"); e.AppendLine(""); e.AppendLine("..."); e.AppendLine(" "); e.Append(" "); e.AppendLine(" ...."); e.AppendLine(" "); e.AppendLine(""); e.AppendLine("IIS7"); e.AppendLine(""); e.AppendLine("..."); e.AppendLine(" "); e.AppendLine(" "); e.AppendLine("..."); e.AppendLine(" "); e.AppendLine(" ..."); e.AppendLine(" "); e.Append(" "); e.AppendLine(" "); e.AppendLine(" "); e.AppendLine(""); return e.ToString(); } /// /// /// /// /// public static string ReverseString(string str) { StringBuilder result = new StringBuilder(str.Length); int i, j; if (!String.IsNullOrEmpty(str)) for (j = 0, i = str.Length - 1; i >= 0; i--, j++) result.Append(str[i]); return result.ToString(); } /// /// /// /// /// /// public static string GetGUID(HttpContext context, string id) { string result = String.Empty; if (HttpContext.Current != null) result = context.Request[String.Concat(id, "$", WebUtils.HiddenIDSuffix)]; if (String.IsNullOrEmpty(result)) result = Guid.NewGuid().ToString().Replace("-", ""); else result = WebUtils.ReverseString(result); return result; } /// /// /// /// public static string GetGUID() { Guid guid = Guid.Empty; while (Guid.Empty == guid) { guid = Guid.NewGuid(); } string guidStr = String.Concat("fr", Convert.ToBase64String(guid.ToByteArray()).Substring(0, 22).Replace("/", "_").Replace("+", "-")); return guidStr; } /// /// IE8 and older browsers detection. /// /// /// public static bool IsIE8(HttpContext context) { if (context != null) return (context.Request.Browser.Browser == "InternetExplorer" || context.Request.Browser.Browser == "IE") && (context.Request.Browser.Version == "8.0" || context.Request.Browser.Version == "7.0" || context.Request.Browser.Version == "6.0"); else return false; } /// /// Add NoCache haders in Context.Reponse /// /// public static void AddNoCacheHeaders(HttpContext context) { context.Response.AddHeader("Expires", "May, 3 Jul 1997 05:00:00 GMT"); context.Response.AddHeader("Cache-Control", "no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"); context.Response.AddHeader("Pragma", "no-cache"); } /*/// /// Setup the context. /// /// //public static void SetContext(HttpContext context) //{ // SetAzureCookies(context); // AddNoCacheHeaders(context); //} */ /// /// Converts Color in HTML format with transparency. /// /// /// public static string RGBAColor(Color color) { NumberFormatInfo provider = new NumberFormatInfo(); provider.NumberGroupSeparator = String.Empty; provider.NumberDecimalSeparator = "."; return String.Format("rgba({0}, {1}, {2}, {3})", color.R.ToString(""), color.G.ToString(""), color.B.ToString(""), Math.Round((float)color.A / 255).ToString(provider) ); } internal static void Write(Stream stream, string value) { byte[] buf = Encoding.UTF8.GetBytes(value); stream.Write(buf, 0, buf.Length); } internal static void ResponseChunked(HttpResponse httpResponse, byte[] p) { int chunkSize = 2048; int position = 0; while (position < p.Length && httpResponse.IsClientConnected) { if (chunkSize > p.Length - position) chunkSize = p.Length - position; httpResponse.OutputStream.Write(p, position, chunkSize); position += chunkSize; httpResponse.Flush(); } } internal static string GetAppRoot(HttpContext context, string path) { if (path.IndexOf("://") != -1) return path; string s = String.Concat(context.Request.ApplicationPath == "/" ? "" : context.Request.ApplicationPath, path.IndexOf("/") == 0 ? "" : "/", path.Replace("~/", "")); return s; } internal static object GetSalt() { return string.Concat("&s=", new Random(DateTime.Now.Millisecond).Next(10000).ToString()); } internal static string GetBasePath(HttpContext httpContext) { if (httpContext != null) { string s = httpContext.Request.ApplicationPath; if (s.EndsWith("/")) return s; else return s + "/"; } else return string.Empty; } internal static bool SetupResponse(WebReport webReport, HttpContext context) { if (webReport != null) { CustomAuthEventArgs authArgs = new CustomAuthEventArgs(); authArgs.Context = context; webReport.OnCustomAuth(authArgs); if (!authArgs.AuthPassed) { context.Response.StatusCode = 401; return false; } if (webReport.ResponseHeaders != null) { foreach (string key in webReport.ResponseHeaders.AllKeys) context.Response.Headers.Add(key, webReport.ResponseHeaders.Get(key)); } } WebUtils.SetAzureCookies(context); WebUtils.AddNoCacheHeaders(context); return true; } internal static void SetAzureCookies(HttpContext context) { string ARRAffinity = GetWebsiteInstanceId(); if (!String.IsNullOrEmpty(ARRAffinity)) { HttpCookie cookie = new HttpCookie("ARRAffinity", ARRAffinity); cookie.Expires = DateTime.Now.AddMinutes(30); context.Response.Cookies.Add(cookie); } } internal static void CopyCookies(HttpWebRequest request, HttpContext context) { if (HttpContext.Current == null) return; if (request.CookieContainer == null) request.CookieContainer = new CookieContainer(); foreach (var cookieKey in HttpContext.Current.Request.Cookies.Keys) { if (!cookieKey.ToString().Equals("ASP.NET_SessionId")) { var cookie = HttpContext.Current.Request.Cookies[cookieKey.ToString()]; request.CookieContainer.Add(new Cookie(cookie.Name, cookie.Value, cookie.Path, string.IsNullOrEmpty(cookie.Domain) ? HttpContext.Current.Request.Url.Host : cookie.Domain)); } } UriBuilder uri = new UriBuilder { Scheme = context.Request.Url.Scheme, Host = context.Request.Url.Host }; string ARRAffinity = GetWebsiteInstanceId(); if (!String.IsNullOrEmpty(ARRAffinity)) request.CookieContainer.Add(uri.Uri, new Cookie("ARRAffinity", ARRAffinity)); } internal static string GetARRAffinity() { string id = GetWebsiteInstanceId(); if (!String.IsNullOrEmpty(id)) return String.Concat("&ARRAffinity=", id); else return String.Empty; } internal static string GetWebsiteInstanceId() { return Environment.GetEnvironmentVariable("WEBSITE_INSTANCE_ID"); } internal static string JavaScriptStringEncode(string s) { if (string.IsNullOrEmpty(s)) return string.Empty; bool needEncode = false; for (int i = 0; i < s.Length; i++) { char c = s[i]; if (c >= 0 && c <= 31 || c == 34 || c == 39 || c == 60 || c == 62 || c == 92) { needEncode = true; break; } } if (!needEncode) return s; StringBuilder sb = new StringBuilder(); for (int i = 0; i < s.Length; i++) { char c = s[i]; if (c >= 0 && c <= 7 || c == 11 || c >= 14 && c <= 31 || c == 39 || c == 60 || c == 62) { sb.AppendFormat("\\u{0:x4}", (int)c); } else { switch ((int)c) { case 8: sb.Append("\\b"); break; case 9: sb.Append("\\t"); break; case 10: sb.Append("\\n"); break; case 12: sb.Append("\\f"); break; case 13: sb.Append("\\r"); break; case 34: sb.Append("\\\""); break; case 92: sb.Append("\\\\"); break; default: sb.Append(c); break; } } } return sb.ToString(); } internal static bool IsPng(byte[] image) { byte[] pngHeader = new byte[] { 137, 80, 78, 71, 13, 10, 26, 10 }; bool isPng = true; for (int i = 0; i < 8; i++) if (image[i] != pngHeader[i]) { isPng = false; break; } return isPng; } } }