diff --git a/helper/metadata.go b/helper/metadata.go index eebb89e..e89cb78 100644 --- a/helper/metadata.go +++ b/helper/metadata.go @@ -1,11 +1,14 @@ package helper import ( + "bytes" "context" "encoding/json" "fmt" + "strings" "github.com/passbolt/go-passbolt/api" + "github.com/santhosh-tekuri/jsonschema" ) func GetResourceMetadata(ctx context.Context, c *api.Client, resource api.Resource, rType api.ResourceType) (string, error) { @@ -54,47 +57,53 @@ func GetResourceMetadata(ctx context.Context, c *api.Client, resource api.Resour if err != nil { return "", fmt.Errorf("Decrypt Metadata: %w", err) } - /* - - var schemaDefinition api.ResourceTypeSchema - err = json.Unmarshal([]byte(rType.Definition), &schemaDefinition) - if err != nil { - // Workaround for inconsistant API Responses where sometime the Schema is embedded directly and sometimes it's escaped as a string - if err.Error() == "json: cannot unmarshal string into Go value of type api.ResourceTypeSchema" { - var tmp string - err = json.Unmarshal([]byte(rType.Definition), &tmp) - if err != nil { - return "", fmt.Errorf("Workaround Unmarshal Json Schema String: %w", err) - } - - err = json.Unmarshal([]byte(tmp), &schemaDefinition) - if err != nil { - return "", fmt.Errorf("Workaround Unmarshal Json Schema: %w", err) - } - - } else { - return "", fmt.Errorf("Unmarshal Json Schema: %w", err) + var schemaDefinition api.ResourceTypeSchema + err = json.Unmarshal([]byte(rType.Definition), &schemaDefinition) + if err != nil { + // Workaround for inconsistant API Responses where sometime the Schema is embedded directly and sometimes it's escaped as a string + if err.Error() == "json: cannot unmarshal string into Go value of type api.ResourceTypeSchema" { + var tmp string + err = json.Unmarshal([]byte(rType.Definition), &tmp) + if err != nil { + return "", fmt.Errorf("Workaround Unmarshal Json Schema String: %w", err) } - } - comp := jsonschema.NewCompiler() + if tmp == "[]" { + // Use The Builtin Fallback Schemas in this Case + schema, ok := api.ResourceSchemas[rType.Slug] + if !ok { + return "", fmt.Errorf("Server Does not have the Required json Schema and there is no fallback available for type: %v", rType.Slug) + } + tmp = string(schema) + } - err = comp.AddResource("metadata.json", bytes.NewReader(schemaDefinition.Secret)) - if err != nil { - return "", fmt.Errorf("Adding Json Schema: %w", err) - } + err = json.Unmarshal([]byte(tmp), &schemaDefinition) + if err != nil { + return "", fmt.Errorf("Workaround Unmarshal Json Schema: %w", err) + } - schema, err := comp.Compile("metadata.json") - if err != nil { - return "", fmt.Errorf("Compiling Json Schema: %w", err) + } else { + return "", fmt.Errorf("Unmarshal Json Schema: %w", err) } + } - err = schema.Validate(strings.NewReader(decMetadata)) - if err != nil { - return "", fmt.Errorf("Validating Secret Data: %w", err) - } - */ + comp := jsonschema.NewCompiler() + + err = comp.AddResource("metadata.json", bytes.NewReader(schemaDefinition.Resource)) + if err != nil { + return "", fmt.Errorf("Adding Json Schema: %w", err) + } + + schema, err := comp.Compile("metadata.json") + if err != nil { + return "", fmt.Errorf("Compiling Json Schema: %w", err) + } + + err = schema.Validate(strings.NewReader(decMetadata)) + if err != nil { + return "", fmt.Errorf("Validating Secret Data: %w", err) + } return decMetadata, nil }