sso

package
v1.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 29, 2021 License: GPL-3.0 Imports: 24 Imported by: 0

Documentation

Index

Constants

View Source
const (

	// The default values for ODIC defined in:
	// https://tools.ietf.org/html/draft-ietf-oauth-device-flow-15#section-3.5
	SLOW_DOWN_SEC  = 5
	RETRY_INTERVAL = 5
)
View Source
const (
	KEYRING_NAME                 = "AWSSSOCli"
	KEYRING_ID                   = "aws-sso-cli"
	REGISTER_CLIENT_DATA_PREFIX  = "client-data"
	CREATE_TOKEN_RESPONSE_PREFIX = "token-response"
	ENV_SSO_FILE_PASSWORD        = "AWS_SSO_FILE_PASSPHRASE"
)
View Source
const (
	AWS_SESSION_EXPIRATION_FORMAT = "2006-01-02 15:04:05 -0700 MST"
	CACHE_TTL                     = 60 * 60 * 24 // 1 day in seconds
)

Variables

View Source
var DEFAULT_ACCOUNT_PRIMARY_TAGS []string = []string{
	"AccountName",
	"AccountAlias",
	"Email",
}
View Source
var NewPassword string = ""

Functions

func GetRoleParts added in v1.2.0

func GetRoleParts(arn string) (int64, string, error)

GetRoleParts returns the accountId & rolename for an ARN

func MakeRoleARN added in v1.2.0

func MakeRoleARN(account int64, name string) string

Creates an AWS ARN for a role

func NewKeyringConfig added in v1.2.0

func NewKeyringConfig(name, configDir string) *keyring.Config

Types

type AWSAccount

type AWSAccount struct {
	Alias         string              `json:"Alias,omitempty"` // from AWS
	Name          string              `json:"Name,omitempty"`  // from config
	EmailAddress  string              `json:"EmailAddress,omitempty"`
	Tags          map[string]string   `json:"Tags,omitempty"`
	Roles         map[string]*AWSRole `json:"Roles,omitempty"`
	DefaultRegion string              `json:"DefaultRegion,omitempty"`
}

AWSAccount and AWSRole is how we store the data

type AWSRole

type AWSRole struct {
	Arn           string            `json:"Arn"`
	DefaultRegion string            `json:"DefaultRegion,omitempty"`
	Expires       string            `json:"Expires,omitempty"` // 2006-01-02 15:04:05 -0700 MST
	Profile       string            `json:"Profile,omitempty"`
	Tags          map[string]string `json:"Tags,omitempty"`
	Via           string            `json:"Via,omitempty"`
}

type AWSRoleFlat

type AWSRoleFlat struct {
	Id            int               `header:"Id"`
	AccountId     int64             `json:"AccountId" header:"AccountId"`
	AccountName   string            `json:"AccountName" header:"AccountName"`
	AccountAlias  string            `json:"AccountAlias" header:"AccountAlias"`
	EmailAddress  string            `json:"EmailAddress" header:"EmailAddress"`
	Expires       string            `json:"Expires" header:"Expires"`
	Arn           string            `json:"Arn" header:"ARN"`
	RoleName      string            `json:"RoleName" header:"Role"`
	Profile       string            `json:"Profile" header:"Profile"`
	DefaultRegion string            `json:"DefaultRegion" header:"DefaultRegion"`
	SSORegion     string            `json:"SSORegion" header:"SSORegion"`
	StartUrl      string            `json:"StartUrl" header:"StartUrl"`
	Tags          map[string]string `json:"Tags"` // not supported by GenerateTable
	Via           string            `json:"Via" header:"Via"`
	SelectTags    map[string]string // tags without spaces
}

This is what we always return for a role definition

func (*AWSRoleFlat) ExpiresIn

func (r *AWSRoleFlat) ExpiresIn() (string, error)

ExpiresIn returns how long until this role expires as a string

func (AWSRoleFlat) GetHeader

