KevinStephenson
Adding in weaviate code
b110593
raw
history blame
2.97 kB
// _ _
// __ _____ __ ___ ___ __ _| |_ ___
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
// \ V V / __/ (_| |\ V /| | (_| | || __/
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
//
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
//
// CONTACT: [email protected]
//
package adminlist
import (
"github.com/weaviate/weaviate/entities/models"
"github.com/weaviate/weaviate/usecases/auth/authorization/errors"
)
const AnonymousPrincipalUsername = "anonymous"
// Authorizer provides either full (admin) or no access
type Authorizer struct {
adminUsers map[string]int
readOnlyUsers map[string]int
adminGroups map[string]int
readOnlyGroups map[string]int
}
// New Authorizer using the AdminList method
func New(cfg Config) *Authorizer {
a := &Authorizer{}
a.addAdminUserList(cfg.Users)
a.addReadOnlyUserList(cfg.ReadOnlyUsers)
a.addAdminGroupList(cfg.Groups)
a.addReadOnlyGroupList(cfg.ReadOnlyGroups)
return a
}
// Authorize will give full access (to any resource!) if the user is part of
// the admin list or no access at all if they are not
func (a *Authorizer) Authorize(principal *models.Principal, verb, resource string) error {
if principal == nil {
principal = newAnonymousPrincipal()
}
if _, ok := a.adminUsers[principal.Username]; ok {
return nil
}
for _, group := range principal.Groups {
if _, ok := a.adminGroups[group]; ok {
return nil
}
}
if verb == "get" || verb == "list" {
if _, ok := a.readOnlyUsers[principal.Username]; ok {
return nil
}
for _, group := range principal.Groups {
if _, ok := a.readOnlyGroups[group]; ok {
return nil
}
}
}
return errors.NewForbidden(principal, verb, resource)
}
func (a *Authorizer) addAdminUserList(users []string) {
// build a map for more efficient lookup on long lists
if a.adminUsers == nil {
a.adminUsers = map[string]int{}
}
for _, user := range users {
a.adminUsers[user] = 1
}
}
func (a *Authorizer) addReadOnlyUserList(users []string) {
// build a map for more efficient lookup on long lists
if a.readOnlyUsers == nil {
a.readOnlyUsers = map[string]int{}
}
for _, user := range users {
a.readOnlyUsers[user] = 1
}
}
func (a *Authorizer) addAdminGroupList(groups []string) {
// build a map for more efficient lookup on long lists
if a.adminGroups == nil {
a.adminGroups = map[string]int{}
}
for _, group := range groups {
a.adminGroups[group] = 1
}
}
func (a *Authorizer) addReadOnlyGroupList(groups []string) {
// build a map for more efficient lookup on long lists
if a.readOnlyGroups == nil {
a.readOnlyGroups = map[string]int{}
}
for _, group := range groups {
a.readOnlyGroups[group] = 1
}
}
func newAnonymousPrincipal() *models.Principal {
return &models.Principal{
Username: AnonymousPrincipalUsername,
}
}