diff --git a/internal/cmd/commands/authenticate/oidc.go b/internal/cmd/commands/authenticate/oidc.go index aa9f4156d1..b50469acb2 100644 --- a/internal/cmd/commands/authenticate/oidc.go +++ b/internal/cmd/commands/authenticate/oidc.go @@ -134,7 +134,7 @@ func (c *OidcCommand) Run(args []string) int { watchCode = base.CommandCliError return } - if result.GetResponse().StatusCode() == http.StatusNoContent { + if result.GetResponse().StatusCode() == http.StatusAccepted { // Nothing yet -- circle around. continue } diff --git a/internal/gen/controller/api/resources/authmethods/auth_method.pb.go b/internal/gen/controller/api/resources/authmethods/auth_method.pb.go index 265044bb2f..5fc9cbe5a9 100644 --- a/internal/gen/controller/api/resources/authmethods/auth_method.pb.go +++ b/internal/gen/controller/api/resources/authmethods/auth_method.pb.go @@ -671,6 +671,57 @@ func (x *OidcAuthMethodAuthenticateTokenRequest) GetTokenId() string { return "" } +// Internal only: the structure of a token response if it _does not_ contain a +// token. +type OidcAuthMethodAuthenticateTokenResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The status. This will always be "unknown". It will never be forwarded to + // the consumer. + Status string `protobuf:"bytes,10,opt,name=status,proto3" json:"status,omitempty"` +} + +func (x *OidcAuthMethodAuthenticateTokenResponse) Reset() { + *x = OidcAuthMethodAuthenticateTokenResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_controller_api_resources_authmethods_v1_auth_method_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OidcAuthMethodAuthenticateTokenResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OidcAuthMethodAuthenticateTokenResponse) ProtoMessage() {} + +func (x *OidcAuthMethodAuthenticateTokenResponse) ProtoReflect() protoreflect.Message { + mi := &file_controller_api_resources_authmethods_v1_auth_method_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OidcAuthMethodAuthenticateTokenResponse.ProtoReflect.Descriptor instead. +func (*OidcAuthMethodAuthenticateTokenResponse) Descriptor() ([]byte, []int) { + return file_controller_api_resources_authmethods_v1_auth_method_proto_rawDescGZIP(), []int{7} +} + +func (x *OidcAuthMethodAuthenticateTokenResponse) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + var File_controller_api_resources_authmethods_v1_auth_method_proto protoreflect.FileDescriptor var file_controller_api_resources_authmethods_v1_auth_method_proto_rawDesc = []byte{ @@ -859,14 +910,18 @@ var file_controller_api_resources_authmethods_v1_auth_method_proto_rawDesc = []b 0x41, 0x75, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x42, 0x5d, - 0x5a, 0x5b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, - 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x2f, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x73, 0x3b, 0x61, 0x75, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x41, + 0x0a, 0x27, 0x4f, 0x69, 0x64, 0x63, 0x41, 0x75, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x42, 0x5d, 0x5a, 0x5b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, + 0x72, 0x79, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x67, 0x65, 0x6e, 0x2f, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x73, 0x3b, 0x61, 0x75, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -881,7 +936,7 @@ func file_controller_api_resources_authmethods_v1_auth_method_proto_rawDescGZIP( return file_controller_api_resources_authmethods_v1_auth_method_proto_rawDescData } -var file_controller_api_resources_authmethods_v1_auth_method_proto_msgTypes = make([]protoimpl.MessageInfo, 8) +var file_controller_api_resources_authmethods_v1_auth_method_proto_msgTypes = make([]protoimpl.MessageInfo, 9) var file_controller_api_resources_authmethods_v1_auth_method_proto_goTypes = []interface{}{ (*AuthMethod)(nil), // 0: controller.api.resources.authmethods.v1.AuthMethod (*PasswordAuthMethodAttributes)(nil), // 1: controller.api.resources.authmethods.v1.PasswordAuthMethodAttributes @@ -890,28 +945,29 @@ var file_controller_api_resources_authmethods_v1_auth_method_proto_goTypes = []i (*OidcAuthMethodAuthenticateCallbackRequest)(nil), // 4: controller.api.resources.authmethods.v1.OidcAuthMethodAuthenticateCallbackRequest (*OidcAuthMethodAuthenticateCallbackResponse)(nil), // 5: controller.api.resources.authmethods.v1.OidcAuthMethodAuthenticateCallbackResponse (*OidcAuthMethodAuthenticateTokenRequest)(nil), // 6: controller.api.resources.authmethods.v1.OidcAuthMethodAuthenticateTokenRequest - nil, // 7: controller.api.resources.authmethods.v1.AuthMethod.AuthorizedCollectionActionsEntry - (*scopes.ScopeInfo)(nil), // 8: controller.api.resources.scopes.v1.ScopeInfo - (*wrappers.StringValue)(nil), // 9: google.protobuf.StringValue - (*timestamp.Timestamp)(nil), // 10: google.protobuf.Timestamp - (*_struct.Struct)(nil), // 11: google.protobuf.Struct - (*wrappers.UInt32Value)(nil), // 12: google.protobuf.UInt32Value - (*_struct.ListValue)(nil), // 13: google.protobuf.ListValue + (*OidcAuthMethodAuthenticateTokenResponse)(nil), // 7: controller.api.resources.authmethods.v1.OidcAuthMethodAuthenticateTokenResponse + nil, // 8: controller.api.resources.authmethods.v1.AuthMethod.AuthorizedCollectionActionsEntry + (*scopes.ScopeInfo)(nil), // 9: controller.api.resources.scopes.v1.ScopeInfo + (*wrappers.StringValue)(nil), // 10: google.protobuf.StringValue + (*timestamp.Timestamp)(nil), // 11: google.protobuf.Timestamp + (*_struct.Struct)(nil), // 12: google.protobuf.Struct + (*wrappers.UInt32Value)(nil), // 13: google.protobuf.UInt32Value + (*_struct.ListValue)(nil), // 14: google.protobuf.ListValue } var file_controller_api_resources_authmethods_v1_auth_method_proto_depIdxs = []int32{ - 8, // 0: controller.api.resources.authmethods.v1.AuthMethod.scope:type_name -> controller.api.resources.scopes.v1.ScopeInfo - 9, // 1: controller.api.resources.authmethods.v1.AuthMethod.name:type_name -> google.protobuf.StringValue - 9, // 2: controller.api.resources.authmethods.v1.AuthMethod.description:type_name -> google.protobuf.StringValue - 10, // 3: controller.api.resources.authmethods.v1.AuthMethod.created_time:type_name -> google.protobuf.Timestamp - 10, // 4: controller.api.resources.authmethods.v1.AuthMethod.updated_time:type_name -> google.protobuf.Timestamp - 11, // 5: controller.api.resources.authmethods.v1.AuthMethod.attributes:type_name -> google.protobuf.Struct - 7, // 6: controller.api.resources.authmethods.v1.AuthMethod.authorized_collection_actions:type_name -> controller.api.resources.authmethods.v1.AuthMethod.AuthorizedCollectionActionsEntry - 9, // 7: controller.api.resources.authmethods.v1.OidcAuthMethodAttributes.issuer:type_name -> google.protobuf.StringValue - 9, // 8: controller.api.resources.authmethods.v1.OidcAuthMethodAttributes.client_id:type_name -> google.protobuf.StringValue - 9, // 9: controller.api.resources.authmethods.v1.OidcAuthMethodAttributes.client_secret:type_name -> google.protobuf.StringValue - 12, // 10: controller.api.resources.authmethods.v1.OidcAuthMethodAttributes.max_age:type_name -> google.protobuf.UInt32Value - 9, // 11: controller.api.resources.authmethods.v1.OidcAuthMethodAttributes.api_url_prefix:type_name -> google.protobuf.StringValue - 13, // 12: controller.api.resources.authmethods.v1.AuthMethod.AuthorizedCollectionActionsEntry.value:type_name -> google.protobuf.ListValue + 9, // 0: controller.api.resources.authmethods.v1.AuthMethod.scope:type_name -> controller.api.resources.scopes.v1.ScopeInfo + 10, // 1: controller.api.resources.authmethods.v1.AuthMethod.name:type_name -> google.protobuf.StringValue + 10, // 2: controller.api.resources.authmethods.v1.AuthMethod.description:type_name -> google.protobuf.StringValue + 11, // 3: controller.api.resources.authmethods.v1.AuthMethod.created_time:type_name -> google.protobuf.Timestamp + 11, // 4: controller.api.resources.authmethods.v1.AuthMethod.updated_time:type_name -> google.protobuf.Timestamp + 12, // 5: controller.api.resources.authmethods.v1.AuthMethod.attributes:type_name -> google.protobuf.Struct + 8, // 6: controller.api.resources.authmethods.v1.AuthMethod.authorized_collection_actions:type_name -> controller.api.resources.authmethods.v1.AuthMethod.AuthorizedCollectionActionsEntry + 10, // 7: controller.api.resources.authmethods.v1.OidcAuthMethodAttributes.issuer:type_name -> google.protobuf.StringValue + 10, // 8: controller.api.resources.authmethods.v1.OidcAuthMethodAttributes.client_id:type_name -> google.protobuf.StringValue + 10, // 9: controller.api.resources.authmethods.v1.OidcAuthMethodAttributes.client_secret:type_name -> google.protobuf.StringValue + 13, // 10: controller.api.resources.authmethods.v1.OidcAuthMethodAttributes.max_age:type_name -> google.protobuf.UInt32Value + 10, // 11: controller.api.resources.authmethods.v1.OidcAuthMethodAttributes.api_url_prefix:type_name -> google.protobuf.StringValue + 14, // 12: controller.api.resources.authmethods.v1.AuthMethod.AuthorizedCollectionActionsEntry.value:type_name -> google.protobuf.ListValue 13, // [13:13] is the sub-list for method output_type 13, // [13:13] is the sub-list for method input_type 13, // [13:13] is the sub-list for extension type_name @@ -1009,6 +1065,18 @@ func file_controller_api_resources_authmethods_v1_auth_method_proto_init() { return nil } } + file_controller_api_resources_authmethods_v1_auth_method_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OidcAuthMethodAuthenticateTokenResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -1016,7 +1084,7 @@ func file_controller_api_resources_authmethods_v1_auth_method_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_controller_api_resources_authmethods_v1_auth_method_proto_rawDesc, NumEnums: 0, - NumMessages: 8, + NumMessages: 9, NumExtensions: 0, NumServices: 0, }, diff --git a/internal/proto/local/controller/api/resources/authmethods/v1/auth_method.proto b/internal/proto/local/controller/api/resources/authmethods/v1/auth_method.proto index 59b7b49f17..3d9a9938f8 100644 --- a/internal/proto/local/controller/api/resources/authmethods/v1/auth_method.proto +++ b/internal/proto/local/controller/api/resources/authmethods/v1/auth_method.proto @@ -165,4 +165,12 @@ message OidcAuthMethodAuthenticateCallbackResponse { message OidcAuthMethodAuthenticateTokenRequest { // The ID of the pending token string token_id = 10 [json_name="token_id"]; +} + +// Internal only: the structure of a token response if it _does not_ contain a +// token. +message OidcAuthMethodAuthenticateTokenResponse { + // The status. This will always be "unknown". It will never be forwarded to + // the consumer. + string status = 10; } \ No newline at end of file diff --git a/internal/servers/controller/handlers/authmethods/oidc.go b/internal/servers/controller/handlers/authmethods/oidc.go index 636bf5ca13..3338c449ec 100644 --- a/internal/servers/controller/handlers/authmethods/oidc.go +++ b/internal/servers/controller/handlers/authmethods/oidc.go @@ -16,6 +16,7 @@ import ( "github.com/hashicorp/boundary/internal/servers/controller/handlers" "github.com/hashicorp/boundary/internal/types/action" "google.golang.org/grpc/codes" + "google.golang.org/protobuf/types/known/structpb" ) const ( @@ -25,7 +26,8 @@ const ( tokenCommand = "token" // token request/response fields - tokenField = "token" + tokenField = "token" + statusField = "status" // field names issuerField = "attributes.issuer" @@ -269,7 +271,16 @@ func (s Service) authenticateOidcToken(ctx context.Context, req *pbs.Authenticat } } if token == nil { - return nil, nil + attrs, err := structpb.NewStruct(map[string]interface{}{ + statusField: "unknown", + }) + if err != nil { + return nil, errors.New(errors.Internal, op, "Error generating response attributes.") + } + return &pbs.AuthenticateResponse{ + Command: req.Command, + Attributes: attrs, + }, nil } responseToken, err := s.convertInternalAuthTokenToApiAuthToken( diff --git a/internal/servers/controller/handlers/outgoing_interceptor.go b/internal/servers/controller/handlers/outgoing_interceptor.go index e6fd6fa531..1a9cd4e086 100644 --- a/internal/servers/controller/handlers/outgoing_interceptor.go +++ b/internal/servers/controller/handlers/outgoing_interceptor.go @@ -17,6 +17,7 @@ const ( JsVisibleCookieName = "wt-js-token-cookie" tokenTypeField = "token_type" finalRedirectUrlField = "final_redirect_url" + statusField = "status" ) func OutgoingInterceptor(ctx context.Context, w http.ResponseWriter, m proto.Message) error { @@ -34,6 +35,15 @@ func OutgoingInterceptor(ctx context.Context, w http.ResponseWriter, m proto.Mes return nil } fields := m.GetAttributes().GetFields() + if m.GetCommand() == "token" { + if _, ok := fields[statusField]; ok { + // For now at least status will never be anything useful so + // don't need to check on it; the mere presence is enough to + // know what to do + w.WriteHeader(http.StatusAccepted) + return nil + } + } // It's a redirect if urlField, ok := fields[finalRedirectUrlField]; ok { u := urlField.GetStringValue() diff --git a/website/content/docs/concepts/security/permissions.mdx b/website/content/docs/concepts/security/permissions.mdx index a62a98afc9..0760cb5576 100644 --- a/website/content/docs/concepts/security/permissions.mdx +++ b/website/content/docs/concepts/security/permissions.mdx @@ -214,11 +214,11 @@ wildcard or templated grant strings.
account
- account
+ create: Create an account
type=<type>;actions=create
- type=<type>;actions=createlist: List accounts
type=<type>;actions=list
- type=<type>;actions=list<id>
- <id>
+ <auth-method-id>
- <auth-method-id>
+ account
- account
+ read: Read an account
id=<id>;actions=read
- id=<pin>;type=<type>;actions=read
- id=<id>;actions=readid=<pin>;type=<type>;actions=readupdate: Update an account
id=<id>;actions=update
- id=<pin>;type=<type>;actions=update
- id=<id>;actions=updateid=<pin>;type=<type>;actions=updatedelete: Delete an account
id=<id>;actions=delete
- id=<pin>;type=<type>;actions=delete
- set-password: Set a password on an account, without
- requiring the current password
- id=<id>;actions=set-password
- id=<pin>;type=<type>;actions=set-password
- change-password: Change a password on an account given
- the current password
- id=<id>;actions=change-password
-
- id=<pin>;type=<type>;actions=change-password
-
- id=<id>;actions=deleteid=<pin>;type=<type>;actions=deleteset-password: Set a password on an account, without requiring the current password
+ id=<id>;actions=set-passwordid=<pin>;type=<type>;actions=set-passwordchange-password: Change a password on an account given the current password
+ id=<id>;actions=change-passwordid=<pin>;type=<type>;actions=change-passwordauth-method
- auth-method
+ create: Create an auth method
type=<type>;actions=create
- type=<type>;actions=createlist: List auth methods
type=<type>;actions=list
- type=<type>;actions=list<id>
- <id>
+ auth-method
- auth-method
+ read: Read an auth method
id=<id>;actions=read
- id=<id>;actions=readupdate: Update an auth method
id=<id>;actions=update
- id=<id>;actions=updatedelete: Delete an auth method
id=<id>;actions=delete
- id=<id>;actions=deleteauthenticate: Authenticate to an auth method
id=<id>;actions=authenticate
- id=<id>;actions=authenticateauth-token
- auth-token
+ list: List auth tokens
type=<type>;actions=list
- type=<type>;actions=list<id>
- <id>
+ auth-token
- auth-token
+ read: Read an auth token
id=<id>;actions=read
- id=<id>;actions=readdelete: Delete an auth token
id=<id>;actions=delete
- id=<id>;actions=deletegroup
- group
+ create: Create a group
type=<type>;actions=create
- type=<type>;actions=createlist: List groups
type=<type>;actions=list
- type=<type>;actions=list<id>
- <id>
+ group
- group
+ read: Read a group
id=<id>;actions=read
- id=<id>;actions=readupdate: Update a group
id=<id>;actions=update
- id=<id>;actions=updatedelete: Delete a group
id=<id>;actions=delete
- id=<id>;actions=deleteadd-members: Add members to a group
id=<id>;actions=add-members
- id=<id>;actions=add-membersset-members: Set the full set of members on a group
id=<id>;actions=set-members
- id=<id>;actions=set-membersremove-members: Remove members from a group
id=<id>;actions=remove-members
- id=<id>;actions=remove-membershost
- host
+ create: Create a host
type=<type>;actions=create
- type=<type>;actions=createlist: List hosts
type=<type>;actions=list
- type=<type>;actions=list<id>
- <id>
+ <host-catalog-id>
- <host-catalog-id>
+ host
- host
+ read: Read a host
id=<id>;actions=read
- id=<pin>;type=<type>;actions=read
- id=<id>;actions=readid=<pin>;type=<type>;actions=readupdate: Update a host
id=<id>;actions=update
- id=<pin>;type=<type>;actions=update
- id=<id>;actions=updateid=<pin>;type=<type>;actions=updatedelete: Delete a host
id=<id>;actions=delete
- id=<pin>;type=<type>;actions=delete
- id=<id>;actions=deleteid=<pin>;type=<type>;actions=deletehost-catalog
- host-catalog
+ create: Create a host catalog
type=<type>;actions=create
- type=<type>;actions=createlist: List host catalogs
type=<type>;actions=list
- type=<type>;actions=list<id>
- <id>
+ host-catalog
- host-catalog
+ read: Read a host catalog
id=<id>;actions=read
- id=<id>;actions=readupdate: Update a host catalog
id=<id>;actions=update
- id=<id>;actions=updatedelete: Delete a host catalog
id=<id>;actions=delete
- id=<id>;actions=deletehost-set
- host-set
+ create: Create a host set
type=<type>;actions=create
- type=<type>;actions=createlist: List host sets
type=<type>;actions=list
- type=<type>;actions=list<id>
- <id>
+ <host-catalog-id>
- <host-catalog-id>
+ host-set
- host-set
+ read: Read a host set
id=<id>;actions=read
- id=<pin>;type=<type>;actions=read
- id=<id>;actions=readid=<pin>;type=<type>;actions=readupdate: Update a host set
id=<id>;actions=update
- id=<pin>;type=<type>;actions=update
- id=<id>;actions=updateid=<pin>;type=<type>;actions=updatedelete: Delete a host set
id=<id>;actions=delete
- id=<pin>;type=<type>;actions=delete
- id=<id>;actions=deleteid=<pin>;type=<type>;actions=deleteadd-hosts: Add hosts to a host-set
id=<id>;actions=add-hosts
- id=<pin>;type=<type>;actions=add-hosts
- id=<id>;actions=add-hostsid=<pin>;type=<type>;actions=add-hostsset-hosts: Set the full set of hosts on a host set
id=<id>;actions=set-hosts
- id=<pin>;type=<type>;actions=set-hosts
- id=<id>;actions=set-hostsid=<pin>;type=<type>;actions=set-hostsremove-hosts: Remove hosts from a host set
id=<id>;actions=remove-hosts
- id=<pin>;type=<type>;actions=remove-hosts
- id=<id>;actions=remove-hostsid=<pin>;type=<type>;actions=remove-hostsrole
- role
+ create: Create a role
type=<type>;actions=create
- type=<type>;actions=createlist: List roles
type=<type>;actions=list
- type=<type>;actions=list<id>
- <id>
+ role
- role
+ read: Read a role
id=<id>;actions=read
- id=<id>;actions=readupdate: Update a role
id=<id>;actions=update
- id=<id>;actions=updatedelete: Delete a role
id=<id>;actions=delete
- id=<id>;actions=deleteadd-principals: Add principals to a role
id=<id>;actions=add-principals
- id=<id>;actions=add-principalsset-principals: Set the full set of principals on a
- role
+ set-principals: Set the full set of principals on a role
id=<id>;actions=set-principals
- id=<id>;actions=set-principalsremove-principals: Remove principals from a role
id=<id>;actions=remove-principals
- id=<id>;actions=remove-principalsadd-grants: Add grants to a role
id=<id>;actions=add-grants
- id=<id>;actions=add-grantsset-grants: Set the full set of grants on a role
id=<id>;actions=set-grants
- id=<id>;actions=set-grantsremove-grants: Remove grants from a role
id=<id>;actions=remove-grants
- id=<id>;actions=remove-grantsscope
- scope
+ create: Create a scope
type=<type>;actions=create
- type=<type>;actions=createlist: List scopes
type=<type>;actions=list
- type=<type>;actions=list<id>
- <id>
+ scope
- scope
+ read: Read a scope
id=<id>;actions=read
- id=<id>;actions=readupdate: Update a scope
id=<id>;actions=update
- id=<id>;actions=updatedelete: Delete a scope
id=<id>;actions=delete
- id=<id>;actions=deletesession
- session
+ list: List sessions
type=<type>;actions=list
- type=<type>;actions=list<id>
- <id>
+ session
- session
+ read: Read a session
id=<id>;actions=read
- id=<id>;actions=readcancel: Cancel a session
id=<id>;actions=cancel
- read:self: Read a session, which must be associated
- with the calling user
- id=*;type=session;actions=read:self
- cancel:self: Cancel a session, which must be associated
- with the calling user
- id=*;type=session;actions=cancel:self
- id=<id>;actions=cancelread:self: Read a session, which must be associated with the calling user
+ id=*;type=session;actions=read:selfcancel:self: Cancel a session, which must be associated with the calling user
+ id=*;type=session;actions=cancel:selftarget
- target
+ create: Create a target
type=<type>;actions=create
- type=<type>;actions=createlist: List targets
type=<type>;actions=list
- type=<type>;actions=list<id>
- <id>
+ target
- target
+ read: Read a target
id=<id>;actions=read
- id=<id>;actions=readupdate: Update a target
id=<id>;actions=update
- id=<id>;actions=updatedelete: Delete a target
id=<id>;actions=delete
- id=<id>;actions=deleteadd-host-sets: Add host sets to a target
id=<id>;actions=add-host-sets
- id=<id>;actions=add-host-setsset-host-sets: Set the full set of host sets on a
- target
+ set-host-sets: Set the full set of host sets on a target
id=<id>;actions=set-host-sets
- id=<id>;actions=set-host-setsremove-host-sets: Remove host sets from a target
id=<id>;actions=remove-host-sets
- id=<id>;actions=remove-host-setsauthorize-session: Authorize a session via the target
id=<id>;actions=authorize-session
- id=<id>;actions=authorize-sessionuser
- user
+ create: Create a user
type=<type>;actions=create
- type=<type>;actions=createlist: List users
type=<type>;actions=list
- type=<type>;actions=list<id>
- <id>
+ user
- user
+ read: Read a user
id=<id>;actions=read
- id=<id>;actions=readupdate: Update a user
id=<id>;actions=update
- id=<id>;actions=updatedelete: Delete a user
id=<id>;actions=delete
- id=<id>;actions=deleteadd-accounts: Add accounts to a user
id=<id>;actions=add-accounts
- id=<id>;actions=add-accountsset-accounts: Set the full set of accounts on a user
id=<id>;actions=set-accounts
- id=<id>;actions=set-accountsremove-accounts: Remove accounts from a user
id=<id>;actions=remove-accounts
- id=<id>;actions=remove-accounts