using System; using System.Collections.Generic; using System.Configuration; using System.IO; using System.Linq; using System.Web; using System.Web.Caching; using System.Web.Hosting; public static class Blog { static Blog() { Theme = ConfigurationManager.AppSettings.Get("blog:theme"); Title = ConfigurationManager.AppSettings.Get("blog:name"); Description = ConfigurationManager.AppSettings.Get("blog:description"); PostsPerPage = int.Parse(ConfigurationManager.AppSettings.Get("blog:postsPerPage")); DaysToComment = int.Parse(ConfigurationManager.AppSettings.Get("blog:daysToComment")); Image = ConfigurationManager.AppSettings.Get("blog:image"); ModerateComments = bool.Parse(ConfigurationManager.AppSettings.Get("blog:moderateComments")); } public static string Title { get; private set; } public static string Description { get; private set; } public static string Theme { get; private set; } public static string Image { get; private set; } public static int PostsPerPage { get; private set; } public static int DaysToComment { get; private set; } public static bool ModerateComments { get; private set; } public static int UniqueId { get { return FingerPrint("/web.config").GetHashCode(); } } public static string CurrentSlug { get { return (HttpContext.Current.Request.QueryString["slug"] ?? string.Empty).Trim().ToLowerInvariant(); } } public static string CurrentCategory { get { return (HttpContext.Current.Request.QueryString["category"] ?? string.Empty).Trim().ToLowerInvariant(); } } public static bool IsNewPost { get { return HttpContext.Current.Request.RawUrl.Trim('/') == "post/new"; } } public static Post CurrentPost { get { if (HttpContext.Current.Items["currentpost"] == null && !string.IsNullOrEmpty(CurrentSlug)) { var post = Storage.GetAllPosts().FirstOrDefault(p => p.Slug == CurrentSlug); if (post != null && (post.IsPublished || HttpContext.Current.User.Identity.IsAuthenticated)) HttpContext.Current.Items["currentpost"] = Storage.GetAllPosts().FirstOrDefault(p => p.Slug == CurrentSlug); } return HttpContext.Current.Items["currentpost"] as Post; } } public static string GetNextPage() { if (!string.IsNullOrEmpty(CurrentSlug)) { var current = Storage.GetAllPosts().IndexOf(CurrentPost); if (current > 0) return Storage.GetAllPosts()[current - 1].Url.ToString(); } else if (CurrentPage > 1) { return GetPagingUrl(-1); } return null; } public static string GetPrevPage() { if (!string.IsNullOrEmpty(CurrentSlug)) { var current = Storage.GetAllPosts().IndexOf(CurrentPost); if (current > -1) return Storage.GetAllPosts()[current + 1].Url.ToString(); } else { return GetPagingUrl(1); } return null; } public static int CurrentPage { get { int page = 0; if (int.TryParse(HttpContext.Current.Request.QueryString["page"], out page)) return page; return 1; } } public static IEnumerable GetPosts(int postsPerPage = 0) { var posts = from p in Storage.GetAllPosts() where (p.IsPublished && p.PubDate <= DateTime.UtcNow) || HttpContext.Current.User.Identity.IsAuthenticated select p; string category = HttpContext.Current.Request.QueryString["category"]; if (!string.IsNullOrEmpty(category)) { posts = posts.Where(p => p.Categories.Any(c => string.Equals(c, category, StringComparison.OrdinalIgnoreCase))); } if (postsPerPage > 0) { posts = posts.Skip(postsPerPage * (CurrentPage - 1)).Take(postsPerPage); } return posts; } public static bool MatchesUniqueId(HttpContext context) { int token; return int.TryParse(context.Request.Form["token"], out token) && token == Blog.UniqueId; } public static string SaveFileToDisk(byte[] bytes, string extension) { string relative = "~/posts/files/" + Guid.NewGuid() + "." + extension.Trim('.'); string file = HostingEnvironment.MapPath(relative); File.WriteAllBytes(file, bytes); var cruncher = new ImageCruncher.Cruncher(); cruncher.CrunchImages(file); return VirtualPathUtility.ToAbsolute(relative); } public static string GetPagingUrl(int move) { string url = "/page/{0}/"; string category = HttpContext.Current.Request.QueryString["category"]; if (!string.IsNullOrEmpty(category)) { url = "/category/" + HttpUtility.UrlEncode(category.ToLowerInvariant()) + "/" + url; } string relative = string.Format("~" + url, Blog.CurrentPage + move); return VirtualPathUtility.ToAbsolute(relative); } public static string FingerPrint(string rootRelativePath, string cdnPath = "") { if (!string.IsNullOrEmpty(cdnPath) && !HttpContext.Current.IsDebuggingEnabled) { return cdnPath; } if (HttpRuntime.Cache[rootRelativePath] == null) { string relative = VirtualPathUtility.ToAbsolute("~" + rootRelativePath); string absolute = HostingEnvironment.MapPath(relative); if (!File.Exists(absolute)) { throw new FileNotFoundException("File not found", absolute); } DateTime date = File.GetLastWriteTime(absolute); int index = relative.LastIndexOf('/'); string result = relative.Insert(index, "/v-" + date.Ticks); HttpRuntime.Cache.Insert(rootRelativePath, result, new CacheDependency(absolute)); } return HttpRuntime.Cache[rootRelativePath] as string; } public static void SetConditionalGetHeaders(DateTime lastModified, HttpContextBase context) { HttpResponseBase response = context.Response; HttpRequestBase request = context.Request; lastModified = new DateTime(lastModified.Year, lastModified.Month, lastModified.Day, lastModified.Hour, lastModified.Minute, lastModified.Second); string incomingDate = request.Headers["If-Modified-Since"]; response.Cache.SetLastModified(lastModified); DateTime testDate = DateTime.MinValue; if (DateTime.TryParse(incomingDate, out testDate) && testDate == lastModified) { response.ClearContent(); response.StatusCode = (int)System.Net.HttpStatusCode.NotModified; response.SuppressContent = true; } } }