Update API role tests and fix the structure of the protos so versioning works
This commit is contained in:
1 parent
f1b3ad373e
commit
827d86bef1
7 files changed
+887
-651
No files matched your search
+186
-144
@@ -1,45 +1,63 @@
|
||||
package roles_test
|
||||
|
||||
/*
|
||||
type roleCrud interface {
|
||||
CreateGroup(context.Context, *groups.Group) (*groups.Group, *api.Error, error)
|
||||
CreateRole(context.Context, *roles.Role) (*roles.Role, *api.Error, error)
|
||||
ReadRole(context.Context, *roles.Role) (*roles.Role, *api.Error, error)
|
||||
UpdateRole(context.Context, *roles.Role) (*roles.Role, *api.Error, error)
|
||||
DeleteRole(context.Context, *roles.Role) (bool, *api.Error, error)
|
||||
ListRoles(ctx context.Context) ([]*roles.Role, *api.Error, error)
|
||||
}
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/watchtower/api"
|
||||
"github.com/hashicorp/watchtower/api/groups"
|
||||
"github.com/hashicorp/watchtower/api/internal/strutil"
|
||||
"github.com/hashicorp/watchtower/api/roles"
|
||||
"github.com/hashicorp/watchtower/api/scopes"
|
||||
"github.com/hashicorp/watchtower/api/users"
|
||||
"github.com/hashicorp/watchtower/internal/iam"
|
||||
"github.com/hashicorp/watchtower/internal/servers/controller"
|
||||
"github.com/kr/pretty"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestCustom(t *testing.T) {
|
||||
tc := controller.NewTestController(t, &controller.TestControllerOpts{DisableAuthorizationFailures: true})
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
orgId := "o_1234567890"
|
||||
amId := "paum_1234567890"
|
||||
tc := controller.NewTestController(t, &controller.TestControllerOpts{
|
||||
DisableAuthorizationFailures: true,
|
||||
DefaultOrgId: orgId,
|
||||
DefaultAuthMethodId: amId,
|
||||
DefaultUsername: "user",
|
||||
DefaultPassword: "passpass",
|
||||
})
|
||||
defer tc.Shutdown()
|
||||
|
||||
client := tc.Client()
|
||||
org := &scopes.Org{
|
||||
Client: client,
|
||||
}
|
||||
proj, apiErr, err := org.CreateProject(context.Background(), &scopes.Project{})
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, apiErr)
|
||||
|
||||
user, apiErr, err := org.CreateUser(context.Background(), &users.User{})
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, apiErr)
|
||||
proj, apiErr, err := scopes.NewScopesClient(client).Create(tc.Context(), orgId)
|
||||
require.NoError(err)
|
||||
require.Nil(apiErr)
|
||||
|
||||
projClient := client.Clone()
|
||||
projClient.SetScopeId(proj.Id)
|
||||
|
||||
cases := []struct {
|
||||
name string
|
||||
scope roleCrud
|
||||
name string
|
||||
scopeClient *api.Client
|
||||
}{
|
||||
{
|
||||
name: "org",
|
||||
scope: org,
|
||||
name: "org",
|
||||
scopeClient: client,
|
||||
},
|
||||
{
|
||||
name: "proj",
|
||||
scope: proj,
|
||||
name: "proj",
|
||||
scopeClient: projClient,
|
||||
},
|
||||
}
|
||||
|
||||
user, apiErr, err := users.NewUsersClient(client).Create(tc.Context())
|
||||
require.NoError(err)
|
||||
require.Nil(apiErr)
|
||||
|
||||
hasPrincipal := func(role *roles.Role, principalId string) bool {
|
||||
var foundInPrincipals bool
|
||||
var foundInPrincipalIds bool
|
||||
@@ -56,100 +74,112 @@ func TestCustom(t *testing.T) {
|
||||
return foundInPrincipals && foundInPrincipalIds
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
require := require.New(t)
|
||||
ctx := context.Background()
|
||||
g, apiErr, err := tc.scope.CreateGroup(ctx, &groups.Group{})
|
||||
for _, tt := range cases {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
g, apiErr, err := groups.NewGroupsClient(tt.scopeClient).Create(tc.Context())
|
||||
require.NoError(err)
|
||||
require.Nil(apiErr)
|
||||
require.NotNil(g)
|
||||
|
||||
r, apiErr, err := tc.scope.CreateRole(ctx, &roles.Role{Name: api.String("foo")})
|
||||
rc := roles.NewRolesClient(tt.scopeClient)
|
||||
var version uint32 = 1
|
||||
|
||||
r, apiErr, err := rc.Create(tc.Context(), roles.WithName("foo"))
|
||||
require.NoError(err)
|
||||
require.Nil(apiErr)
|
||||
require.NotNil(r)
|
||||
require.EqualValues(r.Version, version)
|
||||
version++
|
||||
|
||||
updatedRole, apiErr, err := r.AddPrincipals(ctx, []string{g.Id})
|
||||
updatedRole, apiErr, err := rc.AddPrincipals(tc.Context(), r.Id, r.Version, []string{g.Id})
|
||||
require.NoError(err)
|
||||
require.Nil(apiErr, "Got error ", pretty.Sprint(apiErr))
|
||||
assert.EqualValues(updatedRole.Version, version)
|
||||
assert.True(hasPrincipal(updatedRole, g.Id))
|
||||
version++
|
||||
|
||||
updatedRole, apiErr, err = rc.SetPrincipals(tc.Context(), updatedRole.Id, updatedRole.Version, []string{user.Id})
|
||||
require.NoError(err)
|
||||
require.Nil(apiErr, "Got error ", apiErr)
|
||||
assert.Equal(t, updatedRole.Version, r.Version+1)
|
||||
assert.True(t, hasPrincipal(updatedRole, g.Id))
|
||||
assert.EqualValues(updatedRole.Version, version)
|
||||
assert.True(hasPrincipal(updatedRole, user.Id))
|
||||
version++
|
||||
|
||||
r = updatedRole
|
||||
updatedRole, apiErr, err = r.SetPrincipals(ctx, []string{user.Id})
|
||||
updatedRole, apiErr, err = rc.RemovePrincipals(tc.Context(), updatedRole.Id, updatedRole.Version, []string{user.Id})
|
||||
require.NoError(err)
|
||||
require.Nil(apiErr, "Got error ", apiErr)
|
||||
assert.Equal(t, updatedRole.Version, r.Version+1)
|
||||
assert.True(t, hasPrincipal(updatedRole, user.Id))
|
||||
assert.EqualValues(updatedRole.Version, version)
|
||||
assert.Empty(updatedRole.Principals)
|
||||
version++
|
||||
|
||||
r = updatedRole
|
||||
updatedRole, apiErr, err = r.RemovePrincipals(ctx, []string{user.Id})
|
||||
updatedRole, apiErr, err = rc.AddGrants(tc.Context(), updatedRole.Id, updatedRole.Version, []string{"id=*;actions=read"})
|
||||
require.NoError(err)
|
||||
require.Nil(apiErr, "Got error ", apiErr)
|
||||
assert.Equal(t, updatedRole.Version, r.Version+1)
|
||||
assert.Empty(t, updatedRole.Principals)
|
||||
assert.EqualValues(updatedRole.Version, version)
|
||||
assert.Contains(updatedRole.GrantStrings, "id=*;actions=read")
|
||||
version++
|
||||
|
||||
r = updatedRole
|
||||
updatedRole, apiErr, err = r.AddGrants(ctx, []string{"id=*;actions=read"})
|
||||
updatedRole, apiErr, err = rc.SetGrants(tc.Context(), updatedRole.Id, updatedRole.Version, []string{"id=*;actions=*"})
|
||||
require.NoError(err)
|
||||
require.Nil(apiErr, "Got error ", apiErr)
|
||||
assert.Equal(t, updatedRole.Version, r.Version+1)
|
||||
assert.Contains(t, updatedRole.GrantStrings, "id=*;actions=read")
|
||||
assert.EqualValues(updatedRole.Version, version)
|
||||
assert.Contains(updatedRole.GrantStrings, "id=*;actions=*")
|
||||
version++
|
||||
|
||||
r = updatedRole
|
||||
updatedRole, apiErr, err = r.SetGrants(ctx, []string{"id=*;actions=*"})
|
||||
updatedRole, apiErr, err = rc.RemoveGrants(tc.Context(), updatedRole.Id, updatedRole.Version, []string{"id=*;actions=*"})
|
||||
require.NoError(err)
|
||||
require.Nil(apiErr, "Got error ", apiErr)
|
||||
assert.Equal(t, updatedRole.Version, r.Version+1)
|
||||
assert.Contains(t, updatedRole.GrantStrings, "id=*;actions=*")
|
||||
|
||||
r = updatedRole
|
||||
updatedRole, apiErr, err = r.RemoveGrants(ctx, []string{"id=*;actions=*"})
|
||||
require.NoError(err)
|
||||
require.Nil(apiErr, "Got error ", apiErr)
|
||||
assert.Equal(t, updatedRole.Version, r.Version+1)
|
||||
assert.Empty(t, updatedRole.Grants)
|
||||
assert.EqualValues(updatedRole.Version, version)
|
||||
assert.Empty(updatedRole.Grants)
|
||||
version++
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestRole_List(t *testing.T) {
|
||||
tc := controller.NewTestController(t, &controller.TestControllerOpts{DisableAuthorizationFailures: true})
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
orgId := "o_1234567890"
|
||||
amId := "paum_1234567890"
|
||||
tc := controller.NewTestController(t, &controller.TestControllerOpts{
|
||||
DisableAuthorizationFailures: true,
|
||||
DefaultOrgId: orgId,
|
||||
DefaultAuthMethodId: amId,
|
||||
DefaultUsername: "user",
|
||||
DefaultPassword: "passpass",
|
||||
})
|
||||
defer tc.Shutdown()
|
||||
|
||||
client := tc.Client()
|
||||
org := &scopes.Org{
|
||||
Client: client,
|
||||
}
|
||||
proj, apiErr, err := org.CreateProject(context.Background(), &scopes.Project{})
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, apiErr)
|
||||
|
||||
proj, apiErr, err := scopes.NewScopesClient(client).Create(tc.Context(), orgId)
|
||||
require.NoError(err)
|
||||
require.Nil(apiErr)
|
||||
|
||||
projClient := client.Clone()
|
||||
projClient.SetScopeId(proj.Id)
|
||||
|
||||
cases := []struct {
|
||||
name string
|
||||
scope roleCrud
|
||||
name string
|
||||
scopeClient *api.Client
|
||||
}{
|
||||
{
|
||||
name: "org",
|
||||
scope: org,
|
||||
name: "org",
|
||||
scopeClient: client,
|
||||
},
|
||||
{
|
||||
name: "proj",
|
||||
scope: proj,
|
||||
name: "proj",
|
||||
scopeClient: projClient,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
ctx := context.Background()
|
||||
|
||||
p1, apiErr, err := tc.scope.ListRoles(ctx)
|
||||
for _, tt := range cases {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
roleClient := roles.NewRolesClient(tt.scopeClient)
|
||||
p1, apiErr, err := roleClient.List(tc.Context())
|
||||
require.NoError(err)
|
||||
assert.Nil(apiErr)
|
||||
var defaultRoleIds []string
|
||||
if tc.name == "org" {
|
||||
if tt.name == "org" {
|
||||
require.True(2 == len(p1))
|
||||
defaultRoleIds = []string{p1[0].Id, p1[1].Id}
|
||||
} else {
|
||||
@@ -158,14 +188,14 @@ func TestRole_List(t *testing.T) {
|
||||
|
||||
var expected []*roles.Role
|
||||
for i := 0; i < 10; i++ {
|
||||
expected = append(expected, &roles.Role{Name: api.String(fmt.Sprint(i))})
|
||||
expected = append(expected, &roles.Role{Name: fmt.Sprint(i)})
|
||||
}
|
||||
|
||||
expected[0], apiErr, err = tc.scope.CreateRole(ctx, expected[0])
|
||||
expected[0], apiErr, err = roleClient.Create(tc.Context(), roles.WithName(expected[0].Name))
|
||||
require.NoError(err)
|
||||
assert.Nil(apiErr)
|
||||
|
||||
p2, apiErr, err := tc.scope.ListRoles(ctx)
|
||||
p2, apiErr, err := roleClient.List(tc.Context())
|
||||
assert.NoError(err)
|
||||
assert.Nil(apiErr)
|
||||
var p2ForComparison []*roles.Role
|
||||
@@ -177,11 +207,11 @@ func TestRole_List(t *testing.T) {
|
||||
assert.ElementsMatch(comparableSlice(expected[:1]), comparableSlice(p2ForComparison))
|
||||
|
||||
for i := 1; i < 10; i++ {
|
||||
expected[i], apiErr, err = tc.scope.CreateRole(ctx, expected[i])
|
||||
expected[i], apiErr, err = roleClient.Create(tc.Context(), roles.WithName(expected[i].Name))
|
||||
assert.NoError(err)
|
||||
assert.Nil(apiErr)
|
||||
}
|
||||
p3, apiErr, err := tc.scope.ListRoles(ctx)
|
||||
p3, apiErr, err := roleClient.List(tc.Context())
|
||||
require.NoError(err)
|
||||
assert.Nil(apiErr)
|
||||
var p3ForComparison []*roles.Role
|
||||
@@ -212,71 +242,76 @@ func comparableSlice(in []*roles.Role) []roles.Role {
|
||||
}
|
||||
|
||||
func TestRole_Crud(t *testing.T) {
|
||||
tc := controller.NewTestController(t, &controller.TestControllerOpts{DisableAuthorizationFailures: true})
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
orgId := "o_1234567890"
|
||||
amId := "paum_1234567890"
|
||||
tc := controller.NewTestController(t, &controller.TestControllerOpts{
|
||||
DisableAuthorizationFailures: true,
|
||||
DefaultOrgId: orgId,
|
||||
DefaultAuthMethodId: amId,
|
||||
DefaultUsername: "user",
|
||||
DefaultPassword: "passpass",
|
||||
})
|
||||
defer tc.Shutdown()
|
||||
|
||||
client := tc.Client()
|
||||
org := &scopes.Org{
|
||||
Client: client,
|
||||
|
||||
proj, apiErr, err := scopes.NewScopesClient(client).Create(tc.Context(), orgId)
|
||||
require.NoError(err)
|
||||
require.Nil(apiErr)
|
||||
|
||||
projClient := client.Clone()
|
||||
projClient.SetScopeId(proj.Id)
|
||||
|
||||
cases := []struct {
|
||||
name string
|
||||
scopeClient *api.Client
|
||||
}{
|
||||
{
|
||||
name: "org",
|
||||
scopeClient: client,
|
||||
},
|
||||
{
|
||||
name: "proj",
|
||||
scopeClient: projClient,
|
||||
},
|
||||
}
|
||||
|
||||
proj, apiErr, err := org.CreateProject(tc.Context(), &scopes.Project{})
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, apiErr)
|
||||
|
||||
checkRole := func(step string, g *roles.Role, apiErr *api.Error, err error, wantedName string) {
|
||||
assert := assert.New(t)
|
||||
checkRole := func(step string, g *roles.Role, apiErr *api.Error, err error, wantedName string, wantedVersion uint32) {
|
||||
assert.NoError(err, step)
|
||||
if !assert.Nil(apiErr, step) && apiErr.Message != "" {
|
||||
t.Errorf("ApiError message: %q", apiErr.Message)
|
||||
}
|
||||
assert.NotNil(g, "returned no resource", step)
|
||||
gotName := ""
|
||||
if g.Name != nil {
|
||||
gotName = *g.Name
|
||||
if g.Name != "" {
|
||||
gotName = g.Name
|
||||
}
|
||||
assert.Equal(wantedName, gotName, step)
|
||||
}
|
||||
|
||||
cases := []struct {
|
||||
name string
|
||||
scope roleCrud
|
||||
}{
|
||||
{
|
||||
name: "org",
|
||||
scope: org,
|
||||
},
|
||||
{
|
||||
name: "project",
|
||||
scope: proj,
|
||||
},
|
||||
assert.EqualValues(wantedVersion, g.Version)
|
||||
}
|
||||
|
||||
for _, tt := range cases {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
g, apiErr, err := tt.scope.CreateRole(tc.Context(), &roles.Role{Name: api.String("foo")})
|
||||
checkRole("create", g, apiErr, err, "foo")
|
||||
roleClient := roles.NewRolesClient(tt.scopeClient)
|
||||
g, apiErr, err := roleClient.Create(tc.Context(), roles.WithName("foo"))
|
||||
checkRole("create", g, apiErr, err, "foo", 1)
|
||||
|
||||
g, apiErr, err = tt.scope.ReadRole(tc.Context(), &roles.Role{Id: g.Id})
|
||||
checkRole("read", g, apiErr, err, "foo")
|
||||
g, apiErr, err = roleClient.Read(tc.Context(), g.Id)
|
||||
checkRole("read", g, apiErr, err, "foo", 1)
|
||||
|
||||
g = &roles.Role{Id: g.Id}
|
||||
g.Name = api.String("bar")
|
||||
g, apiErr, err = tt.scope.UpdateRole(tc.Context(), g)
|
||||
checkRole("update", g, apiErr, err, "bar")
|
||||
g, apiErr, err = roleClient.Update(tc.Context(), g.Id, g.Version, roles.WithName("bar"))
|
||||
checkRole("update", g, apiErr, err, "bar", 2)
|
||||
|
||||
g = &roles.Role{Id: g.Id}
|
||||
g.SetDefault("name")
|
||||
g, apiErr, err = tt.scope.UpdateRole(tc.Context(), g)
|
||||
checkRole("update", g, apiErr, err, "")
|
||||
g, apiErr, err = roleClient.Update(tc.Context(), g.Id, g.Version, roles.DefaultName())
|
||||
checkRole("update", g, apiErr, err, "", 3)
|
||||
|
||||
existed, apiErr, err := tt.scope.DeleteRole(tc.Context(), g)
|
||||
existed, apiErr, err := roleClient.Delete(tc.Context(), g.Id)
|
||||
require.NoError(err)
|
||||
assert.Nil(apiErr)
|
||||
assert.True(existed, "Expected existing user when deleted, but it wasn't.")
|
||||
|
||||
existed, apiErr, err = tt.scope.DeleteRole(tc.Context(), g)
|
||||
existed, apiErr, err = roleClient.Delete(tc.Context(), g.Id)
|
||||
require.NoError(err)
|
||||
assert.Nil(apiErr)
|
||||
assert.False(existed, "Expected user to not exist when deleted, but it did.")
|
||||
@@ -285,61 +320,68 @@ func TestRole_Crud(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestRole_Errors(t *testing.T) {
|
||||
tc := controller.NewTestController(t, &controller.TestControllerOpts{DisableAuthorizationFailures: true})
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
orgId := "o_1234567890"
|
||||
amId := "paum_1234567890"
|
||||
tc := controller.NewTestController(t, &controller.TestControllerOpts{
|
||||
DisableAuthorizationFailures: true,
|
||||
DefaultOrgId: orgId,
|
||||
DefaultAuthMethodId: amId,
|
||||
DefaultUsername: "user",
|
||||
DefaultPassword: "passpass",
|
||||
})
|
||||
defer tc.Shutdown()
|
||||
ctx := tc.Context()
|
||||
|
||||
client := tc.Client()
|
||||
org := &scopes.Org{
|
||||
Client: client,
|
||||
}
|
||||
|
||||
proj, apiErr, err := org.CreateProject(tc.Context(), &scopes.Project{})
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, apiErr)
|
||||
proj, apiErr, err := scopes.NewScopesClient(client).Create(tc.Context(), orgId)
|
||||
require.NoError(err)
|
||||
require.Nil(apiErr)
|
||||
|
||||
projClient := client.Clone()
|
||||
projClient.SetScopeId(proj.Id)
|
||||
|
||||
cases := []struct {
|
||||
name string
|
||||
scope roleCrud
|
||||
name string
|
||||
scopeClient *api.Client
|
||||
}{
|
||||
{
|
||||
name: "org",
|
||||
scope: org,
|
||||
name: "org",
|
||||
scopeClient: client,
|
||||
},
|
||||
{
|
||||
name: "project",
|
||||
scope: proj,
|
||||
name: "proj",
|
||||
scopeClient: projClient,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range cases {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
u, apiErr, err := tt.scope.CreateRole(ctx, &roles.Role{Name: api.String("first")})
|
||||
roleClient := roles.NewRolesClient(tt.scopeClient)
|
||||
u, apiErr, err := roleClient.Create(tc.Context(), roles.WithName("first"))
|
||||
require.NoError(err)
|
||||
assert.Nil(apiErr)
|
||||
assert.NotNil(u)
|
||||
|
||||
// Create another resource with the same name.
|
||||
_, apiErr, err = tt.scope.CreateRole(ctx, &roles.Role{Name: api.String("first")})
|
||||
_, apiErr, err = roleClient.Create(tc.Context(), roles.WithName("first"))
|
||||
require.NoError(err)
|
||||
assert.NotNil(apiErr)
|
||||
|
||||
_, apiErr, err = tt.scope.ReadRole(ctx, &roles.Role{Id: iam.RolePrefix + "_doesntexis"})
|
||||
_, apiErr, err = roleClient.Read(tc.Context(), iam.RolePrefix+"_doesntexis")
|
||||
require.NoError(err)
|
||||
assert.NotNil(apiErr)
|
||||
assert.EqualValues(http.StatusNotFound, apiErr.Status)
|
||||
|
||||
_, apiErr, err = tt.scope.ReadRole(ctx, &roles.Role{Id: "invalid id"})
|
||||
_, apiErr, err = roleClient.Read(tc.Context(), "invalid id")
|
||||
require.NoError(err)
|
||||
assert.NotNil(apiErr)
|
||||
assert.EqualValues(http.StatusBadRequest, apiErr.Status)
|
||||
assert.EqualValues(http.StatusForbidden, apiErr.Status)
|
||||
|
||||
_, apiErr, err = tt.scope.UpdateRole(ctx, &roles.Role{Id: u.Id})
|
||||
_, apiErr, err = roleClient.Update(tc.Context(), u.Id, u.Version)
|
||||
require.NoError(err)
|
||||
assert.NotNil(apiErr)
|
||||
assert.EqualValues(http.StatusBadRequest, apiErr.Status)
|
||||
})
|
||||
}
|
||||
}
|
||||
*/
|
||||
@@ -1410,7 +1410,7 @@
|
||||
"in": "body",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"$ref": "#/definitions/controller.api.services.v1.AddRoleGrantsRequest"
|
||||
"$ref": "#/definitions/controller.api.services.v1.GrantStringsMessage"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -1443,7 +1443,7 @@
|
||||
"in": "body",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"$ref": "#/definitions/controller.api.services.v1.AddRolePrincipalsRequest"
|
||||
"$ref": "#/definitions/controller.api.services.v1.PrincipalIdsMessage"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -1476,7 +1476,7 @@
|
||||
"in": "body",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"$ref": "#/definitions/controller.api.services.v1.RemoveRoleGrantsRequest"
|
||||
"$ref": "#/definitions/controller.api.services.v1.GrantStringsMessage"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -1509,7 +1509,7 @@
|
||||
"in": "body",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"$ref": "#/definitions/controller.api.services.v1.RemoveRolePrincipalsRequest"
|
||||
"$ref": "#/definitions/controller.api.services.v1.PrincipalIdsMessage"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -1542,7 +1542,7 @@
|
||||
"in": "body",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"$ref": "#/definitions/controller.api.services.v1.SetRoleGrantsRequest"
|
||||
"$ref": "#/definitions/controller.api.services.v1.GrantStringsMessage"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -1575,7 +1575,7 @@
|
||||
"in": "body",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"$ref": "#/definitions/controller.api.services.v1.SetRolePrincipalsRequest"
|
||||
"$ref": "#/definitions/controller.api.services.v1.PrincipalIdsMessage"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -2496,25 +2496,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"controller.api.services.v1.AddRoleGrantsRequest": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"role_id": {
|
||||
"type": "string"
|
||||
},
|
||||
"version": {
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "The version ensures the role hasn't changed since it was last retrieved and if\nit has the request will fail."
|
||||
},
|
||||
"grant_strings": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"controller.api.services.v1.AddRoleGrantsResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -2523,25 +2504,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"controller.api.services.v1.AddRolePrincipalsRequest": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"role_id": {
|
||||
"type": "string"
|
||||
},
|
||||
"version": {
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "The version ensures the role hasn't changed since it was last retrieved and if\nit has the request will fail."
|
||||
},
|
||||
"principal_ids": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"controller.api.services.v1.AddRolePrincipalsResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -2847,6 +2809,17 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"controller.api.services.v1.GrantStringsMessage": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"grant_strings": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"controller.api.services.v1.ListAccountsResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -2957,6 +2930,17 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"controller.api.services.v1.PrincipalIdsMessage": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"principal_ids": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"controller.api.services.v1.RemoveFromHostSetResponse": {
|
||||
"type": "object"
|
||||
},
|
||||
@@ -2987,25 +2971,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"controller.api.services.v1.RemoveRoleGrantsRequest": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"role_id": {
|
||||
"type": "string"
|
||||
},
|
||||
"version": {
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "The version ensures the role hasn't changed since it was last retrieved and if\nit has the request will fail."
|
||||
},
|
||||
"grant_strings": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"controller.api.services.v1.RemoveRoleGrantsResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -3014,25 +2979,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"controller.api.services.v1.RemoveRolePrincipalsRequest": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"role_id": {
|
||||
"type": "string"
|
||||
},
|
||||
"version": {
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "The version ensures the role hasn't changed since it was last retrieved and if\nit has the request will fail."
|
||||
},
|
||||
"principal_ids": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"controller.api.services.v1.RemoveRolePrincipalsResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -3068,25 +3014,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"controller.api.services.v1.SetRoleGrantsRequest": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"role_id": {
|
||||
"type": "string"
|
||||
},
|
||||
"version": {
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "The version ensures the role hasn't changed since it was last retrieved and if\nit has the request will fail."
|
||||
},
|
||||
"grant_strings": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"controller.api.services.v1.SetRoleGrantsResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -3095,25 +3022,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"controller.api.services.v1.SetRolePrincipalsRequest": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"role_id": {
|
||||
"type": "string"
|
||||
},
|
||||
"version": {
|
||||
"type": "integer",
|
||||
"format": "int64",
|
||||
"description": "The version ensures the role hasn't changed since it was last retrieved and if\nit has the request will fail."
|
||||
},
|
||||
"principal_ids": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"controller.api.services.v1.SetRolePrincipalsResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -327,6 +327,10 @@ func local_request_RoleService_DeleteRole_0(ctx context.Context, marshaler runti
|
||||
|
||||
}
|
||||
|
||||
var (
|
||||
filter_RoleService_AddRolePrincipals_0 = &utilities.DoubleArray{Encoding: map[string]int{"item": 0, "role_id": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}}
|
||||
)
|
||||
|
||||
func request_RoleService_AddRolePrincipals_0(ctx context.Context, marshaler runtime.Marshaler, client RoleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq AddRolePrincipalsRequest
|
||||
var metadata runtime.ServerMetadata
|
||||
@@ -335,7 +339,7 @@ func request_RoleService_AddRolePrincipals_0(ctx context.Context, marshaler runt
|
||||
if berr != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
|
||||
}
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Item); err != nil && err != io.EOF {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
@@ -357,6 +361,13 @@ func request_RoleService_AddRolePrincipals_0(ctx context.Context, marshaler runt
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role_id", err)
|
||||
}
|
||||
|
||||
if err := req.ParseForm(); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_AddRolePrincipals_0); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
msg, err := client.AddRolePrincipals(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
|
||||
return msg, metadata, err
|
||||
|
||||
@@ -370,7 +381,7 @@ func local_request_RoleService_AddRolePrincipals_0(ctx context.Context, marshale
|
||||
if berr != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
|
||||
}
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Item); err != nil && err != io.EOF {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
@@ -392,11 +403,22 @@ func local_request_RoleService_AddRolePrincipals_0(ctx context.Context, marshale
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role_id", err)
|
||||
}
|
||||
|
||||
if err := req.ParseForm(); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_AddRolePrincipals_0); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
msg, err := server.AddRolePrincipals(ctx, &protoReq)
|
||||
return msg, metadata, err
|
||||
|
||||
}
|
||||
|
||||
var (
|
||||
filter_RoleService_SetRolePrincipals_0 = &utilities.DoubleArray{Encoding: map[string]int{"item": 0, "role_id": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}}
|
||||
)
|
||||
|
||||
func request_RoleService_SetRolePrincipals_0(ctx context.Context, marshaler runtime.Marshaler, client RoleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq SetRolePrincipalsRequest
|
||||
var metadata runtime.ServerMetadata
|
||||
@@ -405,7 +427,7 @@ func request_RoleService_SetRolePrincipals_0(ctx context.Context, marshaler runt
|
||||
if berr != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
|
||||
}
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Item); err != nil && err != io.EOF {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
@@ -427,6 +449,13 @@ func request_RoleService_SetRolePrincipals_0(ctx context.Context, marshaler runt
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role_id", err)
|
||||
}
|
||||
|
||||
if err := req.ParseForm(); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_SetRolePrincipals_0); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
msg, err := client.SetRolePrincipals(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
|
||||
return msg, metadata, err
|
||||
|
||||
@@ -440,7 +469,7 @@ func local_request_RoleService_SetRolePrincipals_0(ctx context.Context, marshale
|
||||
if berr != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
|
||||
}
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Item); err != nil && err != io.EOF {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
@@ -462,11 +491,22 @@ func local_request_RoleService_SetRolePrincipals_0(ctx context.Context, marshale
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role_id", err)
|
||||
}
|
||||
|
||||
if err := req.ParseForm(); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_SetRolePrincipals_0); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
msg, err := server.SetRolePrincipals(ctx, &protoReq)
|
||||
return msg, metadata, err
|
||||
|
||||
}
|
||||
|
||||
var (
|
||||
filter_RoleService_RemoveRolePrincipals_0 = &utilities.DoubleArray{Encoding: map[string]int{"item": 0, "role_id": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}}
|
||||
)
|
||||
|
||||
func request_RoleService_RemoveRolePrincipals_0(ctx context.Context, marshaler runtime.Marshaler, client RoleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq RemoveRolePrincipalsRequest
|
||||
var metadata runtime.ServerMetadata
|
||||
@@ -475,7 +515,7 @@ func request_RoleService_RemoveRolePrincipals_0(ctx context.Context, marshaler r
|
||||
if berr != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
|
||||
}
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Item); err != nil && err != io.EOF {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
@@ -497,6 +537,13 @@ func request_RoleService_RemoveRolePrincipals_0(ctx context.Context, marshaler r
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role_id", err)
|
||||
}
|
||||
|
||||
if err := req.ParseForm(); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_RemoveRolePrincipals_0); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
msg, err := client.RemoveRolePrincipals(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
|
||||
return msg, metadata, err
|
||||
|
||||
@@ -510,7 +557,7 @@ func local_request_RoleService_RemoveRolePrincipals_0(ctx context.Context, marsh
|
||||
if berr != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
|
||||
}
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Item); err != nil && err != io.EOF {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
@@ -532,11 +579,22 @@ func local_request_RoleService_RemoveRolePrincipals_0(ctx context.Context, marsh
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role_id", err)
|
||||
}
|
||||
|
||||
if err := req.ParseForm(); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_RemoveRolePrincipals_0); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
msg, err := server.RemoveRolePrincipals(ctx, &protoReq)
|
||||
return msg, metadata, err
|
||||
|
||||
}
|
||||
|
||||
var (
|
||||
filter_RoleService_AddRoleGrants_0 = &utilities.DoubleArray{Encoding: map[string]int{"item": 0, "role_id": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}}
|
||||
)
|
||||
|
||||
func request_RoleService_AddRoleGrants_0(ctx context.Context, marshaler runtime.Marshaler, client RoleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq AddRoleGrantsRequest
|
||||
var metadata runtime.ServerMetadata
|
||||
@@ -545,7 +603,7 @@ func request_RoleService_AddRoleGrants_0(ctx context.Context, marshaler runtime.
|
||||
if berr != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
|
||||
}
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Item); err != nil && err != io.EOF {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
@@ -567,6 +625,13 @@ func request_RoleService_AddRoleGrants_0(ctx context.Context, marshaler runtime.
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role_id", err)
|
||||
}
|
||||
|
||||
if err := req.ParseForm(); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_AddRoleGrants_0); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
msg, err := client.AddRoleGrants(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
|
||||
return msg, metadata, err
|
||||
|
||||
@@ -580,7 +645,7 @@ func local_request_RoleService_AddRoleGrants_0(ctx context.Context, marshaler ru
|
||||
if berr != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
|
||||
}
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Item); err != nil && err != io.EOF {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
@@ -602,11 +667,22 @@ func local_request_RoleService_AddRoleGrants_0(ctx context.Context, marshaler ru
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role_id", err)
|
||||
}
|
||||
|
||||
if err := req.ParseForm(); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_AddRoleGrants_0); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
msg, err := server.AddRoleGrants(ctx, &protoReq)
|
||||
return msg, metadata, err
|
||||
|
||||
}
|
||||
|
||||
var (
|
||||
filter_RoleService_SetRoleGrants_0 = &utilities.DoubleArray{Encoding: map[string]int{"item": 0, "role_id": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}}
|
||||
)
|
||||
|
||||
func request_RoleService_SetRoleGrants_0(ctx context.Context, marshaler runtime.Marshaler, client RoleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq SetRoleGrantsRequest
|
||||
var metadata runtime.ServerMetadata
|
||||
@@ -615,7 +691,7 @@ func request_RoleService_SetRoleGrants_0(ctx context.Context, marshaler runtime.
|
||||
if berr != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
|
||||
}
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Item); err != nil && err != io.EOF {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
@@ -637,6 +713,13 @@ func request_RoleService_SetRoleGrants_0(ctx context.Context, marshaler runtime.
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role_id", err)
|
||||
}
|
||||
|
||||
if err := req.ParseForm(); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_SetRoleGrants_0); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
msg, err := client.SetRoleGrants(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
|
||||
return msg, metadata, err
|
||||
|
||||
@@ -650,7 +733,7 @@ func local_request_RoleService_SetRoleGrants_0(ctx context.Context, marshaler ru
|
||||
if berr != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
|
||||
}
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Item); err != nil && err != io.EOF {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
@@ -672,11 +755,22 @@ func local_request_RoleService_SetRoleGrants_0(ctx context.Context, marshaler ru
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role_id", err)
|
||||
}
|
||||
|
||||
if err := req.ParseForm(); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_SetRoleGrants_0); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
msg, err := server.SetRoleGrants(ctx, &protoReq)
|
||||
return msg, metadata, err
|
||||
|
||||
}
|
||||
|
||||
var (
|
||||
filter_RoleService_RemoveRoleGrants_0 = &utilities.DoubleArray{Encoding: map[string]int{"item": 0, "role_id": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}}
|
||||
)
|
||||
|
||||
func request_RoleService_RemoveRoleGrants_0(ctx context.Context, marshaler runtime.Marshaler, client RoleServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq RemoveRoleGrantsRequest
|
||||
var metadata runtime.ServerMetadata
|
||||
@@ -685,7 +779,7 @@ func request_RoleService_RemoveRoleGrants_0(ctx context.Context, marshaler runti
|
||||
if berr != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
|
||||
}
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Item); err != nil && err != io.EOF {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
@@ -707,6 +801,13 @@ func request_RoleService_RemoveRoleGrants_0(ctx context.Context, marshaler runti
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role_id", err)
|
||||
}
|
||||
|
||||
if err := req.ParseForm(); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_RemoveRoleGrants_0); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
msg, err := client.RemoveRoleGrants(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
|
||||
return msg, metadata, err
|
||||
|
||||
@@ -720,7 +821,7 @@ func local_request_RoleService_RemoveRoleGrants_0(ctx context.Context, marshaler
|
||||
if berr != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
|
||||
}
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
|
||||
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Item); err != nil && err != io.EOF {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
@@ -742,6 +843,13 @@ func local_request_RoleService_RemoveRoleGrants_0(ctx context.Context, marshaler
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role_id", err)
|
||||
}
|
||||
|
||||
if err := req.ParseForm(); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_RoleService_RemoveRoleGrants_0); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
msg, err := server.RemoveRoleGrants(ctx, &protoReq)
|
||||
return msg, metadata, err
|
||||
|
||||
|
||||
@@ -94,7 +94,7 @@ service RoleService {
|
||||
rpc AddRolePrincipals(AddRolePrincipalsRequest) returns (AddRolePrincipalsResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/scopes/*/roles/{role_id}:add-principals"
|
||||
body: "*"
|
||||
body: "item"
|
||||
response_body: "item"
|
||||
};
|
||||
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
|
||||
@@ -111,7 +111,7 @@ service RoleService {
|
||||
rpc SetRolePrincipals(SetRolePrincipalsRequest) returns (SetRolePrincipalsResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/scopes/*/roles/{role_id}:set-principals"
|
||||
body: "*"
|
||||
body: "item"
|
||||
response_body: "item"
|
||||
};
|
||||
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
|
||||
@@ -127,7 +127,7 @@ service RoleService {
|
||||
rpc RemoveRolePrincipals(RemoveRolePrincipalsRequest) returns (RemoveRolePrincipalsResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/scopes/*/roles/{role_id}:remove-principals"
|
||||
body: "*"
|
||||
body: "item"
|
||||
response_body: "item"
|
||||
};
|
||||
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
|
||||
@@ -142,7 +142,7 @@ service RoleService {
|
||||
rpc AddRoleGrants(AddRoleGrantsRequest) returns (AddRoleGrantsResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/scopes/*/roles/{role_id}:add-grants"
|
||||
body: "*"
|
||||
body: "item"
|
||||
response_body: "item"
|
||||
};
|
||||
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
|
||||
@@ -158,7 +158,7 @@ service RoleService {
|
||||
rpc SetRoleGrants(SetRoleGrantsRequest) returns (SetRoleGrantsResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/scopes/*/roles/{role_id}:set-grants"
|
||||
body: "*"
|
||||
body: "item"
|
||||
response_body: "item"
|
||||
};
|
||||
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
|
||||
@@ -174,7 +174,7 @@ service RoleService {
|
||||
rpc RemoveRoleGrants(RemoveRoleGrantsRequest) returns (RemoveRoleGrantsResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/scopes/*/roles/{role_id}:remove-grants"
|
||||
body: "*"
|
||||
body: "item"
|
||||
response_body: "item"
|
||||
};
|
||||
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
|
||||
@@ -230,12 +230,17 @@ message DeleteRoleResponse {
|
||||
bool existed = 1;
|
||||
}
|
||||
|
||||
message PrincipalIdsMessage {
|
||||
repeated string principal_ids = 1 [json_name="principal_ids"];
|
||||
}
|
||||
|
||||
message AddRolePrincipalsRequest {
|
||||
string role_id = 1;
|
||||
// The version ensures the role hasn't changed since it was last retrieved and if
|
||||
// it has the request will fail.
|
||||
uint32 version = 2;
|
||||
repeated string principal_ids = 3 [json_name="principal_ids"];
|
||||
|
||||
PrincipalIdsMessage item = 3;
|
||||
}
|
||||
|
||||
message AddRolePrincipalsResponse {
|
||||
@@ -247,7 +252,8 @@ message SetRolePrincipalsRequest {
|
||||
// The version ensures the role hasn't changed since it was last retrieved and if
|
||||
// it has the request will fail.
|
||||
uint32 version = 2;
|
||||
repeated string principal_ids = 3 [json_name="principal_ids"];
|
||||
|
||||
PrincipalIdsMessage item = 3;
|
||||
}
|
||||
|
||||
message SetRolePrincipalsResponse {
|
||||
@@ -259,19 +265,25 @@ message RemoveRolePrincipalsRequest {
|
||||
// The version ensures the role hasn't changed since it was last retrieved and if
|
||||
// it has the request will fail.
|
||||
uint32 version = 2;
|
||||
repeated string principal_ids = 3 [json_name="principal_ids"];
|
||||
|
||||
PrincipalIdsMessage item = 3;
|
||||
}
|
||||
|
||||
message RemoveRolePrincipalsResponse {
|
||||
resources.roles.v1.Role item = 1;
|
||||
}
|
||||
|
||||
message GrantStringsMessage {
|
||||
repeated string grant_strings = 1 [json_name="grant_strings"];
|
||||
}
|
||||
|
||||
message AddRoleGrantsRequest {
|
||||
string role_id = 1;
|
||||
// The version ensures the role hasn't changed since it was last retrieved and if
|
||||
// it has the request will fail.
|
||||
uint32 version = 2;
|
||||
repeated string grant_strings = 3 [json_name="grant_strings"];
|
||||
|
||||
GrantStringsMessage item = 3;;
|
||||
}
|
||||
|
||||
message AddRoleGrantsResponse {
|
||||
@@ -283,7 +295,8 @@ message SetRoleGrantsRequest {
|
||||
// The version ensures the role hasn't changed since it was last retrieved and if
|
||||
// it has the request will fail.
|
||||
uint32 version = 2;
|
||||
repeated string grant_strings = 3 [json_name="grant_strings"];
|
||||
|
||||
GrantStringsMessage item = 3;
|
||||
}
|
||||
|
||||
message SetRoleGrantsResponse {
|
||||
@@ -295,9 +308,10 @@ message RemoveRoleGrantsRequest {
|
||||
// The version ensures the role hasn't changed since it was last retrieved and if
|
||||
// it has the request will fail.
|
||||
uint32 version = 2;
|
||||
repeated string grant_strings = 3 [json_name="grant_strings"];
|
||||
|
||||
GrantStringsMessage item = 3;
|
||||
}
|
||||
|
||||
message RemoveRoleGrantsResponse {
|
||||
resources.roles.v1.Role item = 1;
|
||||
}
|
||||
}
|
||||
@@ -143,7 +143,7 @@ func (s Service) AddRolePrincipals(ctx context.Context, req *pbs.AddRolePrincipa
|
||||
if err := validateAddRolePrincipalsRequest(req); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
r, err := s.addPrinciplesInRepo(ctx, req.GetRoleId(), req.GetPrincipalIds(), req.GetVersion())
|
||||
r, err := s.addPrinciplesInRepo(ctx, req.GetRoleId(), req.GetItem().GetPrincipalIds(), req.GetVersion())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -160,7 +160,7 @@ func (s Service) SetRolePrincipals(ctx context.Context, req *pbs.SetRolePrincipa
|
||||
if err := validateSetRolePrincipalsRequest(req); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
r, err := s.setPrinciplesInRepo(ctx, req.GetRoleId(), req.GetPrincipalIds(), req.GetVersion())
|
||||
r, err := s.setPrinciplesInRepo(ctx, req.GetRoleId(), req.GetItem().GetPrincipalIds(), req.GetVersion())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -177,7 +177,7 @@ func (s Service) RemoveRolePrincipals(ctx context.Context, req *pbs.RemoveRolePr
|
||||
if err := validateRemoveRolePrincipalsRequest(req); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
r, err := s.removePrinciplesInRepo(ctx, req.GetRoleId(), req.GetPrincipalIds(), req.GetVersion())
|
||||
r, err := s.removePrinciplesInRepo(ctx, req.GetRoleId(), req.GetItem().GetPrincipalIds(), req.GetVersion())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -194,7 +194,7 @@ func (s Service) AddRoleGrants(ctx context.Context, req *pbs.AddRoleGrantsReques
|
||||
if err := validateAddRoleGrantsRequest(req); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
r, err := s.addGrantsInRepo(ctx, req.GetRoleId(), req.GetGrantStrings(), req.GetVersion())
|
||||
r, err := s.addGrantsInRepo(ctx, req.GetRoleId(), req.GetItem().GetGrantStrings(), req.GetVersion())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -211,7 +211,7 @@ func (s Service) SetRoleGrants(ctx context.Context, req *pbs.SetRoleGrantsReques
|
||||
if err := validateSetRoleGrantsRequest(req); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
r, err := s.setGrantsInRepo(ctx, req.GetRoleId(), req.GetGrantStrings(), req.GetVersion())
|
||||
r, err := s.setGrantsInRepo(ctx, req.GetRoleId(), req.GetItem().GetGrantStrings(), req.GetVersion())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -228,7 +228,7 @@ func (s Service) RemoveRoleGrants(ctx context.Context, req *pbs.RemoveRoleGrants
|
||||
if err := validateRemoveRoleGrantsRequest(req); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
r, err := s.removeGrantsInRepo(ctx, req.GetRoleId(), req.GetGrantStrings(), req.GetVersion())
|
||||
r, err := s.removeGrantsInRepo(ctx, req.GetRoleId(), req.GetItem().GetGrantStrings(), req.GetVersion())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -644,7 +644,7 @@ func validateAddRolePrincipalsRequest(req *pbs.AddRolePrincipalsRequest) error {
|
||||
if req.GetVersion() == 0 {
|
||||
badFields["version"] = "Required field."
|
||||
}
|
||||
if len(req.GetPrincipalIds()) == 0 {
|
||||
if len(req.GetItem().GetPrincipalIds()) == 0 {
|
||||
badFields["principal_ids"] = "Must be non-empty."
|
||||
}
|
||||
if len(badFields) > 0 {
|
||||
@@ -675,7 +675,7 @@ func validateRemoveRolePrincipalsRequest(req *pbs.RemoveRolePrincipalsRequest) e
|
||||
if req.GetVersion() == 0 {
|
||||
badFields["version"] = "Required field."
|
||||
}
|
||||
if len(req.GetPrincipalIds()) == 0 {
|
||||
if len(req.GetItem().GetPrincipalIds()) == 0 {
|
||||
badFields["principal_ids"] = "Must be non-empty."
|
||||
}
|
||||
if len(badFields) > 0 {
|
||||
@@ -692,7 +692,7 @@ func validateAddRoleGrantsRequest(req *pbs.AddRoleGrantsRequest) error {
|
||||
if req.GetVersion() == 0 {
|
||||
badFields["version"] = "Required field."
|
||||
}
|
||||
if len(req.GetGrantStrings()) == 0 {
|
||||
if len(req.GetItem().GetGrantStrings()) == 0 {
|
||||
badFields["grant_strings"] = "Must be non-empty."
|
||||
}
|
||||
if len(badFields) > 0 {
|
||||
@@ -723,7 +723,7 @@ func validateRemoveRoleGrantsRequest(req *pbs.RemoveRoleGrantsRequest) error {
|
||||
if req.GetVersion() == 0 {
|
||||
badFields["version"] = "Required field."
|
||||
}
|
||||
if len(req.GetGrantStrings()) == 0 {
|
||||
if len(req.GetItem().GetGrantStrings()) == 0 {
|
||||
badFields["grant_strings"] = "Must be non-empty."
|
||||
}
|
||||
if len(badFields) > 0 {
|
||||
|
||||
@@ -1000,9 +1000,11 @@ func TestAddPrincipal(t *testing.T) {
|
||||
role := iam.TestRole(t, conn, scope.GetPublicId())
|
||||
tc.setup(role)
|
||||
req := &pbs.AddRolePrincipalsRequest{
|
||||
RoleId: role.GetPublicId(),
|
||||
Version: role.GetVersion(),
|
||||
PrincipalIds: append(tc.addUsers, tc.addGroups...),
|
||||
RoleId: role.GetPublicId(),
|
||||
Version: role.GetVersion(),
|
||||
Item: &pbs.PrincipalIdsMessage{
|
||||
PrincipalIds: append(tc.addUsers, tc.addGroups...),
|
||||
},
|
||||
}
|
||||
|
||||
got, err := s.AddRolePrincipals(auth.DisabledAuthTestContext(auth.WithScopeId(o.GetPublicId())), req)
|
||||
@@ -1120,9 +1122,11 @@ func TestSetPrincipal(t *testing.T) {
|
||||
role := iam.TestRole(t, conn, scope.GetPublicId())
|
||||
tc.setup(role)
|
||||
req := &pbs.SetRolePrincipalsRequest{
|
||||
RoleId: role.GetPublicId(),
|
||||
Version: role.GetVersion(),
|
||||
PrincipalIds: append(tc.setUsers, tc.setGroups...),
|
||||
RoleId: role.GetPublicId(),
|
||||
Version: role.GetVersion(),
|
||||
Item: &pbs.PrincipalIdsMessage{
|
||||
PrincipalIds: append(tc.setUsers, tc.setGroups...),
|
||||
},
|
||||
}
|
||||
|
||||
got, err := s.SetRolePrincipals(auth.DisabledAuthTestContext(auth.WithScopeId(o.GetPublicId())), req)
|
||||
@@ -1258,9 +1262,11 @@ func TestRemovePrincipal(t *testing.T) {
|
||||
role := iam.TestRole(t, conn, scope.GetPublicId())
|
||||
tc.setup(role)
|
||||
req := &pbs.RemoveRolePrincipalsRequest{
|
||||
RoleId: role.GetPublicId(),
|
||||
Version: role.GetVersion(),
|
||||
PrincipalIds: append(tc.removeUsers, tc.removeGroups...),
|
||||
RoleId: role.GetPublicId(),
|
||||
Version: role.GetVersion(),
|
||||
Item: &pbs.PrincipalIdsMessage{
|
||||
PrincipalIds: append(tc.removeUsers, tc.removeGroups...),
|
||||
},
|
||||
}
|
||||
|
||||
got, err := s.RemoveRolePrincipals(auth.DisabledAuthTestContext(auth.WithScopeId(o.GetPublicId())), req)
|
||||
@@ -1374,7 +1380,9 @@ func TestAddGrants(t *testing.T) {
|
||||
if o != scope {
|
||||
scopeId = p.GetPublicId()
|
||||
}
|
||||
req.GrantStrings = append(req.GrantStrings, tc.add...)
|
||||
req.Item = &pbs.GrantStringsMessage{
|
||||
GrantStrings: tc.add,
|
||||
}
|
||||
got, err := s.AddRoleGrants(auth.DisabledAuthTestContext(auth.WithScopeId(scopeId)), req)
|
||||
if tc.wantErr {
|
||||
assert.Error(err)
|
||||
@@ -1396,9 +1404,11 @@ func TestAddGrants(t *testing.T) {
|
||||
{
|
||||
name: "Bad Role Id",
|
||||
req: &pbs.AddRoleGrantsRequest{
|
||||
RoleId: "bad id",
|
||||
GrantStrings: []string{"id=*;actions=create"},
|
||||
Version: role.GetVersion(),
|
||||
RoleId: "bad id",
|
||||
Item: &pbs.GrantStringsMessage{
|
||||
GrantStrings: []string{"id=*;actions=create"},
|
||||
},
|
||||
Version: role.GetVersion(),
|
||||
},
|
||||
errCode: codes.InvalidArgument,
|
||||
},
|
||||
@@ -1472,7 +1482,9 @@ func TestSetGrants(t *testing.T) {
|
||||
if o != scope {
|
||||
scopeId = p.GetPublicId()
|
||||
}
|
||||
req.GrantStrings = append(req.GrantStrings, tc.set...)
|
||||
req.Item = &pbs.GrantStringsMessage{
|
||||
GrantStrings: tc.set,
|
||||
}
|
||||
got, err := s.SetRoleGrants(auth.DisabledAuthTestContext(auth.WithScopeId(scopeId)), req)
|
||||
if tc.wantErr {
|
||||
assert.Error(err)
|
||||
@@ -1496,9 +1508,11 @@ func TestSetGrants(t *testing.T) {
|
||||
{
|
||||
name: "Bad Role Id",
|
||||
req: &pbs.SetRoleGrantsRequest{
|
||||
RoleId: "bad id",
|
||||
GrantStrings: []string{"id=*;actions=create"},
|
||||
Version: role.GetVersion(),
|
||||
RoleId: "bad id",
|
||||
Item: &pbs.GrantStringsMessage{
|
||||
GrantStrings: []string{"id=*;actions=create"},
|
||||
},
|
||||
Version: role.GetVersion(),
|
||||
},
|
||||
errCode: codes.InvalidArgument,
|
||||
},
|
||||
@@ -1571,7 +1585,9 @@ func TestRemoveGrants(t *testing.T) {
|
||||
if o != scope {
|
||||
scopeId = p.GetPublicId()
|
||||
}
|
||||
req.GrantStrings = append(req.GrantStrings, tc.remove...)
|
||||
req.Item = &pbs.GrantStringsMessage{
|
||||
GrantStrings: tc.remove,
|
||||
}
|
||||
got, err := s.RemoveRoleGrants(auth.DisabledAuthTestContext(auth.WithScopeId(scopeId)), req)
|
||||
if tc.wantErr {
|
||||
assert.Error(err)
|
||||
@@ -1596,9 +1612,11 @@ func TestRemoveGrants(t *testing.T) {
|
||||
{
|
||||
name: "Bad Role Id",
|
||||
req: &pbs.RemoveRoleGrantsRequest{
|
||||
RoleId: "bad id",
|
||||
GrantStrings: []string{"id=*;actions=create"},
|
||||
Version: role.GetVersion(),
|
||||
RoleId: "bad id",
|
||||
Item: &pbs.GrantStringsMessage{
|
||||
GrantStrings: []string{"id=*;actions=create"},
|
||||
},
|
||||
Version: role.GetVersion(),
|
||||
},
|
||||
errCode: codes.InvalidArgument,
|
||||
},
|
||||
|
||||
Reference in new issue
Block a user