From e9a3d51cfa5a7991cd6bdf1adcba25a36d96f094 Mon Sep 17 00:00:00 2001 From: Tit Petric Date: Tue, 17 Jul 2018 11:32:11 +0200 Subject: [PATCH] add(rbac): initial rbac import --- rbac/client.go | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ rbac/flags.go | 36 +++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 rbac/client.go create mode 100644 rbac/flags.go diff --git a/rbac/client.go b/rbac/client.go new file mode 100644 index 000000000..6c081b569 --- /dev/null +++ b/rbac/client.go @@ -0,0 +1,57 @@ +package rbac + +import ( + "encoding/base64" + "fmt" + "net/http" + "strings" +) + +type ( + Client struct { + Client *http.Client + + isDebug bool + config configuration + } +) + +func New() (*Client, error) { + if err := config.validate(); err != nil { + return nil, err + } + + return &Client{ + Client: &http.Client{}, // @todo: timeouts + isDebug: false, + config: config, + }, nil +} + +func (c *Client) Get(url string) (*http.Response, error) { + return c.Request("GET", url) +} + +func (c *Client) Request(method string, url string) (*http.Response, error) { + link := strings.TrimRight(c.config.baseURL, "/") + "/" + strings.TrimLeft(url, "/") + + if c.isDebug { + fmt.Println("RBAC >>> ", link) + } + + req, err := http.NewRequest(method, link, nil) + if err != nil { + return nil, err + } + + req.Header.Add("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(c.config.auth))) + req.Header.Add("X-TENANT-ID", c.config.tenant) + + resp, err := c.Client.Do(req) + if err != nil { + fmt.Println(err) + return nil, err + } + + return resp, nil +} diff --git a/rbac/flags.go b/rbac/flags.go new file mode 100644 index 000000000..8dbf1fe58 --- /dev/null +++ b/rbac/flags.go @@ -0,0 +1,36 @@ +package rbac + +import ( + "github.com/namsral/flag" + "github.com/pkg/errors" +) + +type ( + configuration struct { + auth string + tenant string + baseURL string + } +) + +var config configuration + +func (c configuration) validate() error { + if c.auth == "" { + return errors.New("No authentication provided for RBAC") + } + if c.tenant == "" { + return errors.New("No tenant provided for RBAC") + } + if c.baseURL == "" { + return errors.New("No Base URL provided for RBAC") + } + return nil +} + +// Flags should be called from main to register flags +func Flags() { + flag.StringVar(&config.auth, "rbac-auth", "username:password", "Credentials to use for RBAC queries") + flag.StringVar(&config.tenant, "rbac-tenant", "", "Tenant ID") + flag.StringVar(&config.baseURL, "rbac-base-url", "", "RBAC Base URL") +}