public void SetRequestTheme(string theme)
        {
            try
            {
                var dataTokens = _httpContext?.GetRouteData()?.DataTokens;

                if (dataTokens == null)
                {
                    return;
                }

                if (theme.HasValue())
                {
                    dataTokens[OverriddenThemeNameKey] = theme;
                }
                else if (dataTokens.ContainsKey(OverriddenThemeNameKey))
                {
                    dataTokens.Remove(OverriddenThemeNameKey);
                }

                _currentTheme = null;
            }
            catch
            {
            }
        }
Exemple #2
0
        /// <summary>
        /// Validates the result SASS file by calling it's url.
        /// </summary>
        /// <param name="theme">Theme name</param>
        /// <param name="storeId">Stored Id</param>
        /// <returns>The error message when a parsing error occured, <c>null</c> otherwise</returns>
        private async Task <string> ValidateSassAsync(ThemeManifest manifest, int storeId)
        {
            string error = string.Empty;

            if (_httpContextAccessor.HttpContext == null)
            {
                return(error);
            }

            // TODO: (core) DefaultThemeVariableService.ValidateSassAsync() --> finalize theme.scss path/bundle convention and make sass validation run.
            var virtualPath = "~/themes/{0}/theme.scss".FormatCurrent(manifest.ThemeName);

            var url = "{0}?storeId={1}&theme={2}&validate=1".FormatInvariant(
                WebHelper.GetAbsoluteUrl(virtualPath, _httpContextAccessor.HttpContext?.Request),
                storeId,
                manifest.ThemeName);

            var request = await WebHelper.CreateHttpRequestForSafeLocalCallAsync(new Uri(url));

            WebResponse response = null;

            try
            {
                response = await request.GetResponseAsync();
            }
            catch (WebException ex)
            {
                if (ex.Response is HttpWebResponse)
                {
                    var webResponse = (HttpWebResponse)ex.Response;
                    var statusCode  = webResponse.StatusCode;

                    if (statusCode == HttpStatusCode.InternalServerError)
                    {
                        // Catch only 500, as this indicates a parsing error.
                        var stream = webResponse.GetResponseStream();

                        using var streamReader = new StreamReader(stream);
                        // Read the content (the error message has been put there)
                        error = await streamReader.ReadToEndAsync();

                        streamReader.Close();
                        stream.Close();
                    }
                }
            }
            catch (Exception ex)
            {
                error = ex.Message;
            }
            finally
            {
                if (response != null)
                {
                    response.Close();
                }
            }

            return(error);
        }
 protected override void OnDispose(bool disposing)
 {
     if (disposing)
     {
         Manifest = null;
     }
 }
 public void SetPreviewTheme(string theme)
 {
     try
     {
         _httpContext.SetPreviewModeValueInCookie(OverriddenThemeNameKey, theme);
         _currentTheme = null;
     }
     catch
     {
     }
 }
        public ThemeManifestMaterializer(ThemeDirectoryData directoryData)
        {
            Guard.NotNull(directoryData, nameof(directoryData));

            _directoryData = directoryData;
            _manifest      = new ThemeManifest
            {
                ThemeName         = directoryData.Directory.Name,
                ConfigurationFile = directoryData.ConfigurationFile,
                IsSymbolicLink    = directoryData.IsSymbolicLink,
                BaseThemeName     = directoryData.BaseTheme,
                RootPath          = directoryData.Directory.PhysicalPath
            };
        }
        public ThemeManifestMaterializer(ThemeDirectoryData directoryData)
        {
            Guard.NotNull(directoryData, nameof(directoryData));

            _directoryData = directoryData;
            _manifest      = new ThemeManifest
            {
                ThemeName         = directoryData.Directory.Name,
                ConfigurationFile = directoryData.ConfigurationFile,
                Configuration     = directoryData.Configuration,
                IsSymbolicLink    = directoryData.IsSymbolicLink,
                BaseThemeName     = directoryData.BaseTheme,
                FileProvider      = new LocalFileSystem(directoryData.Directory.PhysicalPath),
            };
        }
Exemple #7
0
        private async Task <SaveThemeVariablesResult> SaveThemeVariablesInternal(ThemeManifest manifest, int storeId, IDictionary <string, object> variables)
        {
            var result = new SaveThemeVariablesResult();
            var infos  = manifest.Variables;

            var unsavedVars    = new List <string>();
            var savedThemeVars = await _db.ThemeVariables
                                 .Where(v => v.StoreId == storeId && v.Theme == manifest.ThemeName)
                                 .ToDictionaryAsync(x => x.Name);

            bool touched = false;

            foreach (var v in variables)
            {
                if (!infos.TryGetValue(v.Key, out var info))
                {
                    // var not specified in metadata so don't save
                    // TODO: (MC) delete from db also if it exists
                    continue;
                }

                var value = v.Value == null ? string.Empty : v.Value.ToString();

                var savedThemeVar = savedThemeVars.Get(v.Key);
                if (savedThemeVar != null)
                {
                    if (value.IsEmpty() || String.Equals(info.DefaultValue, value, StringComparison.CurrentCultureIgnoreCase))
                    {
                        // it's either null or the default value, so delete
                        _db.ThemeVariables.Remove(savedThemeVar);
                        result.Deleted.Add(savedThemeVar);
                        touched = true;
                    }
                    else
                    {
                        // update entity
                        if (!savedThemeVar.Value.Equals(value, StringComparison.OrdinalIgnoreCase))
                        {
                            savedThemeVar.Value = value;
                            result.Updated.Add(savedThemeVar);
                            touched = true;
                        }
                    }
                }
                else
                {
                    if (value.HasValue() && !string.Equals(info.DefaultValue, value, StringComparison.CurrentCultureIgnoreCase))
                    {
                        // Insert entity (only when not default value)
                        unsavedVars.Add(v.Key);
                        savedThemeVar = new ThemeVariable
                        {
                            Theme   = manifest.ThemeName,
                            Name    = v.Key,
                            Value   = value,
                            StoreId = storeId
                        };
                        _db.ThemeVariables.Add(savedThemeVar);
                        result.Inserted.Add(savedThemeVar);
                        touched = true;
                    }
                }
            }

            if (touched)
            {
                await _db.SaveChangesAsync();
            }

            return(result);
        }