Skip to content
This repository has been archived by the owner on Jan 27, 2021. It is now read-only.

Commit

Permalink
Merge pull request #66 from owncloud/fix-fetching-value-by-identifier
Browse files Browse the repository at this point in the history
Fix fetching value by identifier and system scope values
  • Loading branch information
kulmann authored Aug 28, 2020
2 parents 8caf098 + b28f86f commit 0df7512
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 3 deletions.
7 changes: 7 additions & 0 deletions changelog/unreleased/fix-system-scope-values.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Bugfix: Fix loading and saving system scoped values

We fixed loading and saving system scoped values. Those are now saved without an account uuid, so that the value
can be loaded by other accounts as well.

https://github.com/owncloud/ocis-settings/pull/66

6 changes: 6 additions & 0 deletions changelog/unreleased/input-validation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Bugfix: Complete input validation

There was one handler function without input validation. We implemented the input validation for `ValueService.ReadValueByUniqueIdentifiers`.

https://github.com/owncloud/ocis-settings/pull/66

7 changes: 5 additions & 2 deletions pkg/service/v0/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -216,8 +216,11 @@ func (g Service) GetValue(c context.Context, req *proto.GetValueRequest, res *pr
}

// GetValueByUniqueIdentifiers implements the ValueService interface
func (g Service) GetValueByUniqueIdentifiers(ctx context.Context, in *proto.GetValueByUniqueIdentifiersRequest, res *proto.GetValueResponse) error {
v, err := g.manager.ReadValueByUniqueIdentifiers(in.AccountUuid, in.SettingId)
func (g Service) GetValueByUniqueIdentifiers(ctx context.Context, req *proto.GetValueByUniqueIdentifiersRequest, res *proto.GetValueResponse) error {
if validationError := validateGetValueByUniqueIdentifiers(req); validationError != nil {
return merrors.BadRequest(g.id, "%s", validationError)
}
v, err := g.manager.ReadValueByUniqueIdentifiers(req.AccountUuid, req.SettingId)
if err != nil {
return merrors.NotFound(g.id, "%s", err)
}
Expand Down
8 changes: 8 additions & 0 deletions pkg/service/v0/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,14 @@ func validateGetValue(req *proto.GetValueRequest) error {
return validation.Validate(req.Id, is.UUID)
}

func validateGetValueByUniqueIdentifiers(req *proto.GetValueByUniqueIdentifiersRequest) error {
return validation.ValidateStruct(
req,
validation.Field(&req.SettingId, is.UUID),
validation.Field(&req.AccountUuid, requireAccountID...),
)
}

func validateListValues(req *proto.ListValuesRequest) error {
return validation.ValidateStruct(
req,
Expand Down
15 changes: 14 additions & 1 deletion pkg/store/filesystem/values.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
package store

import (
"fmt"
"io/ioutil"
"path/filepath"

Expand Down Expand Up @@ -73,13 +74,18 @@ func (s Store) ReadValueByUniqueIdentifiers(accountUUID, settingID string) (*pro
return &proto.Value{}, nil
}

// if value saved without accountUUID, then it's a global value
if r.AccountUuid == "" && r.SettingId == settingID {
return &r, nil
}
// if value saved with accountUUID, then it's a user specific value
if r.AccountUuid == accountUUID && r.SettingId == settingID {
return &r, nil
}
}
}

return &proto.Value{}, nil
return nil, fmt.Errorf("could not read value by settingID=%v and accountID=%v", settingID, accountUUID)
}

// WriteValue writes the given value into a file within the dataPath
Expand All @@ -88,6 +94,13 @@ func (s Store) WriteValue(value *proto.Value) (*proto.Value, error) {
if value.Id == "" {
value.Id = uuid.Must(uuid.NewV4()).String()
}

// modify value depending on associated resource
if value.Resource.Type == proto.Resource_TYPE_SYSTEM {
value.AccountUuid = ""
}

// write the value
filePath := s.buildFilePathForValue(value.Id, true)
if err := s.writeRecordToFile(value, filePath); err != nil {
return nil, err
Expand Down

0 comments on commit 0df7512

Please sign in to comment.