1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- /*
- * MinIO Go Library for Amazon S3 Compatible Cloud Storage
- * Copyright 2017 MinIO, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- package credentials
- // A Chain will search for a provider which returns credentials
- // and cache that provider until Retrieve is called again.
- //
- // The Chain provides a way of chaining multiple providers together
- // which will pick the first available using priority order of the
- // Providers in the list.
- //
- // If none of the Providers retrieve valid credentials Value, ChainProvider's
- // Retrieve() will return the no credentials value.
- //
- // If a Provider is found which returns valid credentials Value ChainProvider
- // will cache that Provider for all calls to IsExpired(), until Retrieve is
- // called again after IsExpired() is true.
- //
- // creds := credentials.NewChainCredentials(
- // []credentials.Provider{
- // &credentials.EnvAWSS3{},
- // &credentials.EnvMinio{},
- // })
- //
- // // Usage of ChainCredentials.
- // mc, err := minio.NewWithCredentials(endpoint, creds, secure, "us-east-1")
- // if err != nil {
- // log.Fatalln(err)
- // }
- //
- type Chain struct {
- Providers []Provider
- curr Provider
- }
- // NewChainCredentials returns a pointer to a new Credentials object
- // wrapping a chain of providers.
- func NewChainCredentials(providers []Provider) *Credentials {
- return New(&Chain{
- Providers: append([]Provider{}, providers...),
- })
- }
- // Retrieve returns the credentials value, returns no credentials(anonymous)
- // if no credentials provider returned any value.
- //
- // If a provider is found with credentials, it will be cached and any calls
- // to IsExpired() will return the expired state of the cached provider.
- func (c *Chain) Retrieve() (Value, error) {
- for _, p := range c.Providers {
- creds, _ := p.Retrieve()
- // Always prioritize non-anonymous providers, if any.
- if creds.AccessKeyID == "" && creds.SecretAccessKey == "" {
- continue
- }
- c.curr = p
- return creds, nil
- }
- // At this point we have exhausted all the providers and
- // are left without any credentials return anonymous.
- return Value{
- SignerType: SignatureAnonymous,
- }, nil
- }
- // IsExpired will returned the expired state of the currently cached provider
- // if there is one. If there is no current provider, true will be returned.
- func (c *Chain) IsExpired() bool {
- if c.curr != nil {
- return c.curr.IsExpired()
- }
- return true
- }
|