diff --git a/pkg/service/v0/accounts.go b/pkg/service/v0/accounts.go index e30349762..0014ae361 100644 --- a/pkg/service/v0/accounts.go +++ b/pkg/service/v0/accounts.go @@ -37,28 +37,6 @@ import ( // accLock mutually exclude readers from writers on account files var accLock sync.Mutex -func (s Service) indexAccounts(path string) (err error) { - var f *os.File - if f, err = os.Open(path); err != nil { - s.log.Error().Err(err).Str("dir", path).Msg("could not open accounts folder") - return - } - list, err := f.Readdir(-1) - f.Close() - if err != nil { - s.log.Error().Err(err).Str("dir", path).Msg("could not list accounts folder") - return - } - for _, file := range list { - err = s.indexAccount(file.Name()) - if err != nil { - s.log.Error().Err(err).Str("file", file.Name()).Msg("could not index account") - } - } - - return -} - func (s Service) indexAccount(id string) error { a := &proto.BleveAccount{ BleveType: "account", diff --git a/pkg/service/v0/groups.go b/pkg/service/v0/groups.go index d06f338e5..0e5f8a253 100644 --- a/pkg/service/v0/groups.go +++ b/pkg/service/v0/groups.go @@ -17,28 +17,6 @@ import ( "github.com/owncloud/ocis-accounts/pkg/provider" ) -func (s Service) indexGroups(path string) (err error) { - var f *os.File - if f, err = os.Open(path); err != nil { - s.log.Error().Err(err).Str("dir", path).Msg("could not open groups folder") - return - } - list, err := f.Readdir(-1) - f.Close() - if err != nil { - s.log.Error().Err(err).Str("dir", path).Msg("could not list groups folder") - return - } - for _, file := range list { - err = s.indexGroup(file.Name()) - if err != nil { - s.log.Error().Err(err).Str("file", file.Name()).Msg("could not index account") - } - } - - return -} - // accLock mutually exclude readers from writers on group files var groupLock sync.Mutex diff --git a/pkg/service/v0/service.go b/pkg/service/v0/service.go index a255c7022..46e762d1a 100644 --- a/pkg/service/v0/service.go +++ b/pkg/service/v0/service.go @@ -5,7 +5,6 @@ import ( "encoding/json" "errors" "fmt" - mclient "github.com/micro/go-micro/v2/client" "io/ioutil" "os" "path/filepath" @@ -19,6 +18,7 @@ import ( "github.com/blevesearch/bleve/analysis/analyzer/standard" "github.com/blevesearch/bleve/analysis/token/lowercase" "github.com/blevesearch/bleve/analysis/tokenizer/unicode" + mclient "github.com/micro/go-micro/v2/client" "github.com/owncloud/ocis-accounts/pkg/config" "github.com/owncloud/ocis-accounts/pkg/proto/v0" "github.com/owncloud/ocis-pkg/v2/log" @@ -43,225 +43,40 @@ func New(opts ...Option) (s *Service, err error) { roles.RoleService(roleService), ) - // read all user and group records + s = &Service{ + id: cfg.GRPC.Namespace + "." + cfg.Server.Name, + log: logger, + Config: cfg, + RoleService: roleService, + RoleManager: &roleManager, + } + + // build an index + if s.index, err = s.buildIndex(); err != nil { + return nil, err + } + fmt.Print("\n\n\n") + fmt.Print(s.index) + fmt.Print("\n\n\n") + + // create default accounts accountsDir := filepath.Join(cfg.Server.AccountsDataPath, "accounts") - { - // check if accounts exist - var fi os.FileInfo - if fi, err = os.Stat(accountsDir); err != nil { - if os.IsNotExist(err) { - // create accounts directory - if err = os.MkdirAll(accountsDir, 0700); err != nil { - return nil, err - } - // create default accounts - accounts := []proto.Account{ - { - Id: "4c510ada-c86b-4815-8820-42cdf82c3d51", - PreferredName: "einstein", - OnPremisesSamAccountName: "einstein", - Mail: "einstein@example.org", - DisplayName: "Albert Einstein", - UidNumber: 20000, - GidNumber: 30000, - PasswordProfile: &proto.PasswordProfile{ - Password: "$6$rounds=35210$sa1u5Pmfo4cr23Vw$RJNGElaDB1D3xorWkfTEGm2Ko.o2QL3E0cimKx23MNxVWVFSkUUeRoC7FqC4RzYDNQBD6cKzovTEaDD.8TDkD.", - }, - AccountEnabled: true, - MemberOf: []*proto.Group{ - {Id: "509a9dcd-bb37-4f4f-a01a-19dca27d9cfa"}, // users - {Id: "6040aa17-9c64-4fef-9bd0-77234d71bad0"}, // sailing-lovers - {Id: "dd58e5ec-842e-498b-8800-61f2ec6f911f"}, // violin-haters - {Id: "262982c1-2362-4afa-bfdf-8cbfef64a06e"}, // physics-lovers - }, - }, - { - Id: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c", - PreferredName: "marie", - OnPremisesSamAccountName: "marie", - Mail: "marie@example.org", - DisplayName: "Marie Curie", - UidNumber: 20001, - GidNumber: 30000, - PasswordProfile: &proto.PasswordProfile{ - Password: "$6$rounds=81434$sa1u5Pmfo4cr23Vw$W78cyL884GmuvDpxYPvSRBVzEj02T5QhTTcI8Dv4IKvMooDFGv4bwaWMkH9HfJ0wgpEBW7Lp.4Cad0xE/MYSg1", - }, - AccountEnabled: true, - MemberOf: []*proto.Group{ - {Id: "509a9dcd-bb37-4f4f-a01a-19dca27d9cfa"}, // users - {Id: "7b87fd49-286e-4a5f-bafd-c535d5dd997a"}, // radium-lovers - {Id: "cedc21aa-4072-4614-8676-fa9165f598ff"}, // polonium-lovers - {Id: "262982c1-2362-4afa-bfdf-8cbfef64a06e"}, // physics-lovers - }, - }, - { - Id: "932b4540-8d16-481e-8ef4-588e4b6b151c", - PreferredName: "richard", - OnPremisesSamAccountName: "richard", - Mail: "richard@example.org", - DisplayName: "Richard Feynman", - UidNumber: 20002, - GidNumber: 30000, - PasswordProfile: &proto.PasswordProfile{ - Password: "$6$rounds=5524$sa1u5Pmfo4cr23Vw$58bQVL/JeUlwM0RY21YKAFMvKvwKLLysGllYXox.vwKT5dHMwdzJjCxwTDMnB2o2pwexC8o/iOXyP2zrhALS40", - }, - AccountEnabled: true, - MemberOf: []*proto.Group{ - {Id: "509a9dcd-bb37-4f4f-a01a-19dca27d9cfa"}, // users - {Id: "a1726108-01f8-4c30-88df-2b1a9d1cba1a"}, // quantum-lovers - {Id: "167cbee2-0518-455a-bfb2-031fe0621e5d"}, // philosophy-haters - {Id: "262982c1-2362-4afa-bfdf-8cbfef64a06e"}, // physics-lovers - }, - }, - // admin user(s) - { - Id: "058bff95-6708-4fe5-91e4-9ea3d377588b", - PreferredName: "moss", - OnPremisesSamAccountName: "moss", - Mail: "moss@example.org", - DisplayName: "Maurice Moss", - UidNumber: 20003, - GidNumber: 30000, - PasswordProfile: &proto.PasswordProfile{ - Password: "$6$rounds=47068$lhw6odzXW0LTk/ao$GgxS.pIgP8jawLJBAiyNor2FrWzrULF95PwspRkli2W3VF.4HEwTYlQfRXbNQBMjNCEcEYlgZo3a.kRz2k2N0/", - }, - AccountEnabled: true, - MemberOf: []*proto.Group{ - {Id: "509a9dcd-bb37-4f4f-a01a-19dca27d9cfa"}, // users - }, - }, - // technical users for kopano and reva - { - Id: "820ba2a1-3f54-4538-80a4-2d73007e30bf", - PreferredName: "konnectd", - OnPremisesSamAccountName: "konnectd", - Mail: "idp@example.org", - DisplayName: "Kopano Konnectd", - UidNumber: 10000, - GidNumber: 15000, - PasswordProfile: &proto.PasswordProfile{ - Password: "$6$rounds=9746$sa1u5Pmfo4cr23Vw$2hnwpkTvUkWX0v6mh8Aw1pbzEXa9EUJzmrey4g2W/8arwWCwhteqU//3aWnA3S0d5T21fOKYteoqlsN1IbTcN.", - }, - AccountEnabled: true, - MemberOf: []*proto.Group{ - {Id: "34f38767-c937-4eb6-b847-1c175829a2a0"}, // sysusers - }, - }, - { - Id: "bc596f3c-c955-4328-80a0-60d018b4ad57", - PreferredName: "reva", - OnPremisesSamAccountName: "reva", - Mail: "storage@example.org", - DisplayName: "Reva Inter Operability Platform", - UidNumber: 10001, - GidNumber: 15000, - PasswordProfile: &proto.PasswordProfile{ - Password: "$6$rounds=91087$sa1u5Pmfo4cr23Vw$wPC3BbMTbP/ytlo0p.f99zJifyO70AUCdKIK9hkhwutBKGCirLmZs/MsWAG6xHjVvmnmHN5NoON7FUGv5pPaN.", - }, - AccountEnabled: true, - MemberOf: []*proto.Group{ - {Id: "34f38767-c937-4eb6-b847-1c175829a2a0"}, // sysusers - }, - }, - } - for i := range accounts { - // create account on disk - var bytes []byte - if bytes, err = json.Marshal(&accounts[i]); err != nil { - logger.Error().Err(err).Interface("account", &accounts[i]).Msg("could not marshal default account") - return - } - path := filepath.Join(accountsDir, accounts[i].Id) - if err = ioutil.WriteFile(path, bytes, 0600); err != nil { - accounts[i].PasswordProfile.Password = "***REMOVED***" - logger.Error().Err(err).Str("path", path).Interface("account", &accounts[i]).Msg("could not persist default account") - return - } - } - - // set role for admin users and regular users - assignRoleToUser("058bff95-6708-4fe5-91e4-9ea3d377588b", settings_svc.BundleUUIDRoleAdmin, roleService, logger) - for _, accountID := range []string{ - "058bff95-6708-4fe5-91e4-9ea3d377588b", //moss - } { - assignRoleToUser(accountID, settings_svc.BundleUUIDRoleAdmin, roleService, logger) - } - 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, roleService, logger) - } - } - } else if !fi.IsDir() { - return nil, fmt.Errorf("%s is not a directory", accountsDir) - } + if err = s.createDefaultAccounts(accountsDir); err != nil { + return nil, err } + // create default groups groupsDir := filepath.Join(cfg.Server.AccountsDataPath, "groups") - { - // check if groups exist - var fi os.FileInfo - if fi, err = os.Stat(groupsDir); err != nil { - if os.IsNotExist(err) { - // create accounts directory - if err = os.MkdirAll(groupsDir, 0700); err != nil { - return nil, err - } - // create default accounts - groups := []proto.Group{ - {Id: "34f38767-c937-4eb6-b847-1c175829a2a0", GidNumber: 15000, OnPremisesSamAccountName: "sysusers", DisplayName: "Technical users", Description: "A group for technical users. They should not show up in sharing dialogs.", Members: []*proto.Account{ - {Id: "820ba2a1-3f54-4538-80a4-2d73007e30bf"}, // konnectd - {Id: "bc596f3c-c955-4328-80a0-60d018b4ad57"}, // reva - }}, - {Id: "509a9dcd-bb37-4f4f-a01a-19dca27d9cfa", GidNumber: 30000, OnPremisesSamAccountName: "users", DisplayName: "Users", Description: "A group every normal user belongs to.", Members: []*proto.Account{ - {Id: "4c510ada-c86b-4815-8820-42cdf82c3d51"}, // einstein - {Id: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c"}, // marie - {Id: "932b4540-8d16-481e-8ef4-588e4b6b151c"}, // feynman - }}, - {Id: "6040aa17-9c64-4fef-9bd0-77234d71bad0", GidNumber: 30001, OnPremisesSamAccountName: "sailing-lovers", DisplayName: "Sailing lovers", Members: []*proto.Account{ - {Id: "4c510ada-c86b-4815-8820-42cdf82c3d51"}, // einstein - }}, - {Id: "dd58e5ec-842e-498b-8800-61f2ec6f911f", GidNumber: 30002, OnPremisesSamAccountName: "violin-haters", DisplayName: "Violin haters", Members: []*proto.Account{ - {Id: "4c510ada-c86b-4815-8820-42cdf82c3d51"}, // einstein - }}, - {Id: "7b87fd49-286e-4a5f-bafd-c535d5dd997a", GidNumber: 30003, OnPremisesSamAccountName: "radium-lovers", DisplayName: "Radium lovers", Members: []*proto.Account{ - {Id: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c"}, // marie - }}, - {Id: "cedc21aa-4072-4614-8676-fa9165f598ff", GidNumber: 30004, OnPremisesSamAccountName: "polonium-lovers", DisplayName: "Polonium lovers", Members: []*proto.Account{ - {Id: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c"}, // marie - }}, - {Id: "a1726108-01f8-4c30-88df-2b1a9d1cba1a", GidNumber: 30005, OnPremisesSamAccountName: "quantum-lovers", DisplayName: "Quantum lovers", Members: []*proto.Account{ - {Id: "932b4540-8d16-481e-8ef4-588e4b6b151c"}, // feynman - }}, - {Id: "167cbee2-0518-455a-bfb2-031fe0621e5d", GidNumber: 30006, OnPremisesSamAccountName: "philosophy-haters", DisplayName: "Philosophy haters", Members: []*proto.Account{ - {Id: "932b4540-8d16-481e-8ef4-588e4b6b151c"}, // feynman - }}, - {Id: "262982c1-2362-4afa-bfdf-8cbfef64a06e", GidNumber: 30007, OnPremisesSamAccountName: "physics-lovers", DisplayName: "Physics lovers", Members: []*proto.Account{ - {Id: "4c510ada-c86b-4815-8820-42cdf82c3d51"}, // einstein - {Id: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c"}, // marie - {Id: "932b4540-8d16-481e-8ef4-588e4b6b151c"}, // feynman - }}, - } - for i := range groups { - var bytes []byte - if bytes, err = json.Marshal(&groups[i]); err != nil { - logger.Error().Err(err).Interface("group", &groups[i]).Msg("could not marshal default group") - return - } - path := filepath.Join(groupsDir, groups[i].Id) - if err = ioutil.WriteFile(path, bytes, 0600); err != nil { - logger.Error().Err(err).Str("path", path).Interface("group", &groups[i]).Msg("could not persist default group") - return - } - } - } - } else if !fi.IsDir() { - return nil, fmt.Errorf("%s is not a directory", groupsDir) - } + if err = s.createDefaultGroups(groupsDir); err != nil { + return nil, err } + // TODO watch folders for new records + + return +} + +func (s Service) buildIndex() (index bleve.Index, err error) { indexMapping := bleve.NewIndexMapping() // keep all symbols in terms to allow exact maching, eg. emails indexMapping.DefaultAnalyzer = keyword.Name @@ -292,7 +107,7 @@ func New(opts ...Option) (s *Service, err error) { }, }) if err != nil { - return nil, err + return } lowercaseTextFieldMapping := bleve.NewTextFieldMapping() lowercaseTextFieldMapping.Analyzer = "lowercase" @@ -331,34 +146,244 @@ func New(opts ...Option) (s *Service, err error) { // documents in the index by querying for that property. indexMapping.TypeField = "BleveType" - s = &Service{ - id: cfg.GRPC.Namespace + "." + cfg.Server.Name, - log: logger, - Config: cfg, - RoleService: roleService, - RoleManager: &roleManager, - } - - indexDir := filepath.Join(cfg.Server.AccountsDataPath, "index.bleve") + indexDir := filepath.Join(s.Config.Server.AccountsDataPath, "index.bleve") // for now recreate index on every start if err = os.RemoveAll(indexDir); err != nil { - return nil, err - } - if s.index, err = bleve.New(indexDir, indexMapping); err != nil { return } - if err = s.indexAccounts(accountsDir); err != nil { + if index, err = bleve.New(indexDir, indexMapping); err != nil { return nil, err } - if err = s.indexGroups(groupsDir); err != nil { - return nil, err - } - - // TODO watch folders for new records - return } +func (s Service) createDefaultAccounts(accountsDir string) (err error) { + // check if accounts exist + var fi os.FileInfo + if fi, err = os.Stat(accountsDir); err != nil { + if os.IsNotExist(err) { + // create accounts directory + if err = os.MkdirAll(accountsDir, 0700); err != nil { + return + } + // create default accounts + accounts := []proto.Account{ + { + Id: "4c510ada-c86b-4815-8820-42cdf82c3d51", + PreferredName: "einstein", + OnPremisesSamAccountName: "einstein", + Mail: "einstein@example.org", + DisplayName: "Albert Einstein", + UidNumber: 20000, + GidNumber: 30000, + PasswordProfile: &proto.PasswordProfile{ + Password: "$6$rounds=35210$sa1u5Pmfo4cr23Vw$RJNGElaDB1D3xorWkfTEGm2Ko.o2QL3E0cimKx23MNxVWVFSkUUeRoC7FqC4RzYDNQBD6cKzovTEaDD.8TDkD.", + }, + AccountEnabled: true, + MemberOf: []*proto.Group{ + {Id: "509a9dcd-bb37-4f4f-a01a-19dca27d9cfa"}, // users + {Id: "6040aa17-9c64-4fef-9bd0-77234d71bad0"}, // sailing-lovers + {Id: "dd58e5ec-842e-498b-8800-61f2ec6f911f"}, // violin-haters + {Id: "262982c1-2362-4afa-bfdf-8cbfef64a06e"}, // physics-lovers + }, + }, + { + Id: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c", + PreferredName: "marie", + OnPremisesSamAccountName: "marie", + Mail: "marie@example.org", + DisplayName: "Marie Curie", + UidNumber: 20001, + GidNumber: 30000, + PasswordProfile: &proto.PasswordProfile{ + Password: "$6$rounds=81434$sa1u5Pmfo4cr23Vw$W78cyL884GmuvDpxYPvSRBVzEj02T5QhTTcI8Dv4IKvMooDFGv4bwaWMkH9HfJ0wgpEBW7Lp.4Cad0xE/MYSg1", + }, + AccountEnabled: true, + MemberOf: []*proto.Group{ + {Id: "509a9dcd-bb37-4f4f-a01a-19dca27d9cfa"}, // users + {Id: "7b87fd49-286e-4a5f-bafd-c535d5dd997a"}, // radium-lovers + {Id: "cedc21aa-4072-4614-8676-fa9165f598ff"}, // polonium-lovers + {Id: "262982c1-2362-4afa-bfdf-8cbfef64a06e"}, // physics-lovers + }, + }, + { + Id: "932b4540-8d16-481e-8ef4-588e4b6b151c", + PreferredName: "richard", + OnPremisesSamAccountName: "richard", + Mail: "richard@example.org", + DisplayName: "Richard Feynman", + UidNumber: 20002, + GidNumber: 30000, + PasswordProfile: &proto.PasswordProfile{ + Password: "$6$rounds=5524$sa1u5Pmfo4cr23Vw$58bQVL/JeUlwM0RY21YKAFMvKvwKLLysGllYXox.vwKT5dHMwdzJjCxwTDMnB2o2pwexC8o/iOXyP2zrhALS40", + }, + AccountEnabled: true, + MemberOf: []*proto.Group{ + {Id: "509a9dcd-bb37-4f4f-a01a-19dca27d9cfa"}, // users + {Id: "a1726108-01f8-4c30-88df-2b1a9d1cba1a"}, // quantum-lovers + {Id: "167cbee2-0518-455a-bfb2-031fe0621e5d"}, // philosophy-haters + {Id: "262982c1-2362-4afa-bfdf-8cbfef64a06e"}, // physics-lovers + }, + }, + // admin user(s) + { + Id: "058bff95-6708-4fe5-91e4-9ea3d377588b", + PreferredName: "moss", + OnPremisesSamAccountName: "moss", + Mail: "moss@example.org", + DisplayName: "Maurice Moss", + UidNumber: 20003, + GidNumber: 30000, + PasswordProfile: &proto.PasswordProfile{ + Password: "$6$rounds=47068$lhw6odzXW0LTk/ao$GgxS.pIgP8jawLJBAiyNor2FrWzrULF95PwspRkli2W3VF.4HEwTYlQfRXbNQBMjNCEcEYlgZo3a.kRz2k2N0/", + }, + AccountEnabled: true, + MemberOf: []*proto.Group{ + {Id: "509a9dcd-bb37-4f4f-a01a-19dca27d9cfa"}, // users + }, + }, + // technical users for kopano and reva + { + Id: "820ba2a1-3f54-4538-80a4-2d73007e30bf", + PreferredName: "konnectd", + OnPremisesSamAccountName: "konnectd", + Mail: "idp@example.org", + DisplayName: "Kopano Konnectd", + UidNumber: 10000, + GidNumber: 15000, + PasswordProfile: &proto.PasswordProfile{ + Password: "$6$rounds=9746$sa1u5Pmfo4cr23Vw$2hnwpkTvUkWX0v6mh8Aw1pbzEXa9EUJzmrey4g2W/8arwWCwhteqU//3aWnA3S0d5T21fOKYteoqlsN1IbTcN.", + }, + AccountEnabled: true, + MemberOf: []*proto.Group{ + {Id: "34f38767-c937-4eb6-b847-1c175829a2a0"}, // sysusers + }, + }, + { + Id: "bc596f3c-c955-4328-80a0-60d018b4ad57", + PreferredName: "reva", + OnPremisesSamAccountName: "reva", + Mail: "storage@example.org", + DisplayName: "Reva Inter Operability Platform", + UidNumber: 10001, + GidNumber: 15000, + PasswordProfile: &proto.PasswordProfile{ + Password: "$6$rounds=91087$sa1u5Pmfo4cr23Vw$wPC3BbMTbP/ytlo0p.f99zJifyO70AUCdKIK9hkhwutBKGCirLmZs/MsWAG6xHjVvmnmHN5NoON7FUGv5pPaN.", + }, + AccountEnabled: true, + MemberOf: []*proto.Group{ + {Id: "34f38767-c937-4eb6-b847-1c175829a2a0"}, // sysusers + }, + }, + } + for i := range accounts { + // create account on disk + var bytes []byte + if bytes, err = json.Marshal(&accounts[i]); err != nil { + s.log.Error().Err(err).Interface("account", &accounts[i]).Msg("could not marshal default account") + return + } + path := filepath.Join(accountsDir, accounts[i].Id) + if err = ioutil.WriteFile(path, bytes, 0600); err != nil { + accounts[i].PasswordProfile.Password = "***REMOVED***" + s.log.Error().Err(err).Str("path", path).Interface("account", &accounts[i]).Msg("could not persist default account") + return + } + if err = s.indexAccount(accounts[i].Id); err != nil { + accounts[i].PasswordProfile.Password = "***REMOVED***" + s.log.Error().Err(err).Str("path", path).Interface("account", &accounts[i]).Msg("could not index default account") + return + } + } + + // 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 + } { + 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) + } + } + } else if !fi.IsDir() { + return fmt.Errorf("%s is not a directory", accountsDir) + } + return nil +} + +func (s Service) createDefaultGroups(groupsDir string) (err error) { + // check if groups exist + var fi os.FileInfo + if fi, err = os.Stat(groupsDir); err != nil { + if os.IsNotExist(err) { + // create accounts directory + if err = os.MkdirAll(groupsDir, 0700); err != nil { + return + } + // create default accounts + groups := []proto.Group{ + {Id: "34f38767-c937-4eb6-b847-1c175829a2a0", GidNumber: 15000, OnPremisesSamAccountName: "sysusers", DisplayName: "Technical users", Description: "A group for technical users. They should not show up in sharing dialogs.", Members: []*proto.Account{ + {Id: "820ba2a1-3f54-4538-80a4-2d73007e30bf"}, // konnectd + {Id: "bc596f3c-c955-4328-80a0-60d018b4ad57"}, // reva + }}, + {Id: "509a9dcd-bb37-4f4f-a01a-19dca27d9cfa", GidNumber: 30000, OnPremisesSamAccountName: "users", DisplayName: "Users", Description: "A group every normal user belongs to.", Members: []*proto.Account{ + {Id: "4c510ada-c86b-4815-8820-42cdf82c3d51"}, // einstein + {Id: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c"}, // marie + {Id: "932b4540-8d16-481e-8ef4-588e4b6b151c"}, // feynman + }}, + {Id: "6040aa17-9c64-4fef-9bd0-77234d71bad0", GidNumber: 30001, OnPremisesSamAccountName: "sailing-lovers", DisplayName: "Sailing lovers", Members: []*proto.Account{ + {Id: "4c510ada-c86b-4815-8820-42cdf82c3d51"}, // einstein + }}, + {Id: "dd58e5ec-842e-498b-8800-61f2ec6f911f", GidNumber: 30002, OnPremisesSamAccountName: "violin-haters", DisplayName: "Violin haters", Members: []*proto.Account{ + {Id: "4c510ada-c86b-4815-8820-42cdf82c3d51"}, // einstein + }}, + {Id: "7b87fd49-286e-4a5f-bafd-c535d5dd997a", GidNumber: 30003, OnPremisesSamAccountName: "radium-lovers", DisplayName: "Radium lovers", Members: []*proto.Account{ + {Id: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c"}, // marie + }}, + {Id: "cedc21aa-4072-4614-8676-fa9165f598ff", GidNumber: 30004, OnPremisesSamAccountName: "polonium-lovers", DisplayName: "Polonium lovers", Members: []*proto.Account{ + {Id: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c"}, // marie + }}, + {Id: "a1726108-01f8-4c30-88df-2b1a9d1cba1a", GidNumber: 30005, OnPremisesSamAccountName: "quantum-lovers", DisplayName: "Quantum lovers", Members: []*proto.Account{ + {Id: "932b4540-8d16-481e-8ef4-588e4b6b151c"}, // feynman + }}, + {Id: "167cbee2-0518-455a-bfb2-031fe0621e5d", GidNumber: 30006, OnPremisesSamAccountName: "philosophy-haters", DisplayName: "Philosophy haters", Members: []*proto.Account{ + {Id: "932b4540-8d16-481e-8ef4-588e4b6b151c"}, // feynman + }}, + {Id: "262982c1-2362-4afa-bfdf-8cbfef64a06e", GidNumber: 30007, OnPremisesSamAccountName: "physics-lovers", DisplayName: "Physics lovers", Members: []*proto.Account{ + {Id: "4c510ada-c86b-4815-8820-42cdf82c3d51"}, // einstein + {Id: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c"}, // marie + {Id: "932b4540-8d16-481e-8ef4-588e4b6b151c"}, // feynman + }}, + } + for i := range groups { + var bytes []byte + if bytes, err = json.Marshal(&groups[i]); err != nil { + s.log.Error().Err(err).Interface("group", &groups[i]).Msg("could not marshal default group") + return + } + path := filepath.Join(groupsDir, groups[i].Id) + if err = ioutil.WriteFile(path, bytes, 0600); err != nil { + s.log.Error().Err(err).Str("path", path).Interface("group", &groups[i]).Msg("could not persist default group") + return + } + if err = s.indexGroup(groups[i].Id); err != nil { + s.log.Error().Err(err).Str("path", path).Interface("group", &groups[i]).Msg("could not index default group") + return + } + } + } + } else if !fi.IsDir() { + return fmt.Errorf("%s is not a directory", groupsDir) + } + return nil +} + func assignRoleToUser(accountID, roleID string, rs settings.RoleService, logger log.Logger) (ok bool) { _, err := rs.AssignRoleToUser(context.Background(), &settings.AssignRoleToUserRequest{ AccountUuid: accountID,