func (f AWSRoleFlat) GetHeader(fieldName string) (string, error)

func (*AWSRoleFlat) IsExpired

func (r *AWSRoleFlat) IsExpired() bool

IsExpired returns if this role has expired or has no creds available

type AWSSSO

type AWSSSO struct {
	ClientName string                `json:"ClientName"`
	ClientType string                `json:"ClientType"`
	SsoRegion  string                `json:"ssoRegion"`
	StartUrl   string                `json:"startUrl"`
	ClientData RegisterClientData    `json:"RegisterClient"`
	DeviceAuth StartDeviceAuthData   `json:"StartDeviceAuth"`
	Token      CreateTokenResponse   `json:"TokenResponse"`
	Accounts   []AccountInfo         `json:"Accounts"`
	Roles      map[string][]RoleInfo `json:"Roles"`
	// contains filtered or unexported fields
}

func NewAWSSSO

func NewAWSSSO(ssoRegion, startUrl string, store *SecureStorage) *AWSSSO

func (*AWSSSO) Authenticate

func (as *AWSSSO) Authenticate(printUrl bool, browser string) error

func (*AWSSSO) CreateToken

func (as *AWSSSO) CreateToken() error

Blocks until we have a token

func (*AWSSSO) GetAccounts

func (as *AWSSSO) GetAccounts() ([]AccountInfo, error)

func (*AWSSSO) GetAllTags

func (as *AWSSSO) GetAllTags() *TagsList

returns all of the available tags from AWS SSO

func (*AWSSSO) GetDeviceAuthInfo

func (as *AWSSSO) GetDeviceAuthInfo() (DeviceAuthInfo, error)

func (*AWSSSO) GetRoleCredentials

func (as *AWSSSO) GetRoleCredentials(accountId int64, role string) (RoleCredentials, error)

func (*AWSSSO) GetRoles

func (as *AWSSSO) GetRoles(account AccountInfo) ([]RoleInfo, error)

func (*AWSSSO) RegisterClient

func (as *AWSSSO) RegisterClient() error

Does the needful to talk to AWS or read our cache to get the RegisterClientData

func (*AWSSSO) StartDeviceAuthorization

func (as *AWSSSO) StartDeviceAuthorization() error

Makes the call to AWS to initiate the OIDC auth to the SSO provider.

func (*AWSSSO) StoreKey

func (as *AWSSSO) StoreKey() string

type AccountInfo

type AccountInfo struct {
	Id           int    `yaml:"Id" json:"Id" header:"Id"`
	AccountId    string `yaml:"AccountId" json:"AccountId" header:"AccountId"`
	AccountName  string `yaml:"AccountName" json:"AccountName" header:"AccountName"`
	EmailAddress string `yaml:"EmailAddress" json:"EmailAddress" header:"EmailAddress"`
}

func (AccountInfo) GetAccountId64

func (ai AccountInfo) GetAccountId64() int64

func (AccountInfo) GetHeader

func (ai AccountInfo) GetHeader(fieldName string) (string, error)

type Cache

type Cache struct {
	CreatedAt       int64    `json:"CreatedAt"`       // this cache.json
	ConfigCreatedAt int64    `json:"ConfigCreatedAt"` // track config.yaml
	History         []string `json:"History,omitempty"`
	Roles           *Roles   `json:"Roles,omitempty"`
	// contains filtered or unexported fields
}

Our Cachefile. Sub-structs defined in sso/cache.go

func (*Cache) AddHistory

func (c *Cache) AddHistory(item string, max int)

adds a role to the History list up to the max number of entries

func (*Cache) CacheFile

func (c *Cache) CacheFile() string

func (*Cache) Expired

func (c *Cache) Expired(s *SSOConfig) error

Expired returns if our Roles cache data is too old. If configFile is a valid file, we check the lastModificationTime of that file vs. the ConfigCreatedAt to determine if the cache needs to be updated

func (*Cache) Refresh

