Skip to content

Commit 6e17928

Browse files
fix: calls clientId resolver from api client library
1 parent 47330a8 commit 6e17928

2 files changed

Lines changed: 49 additions & 3 deletions

File tree

internal/oauth/revoke.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"time"
1616

1717
dash0api "github.com/dash0hq/dash0-api-client-go"
18+
"github.com/dash0hq/dash0-api-client-go/profiles"
1819
"github.com/dash0hq/dash0-cli/internal/version"
1920
)
2021

@@ -53,11 +54,14 @@ func Revoke(req RevokeRequest) (ok bool) {
5354
ctx, cancel := context.WithTimeout(context.Background(), revokeTimeout)
5455
defer cancel()
5556
hint := dash0api.OAuthTokenTypeRefreshToken
56-
if err := client.RevokeToken(ctx, &dash0api.OAuthRevocationRequest{
57-
ClientId: req.ClientID,
57+
revokeReq := &dash0api.OAuthRevocationRequest{
5858
Token: req.RefreshToken,
5959
TokenTypeHint: &hint,
60-
}); err != nil {
60+
}
61+
if clientID := profiles.ResolveOAuthClientID(req.APIURL, req.ClientID); clientID != "" {
62+
revokeReq.ClientId = clientID
63+
}
64+
if err := client.RevokeToken(ctx, revokeReq); err != nil {
6165
fmt.Fprintf(os.Stderr, "warning: refresh token revocation failed (it may already be invalid): %v\n", err)
6266
return false
6367
}

internal/oauth/revoke_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"net/url"
77
"testing"
88

9+
"github.com/dash0hq/dash0-api-client-go/profiles"
910
"github.com/stretchr/testify/assert"
1011
"github.com/stretchr/testify/require"
1112
)
@@ -52,3 +53,44 @@ func TestRevoke_NoOpsOnEmptyArgs(t *testing.T) {
5253
assert.True(t, Revoke(RevokeRequest{ClientID: "client-abc-123", RefreshToken: "dash0_rt_test"}), "empty apiURL should no-op")
5354
assert.True(t, Revoke(RevokeRequest{APIURL: "https://api.example.com", ClientID: "client-abc-123"}), "empty refreshToken should no-op")
5455
}
56+
57+
func TestRevoke_OmitsEmptyClientID(t *testing.T) {
58+
t.Setenv("DASH0_CONFIG_DIR", t.TempDir())
59+
60+
var gotForm url.Values
61+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
62+
require.NoError(t, r.ParseForm())
63+
gotForm = r.Form
64+
w.WriteHeader(http.StatusOK)
65+
}))
66+
defer server.Close()
67+
68+
assert.True(t, Revoke(RevokeRequest{APIURL: server.URL, RefreshToken: "dash0_rt_test"}))
69+
require.NotNil(t, gotForm)
70+
_, present := gotForm["client_id"]
71+
assert.False(t, present, "empty client_id must be omitted, not sent as an empty parameter")
72+
}
73+
74+
func TestRevoke_FallsBackToDCRCache(t *testing.T) {
75+
dir := t.TempDir()
76+
t.Setenv("DASH0_CONFIG_DIR", dir)
77+
78+
var gotForm url.Values
79+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
80+
require.NoError(t, r.ParseForm())
81+
gotForm = r.Form
82+
w.WriteHeader(http.StatusOK)
83+
}))
84+
defer server.Close()
85+
86+
store, err := profiles.NewOAuthClientStore()
87+
require.NoError(t, err)
88+
require.NoError(t, store.Put(server.URL, profiles.OAuthClientRecord{
89+
ClientID: "cached-from-dcr",
90+
RedirectURI: "http://localhost/cb",
91+
}))
92+
93+
assert.True(t, Revoke(RevokeRequest{APIURL: server.URL, RefreshToken: "dash0_rt_test"}))
94+
require.NotNil(t, gotForm)
95+
assert.Equal(t, "cached-from-dcr", gotForm.Get("client_id"))
96+
}

0 commit comments

Comments
 (0)