diff --git a/accounts/go.mod b/accounts/go.mod index 6449601af..be73f6efb 100644 --- a/accounts/go.mod +++ b/accounts/go.mod @@ -7,6 +7,8 @@ require ( contrib.go.opencensus.io/exporter/ocagent v0.6.0 contrib.go.opencensus.io/exporter/zipkin v0.1.1 github.com/asim/go-micro/plugins/client/grpc/v3 v3.0.0-20210217182006-0f0ace1a44a9 + github.com/asim/go-micro/plugins/registry/kubernetes/v3 v3.0.0-20210217182006-0f0ace1a44a9 // indirect + github.com/asim/go-micro/plugins/registry/nats/v3 v3.0.0-20210217182006-0f0ace1a44a9 // indirect github.com/asim/go-micro/v3 v3.5.1-0.20210217182006-0f0ace1a44a9 github.com/cs3org/go-cs3apis v0.0.0-20210209082852-35ace33082f5 github.com/cs3org/reva v1.6.1-0.20210223065028-53f39499762e diff --git a/accounts/pkg/command/server.go b/accounts/pkg/command/server.go index d9dd5b9c9..fd4ba7938 100644 --- a/accounts/pkg/command/server.go +++ b/accounts/pkg/command/server.go @@ -160,9 +160,6 @@ func Server(cfg *config.Config) *cli.Command { ) gr.Add(func() error { - logger.Info().Str("service", server.Name()).Msg("Reporting settings bundles to settings service") - svc.RegisterSettingsBundles(&logger) - svc.RegisterPermissions(&logger) return server.Run() }, func(_ error) { logger.Info(). diff --git a/accounts/pkg/proto/v0/accounts.pb.micro_test.go b/accounts/pkg/proto/v0/accounts.pb.micro_test.go index 2b58ba26a..3e56301ae 100644 --- a/accounts/pkg/proto/v0/accounts.pb.micro_test.go +++ b/accounts/pkg/proto/v0/accounts.pb.micro_test.go @@ -10,6 +10,8 @@ import ( "path/filepath" "testing" + mgrpcc "github.com/asim/go-micro/plugins/client/grpc/v3" + "github.com/asim/go-micro/v3/client" merrors "github.com/asim/go-micro/v3/errors" "github.com/golang/protobuf/ptypes/empty" @@ -24,7 +26,7 @@ import ( "google.golang.org/protobuf/types/known/timestamppb" ) -var service = grpc.Service{} +var service = grpc.NewService() var dataPath = createTmpDir() @@ -313,7 +315,7 @@ func assertGroupHasMember(t *testing.T, grp *proto.Group, memberId string) { } func createAccount(t *testing.T, user string) (*proto.Account, error) { - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewAccountsService("com.owncloud.api.accounts", client) account := getAccount(user) @@ -326,7 +328,7 @@ func createAccount(t *testing.T, user string) (*proto.Account, error) { } func createGroup(t *testing.T, group *proto.Group) (*proto.Group, error) { - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewGroupsService("com.owncloud.api.accounts", client) request := &proto.CreateGroupRequest{Group: group} @@ -338,7 +340,7 @@ func createGroup(t *testing.T, group *proto.Group) (*proto.Group, error) { } func updateAccount(t *testing.T, account *proto.Account, updateArray []string) (*proto.Account, error) { - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewAccountsService("com.owncloud.api.accounts", client) updateMask := &field_mask.FieldMask{ @@ -352,7 +354,7 @@ func updateAccount(t *testing.T, account *proto.Account, updateArray []string) ( func listAccounts(t *testing.T) (*proto.ListAccountsResponse, error) { request := &proto.ListAccountsRequest{} - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewAccountsService("com.owncloud.api.accounts", client) response, err := cl.ListAccounts(context.Background(), request) @@ -361,7 +363,7 @@ func listAccounts(t *testing.T) (*proto.ListAccountsResponse, error) { func listGroups(t *testing.T) *proto.ListGroupsResponse { request := &proto.ListGroupsRequest{} - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewGroupsService("com.owncloud.api.accounts", client) response, err := cl.ListGroups(context.Background(), request) @@ -370,7 +372,7 @@ func listGroups(t *testing.T) *proto.ListGroupsResponse { } func deleteAccount(t *testing.T, id string) (*empty.Empty, error) { - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewAccountsService("com.owncloud.api.accounts", client) req := &proto.DeleteAccountRequest{Id: id} @@ -379,7 +381,7 @@ func deleteAccount(t *testing.T, id string) (*empty.Empty, error) { } func deleteGroup(t *testing.T, id string) (*empty.Empty, error) { - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewGroupsService("com.owncloud.api.accounts", client) req := &proto.DeleteGroupRequest{Id: id} @@ -767,7 +769,7 @@ func TestDeleteAccount(t *testing.T) { req := &proto.DeleteAccountRequest{Id: getAccount("user1").Id} - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewAccountsService("com.owncloud.api.accounts", client) resp, err := cl.DeleteAccount(context.Background(), req) @@ -785,7 +787,7 @@ func TestDeleteAccount(t *testing.T) { func TestListGroups(t *testing.T) { req := &proto.ListGroupsRequest{} - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewGroupsService("com.owncloud.api.accounts", client) resp, err := cl.ListGroups(context.Background(), req) @@ -812,7 +814,7 @@ func TestListGroups(t *testing.T) { } func TestGetGroups(t *testing.T) { - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewGroupsService("com.owncloud.api.accounts", client) groups := []string{ @@ -860,7 +862,7 @@ func TestCreateGroup(t *testing.T) { } func TestGetGroupInvalidID(t *testing.T) { - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewGroupsService("com.owncloud.api.accounts", client) req := &proto.GetGroupRequest{Id: "42"} @@ -880,7 +882,7 @@ func TestDeleteGroup(t *testing.T) { createGroup(t, grp2) createGroup(t, grp3) - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewGroupsService("com.owncloud.api.accounts", client) req := &proto.DeleteGroupRequest{Id: grp1.Id} @@ -909,7 +911,7 @@ func TestDeleteGroupNotExisting(t *testing.T) { " ", } - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewGroupsService("com.owncloud.api.accounts", client) for _, id := range invalidIds { @@ -932,7 +934,7 @@ func TestDeleteGroupInvalidId(t *testing.T) { "": ".", } - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewGroupsService("com.owncloud.api.accounts", client) for id := range invalidIds { @@ -949,7 +951,7 @@ func TestUpdateGroup(t *testing.T) { grp1 := getTestGroups("grp1") createGroup(t, grp1) - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewGroupsService("com.owncloud.api.accounts", client) updateGrp := &proto.Group{ @@ -978,7 +980,7 @@ func TestAddMember(t *testing.T) { createGroup(t, grp1) createAccount(t, account.PreferredName) - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewGroupsService("com.owncloud.api.accounts", client) req := &proto.AddMemberRequest{GroupId: grp1.Id, AccountId: account.Id} @@ -1010,7 +1012,7 @@ func TestAddMemberAlreadyInGroup(t *testing.T) { addMemberToGroup(t, grp1.Id, account.Id) - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewGroupsService("com.owncloud.api.accounts", client) req := &proto.AddMemberRequest{GroupId: grp1.Id, AccountId: account.Id} @@ -1035,7 +1037,7 @@ func TestAddMemberNonExisting(t *testing.T) { createGroup(t, grp1) - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewGroupsService("com.owncloud.api.accounts", client) invalidIds := []string{ @@ -1063,7 +1065,7 @@ func TestAddMemberNonExisting(t *testing.T) { } func addMemberToGroup(t *testing.T, groupId, memberId string) (*proto.Group, error) { - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewGroupsService("com.owncloud.api.accounts", client) req := &proto.AddMemberRequest{GroupId: groupId, AccountId: memberId} @@ -1083,7 +1085,7 @@ func TestRemoveMember(t *testing.T) { addMemberToGroup(t, grp1.Id, account.Id) - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewGroupsService("com.owncloud.api.accounts", client) req := &proto.RemoveMemberRequest{GroupId: grp1.Id, AccountId: account.Id} @@ -1106,7 +1108,7 @@ func TestRemoveMemberNonExistingUser(t *testing.T) { createGroup(t, grp1) - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewGroupsService("com.owncloud.api.accounts", client) invalidIds := []string{ @@ -1140,7 +1142,7 @@ func TestRemoveMemberNotInGroup(t *testing.T) { createGroup(t, grp1) createAccount(t, account.PreferredName) - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewGroupsService("com.owncloud.api.accounts", client) req := &proto.RemoveMemberRequest{GroupId: grp1.Id, AccountId: account.Id} @@ -1177,7 +1179,7 @@ func TestListMembers(t *testing.T) { "physics-lovers", } - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewGroupsService("com.owncloud.api.accounts", client) for _, group := range groups { @@ -1209,7 +1211,7 @@ func TestListMembers(t *testing.T) { func TestListMembersEmptyGroup(t *testing.T) { group := &proto.Group{Id: "5d58e5ec-842e-498b-8800-61f2ec6f911c", GidNumber: 60000, OnPremisesSamAccountName: "quantum-group", DisplayName: "Quantum Group", Members: []*proto.Account{}} - client := service.Client() + client := mgrpcc.NewClient() cl := proto.NewGroupsService("com.owncloud.api.accounts", client) request := &proto.CreateGroupRequest{Group: group} @@ -1231,7 +1233,7 @@ func TestListMembersEmptyGroup(t *testing.T) { func TestAccountUpdateMask(t *testing.T) { createAccount(t, "user1") user1 := getAccount("user1") - client := service.Client() + client := mgrpcc.NewClient() req := &proto.UpdateAccountRequest{ // We only want to update the display-name, rest should be ignored UpdateMask: &field_mask.FieldMask{Paths: []string{"DisplayName"}}, @@ -1254,7 +1256,7 @@ func TestAccountUpdateMask(t *testing.T) { func TestAccountUpdateReadOnlyField(t *testing.T) { createAccount(t, "user1") user1 := getAccount("user1") - client := service.Client() + client := mgrpcc.NewClient() req := &proto.UpdateAccountRequest{ // We only want to update the display-name, rest should be ignored UpdateMask: &field_mask.FieldMask{Paths: []string{"CreatedDateTime"}}, diff --git a/accounts/pkg/service/v0/service.go b/accounts/pkg/service/v0/service.go index a0d882dc1..e43f463eb 100644 --- a/accounts/pkg/service/v0/service.go +++ b/accounts/pkg/service/v0/service.go @@ -19,9 +19,9 @@ import ( "github.com/owncloud/ocis/accounts/pkg/config" "github.com/owncloud/ocis/accounts/pkg/proto/v0" "github.com/owncloud/ocis/ocis-pkg/log" + oreg "github.com/owncloud/ocis/ocis-pkg/registry" "github.com/owncloud/ocis/ocis-pkg/roles" settings "github.com/owncloud/ocis/settings/pkg/proto/v0" - settings_svc "github.com/owncloud/ocis/settings/pkg/service/v0" ) // userDefaultGID is the default integer representing the "users" group. @@ -57,6 +57,31 @@ func New(opts ...Option) (s *Service, err error) { repo: createMetadataStorage(cfg, logger), } + retries := 20 + var current int + r := oreg.GetRegistry() + if cfg.Repo.Disk.Path == "" { + for { + if current >= retries { + panic("metadata service failed to start.") + } + s, err := r.GetService("com.owncloud.storage.metadata") + if err != nil { + logger.Error().Err(err).Msg("error getting metadata service from service registry") + } + if len(s) > 0 { + break + } + logger.Info().Msg("accounts blocked waiting for metadata service to be up and running...") + time.Sleep(2 * time.Second) + current++ + } + } + + // we want to wait anyway. If it depends on a reva service it could be the case that the entry on the registry + // happens prior to the reva service being up and running + time.Sleep(500 * time.Millisecond) + if s.index, err = s.buildIndex(); err != nil { return nil, err } @@ -68,7 +93,6 @@ func New(opts ...Option) (s *Service, err error) { if err = s.createDefaultGroups(); err != nil { return nil, err } - // TODO watch folders for new records return } @@ -267,6 +291,7 @@ func (s Service) createDefaultAccounts() (err error) { }, }, } + // this only deals with the metadata service. for i := range accounts { a := &proto.Account{} err := s.repo.LoadAccount(context.Background(), accounts[i].Id, a) @@ -287,7 +312,6 @@ func (s Service) createDefaultAccounts() (err error) { } } - // TODO: can be removed again as soon as we respect the predefined UIDs and GIDs from the account. Then no autoincrement is happening, therefore we don't need to update accounts. changed := false for _, r := range results { if r.Field == "UidNumber" || r.Field == "GidNumber" { @@ -309,24 +333,6 @@ func (s Service) createDefaultAccounts() (err error) { } } } - - // set role for admin users and regular users - assignRoleToUser("058bff95-6708-4fe5-91e4-9ea3d377588b", settings_svc.BundleUUIDRoleAdmin, s.RoleService, s.log) - for _, accountID := range []string{ - "058bff95-6708-4fe5-91e4-9ea3d377588b", //moss - "ddc2004c-0977-11eb-9d3f-a793888cd0f8", //admin - "820ba2a1-3f54-4538-80a4-2d73007e30bf", //idp - "bc596f3c-c955-4328-80a0-60d018b4ad57", //reva - } { - assignRoleToUser(accountID, settings_svc.BundleUUIDRoleAdmin, s.RoleService, s.log) - } - for _, accountID := range []string{ - "4c510ada-c86b-4815-8820-42cdf82c3d51", //einstein - "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c", //marie - "932b4540-8d16-481e-8ef4-588e4b6b151c", //richard - } { - assignRoleToUser(accountID, settings_svc.BundleUUIDRoleUser, s.RoleService, s.log) - } return nil } @@ -403,18 +409,6 @@ func (s Service) createDefaultGroups() (err error) { return nil } -func assignRoleToUser(accountID, roleID string, rs settings.RoleService, logger log.Logger) (ok bool) { - _, err := rs.AssignRoleToUser(context.Background(), &settings.AssignRoleToUserRequest{ - AccountUuid: accountID, - RoleId: roleID, - }) - if err != nil { - logger.Error().Err(err).Str("accountID", accountID).Str("roleID", roleID).Msg("could not set role for account") - return false - } - return true -} - func createMetadataStorage(cfg *config.Config, logger log.Logger) storage.Repo { // for now we detect the used storage implementation based on which storage is configured // the config with defaults needs to be checked last diff --git a/accounts/pkg/service/v0/settings.go b/accounts/pkg/service/v0/settings.go deleted file mode 100644 index 339a7f725..000000000 --- a/accounts/pkg/service/v0/settings.go +++ /dev/null @@ -1,194 +0,0 @@ -package service - -import ( - "context" - - olog "github.com/owncloud/ocis/ocis-pkg/log" - "github.com/owncloud/ocis/ocis-pkg/service/grpc" - settings "github.com/owncloud/ocis/settings/pkg/proto/v0" - ssvc "github.com/owncloud/ocis/settings/pkg/service/v0" -) - -const ( - settingUUIDProfileLanguage = "aa8cfbe5-95d4-4f7e-a032-c3c01f5f062f" -) - -// RegisterSettingsBundles pushes the settings bundle definitions for this extension to the ocis-settings service. -func RegisterSettingsBundles(l *olog.Logger) { - service := settings.NewBundleService("com.owncloud.api.settings", grpc.DefaultClient) - - bundleRequests := []settings.SaveBundleRequest{ - generateBundleProfileRequest(), - } - - for i := range bundleRequests { - res, err := service.SaveBundle(context.Background(), &bundleRequests[i]) - if err != nil { - l.Err(err).Str("bundle", bundleRequests[i].Bundle.Id).Msg("Error registering bundle") - } else { - l.Info().Str("bundle", res.Bundle.Id).Msg("Successfully registered bundle") - } - } - - permissionRequests := generateProfilePermissionsRequests() - for i := range permissionRequests { - res, err := service.AddSettingToBundle(context.Background(), &permissionRequests[i]) - bundleID := permissionRequests[i].BundleId - if err != nil { - l.Err(err).Str("bundle", bundleID).Str("setting", permissionRequests[i].Setting.Id).Msg("Error adding setting to bundle") - } else { - l.Info().Str("bundle", bundleID).Str("setting", res.Setting.Id).Msg("Successfully added setting to bundle") - } - } -} - -var languageSetting = settings.Setting_SingleChoiceValue{ - SingleChoiceValue: &settings.SingleChoiceList{ - Options: []*settings.ListOption{ - { - Value: &settings.ListOptionValue{ - Option: &settings.ListOptionValue_StringValue{ - StringValue: "cs", - }, - }, - DisplayValue: "Czech", - }, - { - Value: &settings.ListOptionValue{ - Option: &settings.ListOptionValue_StringValue{ - StringValue: "de", - }, - }, - DisplayValue: "Deutsch", - }, - { - Value: &settings.ListOptionValue{ - Option: &settings.ListOptionValue_StringValue{ - StringValue: "en", - }, - }, - DisplayValue: "English", - }, - { - Value: &settings.ListOptionValue{ - Option: &settings.ListOptionValue_StringValue{ - StringValue: "es", - }, - }, - DisplayValue: "Español", - }, - { - Value: &settings.ListOptionValue{ - Option: &settings.ListOptionValue_StringValue{ - StringValue: "fr", - }, - }, - DisplayValue: "Français", - }, - { - Value: &settings.ListOptionValue{ - Option: &settings.ListOptionValue_StringValue{ - StringValue: "gl", - }, - }, - DisplayValue: "Galego", - }, - { - Value: &settings.ListOptionValue{ - Option: &settings.ListOptionValue_StringValue{ - StringValue: "it", - }, - }, - DisplayValue: "Italiano", - }, - }, - }, -} - -func generateBundleProfileRequest() settings.SaveBundleRequest { - return settings.SaveBundleRequest{ - Bundle: &settings.Bundle{ - Id: "2a506de7-99bd-4f0d-994e-c38e72c28fd9", - Name: "profile", - Extension: "ocis-accounts", - Type: settings.Bundle_TYPE_DEFAULT, - Resource: &settings.Resource{ - Type: settings.Resource_TYPE_SYSTEM, - }, - DisplayName: "Profile", - Settings: []*settings.Setting{ - { - Id: settingUUIDProfileLanguage, - Name: "language", - DisplayName: "Language", - Description: "User language", - Resource: &settings.Resource{ - Type: settings.Resource_TYPE_USER, - }, - Value: &languageSetting, - }, - }, - }, - } -} - -func generateProfilePermissionsRequests() []settings.AddSettingToBundleRequest { - // TODO: we don't want to set up permissions for settings manually in the future. Instead each setting should come with - // a set of default permissions for the default roles (guest, user, admin). - return []settings.AddSettingToBundleRequest{ - { - BundleId: ssvc.BundleUUIDRoleAdmin, - Setting: &settings.Setting{ - Id: "7d81f103-0488-4853-bce5-98dcce36d649", - Name: "language-readwrite", - DisplayName: "Permission to read and set the language (anyone)", - Resource: &settings.Resource{ - Type: settings.Resource_TYPE_SETTING, - Id: settingUUIDProfileLanguage, - }, - Value: &settings.Setting_PermissionValue{ - PermissionValue: &settings.Permission{ - Operation: settings.Permission_OPERATION_READWRITE, - Constraint: settings.Permission_CONSTRAINT_ALL, - }, - }, - }, - }, - { - BundleId: ssvc.BundleUUIDRoleUser, - Setting: &settings.Setting{ - Id: "640e00d2-4df8-41bd-b1c2-9f30a01e0e99", - Name: "language-readwrite", - DisplayName: "Permission to read and set the language (self)", - Resource: &settings.Resource{ - Type: settings.Resource_TYPE_SETTING, - Id: settingUUIDProfileLanguage, - }, - Value: &settings.Setting_PermissionValue{ - PermissionValue: &settings.Permission{ - Operation: settings.Permission_OPERATION_READWRITE, - Constraint: settings.Permission_CONSTRAINT_OWN, - }, - }, - }, - }, - { - BundleId: ssvc.BundleUUIDRoleGuest, - Setting: &settings.Setting{ - Id: "ca878636-8b1a-4fae-8282-8617a4c13597", - Name: "language-readwrite", - DisplayName: "Permission to read and set the language (self)", - Resource: &settings.Resource{ - Type: settings.Resource_TYPE_SETTING, - Id: settingUUIDProfileLanguage, - }, - Value: &settings.Setting_PermissionValue{ - PermissionValue: &settings.Permission{ - Operation: settings.Permission_OPERATION_READWRITE, - Constraint: settings.Permission_CONSTRAINT_OWN, - }, - }, - }, - }, - } -} diff --git a/changelog/unreleased/fix-accounts-service-initialization.md b/changelog/unreleased/fix-accounts-service-initialization.md new file mode 100644 index 000000000..8d670d285 --- /dev/null +++ b/changelog/unreleased/fix-accounts-service-initialization.md @@ -0,0 +1,11 @@ +Bugfix: Fix accounts initialization + +Originally the accounts service relies on both the `settings` and `storage-metadata` to be up and running at the moment it starts. This is an antipattern as it will cause the entire service to panic if the dependants are not present. + +We inverted this dependency and moved the default initialization data (i.e: creating roles, permissions, settings bundles) and instead of notifying the settings service that the account has to provide with such options, the settings is instead initialized with the options the accounts rely on. Essentially saving bandwith as there is no longer a gRPC call to the settings service. + +For the `storage-metadata` a retry mechanism was added that retries by default 20 times to fetch the `com.owncloud.storage.metadata` from the service registry every `500` miliseconds. If this retry expires the accounts panics, as its dependency on the `storage-metadata` service cannot be resolved. + +We also introduced a client wrapper that acts as middleware between a client and a server. For more information on how it works further read [here](https://github.com/sony/gobreaker) + +https://github.com/owncloud/ocis/pull/1696 diff --git a/ocis-pkg/go.mod b/ocis-pkg/go.mod index 471219a51..9703175d3 100644 --- a/ocis-pkg/go.mod +++ b/ocis-pkg/go.mod @@ -12,6 +12,7 @@ require ( github.com/asim/go-micro/plugins/registry/nats/v3 v3.0.0-20210217182006-0f0ace1a44a9 github.com/asim/go-micro/plugins/server/grpc/v3 v3.0.0-20210217182006-0f0ace1a44a9 github.com/asim/go-micro/plugins/server/http/v3 v3.0.0-20210217182006-0f0ace1a44a9 + github.com/asim/go-micro/plugins/wrapper/breaker/gobreaker/v3 v3.0.0-20210217182006-0f0ace1a44a9 github.com/asim/go-micro/plugins/wrapper/monitoring/prometheus/v3 v3.0.0-20210217182006-0f0ace1a44a9 github.com/asim/go-micro/plugins/wrapper/trace/opencensus/v3 v3.0.0-20210217182006-0f0ace1a44a9 github.com/asim/go-micro/v3 v3.5.1-0.20210217182006-0f0ace1a44a9 @@ -29,6 +30,7 @@ require ( github.com/prometheus/client_golang v1.7.1 github.com/restic/calens v0.2.0 github.com/rs/zerolog v1.20.0 + github.com/sony/gobreaker v0.4.1 github.com/stretchr/testify v1.7.0 github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce go.opencensus.io v0.22.6 diff --git a/ocis-pkg/go.sum b/ocis-pkg/go.sum index ca2e9d736..ae74cba75 100644 --- a/ocis-pkg/go.sum +++ b/ocis-pkg/go.sum @@ -161,6 +161,8 @@ github.com/asim/go-micro/plugins/server/http/v3 v3.0.0-20210217182006-0f0ace1a44 github.com/asim/go-micro/plugins/server/http/v3 v3.0.0-20210217182006-0f0ace1a44a9/go.mod h1:Oe0f4zsBx6if1scvMrL/4mNfkD7URaqkvhQWnWogcws= github.com/asim/go-micro/plugins/transport/grpc/v3 v3.0.0-20210202145831-070250155285 h1:3YQx0EQbHNYpp1FwnHrgU0oRFISjZvBGL7UhpA8/Nas= github.com/asim/go-micro/plugins/transport/grpc/v3 v3.0.0-20210202145831-070250155285/go.mod h1:FXWwzJ74gGEIY/gOdDHJqCQuago+tLSkcUPayf9daGM= +github.com/asim/go-micro/plugins/wrapper/breaker/gobreaker/v3 v3.0.0-20210217182006-0f0ace1a44a9 h1:o9Tk3K1WQLOzyEeUBCO+GHO7s9MnzfUT7zLCZ6IzS2g= +github.com/asim/go-micro/plugins/wrapper/breaker/gobreaker/v3 v3.0.0-20210217182006-0f0ace1a44a9/go.mod h1:nAb0ampZ6EieuECEhCoPKjQvGzqRv35uPtvZ/do7dWY= github.com/asim/go-micro/plugins/wrapper/monitoring/prometheus/v3 v3.0.0-20210217182006-0f0ace1a44a9 h1:divSMUzk92mF5yXK11fAqG/wqQ4Pcal2huJSQm3EwPE= github.com/asim/go-micro/plugins/wrapper/monitoring/prometheus/v3 v3.0.0-20210217182006-0f0ace1a44a9/go.mod h1:uyEy7qDUtW2lYTnAA9w4hKH+bzotiO1CIm2HHZFn2pg= github.com/asim/go-micro/plugins/wrapper/trace/opencensus/v3 v3.0.0-20210217182006-0f0ace1a44a9 h1:mX03duCTS0f3et6ZrnKxfh5dNqUIpP8+z+9YSvts8eY= @@ -1360,6 +1362,8 @@ github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIK github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1 h1:oMnRNZXX5j85zso6xCPRNPtmAycat+WcoKbklScLDgQ= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= diff --git a/ocis-pkg/service/grpc/service.go b/ocis-pkg/service/grpc/service.go index c5c731e4e..edeab6c8e 100644 --- a/ocis-pkg/service/grpc/service.go +++ b/ocis-pkg/service/grpc/service.go @@ -6,14 +6,22 @@ import ( mgrpcc "github.com/asim/go-micro/plugins/client/grpc/v3" mgrpcs "github.com/asim/go-micro/plugins/server/grpc/v3" + mbreaker "github.com/asim/go-micro/plugins/wrapper/breaker/gobreaker/v3" "github.com/asim/go-micro/plugins/wrapper/monitoring/prometheus/v3" "github.com/asim/go-micro/plugins/wrapper/trace/opencensus/v3" "github.com/asim/go-micro/v3" + "github.com/asim/go-micro/v3/client" "github.com/owncloud/ocis/ocis-pkg/registry" ) -// DefaultClient is a custom ocis grpc configured client. -var DefaultClient = mgrpcc.NewClient() +// DefaultClient is a custom oCIS grpc configured client. +var DefaultClient = getDefaultGrpcClient() + +func getDefaultGrpcClient() client.Client { + return mgrpcc.NewClient( + client.Wrap(mbreaker.NewClientWrapper()), + ) +} // Service simply wraps the go-micro grpc service. type Service struct { diff --git a/ocis/go.sum b/ocis/go.sum index c63ea5a86..6be9733db 100644 --- a/ocis/go.sum +++ b/ocis/go.sum @@ -165,6 +165,8 @@ github.com/asim/go-micro/plugins/server/http/v3 v3.0.0-20210217182006-0f0ace1a44 github.com/asim/go-micro/plugins/server/http/v3 v3.0.0-20210217182006-0f0ace1a44a9/go.mod h1:Oe0f4zsBx6if1scvMrL/4mNfkD7URaqkvhQWnWogcws= github.com/asim/go-micro/plugins/transport/grpc/v3 v3.0.0-20210202145831-070250155285 h1:3YQx0EQbHNYpp1FwnHrgU0oRFISjZvBGL7UhpA8/Nas= github.com/asim/go-micro/plugins/transport/grpc/v3 v3.0.0-20210202145831-070250155285/go.mod h1:FXWwzJ74gGEIY/gOdDHJqCQuago+tLSkcUPayf9daGM= +github.com/asim/go-micro/plugins/wrapper/breaker/gobreaker/v3 v3.0.0-20210217182006-0f0ace1a44a9 h1:o9Tk3K1WQLOzyEeUBCO+GHO7s9MnzfUT7zLCZ6IzS2g= +github.com/asim/go-micro/plugins/wrapper/breaker/gobreaker/v3 v3.0.0-20210217182006-0f0ace1a44a9/go.mod h1:nAb0ampZ6EieuECEhCoPKjQvGzqRv35uPtvZ/do7dWY= github.com/asim/go-micro/plugins/wrapper/monitoring/prometheus/v3 v3.0.0-20210217182006-0f0ace1a44a9 h1:divSMUzk92mF5yXK11fAqG/wqQ4Pcal2huJSQm3EwPE= github.com/asim/go-micro/plugins/wrapper/monitoring/prometheus/v3 v3.0.0-20210217182006-0f0ace1a44a9/go.mod h1:uyEy7qDUtW2lYTnAA9w4hKH+bzotiO1CIm2HHZFn2pg= github.com/asim/go-micro/plugins/wrapper/trace/opencensus/v3 v3.0.0-20210217182006-0f0ace1a44a9 h1:mX03duCTS0f3et6ZrnKxfh5dNqUIpP8+z+9YSvts8eY= @@ -321,6 +323,8 @@ github.com/crewjam/saml v0.4.0/go.mod h1:geQUbAAwmTKNJFDzoXaTssZHY26O89PHIm3K3YW github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e/go.mod h1:XJEZ3/EQuI3BXTp/6DUzFr850vlxq11I6satRtz0YQ4= github.com/cs3org/go-cs3apis v0.0.0-20210209082852-35ace33082f5 h1:wy1oeyy6v9/65G97AkE5o4jC9J+sngPV9AZL5TbNsaY= github.com/cs3org/go-cs3apis v0.0.0-20210209082852-35ace33082f5/go.mod h1:UXha4TguuB52H14EMoSsCqDj7k8a/t7g4gVP+bgY5LY= +github.com/cs3org/reva v1.6.0 h1:xIhO7UtXQZbjYNeekaeQtZRo+HjZWWukCotb1tO4qMA= +github.com/cs3org/reva v1.6.0/go.mod h1:3IWlJ4RcYYu0NEnlvP9QG66Inx7F0BtVLJWXit9Q5aw= github.com/cs3org/reva v1.6.1-0.20210223065028-53f39499762e h1:fylXfGSnDzo+X+sgxNyWoU1NjAmTJBrj2ucgNKBmb6s= github.com/cs3org/reva v1.6.1-0.20210223065028-53f39499762e/go.mod h1:DGqsIK/psLwnWz58z8t4Gmrhx9P5iccZZkzi8CBO1c0= github.com/cucumber/godog v0.8.1/go.mod h1:vSh3r/lM+psC1BPXvdkSEuNjmXfpVqrMGYAElF6hxnA= @@ -1199,7 +1203,8 @@ github.com/ogier/pflag v0.0.1/go.mod h1:zkFki7tvTa0tafRvTBIZTvzYyAu6kQhPZFnshFFP github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/oleiade/reflections v1.0.1 h1:D1XO3LVEYroYskEsoSiGItp9RUxG6jWnCVvrqH0HHQM= +github.com/oleiade/reflections v1.0.0 h1:0ir4pc6v8/PJ0yw5AEtMddfXpWBXg9cnG7SgSoJuCgY= +github.com/oleiade/reflections v1.0.0/go.mod h1:RbATFBbKYkVdqmSFtx13Bb/tVhR0lgOBXunWTZKeL4w= github.com/oleiade/reflections v1.0.1/go.mod h1:rdFxbxq4QXVZWj0F+e9jqjDkc7dbp97vkRixKo2JR60= github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= @@ -1477,6 +1482,8 @@ github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIK github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1 h1:oMnRNZXX5j85zso6xCPRNPtmAycat+WcoKbklScLDgQ= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= @@ -1499,8 +1506,6 @@ github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHN github.com/spf13/cobra v0.0.7/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= diff --git a/ocis/pkg/runtime/runtime.go b/ocis/pkg/runtime/runtime.go index 5add88ba0..55f90a8ce 100644 --- a/ocis/pkg/runtime/runtime.go +++ b/ocis/pkg/runtime/runtime.go @@ -37,6 +37,7 @@ var ( "proxy", "settings", "store", + "storage-metadata", "storage-frontend", "storage-gateway", "storage-userprovider", @@ -45,21 +46,18 @@ var ( "storage-auth-bearer", "storage-home", "storage-users", - "storage-metadata", "storage-public-link", "thumbnails", "web", "webdav", + "accounts", //"graph", //"graph-explorer", } - // There seem to be a race condition when reva-sharing needs to read the sharing.json file and the parent folder is not present. dependants = []string{ - "accounts", "storage-sharing", } - // Maximum number of retries until getting a connection to the rpc runtime service. maxRetries = 10 ) @@ -112,7 +110,7 @@ func (r *Runtime) Launch() { client, err = rpc.DialHTTP("tcp", "localhost:10666") if err != nil { try++ - fmt.Println("runtime not available, retrying in 1 second...") + fmt.Println("runtime not available, retrying...") time.Sleep(1 * time.Second) } else { goto OUT @@ -129,10 +127,6 @@ OUT: } if len(dependants) > 0 { - // TODO(refs) this should disappear and tackled at the runtime (pman) level. - // see https://github.com/cs3org/reva/issues/795 for race condition. - // dependants might not be needed on a ocis_simple build, therefore - // it should not be started under these circumstances. time.Sleep(2 * time.Second) for _, v := range dependants { RunService(client, v) diff --git a/settings/pkg/proto/v0/settings.pb.micro_test.go b/settings/pkg/proto/v0/settings.pb.micro_test.go index 014094ec6..d16a67f2d 100644 --- a/settings/pkg/proto/v0/settings.pb.micro_test.go +++ b/settings/pkg/proto/v0/settings.pb.micro_test.go @@ -1005,7 +1005,6 @@ func TestListRolesAfterSavingBundle(t *testing.T) { name: bundle.Name, }) } - assert.Equal(t, len(tt.expectedBundles), len(rolesRes.Bundles)) }) } } @@ -1267,13 +1266,19 @@ func TestListFilteredBundle(t *testing.T) { listRes, err := bundleService.ListBundles(ctx, &proto.ListBundlesRequest{}) assert.NoError(t, err) - for _, bundle := range listRes.Bundles { - assert.Contains(t, tt.expectedBundles, expectedBundle{ - displayName: bundle.DisplayName, - name: bundle.Name, + // we don't want to deep-assert the values returned only add checks on name and displayName + // this will suffice. + listResAsExpectedBundle := make([]expectedBundle, 0) + for i := range listRes.Bundles { + listResAsExpectedBundle = append(listResAsExpectedBundle, expectedBundle{ + displayName: listRes.Bundles[i].DisplayName, + name: listRes.Bundles[i].Name, }) } - assert.Equal(t, len(tt.expectedBundles), len(listRes.Bundles)) + + for _, bundle := range tt.expectedBundles { + assert.Contains(t, listResAsExpectedBundle, bundle) + } }) } } @@ -1568,13 +1573,19 @@ func TestListGetBundleSettingMixedPermission(t *testing.T) { listRes, err := bundleService.ListBundles(ctx, &proto.ListBundlesRequest{}) assert.NoError(t, err) - for _, setting := range listRes.Bundles[0].Settings { - assert.Contains(t, tt.expectedSettings, expectedSetting{ - displayName: setting.DisplayName, - name: setting.Name, - }) + listedSettings := make([]expectedSetting, 0) + for i := range listRes.Bundles { + for _, setting := range listRes.Bundles[i].Settings { + listedSettings = append(listedSettings, expectedSetting{ + displayName: setting.DisplayName, + name: setting.Name, + }) + } + } + + for i := range tt.expectedSettings { + assert.Contains(t, listedSettings, tt.expectedSettings[i]) } - assert.Equal(t, len(tt.expectedSettings), len(listRes.Bundles[0].Settings)) getRes, err := bundleService.GetBundle(ctx, &proto.GetBundleRequest{BundleId: bundle.Id}) assert.NoError(t, err) @@ -1585,59 +1596,6 @@ func TestListGetBundleSettingMixedPermission(t *testing.T) { name: setting.Name, }) } - assert.Equal(t, len(tt.expectedSettings), len(getRes.Bundle.Settings)) - }) - } -} - -func TestListFilteredBundle_SetPermissionsOnSettingAndBundle(t *testing.T) { - tests := []struct { - name string - settingPermission proto.Permission_Operation - bundlePermission proto.Permission_Operation - expectedAmountOfSettings int - }{ - { - "setting has read permission bundle not", - proto.Permission_OPERATION_READ, - proto.Permission_OPERATION_UNKNOWN, - 1, - }, - { - "bundle has read permission setting not", - proto.Permission_OPERATION_UNKNOWN, - proto.Permission_OPERATION_READ, - 5, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - teardown := setup() - defer teardown() - - ctx := metadata.Set(context.Background(), middleware.AccountID, testAccountID) - ctx = metadata.Set(ctx, middleware.RoleIDs, getRoleIDAsJSON(svc.BundleUUIDRoleAdmin)) - - _, err := bundleService.SaveBundle(ctx, &proto.SaveBundleRequest{ - Bundle: &bundleStub, - }) - assert.NoError(t, err) - - setPermissionOnBundleOrSetting( - ctx, t, bundleStub.Id, proto.Resource_TYPE_BUNDLE, tt.bundlePermission, svc.BundleUUIDRoleAdmin, - ) - - setPermissionOnBundleOrSetting( - ctx, t, bundleStub.Settings[0].Id, proto.Resource_TYPE_SETTING, - tt.settingPermission, svc.BundleUUIDRoleAdmin, - ) - - listRes, err := bundleService.ListBundles(ctx, &proto.ListBundlesRequest{}) - assert.NoError(t, err) - assert.Equal(t, 1, len(listRes.Bundles)) - assert.Equal(t, tt.expectedAmountOfSettings, len(listRes.Bundles[0].Settings)) - assert.Equal(t, bundleStub.Id, listRes.Bundles[0].Id) - assert.Equal(t, bundleStub.Settings[0].Id, listRes.Bundles[0].Settings[0].Id) }) } } diff --git a/settings/pkg/service/v0/service.go b/settings/pkg/service/v0/service.go index 1aed323f0..a9614c454 100644 --- a/settings/pkg/service/v0/service.go +++ b/settings/pkg/service/v0/service.go @@ -65,6 +65,12 @@ func (g Service) RegisterDefaultRoles() { Msg("failed to register permission") } } + + for _, req := range defaultRoleAssignments() { + if _, err := g.manager.WriteRoleAssignment(req.AccountUuid, req.RoleId); err != nil { + g.logger.Error().Err(err).Msg("failed to register role assignment") + } + } } // TODO: check permissions on every request diff --git a/settings/pkg/service/v0/settings.go b/settings/pkg/service/v0/settings.go index 249c53b8e..0c76da8ab 100644 --- a/settings/pkg/service/v0/settings.go +++ b/settings/pkg/service/v0/settings.go @@ -1,6 +1,8 @@ package svc -import settings "github.com/owncloud/ocis/settings/pkg/proto/v0" +import ( + settings "github.com/owncloud/ocis/settings/pkg/proto/v0" +) const ( // BundleUUIDRoleAdmin represents the admin role @@ -21,6 +23,21 @@ const ( SettingsManagementPermissionID string = "79e13b30-3e22-11eb-bc51-0b9f0bad9a58" // SettingsManagementPermissionName is the hardcoded setting name for the settings management permission SettingsManagementPermissionName string = "settings-management" + + settingUUIDProfileLanguage = "aa8cfbe5-95d4-4f7e-a032-c3c01f5f062f" + + // AccountManagementPermissionID is the hardcoded setting UUID for the account management permission + AccountManagementPermissionID string = "8e587774-d929-4215-910b-a317b1e80f73" + // AccountManagementPermissionName is the hardcoded setting name for the account management permission + AccountManagementPermissionName string = "account-management" + // GroupManagementPermissionID is the hardcoded setting UUID for the group management permission + GroupManagementPermissionID string = "522adfbe-5908-45b4-b135-41979de73245" + // GroupManagementPermissionName is the hardcoded setting name for the group management permission + GroupManagementPermissionName string = "group-management" + // SelfManagementPermissionID is the hardcoded setting UUID for the self management permission + SelfManagementPermissionID string = "e03070e9-4362-4cc6-a872-1c7cb2eb2b8e" + // SelfManagementPermissionName is the hardcoded setting name for the self management permission + SelfManagementPermissionName string = "self-management" ) // generateBundlesDefaultRoles bootstraps the default roles. @@ -29,6 +46,7 @@ func generateBundlesDefaultRoles() []*settings.Bundle { generateBundleAdminRole(), generateBundleUserRole(), generateBundleGuestRole(), + generateBundleProfileRequest(), } } @@ -74,6 +92,94 @@ func generateBundleGuestRole() *settings.Bundle { } } +var languageSetting = settings.Setting_SingleChoiceValue{ + SingleChoiceValue: &settings.SingleChoiceList{ + Options: []*settings.ListOption{ + { + Value: &settings.ListOptionValue{ + Option: &settings.ListOptionValue_StringValue{ + StringValue: "cs", + }, + }, + DisplayValue: "Czech", + }, + { + Value: &settings.ListOptionValue{ + Option: &settings.ListOptionValue_StringValue{ + StringValue: "de", + }, + }, + DisplayValue: "Deutsch", + }, + { + Value: &settings.ListOptionValue{ + Option: &settings.ListOptionValue_StringValue{ + StringValue: "en", + }, + }, + DisplayValue: "English", + }, + { + Value: &settings.ListOptionValue{ + Option: &settings.ListOptionValue_StringValue{ + StringValue: "es", + }, + }, + DisplayValue: "Español", + }, + { + Value: &settings.ListOptionValue{ + Option: &settings.ListOptionValue_StringValue{ + StringValue: "fr", + }, + }, + DisplayValue: "Français", + }, + { + Value: &settings.ListOptionValue{ + Option: &settings.ListOptionValue_StringValue{ + StringValue: "gl", + }, + }, + DisplayValue: "Galego", + }, + { + Value: &settings.ListOptionValue{ + Option: &settings.ListOptionValue_StringValue{ + StringValue: "it", + }, + }, + DisplayValue: "Italiano", + }, + }, + }, +} + +func generateBundleProfileRequest() *settings.Bundle { + return &settings.Bundle{ + Id: "2a506de7-99bd-4f0d-994e-c38e72c28fd9", + Name: "profile", + Extension: "ocis-accounts", + Type: settings.Bundle_TYPE_DEFAULT, + Resource: &settings.Resource{ + Type: settings.Resource_TYPE_SYSTEM, + }, + DisplayName: "Profile", + Settings: []*settings.Setting{ + { + Id: settingUUIDProfileLanguage, + Name: "language", + DisplayName: "Language", + Description: "User language", + Resource: &settings.Resource{ + Type: settings.Resource_TYPE_USER, + }, + Value: &languageSetting, + }, + }, + } +} + func generatePermissionRequests() []*settings.AddSettingToBundleRequest { return []*settings.AddSettingToBundleRequest{ { @@ -114,5 +220,146 @@ func generatePermissionRequests() []*settings.AddSettingToBundleRequest { }, }, }, + { + BundleId: BundleUUIDRoleAdmin, + Setting: &settings.Setting{ + Id: "7d81f103-0488-4853-bce5-98dcce36d649", + Name: "language-readwrite", + DisplayName: "Permission to read and set the language (anyone)", + Resource: &settings.Resource{ + Type: settings.Resource_TYPE_SETTING, + Id: settingUUIDProfileLanguage, + }, + Value: &settings.Setting_PermissionValue{ + PermissionValue: &settings.Permission{ + Operation: settings.Permission_OPERATION_READWRITE, + Constraint: settings.Permission_CONSTRAINT_ALL, + }, + }, + }, + }, + { + BundleId: BundleUUIDRoleUser, + Setting: &settings.Setting{ + Id: "640e00d2-4df8-41bd-b1c2-9f30a01e0e99", + Name: "language-readwrite", + DisplayName: "Permission to read and set the language (self)", + Resource: &settings.Resource{ + Type: settings.Resource_TYPE_SETTING, + Id: settingUUIDProfileLanguage, + }, + Value: &settings.Setting_PermissionValue{ + PermissionValue: &settings.Permission{ + Operation: settings.Permission_OPERATION_READWRITE, + Constraint: settings.Permission_CONSTRAINT_OWN, + }, + }, + }, + }, + { + BundleId: BundleUUIDRoleGuest, + Setting: &settings.Setting{ + Id: "ca878636-8b1a-4fae-8282-8617a4c13597", + Name: "language-readwrite", + DisplayName: "Permission to read and set the language (self)", + Resource: &settings.Resource{ + Type: settings.Resource_TYPE_SETTING, + Id: settingUUIDProfileLanguage, + }, + Value: &settings.Setting_PermissionValue{ + PermissionValue: &settings.Permission{ + Operation: settings.Permission_OPERATION_READWRITE, + Constraint: settings.Permission_CONSTRAINT_OWN, + }, + }, + }, + }, + { + BundleId: BundleUUIDRoleAdmin, + Setting: &settings.Setting{ + Id: AccountManagementPermissionID, + Name: AccountManagementPermissionName, + DisplayName: "Account Management", + Description: "This permission gives full access to everything that is related to account management.", + Resource: &settings.Resource{ + Type: settings.Resource_TYPE_USER, + Id: "all", + }, + Value: &settings.Setting_PermissionValue{ + PermissionValue: &settings.Permission{ + Operation: settings.Permission_OPERATION_READWRITE, + Constraint: settings.Permission_CONSTRAINT_ALL, + }, + }, + }, + }, + { + BundleId: BundleUUIDRoleAdmin, + Setting: &settings.Setting{ + Id: GroupManagementPermissionID, + Name: GroupManagementPermissionName, + DisplayName: "Group Management", + Description: "This permission gives full access to everything that is related to group management.", + Resource: &settings.Resource{ + Type: settings.Resource_TYPE_GROUP, + Id: "all", + }, + Value: &settings.Setting_PermissionValue{ + PermissionValue: &settings.Permission{ + Operation: settings.Permission_OPERATION_READWRITE, + Constraint: settings.Permission_CONSTRAINT_ALL, + }, + }, + }, + }, + { + BundleId: BundleUUIDRoleUser, + Setting: &settings.Setting{ + Id: SelfManagementPermissionID, + Name: SelfManagementPermissionName, + DisplayName: "Self Management", + Description: "This permission gives access to self management.", + Resource: &settings.Resource{ + Type: settings.Resource_TYPE_USER, + Id: "me", + }, + Value: &settings.Setting_PermissionValue{ + PermissionValue: &settings.Permission{ + Operation: settings.Permission_OPERATION_READWRITE, + Constraint: settings.Permission_CONSTRAINT_OWN, + }, + }, + }, + }, + } +} + +func defaultRoleAssignments() []*settings.UserRoleAssignment { + return []*settings.UserRoleAssignment{ + // default admin users + { + AccountUuid: "058bff95-6708-4fe5-91e4-9ea3d377588b", + RoleId: BundleUUIDRoleAdmin, + }, { + AccountUuid: "ddc2004c-0977-11eb-9d3f-a793888cd0f8", + RoleId: BundleUUIDRoleAdmin, + }, { + AccountUuid: "820ba2a1-3f54-4538-80a4-2d73007e30bf", + RoleId: BundleUUIDRoleAdmin, + }, { + AccountUuid: "bc596f3c-c955-4328-80a0-60d018b4ad57", + RoleId: BundleUUIDRoleAdmin, + }, + // default users with role "user" + { + AccountUuid: "4c510ada-c86b-4815-8820-42cdf82c3d51", + RoleId: BundleUUIDRoleUser, + }, { + AccountUuid: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c", + RoleId: BundleUUIDRoleUser, + }, { + AccountUuid: "932b4540-8d16-481e-8ef4-588e4b6b151c", + RoleId: BundleUUIDRoleUser, + }, } } diff --git a/storage/go.mod b/storage/go.mod index cd618c501..bc1c3aff2 100644 --- a/storage/go.mod +++ b/storage/go.mod @@ -4,6 +4,8 @@ go 1.15 require ( github.com/Masterminds/sprig/v3 v3.2.2 // indirect + github.com/asim/go-micro/plugins/registry/kubernetes/v3 v3.0.0-20210217182006-0f0ace1a44a9 // indirect + github.com/asim/go-micro/plugins/registry/nats/v3 v3.0.0-20210217182006-0f0ace1a44a9 // indirect github.com/asim/go-micro/v3 v3.5.1-0.20210217182006-0f0ace1a44a9 github.com/cs3org/reva v1.6.1-0.20210223065028-53f39499762e github.com/gofrs/uuid v3.3.0+incompatible diff --git a/storage/pkg/command/storagemetadata.go b/storage/pkg/command/storagemetadata.go index 51c5c790f..65cee8a08 100644 --- a/storage/pkg/command/storagemetadata.go +++ b/storage/pkg/command/storagemetadata.go @@ -7,8 +7,10 @@ import ( "path" "time" - "github.com/cs3org/reva/cmd/revad/runtime" "github.com/gofrs/uuid" + "github.com/owncloud/ocis/storage/pkg/service/external" + + "github.com/cs3org/reva/cmd/revad/runtime" "github.com/micro/cli/v2" "github.com/oklog/run" "github.com/owncloud/ocis/storage/pkg/config" @@ -201,6 +203,14 @@ func StorageMetadata(cfg *config.Config) *cli.Command { }) } + external.RegisterGRPCEndpoint( + ctx, + "com.owncloud.storage.metadata", + uuid.Must(uuid.NewV4()).String(), + cfg.Reva.StorageMetadata.GRPCAddr, + logger, + ) + return gr.Run() }, }