diff --git a/extensions/storage/pkg/command/root.go b/extensions/storage/pkg/command/root.go index 225296f86..91bd7b6ce 100644 --- a/extensions/storage/pkg/command/root.go +++ b/extensions/storage/pkg/command/root.go @@ -14,7 +14,7 @@ func GetCommands(cfg *config.Config) cli.Commands { return []*cli.Command{ Frontend(cfg), Gateway(cfg), - Users(cfg), + // Users(cfg), Groups(cfg), AppProvider(cfg), // AuthBasic(cfg), diff --git a/extensions/storage/pkg/command/users.go b/extensions/storage/pkg/command/users.go deleted file mode 100644 index 6e848cc86..000000000 --- a/extensions/storage/pkg/command/users.go +++ /dev/null @@ -1,197 +0,0 @@ -package command - -import ( - "context" - "flag" - "os" - "path" - "path/filepath" - - "github.com/cs3org/reva/v2/cmd/revad/runtime" - "github.com/gofrs/uuid" - "github.com/oklog/run" - "github.com/owncloud/ocis/extensions/storage/pkg/config" - "github.com/owncloud/ocis/extensions/storage/pkg/server/debug" - "github.com/owncloud/ocis/extensions/storage/pkg/tracing" - ociscfg "github.com/owncloud/ocis/ocis-pkg/config" - "github.com/owncloud/ocis/ocis-pkg/sync" - "github.com/thejerf/suture/v4" - "github.com/urfave/cli/v2" -) - -// Users is the entrypoint for the users command. -func Users(cfg *config.Config) *cli.Command { - return &cli.Command{ - Name: "users", - Usage: "start users service", - Before: func(c *cli.Context) error { - return ParseConfig(c, cfg, "storage-users") - }, - Action: func(c *cli.Context) error { - logger := NewLogger(cfg) - - tracing.Configure(cfg, logger) - - gr := run.Group{} - ctx, cancel := context.WithCancel(context.Background()) - - defer cancel() - - // precreate folders - if cfg.Reva.Users.Driver == "json" && cfg.Reva.Users.JSON != "" { - if err := os.MkdirAll(filepath.Dir(cfg.Reva.Users.JSON), os.FileMode(0700)); err != nil { - return err - } - } - - uuid := uuid.Must(uuid.NewV4()) - pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") - - rcfg := usersConfigFromStruct(c, cfg) - - logger.Debug(). - Str("server", "users"). - Interface("reva-config", rcfg). - Msg("config") - - if cfg.Reva.Users.Driver == "ldap" { - if err := waitForLDAPCA(logger, &cfg.Reva.LDAP); err != nil { - logger.Error().Err(err).Msg("The configured LDAP CA cert does not exist") - return err - } - } - - gr.Add(func() error { - runtime.RunWithOptions( - rcfg, - pidFile, - runtime.WithLogger(&logger.Logger), - ) - return nil - }, func(_ error) { - logger.Info(). - Str("server", c.Command.Name). - Msg("Shutting down server") - - cancel() - }) - - debugServer, err := debug.Server( - debug.Name(c.Command.Name+"-debug"), - debug.Addr(cfg.Reva.Users.DebugAddr), - debug.Logger(logger), - debug.Context(ctx), - debug.Config(cfg), - ) - - if err != nil { - logger.Info().Err(err).Str("server", c.Command.Name+"-debug").Msg("Failed to initialize server") - return err - } - - gr.Add(debugServer.ListenAndServe, func(_ error) { - cancel() - }) - - if !cfg.Reva.Users.Supervised { - sync.Trap(&gr, cancel) - } - - return gr.Run() - }, - } -} - -// usersConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. -func usersConfigFromStruct(c *cli.Context, cfg *config.Config) map[string]interface{} { - rcfg := map[string]interface{}{ - "core": map[string]interface{}{ - "max_cpus": cfg.Reva.Users.MaxCPUs, - "tracing_enabled": cfg.Tracing.Enabled, - "tracing_endpoint": cfg.Tracing.Endpoint, - "tracing_collector": cfg.Tracing.Collector, - "tracing_service_name": c.Command.Name, - }, - "shared": map[string]interface{}{ - "jwt_secret": cfg.Reva.JWTSecret, - "gatewaysvc": cfg.Reva.Gateway.Endpoint, - "skip_user_groups_in_token": cfg.Reva.SkipUserGroupsInToken, - }, - "grpc": map[string]interface{}{ - "network": cfg.Reva.Users.GRPCNetwork, - "address": cfg.Reva.Users.GRPCAddr, - // TODO build services dynamically - "services": map[string]interface{}{ - "userprovider": map[string]interface{}{ - "driver": cfg.Reva.Users.Driver, - "drivers": map[string]interface{}{ - "json": map[string]interface{}{ - "users": cfg.Reva.Users.JSON, - }, - "ldap": ldapConfigFromString(cfg), - "rest": map[string]interface{}{ - "client_id": cfg.Reva.UserGroupRest.ClientID, - "client_secret": cfg.Reva.UserGroupRest.ClientSecret, - "redis_address": cfg.Reva.UserGroupRest.RedisAddress, - "redis_username": cfg.Reva.UserGroupRest.RedisUsername, - "redis_password": cfg.Reva.UserGroupRest.RedisPassword, - "user_groups_cache_expiration": cfg.Reva.Users.UserGroupsCacheExpiration, - "id_provider": cfg.Reva.UserGroupRest.IDProvider, - "api_base_url": cfg.Reva.UserGroupRest.APIBaseURL, - "oidc_token_endpoint": cfg.Reva.UserGroupRest.OIDCTokenEndpoint, - "target_api": cfg.Reva.UserGroupRest.TargetAPI, - }, - "owncloudsql": map[string]interface{}{ - "dbusername": cfg.Reva.UserOwnCloudSQL.DBUsername, - "dbpassword": cfg.Reva.UserOwnCloudSQL.DBPassword, - "dbhost": cfg.Reva.UserOwnCloudSQL.DBHost, - "dbport": cfg.Reva.UserOwnCloudSQL.DBPort, - "dbname": cfg.Reva.UserOwnCloudSQL.DBName, - "idp": cfg.Reva.UserOwnCloudSQL.Idp, - "nobody": cfg.Reva.UserOwnCloudSQL.Nobody, - "join_username": cfg.Reva.UserOwnCloudSQL.JoinUsername, - "join_ownclouduuid": cfg.Reva.UserOwnCloudSQL.JoinOwnCloudUUID, - "enable_medial_search": cfg.Reva.UserOwnCloudSQL.EnableMedialSearch, - }, - }, - }, - }, - }, - } - return rcfg -} - -// UserProviderSutureService allows for the storage-userprovider command to be embedded and supervised by a suture supervisor tree. -type UserProviderSutureService struct { - cfg *config.Config -} - -// NewUserProviderSutureService creates a new storage.UserProvider -func NewUserProvider(cfg *ociscfg.Config) suture.Service { - cfg.Storage.Commons = cfg.Commons - return UserProviderSutureService{ - cfg: cfg.Storage, - } -} - -func (s UserProviderSutureService) Serve(ctx context.Context) error { - s.cfg.Reva.Users.Context = ctx - f := &flag.FlagSet{} - cmdFlags := Users(s.cfg).Flags - for k := range cmdFlags { - if err := cmdFlags[k].Apply(f); err != nil { - return err - } - } - cliCtx := cli.NewContext(nil, f, nil) - if Users(s.cfg).Before != nil { - if err := Users(s.cfg).Before(cliCtx); err != nil { - return err - } - } - if err := Users(s.cfg).Action(cliCtx); err != nil { - return err - } - - return nil -} diff --git a/extensions/user/pkg/command/command.go b/extensions/user/pkg/command/command.go new file mode 100644 index 000000000..31035acda --- /dev/null +++ b/extensions/user/pkg/command/command.go @@ -0,0 +1,234 @@ +package command + +import ( + "context" + "flag" + "os" + "path" + "path/filepath" + + "github.com/cs3org/reva/v2/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/oklog/run" + "github.com/owncloud/ocis/extensions/storage/pkg/server/debug" + "github.com/owncloud/ocis/extensions/user/pkg/config" + ociscfg "github.com/owncloud/ocis/ocis-pkg/config" + "github.com/owncloud/ocis/ocis-pkg/ldap" + "github.com/owncloud/ocis/ocis-pkg/log" + "github.com/owncloud/ocis/ocis-pkg/sync" + "github.com/owncloud/ocis/ocis-pkg/tracing" + "github.com/thejerf/suture/v4" + "github.com/urfave/cli/v2" +) + +// User is the entrypoint for the user command. +func User(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "users", + Usage: "start users service", + Action: func(c *cli.Context) error { + logCfg := cfg.Logging + logger := log.NewLogger( + log.Level(logCfg.Level), + log.File(logCfg.File), + log.Pretty(logCfg.Pretty), + log.Color(logCfg.Color), + ) + tracing.Configure(cfg.Tracing.Enabled, cfg.Tracing.Type, logger) + gr := run.Group{} + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // precreate folders + if cfg.Driver == "json" && cfg.Drivers.JSON.File != "" { + if err := os.MkdirAll(filepath.Dir(cfg.Drivers.JSON.File), os.FileMode(0700)); err != nil { + return err + } + } + + uuid := uuid.Must(uuid.NewV4()) + pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") + + rcfg := usersConfigFromStruct(c, cfg) + + logger.Debug(). + Str("server", "users"). + Interface("reva-config", rcfg). + Msg("config") + + if cfg.Driver == "ldap" { + if err := ldap.WaitForCA(logger, cfg.Drivers.LDAP.Insecure, cfg.Drivers.LDAP.CACert); err != nil { + logger.Error().Err(err).Msg("The configured LDAP CA cert does not exist") + return err + } + } + + gr.Add(func() error { + runtime.RunWithOptions( + rcfg, + pidFile, + runtime.WithLogger(&logger.Logger), + ) + return nil + }, func(_ error) { + logger.Info(). + Str("server", c.Command.Name). + Msg("Shutting down server") + + cancel() + }) + + debugServer, err := debug.Server( + debug.Name(c.Command.Name+"-debug"), + debug.Addr(cfg.Debug.Addr), + debug.Logger(logger), + debug.Context(ctx), + debug.Pprof(cfg.Debug.Pprof), + debug.Zpages(cfg.Debug.Zpages), + debug.Token(cfg.Debug.Token), + ) + + if err != nil { + logger.Info().Err(err).Str("server", c.Command.Name+"-debug").Msg("Failed to initialize server") + return err + } + + gr.Add(debugServer.ListenAndServe, func(_ error) { + cancel() + }) + + if !cfg.Supervised { + sync.Trap(&gr, cancel) + } + + return gr.Run() + }, + } +} + +// usersConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service. +func usersConfigFromStruct(c *cli.Context, cfg *config.Config) map[string]interface{} { + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": c.Command.Name, + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.JWTSecret, + "gatewaysvc": cfg.GatewayEndpoint, + "skip_user_groups_in_token": cfg.SkipUserGroupsInToken, + }, + "grpc": map[string]interface{}{ + "network": cfg.GRPC.Protocol, + "address": cfg.GRPC.Addr, + // TODO build services dynamically + "services": map[string]interface{}{ + "userprovider": map[string]interface{}{ + "driver": cfg.Driver, + "drivers": map[string]interface{}{ + "json": map[string]interface{}{ + "users": cfg.Drivers.JSON.File, + }, + "ldap": ldapConfigFromString(cfg.Drivers.LDAP), + "rest": map[string]interface{}{ + "client_id": cfg.Drivers.REST.ClientID, + "client_secret": cfg.Drivers.REST.ClientSecret, + "redis_address": cfg.Drivers.REST.RedisAddr, + "redis_username": cfg.Drivers.REST.RedisUsername, + "redis_password": cfg.Drivers.REST.RedisPassword, + "user_groups_cache_expiration": cfg.UsersCacheExpiration, + "id_provider": cfg.Drivers.REST.IDProvider, + "api_base_url": cfg.Drivers.REST.APIBaseURL, + "oidc_token_endpoint": cfg.Drivers.REST.OIDCTokenEndpoint, + "target_api": cfg.Drivers.REST.TargetAPI, + }, + "owncloudsql": map[string]interface{}{ + "dbusername": cfg.Drivers.OwnCloudSQL.DBUsername, + "dbpassword": cfg.Drivers.OwnCloudSQL.DBPassword, + "dbhost": cfg.Drivers.OwnCloudSQL.DBHost, + "dbport": cfg.Drivers.OwnCloudSQL.DBPort, + "dbname": cfg.Drivers.OwnCloudSQL.DBName, + "idp": cfg.Drivers.OwnCloudSQL.IDP, + "nobody": cfg.Drivers.OwnCloudSQL.Nobody, + "join_username": cfg.Drivers.OwnCloudSQL.JoinUsername, + "join_ownclouduuid": cfg.Drivers.OwnCloudSQL.JoinOwnCloudUUID, + "enable_medial_search": cfg.Drivers.OwnCloudSQL.EnableMedialSearch, + }, + }, + }, + }, + }, + } + return rcfg +} + +// UserProviderSutureService allows for the storage-userprovider command to be embedded and supervised by a suture supervisor tree. +type UserProviderSutureService struct { + cfg *config.Config +} + +// NewUserProviderSutureService creates a new storage.UserProvider +func NewUserProvider(cfg *ociscfg.Config) suture.Service { + cfg.User.Commons = cfg.Commons + return UserProviderSutureService{ + cfg: cfg.User, + } +} + +func (s UserProviderSutureService) Serve(ctx context.Context) error { + // s.cfg.Reva.Users.Context = ctx + cmd := User(s.cfg) + f := &flag.FlagSet{} + cmdFlags := cmd.Flags + for k := range cmdFlags { + if err := cmdFlags[k].Apply(f); err != nil { + return err + } + } + cliCtx := cli.NewContext(nil, f, nil) + if cmd.Before != nil { + if err := cmd.Before(cliCtx); err != nil { + return err + } + } + if err := cmd.Action(cliCtx); err != nil { + return err + } + + return nil +} + +func ldapConfigFromString(cfg config.LDAPDriver) map[string]interface{} { + return map[string]interface{}{ + "uri": cfg.URI, + "cacert": cfg.CACert, + "insecure": cfg.Insecure, + "bind_username": cfg.BindDN, + "bind_password": cfg.BindPassword, + "user_base_dn": cfg.UserBaseDN, + "group_base_dn": cfg.GroupBaseDN, + "user_filter": cfg.UserFilter, + "group_filter": cfg.GroupFilter, + "user_objectclass": cfg.UserObjectClass, + "group_objectclass": cfg.GroupObjectClass, + "login_attributes": cfg.LoginAttributes, + "idp": cfg.IDP, + "user_schema": map[string]interface{}{ + "id": cfg.UserSchema.ID, + "idIsOctetString": cfg.UserSchema.IDIsOctetString, + "mail": cfg.UserSchema.Mail, + "displayName": cfg.UserSchema.DisplayName, + "userName": cfg.UserSchema.Username, + }, + "group_schema": map[string]interface{}{ + "id": cfg.GroupSchema.ID, + "idIsOctetString": cfg.GroupSchema.IDIsOctetString, + "mail": cfg.GroupSchema.Mail, + "displayName": cfg.GroupSchema.DisplayName, + "groupName": cfg.GroupSchema.Groupname, + "member": cfg.GroupSchema.Member, + }, + } +} diff --git a/extensions/user/pkg/config/config.go b/extensions/user/pkg/config/config.go new file mode 100644 index 000000000..d12a74beb --- /dev/null +++ b/extensions/user/pkg/config/config.go @@ -0,0 +1,122 @@ +package config + +import "github.com/owncloud/ocis/ocis-pkg/shared" + +type Config struct { + *shared.Commons `yaml:"-"` + Service Service `yaml:"-"` + Tracing *Tracing `yaml:"tracing"` + Logging *Logging `yaml:"log"` + Debug Debug `yaml:"debug"` + Supervised bool + + GRPC GRPCConfig `yaml:"grpc"` + + JWTSecret string + GatewayEndpoint string + SkipUserGroupsInToken bool + UsersCacheExpiration int + Driver string + Drivers Drivers +} +type Tracing struct { + Enabled bool `yaml:"enabled" env:"OCIS_TRACING_ENABLED;USERS_TRACING_ENABLED" desc:"Activates tracing."` + Type string `yaml:"type" env:"OCIS_TRACING_TYPE;USERS_TRACING_TYPE"` + Endpoint string `yaml:"endpoint" env:"OCIS_TRACING_ENDPOINT;USERS_TRACING_ENDPOINT" desc:"The endpoint to the tracing collector."` + Collector string `yaml:"collector" env:"OCIS_TRACING_COLLECTOR;USERS_TRACING_COLLECTOR"` +} + +type Logging struct { + Level string `yaml:"level" env:"OCIS_LOG_LEVEL;USERS_LOG_LEVEL" desc:"The log level."` + Pretty bool `yaml:"pretty" env:"OCIS_LOG_PRETTY;USERS_LOG_PRETTY" desc:"Activates pretty log output."` + Color bool `yaml:"color" env:"OCIS_LOG_COLOR;USERS_LOG_COLOR" desc:"Activates colorized log output."` + File string `yaml:"file" env:"OCIS_LOG_FILE;USERS_LOG_FILE" desc:"The target log file."` +} + +type Service struct { + Name string `yaml:"-"` +} + +type Debug struct { + Addr string `yaml:"addr" env:"USERS_DEBUG_ADDR"` + Token string `yaml:"token" env:"USERS_DEBUG_TOKEN"` + Pprof bool `yaml:"pprof" env:"USERS_DEBUG_PPROF"` + Zpages bool `yaml:"zpages" env:"USERS_DEBUG_ZPAGES"` +} + +type GRPCConfig struct { + Addr string `yaml:"addr" env:"USERS_GRPC_ADDR" desc:"The address of the grpc service."` + Protocol string `yaml:"protocol" env:"USERS_GRPC_PROTOCOL" desc:"The transport protocol of the grpc service."` +} + +type Drivers struct { + JSON JSONDriver + LDAP LDAPDriver + OwnCloudSQL OwnCloudSQLDriver + REST RESTProvider +} + +type JSONDriver struct { + File string +} + +type LDAPDriver struct { + URI string + CACert string + Insecure bool + BindDN string + BindPassword string + UserBaseDN string + GroupBaseDN string + UserFilter string + GroupFilter string + UserObjectClass string + GroupObjectClass string + LoginAttributes []string + IDP string // TODO what is this for? + GatewayEndpoint string // TODO do we need this here? + UserSchema LDAPUserSchema + GroupSchema LDAPGroupSchema +} + +type LDAPUserSchema struct { + ID string + IDIsOctetString bool + Mail string + DisplayName string + Username string +} + +type LDAPGroupSchema struct { + ID string + IDIsOctetString bool + Mail string + DisplayName string + Groupname string + Member string +} + +type OwnCloudSQLDriver struct { + DBUsername string + DBPassword string + DBHost string + DBPort int + DBName string + IDP string // TODO do we need this? + Nobody int64 // TODO what is this? + JoinUsername bool + JoinOwnCloudUUID bool + EnableMedialSearch bool +} + +type RESTProvider struct { + ClientID string + ClientSecret string + RedisAddr string + RedisUsername string + RedisPassword string + IDProvider string + APIBaseURL string + OIDCTokenEndpoint string + TargetAPI string +} diff --git a/extensions/user/pkg/config/defaults/defaultconfig.go b/extensions/user/pkg/config/defaults/defaultconfig.go new file mode 100644 index 000000000..95c620b64 --- /dev/null +++ b/extensions/user/pkg/config/defaults/defaultconfig.go @@ -0,0 +1,109 @@ +package defaults + +import ( + "path/filepath" + + "github.com/owncloud/ocis/extensions/user/pkg/config" + "github.com/owncloud/ocis/ocis-pkg/config/defaults" +) + +func FullDefaultConfig() *config.Config { + cfg := DefaultConfig() + + EnsureDefaults(cfg) + + return cfg +} + +func DefaultConfig() *config.Config { + return &config.Config{ + Debug: config.Debug{ + Addr: "127.0.0.1:9145", + Token: "", + Pprof: false, + Zpages: false, + }, + GRPC: config.GRPCConfig{ + Addr: "127.0.0.1:9144", + Protocol: "tcp", + }, + Service: config.Service{ + Name: "user", + }, + UsersCacheExpiration: 5, + GatewayEndpoint: "127.0.0.1:9142", + JWTSecret: "Pive-Fumkiu4", + Driver: "ldap", + Drivers: config.Drivers{ + LDAP: config.LDAPDriver{ + URI: "ldaps://localhost:9126", + CACert: filepath.Join(defaults.BaseDataPath(), "ldap", "ldap.crt"), + Insecure: false, + UserBaseDN: "dc=ocis,dc=test", + GroupBaseDN: "dc=ocis,dc=test", + LoginAttributes: []string{"cn", "mail"}, + UserFilter: "", + GroupFilter: "", + UserObjectClass: "posixAccount", + GroupObjectClass: "posixGroup", + BindDN: "cn=reva,ou=sysusers,dc=ocis,dc=test", + BindPassword: "reva", + IDP: "https://localhost:9200", + UserSchema: config.LDAPUserSchema{ + ID: "ownclouduuid", + Mail: "mail", + DisplayName: "displayname", + Username: "cn", + }, + GroupSchema: config.LDAPGroupSchema{ + ID: "cn", + Mail: "mail", + DisplayName: "cn", + Groupname: "cn", + Member: "cn", + }, + }, + JSON: config.JSONDriver{}, + OwnCloudSQL: config.OwnCloudSQLDriver{ + DBUsername: "owncloud", + DBPassword: "secret", + DBHost: "mysql", + DBPort: 3306, + DBName: "owncloud", + IDP: "https://localhost:9200", + Nobody: 90, + JoinUsername: false, + JoinOwnCloudUUID: false, + EnableMedialSearch: false, + }, + REST: config.RESTProvider{ + RedisAddr: "localhost:6379", + }, + }, + } +} + +func EnsureDefaults(cfg *config.Config) { + // provide with defaults for shared logging, since we need a valid destination address for BindEnv. + if cfg.Logging == nil && cfg.Commons != nil && cfg.Commons.Log != nil { + cfg.Logging = &config.Logging{ + Level: cfg.Commons.Log.Level, + Pretty: cfg.Commons.Log.Pretty, + Color: cfg.Commons.Log.Color, + File: cfg.Commons.Log.File, + } + } else if cfg.Logging == nil { + cfg.Logging = &config.Logging{} + } + // provide with defaults for shared tracing, since we need a valid destination address for BindEnv. + if cfg.Tracing == nil && cfg.Commons != nil && cfg.Commons.Tracing != nil { + cfg.Tracing = &config.Tracing{ + Enabled: cfg.Commons.Tracing.Enabled, + Type: cfg.Commons.Tracing.Type, + Endpoint: cfg.Commons.Tracing.Endpoint, + Collector: cfg.Commons.Tracing.Collector, + } + } else if cfg.Tracing == nil { + cfg.Tracing = &config.Tracing{} + } +} diff --git a/ocis-pkg/config/config.go b/ocis-pkg/config/config.go index add36e402..2ad148d6f 100644 --- a/ocis-pkg/config/config.go +++ b/ocis-pkg/config/config.go @@ -19,6 +19,7 @@ import ( storage "github.com/owncloud/ocis/extensions/storage/pkg/config" store "github.com/owncloud/ocis/extensions/store/pkg/config" thumbnails "github.com/owncloud/ocis/extensions/thumbnails/pkg/config" + user "github.com/owncloud/ocis/extensions/user/pkg/config" web "github.com/owncloud/ocis/extensions/web/pkg/config" webdav "github.com/owncloud/ocis/extensions/webdav/pkg/config" ) @@ -75,6 +76,7 @@ type Config struct { Settings *settings.Config `yaml:"settings"` Storage *storage.Config `yaml:"storage"` AuthBasic *authbasic.Config `yaml:"auth_basic"` + User *user.Config `yaml:"user"` Store *store.Config `yaml:"store"` Thumbnails *thumbnails.Config `yaml:"thumbnails"` WebDAV *webdav.Config `yaml:"webdav"` diff --git a/ocis-pkg/config/defaultconfig.go b/ocis-pkg/config/defaultconfig.go index afd396835..4eaa93f6c 100644 --- a/ocis-pkg/config/defaultconfig.go +++ b/ocis-pkg/config/defaultconfig.go @@ -17,6 +17,7 @@ import ( storage "github.com/owncloud/ocis/extensions/storage/pkg/config/defaults" store "github.com/owncloud/ocis/extensions/store/pkg/config/defaults" thumbnails "github.com/owncloud/ocis/extensions/thumbnails/pkg/config/defaults" + user "github.com/owncloud/ocis/extensions/user/pkg/config/defaults" web "github.com/owncloud/ocis/extensions/web/pkg/config/defaults" webdav "github.com/owncloud/ocis/extensions/webdav/pkg/config/defaults" ) @@ -48,5 +49,6 @@ func DefaultConfig() *Config { WebDAV: webdav.DefaultConfig(), Storage: storage.DefaultConfig(), AuthBasic: authbasic.FullDefaultConfig(), + User: user.FullDefaultConfig(), } } diff --git a/ocis/pkg/command/storageuserprovider.go b/ocis/pkg/command/storageuserprovider.go index 896d05720..20450c63e 100644 --- a/ocis/pkg/command/storageuserprovider.go +++ b/ocis/pkg/command/storageuserprovider.go @@ -1,7 +1,7 @@ package command import ( - "github.com/owncloud/ocis/extensions/storage/pkg/command" + "github.com/owncloud/ocis/extensions/user/pkg/command" "github.com/owncloud/ocis/ocis-pkg/config" "github.com/owncloud/ocis/ocis/pkg/register" "github.com/urfave/cli/v2" @@ -14,11 +14,11 @@ func StorageUserProviderCommand(cfg *config.Config) *cli.Command { Usage: "start storage userprovider service", Category: "extensions", //Flags: flagset.UsersWithConfig(cfg.Storage), - Before: func(ctx *cli.Context) error { - return ParseStorageCommon(ctx, cfg) - }, + // Before: func(ctx *cli.Context) error { + // return ParseStorageCommon(ctx, cfg) + // }, Action: func(c *cli.Context) error { - origCmd := command.Users(cfg.Storage) + origCmd := command.User(cfg.User) return handleOriginalAction(c, origCmd) }, } diff --git a/ocis/pkg/runtime/service/service.go b/ocis/pkg/runtime/service/service.go index 5c70dcb09..4ce9bba8f 100644 --- a/ocis/pkg/runtime/service/service.go +++ b/ocis/pkg/runtime/service/service.go @@ -34,6 +34,7 @@ import ( storage "github.com/owncloud/ocis/extensions/storage/pkg/command" store "github.com/owncloud/ocis/extensions/store/pkg/command" thumbnails "github.com/owncloud/ocis/extensions/thumbnails/pkg/command" + user "github.com/owncloud/ocis/extensions/user/pkg/command" web "github.com/owncloud/ocis/extensions/web/pkg/command" webdav "github.com/owncloud/ocis/extensions/webdav/pkg/command" ociscfg "github.com/owncloud/ocis/ocis-pkg/config" @@ -110,7 +111,7 @@ func NewService(options ...Option) (*Service, error) { s.ServicesRegistry["storage-frontend"] = storage.NewFrontend s.ServicesRegistry["ocdav"] = storage.NewOCDav s.ServicesRegistry["storage-gateway"] = storage.NewGateway - s.ServicesRegistry["storage-userprovider"] = storage.NewUserProvider + s.ServicesRegistry["storage-userprovider"] = user.NewUserProvider s.ServicesRegistry["storage-groupprovider"] = storage.NewGroupProvider s.ServicesRegistry["storage-authbasic"] = authbasic.NewAuthBasic s.ServicesRegistry["storage-authbearer"] = storage.NewAuthBearer