Adding GITHUB_TOKEN & GITHUB_ENTERPRISE_TOKEN support orthogonal to Config was getting out of hand, especially in `auth` commands that adjust their messaging and error status based on the presence of these environment variables. The new approach builds in support for tokens from environment straight into Config object by composition. Thus, commands need not ever be concerned with any specific environment variables.
71 lines
1.5 KiB
Go
71 lines
1.5 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/cli/cli/internal/ghinstance"
|
|
)
|
|
|
|
const (
|
|
GITHUB_TOKEN = "GITHUB_TOKEN"
|
|
GITHUB_ENTERPRISE_TOKEN = "GITHUB_ENTERPRISE_TOKEN"
|
|
)
|
|
|
|
func InheritEnv(c Config) Config {
|
|
return &envConfig{Config: c}
|
|
}
|
|
|
|
type envConfig struct {
|
|
Config
|
|
}
|
|
|
|
func (c *envConfig) Hosts() ([]string, error) {
|
|
hasDefault := false
|
|
hosts, err := c.Config.Hosts()
|
|
for _, h := range hosts {
|
|
if h == ghinstance.Default() {
|
|
hasDefault = true
|
|
}
|
|
}
|
|
if (err != nil || !hasDefault) && os.Getenv(GITHUB_TOKEN) != "" {
|
|
hosts = append([]string{ghinstance.Default()}, hosts...)
|
|
return hosts, nil
|
|
}
|
|
return hosts, err
|
|
}
|
|
|
|
func (c *envConfig) Get(hostname, key string) (string, error) {
|
|
val, _, err := c.GetWithSource(hostname, key)
|
|
return val, err
|
|
}
|
|
|
|
func (c *envConfig) GetWithSource(hostname, key string) (string, string, error) {
|
|
if hostname != "" && key == "oauth_token" {
|
|
envName := GITHUB_TOKEN
|
|
if ghinstance.IsEnterprise(hostname) {
|
|
envName = GITHUB_ENTERPRISE_TOKEN
|
|
}
|
|
|
|
if value := os.Getenv(envName); value != "" {
|
|
return value, envName, nil
|
|
}
|
|
}
|
|
|
|
return c.Config.GetWithSource(hostname, key)
|
|
}
|
|
|
|
func (c *envConfig) CheckWriteable(hostname, key string) error {
|
|
if hostname != "" && key == "oauth_token" {
|
|
envName := GITHUB_TOKEN
|
|
if ghinstance.IsEnterprise(hostname) {
|
|
envName = GITHUB_ENTERPRISE_TOKEN
|
|
}
|
|
|
|
if os.Getenv(envName) != "" {
|
|
return fmt.Errorf("read-only token in %s cannot be modified", envName)
|
|
}
|
|
}
|
|
|
|
return c.Config.CheckWriteable(hostname, key)
|
|
}
|