mirror of https://github.com/docker/cli.git
91 lines
2.4 KiB
Go
91 lines
2.4 KiB
Go
|
package licensing
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"net/http"
|
||
|
"net/url"
|
||
|
|
||
|
"github.com/docker/licensing/lib/errors"
|
||
|
"github.com/docker/licensing/lib/go-clientlib"
|
||
|
"github.com/docker/licensing/model"
|
||
|
)
|
||
|
|
||
|
func (c *client) getUserByName(ctx context.Context, username string) (*model.User, error) {
|
||
|
url := c.baseURI
|
||
|
url.Path += fmt.Sprintf("/v2/users/%s/", username)
|
||
|
response := new(model.User)
|
||
|
_, _, err := c.doRequestNoAuth(ctx, "GET", &url, clientlib.RecvJSON(response))
|
||
|
return response, err
|
||
|
}
|
||
|
|
||
|
func (c *client) getUserOrgs(ctx context.Context, params model.PaginationParams) ([]model.Org, error) {
|
||
|
values := url.Values{}
|
||
|
|
||
|
if params.PageSize != 0 {
|
||
|
values.Set("page_size",
|
||
|
fmt.Sprintf("%v", params.PageSize))
|
||
|
}
|
||
|
|
||
|
if params.Page != 0 {
|
||
|
values.Set("page",
|
||
|
fmt.Sprintf("%v", params.Page))
|
||
|
}
|
||
|
|
||
|
requrl := c.baseURI
|
||
|
requrl.Path = "/v2/user/orgs/"
|
||
|
requrl.RawQuery = values.Encode()
|
||
|
|
||
|
var response struct {
|
||
|
model.PaginatedMeta
|
||
|
Results []model.Org `json:"results"`
|
||
|
}
|
||
|
_, _, err := c.doReq(ctx, "GET", &requrl, clientlib.RecvJSON(&response))
|
||
|
return response.Results, err
|
||
|
}
|
||
|
|
||
|
// login calls the login endpoint
|
||
|
// If an error is returned by the Accounts service (as opposed to connection error, json unmarshalling error etc.),
|
||
|
// `error` will be of type `LoginError`
|
||
|
func (c *client) login(ctx context.Context, username string, password string) (*model.LoginResult, error) {
|
||
|
url := c.baseURI
|
||
|
url.Path += "/v2/users/login/"
|
||
|
request := model.LoginRequest{
|
||
|
Username: username,
|
||
|
Password: password,
|
||
|
}
|
||
|
response := new(model.LoginResult)
|
||
|
_, _, err := c.doRequestNoAuth(ctx, "POST", &url, clientlib.SendJSON(request), clientlib.RecvJSON(response), loginErrorCheckOpt)
|
||
|
return response, err
|
||
|
}
|
||
|
|
||
|
// loginErrorCheckOpt works similarly to `clientlib.DefaultErrorCheck`, except it parses the error response
|
||
|
func loginErrorCheckOpt(r *clientlib.Request) {
|
||
|
r.ErrorCheck = func(r *clientlib.Request, doErr error, res *http.Response) error {
|
||
|
if doErr != nil {
|
||
|
return errors.Wrap(doErr, r.ErrorFields())
|
||
|
}
|
||
|
status := res.StatusCode
|
||
|
if status >= 200 && status < 300 {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
defer res.Body.Close()
|
||
|
|
||
|
lError := new(model.LoginError)
|
||
|
|
||
|
message := fmt.Sprintf("%s %s returned %d", r.Method, r.URL.String(), status)
|
||
|
lError.HTTPError = errors.NewHTTPError(status, message).
|
||
|
With(r.ErrorFields())
|
||
|
|
||
|
var rawLoginErr model.RawLoginError
|
||
|
err := json.NewDecoder(res.Body).Decode(&rawLoginErr)
|
||
|
if err == nil {
|
||
|
lError.Raw = &rawLoginErr
|
||
|
}
|
||
|
|
||
|
return lError
|
||
|
}
|
||
|
}
|