func (c *Cache) Refresh(sso *AWSSSO, config *SSOConfig) error

Refresh updates our cached Roles based on AWS SSO & our Config but does not save this data!

func (*Cache) Save

func (c *Cache) Save() error

Save saves our cache to the current file

type CreateTokenResponse added in v1.2.0

type CreateTokenResponse struct {
	AccessToken  string `json:"accessToken"` // should be cached to issue new creds
	ExpiresIn    int64  `json:"expiresIn"`   // number of seconds it expires in (from AWS)
	ExpiresAt    int64  `json:"expiresAt"`   // Unix time when it expires
	IdToken      string `json:"IdToken"`
	RefreshToken string `json:"RefreshToken"`
	TokenType    string `json:"tokenType"`
}

func (*CreateTokenResponse) Expired added in v1.2.0

func (t *CreateTokenResponse) Expired() bool

type DeviceAuthInfo

type DeviceAuthInfo struct {
	VerificationUri         string
	VerificationUriComplete string
	UserCode                string
}

func (*DeviceAuthInfo) OpenBrowser added in v1.2.0

func (da *DeviceAuthInfo) OpenBrowser() error

type JsonStore added in v1.2.0

type JsonStore struct {
	RegisterClient      map[string]RegisterClientData  `json:"RegisterClient,omitempty"`
	StartDeviceAuth     map[string]StartDeviceAuthData `json:"StartDeviceAuth,omitempty"`
	CreateTokenResponse map[string]CreateTokenResponse `json:"CreateTokenResponse,omitempty"`
	RoleCredentials     map[string]RoleCredentials     `json:"RoleCredentials,omitempty"`
	// contains filtered or unexported fields
}

Impliments SecureStorage insecurely

func OpenJsonStore added in v1.2.0

func OpenJsonStore(fileName string) (*JsonStore, error)

func (*JsonStore) DeleteCreateTokenResponse added in v1.2.0

func (jc *JsonStore) DeleteCreateTokenResponse(key string) error

DeleteCreateTokenResponse deletes the token from the json file

func (*JsonStore) DeleteRegisterClientData added in v1.2.0

func (jc *JsonStore) DeleteRegisterClientData(key string) error

func (*JsonStore) DeleteRoleCredentials added in v1.2.0

func (jc *JsonStore) DeleteRoleCredentials(arn string) error

DeleteRoleCredentials deletes the token from the json file

func (*JsonStore) GetCreateTokenResponse added in v1.2.0

func (jc *JsonStore) GetCreateTokenResponse(key string, token *CreateTokenResponse) error

GetCreateTokenResponse retrieves the CreateTokenResponse from the json file

func (*JsonStore) GetRegisterClientData added in v1.2.0

func (jc *JsonStore) GetRegisterClientData(key string, client *RegisterClientData) error

func (*JsonStore) GetRoleCredentials added in v1.2.0

func (jc *JsonStore) GetRoleCredentials(arn string, token *RoleCredentials) error

GetRoleCredentials retrieves the RoleCredentials from the json file

func (*JsonStore) SaveCreateTokenResponse added in v1.2.0

func (jc *JsonStore) SaveCreateTokenResponse(key string, token CreateTokenResponse) error

SaveCreateTokenResponse stores the token in the json file

func (*JsonStore) SaveRegisterClientData added in v1.2.0

func (jc *JsonStore) SaveRegisterClientData(key string, client RegisterClientData) error

RegisterClientData

func (*JsonStore) SaveRoleCredentials added in v1.2.0

func (jc *JsonStore) SaveRoleCredentials(arn string, token RoleCredentials) error

SaveRoleCredentials stores the token in the json file

type KeyringStore added in v1.2.0

type KeyringStore struct {
	// contains filtered or unexported fields
}

Impliments SecureStorage

func OpenKeyring added in v1.2.0

func OpenKeyring(cfg *keyring.Config) (*KeyringStore, error)

