github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/rights.go (about) 1 /* 2 * Copyright 2021 VMware, Inc. All rights reserved. Licensed under the Apache v2 License. 3 */ 4 package govcd 5 6 import ( 7 "fmt" 8 "net/url" 9 "strings" 10 11 "github.com/vmware/go-vcloud-director/v2/types/v56" 12 ) 13 14 // getAllRights retrieves all rights. Query parameters can be supplied to perform additional 15 // filtering 16 func getAllRights(client *Client, queryParameters url.Values, additionalHeader map[string]string) ([]*types.Right, error) { 17 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointRights 18 minimumApiVersion, err := client.checkOpenApiEndpointCompatibility(endpoint) 19 if err != nil { 20 return nil, err 21 } 22 23 urlRef, err := client.OpenApiBuildEndpoint(endpoint) 24 if err != nil { 25 return nil, err 26 } 27 28 typeResponses := []*types.Right{{}} 29 err = client.OpenApiGetAllItems(minimumApiVersion, urlRef, queryParameters, &typeResponses, additionalHeader) 30 if err != nil { 31 return nil, err 32 } 33 34 return typeResponses, nil 35 } 36 37 // GetAllRights retrieves all available rights. 38 // Query parameters can be supplied to perform additional filtering 39 func (client *Client) GetAllRights(queryParameters url.Values) ([]*types.Right, error) { 40 return getAllRights(client, queryParameters, nil) 41 } 42 43 // GetAllRights retrieves all available rights. Query parameters can be supplied to perform additional 44 // filtering 45 func (adminOrg *AdminOrg) GetAllRights(queryParameters url.Values) ([]*types.Right, error) { 46 tenantContext, err := adminOrg.getTenantContext() 47 if err != nil { 48 return nil, err 49 } 50 return getAllRights(adminOrg.client, queryParameters, getTenantContextHeader(tenantContext)) 51 } 52 53 // getRights retrieves rights belonging to a given Role or similar container (global role, rights bundle). 54 // Query parameters can be supplied to perform additional filtering 55 func getRights(client *Client, roleId, endpoint string, queryParameters url.Values, additionalHeader map[string]string) ([]*types.Right, error) { 56 minimumApiVersion, err := client.checkOpenApiEndpointCompatibility(endpoint) 57 if err != nil { 58 return nil, err 59 } 60 61 urlRef, err := client.OpenApiBuildEndpoint(endpoint + roleId + "/rights") 62 if err != nil { 63 return nil, err 64 } 65 66 typeResponses := []*types.Right{{}} 67 err = client.OpenApiGetAllItems(minimumApiVersion, urlRef, queryParameters, &typeResponses, additionalHeader) 68 if err != nil { 69 return nil, err 70 } 71 72 return typeResponses, nil 73 } 74 75 // GetRights retrieves all rights belonging to a given Role. Query parameters can be supplied to perform additional 76 // filtering 77 func (role *Role) GetRights(queryParameters url.Values) ([]*types.Right, error) { 78 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointRoles 79 return getRights(role.client, role.Role.ID, endpoint, queryParameters, getTenantContextHeader(role.TenantContext)) 80 } 81 82 // getRightByName retrieves a right by given name 83 func getRightByName(client *Client, name string, additionalHeader map[string]string) (*types.Right, error) { 84 var params = url.Values{} 85 86 slowSearch := false 87 88 // When the right name contains commas or semicolons, the encoding is rejected by the API. 89 // For this reason, when one or more commas or semicolons are present (6 occurrences in more than 300 right names) 90 // we run the search brute force, by fetching all the rights, and comparing the names. 91 // This problem should be fixed in 10.3 92 // TODO: revisit this function after 10.3 is released 93 if strings.Contains(name, ",") || strings.Contains(name, ";") { 94 slowSearch = true 95 } else { 96 params.Set("filter", "name=="+name) 97 } 98 rights, err := getAllRights(client, params, additionalHeader) 99 if err != nil { 100 return nil, err 101 } 102 if len(rights) == 0 { 103 return nil, ErrorEntityNotFound 104 } 105 106 if slowSearch { 107 for _, right := range rights { 108 if right.Name == name { 109 return right, nil 110 } 111 } 112 return nil, ErrorEntityNotFound 113 } 114 115 if len(rights) > 1 { 116 return nil, fmt.Errorf("more than one right found with name '%s'", name) 117 } 118 return rights[0], nil 119 } 120 121 // GetRightByName retrieves right by given name 122 func (client *Client) GetRightByName(name string) (*types.Right, error) { 123 return getRightByName(client, name, nil) 124 } 125 126 // GetRightByName retrieves right by given name 127 func (adminOrg *AdminOrg) GetRightByName(name string) (*types.Right, error) { 128 tenantContext, err := adminOrg.getTenantContext() 129 if err != nil { 130 return nil, err 131 } 132 return getRightByName(adminOrg.client, name, getTenantContextHeader(tenantContext)) 133 } 134 135 func getRightById(client *Client, id string, additionalHeader map[string]string) (*types.Right, error) { 136 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointRights 137 minimumApiVersion, err := client.checkOpenApiEndpointCompatibility(endpoint) 138 if err != nil { 139 return nil, err 140 } 141 142 if id == "" { 143 return nil, fmt.Errorf("empty role id") 144 } 145 146 urlRef, err := client.OpenApiBuildEndpoint(endpoint, id) 147 if err != nil { 148 return nil, err 149 } 150 151 right := &types.Right{} 152 153 err = client.OpenApiGetItem(minimumApiVersion, urlRef, nil, right, additionalHeader) 154 if err != nil { 155 return nil, err 156 } 157 158 return right, nil 159 } 160 161 func (client *Client) GetRightById(id string) (*types.Right, error) { 162 return getRightById(client, id, nil) 163 } 164 165 func (adminOrg *AdminOrg) GetRightById(id string) (*types.Right, error) { 166 tenantContext, err := adminOrg.getTenantContext() 167 if err != nil { 168 return nil, err 169 } 170 return getRightById(adminOrg.client, id, getTenantContextHeader(tenantContext)) 171 } 172 173 // getAllRightsCategories retrieves all rights categories. Query parameters can be supplied to perform additional 174 // filtering 175 func getAllRightsCategories(client *Client, queryParameters url.Values, additionalHeader map[string]string) ([]*types.RightsCategory, error) { 176 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointRightsCategories 177 minimumApiVersion, err := client.checkOpenApiEndpointCompatibility(endpoint) 178 if err != nil { 179 return nil, err 180 } 181 182 urlRef, err := client.OpenApiBuildEndpoint(endpoint) 183 if err != nil { 184 return nil, err 185 } 186 187 typeResponses := []*types.RightsCategory{{}} 188 err = client.OpenApiGetAllItems(minimumApiVersion, urlRef, queryParameters, &typeResponses, additionalHeader) 189 if err != nil { 190 return nil, err 191 } 192 193 return typeResponses, nil 194 } 195 196 // GetAllRightsCategories retrieves all rights categories. Query parameters can be supplied to perform additional 197 // filtering 198 func (client *Client) GetAllRightsCategories(queryParameters url.Values) ([]*types.RightsCategory, error) { 199 return getAllRightsCategories(client, queryParameters, nil) 200 } 201 202 // GetAllRightsCategories retrieves all rights categories. Query parameters can be supplied to perform additional 203 // filtering 204 func (adminOrg *AdminOrg) GetAllRightsCategories(queryParameters url.Values) ([]*types.RightsCategory, error) { 205 tenantContext, err := adminOrg.getTenantContext() 206 if err != nil { 207 return nil, err 208 } 209 return getAllRightsCategories(adminOrg.client, queryParameters, getTenantContextHeader(tenantContext)) 210 } 211 212 func getRightCategoryById(client *Client, id string, additionalHeader map[string]string) (*types.RightsCategory, error) { 213 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointRightsCategories 214 minimumApiVersion, err := client.checkOpenApiEndpointCompatibility(endpoint) 215 if err != nil { 216 return nil, err 217 } 218 219 if id == "" { 220 return nil, fmt.Errorf("empty category id") 221 } 222 223 urlRef, err := client.OpenApiBuildEndpoint(endpoint, id) 224 if err != nil { 225 return nil, err 226 } 227 228 rightsCategory := &types.RightsCategory{} 229 230 err = client.OpenApiGetItem(minimumApiVersion, urlRef, nil, rightsCategory, additionalHeader) 231 if err != nil { 232 return nil, err 233 } 234 235 return rightsCategory, nil 236 } 237 238 // GetRightsCategoryById retrieves a rights category from its ID 239 func (adminOrg *AdminOrg) GetRightsCategoryById(id string) (*types.RightsCategory, error) { 240 tenantContext, err := adminOrg.getTenantContext() 241 if err != nil { 242 return nil, err 243 } 244 return getRightCategoryById(adminOrg.client, id, getTenantContextHeader(tenantContext)) 245 } 246 247 // GetRightsCategoryById retrieves a rights category from its ID 248 func (client *Client) GetRightsCategoryById(id string) (*types.RightsCategory, error) { 249 return getRightCategoryById(client, id, nil) 250 }