From 05c095a0e66f86cb31202442c7a1a54a348a1186 Mon Sep 17 00:00:00 2001 From: Andreas Deininger Date: Thu, 16 Mar 2023 16:56:05 +0100 Subject: [PATCH] resources.functions: improve validation --- .../integrity/integrity.go | 2 +- tpl/resources/resources.go | 34 ++++++++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/resources/resource_transformers/integrity/integrity.go b/resources/resource_transformers/integrity/integrity.go index e1575468581..3a7db4c8078 100644 --- a/resources/resource_transformers/integrity/integrity.go +++ b/resources/resource_transformers/integrity/integrity.go @@ -91,7 +91,7 @@ func newHash(algo string) (hash.Hash, error) { case "sha512": return sha512.New(), nil default: - return nil, fmt.Errorf("unsupported crypto algo: %q, use either md5, sha256, sha384 or sha512", algo) + return nil, fmt.Errorf("unsupported hash algorithm: %q, use either md5, sha256, sha384 or sha512", algo) } } diff --git a/tpl/resources/resources.go b/tpl/resources/resources.go index cc5310277f7..d18797ebcb0 100644 --- a/tpl/resources/resources.go +++ b/tpl/resources/resources.go @@ -145,7 +145,7 @@ func (ns *Namespace) Get(filename any) resource.Resource { // // A second argument may be provided with an option map. // -// Note: This method does not return any error as a second argument, +// Note: This method does not return any error as a second return value, // for any error situations the error can be checked in .Err. func (ns *Namespace) GetRemote(args ...any) resource.Resource { get := func(args ...any) (resource.Resource, error) { @@ -153,6 +153,10 @@ func (ns *Namespace) GetRemote(args ...any) resource.Resource { return nil, errors.New("must provide an URL") } + if len(args) > 2 { + return nil, errors.New("must not provide more arguments than URL and options") + } + urlstr, err := cast.ToStringE(args[0]) if err != nil { return nil, err @@ -302,8 +306,12 @@ func (ns *Namespace) ExecuteAsTemplate(ctx context.Context, args ...any) (resour // Fingerprint transforms the given Resource with a MD5 hash of the content in // the RelPermalink and Permalink. func (ns *Namespace) Fingerprint(args ...any) (resource.Resource, error) { - if len(args) < 1 || len(args) > 2 { - return nil, errors.New("must provide a Resource and (optional) crypto algo") + if len(args) < 1 { + return nil, errors.New("must provide a Resource object") + } + + if len(args) > 2 { + return nil, errors.New("must not provide more arguments than Resource and hash algorithm") } var algo string @@ -332,9 +340,15 @@ func (ns *Namespace) Minify(r resources.ResourceTransformer) (resource.Resource, return ns.minifyClient.Minify(r) } -// ToCSS converts the given Resource to CSS. You can optional provide an Options -// object or a target path (string) as first argument. +// ToCSS converts the given Resource to CSS. You can optional provide an Options object +// as second argument. As an option, you can e.g. specify e.g. the target path (string) +// for the converted CSS resource. func (ns *Namespace) ToCSS(args ...any) (resource.Resource, error) { + + if len(args) > 2 { + return nil, errors.New("must not provide more arguments than resource object and options") + } + const ( // Transpiler implementation can be controlled from the client by // setting the 'transpiler' option. @@ -404,6 +418,11 @@ func (ns *Namespace) ToCSS(args ...any) (resource.Resource, error) { // PostCSS processes the given Resource with PostCSS func (ns *Namespace) PostCSS(args ...any) (resource.Resource, error) { + + if len(args) > 2 { + return nil, errors.New("must not provide more arguments than resource object and options") + } + r, m, err := resourcehelpers.ResolveArgs(args) if err != nil { return nil, err @@ -419,6 +438,11 @@ func (ns *Namespace) PostProcess(r resource.Resource) (postpub.PostPublishedReso // Babel processes the given Resource with Babel. func (ns *Namespace) Babel(args ...any) (resource.Resource, error) { + + if len(args) > 2 { + return nil, errors.New("must not provide more arguments than resource object and options") + } + r, m, err := resourcehelpers.ResolveArgs(args) if err != nil { return nil, err