func (*KeyringStore) CreateTokenResponseKey added in v1.2.0

func (kr *KeyringStore) CreateTokenResponseKey(key string) string

func (*KeyringStore) DeleteCreateTokenResponse added in v1.2.0

func (kr *KeyringStore) DeleteCreateTokenResponse(key string) error

DeleteCreateTokenResponse deletes the CreateTokenResponse from the keyring

func (*KeyringStore) DeleteRegisterClientData added in v1.2.0

func (kr *KeyringStore) DeleteRegisterClientData(region string) error

Delete the RegisterClientData from the keychain

func (*KeyringStore) DeleteRoleCredentials added in v1.2.0

func (kr *KeyringStore) DeleteRoleCredentials(arn string) error

DeleteRoleCredentials deletes the RoleCredentials from the Keyring

func (*KeyringStore) GetCreateTokenResponse added in v1.2.0

func (kr *KeyringStore) GetCreateTokenResponse(key string, token *CreateTokenResponse) error

GetCreateTokenResponse retrieves the CreateTokenResponse from the keyring

func (*KeyringStore) GetRegisterClientData added in v1.2.0

func (kr *KeyringStore) GetRegisterClientData(region string, client *RegisterClientData) error

Get our RegisterClientData from the key chain

func (*KeyringStore) GetRoleCredentials added in v1.2.0

func (kr *KeyringStore) GetRoleCredentials(arn string, token *RoleCredentials) error

GetRoleCredentials retrieves the RoleCredentials from the Keyring

func (*KeyringStore) RegisterClientKey added in v1.2.0

func (kr *KeyringStore) RegisterClientKey(ssoRegion string) string

func (*KeyringStore) SaveCreateTokenResponse added in v1.2.0

func (kr *KeyringStore) SaveCreateTokenResponse(key string, token CreateTokenResponse) error

SaveCreateTokenResponse stores the token in the keyring

func (*KeyringStore) SaveRegisterClientData added in v1.2.0

func (kr *KeyringStore) SaveRegisterClientData(region string, client RegisterClientData) error

Save our RegisterClientData in the key chain

func (*KeyringStore) SaveRoleCredentials added in v1.2.0

func (kr *KeyringStore) SaveRoleCredentials(arn string, token RoleCredentials) error

SaveRoleCredentials stores the token in the arnring

type RegisterClientData added in v1.2.0

type RegisterClientData struct {
	AuthorizationEndpoint string `json:"authorizationEndpoint,omitempty"`
	ClientId              string `json:"clientId"`
	ClientIdIssuedAt      int64  `json:"clientIdIssuedAt"`
	ClientSecret          string `json:"clientSecret"`
	ClientSecretExpiresAt int64  `json:"clientSecretExpiresAt"`
	TokenEndpoint         string `json:"tokenEndpoint,omitempty"`
}

this struct should be cached for long term if possible

func (*RegisterClientData) Expired added in v1.2.0

func (r *RegisterClientData) Expired() bool

type RoleCredentials added in v1.2.0

type RoleCredentials struct {
	RoleName        string `json:"roleName"`
	AccountId       int64  `json:"accountId"`
	AccessKeyId     string `json:"accessKeyId"`
	SecretAccessKey string `json:"secretAccessKey"`
	SessionToken    string `json:"sessionToken"`
	Expiration      int64  `json:"expiration"` // not in seconds!
}

func (*RoleCredentials) AccountIdStr added in v1.2.0

func (r *RoleCredentials) AccountIdStr() string

AccountIdStr returns our AccountId as a string

func (*RoleCredentials) ExpireString added in v1.2.0

func (r *RoleCredentials) ExpireString() string

func (*RoleCredentials) RoleArn added in v1.2.0

func (r *RoleCredentials) RoleArn() string

type RoleInfo

