Skip to content

Commit 2b20227

Browse files
committed
JA-17729 - Provide ability to disable refresh token
1 parent b632c58 commit 2b20227

File tree

3 files changed

+105
-1
lines changed

3 files changed

+105
-1
lines changed

plugins/common/server.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ func CreateServerDetailsFromFlags(c *components.Context) (details *config.Server
6161
details.ServerId = os.Getenv(coreutils.ServerID)
6262
}
6363
details.InsecureTls = c.GetBoolFlagValue("insecure-tls")
64+
details.DisableTokenRefresh = c.GetBoolFlagValue("disable-token-refresh")
6465
return
6566
}
6667

utils/config/config.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,7 @@ type ServerDetails struct {
601601
IsDefault bool `json:"isDefault,omitempty"`
602602
InsecureTls bool `json:"-"`
603603
WebLogin bool `json:"webLogin,omitempty"`
604+
DisableTokenRefresh bool `json:"disableTokenRefresh,omitempty"`
604605
}
605606

606607
// Deprecated
@@ -802,7 +803,7 @@ func (serverDetails *ServerDetails) createAuthConfig(details auth.ServiceDetails
802803
// If refresh token is not empty, set a refresh handler and skip other credentials.
803804
// First we check access's token, if empty we check artifactory's token.
804805
switch {
805-
case serverDetails.RefreshToken != "":
806+
case serverDetails.RefreshToken != "" && !serverDetails.DisableTokenRefresh:
806807
// Save serverId for refreshing if needed. If empty serverId is saved, default will be used.
807808
tokenRefreshServerId = serverDetails.ServerId
808809
details.AppendPreRequestFunction(AccessTokenRefreshPreRequestInterceptor)

utils/config/config_test.go

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515

1616
"github.com/jfrog/jfrog-cli-core/v2/utils/coreutils"
1717
"github.com/jfrog/jfrog-cli-core/v2/utils/log"
18+
artifactoryAuth "github.com/jfrog/jfrog-client-go/artifactory/auth"
1819
"github.com/jfrog/jfrog-client-go/utils/io/fileutils"
1920
"github.com/stretchr/testify/assert"
2021
)
@@ -421,3 +422,104 @@ func assertCertsMigration(t *testing.T) {
421422
// Verify only the certs were moved
422423
assert.Len(t, files, 2)
423424
}
425+
426+
func TestCreateAuthConfigAppendPreRequestFunctionBehavior(t *testing.T) {
427+
test := []struct {
428+
name string
429+
serverDetails *ServerDetails
430+
shouldCallAppendPreRequest bool
431+
}{
432+
{
433+
name: "DisableTokenRefreshTrue_NoRefreshTokens",
434+
serverDetails: &ServerDetails{
435+
ServerId: "test-server",
436+
AccessToken: "access-token-123",
437+
User: "testuser",
438+
Password: "testpass",
439+
DisableTokenRefresh: true,
440+
},
441+
shouldCallAppendPreRequest: false,
442+
},
443+
{
444+
name: "DisableTokenRefreshTrue_WithRefreshToken",
445+
serverDetails: &ServerDetails{
446+
ServerId: "test-server",
447+
AccessToken: "access-token-123",
448+
RefreshToken: "refresh-token-456",
449+
User: "testuser",
450+
Password: "testpass",
451+
DisableTokenRefresh: true,
452+
},
453+
shouldCallAppendPreRequest: false,
454+
},
455+
{
456+
name: "DisableTokenRefreshFalse_WithRefreshToken",
457+
serverDetails: &ServerDetails{
458+
ServerId: "test-server",
459+
AccessToken: "access-token-123",
460+
RefreshToken: "refresh-token-456",
461+
User: "testuser",
462+
Password: "testpass",
463+
DisableTokenRefresh: false,
464+
},
465+
shouldCallAppendPreRequest: true,
466+
},
467+
{
468+
name: "DisableTokenRefreshDefault_WithRefreshToken",
469+
serverDetails: &ServerDetails{
470+
ServerId: "test-server",
471+
AccessToken: "access-token-123",
472+
RefreshToken: "refresh-token-456",
473+
User: "testuser",
474+
Password: "testpass",
475+
},
476+
shouldCallAppendPreRequest: true,
477+
},
478+
{
479+
name: "DisableTokenRefreshTrue_WithArtifactoryRefreshToken",
480+
serverDetails: &ServerDetails{
481+
ServerId: "test-server",
482+
AccessToken: "access-token-123",
483+
ArtifactoryRefreshToken: "artifactory-refresh-token-789",
484+
User: "testuser",
485+
Password: "testpass",
486+
DisableTokenRefresh: true,
487+
},
488+
shouldCallAppendPreRequest: true,
489+
},
490+
{
491+
name: "DisableTokenRefreshFalse_WithArtifactoryRefreshToken",
492+
serverDetails: &ServerDetails{
493+
ServerId: "test-server",
494+
AccessToken: "access-token-123",
495+
ArtifactoryRefreshToken: "artifactory-refresh-token-789",
496+
User: "testuser",
497+
Password: "testpass",
498+
DisableTokenRefresh: false,
499+
},
500+
shouldCallAppendPreRequest: true,
501+
},
502+
}
503+
504+
for _, tt := range test {
505+
t.Run(tt.name, func(t *testing.T) {
506+
artDetails := artifactoryAuth.NewArtifactoryDetails()
507+
artDetails.SetUrl("https://test.com/artifactory/")
508+
509+
result, err := tt.serverDetails.createAuthConfig(artDetails)
510+
511+
assert.NoError(t, err)
512+
assert.Equal(t, artDetails, result)
513+
514+
if tt.shouldCallAppendPreRequest {
515+
// AppendPreRequestFunction was called - should use token refresh, not basic auth
516+
assert.Equal(t, "", result.GetUser(), "User should be empty when AppendPreRequestFunction is called (token refresh enabled)")
517+
assert.Equal(t, "", result.GetPassword(), "Password should be empty when AppendPreRequestFunction is called (token refresh enabled)")
518+
} else {
519+
// AppendPreRequestFunction was NOT called - should use basic auth
520+
assert.Equal(t, tt.serverDetails.User, result.GetUser(), "User should be set when AppendPreRequestFunction is NOT called (basic auth)")
521+
assert.Equal(t, tt.serverDetails.Password, result.GetPassword(), "Password should be set when AppendPreRequestFunction is NOT called (basic auth)")
522+
}
523+
})
524+
}
525+
}

0 commit comments

Comments
 (0)