Skip to content

Commit 8e5aa6f

Browse files
committed
More fixes
1 parent b0f4bc0 commit 8e5aa6f

5 files changed

Lines changed: 79 additions & 51 deletions

File tree

internal/pkg/heimdall/heimdall.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package heimdall
22

33
import (
4-
"context"
54
"fmt"
65
"net/http"
76
"net/http/httputil"
@@ -119,7 +118,7 @@ func (h *Heimdall) Init() error {
119118

120119
rbacsByName := map[string]rbac.RBAC{}
121120
for rbacName, r := range h.RBACs {
122-
if err := r.Init(context.Background()); err != nil {
121+
if err := r.Init(); err != nil {
123122
return fmt.Errorf("failed to init rbac %s: %w", rbacName, err)
124123
}
125124
rbacsByName[rbacName] = r

pkg/rbac/ranger/client.go

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import (
99
"net/http"
1010
"strings"
1111
"time"
12-
13-
"gopkg.in/yaml.v3"
1412
)
1513

1614
const (
@@ -24,29 +22,6 @@ type Client interface {
2422
GetPolicies(serviceName string) ([]*Policy, error)
2523
}
2624

27-
type ClientWrapper struct {
28-
Client Client
29-
}
30-
31-
func (aw *ClientWrapper) UnmarshalYAML(value *yaml.Node) error {
32-
var cl client
33-
if err := value.Decode(&cl); err != nil {
34-
return err
35-
}
36-
aw.Client = &cl
37-
cl.client = &http.Client{}
38-
return nil
39-
}
40-
41-
func (cw *ClientWrapper) GetUsers() (map[string]*User, error) {
42-
return cw.Client.GetUsers()
43-
}
44-
45-
46-
func (cw *ClientWrapper) GetPolicies(serviceName string) ([]*Policy, error) {
47-
return cw.Client.GetPolicies(serviceName)
48-
}
49-
5025
type User struct {
5126
ID int64 `json:"id,omitempty"`
5227
Name string `json:"name,omitempty"`

pkg/rbac/ranger/ranger.go

Lines changed: 74 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,57 @@ package ranger
22

33
import (
44
"context"
5+
"errors"
56
"log"
67
"strings"
78
"time"
89

10+
"gopkg.in/yaml.v3"
11+
912
"github.com/patterninc/heimdall/pkg/sql/parser"
13+
"github.com/patterninc/heimdall/pkg/sql/parser/factory"
14+
)
15+
16+
var (
17+
ErrRangerClientConfigIsRequired = errors.New("ranger client_config is required")
18+
ErrRangerParserConfigIsRequired = errors.New("ranger parser_config is required")
19+
ErrRangerParserTypeIsRequired = errors.New("ranger parser_config.type is required")
20+
ErrRangerParserDefaultCatalogIsRequired = errors.New("ranger parser_config.default_catalog is required")
21+
ErrRangerUnsupportedParserType = errors.New("unsupported ranger parser_config.type. supported types: trino")
1022
)
1123

12-
// only private
13-
// add links
1424
type Ranger struct {
15-
Name string `yaml:"name,omitempty" json:"name,omitempty"`
16-
ServiceName string `yaml:"service_name,omitempty" json:"service_name,omitempty"`
17-
Client *ClientWrapper `yaml:"client,omitempty" json:"client,omitempty"`
25+
Name string `yaml:"name,omitempty" json:"name,omitempty"`
26+
ServiceName string `yaml:"service_name,omitempty" json:"service_name,omitempty"`
27+
Client Client
1828
SyncIntervalInMinutes int `yaml:"sync_interval_in_minutes,omitempty" json:"sync_interval_in_minutes,omitempty"`
1929
AccessReceiver parser.AccessReceiver `yaml:"parser,omitempty" json:"parser,omitempty"`
20-
permissionsByUser map[string]*UserPermissions
30+
permissionsByUser map[string]*userPermissions
2131
}
2232

23-
type ParserConfig struct {
33+
type parserConfig struct {
2434
Type string `yaml:"type,omitempty" json:"type,omitempty"`
2535
DefaultCatalog string `yaml:"default_catalog,omitempty" json:"default_catalog,omitempty"`
2636
}
2737

28-
type UserPermissions struct {
29-
AllowPolicies map[parser.Action][]*Policy // todo AllowPolicies
38+
type clientConfig struct {
39+
Endpoint string `yaml:"endpoint,omitempty" json:"endpoint,omitempty"`
40+
Username string `yaml:"username,omitempty" json:"username,omitempty"`
41+
Password string `yaml:"password,omitempty" json:"password,omitempty"`
42+
}
43+
44+
type userPermissions struct {
45+
AllowPolicies map[parser.Action][]*Policy
3046
DenyPolicies map[parser.Action][]*Policy
3147
}
3248

33-
func (r *Ranger) Init(ctx context.Context) error {
49+
func (r *Ranger) Init() error {
3450
// first time lets sync state explicitly
3551
if err := r.SyncState(); err != nil {
3652
return err
3753
}
3854
go func() {
39-
ctx, cancel := context.WithCancel(ctx)
55+
ctx, cancel := context.WithCancel(context.Background())
4056
defer cancel()
4157

4258
ticker := time.NewTicker(time.Duration(r.SyncIntervalInMinutes) * time.Minute)
@@ -115,7 +131,7 @@ func (r *Ranger) SyncState() error {
115131
}
116132
}
117133

118-
newPermissionsByUser := map[string]*UserPermissions{}
134+
newPermissionsByUser := map[string]*userPermissions{}
119135
for _, policy := range policies {
120136
if !policy.IsEnabled {
121137
continue
@@ -133,7 +149,7 @@ func (r *Ranger) SyncState() error {
133149
controlledActions := policy.getControlledActions(usersByGroup)
134150
for userName, actions := range controlledActions.allowedActionsByUser {
135151
if _, ok := newPermissionsByUser[userName]; !ok {
136-
newPermissionsByUser[userName] = &UserPermissions{
152+
newPermissionsByUser[userName] = &userPermissions{
137153
AllowPolicies: map[parser.Action][]*Policy{},
138154
DenyPolicies: map[parser.Action][]*Policy{},
139155
}
@@ -144,7 +160,7 @@ func (r *Ranger) SyncState() error {
144160
}
145161
for userName, actions := range controlledActions.deniedActionsByUser {
146162
if _, ok := newPermissionsByUser[userName]; !ok {
147-
newPermissionsByUser[userName] = &UserPermissions{
163+
newPermissionsByUser[userName] = &userPermissions{
148164
AllowPolicies: map[parser.Action][]*Policy{},
149165
DenyPolicies: map[parser.Action][]*Policy{},
150166
}
@@ -159,3 +175,47 @@ func (r *Ranger) SyncState() error {
159175
log.Println("Syncing users and groups from Apache Ranger for service:", r.ServiceName)
160176
return nil
161177
}
178+
179+
func (r *Ranger) UnmarshalYAML(value *yaml.Node) error {
180+
type rawRanger struct {
181+
Name string `yaml:"name,omitempty" json:"name,omitempty"`
182+
ServiceName string `yaml:"service_name,omitempty" json:"service_name,omitempty"`
183+
SyncIntervalInMinutes int `yaml:"sync_interval_in_minutes,omitempty" json:"sync_interval_in_minutes,omitempty"`
184+
Client *clientConfig `yaml:"client"`
185+
Parser *parserConfig `yaml:"parser"`
186+
}
187+
188+
var raw rawRanger
189+
if err := value.Decode(&raw); err != nil {
190+
return err
191+
}
192+
193+
if raw.Client == nil {
194+
return ErrRangerClientConfigIsRequired
195+
}
196+
if raw.Parser == nil {
197+
return ErrRangerParserConfigIsRequired
198+
}
199+
if raw.Parser.Type == "" {
200+
return ErrRangerParserTypeIsRequired
201+
}
202+
if raw.Parser.DefaultCatalog == "" {
203+
return ErrRangerParserDefaultCatalogIsRequired
204+
}
205+
206+
r.Name = raw.Name
207+
r.ServiceName = raw.ServiceName
208+
r.SyncIntervalInMinutes = raw.SyncIntervalInMinutes
209+
r.Client = NewClient(raw.Client.Endpoint, raw.Client.Username, raw.Client.Password)
210+
211+
accessReceiver, err := factory.CreateParserByType(raw.Parser.Type, raw.Parser.DefaultCatalog)
212+
if err != nil {
213+
return ErrRangerUnsupportedParserType
214+
}
215+
216+
r.AccessReceiver = accessReceiver
217+
if r.SyncIntervalInMinutes == 0 {
218+
r.SyncIntervalInMinutes = 5
219+
}
220+
return nil
221+
}

pkg/rbac/ranger/tests/ranger_policy_check_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -839,9 +839,9 @@ func getAllowAllPolicy(resource *ranger.Resource, additionalResource *ranger.Res
839839
}
840840
}
841841

842-
func getMockRangerClient(users map[string]*ranger.User, policies []*ranger.Policy) *ranger.ClientWrapper {
842+
func getMockRangerClient(users map[string]*ranger.User, policies []*ranger.Policy) ranger.Client {
843843
m := new(mocks.Client)
844844
m.On("GetUsers").Return(users, nil)
845845
m.On("GetPolicies", serviceName).Return(policies, nil)
846-
return &ranger.ClientWrapper{Client: m}
846+
return m
847847
}

pkg/rbac/rbac.go

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
package rbac
22

33
import (
4-
"context"
54
"errors"
65
"fmt"
76

8-
"gopkg.in/yaml.v3"
9-
107
"github.com/patterninc/heimdall/pkg/rbac/ranger"
8+
"gopkg.in/yaml.v3"
119
)
1210

1311
var (
@@ -18,7 +16,7 @@ var (
1816
)
1917

2018
type RBAC interface {
21-
Init(ctx context.Context) error //todo consider if we have init in another interface
19+
Init() error
2220
HasAccess(user string, query string) (bool, error)
2321
GetName() string
2422
}
@@ -29,10 +27,6 @@ type configs struct {
2927
RBAC []RBAC
3028
}
3129

32-
// type accessReceiverHolder struct {
33-
// AccessReceiver
34-
// }
35-
3630
func (c *RBACs) UnmarshalYAML(unmarshal func(interface{}) error) error {
3731

3832
var temp configs

0 commit comments

Comments
 (0)