type RoleInfo struct {
	Id           int    `yaml:"Id" json:"Id" header:"Id"`
	Arn          string `yaml:"-" json:"-" header:"Arn"`
	RoleName     string `yaml:"RoleName" json:"RoleName" header:"RoleName"`
	AccountId    string `yaml:"AccountId" json:"AccountId" header:"AccountId"`
	AccountName  string `yaml:"AccountName" json:"AccountName" header:"AccountName"`
	EmailAddress string `yaml:"EmailAddress" json:"EmailAddress" header:"EmailAddress"`
	Expires      int64  `yaml:"Expires" json:"Expires" header:"Expires"`
	Profile      string `yaml:"Profile" json:"Profile" header:"Profile"`
	Region       string `yaml:"Region" json:"Region" header:"Region"`
	SSORegion    string `header:"SSORegion"`
	StartUrl     string `header:"StartUrl"`
}

func (RoleInfo) GetHeader

func (ri RoleInfo) GetHeader(fieldName string) (string, error)

func (RoleInfo) RoleArn

func (ri RoleInfo) RoleArn() string

type RoleTags

type RoleTags map[string]map[string]string // ARN => TagKey => Value

RoleTags provides an interface to find roles which match a set of tags

func (*RoleTags) GetMatchCount

func (r *RoleTags) GetMatchCount(tags map[string]string) int

func (*RoleTags) GetMatchingRoles

func (r *RoleTags) GetMatchingRoles(tags map[string]string) []string

GetMatchingRoles returns the roles which match all the tags

func (*RoleTags) GetPossibleUniqueRoles

func (r *RoleTags) GetPossibleUniqueRoles(tags map[string]string, key string, values []string) []string

GetPossibleMatches is like GetMatchingRoles, but takes another key and a list of values and it returns the unique set of all roles which match the base tags and all the possible combnations of key/values

func (*RoleTags) GetRoleTags

func (r *RoleTags) GetRoleTags(role string) map[string]string

func (*RoleTags) UsefulTags

func (r *RoleTags) UsefulTags(tags map[string]string) []string

UsefulTags takes a map of tag key/value pairs and returns a list of tag keys which result in additional filtering

type Roles

type Roles struct {
	// sso           *AWSSSO
	SSOName       string                `json:"SSOName"`
	Accounts      map[int64]*AWSAccount `json:"Accounts"`
	SSORegion     string                `json:"SSORegion"`
	StartUrl      string                `json:"StartUrl"`
	DefaultRegion string                `json:"DefaultRegion"`
}

main struct holding all our Roles discovered via AWS SSO and via the config.yaml

func NewRoles added in v1.2.0

func NewRoles(as *AWSSSO, ssoName string, config *SSOConfig) (*Roles, error)

Merges the AWS SSO and our Config file to create our Roles struct

func (*Roles) AccountIds

func (r *Roles) AccountIds() []int64

AccountIds returns all the configured AWS SSO AccountIds

func (*Roles) GetAccountRoles

func (r *Roles) GetAccountRoles(accountId int64) map[string]*AWSRoleFlat

AccountRoles returns all the roles for a given account

func (*Roles) GetAllRoles

func (r *Roles) GetAllRoles() []*AWSRoleFlat

AllRoles returns all the Roles as a flat list

func (*Roles) GetAllTags

func (r *Roles) GetAllTags() *TagsList

GetAllTags returns all the unique key/tag pairs for every role

func (*Roles) GetAllTagsSelect added in v1.2.0

func (r *Roles) GetAllTagsSelect() *TagsList

returns all tags, but with with spaces replaced with underscores

func (*Roles) GetRole

func (r *Roles) GetRole(accountId int64, roleName string) (*AWSRoleFlat, error)

Role returns the specified role as an AWSRoleFlat

func (*Roles) GetRoleChain

func (r *Roles) GetRoleChain(accountId int64, roleName string) []*AWSRoleFlat

GetRoleChain figures out the AssumeRole chain required to assume the given role

func (*Roles) GetRoleTags

func (r *Roles) GetRoleTags() *RoleTags

