Implement filtering of users and groups via sentry

Drop the previous implementationusing custom code
This commit is contained in:
Abin Simon
2022-03-29 15:09:19 +05:30
parent cf0b830924
commit e8cc7d2f1c
14 changed files with 554 additions and 274 deletions
@@ -1517,6 +1517,18 @@
"required": false,
"type": "string"
},
{
"name": "group",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "role",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "displayName",
"description": "displayName only used for update queries to set displayName (READONLY).",
@@ -273,6 +273,18 @@
"required": false,
"type": "string"
},
{
"name": "group",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "role",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "displayName",
"description": "displayName only used for update queries to set displayName (READONLY).",
@@ -1309,6 +1321,18 @@
"required": false,
"type": "string"
},
{
"name": "opts.group",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "opts.role",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "opts.displayName",
"description": "displayName only used for update queries to set displayName (READONLY).",
@@ -1973,6 +1997,12 @@
"project": {
"type": "string"
},
"group": {
"type": "string"
},
"role": {
"type": "string"
},
"displayName": {
"type": "string",
"title": "displayName only used for update queries to set displayName (READONLY)"
@@ -92,6 +92,18 @@
"required": false,
"type": "string"
},
{
"name": "opts.group",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "opts.role",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "opts.displayName",
"description": "displayName only used for update queries to set displayName (READONLY).",
@@ -303,6 +315,18 @@
"required": false,
"type": "string"
},
{
"name": "opts.group",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "opts.role",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "opts.displayName",
"description": "displayName only used for update queries to set displayName (READONLY).",
@@ -557,6 +581,18 @@
"required": false,
"type": "string"
},
{
"name": "opts.group",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "opts.role",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "opts.displayName",
"description": "displayName only used for update queries to set displayName (READONLY).",
@@ -770,6 +806,18 @@
"required": false,
"type": "string"
},
{
"name": "opts.group",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "opts.role",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "opts.displayName",
"description": "displayName only used for update queries to set displayName (READONLY).",
@@ -1019,6 +1067,18 @@
"required": false,
"type": "string"
},
{
"name": "opts.group",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "opts.role",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "opts.displayName",
"description": "displayName only used for update queries to set displayName (READONLY).",
@@ -1268,6 +1328,18 @@
"required": false,
"type": "string"
},
{
"name": "opts.group",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "opts.role",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "opts.displayName",
"description": "displayName only used for update queries to set displayName (READONLY).",
@@ -1525,6 +1597,18 @@
"required": false,
"type": "string"
},
{
"name": "opts.group",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "opts.role",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "opts.displayName",
"description": "displayName only used for update queries to set displayName (READONLY).",
@@ -1831,6 +1915,12 @@
"project": {
"type": "string"
},
"group": {
"type": "string"
},
"role": {
"type": "string"
},
"displayName": {
"type": "string",
"title": "displayName only used for update queries to set displayName (READONLY)"
@@ -100,6 +100,18 @@
"required": false,
"type": "string"
},
{
"name": "opts.group",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "opts.role",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "opts.displayName",
"description": "displayName only used for update queries to set displayName (READONLY).",
@@ -354,6 +366,12 @@
"project": {
"type": "string"
},
"group": {
"type": "string"
},
"role": {
"type": "string"
},
"displayName": {
"type": "string",
"title": "displayName only used for update queries to set displayName (READONLY)"
@@ -549,6 +549,18 @@
"required": false,
"type": "string"
},
{
"name": "group",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "role",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "displayName",
"description": "displayName only used for update queries to set displayName (READONLY).",
@@ -671,6 +671,18 @@
"required": false,
"type": "string"
},
{
"name": "group",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "role",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "displayName",
"description": "displayName only used for update queries to set displayName (READONLY).",
+20 -56
View File
@@ -71,48 +71,30 @@ type userProjectnamesaceRole struct {
Project *string `bun:"project,type:string"`
}
func ListUserRoles(ctx context.Context, db bun.IDB) ([]*userProjectnamesaceRole, error) {
// Could possibly union them later for some speedup
// TODO: filter by org and partner
// TODO: add lookup via group as well
var r = []*userProjectnamesaceRole{}
err := db.NewSelect().Table("authsrv_accountresourcerole").
ColumnExpr("authsrv_accountresourcerole.account_id as account_id, authsrv_resourcerole.name as role").
Join(`JOIN authsrv_resourcerole ON authsrv_resourcerole.id=authsrv_accountresourcerole.role_id`).
Where("authsrv_resourcerole.trash = ?", false).
Where("authsrv_accountresourcerole.trash = ?", false).
Scan(ctx, &r)
if err != nil {
return nil, err
}
// TODO: find a better name for the function
func GetQueryFilteredUsers(ctx context.Context, db bun.IDB, partner, org, group, role uuid.UUID, projects []uuid.UUID) ([]uuid.UUID, error) {
p := []models.SentryPermission{}
q := db.NewSelect().Model(&p).ColumnExpr("DISTINCT account_id")
var pr = []*userProjectnamesaceRole{}
err = db.NewSelect().Table("authsrv_projectaccountresourcerole").
ColumnExpr("authsrv_projectaccountresourcerole.account_id as account_id, authsrv_resourcerole.name as role, authsrv_project.name as project").
Join(`JOIN authsrv_resourcerole ON authsrv_resourcerole.id=authsrv_projectaccountresourcerole.role_id`).
Join(`JOIN authsrv_project ON authsrv_project.id=authsrv_projectaccountresourcerole.project_id`).
Where("authsrv_project.trash = ?", false).
Where("authsrv_resourcerole.trash = ?", false).
Where("authsrv_projectaccountresourcerole.trash = ?", false).
Scan(ctx, &pr)
if err != nil {
return nil, err
}
q.Where("partner_id = ?", partner).
Where("organization_id = ?", org)
var pnr = []*userProjectnamesaceRole{}
err = db.NewSelect().Table("authsrv_projectaccountnamespacerole").
ColumnExpr("authsrv_projectaccountnamespacerole.account_id as account_id, authsrv_resourcerole.name as role, authsrv_project.name as project, namespace_id as namespace").
Join(`JOIN authsrv_resourcerole ON authsrv_resourcerole.id=authsrv_projectaccountnamespacerole.role_id`).
Join(`JOIN authsrv_project ON authsrv_project.id=authsrv_projectaccountnamespacerole.project_id`). // also need a namespace join
Where("authsrv_project.trash = ?", false).
Where("authsrv_resourcerole.trash = ?", false).
Where("authsrv_projectaccountnamespacerole.trash = ?", false).
Scan(ctx, &pnr)
if err != nil {
return nil, err
if group != uuid.Nil {
q.Where("group_id = ?", group)
}
if role != uuid.Nil {
q.Where("role_id = ?", role)
}
if len(projects) != 0 {
q.Where("project_id IN (?)", bun.In(projects))
}
q.Scan(ctx)
return append(append(r, pr...), pnr...), err
acc := []uuid.UUID{}
for _, a := range p {
acc = append(acc, a.AccountId)
}
return acc, nil
}
// ListFilteredUsers will return the list of users fileterd by query
@@ -137,21 +119,3 @@ func ListFilteredUsers(ctx context.Context, db bun.IDB, users *[]models.KratosId
}
return users, nil
}
// func FilterUsersByGroups(ctx context.Context, db bun.IDB, users []uuid.UUID, groups []string) ([]uuid.UUID, error) {
// ga := []models.GroupAccount{}
// q := db.NewSelect().Model(&ga).
// Where("name IN (?)", bun.In(groups)).
// Where("account_id IN (?)", bun.In(users))
// err := q.Scan(ctx)
// if err != nil {
// return nil, err
// }
// fusers := []uuid.UUID{}
// for _, g := range ga {
// fusers = append(fusers, g.AccountId)
// }
// return fusers, nil
// }
+24
View File
@@ -0,0 +1,24 @@
package models
import (
"encoding/json"
"github.com/google/uuid"
"github.com/uptrace/bun"
)
type SentryPermission struct {
bun.BaseModel `bun:"table:sentry_permission,alias:sentry_permission"`
AccountId uuid.UUID `bun:"account_id,type:uuid"`
ProjectId uuid.UUID `bun:"project_id,type:uuid"`
GroupId uuid.UUID `bun:"group_id,type:uuid"`
RoleId uuid.UUID `bun:"role_id,type:uuid"`
OrganizationId uuid.UUID `bun:"organization_id,type:uuid"`
PartnerId uuid.UUID `bun:"partner_id,type:uuid"`
IsGlobal bool `bun:"is_global,notnull,default:true"` // does not matter
Scope string `bun:"scope,notnull"`
Permission string `bun:"permission_name,type:string"`
BaseUrl string `bun:"base_url,type:string"`
Urls json.RawMessage `bun:"urls,type:jsonb"`
}
+1 -1
View File
@@ -280,7 +280,7 @@ GET :host/auth/v3/users
Content-Type: application/yaml
# Get all users with query options
GET :host/auth/v3/users?q=user&name=john&order_by=email
GET :host/auth/v3/users?partner=:partner&organization=:org&q=user&name=john&order_by=email&project=ALL,:project
Content-Type: application/yaml
# Get single user
+44 -31
View File
@@ -505,47 +505,60 @@ func (s *userService) List(ctx context.Context, opts ...query.Option) (*userv3.U
opt(&queryOptions)
}
// TODO: group relation stuff
// TODO: This is kinda expensive to compute
upr, err := getUserProjectRoles(ctx, s.db)
partnerId, orgId, err := getPartnerOrganization(ctx, s.db, queryOptions.Partner, queryOptions.Organization)
if err != nil {
return &userv3.UserList{}, err
return &userv3.UserList{}, fmt.Errorf("unable to find role partner and org")
}
fmt.Println("upr:", upr)
projects := []string{}
fmt.Println("queryOptions.Project:", queryOptions.Project)
roleName := queryOptions.Role
roleId := uuid.Nil
if roleName != "" {
role, err := dao.GetIdByName(ctx, s.db, roleName, &models.Role{})
if err != nil {
return &userv3.UserList{}, fmt.Errorf("unable to find role '%v'", roleName)
}
if rle, ok := role.(*models.Role); ok {
roleId = rle.ID
}
}
groupName := queryOptions.Group
groupId := uuid.Nil
if groupName != "" {
group, err := dao.GetIdByName(ctx, s.db, groupName, &models.Group{})
if err != nil {
return &userv3.UserList{}, fmt.Errorf("unable to find group '%v'", groupName)
}
if grp, ok := group.(*models.Group); ok {
groupId = grp.ID
}
}
projectIds := []uuid.UUID{}
if queryOptions.Project != "" {
projects = strings.Split(queryOptions.Project, ",")
for _, p := range strings.Split(queryOptions.Project, ",") {
if p == "ALL" {
projectIds = append(projectIds, uuid.Nil)
} else {
project, err := dao.GetIdByName(ctx, s.db, p, &models.Project{})
if err != nil {
return &userv3.UserList{}, fmt.Errorf("unable to find project '%v'", p)
}
if prj, ok := project.(*models.Project); ok {
projectIds = append(projectIds, prj.ID)
}
}
}
}
// TODO: make this a single big query
fupr, err := filterUserProjectRoles(upr,
projects,
"role-name", // TODO: add role to QueryOptions
// queryOptions.Role,
)
uids, err := dao.GetQueryFilteredUsers(ctx, s.db, partnerId, orgId, groupId, roleId, projectIds)
if err != nil {
return &userv3.UserList{}, err
}
fmt.Println("fupr:", fupr)
uids := []uuid.UUID{}
for k := range fupr {
uids = append(uids, k)
}
// TODO: add gorup to search
if queryOptions.Group {
// partnerId, organizationId, err := s.getPartnerOrganization(ctx, s.db, group)
// if err != nil {
// return nil, fmt.Errorf("unable to get partner and org id")
// }
ga := []models.GroupAccount{}
g, err := dao.Get(ctx, )
}
if len(fupr) != 0 {
if len(uids) != 0 {
var accs []models.KratosIdentities
// TODO: maybe merge this with the previous one into single sql
usrs, err := dao.ListFilteredUsers(ctx, s.db, &accs,
uids, queryOptions.Q,
queryOptions.OrderBy, queryOptions.Order,
+7 -53
View File
@@ -38,61 +38,15 @@ func remove(l []string, item string) []string {
return l
}
type projectRole struct {
Project *string
Role string
}
type userProjectRoles map[uuid.UUID][]projectRole
func getUserProjectRoles(ctx context.Context, db bun.IDB) (userProjectRoles, error) {
roles, err := dao.ListUserRoles(ctx, db)
func getPartnerOrganization(ctx context.Context, db bun.IDB, partner, org string) (uuid.UUID, uuid.UUID, error) {
partnerId, err := dao.GetPartnerId(ctx, db, partner)
if err != nil {
return userProjectRoles{}, err
return uuid.Nil, uuid.Nil, err
}
upr := userProjectRoles{}
for _, role := range roles {
upr[role.AccountId] = append(upr[role.AccountId], projectRole{Project: role.Project, Role: role.Role})
organizationId, err := dao.GetOrganizationId(ctx, db, org)
if err != nil {
return partnerId, uuid.Nil, err
}
return partnerId, organizationId, nil
return upr, nil
}
func projectAvailable(r []projectRole, projects []string) bool {
// This is an OR internally
// ALL is when the permissions is not project bound
all := false
if contains(projects, "ALL") {
all = true
projects = remove(projects, "ALL")
}
for _, pr := range r {
if pr.Project != nil {
if contains(projects, *pr.Project) {
return true
}
} else if all {
return true
}
}
return false
}
func roleAvailable(r []projectRole, role string) bool {
for _, pr := range r {
if pr.Role == role {
return true
}
}
return false
}
func filterUserProjectRoles(upr userProjectRoles, projects []string, role string) (userProjectRoles, error) {
fupr := userProjectRoles{}
for u, r := range upr {
if (len(projects) == 0 || projectAvailable(r, projects)) && (role == "" || roleAvailable(r, role)) {
fupr[u] = r
}
}
return fupr, nil
}
+131 -112
View File
@@ -762,34 +762,36 @@ type QueryOptions struct {
Partner string `protobuf:"bytes,4,opt,name=partner,proto3" json:"partner,omitempty"`
Organization string `protobuf:"bytes,5,opt,name=organization,proto3" json:"organization,omitempty"`
Project string `protobuf:"bytes,6,opt,name=project,proto3" json:"project,omitempty"`
Group string `protobuf:"bytes,7,opt,name=group,proto3" json:"group,omitempty"`
Role string `protobuf:"bytes,8,opt,name=role,proto3" json:"role,omitempty"`
// displayName only used for update queries to set displayName (READONLY)
DisplayName string `protobuf:"bytes,7,opt,name=displayName,proto3" json:"displayName,omitempty"`
DisplayName string `protobuf:"bytes,9,opt,name=displayName,proto3" json:"displayName,omitempty"`
// labels only used for update queries to set labels (READONLY)
Labels map[string]string `protobuf:"bytes,8,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
Labels map[string]string `protobuf:"bytes,10,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// annotations only used for update queries to set annotations (READONLY)
Annotations map[string]string `protobuf:"bytes,9,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
Count int64 `protobuf:"zigzag64,10,opt,name=count,proto3" json:"count,omitempty"`
Offset int64 `protobuf:"zigzag64,11,opt,name=offset,proto3" json:"offset,omitempty"`
Limit int64 `protobuf:"zigzag64,12,opt,name=limit,proto3" json:"limit,omitempty"`
Annotations map[string]string `protobuf:"bytes,11,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
Count int64 `protobuf:"zigzag64,12,opt,name=count,proto3" json:"count,omitempty"`
Offset int64 `protobuf:"zigzag64,13,opt,name=offset,proto3" json:"offset,omitempty"`
Limit int64 `protobuf:"zigzag64,14,opt,name=limit,proto3" json:"limit,omitempty"`
// ignoreScopeDefault ignores default values for partnerID, organizationID and
// projectID
IgnoreScopeDefault bool `protobuf:"varint,13,opt,name=ignoreScopeDefault,proto3" json:"ignoreScopeDefault,omitempty"`
IgnoreScopeDefault bool `protobuf:"varint,15,opt,name=ignoreScopeDefault,proto3" json:"ignoreScopeDefault,omitempty"`
// globalScope sets partnerID,organizationID,projectID = 0
GlobalScope bool `protobuf:"varint,14,opt,name=globalScope,proto3" json:"globalScope,omitempty"`
OrderBy string `protobuf:"bytes,15,opt,name=orderBy,proto3" json:"orderBy,omitempty"`
Order string `protobuf:"bytes,16,opt,name=order,proto3" json:"order,omitempty"`
Deleted bool `protobuf:"varint,17,opt,name=deleted,proto3" json:"deleted,omitempty"`
Extended bool `protobuf:"varint,18,opt,name=extended,proto3" json:"extended,omitempty"`
GlobalScope bool `protobuf:"varint,16,opt,name=globalScope,proto3" json:"globalScope,omitempty"`
OrderBy string `protobuf:"bytes,17,opt,name=orderBy,proto3" json:"orderBy,omitempty"`
Order string `protobuf:"bytes,18,opt,name=order,proto3" json:"order,omitempty"`
Deleted bool `protobuf:"varint,19,opt,name=deleted,proto3" json:"deleted,omitempty"`
Extended bool `protobuf:"varint,20,opt,name=extended,proto3" json:"extended,omitempty"`
// urlScope is supposed to be passed in the URL as kind/HashID(value)
UrlScope string `protobuf:"bytes,19,opt,name=urlScope,proto3" json:"urlScope,omitempty"`
IsSSOUser bool `protobuf:"varint,20,opt,name=isSSOUser,proto3" json:"isSSOUser,omitempty"`
Username string `protobuf:"bytes,21,opt,name=username,proto3" json:"username,omitempty"`
Groups []string `protobuf:"bytes,22,rep,name=groups,proto3" json:"groups,omitempty"`
BlueprintRef string `protobuf:"bytes,23,opt,name=blueprintRef,proto3" json:"blueprintRef,omitempty"`
PublishedVersion string `protobuf:"bytes,24,opt,name=publishedVersion,proto3" json:"publishedVersion,omitempty"`
ClusterID string `protobuf:"bytes,25,opt,name=clusterID,proto3" json:"clusterID,omitempty"`
ID string `protobuf:"bytes,26,opt,name=ID,proto3" json:"ID,omitempty"`
Account string `protobuf:"bytes,27,opt,name=account,proto3" json:"account,omitempty"`
UrlScope string `protobuf:"bytes,21,opt,name=urlScope,proto3" json:"urlScope,omitempty"`
IsSSOUser bool `protobuf:"varint,22,opt,name=isSSOUser,proto3" json:"isSSOUser,omitempty"`
Username string `protobuf:"bytes,23,opt,name=username,proto3" json:"username,omitempty"`
Groups []string `protobuf:"bytes,24,rep,name=groups,proto3" json:"groups,omitempty"`
BlueprintRef string `protobuf:"bytes,25,opt,name=blueprintRef,proto3" json:"blueprintRef,omitempty"`
PublishedVersion string `protobuf:"bytes,26,opt,name=publishedVersion,proto3" json:"publishedVersion,omitempty"`
ClusterID string `protobuf:"bytes,27,opt,name=clusterID,proto3" json:"clusterID,omitempty"`
ID string `protobuf:"bytes,28,opt,name=ID,proto3" json:"ID,omitempty"`
Account string `protobuf:"bytes,29,opt,name=account,proto3" json:"account,omitempty"`
}
func (x *QueryOptions) Reset() {
@@ -866,6 +868,20 @@ func (x *QueryOptions) GetProject() string {
return ""
}
func (x *QueryOptions) GetGroup() string {
if x != nil {
return x.Group
}
return ""
}
func (x *QueryOptions) GetRole() string {
if x != nil {
return x.Role
}
return ""
}
func (x *QueryOptions) GetDisplayName() string {
if x != nil {
return x.DisplayName
@@ -1287,7 +1303,7 @@ var file_proto_types_commonpb_v3_common_proto_rawDesc = []byte{
0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x3a, 0x25, 0x92, 0x41, 0x22, 0x0a, 0x20, 0x2a,
0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x32, 0x14, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20,
0x6f, 0x66, 0x20, 0x61, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x40, 0x01, 0x22,
0xec, 0x07, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x96, 0x08, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x12, 0x0c, 0x0a, 0x01, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x01, 0x71, 0x12, 0x12,
0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03,
@@ -1297,96 +1313,99 @@ var file_proto_types_commonpb_v3_common_proto_rawDesc = []byte{
0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c,
0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07,
0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70,
0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61,
0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73,
0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65,
0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x72, 0x61, 0x66, 0x61, 0x79,
0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
0x73, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c,
0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x5a, 0x0a, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x72, 0x61, 0x66,
0x61, 0x79, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d,
0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x74, 0x69,
0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45,
0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x12,
0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65,
0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x12, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12,
0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x12, 0x52, 0x05,
0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2e, 0x0a, 0x12, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x53,
0x63, 0x6f, 0x70, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28,
0x08, 0x52, 0x12, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x44, 0x65,
0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53,
0x63, 0x6f, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x67, 0x6c, 0x6f, 0x62,
0x61, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72,
0x42, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42,
0x79, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09,
0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74,
0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65,
0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x12, 0x20,
0x01, 0x28, 0x08, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x1a, 0x0a,
0x08, 0x75, 0x72, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52,
0x08, 0x75, 0x72, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x73, 0x53,
0x53, 0x4f, 0x55, 0x73, 0x65, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73,
0x53, 0x53, 0x4f, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e,
0x61, 0x6d, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e,
0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x16, 0x20,
0x03, 0x28, 0x09, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x62,
0x6c, 0x75, 0x65, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x18, 0x17, 0x20, 0x01, 0x28,
0x09, 0x52, 0x0c, 0x62, 0x6c, 0x75, 0x65, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x12,
0x2a, 0x0a, 0x10, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x56, 0x65, 0x72, 0x73,
0x69, 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x75, 0x62, 0x6c, 0x69,
0x73, 0x68, 0x65, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x63,
0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18,
0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63,
0x6f, 0x75, 0x6e, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f,
0x75, 0x6e, 0x74, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74,
0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20,
0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3e,
0x0a, 0x10, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74,
0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20,
0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x41,
0x0a, 0x08, 0x48, 0x74, 0x74, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f,
0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a,
0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74,
0x61, 0x2a, 0x58, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74,
0x61, 0x74, 0x75, 0x73, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4e, 0x6f,
0x74, 0x53, 0x65, 0x74, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x53,
0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, 0x4b, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x74, 0x61,
0x74, 0x75, 0x73, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x03, 0x2a, 0xa7, 0x01, 0x0a, 0x14,
0x52, 0x61, 0x66, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74,
0x61, 0x74, 0x75, 0x73, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x6f, 0x74, 0x53, 0x65, 0x74, 0x10, 0x00,
0x12, 0x0b, 0x0a, 0x07, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x12, 0x0e, 0x0a,
0x0a, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x10, 0x02, 0x12, 0x0b, 0x0a,
0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x61,
0x69, 0x6c, 0x65, 0x64, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x65, 0x74, 0x72, 0x79, 0x10,
0x05, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x10, 0x06, 0x12, 0x0b,
0x0a, 0x07, 0x53, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x10, 0x07, 0x12, 0x0b, 0x0a, 0x07, 0x45,
0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x10, 0x08, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x74, 0x6f, 0x70,
0x70, 0x69, 0x6e, 0x67, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74,
0x74, 0x65, 0x64, 0x10, 0x0a, 0x42, 0xf8, 0x01, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x61,
0x66, 0x61, 0x79, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f,
0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x33, 0x42, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x50,
0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
0x6f, 0x6d, 0x2f, 0x52, 0x61, 0x66, 0x61, 0x79, 0x4c, 0x61, 0x62, 0x73, 0x2f, 0x72, 0x63, 0x6c,
0x6f, 0x75, 0x64, 0x2d, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74,
0x79, 0x70, 0x65, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2f, 0x76, 0x33,
0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x76, 0x33, 0xa2, 0x02, 0x04, 0x52, 0x44, 0x54, 0x43,
0xaa, 0x02, 0x19, 0x52, 0x61, 0x66, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x76, 0x2e, 0x54, 0x79, 0x70,
0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x19, 0x52,
0x61, 0x66, 0x61, 0x79, 0x5c, 0x44, 0x65, 0x76, 0x5c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x5c, 0x43,
0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5c, 0x56, 0x33, 0xe2, 0x02, 0x25, 0x52, 0x61, 0x66, 0x61, 0x79,
0x5c, 0x44, 0x65, 0x76, 0x5c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x5c, 0x43, 0x6f, 0x6d, 0x6d, 0x6f,
0x6e, 0x5c, 0x56, 0x33, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
0xea, 0x02, 0x1d, 0x52, 0x61, 0x66, 0x61, 0x79, 0x3a, 0x3a, 0x44, 0x65, 0x76, 0x3a, 0x3a, 0x54,
0x79, 0x70, 0x65, 0x73, 0x3a, 0x3a, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x3a, 0x3a, 0x56, 0x33,
0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18,
0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04,
0x72, 0x6f, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65,
0x12, 0x20, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18,
0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61,
0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03,
0x28, 0x0b, 0x32, 0x33, 0x2e, 0x72, 0x61, 0x66, 0x61, 0x79, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74,
0x79, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x51,
0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x61, 0x62, 0x65,
0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12,
0x5a, 0x0a, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0b,
0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x72, 0x61, 0x66, 0x61, 0x79, 0x2e, 0x64, 0x65, 0x76,
0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x33,
0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x6e,
0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b,
0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63,
0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x12, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e,
0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28,
0x12, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d,
0x69, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x12, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12,
0x2e, 0x0a, 0x12, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x44, 0x65,
0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x67, 0x6e,
0x6f, 0x72, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12,
0x20, 0x0a, 0x0b, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x10,
0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x63, 0x6f, 0x70,
0x65, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x18, 0x11, 0x20, 0x01,
0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6f,
0x72, 0x64, 0x65, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65,
0x72, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x13, 0x20, 0x01,
0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65,
0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x65,
0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x72, 0x6c, 0x53, 0x63,
0x6f, 0x70, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x72, 0x6c, 0x53, 0x63,
0x6f, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x73, 0x53, 0x53, 0x4f, 0x55, 0x73, 0x65, 0x72,
0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, 0x53, 0x4f, 0x55, 0x73, 0x65,
0x72, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x17, 0x20,
0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a,
0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x18, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x67,
0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x62, 0x6c, 0x75, 0x65, 0x70, 0x72, 0x69,
0x6e, 0x74, 0x52, 0x65, 0x66, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x6c, 0x75,
0x65, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x12, 0x2a, 0x0a, 0x10, 0x70, 0x75, 0x62,
0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x1a, 0x20,
0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x56, 0x65,
0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72,
0x49, 0x44, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65,
0x72, 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52,
0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x1d,
0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x39, 0x0a,
0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,
0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14,
0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76,
0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6e, 0x6e, 0x6f,
0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,
0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14,
0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76,
0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x41, 0x0a, 0x08, 0x48, 0x74, 0x74, 0x70,
0x42, 0x6f, 0x64, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f,
0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74,
0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18,
0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x2a, 0x58, 0x0a, 0x0f, 0x43,
0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x10,
0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4e, 0x6f, 0x74, 0x53, 0x65, 0x74, 0x10, 0x00,
0x12, 0x13, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74,
0x74, 0x65, 0x64, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f,
0x4b, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x46, 0x61, 0x69,
0x6c, 0x65, 0x64, 0x10, 0x03, 0x2a, 0xa7, 0x01, 0x0a, 0x14, 0x52, 0x61, 0x66, 0x61, 0x79, 0x43,
0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0a,
0x0a, 0x06, 0x4e, 0x6f, 0x74, 0x53, 0x65, 0x74, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x65,
0x6e, 0x64, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x6e, 0x50, 0x72, 0x6f,
0x67, 0x72, 0x65, 0x73, 0x73, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65,
0x73, 0x73, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x04,
0x12, 0x09, 0x0a, 0x05, 0x52, 0x65, 0x74, 0x72, 0x79, 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x53,
0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x74, 0x6f, 0x70,
0x70, 0x65, 0x64, 0x10, 0x07, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64,
0x10, 0x08, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x74, 0x6f, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x10, 0x09,
0x12, 0x0d, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x10, 0x0a, 0x42,
0xf8, 0x01, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x61, 0x66, 0x61, 0x79, 0x2e, 0x64, 0x65,
0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76,
0x33, 0x42, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01,
0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x61, 0x66,
0x61, 0x79, 0x4c, 0x61, 0x62, 0x73, 0x2f, 0x72, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, 0x62, 0x61,
0x73, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x63,
0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2f, 0x76, 0x33, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
0x6e, 0x76, 0x33, 0xa2, 0x02, 0x04, 0x52, 0x44, 0x54, 0x43, 0xaa, 0x02, 0x19, 0x52, 0x61, 0x66,
0x61, 0x79, 0x2e, 0x44, 0x65, 0x76, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6d,
0x6d, 0x6f, 0x6e, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x19, 0x52, 0x61, 0x66, 0x61, 0x79, 0x5c, 0x44,
0x65, 0x76, 0x5c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x5c, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5c,
0x56, 0x33, 0xe2, 0x02, 0x25, 0x52, 0x61, 0x66, 0x61, 0x79, 0x5c, 0x44, 0x65, 0x76, 0x5c, 0x54,
0x79, 0x70, 0x65, 0x73, 0x5c, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5c, 0x56, 0x33, 0x5c, 0x47,
0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1d, 0x52, 0x61, 0x66,
0x61, 0x79, 0x3a, 0x3a, 0x44, 0x65, 0x76, 0x3a, 0x3a, 0x54, 0x79, 0x70, 0x65, 0x73, 0x3a, 0x3a,
0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x33,
}
var (
+23 -21
View File
@@ -249,35 +249,37 @@ message QueryOptions {
string partner = 4;
string organization = 5;
string project = 6;
string group = 7;
string role = 8;
// displayName only used for update queries to set displayName (READONLY)
string displayName = 7;
string displayName = 9;
// labels only used for update queries to set labels (READONLY)
map<string, string> labels = 8;
map<string, string> labels = 10;
// annotations only used for update queries to set annotations (READONLY)
map<string, string> annotations = 9;
sint64 count = 10;
sint64 offset = 11;
sint64 limit = 12;
map<string, string> annotations = 11;
sint64 count = 12;
sint64 offset = 13;
sint64 limit = 14;
// ignoreScopeDefault ignores default values for partnerID, organizationID and
// projectID
bool ignoreScopeDefault = 13;
bool ignoreScopeDefault = 15;
// globalScope sets partnerID,organizationID,projectID = 0
bool globalScope = 14;
string orderBy = 15;
string order = 16;
bool deleted = 17;
bool globalScope = 16;
string orderBy = 17;
string order = 18;
bool deleted = 19;
bool extended = 18;
bool extended = 20;
// urlScope is supposed to be passed in the URL as kind/HashID(value)
string urlScope = 19;
bool isSSOUser = 20;
string username = 21;
repeated string groups = 22;
string blueprintRef = 23;
string publishedVersion = 24;
string clusterID = 25;
string ID = 26;
string account = 27;
string urlScope = 21;
bool isSSOUser = 22;
string username = 23;
repeated string groups = 24;
string blueprintRef = 25;
string publishedVersion = 26;
string clusterID = 27;
string ID = 28;
string account = 29;
}
// RafayConditionStatus is the status of the status condition
+130
View File
@@ -0,0 +1,130 @@
DROP VIEW IF EXISTS sentry_permission;
CREATE OR REPLACE VIEW sentry_permission AS
SELECT
apr.account_id,
apr.group_id,
apr.project_id,
apr.organization_id,
apr.partner_id,
rbu.role_id,
rbu.is_global,
rbu.scope,
rbu.permission_name,
rbu.base_url,
rbu.urls
FROM (
SELECT
ga.account_id,
gr.group_id,
uuid_nil() project_id,
gr.role_id,
gr.organization_id,
gr.partner_id
FROM
authsrv_groupaccount ga
INNER JOIN authsrv_grouprole gr ON ga.group_id = gr.group_id
WHERE
ga.trash = FALSE
AND gr.trash = FALSE
UNION
SELECT
account_id,
uuid_nil() as group_id,
uuid_nil() project_id,
role_id,
organization_id,
partner_id
FROM
authsrv_accountresourcerole
WHERE
trash = FALSE
UNION
SELECT
ga.account_id,
ga.group_id,
pgr.project_id,
pgr.role_id,
pgr.organization_id,
pgr.partner_id
FROM
authsrv_projectgrouprole pgr
INNER JOIN authsrv_groupaccount ga ON pgr.group_id = ga.group_id
WHERE
pgr.trash = FALSE
AND ga.trash = FALSE
UNION
SELECT
account_id,
uuid_nil() as group_id,
project_id,
role_id,
organization_id,
partner_id
FROM
authsrv_projectaccountresourcerole
WHERE
trash = FALSE
UNION
SELECT
account_id,
uuid_nil() as group_id,
project_id,
role_id,
organization_id,
partner_id
FROM
authsrv_projectaccountnamespacerole
WHERE
trash = FALSE
UNION
SELECT
ga.account_id,
ga.group_id,
pgnr.project_id,
pgnr.role_id,
pgnr.organization_id,
pgnr.partner_id
FROM
authsrv_projectgroupnamespacerole pgnr
INNER JOIN authsrv_groupaccount ga ON pgnr.group_id = ga.group_id
WHERE
pgnr.trash = FALSE
AND ga.trash = FALSE) AS apr
INNER JOIN (
SELECT
rp.role_id,
rr.role_name,
rr.is_global,
rr.scope,
p.permission_name,
p.base_url,
p.urls
FROM (
SELECT
resource_role_id AS role_id,
resource_permission_id AS permission_id
FROM
authsrv_resourcerolepermission
WHERE
trash = FALSE) rp
INNER JOIN (
SELECT
rp.id AS permission_id,
rp.base_url,
rp.name AS permission_name,
rp.resource_urls || rp.resource_action_urls AS urls
FROM
authsrv_resourcepermission rp) p ON rp.permission_id = p.permission_id
INNER JOIN (
SELECT
id,
name AS role_name,
is_global,
scope
FROM
authsrv_resourcerole
WHERE
trash = FALSE) rr ON rr.id = rp.role_id) rbu ON apr.role_id = rbu.role_id
INNER JOIN identities ON identities.id = apr.account_id
WHERE
lower(identities.state) = 'active';