73 lines
1.4 KiB
Go
73 lines
1.4 KiB
Go
package dcos
|
|
|
|
import (
|
|
"context"
|
|
"crypto/rsa"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"strings"
|
|
"time"
|
|
"unicode/utf8"
|
|
)
|
|
|
|
const (
|
|
// How long before expiration to renew token
|
|
relogDuration = 5 * time.Minute
|
|
)
|
|
|
|
type Credentials interface {
|
|
Token(ctx context.Context, client Client) (string, error)
|
|
IsExpired() bool
|
|
}
|
|
|
|
type ServiceAccount struct {
|
|
AccountID string
|
|
PrivateKey *rsa.PrivateKey
|
|
|
|
auth *AuthToken
|
|
}
|
|
|
|
type TokenCreds struct {
|
|
Path string
|
|
}
|
|
|
|
type NullCreds struct {
|
|
}
|
|
|
|
func (c *ServiceAccount) Token(ctx context.Context, client Client) (string, error) {
|
|
auth, err := client.Login(ctx, c)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
c.auth = auth
|
|
return auth.Text, nil
|
|
}
|
|
|
|
func (c *ServiceAccount) IsExpired() bool {
|
|
return c.auth.Text != "" || c.auth.Expire.Add(relogDuration).After(time.Now())
|
|
}
|
|
|
|
func (c *TokenCreds) Token(ctx context.Context, client Client) (string, error) {
|
|
octets, err := ioutil.ReadFile(c.Path)
|
|
if err != nil {
|
|
return "", fmt.Errorf("Error reading token file %q: %s", c.Path, err)
|
|
}
|
|
if !utf8.Valid(octets) {
|
|
return "", fmt.Errorf("Token file does not contain utf-8 encoded text: %s", c.Path)
|
|
}
|
|
token := strings.TrimSpace(string(octets))
|
|
return token, nil
|
|
}
|
|
|
|
func (c *TokenCreds) IsExpired() bool {
|
|
return true
|
|
}
|
|
|
|
func (c *NullCreds) Token(ctx context.Context, client Client) (string, error) {
|
|
return "", nil
|
|
}
|
|
|
|
func (c *NullCreds) IsExpired() bool {
|
|
return true
|
|
}
|