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 }