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

Fix fetching value by identifier and system scope values #66

Merged
merged 3 commits into from
Aug 28, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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