This is an automated email from the ASF dual-hosted git repository. nferraro pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-k.git
The following commit(s) were added to refs/heads/main by this push: new 19516e0 fix(cmd/run): windows scheme support 19516e0 is described below commit 19516e0ebf75ecfb9b33edf5cc07f8755f7b3b02 Author: Pasquale Congiusti <pasquale.congiu...@gmail.com> AuthorDate: Thu Jul 1 15:04:55 2021 +0200 fix(cmd/run): windows scheme support Introduced a check to verify if the source matches with a supported scheme. Closes #2475 --- pkg/cmd/run.go | 12 --------- pkg/cmd/run_test.go | 7 ------ pkg/cmd/util.go | 35 ++++++++++++++++++++++++++ pkg/cmd/util_sources.go | 8 +++--- pkg/cmd/util_test.go | 65 +++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 104 insertions(+), 23 deletions(-) diff --git a/pkg/cmd/run.go b/pkg/cmd/run.go index 43164c3..b97dca7 100644 --- a/pkg/cmd/run.go +++ b/pkg/cmd/run.go @@ -728,18 +728,6 @@ func (o *runCmdOptions) configureTraits(integration *v1.Integration, options []s return nil } -func isLocalAndFileExists(fileName string) (bool, error) { - info, err := os.Stat(fileName) - if err != nil { - if os.IsNotExist(err) { - return false, nil - } - // If it is a different error (ie, permission denied) we should report it back - return false, errors.Wrap(err, fmt.Sprintf("file system error while looking for %s", fileName)) - } - return !info.IsDir(), nil -} - func addIntegrationProperties(props *properties.Properties, spec *v1.IntegrationSpec) error { for _, k := range props.Keys() { v, _ := props.Get(k) diff --git a/pkg/cmd/run_test.go b/pkg/cmd/run_test.go index bae4c9d..00ca7fb 100644 --- a/pkg/cmd/run_test.go +++ b/pkg/cmd/run_test.go @@ -565,13 +565,6 @@ func TestResolveJsonPodTemplate(t *testing.T) { assert.Equal(t, 2, len(integrationSpec.PodTemplate.Spec.Containers)) } -func TestIsLocalFileAndExists(t *testing.T) { - value, err := isLocalAndFileExists("/root/test") - // must not panic because a permission error - assert.NotNil(t, err) - assert.False(t, value) -} - func TestExtractProperties_SingleKeyValue(t *testing.T) { correctValues := []string{"key=val", "key = val", "key= val", " key = val"} for _, val := range correctValues { diff --git a/pkg/cmd/util.go b/pkg/cmd/util.go index b287529..7cc40bf 100644 --- a/pkg/cmd/util.go +++ b/pkg/cmd/util.go @@ -23,10 +23,12 @@ import ( "encoding/json" "fmt" "log" + "os" "reflect" "strings" "github.com/apache/camel-k/pkg/util/gzip" + "github.com/pkg/errors" "github.com/mitchellh/mapstructure" @@ -42,6 +44,12 @@ import ( const ( offlineCommandLabel = "camel.apache.org/cmd.offline" + + // Supported source schemes + gistScheme = "gist" + githubScheme = "github" + httpScheme = "http" + httpsScheme = "https" ) // DeleteIntegration -- @@ -248,3 +256,30 @@ func compressToString(content []byte) (string, error) { return string(bytes), nil } + +func isLocalAndFileExists(uri string) (bool, error) { + if hasSupportedScheme(uri) { + // it's not a local file as it matches one of the supporting schemes + return false, nil + } + info, err := os.Stat(uri) + if err != nil { + if os.IsNotExist(err) { + return false, nil + } + // If it is a different error (ie, permission denied) we should report it back + return false, errors.Wrap(err, fmt.Sprintf("file system error while looking for %s", uri)) + } + return !info.IsDir(), nil +} + +func hasSupportedScheme(uri string) bool { + if strings.HasPrefix(strings.ToLower(uri), gistScheme+":") || + strings.HasPrefix(strings.ToLower(uri), githubScheme+":") || + strings.HasPrefix(strings.ToLower(uri), httpScheme+":") || + strings.HasPrefix(strings.ToLower(uri), httpsScheme+":") { + return true + } + + return false +} diff --git a/pkg/cmd/util_sources.go b/pkg/cmd/util_sources.go index 6368d05..79e085a 100644 --- a/pkg/cmd/util_sources.go +++ b/pkg/cmd/util_sources.go @@ -84,7 +84,7 @@ func ResolveSources(ctx context.Context, locations []string, compress bool) ([]S } switch { - case u.Scheme == "gist" || strings.HasPrefix(location, "https://gist.github.com/"): + case u.Scheme == gistScheme || strings.HasPrefix(location, "https://gist.github.com/"): var tc *http.Client if token, ok := os.LookupEnv("GITHUB_TOKEN"); ok { @@ -133,7 +133,7 @@ func ResolveSources(ctx context.Context, locations []string, compress bool) ([]S } sources = append(sources, answer) } - case u.Scheme == "github": + case u.Scheme == githubScheme: answer := Source{ Name: path.Base(location), Origin: location, @@ -149,7 +149,7 @@ func ResolveSources(ctx context.Context, locations []string, compress bool) ([]S return sources, err } sources = append(sources, answer) - case u.Scheme == "http": + case u.Scheme == httpScheme: answer := Source{ Name: path.Base(location), Origin: location, @@ -165,7 +165,7 @@ func ResolveSources(ctx context.Context, locations []string, compress bool) ([]S return sources, err } sources = append(sources, answer) - case u.Scheme == "https": + case u.Scheme == httpsScheme: answer := Source{ Name: path.Base(location), Origin: location, diff --git a/pkg/cmd/util_test.go b/pkg/cmd/util_test.go new file mode 100644 index 0000000..b47c071 --- /dev/null +++ b/pkg/cmd/util_test.go @@ -0,0 +1,65 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cmd + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestCorrectFileValuesButNotFound(t *testing.T) { + value1, err1 := isLocalAndFileExists("c:\\test") + value2, err2 := isLocalAndFileExists("path/to/file") + + // they are all not found, but it must not panic + assert.Nil(t, err1) + assert.False(t, value1) + assert.Nil(t, err2) + assert.False(t, value2) +} + +func TestPermissionDenied(t *testing.T) { + value, err := isLocalAndFileExists("/root/test") + // must not panic because a permission error + assert.NotNil(t, err) + assert.False(t, value) +} + +func TestSupportedScheme(t *testing.T) { + gistValue, err1 := isLocalAndFileExists("gist:some/gist/resource") + githubValue, err2 := isLocalAndFileExists("github:some/github/resource") + httpValue, err3 := isLocalAndFileExists("http://some/http/resource") + httpsValue, err4 := isLocalAndFileExists("https://some/https/resource") + + assert.Nil(t, err1) + assert.False(t, gistValue) + assert.Nil(t, err2) + assert.False(t, githubValue) + assert.Nil(t, err3) + assert.False(t, httpValue) + assert.Nil(t, err4) + assert.False(t, httpsValue) +} + +func TestUnSupportedScheme(t *testing.T) { + value, err := isLocalAndFileExists("bad_scheme:some/bad/resource") + // must not report an error + assert.Nil(t, err) + assert.False(t, value) +}