GetRoleTags returns all the tags for each role

func (*Roles) GetRoleTagsSelect added in v1.2.0

func (r *Roles) GetRoleTagsSelect() *RoleTags

GetRoleTagsSelect returns all the tags for each role with all the spaces replaced with underscores

func (*Roles) MatchingRoles

func (r *Roles) MatchingRoles(tags map[string]string) []*AWSRoleFlat

MatchingRoles returns all the roles matching the given tags

type SSOAccount

type SSOAccount struct {
	Name          string              `koanf:"Name" yaml:"Name,omitempty"` // Admin configured Account Name
	Tags          map[string]string   `koanf:"Tags" yaml:"Tags,omitempty" `
	Roles         map[string]*SSORole `koanf:"Roles" yaml:"Roles,omitempty"`
	DefaultRegion string              `koanf:"DefaultRegion" yaml:"DefaultRegion,omitempty"`
	// contains filtered or unexported fields
}

func (*SSOAccount) GetAllTags

func (a *SSOAccount) GetAllTags(id int64) map[string]string

GetAllTags returns all of the user defined tags and calculated tags for this account

func (*SSOAccount) HasRole

func (a *SSOAccount) HasRole(arn string) bool

HasRole returns true/false if the given Account has the provided arn

type SSOConfig

type SSOConfig struct {
	SSORegion     string                `koanf:"SSORegion" yaml:"SSORegion"`
	StartUrl      string                `koanf:"StartUrl" yaml:"StartUrl"`
	Accounts      map[int64]*SSOAccount `koanf:"Accounts" yaml:"Accounts,omitempty"`
	DefaultRegion string                `koanf:"DefaultRegion" yaml:"DefaultRegion,omitempty"`
	// contains filtered or unexported fields
}

func (*SSOConfig) ConfigFile added in v1.2.0

func (c *SSOConfig) ConfigFile() string

ConfigFile returns the path to the config file

func (*SSOConfig) CreatedAt

func (c *SSOConfig) CreatedAt() int64

CreatedAt returns the Unix epoch seconds that this config file was created at

func (*SSOConfig) GetAllTags

func (s *SSOConfig) GetAllTags() *TagsList

returns all of the available account & role tags for our SSO Provider

func (*SSOConfig) GetRoleMatches

func (s *SSOConfig) GetRoleMatches(tags map[string]string) []*SSORole

GetRoleMatches finds all the roles which match all of the given tags

func (*SSOConfig) GetRoles

func (s *SSOConfig) GetRoles() []*SSORole

GetRoles returns a list of all the roles for this SSOConfig

func (*SSOConfig) Refresh

func (c *SSOConfig) Refresh(s *Settings)

Refresh should be called any time you load the SSOConfig into memory or add a role to update the Role -> Account references

type SSORole

type SSORole struct {
	ARN           string            `koanf:"ARN" yaml:"ARN"`
	Profile       string            `koanf:"Profile" yaml:"Profile,omitempty"`
	Tags          map[string]string `koanf:"Tags" yaml:"Tags,omitempty"`
	DefaultRegion string            `koanf:"DefaultRegion" yaml:"DefaultRegion,omitempty"`
	Via           string            `koanf:"Via" yaml:"Via,omitempty"`
	// contains filtered or unexported fields
}

func (*SSORole) GetAccountId

func (r *SSORole) GetAccountId() string

GetAccountId returns the accountId portion of the ARN or empty string on error

func (*SSORole) GetAccountId64

func (r *SSORole) GetAccountId64() int64

GetAccountId64 returns the accountId portion of the ARN

func (*SSORole) GetAllTags

func (r *SSORole) GetAllTags() map[string]string

GetAllTags returns all of the user defined and calculated tags for this role

func (*SSORole) GetRoleName

func (r *SSORole) GetRoleName() string

GetRoleName returns the role name portion of the ARN

func (*SSORole) SetParentAccount

