From 5d2183bd48ccb252458805cb489dbf9f51dfcc24 Mon Sep 17 00:00:00 2001 From: andreasvikke Date: Thu, 13 Aug 2026 11:33:14 +0200 Subject: [PATCH 1/5] feat: add JFROG_CLI_CERTS_DIR env support Allow overriding JFrog CLI certificates directory --- utils/coreutils/coreconsts.go | 1 + utils/coreutils/utils.go | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/utils/coreutils/coreconsts.go b/utils/coreutils/coreconsts.go index ad13dae05..33f74e697 100644 --- a/utils/coreutils/coreconsts.go +++ b/utils/coreutils/coreconsts.go @@ -74,6 +74,7 @@ var ( ApplicationKey = "JFROG_CLI_APPLICATION_KEY" SigningKey = "JFROG_CLI_SIGNING_KEY" KeyAlias = "JFROG_CLI_KEY_ALIAS" + CertsDir = "JFROG_CLI_CERTS_DIR" //#nosec G101 EncryptionKey = "JFROG_CLI_ENCRYPTION_KEY" // For CI runs diff --git a/utils/coreutils/utils.go b/utils/coreutils/utils.go index 6679bdb5a..d0edb6a2e 100644 --- a/utils/coreutils/utils.go +++ b/utils/coreutils/utils.go @@ -341,6 +341,10 @@ func GetJfrogSecurityDir() (string, error) { } func GetJfrogCertsDir() (string, error) { + if os.Getenv(CertsDir) != "" { + return os.Getenv(CertsDir), nil + } + securityDir, err := GetJfrogSecurityDir() if err != nil { return "", err From 83e8218e402482cf5cc27f118e85304d39b41fd7 Mon Sep 17 00:00:00 2001 From: andreasvikke Date: Thu, 13 Aug 2026 11:33:21 +0200 Subject: [PATCH 2/5] chore: add unit test for jfrog cli certs dir --- utils/coreutils/utils_test.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/utils/coreutils/utils_test.go b/utils/coreutils/utils_test.go index 8ddffbee4..c74e97511 100644 --- a/utils/coreutils/utils_test.go +++ b/utils/coreutils/utils_test.go @@ -279,3 +279,21 @@ func TestGetMaskedCommandString(t *testing.T) { "pip -i ***@someurl.com/repo --access-token=***", GetMaskedCommandString(exec.Command("pip", "-i", "https://user:pass@someurl.com/repo", "--access-token=123"))) } + +func TestGetJfrogCertsDirFromEnv(t *testing.T) { + t.Setenv("JFROG_CLI_CERTS_DIR", "/custom/certs") + + certsDir, err := GetJfrogCertsDir() + + assert.NoError(t, err) + assert.Equal(t, "/custom/certs", certsDir) +} + +func TestGetJfrogCertsDirFallsBackToHomeDir(t *testing.T) { + t.Setenv("JFROG_CLI_HOME_DIR", "/tmp/jfrog") + + certsDir, err := GetJfrogCertsDir() + + assert.NoError(t, err) + assert.Equal(t, "/tmp/jfrog/security/certs", certsDir) +} From c289086e751e9545e1295e30ff754fff9404e3c3 Mon Sep 17 00:00:00 2001 From: Andreas Vikke Date: Tue, 25 Aug 2026 10:42:56 +0200 Subject: [PATCH 3/5] fix: double get env Co-authored-by: Kanishk Gupta --- utils/coreutils/utils.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utils/coreutils/utils.go b/utils/coreutils/utils.go index d0edb6a2e..1f735c35d 100644 --- a/utils/coreutils/utils.go +++ b/utils/coreutils/utils.go @@ -341,9 +341,9 @@ func GetJfrogSecurityDir() (string, error) { } func GetJfrogCertsDir() (string, error) { - if os.Getenv(CertsDir) != "" { - return os.Getenv(CertsDir), nil - } + if dir := os.Getenv(CertsDir); dir != "" { + return dir, nil +} securityDir, err := GetJfrogSecurityDir() if err != nil { From f58c11f6d305d81e9e7253523dec4db2fe74b3d6 Mon Sep 17 00:00:00 2001 From: andreasvikke Date: Tue, 25 Aug 2026 11:06:08 +0200 Subject: [PATCH 4/5] feat: add normalization of certs dir path --- utils/coreutils/utils.go | 11 +++++++++-- utils/coreutils/utils_test.go | 15 +++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/utils/coreutils/utils.go b/utils/coreutils/utils.go index 1f735c35d..b0b0a1b55 100644 --- a/utils/coreutils/utils.go +++ b/utils/coreutils/utils.go @@ -342,8 +342,15 @@ func GetJfrogSecurityDir() (string, error) { func GetJfrogCertsDir() (string, error) { if dir := os.Getenv(CertsDir); dir != "" { - return dir, nil -} + dir = filepath.Clean(dir) + + absoluteDir, err := filepath.Abs(dir) + if err != nil { + return "", errorutils.CheckError(err) + } + + return absoluteDir, nil + } securityDir, err := GetJfrogSecurityDir() if err != nil { diff --git a/utils/coreutils/utils_test.go b/utils/coreutils/utils_test.go index c74e97511..b9149d97d 100644 --- a/utils/coreutils/utils_test.go +++ b/utils/coreutils/utils_test.go @@ -297,3 +297,18 @@ func TestGetJfrogCertsDirFallsBackToHomeDir(t *testing.T) { assert.NoError(t, err) assert.Equal(t, "/tmp/jfrog/security/certs", certsDir) } + +func TestGetJfrogCertsDirNormalizesPath(t *testing.T) { + t.Setenv(CertsDir, filepath.Join("test", "..", "custom", "certs")) + defer func() { + assert.NoError(t, os.Unsetenv(CertsDir)) + }() + + expectedDir, err := filepath.Abs(filepath.Join("custom", "certs")) + assert.NoError(t, err) + + certsDir, err := GetJfrogCertsDir() + + assert.NoError(t, err) + assert.Equal(t, expectedDir, certsDir) +} From c0852a81905581f13f8d8416e9572c7abf6819dc Mon Sep 17 00:00:00 2001 From: andreasvikke Date: Tue, 25 Aug 2026 11:06:26 +0200 Subject: [PATCH 5/5] feat: defer unsetset env in test --- utils/coreutils/utils_test.go | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/utils/coreutils/utils_test.go b/utils/coreutils/utils_test.go index b9149d97d..ce1580012 100644 --- a/utils/coreutils/utils_test.go +++ b/utils/coreutils/utils_test.go @@ -281,21 +281,33 @@ func TestGetMaskedCommandString(t *testing.T) { } func TestGetJfrogCertsDirFromEnv(t *testing.T) { - t.Setenv("JFROG_CLI_CERTS_DIR", "/custom/certs") + certsDirPath, err := filepath.Abs(filepath.Join("/", "custom", "certs")) + assert.NoError(t, err) + + t.Setenv(CertsDir, certsDirPath) + defer func() { + assert.NoError(t, os.Unsetenv(CertsDir)) + }() certsDir, err := GetJfrogCertsDir() assert.NoError(t, err) - assert.Equal(t, "/custom/certs", certsDir) + assert.Equal(t, certsDirPath, certsDir) } func TestGetJfrogCertsDirFallsBackToHomeDir(t *testing.T) { - t.Setenv("JFROG_CLI_HOME_DIR", "/tmp/jfrog") + certsDirPath, err := filepath.Abs(filepath.Join("tmp", "jfrog")) + assert.NoError(t, err) + + t.Setenv(HomeDir, certsDirPath) + defer func() { + assert.NoError(t, os.Unsetenv(HomeDir)) + }() certsDir, err := GetJfrogCertsDir() assert.NoError(t, err) - assert.Equal(t, "/tmp/jfrog/security/certs", certsDir) + assert.Equal(t, filepath.Join(certsDirPath, JfrogSecurityDirName, JfrogCertsDirName), certsDir) } func TestGetJfrogCertsDirNormalizesPath(t *testing.T) {