54 lines
1.7 KiB
Go
54 lines
1.7 KiB
Go
// Copyright (c) 2026 Probo Inc <hello@getprobo.com>.
|
|
//
|
|
// Permission to use, copy, modify, and/or distribute this software for any
|
|
// purpose with or without fee is hereby granted, provided that the above
|
|
// copyright notice and this permission notice appear in all copies.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
// PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
package cmdutil
|
|
|
|
import (
|
|
"go.probo.inc/probo/pkg/cli/api"
|
|
"go.probo.inc/probo/pkg/cli/config"
|
|
"go.probo.inc/probo/pkg/cmd/iostreams"
|
|
)
|
|
|
|
type Factory struct {
|
|
IOStreams *iostreams.IOStreams
|
|
Version string
|
|
Config func() (*config.Config, error)
|
|
}
|
|
|
|
// TokenRefreshOption returns an api.Option that enables automatic access
|
|
// token refresh using the stored OAuth2 refresh token. If the host config
|
|
// has no refresh token or token endpoint, a no-op option is returned.
|
|
func TokenRefreshOption(
|
|
cfg *config.Config,
|
|
host string,
|
|
hc *config.HostConfig,
|
|
) api.Option {
|
|
if hc.RefreshToken == "" || hc.TokenEndpoint == "" {
|
|
return func(*api.Client) {}
|
|
}
|
|
|
|
return api.WithTokenRefresher(&api.TokenRefresher{
|
|
RefreshToken: hc.RefreshToken,
|
|
TokenEndpoint: hc.TokenEndpoint,
|
|
ClientID: config.CLIClientID,
|
|
OnRefresh: func(accessToken, refreshToken string) error {
|
|
hc.Token = accessToken
|
|
hc.RefreshToken = refreshToken
|
|
cfg.Hosts[host] = hc
|
|
|
|
return cfg.Save()
|
|
},
|
|
})
|
|
}
|