Skip to content

Commit 586c0d3

Browse files
Implement missing funcs (still missing a few...)
1 parent d66ab70 commit 586c0d3

20 files changed

+334
-394
lines changed

cmd/setup_local/main.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"github.com/nais/api/internal/graph/model"
2121
"github.com/nais/api/internal/graph/pagination"
2222
"github.com/nais/api/internal/logger"
23-
"github.com/nais/api/internal/role"
2423
"github.com/nais/api/internal/slug"
2524
"github.com/nais/api/internal/team"
2625
"github.com/nais/api/internal/user"
@@ -267,7 +266,6 @@ func run(ctx context.Context, cfg *seedConfig, log logrus.FieldLogger) error {
267266
users = append(users, u)
268267
emails[email] = struct{}{}
269268
}
270-
usersCreated := len(users)
271269

272270
var devteam *team.Team
273271
devteam, err = team.Get(ctx, "devteam")
@@ -344,14 +342,14 @@ func run(ctx context.Context, cfg *seedConfig, log logrus.FieldLogger) error {
344342
}
345343

346344
for o := 0; o < *cfg.NumOwnersPerTeam; o++ {
347-
u := users[rand.IntN(usersCreated)]
345+
u := users[rand.IntN(len(users))]
348346
if err = authz.MakeUserTeamOwner(ctx, u.UUID, t.Slug); err != nil {
349347
return fmt.Errorf("make user %q owner of team %q: %w", u.Email, t.Slug, err)
350348
}
351349
}
352350

