From e3bbc8561fd8ce215de8fdb89eb70e9b41bf322d Mon Sep 17 00:00:00 2001 From: pereiramarco011 Date: Tue, 11 Jul 2023 16:39:08 +0100 Subject: [PATCH 1/4] Add yaml reference check fix to json --- pkg/resolver/file/file.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/pkg/resolver/file/file.go b/pkg/resolver/file/file.go index f7e9d3aa7dd..a7c962312ef 100644 --- a/pkg/resolver/file/file.go +++ b/pkg/resolver/file/file.go @@ -56,7 +56,7 @@ func (r *Resolver) Resolve(fileContent []byte, path string, resolveCount int, re } // resolve the paths - obj, _ = r.walk(fileContent, obj, obj, path, resolveCount, resolvedFilesCache) + obj, _ = r.walk(fileContent, obj, obj, path, resolveCount, resolvedFilesCache, false) b, err := r.marshler(obj) if err != nil { @@ -72,17 +72,18 @@ func (r *Resolver) walk( value any, path string, resolveCount int, - resolvedFilesCache map[string]ResolvedFile) (any, bool) { + resolvedFilesCache map[string]ResolvedFile, + refBool bool) (any, bool) { // go over the value and replace paths with the real content switch typedValue := value.(type) { case string: if filepath.Base(path) != typedValue { - return r.resolvePath(originalFileContent, fullObject, typedValue, path, resolveCount, resolvedFilesCache) + return r.resolvePath(originalFileContent, fullObject, typedValue, path, resolveCount, resolvedFilesCache, refBool) } return value, false case []any: for i, v := range typedValue { - typedValue[i], _ = r.walk(originalFileContent, fullObject, v, path, resolveCount, resolvedFilesCache) + typedValue[i], _ = r.walk(originalFileContent, fullObject, v, path, resolveCount, resolvedFilesCache, refBool) } return typedValue, false case map[string]any: @@ -96,7 +97,7 @@ func (r *Resolver) handleMap(originalFileContent []byte, fullObject interface{}, resolveCount int, resolvedFilesCache map[string]ResolvedFile) (any, bool) { for k, v := range value { isRef := strings.Contains(strings.ToLower(k), "$ref") - val, res := r.walk(originalFileContent, fullObject, v, path, resolveCount, resolvedFilesCache) + val, res := r.walk(originalFileContent, fullObject, v, path, resolveCount, resolvedFilesCache, isRef) // check if it is a ref then add new details if valMap, ok := val.(map[string]interface{}); (ok || !res) && isRef { // Create RefMetadata and add it to the resolved value map @@ -336,8 +337,9 @@ func (r *Resolver) resolvePath( fullObject interface{}, value, filePath string, resolveCount int, - resolvedFilesCache map[string]ResolvedFile) (any, bool) { - if resolveCount > constants.MaxResolvedFiles { + resolvedFilesCache map[string]ResolvedFile, + refBool bool) (any, bool) { + if resolveCount > constants.MaxResolvedFiles || (strings.HasPrefix(value, "#") && !refBool) { return value, false } var splitPath []string From 9ebfe873d98e97dce0fb21af49a532d86ceb271a Mon Sep 17 00:00:00 2001 From: cxMiguelSilva Date: Tue, 11 Jul 2023 17:21:21 +0100 Subject: [PATCH 2/4] add panic handling --- pkg/resolver/file/file.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/pkg/resolver/file/file.go b/pkg/resolver/file/file.go index a7c962312ef..faa640bc93e 100644 --- a/pkg/resolver/file/file.go +++ b/pkg/resolver/file/file.go @@ -2,6 +2,7 @@ package file import ( "errors" + "fmt" "io" "os" "path/filepath" @@ -46,6 +47,14 @@ func NewResolver( // Resolve - replace or modifies in-memory content before parsing func (r *Resolver) Resolve(fileContent []byte, path string, resolveCount int, resolvedFilesCache map[string]ResolvedFile) []byte { + // handle panic during resolve process + defer func() { + if r := recover(); r != nil { + err := fmt.Errorf("panic: %v", r) + log.Err(err).Msg("Recovered from panic during file resolve") + } + }() + if utils.Contains(filepath.Ext(path), []string{".yml", ".yaml"}) { return r.yamlResolve(fileContent, path, resolveCount, resolvedFilesCache) } @@ -59,11 +68,11 @@ func (r *Resolver) Resolve(fileContent []byte, path string, resolveCount int, re obj, _ = r.walk(fileContent, obj, obj, path, resolveCount, resolvedFilesCache, false) b, err := r.marshler(obj) - if err != nil { - return fileContent + if err == nil { + return b } - return b + return fileContent } func (r *Resolver) walk( From 95dac9cfc173c3c3864f8b299cc06c6fe0c601ad Mon Sep 17 00:00:00 2001 From: cxMiguelSilva Date: Tue, 11 Jul 2023 17:58:18 +0100 Subject: [PATCH 3/4] fix cyclomatic complexity --- pkg/resolver/file/file.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pkg/resolver/file/file.go b/pkg/resolver/file/file.go index faa640bc93e..c079d329d76 100644 --- a/pkg/resolver/file/file.go +++ b/pkg/resolver/file/file.go @@ -391,7 +391,16 @@ func (r *Resolver) resolvePath( return obj, false } } + return r.resolvePathReturnValue(value, filePath, splitPath, sameFileResolve, originalFileContent, obj) +} +func (r *Resolver) resolvePathReturnValue( + value, filePath string, + splitPath []string, + sameFileResolve bool, + originalFileContent []byte, + obj any, +) (any, bool) { if len(splitPath) > 1 { if sameFileResolve { r.ResolvedFiles[filePath] = model.ResolvedFile{ From 3f5311b4da053ebb912cb30b27ab4180d614c0ad Mon Sep 17 00:00:00 2001 From: cxMiguelSilva Date: Mon, 17 Jul 2023 11:43:02 +0100 Subject: [PATCH 4/4] reset resolver changes --- pkg/resolver/file/file.go | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/pkg/resolver/file/file.go b/pkg/resolver/file/file.go index c079d329d76..72527fd97fc 100644 --- a/pkg/resolver/file/file.go +++ b/pkg/resolver/file/file.go @@ -65,7 +65,7 @@ func (r *Resolver) Resolve(fileContent []byte, path string, resolveCount int, re } // resolve the paths - obj, _ = r.walk(fileContent, obj, obj, path, resolveCount, resolvedFilesCache, false) + obj, _ = r.walk(fileContent, obj, obj, path, resolveCount, resolvedFilesCache) b, err := r.marshler(obj) if err == nil { @@ -81,18 +81,17 @@ func (r *Resolver) walk( value any, path string, resolveCount int, - resolvedFilesCache map[string]ResolvedFile, - refBool bool) (any, bool) { + resolvedFilesCache map[string]ResolvedFile) (any, bool) { // go over the value and replace paths with the real content switch typedValue := value.(type) { case string: if filepath.Base(path) != typedValue { - return r.resolvePath(originalFileContent, fullObject, typedValue, path, resolveCount, resolvedFilesCache, refBool) + return r.resolvePath(originalFileContent, fullObject, typedValue, path, resolveCount, resolvedFilesCache) } return value, false case []any: for i, v := range typedValue { - typedValue[i], _ = r.walk(originalFileContent, fullObject, v, path, resolveCount, resolvedFilesCache, refBool) + typedValue[i], _ = r.walk(originalFileContent, fullObject, v, path, resolveCount, resolvedFilesCache) } return typedValue, false case map[string]any: @@ -106,7 +105,7 @@ func (r *Resolver) handleMap(originalFileContent []byte, fullObject interface{}, resolveCount int, resolvedFilesCache map[string]ResolvedFile) (any, bool) { for k, v := range value { isRef := strings.Contains(strings.ToLower(k), "$ref") - val, res := r.walk(originalFileContent, fullObject, v, path, resolveCount, resolvedFilesCache, isRef) + val, res := r.walk(originalFileContent, fullObject, v, path, resolveCount, resolvedFilesCache) // check if it is a ref then add new details if valMap, ok := val.(map[string]interface{}); (ok || !res) && isRef { // Create RefMetadata and add it to the resolved value map @@ -346,9 +345,8 @@ func (r *Resolver) resolvePath( fullObject interface{}, value, filePath string, resolveCount int, - resolvedFilesCache map[string]ResolvedFile, - refBool bool) (any, bool) { - if resolveCount > constants.MaxResolvedFiles || (strings.HasPrefix(value, "#") && !refBool) { + resolvedFilesCache map[string]ResolvedFile) (any, bool) { + if resolveCount > constants.MaxResolvedFiles { return value, false } var splitPath []string @@ -391,16 +389,7 @@ func (r *Resolver) resolvePath( return obj, false } } - return r.resolvePathReturnValue(value, filePath, splitPath, sameFileResolve, originalFileContent, obj) -} -func (r *Resolver) resolvePathReturnValue( - value, filePath string, - splitPath []string, - sameFileResolve bool, - originalFileContent []byte, - obj any, -) (any, bool) { if len(splitPath) > 1 { if sameFileResolve { r.ResolvedFiles[filePath] = model.ResolvedFile{