public async Task <IActionResult> General([FromForm] MagicCodeWrapper <GeneralSettingsViewModel> wrapperModel, [FromServices] ITZoneResolver tZoneResolver) { var model = wrapperModel.ViewModel; _blogConfig.GeneralSettings.MetaKeyword = model.MetaKeyword; _blogConfig.GeneralSettings.MetaDescription = model.MetaDescription; _blogConfig.GeneralSettings.CanonicalPrefix = model.CanonicalPrefix; _blogConfig.GeneralSettings.SiteTitle = model.SiteTitle; _blogConfig.GeneralSettings.Copyright = model.Copyright; _blogConfig.GeneralSettings.LogoText = model.LogoText; _blogConfig.GeneralSettings.SideBarCustomizedHtmlPitch = model.SideBarCustomizedHtmlPitch; _blogConfig.GeneralSettings.SideBarOption = Enum.Parse <SideBarOption>(model.SideBarOption); _blogConfig.GeneralSettings.FooterCustomizedHtmlPitch = model.FooterCustomizedHtmlPitch; _blogConfig.GeneralSettings.TimeZoneUtcOffset = tZoneResolver.GetTimeSpanByZoneId(model.SelectedTimeZoneId).ToString(); _blogConfig.GeneralSettings.TimeZoneId = model.SelectedTimeZoneId; _blogConfig.GeneralSettings.ThemeFileName = model.SelectedThemeFileName; _blogConfig.GeneralSettings.OwnerName = model.OwnerName; _blogConfig.GeneralSettings.OwnerEmail = model.OwnerEmail; _blogConfig.GeneralSettings.Description = model.OwnerDescription; _blogConfig.GeneralSettings.ShortDescription = model.OwnerShortDescription; _blogConfig.GeneralSettings.AutoDarkLightTheme = model.AutoDarkLightTheme; await _blogConfig.SaveAsync(_blogConfig.GeneralSettings); AppDomain.CurrentDomain.SetData("CurrentThemeColor", null); await _blogAudit.AddAuditEntry(EventType.Settings, AuditEventId.SettingsSavedGeneral, "General Settings updated."); return(Ok()); }
public async Task <IActionResult> Content([FromForm] MagicCodeWrapper <ContentSettingsViewModel> wrapperModel) { var model = wrapperModel.ViewModel; _blogConfig.ContentSettings.DisharmonyWords = model.DisharmonyWords; _blogConfig.ContentSettings.EnableComments = model.EnableComments; _blogConfig.ContentSettings.RequireCommentReview = model.RequireCommentReview; _blogConfig.ContentSettings.EnableWordFilter = model.EnableWordFilter; _blogConfig.ContentSettings.WordFilterMode = Enum.Parse <WordFilterMode>(model.WordFilterMode); _blogConfig.ContentSettings.UseFriendlyNotFoundImage = model.UseFriendlyNotFoundImage; _blogConfig.ContentSettings.PostListPageSize = model.PostListPageSize; _blogConfig.ContentSettings.HotTagAmount = model.HotTagAmount; _blogConfig.ContentSettings.EnableGravatar = model.EnableGravatar; _blogConfig.ContentSettings.ShowCalloutSection = model.ShowCalloutSection; _blogConfig.ContentSettings.CalloutSectionHtmlPitch = model.CalloutSectionHtmlPitch; _blogConfig.ContentSettings.ShowPostFooter = model.ShowPostFooter; _blogConfig.ContentSettings.PostFooterHtmlPitch = model.PostFooterHtmlPitch; _blogConfig.ContentSettings.DefaultLangCode = model.DefaultLangCode; await _blogConfig.SaveAsync(_blogConfig.ContentSettings); await _blogAudit.AddAuditEntry(EventType.Settings, AuditEventId.SettingsSavedContent, "Content Settings updated."); return(Ok()); }
public async Task <IActionResult> CustomStyleSheet([FromForm] MagicCodeWrapper <CustomStyleSheetSettingsViewModel> wrapperModel) { var model = wrapperModel.ViewModel; var settings = _blogConfig.CustomStyleSheetSettings; if (model.EnableCustomCss && string.IsNullOrWhiteSpace(model.CssCode)) { ModelState.AddModelError(nameof(CustomStyleSheetSettingsViewModel.CssCode), "CSS Code is required"); return(BadRequest(ModelState.CombineErrorMessages())); } var uglifyTest = Uglify.Css(model.CssCode); if (uglifyTest.HasErrors) { foreach (var err in uglifyTest.Errors) { ModelState.AddModelError(model.CssCode, err.ToString()); } return(BadRequest(ModelState.CombineErrorMessages())); } settings.EnableCustomCss = model.EnableCustomCss; settings.CssCode = model.CssCode; await _blogConfig.SaveAsync(settings); await _blogAudit.AddAuditEntry(EventType.Settings, AuditEventId.SettingsSavedAdvanced, "Custom Style Sheet Settings updated."); return(Ok()); }
public async Task <IActionResult> Security([FromForm] MagicCodeWrapper <SecuritySettingsViewModel> wrapperModel) { var model = wrapperModel.ViewModel; var settings = _blogConfig.SecuritySettings; settings.WarnExternalLink = model.WarnExternalLink; settings.AllowScriptsInPage = model.AllowScriptsInPage; settings.ShowAdminLoginButton = model.ShowAdminLoginButton; await _blogConfig.SaveAsync(settings); await _blogAudit.AddAuditEntry(EventType.Settings, AuditEventId.SettingsSavedAdvanced, "Security Settings updated."); return(Ok()); }
public async Task <IActionResult> Watermark([FromForm] MagicCodeWrapper <WatermarkSettingsViewModel> wrapperModel) { var model = wrapperModel.ViewModel; var settings = _blogConfig.WatermarkSettings; settings.IsEnabled = model.IsEnabled; settings.KeepOriginImage = model.KeepOriginImage; settings.FontSize = model.FontSize; settings.WatermarkText = model.WatermarkText; await _blogConfig.SaveAsync(settings); await _blogAudit.AddAuditEntry(EventType.Settings, AuditEventId.SettingsSavedWatermark, "Watermark Settings updated."); return(Ok()); }
public async Task <IActionResult> Notification([FromForm] MagicCodeWrapper <NotificationSettingsViewModel> wrapperModel) { var model = wrapperModel.ViewModel; var settings = _blogConfig.NotificationSettings; settings.EmailDisplayName = model.EmailDisplayName; settings.EnableEmailSending = model.EnableEmailSending; settings.SendEmailOnCommentReply = model.SendEmailOnCommentReply; settings.SendEmailOnNewComment = model.SendEmailOnNewComment; await _blogConfig.SaveAsync(settings); await _blogAudit.AddAuditEntry(EventType.Settings, AuditEventId.SettingsSavedNotification, "Notification Settings updated."); return(Ok()); }
public async Task <IActionResult> Advanced([FromForm] MagicCodeWrapper <AdvancedSettingsViewModel> wrapperModel) { var model = wrapperModel.ViewModel; var settings = _blogConfig.AdvancedSettings; settings.DNSPrefetchEndpoint = model.DNSPrefetchEndpoint; settings.RobotsTxtContent = model.RobotsTxtContent; settings.EnablePingBackSend = model.EnablePingbackSend; settings.EnablePingBackReceive = model.EnablePingbackReceive; settings.EnableOpenGraph = model.EnableOpenGraph; settings.EnableCDNRedirect = model.EnableCDNRedirect; settings.EnableOpenSearch = model.EnableOpenSearch; settings.FitImageToDevicePixelRatio = model.FitImageToDevicePixelRatio; if (model.EnableCDNRedirect) { if (string.IsNullOrWhiteSpace(model.CDNEndpoint)) { throw new ArgumentNullException(nameof(model.CDNEndpoint), $"{nameof(model.CDNEndpoint)} must be specified when {nameof(model.EnableCDNRedirect)} is enabled."); } _logger.LogWarning("Images are configured to use CDN, the endpoint is out of control, use it on your own risk."); // Validate endpoint Url to avoid security risks // But it still has risks: // e.g. If the endpoint is compromised, the attacker could return any kind of response from a image with a big f**k to a script that can attack users. var endpoint = model.CDNEndpoint; var isValidEndpoint = endpoint.IsValidUrl(UrlExtension.UrlScheme.Https); if (!isValidEndpoint) { throw new UriFormatException("CDN Endpoint is not a valid HTTPS Url."); } settings.CDNEndpoint = model.CDNEndpoint; } await _blogConfig.SaveAsync(settings); await _blogAudit.AddAuditEntry(EventType.Settings, AuditEventId.SettingsSavedAdvanced, "Advanced Settings updated."); return(Ok()); }
public async Task <IActionResult> Subscription([FromForm] MagicCodeWrapper <SubscriptionSettingsViewModel> wrapperModel) { var model = wrapperModel.ViewModel; var settings = _blogConfig.FeedSettings; settings.AuthorName = model.AuthorName; settings.RssCopyright = model.RssCopyright; settings.RssDescription = model.RssDescription; settings.RssItemCount = model.RssItemCount; settings.RssTitle = model.RssTitle; settings.UseFullContent = model.UseFullContent; await _blogConfig.SaveAsync(settings); await _blogAudit.AddAuditEntry(EventType.Settings, AuditEventId.SettingsSavedSubscription, "Subscription Settings updated."); return(Ok()); }
public async Task <IActionResult> CreateOrEdit( [FromForm] MagicCodeWrapper <PostEditModel> temp, [FromServices] LinkGenerator linkGenerator) { try { if (!ModelState.IsValid) { return(Conflict(ModelState.CombineErrorMessages())); } // temp solution var model = temp.ViewModel; var tags = string.IsNullOrWhiteSpace(model.Tags) ? Array.Empty <string>() : model.Tags.Split(',').ToArray(); var request = new UpdatePostRequest { Title = model.Title.Trim(), Slug = model.Slug.Trim(), EditorContent = model.EditorContent, EnableComment = model.EnableComment, ExposedToSiteMap = model.ExposedToSiteMap, IsFeedIncluded = model.FeedIncluded, ContentLanguageCode = model.LanguageCode, IsPublished = model.IsPublished, IsSelected = model.Featured, Tags = tags, CategoryIds = model.SelectedCategoryIds }; var tzDate = _tZoneResolver.NowOfTimeZone; if (model.ChangePublishDate && model.PublishDate.HasValue && model.PublishDate <= tzDate && model.PublishDate.GetValueOrDefault().Year >= 1975) { request.PublishDate = _tZoneResolver.ToUtc(model.PublishDate.Value); } var postEntity = model.PostId == Guid.Empty ? await _postService.CreateAsync(request) : await _postService.UpdateAsync(model.PostId, request); if (model.IsPublished) { _logger.LogInformation($"Trying to Ping URL for post: {postEntity.Id}"); var pubDate = postEntity.PubDateUtc.GetValueOrDefault(); var link = linkGenerator.GetUriByAction(HttpContext, "Slug", "Post", new { year = pubDate.Year, month = pubDate.Month, day = pubDate.Day, postEntity.Slug }); if (_blogConfig.AdvancedSettings.EnablePingBackSend) { _ = Task.Run(async() => { await _pingbackSender.TrySendPingAsync(link, postEntity.PostContent); }); } } return(Ok(new { PostId = postEntity.Id })); } catch (Exception ex) { _logger.LogError(ex, "Error Creating New Post."); Response.StatusCode = (int)HttpStatusCode.InternalServerError; return(Conflict(ex.Message)); } }