353351
for o := 0; o < *cfg.NumMembersPerTeam; o++ {
354-
u := users[rand.IntN(usersCreated)]
352+
u := users[rand.IntN(len(users))]
355353
if err = authz.MakeUserTeamMember(ctx, u.UUID, t.Slug); err != nil {
356354
return fmt.Errorf("make user %q member of team %q: %w", u.Email, t.Slug, err)
357355
}

internal/auth/authz/authorizations.go

-18
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,11 @@ const (
1010
AuthorizationServiceAccountsRead Authorization = "service_accounts:read"
1111
AuthorizationServiceAccountsUpdate Authorization = "service_accounts:update"
1212
AuthorizationTeamsCreate Authorization = "teams:create"
13-
AuthorizationTeamsDelete Authorization = "teams:delete"
1413
AuthorizationTeamsList Authorization = "teams:list"
1514
AuthorizationTeamsRead Authorization = "teams:read"
16-
AuthorizationTeamsMetadataUpdate Authorization = "teams:metadata:update"
1715
AuthorizationTeamsMembersAdmin Authorization = "teams:members:admin"
18-
AuthorizationSecretsCreate Authorization = "teams:secrets:create"
19-
AuthorizationSecretsDelete Authorization = "teams:secrets:delete"
20-
AuthorizationSecretsUpdate Authorization = "teams:secrets:update"
21-
AuthorizationSecretsRead Authorization = "teams:secrets:read"
2216
AuthorizationSecretsList Authorization = "teams:secrets:list"
23-
AuthorizationRepositoriesCreate Authorization = "repositories:create"
24-
AuthorizationRepositoriesDelete Authorization = "repositories:delete"
25-
AuthorizationApplicationsUpdate Authorization = "applications:update"
26-
AuthorizationApplicationsDelete Authorization = "applications:delete"
27-
AuthorizationJobsUpdate Authorization = "jobs:update"
28-
AuthorizationJobsDelete Authorization = "jobs:delete"
2917
AuthorizationUsersList Authorization = "users:list"
30-
AuthorizationTeamsSynchronize Authorization = "teams:synchronize"
31-
AuthorizationUsersyncSynchronize Authorization = "usersync:synchronize"
32-
AuthorizationDeployKeyRead Authorization = "deploy_key:read"
33-
AuthorizationDeployKeyUpdate Authorization = "deploy_key:update"
34-
AuthorizationUnleashCreate Authorization = "unleash:create"
35-
AuthorizationUnleashUpdate Authorization = "unleash:update"
3618
)
3719
3820
var roles = map[authzsql.RoleName][]Authorization{

internal/auth/authz/authz.go

-102
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"context"
55

66
"github.com/google/uuid"
7-
"github.com/nais/api/internal/graph/apierror"
87
)
98

109
type ContextKey string
@@ -20,16 +19,6 @@ type Actor struct {
2019
Roles []*Role
2120
}
2221

23-
var ErrNotAuthenticated = apierror.Errorf("Valid user required. You are not logged in.")
24-
25-
func (u *Actor) Authenticated() bool {
26-
if u == nil || u.User == nil {
27-
return false
28-
}
29-
30-
return true
31-
}
32-
3322
const contextKeyUser ContextKey = "actor"
3423

3524
// ContextWithActor Return a context with an actor attached to it.
@@ -46,94 +35,3 @@ func ActorFromContext(ctx context.Context) *Actor {
4635
actor, _ := ctx.Value(contextKeyUser).(*Actor)
4736
return actor
4837
}
49-
50-
/*
51-
// requireGlobalAuthorization Require an actor to have a specific authorization through a globally assigned role.
52-
func requireGlobalAuthorization(actor *Actor, requiredAuthzName string) error {
53-
if !actor.Authenticated() {
54-
return ErrNotAuthenticated
55-
}
56-
57-
authorizations := make(map[string]struct{})
58-
59-
for _, r := range actor.Roles {
60-
if r.Name == "Admin" {
61-
return nil
62-
}
63-
64-
authorizations, err := ListAuthorizationsInRole(r.Name)
65-
roleAuthz, err := r.Authorizations()
66-
if err != nil {
67-
return err
68-
}
69-
if r.IsGlobal() {
70-
for _, authorization := range roleAuthz {
71-
authorizations[authorization] = struct{}{}
72-
}
73-
}
74-
}
75-
76-
return authorized(authorizations, requiredAuthzName)
77-
}
78-
79-
80-
81-
// requireTeamAuthorization Require an actor to have a specific authorization through a globally assigned or a correctly
82-
// targeted role.
83-
func requireTeamAuthorization(actor *Actor, requiredAuthzName string, targetTeamSlug slug.Slug) error {
84-
if !actor.Authenticated() {
85-
return ErrNotAuthenticated
86-
}
87-
88-
authorizations := make(map[string]struct{})
89-
90-
for _, r := range actor.Roles {
91-
if r.Name == "Admin" {
92-
return nil
93-
}
94-
95-
roleAuthz, err := r.Authorizations()
96-
if err != nil {
97-
return err
98-
}
99-
if r.IsGlobal() || r.TargetsTeam(targetTeamSlug) {
100-
for _, authorization := range roleAuthz {
101-
authorizations[authorization] = struct{}{}
102-
}
103-
}
104-
}
105-
106-
return authorized(authorizations, requiredAuthzName)
107-
}
108-
109-
// RequireTeamAuthorizationCtx fetches the actor from the context and checks if it has the required authorization.
110-
func RequireTeamAuthorizationCtx(ctx context.Context, requiredAuthzName string, targetTeamSlug slug.Slug) error {
111-
return RequireTeamAuthorization(ActorFromContext(ctx), requiredAuthzName, targetTeamSlug)
112-
}
113-
*/
114-
115-
// authorized Check if one of the authorizations in the map matches the required authorization.
116-
func authorized(authorizations map[string]struct{}, requiredAuthzName string) error {
117-
for authorization := range authorizations {
118-
if authorization == requiredAuthzName {
119-
return nil
120-
}
121-
}
122-
123-
return ErrMissingAuthorization{authorization: string(requiredAuthzName)}
124-
}
125-
126-
func RequireGlobalAdmin(ctx context.Context) error {
127-
actor := ActorFromContext(ctx)
128-
if !actor.Authenticated() {
129-
return ErrNotAuthenticated
130-
}
131-
132-
for _, r := range actor.Roles {
133-
if r.Name == "Admin" {
134-
return nil
135-
}
136-
}
137-
138-
return ErrMissingAuthorization{authorization: "global:admin"}
139-
}

internal/auth/authz/authz_test.go

+1-113
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,13 @@ package authz_test
22

33
import (
44
"context"
5-
"errors"
65
"testing"
76

87
"github.com/google/go-cmp/cmp"
9-
"github.com/nais/api/internal/auth/authz/authzsql"
10-
"github.com/nais/api/internal/slug"
8+
"github.com/nais/api/internal/auth/authz"
119
"github.com/nais/api/internal/user"
1210
)
1311

14-
const (
15-
authTeamCreateError = `required authorization: "teams:create"`
16-
authTeamUpdateError = `required authorization: "teams:metadata:update"`
17-
)
18-
1912
func TestContextWithUser(t *testing.T) {
2013
ctx := context.Background()
2114
if authz.ActorFromContext(ctx) != nil {
@@ -41,108 +34,3 @@ func TestContextWithUser(t *testing.T) {
4134
t.Errorf("diff: -want +got\n%s", diff)
4235
}
4336
}
44-
45-
func TestRequireGlobalAuthorization(t *testing.T) {
46-
u := &user.User{
47-
Name: "User Name",
48-
49-
}
50-
51-
t.Run("Nil user", func(t *testing.T) {
52-
if !errors.Is(authz.RequireGlobalAuthorization(nil, authz.AuthorizationTeamsCreate), authz.ErrNotAuthenticated) {
53-
t.Fatal("RequireGlobalAuthorization(ctx): expected ErrNotAuthenticated")
54-
}
55-
})
56-
57-
t.Run("User with no roles", func(t *testing.T) {
58-
contextUser := authz.ActorFromContext(authz.ContextWithActor(context.Background(), u, []*authz.Role{}))
59-
if authz.RequireGlobalAuthorization(contextUser, authz.AuthorizationTeamsCreate).Error() != authTeamCreateError {
60-
t.Fatalf("RequireGlobalAuthorization(ctx): expected error text to match %q", authTeamCreateError)
61-
}
62-
})
63-
64-
t.Run("User with insufficient roles", func(t *testing.T) {
65-
userRoles := []*authz.Role{{Name: authzsql.RoleNameTeamviewer}}
66-
contextUser := authz.ActorFromContext(authz.ContextWithActor(context.Background(), u, userRoles))
67-
if authz.RequireGlobalAuthorization(contextUser, authz.AuthorizationTeamsCreate).Error() != authTeamCreateError {
68-
t.Fatalf("RequireGlobalAuthorization(ctx): expected error text to match %q", authTeamCreateError)
69-
}
70-
})
71-
72-
t.Run("User with sufficient role", func(t *testing.T) {
73-
userRoles := []*authz.Role{{Name: authzsql.RoleNameTeamcreator}}
74-
contextUser := authz.ActorFromContext(authz.ContextWithActor(context.Background(), u, userRoles))
75-
if authz.RequireGlobalAuthorization(contextUser, authz.AuthorizationTeamsCreate) != nil {
76-
t.Fatal("RequireGlobalAuthorization(ctx): expected nil error")
77-
}
78-
})
79-
}
80-
81-
func TestRequireAuthorizationForTeamTarget(t *testing.T) {
82-
u := &user.User{
83-
Name: "User Name",
84-
85-
}
86-
targetTeamSlug := slug.Slug("slug")
87-
88-
t.Run("Nil user", func(t *testing.T) {
89-
if !errors.Is(authz.RequireTeamAuthorization(nil, authz.AuthorizationTeamsCreate, targetTeamSlug), authz.ErrNotAuthenticated) {
90-
t.Fatal("RequireTeamAuthorization(ctx): expected ErrNotAuthenticated")
91-
}
92-
})
93-
94-
t.Run("User with no roles", func(t *testing.T) {
95-
contextUser := authz.ActorFromContext(authz.ContextWithActor(context.Background(), u, []*authz.Role{}))
96-
if authz.RequireTeamAuthorization(contextUser, authz.AuthorizationTeamsCreate, targetTeamSlug).Error() != authTeamCreateError {
97-
t.Fatalf("RequireTeamAuthorization(ctx): expected error text to match %q", authTeamCreateError)
98-
}
99-
})
100-
101-
t.Run("User with insufficient roles", func(t *testing.T) {
102-
userRoles := []*authz.Role{{Name: authzsql.RoleNameTeamviewer}}
103-
contextUser := authz.ActorFromContext(authz.ContextWithActor(context.Background(), u, userRoles))
104-
err := authz.RequireTeamAuthorization(contextUser, authz.AuthorizationTeamsMetadataUpdate, targetTeamSlug)
105-
if err.Error() != authTeamUpdateError {
106-
t.Fatalf("RequireTeamAuthorization(ctx): expected error text to match %q", authTeamUpdateError)
107-
}
108-
})
109-
110-
t.Run("User with targeted role", func(t *testing.T) {
111-
userRoles := []*authz.Role{
112-
{
113-
Name: authzsql.RoleNameTeamowner,
114-
TargetTeamSlug: &targetTeamSlug,
115-
},
116-
}
117-
contextUser := authz.ActorFromContext(authz.ContextWithActor(context.Background(), u, userRoles))
118-
if authz.RequireTeamAuthorization(contextUser, authz.AuthorizationTeamsMetadataUpdate, targetTeamSlug) != nil {
119-
t.Fatal("RequireTeamAuthorization(ctx): expected nil error")
120-
}
121-
})
122-
123-
t.Run("User with targeted role for wrong target", func(t *testing.T) {
124-
wrongSlug := slug.Slug("other-team")
125-
userRoles := []*authz.Role{
126-
{
127-
Name: authzsql.RoleNameTeamowner,
128-
TargetTeamSlug: &wrongSlug,
129-
},
130-
}
131-
contextUser := authz.ActorFromContext(authz.ContextWithActor(context.Background(), u, userRoles))
132-
if authz.RequireTeamAuthorization(contextUser, authz.AuthorizationTeamsMetadataUpdate, targetTeamSlug).Error() != authTeamUpdateError {
133-
t.Fatalf("RequireTeamAuthorization(ctx): expected error text to match %q", authTeamUpdateError)
134-
}
135-
})
136-
137-
t.Run("User with global role", func(t *testing.T) {
138-
userRoles := []*authz.Role{
139-
{
140-
Name: authzsql.RoleNameAdmin,
141-
},
142-
}
143-
contextUser := authz.ActorFromContext(authz.ContextWithActor(context.Background(), u, userRoles))
144-
if authz.RequireTeamAuthorization(contextUser, authz.AuthorizationTeamsMetadataUpdate, targetTeamSlug) != nil {
145-
t.Fatal("RequireTeamAuthorization(ctx): expected nil error")
146-
}
147-
})
148-
}

internal/auth/authz/authzsql/querier.go

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)