Skip to content

Commit

Permalink
Preferences driver refactor and cbox sql implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
ishank011 committed Mar 30, 2022
1 parent 64e4344 commit 5dda2b6
Show file tree
Hide file tree
Showing 18 changed files with 643 additions and 92 deletions.
5 changes: 5 additions & 0 deletions changelog/unreleased/preferences-refactor.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Enhancement: Preferences driver refactor and cbox sql implementation

This PR uses the updated CS3APIs which accepts a namespace in addition to a
single string key to recognize a user preference. It also refactors the GRPC
service to support multiple drivers and adds the cbox SQL implementation.
15 changes: 11 additions & 4 deletions cmd/reva/preferences.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ var preferencesCommand = func() *command {

subcommand := cmd.Args()[0]
key := cmd.Args()[1]
ns := cmd.Args()[2]

client, err := getClient()
if err != nil {
Expand All @@ -50,12 +51,15 @@ var preferencesCommand = func() *command {

switch subcommand {
case "set":
if cmd.NArg() < 3 {
if cmd.NArg() < 4 {
return errors.New("Invalid arguments: " + cmd.Usage())
}
value := cmd.Args()[2]
value := cmd.Args()[3]
req := &preferences.SetKeyRequest{
Key: key,
Key: &preferences.PreferenceKey{
Namespace: ns,
Key: key,
},
Val: value,
}

Expand All @@ -70,7 +74,10 @@ var preferencesCommand = func() *command {

case "get":
req := &preferences.GetKeyRequest{
Key: key,
Key: &preferences.PreferenceKey{
Namespace: ns,
Key: key,
},
}

res, err := client.GetKey(ctx, req)
Expand Down
1 change: 1 addition & 0 deletions cmd/revad/runtime/loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import (
_ "github.com/cs3org/reva/pkg/ocm/provider/authorizer/loader"
_ "github.com/cs3org/reva/pkg/ocm/share/manager/loader"
_ "github.com/cs3org/reva/pkg/permission/manager/loader"
_ "github.com/cs3org/reva/pkg/preferences/loader"
_ "github.com/cs3org/reva/pkg/publicshare/manager/loader"
_ "github.com/cs3org/reva/pkg/rhttp/datatx/manager/loader"
_ "github.com/cs3org/reva/pkg/share/cache/loader"
Expand Down
3 changes: 1 addition & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ require (
github.com/cheggaaa/pb v1.0.29
github.com/coreos/go-oidc v2.2.1+incompatible
github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e
github.com/cs3org/go-cs3apis v0.0.0-20220214084335-d975ab5d6e65
github.com/cs3org/go-cs3apis v0.0.0-20220330081745-2ad58f5932b9
github.com/cubewise-code/go-mime v0.0.0-20200519001935-8c5762b177d8
github.com/dgraph-io/ristretto v0.1.0
github.com/eventials/go-tus v0.0.0-20200718001131-45c7ec8f5d59
Expand Down Expand Up @@ -92,5 +92,4 @@ go 1.16
replace (
github.com/eventials/go-tus => github.com/andrewmostello/go-tus v0.0.0-20200314041820-904a9904af9a
github.com/oleiade/reflections => github.com/oleiade/reflections v1.0.1
google.golang.org/grpc => google.golang.org/grpc v1.26.0 // temporary downgrade
)
67 changes: 62 additions & 5 deletions go.sum

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions internal/grpc/services/authregistry/authregistry.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,17 +116,17 @@ func (s *service) ListAuthProviders(ctx context.Context, req *registrypb.ListAut
return res, nil
}

func (s *service) GetAuthProvider(ctx context.Context, req *registrypb.GetAuthProviderRequest) (*registrypb.GetAuthProviderResponse, error) {
func (s *service) GetAuthProviders(ctx context.Context, req *registrypb.GetAuthProvidersRequest) (*registrypb.GetAuthProvidersResponse, error) {
pinfo, err := s.reg.GetProvider(ctx, req.Type)
if err != nil {
return &registrypb.GetAuthProviderResponse{
return &registrypb.GetAuthProvidersResponse{
Status: status.NewInternal(ctx, err, "error getting auth provider for type: "+req.Type),
}, nil
}

res := &registrypb.GetAuthProviderResponse{
Status: status.NewOK(ctx),
Provider: pinfo,
res := &registrypb.GetAuthProvidersResponse{
Status: status.NewOK(ctx),
Providers: []*registrypb.ProviderInfo{pinfo},
}
return res, nil
}
6 changes: 3 additions & 3 deletions internal/grpc/services/gateway/authprovider.go
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ func (s *svc) findAuthProvider(ctx context.Context, authType string) (authpb.Pro
return nil, err
}

res, err := c.GetAuthProvider(ctx, &registry.GetAuthProviderRequest{
res, err := c.GetAuthProviders(ctx, &registry.GetAuthProvidersRequest{
Type: authType,
})

Expand All @@ -222,9 +222,9 @@ func (s *svc) findAuthProvider(ctx context.Context, authType string) (authpb.Pro
return nil, err
}

if res.Status.Code == rpc.Code_CODE_OK && res.Provider != nil {
if res.Status.Code == rpc.Code_CODE_OK && res.Providers != nil && len(res.Providers) > 0 {
// TODO(labkode): check for capabilities here
c, err := pool.GetAuthProviderServiceClient(res.Provider.Address)
c, err := pool.GetAuthProviderServiceClient(res.Providers[0].Address)
if err != nil {
err = errors.Wrap(err, "gateway: error getting an auth provider client")
return nil, err
Expand Down
137 changes: 66 additions & 71 deletions internal/grpc/services/preferences/preferences.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,38 +20,73 @@ package preferences

import (
"context"
"sync"

"google.golang.org/grpc"

userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1"
preferences "github.com/cs3org/go-cs3apis/cs3/preferences/v1beta1"
ctxpkg "github.com/cs3org/reva/pkg/ctx"
preferencespb "github.com/cs3org/go-cs3apis/cs3/preferences/v1beta1"
"github.com/cs3org/reva/pkg/errtypes"
"github.com/cs3org/reva/pkg/preferences"
"github.com/cs3org/reva/pkg/preferences/registry"
"github.com/cs3org/reva/pkg/rgrpc"
"github.com/cs3org/reva/pkg/rgrpc/status"
"github.com/mitchellh/mapstructure"
"github.com/pkg/errors"
)

type contextUserRequiredErr string

func (err contextUserRequiredErr) Error() string { return string(err) }

func init() {
rgrpc.Register("preferences", New)
}

// m maps user to map of user preferences.
// m = map[userToken]map[key]value
var m = make(map[string]map[string]string)
type config struct {
Driver string `mapstructure:"driver"`
Drivers map[string]map[string]interface{} `mapstructure:"drivers"`
}

var mutex = &sync.Mutex{}
func (c *config) init() {
if c.Driver == "" {
c.Driver = "memory"
}
}

type service struct {
conf *config
pm preferences.Manager
}

func getPreferencesManager(c *config) (preferences.Manager, error) {
if f, ok := registry.NewFuncs[c.Driver]; ok {
return f(c.Drivers[c.Driver])
}
return nil, errtypes.NotFound("driver not found: " + c.Driver)
}

type service struct{}
func parseConfig(m map[string]interface{}) (*config, error) {
c := &config{}
if err := mapstructure.Decode(m, c); err != nil {
err = errors.Wrap(err, "error decoding conf")
return nil, err
}
return c, nil
}

// New returns a new PreferencesServiceServer
func New(m map[string]interface{}, ss *grpc.Server) (rgrpc.Service, error) {
service := &service{}
return service, nil
c, err := parseConfig(m)
if err != nil {
return nil, err
}

c.init()

pm, err := getPreferencesManager(c)
if err != nil {
return nil, err
}

return &service{
conf: c,
pm: pm,
}, nil
}

func (s *service) Close() error {
Expand All @@ -63,72 +98,32 @@ func (s *service) UnprotectedEndpoints() []string {
}

func (s *service) Register(ss *grpc.Server) {
preferences.RegisterPreferencesAPIServer(ss, s)
}

func getUser(ctx context.Context) (*userpb.User, error) {
u, ok := ctxpkg.ContextGetUser(ctx)
if !ok {
err := errors.Wrap(contextUserRequiredErr("userrequired"), "preferences: error getting user from ctx")
return nil, err
}
return u, nil
preferencespb.RegisterPreferencesAPIServer(ss, s)
}

func (s *service) SetKey(ctx context.Context, req *preferences.SetKeyRequest) (*preferences.SetKeyResponse, error) {
key := req.Key
value := req.Val

u, err := getUser(ctx)
func (s *service) SetKey(ctx context.Context, req *preferencespb.SetKeyRequest) (*preferencespb.SetKeyResponse, error) {
err := s.pm.SetKey(ctx, req.Key.Key, req.Key.Namespace, req.Val)
if err != nil {
err = errors.Wrap(err, "preferences: failed to call getUser")
return &preferences.SetKeyResponse{
Status: status.NewUnauthenticated(ctx, err, "user not found or invalid"),
}, err
return &preferencespb.SetKeyResponse{
Status: status.NewInternal(ctx, err, "error setting key"),
}, nil
}

name := u.Username

mutex.Lock()
defer mutex.Unlock()
if len(m[name]) == 0 {
m[name] = map[string]string{key: value}
} else {
usersettings := m[name]
usersettings[key] = value
}

return &preferences.SetKeyResponse{
return &preferencespb.SetKeyResponse{
Status: status.NewOK(ctx),
}, nil
}

func (s *service) GetKey(ctx context.Context, req *preferences.GetKeyRequest) (*preferences.GetKeyResponse, error) {
key := req.Key
u, err := getUser(ctx)
func (s *service) GetKey(ctx context.Context, req *preferencespb.GetKeyRequest) (*preferencespb.GetKeyResponse, error) {
val, err := s.pm.GetKey(ctx, req.Key.Key, req.Key.Namespace)
if err != nil {
err = errors.Wrap(err, "preferences: failed to call getUser")
return &preferences.GetKeyResponse{
Status: status.NewUnauthenticated(ctx, err, "user not found or invalid"),
}, err
return &preferencespb.GetKeyResponse{
Status: status.NewInternal(ctx, err, "error retrieving key"),
}, nil
}

name := u.Username

mutex.Lock()
defer mutex.Unlock()
if len(m[name]) != 0 {
if value, ok := m[name][key]; ok {
return &preferences.GetKeyResponse{
Status: status.NewOK(ctx),
Val: value,
}, nil
}
}

res := &preferences.GetKeyResponse{
Status: status.NewNotFound(ctx, "key not found"),
Val: "",
}
return res, nil
return &preferencespb.GetKeyResponse{
Status: status.NewOK(ctx),
Val: val,
}, nil
}
2 changes: 1 addition & 1 deletion internal/http/services/appprovider/appprovider.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ func init() {
global.Register("appprovider", New)
}

// Config holds the config options that need to be passed down to all ocdav handlers
// Config holds the config options for the HTTP appprovider service
type Config struct {
Prefix string `mapstructure:"prefix"`
GatewaySvc string `mapstructure:"gatewaysvc"`
Expand Down
1 change: 1 addition & 0 deletions internal/http/services/loader/loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import (
_ "github.com/cs3org/reva/internal/http/services/ocmd"
_ "github.com/cs3org/reva/internal/http/services/owncloud/ocdav"
_ "github.com/cs3org/reva/internal/http/services/owncloud/ocs"
_ "github.com/cs3org/reva/internal/http/services/preferences"
_ "github.com/cs3org/reva/internal/http/services/prometheus"
_ "github.com/cs3org/reva/internal/http/services/reverseproxy"
_ "github.com/cs3org/reva/internal/http/services/siteacc"
Expand Down
Loading

0 comments on commit 5dda2b6

Please sign in to comment.