Пример #1
0
        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());
        }
Пример #2
0
        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());
        }
Пример #3
0
        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());
        }
Пример #4
0
        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());
        }
Пример #5
0
        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());
        }
Пример #6
0
        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());
        }
Пример #7
0
        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());
        }
Пример #8
0
        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());
        }
Пример #9
0
        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));
            }
        }