diff --git a/cliv2/internal/embedded/cliv1/cliv1.go b/cliv2/internal/embedded/cliv1/cliv1.go index d1c4844476d..70514fa0c40 100644 --- a/cliv2/internal/embedded/cliv1/cliv1.go +++ b/cliv2/internal/embedded/cliv1/cliv1.go @@ -21,11 +21,7 @@ func CLIV1Version() string { func GetFullCLIV1TargetPath(cacheDir string) (string, error) { cliv1Filename := getCLIv1Filename() versionTag := CLIV1Version() - relPath := path.Join(versionTag, cliv1Filename) - fullPath, err := utils.FullPathInSnykCacheDir(cacheDir, relPath) - if err != nil { - return "", err - } + fullPath := path.Join(utils.GetVersionCacheDirectory(cacheDir, versionTag), cliv1Filename) return fullPath, nil } diff --git a/cliv2/internal/proxy/proxy.go b/cliv2/internal/proxy/proxy.go index c0da976e98d..7b15fac575a 100644 --- a/cliv2/internal/proxy/proxy.go +++ b/cliv2/internal/proxy/proxy.go @@ -58,13 +58,8 @@ func NewWrapperProxy(insecureSkipVerify bool, cacheDirectory string, cliVersion return nil, err } - tempDir, err := utils.SnykTempDirectory(p.DebugLogger) - if err != nil { - p.DebugLogger.Println("failed to create system temp directory:", tempDir) - return nil, err - } - - certFile, err := os.CreateTemp(tempDir, "snyk-cli-cert-*.crt") + tmpDirectory := utils.GetTemporaryDirectory(cacheDirectory, cliVersion) + certFile, err := os.CreateTemp(tmpDirectory, "snyk-cli-cert-*.crt") if err != nil { fmt.Println("failed to create temp cert file") return nil, err diff --git a/cliv2/internal/proxy/proxy_test.go b/cliv2/internal/proxy/proxy_test.go index 2a0232a4d04..ee17099d3f6 100644 --- a/cliv2/internal/proxy/proxy_test.go +++ b/cliv2/internal/proxy/proxy_test.go @@ -15,6 +15,7 @@ import ( "github.com/snyk/cli/cliv2/internal/constants" "github.com/snyk/cli/cliv2/internal/proxy" + "github.com/snyk/cli/cliv2/internal/utils" "github.com/snyk/go-application-framework/pkg/networking/certs" "github.com/snyk/go-httpauth/pkg/httpauth" @@ -64,8 +65,23 @@ func helper_getHttpClient(gateway *proxy.WrapperProxy, useProxyAuth bool) (*http return proxiedClient, nil } +func setup(t *testing.T, baseCache string, version string) { + err := utils.CreateAllDirectories(baseCache, version) + assert.Nil(t, err) +} + +func teardown(t *testing.T, baseCache string) { + err := os.RemoveAll(baseCache) + assert.Nil(t, err) +} + func Test_closingProxyDeletesTempCert(t *testing.T) { - wp, err := proxy.NewWrapperProxy(false, "", "", debugLogger) + basecache := "testcache" + version := "1.1.1" + setup(t, basecache, version) + defer teardown(t, basecache) + + wp, err := proxy.NewWrapperProxy(false, basecache, version, debugLogger) assert.Nil(t, err) err = wp.Start() @@ -84,7 +100,12 @@ func basicAuthValue(username string, password string) string { } func Test_canGoThroughProxy(t *testing.T) { - wp, err := proxy.NewWrapperProxy(false, "", "", debugLogger) + basecache := "testcache" + version := "1.1.1" + setup(t, basecache, version) + defer teardown(t, basecache) + + wp, err := proxy.NewWrapperProxy(false, basecache, version, debugLogger) assert.Nil(t, err) err = wp.Start() @@ -108,7 +129,12 @@ func Test_canGoThroughProxy(t *testing.T) { } func Test_proxyRejectsWithoutBasicAuthHeader(t *testing.T) { - wp, err := proxy.NewWrapperProxy(false, "", "", debugLogger) + basecache := "testcache" + version := "1.1.1" + setup(t, basecache, version) + defer teardown(t, basecache) + + wp, err := proxy.NewWrapperProxy(false, basecache, version, debugLogger) assert.Nil(t, err) err = wp.Start() @@ -131,8 +157,12 @@ func Test_proxyRejectsWithoutBasicAuthHeader(t *testing.T) { } func Test_xSnykCliVersionHeaderIsReplaced(t *testing.T) { + basecache := "testcache" expectedVersion := "the-cli-version" - wp, err := proxy.NewWrapperProxy(false, "", expectedVersion, debugLogger) + setup(t, basecache, expectedVersion) + defer teardown(t, basecache) + + wp, err := proxy.NewWrapperProxy(false, basecache, expectedVersion, debugLogger) assert.Nil(t, err) err = wp.Start() @@ -175,6 +205,11 @@ func Test_xSnykCliVersionHeaderIsReplaced(t *testing.T) { } func Test_SetUpstreamProxy(t *testing.T) { + basecache := "testcache" + version := "1.1.1" + setup(t, basecache, version) + defer teardown(t, basecache) + var err error var objectUnderTest *proxy.WrapperProxy @@ -192,7 +227,7 @@ func Test_SetUpstreamProxy(t *testing.T) { httpauth.UnknownMechanism, } - objectUnderTest, err = proxy.NewWrapperProxy(false, "", "", debugLogger) + objectUnderTest, err = proxy.NewWrapperProxy(false, basecache, version, debugLogger) assert.Nil(t, err) // running different cases @@ -222,13 +257,18 @@ func Test_SetUpstreamProxy(t *testing.T) { } func Test_appendExtraCaCert(t *testing.T) { + basecache := "testcache" + version := "1.1.1" + setup(t, basecache, version) + defer teardown(t, basecache) + certPem, _, _ := certs.MakeSelfSignedCert("mycert", []string{"dns"}, debugLogger) file, _ := os.CreateTemp("", "") file.Write(certPem) os.Setenv(constants.SNYK_CA_CERTIFICATE_LOCATION_ENV, file.Name()) - wp, err := proxy.NewWrapperProxy(false, "", "", debugLogger) + wp, err := proxy.NewWrapperProxy(false, basecache, version, debugLogger) assert.Nil(t, err) certsPem, err := os.ReadFile(wp.CertificateLocation) diff --git a/cliv2/internal/utils/cache-dir.go b/cliv2/internal/utils/cache-dir.go deleted file mode 100644 index dc35a0040a6..00000000000 --- a/cliv2/internal/utils/cache-dir.go +++ /dev/null @@ -1,25 +0,0 @@ -package utils - -import ( - "os" - "path" -) - -func SnykCacheDir() (string, error) { - baseDirectory, err := os.UserCacheDir() - if err != nil { - return "", err - } - - snykCacheDir := path.Join(baseDirectory, "snyk") - err = os.MkdirAll(snykCacheDir, 0755) - if err != nil { - return "", err - } - - return snykCacheDir, nil -} - -func FullPathInSnykCacheDir(cacheDir string, filename string) (string, error) { - return path.Join(cacheDir, filename), nil -} diff --git a/cliv2/internal/utils/directories.go b/cliv2/internal/utils/directories.go new file mode 100644 index 00000000000..5f1a60fb263 --- /dev/null +++ b/cliv2/internal/utils/directories.go @@ -0,0 +1,36 @@ +package utils + +import ( + "os" + "path" + + "github.com/pkg/errors" +) + +// The directory structure used to cache things into +// - Base cache directory (user definable, default depends on OS, exmple: /Users/username/Library/Caches/snyk/) +// |- Version cache directory (example: /Users/username/Library/Caches/snyk/1.1075.0/) +// |- Temp directory (example: /Users/username/Library/Caches/snyk/1.1075.0/tmp/) + +func GetTemporaryDirectory(baseCacheDirectory string, versionNumber string) string { + return path.Join(GetVersionCacheDirectory(baseCacheDirectory, versionNumber), "tmp") +} + +func GetVersionCacheDirectory(baseCacheDirectory string, versionNumber string) string { + return path.Join(baseCacheDirectory, versionNumber) +} + +func CreateAllDirectories(baseCacheDirectory string, versionNumber string) error { + directoryList := []string{ + GetTemporaryDirectory(baseCacheDirectory, versionNumber), + } + + for _, dir := range directoryList { + err := os.MkdirAll(dir, 0755) + if err != nil { + return errors.Wrap(err, "failed to create all directories.") + } + } + + return nil +} diff --git a/cliv2/internal/utils/temp-dir.go b/cliv2/internal/utils/temp-dir.go deleted file mode 100644 index 5db47005acf..00000000000 --- a/cliv2/internal/utils/temp-dir.go +++ /dev/null @@ -1,47 +0,0 @@ -package utils - -import ( - "log" - "os" - "path" -) - -// Gets the system temp directory and, if it doesn't exist, attempts to create it. -func systemTempDirectory(debugLogger *log.Logger) (string, error) { - tempDir := os.TempDir() - // make sure this directory exists - debugLogger.Println("system temp directory:", tempDir) - _, err := os.Stat(tempDir) - if err != nil { - debugLogger.Println("system temp directory does not exist... attempting to create it:", tempDir) - err = os.MkdirAll(tempDir, 0755) - if err != nil { - debugLogger.Println("failed to create system temp directory:", tempDir) - return "", err - } - } - - return tempDir, nil -} - -func SnykTempDirectory(debugLogger *log.Logger) (string, error) { - tempDir, err := systemTempDirectory(debugLogger) - if err != nil { - return "", err - } - - snykTempDir := path.Join(tempDir, "snyk") - - // make sure it exists - _, err = os.Stat(snykTempDir) - if err != nil { - debugLogger.Println("snyk temp directory does not exist... attempting to create it:", snykTempDir) - err = os.MkdirAll(snykTempDir, 0755) - if err != nil { - debugLogger.Println("failed to create snyk temp directory:", snykTempDir) - return "", err - } - } - - return snykTempDir, nil -} diff --git a/cliv2/pkg/basic_workflows/legacycli.go b/cliv2/pkg/basic_workflows/legacycli.go index 9d02ea0db0f..c4b71d84ed0 100644 --- a/cliv2/pkg/basic_workflows/legacycli.go +++ b/cliv2/pkg/basic_workflows/legacycli.go @@ -68,6 +68,12 @@ func legacycliWorkflow(invocation workflow.InvocationContext, input []workflow.D debugLogger.Println("Insecure HTTPS:", insecure) debugLogger.Println("Use StdIO:", useStdIo) + // prepare environment by creating all required folders in advance + err = utils.CreateAllDirectories(cacheDirectory, cliv2.GetFullVersion()) + if err != nil { + return output, err + } + // init cli object var cli *cliv2.CLI cli, err = cliv2.NewCLIv2(cacheDirectory, debugLogger)