113 lines
3.1 KiB
Go
113 lines
3.1 KiB
Go
package ovh
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// Map user friendly access level names to corresponding HTTP verbs
|
|
var (
|
|
ReadOnly = []string{"GET"}
|
|
ReadWrite = []string{"GET", "POST", "PUT", "DELETE"}
|
|
ReadWriteSafe = []string{"GET", "POST", "PUT"}
|
|
)
|
|
|
|
// AccessRule represents a method allowed for a path
|
|
type AccessRule struct {
|
|
// Allowed HTTP Method for the requested AccessRule.
|
|
// Can be set to GET/POST/PUT/DELETE.
|
|
Method string `json:"method"`
|
|
// Allowed path.
|
|
// Can be an exact string or a string with '*' char.
|
|
// Example :
|
|
// /me : only /me is authorized
|
|
// /* : all calls are authorized
|
|
Path string `json:"path"`
|
|
}
|
|
|
|
// CkValidationState represents the response when asking a new consumerKey.
|
|
type CkValidationState struct {
|
|
// Consumer key, which need to be validated by customer.
|
|
ConsumerKey string `json:"consumerKey"`
|
|
// Current status, should be always "pendingValidation".
|
|
State string `json:"state"`
|
|
// URL to redirect user in order to log in.
|
|
ValidationURL string `json:"validationUrl"`
|
|
}
|
|
|
|
// CkRequest represents the parameters to fill in order to ask a new
|
|
// consumerKey.
|
|
type CkRequest struct {
|
|
client *Client
|
|
AccessRules []AccessRule `json:"accessRules"`
|
|
Redirection string `json:"redirection,omitempty"`
|
|
}
|
|
|
|
func (ck *CkValidationState) String() string {
|
|
return fmt.Sprintf("CK: %q\nStatus: %q\nValidation URL: %q\n",
|
|
ck.ConsumerKey,
|
|
ck.State,
|
|
ck.ValidationURL,
|
|
)
|
|
}
|
|
|
|
// NewCkRequest helps create a new ck request
|
|
func (c *Client) NewCkRequest() *CkRequest {
|
|
return &CkRequest{
|
|
client: c,
|
|
AccessRules: []AccessRule{},
|
|
}
|
|
}
|
|
|
|
// NewCkRequestWithRedirection helps create a new ck request with a redirect URL
|
|
func (c *Client) NewCkRequestWithRedirection(redirection string) *CkRequest {
|
|
return &CkRequest{
|
|
client: c,
|
|
AccessRules: []AccessRule{},
|
|
Redirection: redirection,
|
|
}
|
|
}
|
|
|
|
// AddRule adds a new rule to the ckRequest
|
|
func (ck *CkRequest) AddRule(method, path string) {
|
|
ck.AccessRules = append(ck.AccessRules, AccessRule{
|
|
Method: method,
|
|
Path: path,
|
|
})
|
|
}
|
|
|
|
// AddRules adds grant requests on "path" for all methods. "ReadOnly",
|
|
// "ReadWrite" and "ReadWriteSafe" should be used for "methods" unless
|
|
// specific access are required.
|
|
func (ck *CkRequest) AddRules(methods []string, path string) {
|
|
for _, method := range methods {
|
|
ck.AddRule(method, path)
|
|
}
|
|
|
|
}
|
|
|
|
// AddRecursiveRules adds grant requests on "path" and "path/*", for all
|
|
// methods "ReadOnly", "ReadWrite" and "ReadWriteSafe" should be used for
|
|
// "methods" unless specific access are required.
|
|
func (ck *CkRequest) AddRecursiveRules(methods []string, path string) {
|
|
path = strings.TrimRight(path, "/")
|
|
|
|
// Add rules. Skip base rule when requesting access to "/"
|
|
if path != "" {
|
|
ck.AddRules(methods, path)
|
|
}
|
|
ck.AddRules(methods, path+"/*")
|
|
}
|
|
|
|
// Do executes the request. On success, set the consumer key in the client
|
|
// and return the URL the user needs to visit to validate the key
|
|
func (ck *CkRequest) Do() (*CkValidationState, error) {
|
|
state := CkValidationState{}
|
|
err := ck.client.PostUnAuth("/auth/credential", ck, &state)
|
|
|
|
if err == nil {
|
|
ck.client.ConsumerKey = state.ConsumerKey
|
|
}
|
|
|
|
return &state, err
|
|
}
|