(inv *serpent.Invocation, orgID uuid.UUID, updateRole *codersdk.Role)
| 371 | } |
| 372 | |
| 373 | func interactiveOrgRoleEdit(inv *serpent.Invocation, orgID uuid.UUID, updateRole *codersdk.Role) (*codersdk.Role, error) { |
| 374 | var originalRole codersdk.Role |
| 375 | if updateRole == nil { |
| 376 | originalRole = codersdk.Role{ |
| 377 | Name: inv.Args[0], |
| 378 | OrganizationID: orgID.String(), |
| 379 | } |
| 380 | } else { |
| 381 | originalRole = *updateRole |
| 382 | } |
| 383 | |
| 384 | // Some checks since interactive mode is limited in what it currently sees |
| 385 | if len(originalRole.SitePermissions) > 0 { |
| 386 | return nil, xerrors.Errorf("unable to edit role in interactive mode, it contains site wide permissions") |
| 387 | } |
| 388 | |
| 389 | if len(originalRole.UserPermissions) > 0 { |
| 390 | return nil, xerrors.Errorf("unable to edit role in interactive mode, it contains user permissions") |
| 391 | } |
| 392 | |
| 393 | role := &originalRole |
| 394 | allowedResources := []codersdk.RBACResource{ |
| 395 | codersdk.ResourceTemplate, |
| 396 | codersdk.ResourceWorkspace, |
| 397 | codersdk.ResourceUser, |
| 398 | codersdk.ResourceGroup, |
| 399 | } |
| 400 | |
| 401 | const done = "Finish and submit changes" |
| 402 | const abort = "Cancel changes" |
| 403 | |
| 404 | // Now starts the role editing "game". |
| 405 | customRoleLoop: |
| 406 | for { |
| 407 | selected, err := cliui.Select(inv, cliui.SelectOptions{ |
| 408 | Message: "Select which resources to edit permissions", |
| 409 | Options: append(permissionPreviews(role, allowedResources), done, abort), |
| 410 | }) |
| 411 | if err != nil { |
| 412 | return role, xerrors.Errorf("selecting resource: %w", err) |
| 413 | } |
| 414 | switch selected { |
| 415 | case done: |
| 416 | break customRoleLoop |
| 417 | case abort: |
| 418 | return role, xerrors.Errorf("edit role %q aborted", role.Name) |
| 419 | default: |
| 420 | strs := strings.Split(selected, "::") |
| 421 | resource := strings.TrimSpace(strs[0]) |
| 422 | |
| 423 | actions, err := cliui.MultiSelect(inv, cliui.MultiSelectOptions{ |
| 424 | Message: fmt.Sprintf("Select actions to allow across the whole deployment for resources=%q", resource), |
| 425 | Options: slice.ToStrings(codersdk.RBACResourceActions[codersdk.RBACResource(resource)]), |
| 426 | Defaults: defaultActions(role, resource), |
| 427 | }) |
| 428 | if err != nil { |
| 429 | return role, xerrors.Errorf("selecting actions for resource %q: %w", resource, err) |
| 430 | } |
no test coverage detected