From 0379139559e6bcad9472f566cd904291252299b3 Mon Sep 17 00:00:00 2001 From: Beardo Moore Date: Tue, 29 Apr 2025 10:54:03 -0600 Subject: [PATCH 1/4] feat: Metrics read role for service accounts --- app/role.go | 21 ++- app/serviceaccount.go | 8 +- app/user.go | 12 +- app/user_group.go | 22 +-- protogen/api/auth/v1/message.pb.go | 209 +++++++++++++++-------------- 5 files changed, 150 insertions(+), 122 deletions(-) diff --git a/app/role.go b/app/role.go index 60ca1e98..dd5d9ab6 100644 --- a/app/role.go +++ b/app/role.go @@ -11,11 +11,24 @@ import ( ) var ( - accountActionGroups = getAccountActionGroups() - namespaceActionGroups = getNamespaceActionGroups() + userAccountActionGroups = getUserAccountActionGroups() + allAccountActionGroups = getAllAccountActionGroups() + namespaceActionGroups = getNamespaceActionGroups() ) -func getAccountActionGroups() []string { +func getUserAccountActionGroups() []string { + var rv []string + for n, v := range auth.AccountActionGroup_value { + if v != int32(auth.ACCOUNT_ACTION_GROUP_UNSPECIFIED) && + v != int32(auth.ACCOUNT_ACTION_GROUP_METRICS_READ) { + rv = append(rv, n) + } + } + slices.Sort(rv) + return rv +} + +func getAllAccountActionGroups() []string { var rv []string for n, v := range auth.AccountActionGroup_value { if v != int32(auth.ACCOUNT_ACTION_GROUP_UNSPECIFIED) { @@ -98,7 +111,7 @@ func toAccountActionGroup(actionGroup string) (auth.AccountActionGroup, error) { } if ag == auth.ACCOUNT_ACTION_GROUP_UNSPECIFIED { return auth.ACCOUNT_ACTION_GROUP_UNSPECIFIED, - fmt.Errorf("invalid action group: should be one of: %s", accountActionGroups) + fmt.Errorf("invalid action group: should be one of: %s", userAccountActionGroups) } return ag, nil } diff --git a/app/serviceaccount.go b/app/serviceaccount.go index a1239802..b140150c 100644 --- a/app/serviceaccount.go +++ b/app/serviceaccount.go @@ -211,7 +211,7 @@ func NewServiceAccountCommand(getServiceAccountClientFn GetServiceAccountClientF RequestIDFlag, &cli.StringFlag{ Name: accountRoleFlagName, - Usage: fmt.Sprintf("The account role to set on the service account; valid types are: %v", accountActionGroups), + Usage: fmt.Sprintf("The account role to set on the service account; valid types are: %v", allAccountActionGroups), Required: true, Aliases: []string{"ar"}, }, @@ -227,7 +227,7 @@ func NewServiceAccountCommand(getServiceAccountClientFn GetServiceAccountClientF } if len(ctx.String(accountRoleFlagName)) == 0 { - return fmt.Errorf("account role must be specified; valid types are %v", accountActionGroups) + return fmt.Errorf("account role must be specified; valid types are %v", allAccountActionGroups) } ag, err := toAccountActionGroup(ctx.String(accountRoleFlagName)) @@ -425,7 +425,7 @@ func NewServiceAccountCommand(getServiceAccountClientFn GetServiceAccountClientF ResourceVersionFlag, &cli.StringFlag{ Name: accountRoleFlagName, - Usage: fmt.Sprintf("The account role to set on the service account; valid types are: %v", accountActionGroups), + Usage: fmt.Sprintf("The account role to set on the service account; valid types are: %v", allAccountActionGroups), Required: true, Aliases: []string{"ar"}, }, @@ -433,7 +433,7 @@ func NewServiceAccountCommand(getServiceAccountClientFn GetServiceAccountClientF Action: func(ctx *cli.Context) error { // validate input role if _, ok := auth.AccountActionGroup_value[ctx.String(accountRoleFlagName)]; !ok { - return fmt.Errorf("invalid account role %v; valid types are: %v", ctx.String(accountRoleFlagName), accountActionGroups) + return fmt.Errorf("invalid account role %v; valid types are: %v", ctx.String(accountRoleFlagName), allAccountActionGroups) } // if account role is admin unset the namespace permissions var namespacePermissions map[string]string diff --git a/app/user.go b/app/user.go index 3f98e520..83272722 100644 --- a/app/user.go +++ b/app/user.go @@ -150,6 +150,10 @@ func (c *UserClient) inviteUsers( if err != nil { return err } + if role.Spec.AccountRole.ActionGroup == auth.ACCOUNT_ACTION_GROUP_METRICS_READ { + return errors.New("metrics read role is not allowed for users") + } + roleIDs = append(roleIDs, role.GetId()) // get any optional namespace permissions @@ -261,6 +265,10 @@ func (c *UserClient) setAccountRole( if err != nil { return err } + if accountRoleToSet.Spec.AccountRole.ActionGroup == auth.ACCOUNT_ACTION_GROUP_METRICS_READ { + return errors.New("metrics read role is not allowed for users") + } + if accountRoleToSet.Spec.AccountRole.ActionGroup == auth.ACCOUNT_ACTION_GROUP_ADMIN { // set the user account admin role y, err := ConfirmPrompt(ctx, "Setting admin role on user. All existing namespace permissions will be replaced, please confirm") @@ -465,7 +473,7 @@ func NewUserCommand(getUserClientFn GetUserClientFn) (CommandOut, error) { }, &cli.StringFlag{ Name: accountRoleFlagName, - Usage: fmt.Sprintf("The account role to set on the user; valid types are: %v", accountActionGroups), + Usage: fmt.Sprintf("The account role to set on the user; valid types are: %v", userAccountActionGroups), Aliases: []string{"ar"}, Required: true, }, @@ -531,7 +539,7 @@ func NewUserCommand(getUserClientFn GetUserClientFn) (CommandOut, error) { ResourceVersionFlag, &cli.StringFlag{ Name: accountRoleFlagName, - Usage: fmt.Sprintf("The account role to set on the user; valid types are: %v", accountActionGroups), + Usage: fmt.Sprintf("The account role to set on the user; valid types are: %v", userAccountActionGroups), Required: true, Aliases: []string{"ar"}, }, diff --git a/app/user_group.go b/app/user_group.go index 0961df10..39f2c8dd 100644 --- a/app/user_group.go +++ b/app/user_group.go @@ -189,12 +189,12 @@ func NewUserGroupCommand(GetGroupClientFn GetGroupClientFn) (CommandOut, error) Flags: []cli.Flag{ &cli.StringFlag{ Name: pageTokenFlagName, - Usage: "list groups starting from this page token", + Usage: "List groups starting from this page token", Aliases: []string{"p"}, }, &cli.IntFlag{ Name: pageSizeFlagName, - Usage: "number of groups to list", + Usage: "Number of groups to list", Aliases: []string{"s"}, }, }, @@ -208,9 +208,10 @@ func NewUserGroupCommand(GetGroupClientFn GetGroupClientFn) (CommandOut, error) Aliases: []string{"g"}, Flags: []cli.Flag{ &cli.StringFlag{ - Name: groupIDFlagName, - Usage: "group ID", - Aliases: []string{"id"}, + Name: groupIDFlagName, + Usage: "The ID of the group", + Required: true, + Aliases: []string{"id"}, }, }, Action: func(ctx *cli.Context) error { @@ -223,18 +224,19 @@ func NewUserGroupCommand(GetGroupClientFn GetGroupClientFn) (CommandOut, error) Aliases: []string{"sa"}, Flags: []cli.Flag{ &cli.StringFlag{ - Name: groupIDFlagName, - Usage: "group ID", - Aliases: []string{"id"}, + Name: groupIDFlagName, + Usage: "The ID of the group", + Required: true, + Aliases: []string{"id"}, }, &cli.StringFlag{ Name: accountRoleFlagName, - Usage: "account role", + Usage: fmt.Sprintf("The account role to set on the group; valid types are: %v", userAccountActionGroups), Aliases: []string{"ar"}, }, &cli.StringSliceFlag{ Name: namespaceRoleFlagName, - Usage: "namespace roles", + Usage: "Flag can be used multiple times", Aliases: []string{"nr"}, }, }, diff --git a/protogen/api/auth/v1/message.pb.go b/protogen/api/auth/v1/message.pb.go index 99761749..674bb12b 100644 --- a/protogen/api/auth/v1/message.pb.go +++ b/protogen/api/auth/v1/message.pb.go @@ -143,6 +143,8 @@ const ( ACCOUNT_ACTION_GROUP_OWNER AccountActionGroup = 4 // finance admin ACCOUNT_ACTION_GROUP_FINANCE_ADMIN AccountActionGroup = 5 + // read-only access to metrics + ACCOUNT_ACTION_GROUP_METRICS_READ AccountActionGroup = 6 ) var AccountActionGroup_name = map[int32]string{ @@ -152,6 +154,7 @@ var AccountActionGroup_name = map[int32]string{ 3: "Read", 4: "Owner", 5: "FinanceAdmin", + 6: "MetricsRead", } var AccountActionGroup_value = map[string]int32{ @@ -161,6 +164,7 @@ var AccountActionGroup_value = map[string]int32{ "Read": 3, "Owner": 4, "FinanceAdmin": 5, + "MetricsRead": 6, } func (AccountActionGroup) EnumDescriptor() ([]byte, []int) { @@ -1545,110 +1549,111 @@ func init() { func init() { proto.RegisterFile("api/auth/v1/message.proto", fileDescriptor_bea184b0c3eae56b) } var fileDescriptor_bea184b0c3eae56b = []byte{ - // 1641 bytes of a gzipped FileDescriptorProto + // 1654 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0xbd, 0x6f, 0xdb, 0xda, 0x15, 0x37, 0x65, 0x49, 0x96, 0x8f, 0x1c, 0x9b, 0xb9, 0xfe, 0x92, 0x55, 0x99, 0x96, 0xd9, 0xbc, - 0xf7, 0xfc, 0x94, 0x42, 0x46, 0x1c, 0x20, 0x0d, 0x1a, 0x34, 0x01, 0x23, 0xd1, 0x0e, 0x11, 0x47, - 0x12, 0x28, 0xd9, 0xa9, 0xbb, 0x10, 0xb4, 0x74, 0xe3, 0x10, 0x91, 0x44, 0x96, 0xa4, 0x9c, 0x6a, - 0xeb, 0xdc, 0xa9, 0x43, 0xa7, 0xae, 0x5d, 0xda, 0xa9, 0x7f, 0x45, 0x81, 0x8e, 0x19, 0x33, 0x26, - 0x0e, 0x0a, 0x04, 0x9d, 0x82, 0xae, 0x59, 0x8a, 0x7b, 0xf9, 0x21, 0x7e, 0x49, 0xf9, 0x68, 0x86, - 0x37, 0x59, 0x3c, 0xe7, 0x77, 0x7e, 0xe7, 0x9e, 0xdf, 0xbd, 0xe7, 0xdc, 0x0b, 0xc3, 0x96, 0x6a, - 0x68, 0xfb, 0xea, 0xc8, 0x7e, 0xbe, 0x7f, 0x79, 0x6b, 0x7f, 0x80, 0x2d, 0x4b, 0xbd, 0xc0, 0x55, - 0xc3, 0xd4, 0x6d, 0x1d, 0xe5, 0x55, 0x43, 0xab, 0x12, 0x57, 0xf5, 0xf2, 0x56, 0x71, 0xe7, 0x42, - 0xd7, 0x2f, 0xfa, 0x78, 0x9f, 0xba, 0xce, 0x47, 0xcf, 0xf6, 0x6d, 0x6d, 0x80, 0x2d, 0x5b, 0x1d, - 0x18, 0x0e, 0x9a, 0xbf, 0x03, 0xb9, 0x13, 0x0b, 0x9b, 0x6d, 0x03, 0x77, 0xd1, 0x1a, 0x64, 0xf0, - 0x40, 0xd5, 0xfa, 0x05, 0xa6, 0xcc, 0xec, 0x2d, 0xca, 0xce, 0x07, 0xb1, 0x9a, 0x7a, 0x1f, 0x5b, - 0x85, 0x54, 0x79, 0x9e, 0x58, 0xe9, 0x07, 0x3f, 0x86, 0x02, 0x89, 0x6b, 0xa8, 0x03, 0x6c, 0x19, - 0x6a, 0x17, 0xb7, 0xb0, 0x39, 0xd0, 0x2c, 0x4b, 0xd3, 0x87, 0x16, 0xda, 0x84, 0x85, 0x91, 0x85, - 0x4d, 0x45, 0xeb, 0xb9, 0x4c, 0x59, 0xf2, 0x29, 0xf5, 0x50, 0x1d, 0x96, 0xd4, 0xae, 0xad, 0xe9, - 0x43, 0xe5, 0xc2, 0xd4, 0x47, 0x46, 0x21, 0x55, 0x66, 0xf6, 0x96, 0x0f, 0x76, 0xab, 0x81, 0x15, - 0x57, 0x7d, 0x46, 0x81, 0x22, 0x8f, 0x08, 0x50, 0xce, 0xab, 0x93, 0x0f, 0xfe, 0x2f, 0x0c, 0x80, - 0x34, 0xbc, 0xd4, 0x6c, 0x95, 0xd8, 0x10, 0x0b, 0xf3, 0x23, 0x53, 0x73, 0x33, 0x91, 0x9f, 0xe8, - 0xd7, 0xb0, 0xd4, 0x35, 0xb1, 0x6a, 0xe3, 0x9e, 0x42, 0xca, 0xa5, 0x69, 0xf2, 0x07, 0xc5, 0xaa, - 0xa3, 0x45, 0xd5, 0xd3, 0xa2, 0xda, 0xf1, 0xb4, 0x90, 0xf3, 0x2e, 0x9e, 0x58, 0xd0, 0x3d, 0xc8, - 0xe3, 0xdf, 0x1b, 0x9a, 0x39, 0x76, 0xa2, 0xe7, 0x3f, 0x19, 0x0d, 0x0e, 0x9c, 0x18, 0xf8, 0x8f, - 0x29, 0x48, 0x13, 0x61, 0xd0, 0x32, 0xa4, 0xfc, 0xfa, 0x53, 0x5a, 0x0f, 0xfd, 0x08, 0xac, 0x89, - 0x2d, 0x7d, 0x64, 0x76, 0xb1, 0x72, 0x89, 0x4d, 0xa2, 0x14, 0x5d, 0xd8, 0xa2, 0xbc, 0xe2, 0xd9, - 0x4f, 0x1d, 0x33, 0xfa, 0x11, 0xd2, 0x96, 0x81, 0xbb, 0x6e, 0xe6, 0xf5, 0x90, 0x3c, 0xde, 0x66, - 0xc9, 0x14, 0x82, 0x7e, 0x01, 0x19, 0xcb, 0x56, 0x6d, 0x5c, 0x48, 0x53, 0x29, 0x37, 0xe2, 0x58, - 0xe2, 0x95, 0x1d, 0x10, 0xda, 0x06, 0x30, 0xf1, 0xef, 0x46, 0xd8, 0xb2, 0xc9, 0xde, 0x64, 0x68, - 0xf6, 0x45, 0xd7, 0x22, 0xf5, 0xd0, 0x2f, 0x01, 0x34, 0x5f, 0xd7, 0x42, 0x96, 0x66, 0xdf, 0x0c, - 0x31, 0x4e, 0x64, 0x97, 0x03, 0xd0, 0x98, 0xe0, 0x0b, 0x5f, 0x26, 0xf8, 0x23, 0x40, 0x7d, 0xd5, - 0xb2, 0x95, 0x81, 0xde, 0xd3, 0x9e, 0x69, 0x1e, 0x49, 0xee, 0x93, 0x24, 0x2c, 0x89, 0x7a, 0xe2, - 0x06, 0x51, 0xf5, 0x5f, 0xc2, 0x75, 0xff, 0xfc, 0xc8, 0x7a, 0x1f, 0xd3, 0x63, 0x5d, 0x82, 0xc5, - 0xa1, 0x67, 0x74, 0x37, 0x64, 0x62, 0xf8, 0x46, 0x67, 0xf2, 0x04, 0x56, 0x84, 0x6e, 0x57, 0x1f, - 0x0d, 0x6d, 0x3f, 0xed, 0xc3, 0x08, 0x31, 0x43, 0x89, 0x77, 0x42, 0xc4, 0x6e, 0xcc, 0x54, 0xda, - 0x3f, 0x33, 0x90, 0xf3, 0x09, 0x1f, 0x10, 0x42, 0x8a, 0x57, 0x48, 0x0f, 0x52, 0xc2, 0xfc, 0x41, - 0x29, 0x89, 0xd0, 0x8b, 0x21, 0x6c, 0xbe, 0x01, 0x1d, 0xc1, 0x8a, 0x5f, 0xb7, 0x32, 0xe9, 0xe9, - 0xfc, 0x01, 0x97, 0x5c, 0xad, 0xcf, 0xb2, 0x3c, 0x0c, 0x9a, 0x2c, 0xbe, 0x0f, 0x69, 0x4a, 0x18, - 0x3f, 0xe3, 0x69, 0x7b, 0x6c, 0x60, 0x57, 0xc3, 0xf0, 0xc1, 0x25, 0x01, 0x9d, 0xb1, 0x81, 0x65, - 0x0a, 0x99, 0x79, 0xc6, 0xfd, 0xbc, 0x14, 0xc2, 0xff, 0x87, 0x01, 0x10, 0x5a, 0xd2, 0x63, 0x3c, - 0xa6, 0x32, 0xdc, 0x07, 0x52, 0x14, 0xb6, 0x2c, 0x85, 0xe6, 0x72, 0x64, 0xdd, 0x0e, 0xab, 0x40, - 0xd1, 0x02, 0x45, 0xd1, 0x9c, 0xa0, 0xfa, 0xbf, 0xd1, 0x2e, 0x2c, 0xf5, 0x34, 0xcb, 0xe8, 0xab, - 0x63, 0x85, 0x94, 0xe5, 0x36, 0x61, 0xde, 0xb5, 0x91, 0xe2, 0x51, 0x19, 0xf2, 0x3d, 0x6c, 0x75, - 0x4d, 0xcd, 0xa0, 0x9d, 0x30, 0xef, 0x22, 0x26, 0xa6, 0xe8, 0x8c, 0x48, 0x7f, 0xc9, 0x8c, 0x40, - 0x45, 0xc8, 0xf5, 0x34, 0x4b, 0x3d, 0xef, 0x63, 0xa7, 0x09, 0x73, 0xb2, 0xff, 0xcd, 0x2b, 0x90, - 0x69, 0xbe, 0x1c, 0x62, 0x13, 0x6d, 0x41, 0x4e, 0x27, 0x3f, 0x26, 0x53, 0x74, 0x81, 0x7e, 0x4b, - 0x3d, 0x74, 0x0f, 0xc0, 0x71, 0x05, 0xc4, 0x2e, 0x25, 0x08, 0x40, 0x89, 0x68, 0xfd, 0x8b, 0xba, - 0xf7, 0x93, 0xff, 0x6f, 0x0a, 0xb2, 0x8e, 0x3b, 0xb6, 0x7d, 0x7b, 0x90, 0xa1, 0x38, 0x77, 0x60, - 0xa2, 0x10, 0x25, 0x25, 0x93, 0x1d, 0x00, 0xba, 0x19, 0xda, 0xbd, 0xcd, 0x84, 0xdc, 0x81, 0x19, - 0x95, 0x34, 0xf9, 0xd2, 0xc9, 0x93, 0xaf, 0xea, 0x8d, 0xb3, 0x0c, 0x2d, 0xaa, 0x90, 0x44, 0x3c, - 0x7d, 0xa0, 0x65, 0xa3, 0x03, 0xed, 0x27, 0x33, 0x97, 0xea, 0x70, 0xcd, 0x6f, 0x75, 0x72, 0x10, - 0xd1, 0x6d, 0x48, 0xfb, 0x3d, 0xfc, 0x19, 0x43, 0x81, 0x82, 0xf9, 0x0e, 0xac, 0x04, 0x26, 0x11, - 0xe5, 0x11, 0x00, 0x0c, 0xff, 0xe6, 0x75, 0xd9, 0x3e, 0x63, 0x76, 0x05, 0x82, 0xf8, 0x3f, 0x92, - 0x03, 0xe1, 0xb1, 0x2d, 0x7b, 0x13, 0xc6, 0x69, 0x18, 0x77, 0xc6, 0x14, 0x93, 0xd7, 0x47, 0x10, - 0xf2, 0x35, 0x35, 0x54, 0xd8, 0x19, 0xa0, 0xc9, 0x8c, 0x71, 0x48, 0xfc, 0x31, 0x53, 0x89, 0xd2, - 0x60, 0xcb, 0xaa, 0x46, 0x2a, 0xc2, 0x96, 0x38, 0xb4, 0xcd, 0xb1, 0x7c, 0x7d, 0x18, 0xb5, 0x17, - 0xcf, 0x61, 0x23, 0x19, 0x4c, 0x9e, 0x00, 0x2f, 0xf0, 0xd8, 0x7b, 0x02, 0xbc, 0xc0, 0x63, 0x74, - 0x00, 0x99, 0x4b, 0xb5, 0x3f, 0xf2, 0xee, 0xfe, 0xd2, 0x34, 0x49, 0x68, 0x09, 0x0e, 0xf4, 0x57, - 0xa9, 0xbb, 0x0c, 0xff, 0x26, 0x05, 0xcb, 0x6d, 0x6c, 0x5e, 0x6a, 0xd4, 0x49, 0xea, 0xfa, 0x7f, - 0x2e, 0xf2, 0xdb, 0xa1, 0x36, 0x09, 0xef, 0x72, 0x38, 0x4b, 0xa0, 0x5d, 0xee, 0x84, 0xaf, 0xf4, - 0xf2, 0xac, 0xa8, 0x2f, 0xb8, 0xdc, 0xa3, 0xbd, 0x90, 0xfd, 0x16, 0xbd, 0xb0, 0xf0, 0x15, 0xbd, - 0xf0, 0x0f, 0x06, 0x50, 0xbc, 0x78, 0x84, 0x20, 0x4d, 0xc7, 0xb1, 0x23, 0x34, 0xfd, 0x8d, 0x6e, - 0x42, 0xd6, 0x3d, 0x87, 0xce, 0x36, 0xae, 0x26, 0x1c, 0x20, 0xd9, 0x85, 0x7c, 0xc6, 0xd0, 0x26, - 0xca, 0x76, 0x75, 0xc3, 0x1b, 0xd7, 0x33, 0x95, 0x25, 0x38, 0xd9, 0x81, 0xf3, 0x4d, 0x58, 0x4d, - 0xf0, 0xa2, 0xbb, 0xee, 0x6d, 0xe7, 0x74, 0xdd, 0x8d, 0x4f, 0xb1, 0x4d, 0x2e, 0x3f, 0xfe, 0x9f, - 0x0c, 0x94, 0xa4, 0x1e, 0x1e, 0xda, 0x9a, 0x3d, 0x4e, 0x7c, 0x41, 0xef, 0x40, 0x5e, 0x73, 0xfd, - 0x93, 0xf9, 0x0f, 0x9e, 0x49, 0xea, 0xa1, 0xfb, 0x70, 0xcd, 0x07, 0x04, 0x6e, 0x81, 0xad, 0xf0, - 0x6b, 0xcd, 0x45, 0xd0, 0xcc, 0x4b, 0x5a, 0xe0, 0x2b, 0xf6, 0xea, 0x99, 0xff, 0x9a, 0x57, 0x4f, - 0xe5, 0x23, 0x03, 0x8b, 0xfe, 0x23, 0x13, 0x15, 0x61, 0xe3, 0xa4, 0x2d, 0xca, 0x4a, 0xbb, 0x23, - 0x74, 0x44, 0xe5, 0xa4, 0xd1, 0x6e, 0x89, 0x35, 0xe9, 0x50, 0x12, 0xeb, 0xec, 0x1c, 0xda, 0x84, - 0xd5, 0x80, 0xaf, 0x26, 0x8b, 0x42, 0x47, 0x6a, 0x1c, 0xb1, 0x0c, 0x2a, 0x41, 0x21, 0xea, 0x10, - 0x95, 0x43, 0x41, 0x3a, 0x16, 0xeb, 0x6c, 0x0a, 0xad, 0xc3, 0xf5, 0x80, 0x57, 0xa8, 0x75, 0xa4, - 0x53, 0x91, 0x9d, 0x8f, 0xb0, 0x9d, 0xb4, 0xea, 0x0e, 0x5b, 0x3a, 0xc2, 0x46, 0x1d, 0x3e, 0x5b, - 0x26, 0x12, 0x56, 0x17, 0x8f, 0x45, 0x1a, 0x96, 0x8d, 0x84, 0x51, 0x87, 0x1f, 0xb6, 0x80, 0x36, - 0x00, 0xc5, 0xbc, 0x75, 0x36, 0x57, 0x79, 0xe0, 0xbc, 0xcd, 0xa8, 0x9e, 0x5b, 0xb0, 0x2e, 0x37, - 0x8f, 0x45, 0xa5, 0x73, 0xd6, 0x8a, 0x96, 0x5e, 0x80, 0xb5, 0x89, 0xab, 0x25, 0x8b, 0x75, 0xf1, - 0x50, 0x6a, 0x88, 0x75, 0x96, 0xa9, 0xfc, 0x95, 0x81, 0xb5, 0x24, 0x91, 0xd1, 0xf7, 0xc0, 0x37, - 0x84, 0x27, 0x62, 0xbb, 0x25, 0xd4, 0x9c, 0xaa, 0x9b, 0x0d, 0xe5, 0x48, 0x6e, 0x9e, 0xb4, 0x22, - 0xd4, 0x65, 0x28, 0x4d, 0xc1, 0x09, 0xf5, 0x27, 0x52, 0x83, 0x65, 0x66, 0x20, 0x9e, 0xca, 0x52, - 0x47, 0x64, 0x53, 0x68, 0x07, 0x7e, 0x36, 0x05, 0x21, 0x8b, 0x42, 0x9d, 0x9d, 0xaf, 0xfc, 0x9b, - 0x01, 0x14, 0xbf, 0x92, 0xd0, 0x0d, 0x28, 0x0b, 0xb5, 0x5a, 0xf3, 0xa4, 0xd1, 0x99, 0xb5, 0x42, - 0x0e, 0x8a, 0x89, 0x28, 0x6f, 0x7d, 0x3c, 0x70, 0x89, 0xfe, 0xba, 0x78, 0x2a, 0x1e, 0x37, 0x5b, - 0xa2, 0xcc, 0xa6, 0xd0, 0x36, 0x6c, 0x25, 0x62, 0x9c, 0xf5, 0x4d, 0x4d, 0xd1, 0x7c, 0xda, 0x10, - 0x65, 0x36, 0x4d, 0xc4, 0x4c, 0xf4, 0x1f, 0x4a, 0x0d, 0xa1, 0x41, 0x6a, 0xa6, 0x4b, 0xc9, 0x54, - 0xba, 0xc0, 0x46, 0xdf, 0x8d, 0x74, 0x79, 0x2d, 0xe9, 0xb1, 0x78, 0xa6, 0x08, 0xb5, 0x9a, 0xd8, - 0x6e, 0x27, 0xed, 0xef, 0x4d, 0xf8, 0x21, 0x01, 0x23, 0x35, 0x1e, 0x89, 0xb2, 0xd4, 0x71, 0x56, - 0xe1, 0x7a, 0x58, 0xa6, 0xf2, 0x12, 0x56, 0x22, 0x6f, 0x33, 0xb4, 0x0b, 0xdb, 0x6e, 0xbc, 0x83, - 0x4d, 0x48, 0x51, 0x84, 0x8d, 0x04, 0x48, 0x5b, 0x94, 0x59, 0x06, 0x7d, 0x07, 0xbb, 0x71, 0x5f, - 0x5b, 0x94, 0x4f, 0x25, 0xba, 0x9f, 0xb4, 0x70, 0x36, 0x55, 0xf9, 0x7b, 0x0a, 0xf2, 0x81, 0x07, - 0x14, 0x39, 0xf2, 0x6e, 0x58, 0x52, 0xbb, 0x6e, 0xc1, 0x7a, 0xc8, 0x1b, 0x68, 0x58, 0x22, 0x77, - 0xcc, 0x15, 0x68, 0xd9, 0x4d, 0x58, 0x0d, 0xf9, 0xfd, 0xa6, 0x8d, 0x72, 0x06, 0xda, 0x36, 0xca, - 0x19, 0x6d, 0xdc, 0x02, 0xac, 0x85, 0xfc, 0xe2, 0x6f, 0x5a, 0x92, 0x2c, 0xd6, 0xd9, 0x6c, 0x8c, - 0xd4, 0x6f, 0xea, 0x85, 0x18, 0x69, 0xb8, 0xad, 0x73, 0x31, 0x52, 0xaf, 0xb1, 0x17, 0x2b, 0xef, - 0x53, 0xb1, 0x81, 0x4f, 0x35, 0xfb, 0x0e, 0x76, 0x23, 0xc2, 0x26, 0x8a, 0xc7, 0x03, 0x97, 0x0c, - 0x0b, 0xa8, 0xf8, 0x03, 0xfc, 0x7c, 0x06, 0x26, 0x20, 0x67, 0x19, 0x4a, 0xc9, 0x40, 0x5f, 0xd7, - 0xa9, 0xe9, 0x02, 0x02, 0x4f, 0x4d, 0x17, 0x55, 0x7a, 0x2a, 0x59, 0x60, 0x5a, 0x4e, 0x25, 0x8b, - 0x0e, 0xce, 0x5d, 0xd8, 0x9e, 0x05, 0x24, 0x33, 0x54, 0x87, 0xcd, 0x29, 0x57, 0x25, 0xaa, 0xc0, - 0xf7, 0xb1, 0xe8, 0x5a, 0xb3, 0x95, 0x38, 0x63, 0xf7, 0xe0, 0xc6, 0x0c, 0xac, 0x3f, 0xdf, 0x58, - 0xa6, 0xf2, 0x1c, 0x96, 0x82, 0xd7, 0x22, 0x19, 0x2e, 0x52, 0x5d, 0x6c, 0x74, 0xa4, 0xce, 0x59, - 0x12, 0xf1, 0x06, 0xa0, 0x88, 0xdb, 0xe9, 0xba, 0x5d, 0xd8, 0x0e, 0xdb, 0x63, 0x1d, 0xf7, 0x50, - 0x7e, 0xf5, 0x96, 0x9b, 0x7b, 0xfd, 0x96, 0x9b, 0xfb, 0xf0, 0x96, 0x63, 0xfe, 0x70, 0xc5, 0x31, - 0x7f, 0xbb, 0xe2, 0x98, 0x7f, 0x5d, 0x71, 0xcc, 0xab, 0x2b, 0x8e, 0x79, 0x73, 0xc5, 0x31, 0xef, - 0xaf, 0xb8, 0xb9, 0x0f, 0x57, 0x1c, 0xf3, 0xa7, 0x77, 0xdc, 0xdc, 0xab, 0x77, 0xdc, 0xdc, 0xeb, - 0x77, 0xdc, 0xdc, 0x6f, 0x4b, 0xf6, 0xc0, 0x30, 0xfb, 0xd5, 0x6e, 0x5f, 0x1f, 0xf5, 0xf6, 0x03, - 0xff, 0xe4, 0xbb, 0x47, 0xfe, 0x9e, 0x67, 0xe9, 0x0b, 0xeb, 0xf6, 0xff, 0x02, 0x00, 0x00, 0xff, - 0xff, 0x33, 0x85, 0x1a, 0xde, 0xff, 0x13, 0x00, 0x00, + 0xf7, 0xfc, 0x94, 0x42, 0xc6, 0x73, 0x80, 0xd7, 0xa0, 0x41, 0x13, 0x30, 0x12, 0xed, 0x10, 0xb1, + 0x25, 0x81, 0x92, 0x9d, 0xba, 0x0b, 0x41, 0x4b, 0x37, 0x0e, 0x11, 0x49, 0x64, 0x49, 0xca, 0xa9, + 0xb6, 0xce, 0x45, 0x87, 0x0e, 0x9d, 0xba, 0x76, 0x69, 0xa7, 0xfe, 0x15, 0x05, 0x3a, 0x66, 0xcc, + 0x98, 0x38, 0x4b, 0xd0, 0x29, 0xe8, 0x9a, 0xa5, 0xb8, 0x97, 0x1f, 0xe2, 0x97, 0x94, 0x8f, 0x66, + 0x78, 0x93, 0xc5, 0x73, 0x7e, 0xe7, 0x77, 0xee, 0xf9, 0xdd, 0x7b, 0xce, 0xbd, 0x30, 0x6c, 0xa9, + 0x86, 0xb6, 0xaf, 0x8e, 0xec, 0x67, 0xfb, 0x57, 0x3f, 0xec, 0x0f, 0xb0, 0x65, 0xa9, 0x97, 0xb8, + 0x6a, 0x98, 0xba, 0xad, 0xa3, 0xbc, 0x6a, 0x68, 0x55, 0xe2, 0xaa, 0x5e, 0xfd, 0x50, 0xdc, 0xb9, + 0xd4, 0xf5, 0xcb, 0x3e, 0xde, 0xa7, 0xae, 0x8b, 0xd1, 0xd3, 0x7d, 0x5b, 0x1b, 0x60, 0xcb, 0x56, + 0x07, 0x86, 0x83, 0xe6, 0x7f, 0x84, 0xdc, 0xa9, 0x85, 0xcd, 0xb6, 0x81, 0xbb, 0x68, 0x0d, 0x32, + 0x78, 0xa0, 0x6a, 0xfd, 0x02, 0x53, 0x66, 0xf6, 0x16, 0x65, 0xe7, 0x83, 0x58, 0x4d, 0xbd, 0x8f, + 0xad, 0x42, 0xaa, 0x3c, 0x4f, 0xac, 0xf4, 0x83, 0x1f, 0x43, 0x81, 0xc4, 0x35, 0xd4, 0x01, 0xb6, + 0x0c, 0xb5, 0x8b, 0x5b, 0xd8, 0x1c, 0x68, 0x96, 0xa5, 0xe9, 0x43, 0x0b, 0x6d, 0xc2, 0xc2, 0xc8, + 0xc2, 0xa6, 0xa2, 0xf5, 0x5c, 0xa6, 0x2c, 0xf9, 0x94, 0x7a, 0xa8, 0x0e, 0x4b, 0x6a, 0xd7, 0xd6, + 0xf4, 0xa1, 0x72, 0x69, 0xea, 0x23, 0xa3, 0x90, 0x2a, 0x33, 0x7b, 0xcb, 0x07, 0xbb, 0xd5, 0xc0, + 0x8a, 0xab, 0x3e, 0xa3, 0x40, 0x91, 0x47, 0x04, 0x28, 0xe7, 0xd5, 0xc9, 0x07, 0xff, 0x57, 0x06, + 0x40, 0x1a, 0x5e, 0x69, 0xb6, 0x4a, 0x6c, 0x88, 0x85, 0xf9, 0x91, 0xa9, 0xb9, 0x99, 0xc8, 0x4f, + 0xf4, 0x6b, 0x58, 0xea, 0x9a, 0x58, 0xb5, 0x71, 0x4f, 0x21, 0xe5, 0xd2, 0x34, 0xf9, 0x83, 0x62, + 0xd5, 0xd1, 0xa2, 0xea, 0x69, 0x51, 0xed, 0x78, 0x5a, 0xc8, 0x79, 0x17, 0x4f, 0x2c, 0xe8, 0x1e, + 0xe4, 0xf1, 0xef, 0x0d, 0xcd, 0x1c, 0x3b, 0xd1, 0xf3, 0x1f, 0x8d, 0x06, 0x07, 0x4e, 0x0c, 0xfc, + 0x87, 0x14, 0xa4, 0x89, 0x30, 0x68, 0x19, 0x52, 0x7e, 0xfd, 0x29, 0xad, 0x87, 0xbe, 0x07, 0xd6, + 0xc4, 0x96, 0x3e, 0x32, 0xbb, 0x58, 0xb9, 0xc2, 0x26, 0x51, 0x8a, 0x2e, 0x6c, 0x51, 0x5e, 0xf1, + 0xec, 0x67, 0x8e, 0x19, 0x7d, 0x0f, 0x69, 0xcb, 0xc0, 0x5d, 0x37, 0xf3, 0x7a, 0x48, 0x1e, 0x6f, + 0xb3, 0x64, 0x0a, 0x41, 0xbf, 0x80, 0x8c, 0x65, 0xab, 0x36, 0x2e, 0xa4, 0xa9, 0x94, 0x1b, 0x71, + 0x2c, 0xf1, 0xca, 0x0e, 0x08, 0x6d, 0x03, 0x98, 0xf8, 0x77, 0x23, 0x6c, 0xd9, 0x64, 0x6f, 0x32, + 0x34, 0xfb, 0xa2, 0x6b, 0x91, 0x7a, 0xe8, 0x97, 0x00, 0x9a, 0xaf, 0x6b, 0x21, 0x4b, 0xb3, 0x6f, + 0x86, 0x18, 0x27, 0xb2, 0xcb, 0x01, 0x68, 0x4c, 0xf0, 0x85, 0xcf, 0x13, 0xfc, 0x11, 0xa0, 0xbe, + 0x6a, 0xd9, 0xca, 0x40, 0xef, 0x69, 0x4f, 0x35, 0x8f, 0x24, 0xf7, 0x51, 0x12, 0x96, 0x44, 0x9d, + 0xb8, 0x41, 0x54, 0xfd, 0x17, 0x70, 0xd3, 0x3f, 0x3f, 0xb2, 0xde, 0xc7, 0xf4, 0x58, 0x97, 0x60, + 0x71, 0xe8, 0x19, 0xdd, 0x0d, 0x99, 0x18, 0xbe, 0xd2, 0x99, 0x3c, 0x85, 0x15, 0xa1, 0xdb, 0xd5, + 0x47, 0x43, 0xdb, 0x4f, 0xfb, 0x30, 0x42, 0xcc, 0x50, 0xe2, 0x9d, 0x10, 0xb1, 0x1b, 0x33, 0x95, + 0xf6, 0x2f, 0x0c, 0xe4, 0x7c, 0xc2, 0x07, 0x84, 0x90, 0xe2, 0x15, 0xd2, 0x83, 0x94, 0x30, 0x7f, + 0x50, 0x4a, 0x22, 0xf4, 0x62, 0x08, 0x9b, 0x6f, 0x40, 0x47, 0xb0, 0xe2, 0xd7, 0xad, 0x4c, 0x7a, + 0x3a, 0x7f, 0xc0, 0x25, 0x57, 0xeb, 0xb3, 0x2c, 0x0f, 0x83, 0x26, 0x8b, 0xef, 0x43, 0x9a, 0x12, + 0xc6, 0xcf, 0x78, 0xda, 0x1e, 0x1b, 0xd8, 0xd5, 0x30, 0x7c, 0x70, 0x49, 0x40, 0x67, 0x6c, 0x60, + 0x99, 0x42, 0x66, 0x9e, 0x71, 0x3f, 0x2f, 0x85, 0xf0, 0xff, 0x61, 0x00, 0x84, 0x96, 0xf4, 0x18, + 0x8f, 0xa9, 0x0c, 0xf7, 0x81, 0x14, 0x85, 0x2d, 0x4b, 0xa1, 0xb9, 0x1c, 0x59, 0xb7, 0xc3, 0x2a, + 0x50, 0xb4, 0x40, 0x51, 0x34, 0x27, 0xa8, 0xfe, 0x6f, 0xb4, 0x0b, 0x4b, 0x3d, 0xcd, 0x32, 0xfa, + 0xea, 0x58, 0x21, 0x65, 0xb9, 0x4d, 0x98, 0x77, 0x6d, 0xa4, 0x78, 0x54, 0x86, 0x7c, 0x0f, 0x5b, + 0x5d, 0x53, 0x33, 0x68, 0x27, 0xcc, 0xbb, 0x88, 0x89, 0x29, 0x3a, 0x23, 0xd2, 0x9f, 0x33, 0x23, + 0x50, 0x11, 0x72, 0x3d, 0xcd, 0x52, 0x2f, 0xfa, 0xd8, 0x69, 0xc2, 0x9c, 0xec, 0x7f, 0xf3, 0x0a, + 0x64, 0x9a, 0x2f, 0x86, 0xd8, 0x44, 0x5b, 0x90, 0xd3, 0xc9, 0x8f, 0xc9, 0x14, 0x5d, 0xa0, 0xdf, + 0x52, 0x0f, 0xdd, 0x03, 0x70, 0x5c, 0x01, 0xb1, 0x4b, 0x09, 0x02, 0x50, 0x22, 0x5a, 0xff, 0xa2, + 0xee, 0xfd, 0xe4, 0xff, 0x9b, 0x82, 0xac, 0xe3, 0x8e, 0x6d, 0xdf, 0x1e, 0x64, 0x28, 0xce, 0x1d, + 0x98, 0x28, 0x44, 0x49, 0xc9, 0x64, 0x07, 0x80, 0x6e, 0x87, 0x76, 0x6f, 0x33, 0x21, 0x77, 0x60, + 0x46, 0x25, 0x4d, 0xbe, 0x74, 0xf2, 0xe4, 0xab, 0x7a, 0xe3, 0x2c, 0x43, 0x8b, 0x2a, 0x24, 0x11, + 0x4f, 0x1f, 0x68, 0xd9, 0xe8, 0x40, 0xfb, 0xc9, 0xcc, 0xa5, 0x3a, 0xdc, 0xf0, 0x5b, 0x9d, 0x1c, + 0x44, 0x74, 0x07, 0xd2, 0x7e, 0x0f, 0x7f, 0xc2, 0x50, 0xa0, 0x60, 0xbe, 0x03, 0x2b, 0x81, 0x49, + 0x44, 0x79, 0x04, 0x00, 0xc3, 0xbf, 0x79, 0x5d, 0xb6, 0x4f, 0x98, 0x5d, 0x81, 0x20, 0xfe, 0x8f, + 0xe4, 0x40, 0x78, 0x6c, 0xcb, 0xde, 0x84, 0x71, 0x1a, 0xc6, 0x9d, 0x31, 0xc5, 0xe4, 0xf5, 0x11, + 0x84, 0x7c, 0x43, 0x0d, 0x15, 0x76, 0x0e, 0x68, 0x32, 0x63, 0x1c, 0x12, 0x7f, 0xcc, 0x54, 0xa2, + 0x34, 0xd8, 0xb2, 0xaa, 0x91, 0x8a, 0xb0, 0x25, 0x0e, 0x6d, 0x73, 0x2c, 0xdf, 0x1c, 0x46, 0xed, + 0xc5, 0x0b, 0xd8, 0x48, 0x06, 0x93, 0x27, 0xc0, 0x73, 0x3c, 0xf6, 0x9e, 0x00, 0xcf, 0xf1, 0x18, + 0x1d, 0x40, 0xe6, 0x4a, 0xed, 0x8f, 0xbc, 0xbb, 0xbf, 0x34, 0x4d, 0x12, 0x5a, 0x82, 0x03, 0xfd, + 0x55, 0xea, 0x2e, 0xc3, 0xbf, 0x4e, 0xc1, 0x72, 0x1b, 0x9b, 0x57, 0x1a, 0x75, 0x92, 0xba, 0xfe, + 0x9f, 0x8b, 0xfc, 0x4e, 0xa8, 0x4d, 0xc2, 0xbb, 0x1c, 0xce, 0x12, 0x68, 0x97, 0x1f, 0xc3, 0x57, + 0x7a, 0x79, 0x56, 0xd4, 0x67, 0x5c, 0xee, 0xd1, 0x5e, 0xc8, 0x7e, 0x8d, 0x5e, 0x58, 0xf8, 0x82, + 0x5e, 0xf8, 0x27, 0x03, 0x28, 0x5e, 0x3c, 0x42, 0x90, 0xa6, 0xe3, 0xd8, 0x11, 0x9a, 0xfe, 0x46, + 0xb7, 0x21, 0xeb, 0x9e, 0x43, 0x67, 0x1b, 0x57, 0x13, 0x0e, 0x90, 0xec, 0x42, 0x3e, 0x61, 0x68, + 0x13, 0x65, 0xbb, 0xba, 0xe1, 0x8d, 0xeb, 0x99, 0xca, 0x12, 0x9c, 0xec, 0xc0, 0xf9, 0x26, 0xac, + 0x26, 0x78, 0xd1, 0x5d, 0xf7, 0xb6, 0x73, 0xba, 0xee, 0xd6, 0xc7, 0xd8, 0x26, 0x97, 0x1f, 0xff, + 0x2f, 0x06, 0x4a, 0x52, 0x0f, 0x0f, 0x6d, 0xcd, 0x1e, 0x27, 0xbe, 0xa0, 0x77, 0x20, 0xaf, 0xb9, + 0xfe, 0xc9, 0xfc, 0x07, 0xcf, 0x24, 0xf5, 0xd0, 0x7d, 0xb8, 0xe1, 0x03, 0x02, 0xb7, 0xc0, 0x56, + 0xf8, 0xb5, 0xe6, 0x22, 0x68, 0xe6, 0x25, 0x2d, 0xf0, 0x15, 0x7b, 0xf5, 0xcc, 0x7f, 0xc9, 0xab, + 0xa7, 0xf2, 0x81, 0x81, 0x45, 0xff, 0x91, 0x89, 0x8a, 0xb0, 0x71, 0xda, 0x16, 0x65, 0xa5, 0xdd, + 0x11, 0x3a, 0xa2, 0x72, 0xda, 0x68, 0xb7, 0xc4, 0x9a, 0x74, 0x28, 0x89, 0x75, 0x76, 0x0e, 0x6d, + 0xc2, 0x6a, 0xc0, 0x57, 0x93, 0x45, 0xa1, 0x23, 0x35, 0x8e, 0x58, 0x06, 0x95, 0xa0, 0x10, 0x75, + 0x88, 0xca, 0xa1, 0x20, 0x1d, 0x8b, 0x75, 0x36, 0x85, 0xd6, 0xe1, 0x66, 0xc0, 0x2b, 0xd4, 0x3a, + 0xd2, 0x99, 0xc8, 0xce, 0x47, 0xd8, 0x4e, 0x5b, 0x75, 0x87, 0x2d, 0x1d, 0x61, 0xa3, 0x0e, 0x9f, + 0x2d, 0x13, 0x09, 0xab, 0x8b, 0xc7, 0x22, 0x0d, 0xcb, 0x46, 0xc2, 0xa8, 0xc3, 0x0f, 0x5b, 0x40, + 0x1b, 0x80, 0x62, 0xde, 0x3a, 0x9b, 0xab, 0x3c, 0x70, 0xde, 0x66, 0x54, 0xcf, 0x2d, 0x58, 0x97, + 0x9b, 0xc7, 0xa2, 0xd2, 0x39, 0x6f, 0x45, 0x4b, 0x2f, 0xc0, 0xda, 0xc4, 0xd5, 0x92, 0xc5, 0xba, + 0x78, 0x28, 0x35, 0xc4, 0x3a, 0xcb, 0x54, 0xfe, 0xc6, 0xc0, 0x5a, 0x92, 0xc8, 0xe8, 0x5b, 0xe0, + 0x1b, 0xc2, 0x89, 0xd8, 0x6e, 0x09, 0x35, 0xa7, 0xea, 0x66, 0x43, 0x39, 0x92, 0x9b, 0xa7, 0xad, + 0x08, 0x75, 0x19, 0x4a, 0x53, 0x70, 0x42, 0xfd, 0x44, 0x6a, 0xb0, 0xcc, 0x0c, 0xc4, 0x13, 0x59, + 0xea, 0x88, 0x6c, 0x0a, 0xed, 0xc0, 0xcf, 0xa6, 0x20, 0x64, 0x51, 0xa8, 0xb3, 0xf3, 0x95, 0x3f, + 0xa5, 0x00, 0xc5, 0xaf, 0x24, 0x74, 0x0b, 0xca, 0x42, 0xad, 0xd6, 0x3c, 0x6d, 0x74, 0x66, 0xad, + 0x90, 0x83, 0x62, 0x22, 0xca, 0x5b, 0x1f, 0x0f, 0x5c, 0xa2, 0xbf, 0x2e, 0x9e, 0x89, 0xc7, 0xcd, + 0x96, 0x28, 0xb3, 0x29, 0xb4, 0x0d, 0x5b, 0x89, 0x18, 0x67, 0x7d, 0x53, 0x53, 0x34, 0x9f, 0x34, + 0x44, 0x99, 0x4d, 0x13, 0x31, 0x13, 0xfd, 0x87, 0x52, 0x43, 0x68, 0x90, 0x9a, 0xe9, 0x52, 0x32, + 0xe8, 0x1b, 0xd8, 0x4d, 0xc4, 0x9d, 0x88, 0x1d, 0x59, 0xaa, 0xb5, 0x9d, 0x74, 0xd9, 0x4a, 0x17, + 0xd8, 0xe8, 0xf3, 0x92, 0x56, 0xd1, 0x92, 0x1e, 0x8b, 0xe7, 0x8a, 0x50, 0xab, 0x89, 0xed, 0x76, + 0xd2, 0x31, 0xb8, 0x0d, 0xdf, 0x25, 0x60, 0xa4, 0xc6, 0x23, 0x51, 0x96, 0x3a, 0xce, 0x62, 0x5d, + 0x0f, 0xcb, 0x54, 0x5e, 0xc0, 0x4a, 0xe4, 0x09, 0x87, 0x76, 0x61, 0xdb, 0x8d, 0x77, 0xb0, 0x09, + 0x29, 0x8a, 0xb0, 0x91, 0x00, 0x69, 0x8b, 0x32, 0xcb, 0xd0, 0xea, 0x62, 0xbe, 0xb6, 0x28, 0x9f, + 0x49, 0x74, 0xdb, 0x69, 0xdd, 0x6c, 0xaa, 0xf2, 0x8f, 0x14, 0xe4, 0x03, 0xef, 0x2c, 0xd2, 0x19, + 0x6e, 0x58, 0x52, 0x57, 0x6f, 0xc1, 0x7a, 0xc8, 0x1b, 0xe8, 0x6b, 0xb2, 0x2b, 0x31, 0x57, 0xa0, + 0xb3, 0x37, 0x61, 0x35, 0xe4, 0xf7, 0x7b, 0x3b, 0xca, 0x19, 0xe8, 0xee, 0x28, 0x67, 0xb4, 0xbf, + 0x0b, 0xb0, 0x16, 0xf2, 0x8b, 0xbf, 0x69, 0x49, 0xb2, 0x58, 0x67, 0xb3, 0x31, 0x52, 0xbf, 0xf7, + 0x17, 0x62, 0xa4, 0xe1, 0xee, 0xcf, 0xc5, 0x48, 0xbd, 0xfe, 0x5f, 0xac, 0xbc, 0x4b, 0xc5, 0xee, + 0x05, 0xaa, 0xd9, 0x37, 0xb0, 0x1b, 0x11, 0x36, 0x51, 0x3c, 0x1e, 0xb8, 0x64, 0x58, 0x40, 0xc5, + 0xef, 0xe0, 0xe7, 0x33, 0x30, 0x01, 0x39, 0xcb, 0x50, 0x4a, 0x06, 0xfa, 0xba, 0x4e, 0x4d, 0x17, + 0x10, 0x78, 0x6a, 0xba, 0xa8, 0xd2, 0x53, 0xc9, 0x02, 0x43, 0x75, 0x2a, 0x59, 0x74, 0xbe, 0xee, + 0xc2, 0xf6, 0x2c, 0x20, 0x19, 0xb5, 0x3a, 0x6c, 0x4e, 0xb9, 0x51, 0x51, 0x05, 0xbe, 0x8d, 0x45, + 0xd7, 0x9a, 0xad, 0xc4, 0x51, 0xbc, 0x07, 0xb7, 0x66, 0x60, 0xfd, 0x31, 0xc8, 0x32, 0x95, 0x67, + 0xb0, 0x14, 0xbc, 0x3d, 0xc9, 0x0c, 0x92, 0xea, 0x62, 0xa3, 0x23, 0x75, 0xce, 0x93, 0x88, 0x37, + 0x00, 0x45, 0xdc, 0x4e, 0xd7, 0xed, 0xc2, 0x76, 0xd8, 0x1e, 0xeb, 0xb8, 0x87, 0xf2, 0xcb, 0x37, + 0xdc, 0xdc, 0xab, 0x37, 0xdc, 0xdc, 0xfb, 0x37, 0x1c, 0xf3, 0x87, 0x6b, 0x8e, 0xf9, 0xfb, 0x35, + 0xc7, 0xfc, 0xfb, 0x9a, 0x63, 0x5e, 0x5e, 0x73, 0xcc, 0xeb, 0x6b, 0x8e, 0x79, 0x77, 0xcd, 0xcd, + 0xbd, 0xbf, 0xe6, 0x98, 0x3f, 0xbf, 0xe5, 0xe6, 0x5e, 0xbe, 0xe5, 0xe6, 0x5e, 0xbd, 0xe5, 0xe6, + 0x7e, 0x5b, 0xb2, 0x07, 0x86, 0xd9, 0xaf, 0x76, 0xfb, 0xfa, 0xa8, 0xb7, 0x1f, 0xf8, 0x5f, 0xe0, + 0x3d, 0xf2, 0xf7, 0x22, 0x4b, 0x1f, 0x62, 0x77, 0xfe, 0x17, 0x00, 0x00, 0xff, 0xff, 0xf3, 0xc5, + 0x04, 0xde, 0x26, 0x14, 0x00, 0x00, } func (x UserState) String() string { From c354bb84593f5639b6e270d5749d0c021444b34e Mon Sep 17 00:00:00 2001 From: Beardo Moore Date: Tue, 29 Apr 2025 11:27:14 -0600 Subject: [PATCH 2/4] fix: test needed actual role --- app/user_test.go | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/app/user_test.go b/app/user_test.go index a4b1ef59..baf15893 100644 --- a/app/user_test.go +++ b/app/user_test.go @@ -3,6 +3,9 @@ package app import ( "context" "errors" + "reflect" + "testing" + "github.com/golang/mock/gomock" "github.com/stretchr/testify/suite" "github.com/temporalio/tcld/protogen/api/auth/v1" @@ -10,8 +13,6 @@ import ( "github.com/temporalio/tcld/protogen/api/request/v1" authservicemock "github.com/temporalio/tcld/protogen/apimock/authservice/v1" "github.com/urfave/cli/v2" - "reflect" - "testing" ) func TestUser(t *testing.T) { @@ -154,6 +155,11 @@ func (s *UserTestSuite) TestInviteErrors() { Roles: []*auth.Role{{ Id: "account-admin-role", Type: auth.ROLE_TYPE_PREDEFINED, + Spec: &auth.RoleSpec{ + AccountRole: &auth.AccountRoleSpec{ + ActionGroup: auth.ACCOUNT_ACTION_GROUP_ADMIN, + }, + }, }}, }, nil) s.mockAuthService.EXPECT().InviteUsers(gomock.Any(), gomock.Any()).Return(nil, errors.New("invite users error")).Times(1) @@ -162,6 +168,11 @@ func (s *UserTestSuite) TestInviteErrors() { Roles: []*auth.Role{{ Id: "account-dev-role", Type: auth.ROLE_TYPE_PREDEFINED, + Spec: &auth.RoleSpec{ + AccountRole: &auth.AccountRoleSpec{ + ActionGroup: auth.ACCOUNT_ACTION_GROUP_DEVELOPER, + }, + }, }}, }, nil).Times(1) s.mockAuthService.EXPECT().GetRolesByPermissions(gomock.Any(), gomock.Any()).Return(&authservice.GetRolesByPermissionsResponse{ @@ -205,6 +216,11 @@ func (s *UserTestSuite) TestInviteSuccess() { Roles: []*auth.Role{{ Id: "account-dev-role", Type: auth.ROLE_TYPE_PREDEFINED, + Spec: &auth.RoleSpec{ + AccountRole: &auth.AccountRoleSpec{ + ActionGroup: auth.ACCOUNT_ACTION_GROUP_DEVELOPER, + }, + }, }}, }, nil).Times(1) s.mockAuthService.EXPECT().GetRolesByPermissions(gomock.Any(), gomock.Any()).Return(&authservice.GetRolesByPermissionsResponse{ From 547e3b5e31561dec69982c922d2a7b3e6ba4c943 Mon Sep 17 00:00:00 2001 From: Beardo Moore Date: Tue, 29 Apr 2025 11:53:35 -0600 Subject: [PATCH 3/4] fix: error message --- app/role.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/role.go b/app/role.go index dd5d9ab6..6463b9f7 100644 --- a/app/role.go +++ b/app/role.go @@ -111,7 +111,7 @@ func toAccountActionGroup(actionGroup string) (auth.AccountActionGroup, error) { } if ag == auth.ACCOUNT_ACTION_GROUP_UNSPECIFIED { return auth.ACCOUNT_ACTION_GROUP_UNSPECIFIED, - fmt.Errorf("invalid action group: should be one of: %s", userAccountActionGroups) + fmt.Errorf("invalid action group: should be one of: %s", allAccountActionGroups[]) } return ag, nil } From fc9b584c6a386ea1227fa75fafdcda9321f47ad4 Mon Sep 17 00:00:00 2001 From: Beardo Moore Date: Wed, 30 Apr 2025 09:34:53 -0600 Subject: [PATCH 4/4] fix: typo --- app/role.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/role.go b/app/role.go index 6463b9f7..ba044c71 100644 --- a/app/role.go +++ b/app/role.go @@ -111,7 +111,7 @@ func toAccountActionGroup(actionGroup string) (auth.AccountActionGroup, error) { } if ag == auth.ACCOUNT_ACTION_GROUP_UNSPECIFIED { return auth.ACCOUNT_ACTION_GROUP_UNSPECIFIED, - fmt.Errorf("invalid action group: should be one of: %s", allAccountActionGroups[]) + fmt.Errorf("invalid action group: should be one of: %s", allAccountActionGroups) } return ag, nil }