func (r *SSORole) SetParentAccount(a *SSOAccount)

type SecureStorage added in v1.2.0

type SecureStorage interface {
	SaveRegisterClientData(string, RegisterClientData) error
	GetRegisterClientData(string, *RegisterClientData) error
	DeleteRegisterClientData(string) error

	SaveCreateTokenResponse(string, CreateTokenResponse) error
	GetCreateTokenResponse(string, *CreateTokenResponse) error
	DeleteCreateTokenResponse(string) error

	SaveRoleCredentials(string, RoleCredentials) error
	GetRoleCredentials(string, *RoleCredentials) error
	DeleteRoleCredentials(string) error
}

Define the interface for storing our AWS SSO data

type Settings

type Settings struct {
	Cache             *Cache                // our cache data
	SSO               map[string]*SSOConfig `koanf:"SSOConfig" yaml:"SSOConfig,omitempty"`
	DefaultSSO        string                `koanf:"DefaultSSO" yaml:"DefaultSSO,omitempty"`   // specify default SSO by key
	SecureStore       string                `koanf:"SecureStore" yaml:"SecureStore,omitempty"` // json or keyring
	JsonStore         string                `koanf:"JsonStore" yaml:"JsonStore,omitempty"`
	PrintUrl          bool                  `koanf:"PrintUrl" yaml:"PrintUrl,omitempty"`
	Browser           string                `koanf:"Browser" yaml:"Browser,omitempty"`
	ProfileFormat     string                `koanf:"ProfileFormat" yaml:"ProfileFormat,omitempty"`
	AccountPrimaryTag []string              `koanf:"AccountPrimaryTag" yaml:"AccountPrimaryTag"`
	// contains filtered or unexported fields
}

func LoadSettings

func LoadSettings(configFile, cacheFile string, defaults SettingsDefaults) (*Settings, error)

func (*Settings) ConfigFile

func (s *Settings) ConfigFile() string

func (*Settings) CreatedAt

func (s *Settings) CreatedAt() int64

func (*Settings) GetSelectedSSO

func (s *Settings) GetSelectedSSO(name string) (*SSOConfig, error)

GetSelectedSSO returns a valid SSOConfig based on user intput, configured value or our hardcoded 'Default' if it exists.

func (*Settings) OpenCache added in v1.2.0

func (s *Settings) OpenCache() (*Cache, error)

type SettingsDefaults added in v1.2.0

type SettingsDefaults struct {
	PrintUrl bool
	Browser  string
	SSOName  string
}

type StartDeviceAuthData added in v1.2.0

type StartDeviceAuthData struct {
	DeviceCode              string `json:"deviceCode"`
	UserCode                string `json:"userCode"`
	VerificationUri         string `json:"verificationUri"`
	VerificationUriComplete string `json:"verificationUriComplete"`
	ExpiresIn               int64  `json:"expiresIn"`
	Interval                int64  `json:"interval"`
}

type TagsList

type TagsList map[string][]string // tag key => list of values

TagsList provides the necessary struct finding all the possible tag key/values

func NewTagsList

func NewTagsList() *TagsList

func (*TagsList) Add

func (t *TagsList) Add(tag, v string)

Inserts the tag/value if it does not already exist in the sorted order

func (*TagsList) AddTags

func (t *TagsList) AddTags(tags map[string]string)

AddTags inserts a map of tag/values if they do not already exist

func (*TagsList) Get

func (t *TagsList) Get(key string) []string

Returns the list of values for the specified key

func (*TagsList) Merge

func (t *TagsList) Merge(a *TagsList)

Merge adds all the new tags in a to the TagsList

func (*TagsList) UniqueKeys

func (t *TagsList) UniqueKeys(picked []string) []string

Returns a sorted unique list of tag keys, removing any keys which have already been picked

func (*TagsList) UniqueValues

func (t *TagsList) UniqueValues(key string) []string

Returns a sorted unique list of tag values for the given key

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL