120 lines
2.9 KiB
Go
Vendored
120 lines
2.9 KiB
Go
Vendored
package couchbase
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
)
|
|
|
|
type User struct {
|
|
Name string
|
|
Id string
|
|
Domain string
|
|
Roles []Role
|
|
}
|
|
|
|
type Role struct {
|
|
Role string
|
|
BucketName string `json:"bucket_name"`
|
|
}
|
|
|
|
// Sample:
|
|
// {"role":"admin","name":"Admin","desc":"Can manage ALL cluster features including security.","ce":true}
|
|
// {"role":"query_select","bucket_name":"*","name":"Query Select","desc":"Can execute SELECT statement on bucket to retrieve data"}
|
|
type RoleDescription struct {
|
|
Role string
|
|
Name string
|
|
Desc string
|
|
Ce bool
|
|
BucketName string `json:"bucket_name"`
|
|
}
|
|
|
|
// Return user-role data, as parsed JSON.
|
|
// Sample:
|
|
// [{"id":"ivanivanov","name":"Ivan Ivanov","roles":[{"role":"cluster_admin"},{"bucket_name":"default","role":"bucket_admin"}]},
|
|
// {"id":"petrpetrov","name":"Petr Petrov","roles":[{"role":"replication_admin"}]}]
|
|
func (c *Client) GetUserRoles() ([]interface{}, error) {
|
|
ret := make([]interface{}, 0, 1)
|
|
err := c.parseURLResponse("/settings/rbac/users", &ret)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Get the configured administrator.
|
|
// Expected result: {"port":8091,"username":"Administrator"}
|
|
adminInfo := make(map[string]interface{}, 2)
|
|
err = c.parseURLResponse("/settings/web", &adminInfo)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Create a special entry for the configured administrator.
|
|
adminResult := map[string]interface{}{
|
|
"name": adminInfo["username"],
|
|
"id": adminInfo["username"],
|
|
"domain": "ns_server",
|
|
"roles": []interface{}{
|
|
map[string]interface{}{
|
|
"role": "admin",
|
|
},
|
|
},
|
|
}
|
|
|
|
// Add the configured administrator to the list of results.
|
|
ret = append(ret, adminResult)
|
|
|
|
return ret, nil
|
|
}
|
|
|
|
func (c *Client) GetUserInfoAll() ([]User, error) {
|
|
ret := make([]User, 0, 16)
|
|
err := c.parseURLResponse("/settings/rbac/users", &ret)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ret, nil
|
|
}
|
|
|
|
func rolesToParamFormat(roles []Role) string {
|
|
var buffer bytes.Buffer
|
|
for i, role := range roles {
|
|
if i > 0 {
|
|
buffer.WriteString(",")
|
|
}
|
|
buffer.WriteString(role.Role)
|
|
if role.BucketName != "" {
|
|
buffer.WriteString("[")
|
|
buffer.WriteString(role.BucketName)
|
|
buffer.WriteString("]")
|
|
}
|
|
}
|
|
return buffer.String()
|
|
}
|
|
|
|
func (c *Client) PutUserInfo(u *User) error {
|
|
params := map[string]interface{}{
|
|
"name": u.Name,
|
|
"roles": rolesToParamFormat(u.Roles),
|
|
}
|
|
var target string
|
|
switch u.Domain {
|
|
case "external":
|
|
target = "/settings/rbac/users/" + u.Id
|
|
case "local":
|
|
target = "/settings/rbac/users/local/" + u.Id
|
|
default:
|
|
return fmt.Errorf("Unknown user type: %s", u.Domain)
|
|
}
|
|
var ret string // PUT returns an empty string. We ignore it.
|
|
err := c.parsePutURLResponse(target, params, &ret)
|
|
return err
|
|
}
|
|
|
|
func (c *Client) GetRolesAll() ([]RoleDescription, error) {
|
|
ret := make([]RoleDescription, 0, 32)
|
|
err := c.parseURLResponse("/settings/rbac/roles", &ret)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ret, nil
|
|
}
|