Merge pull request #7564 from aduffeck/ocm2
[full-ci] Wire ocm services
This commit is contained in:
@@ -67,7 +67,7 @@ We also suggest to use the last port in your extensions' range as a debug/metric
|
||||
| 9265-9269 | FREE |
|
||||
| 9270-9274 | [eventhistory]({{< ref "../eventhistory/_index.md" >}}) |
|
||||
| 9275-9279 | FREE |
|
||||
| 9280-9284 | FREE |
|
||||
| 9280-9284 | [ocm]({{< ref "../ocm/_index.md" >}}) |
|
||||
| 9285-9289 | FREE |
|
||||
| 9290-9294 | FREE |
|
||||
| 9295-9299 | FREE |
|
||||
|
||||
@@ -12,8 +12,8 @@ require (
|
||||
github.com/blevesearch/bleve/v2 v2.3.10
|
||||
github.com/coreos/go-oidc v2.2.1+incompatible
|
||||
github.com/coreos/go-oidc/v3 v3.7.0
|
||||
github.com/cs3org/go-cs3apis v0.0.0-20230727093620-0f4399be4543
|
||||
github.com/cs3org/reva/v2 v2.16.1-0.20231023124625-f9a66375fd79
|
||||
github.com/cs3org/go-cs3apis v0.0.0-20231023073225-7748710e0781
|
||||
github.com/cs3org/reva/v2 v2.16.1-0.20231024092538-194fbe4a2c31
|
||||
github.com/disintegration/imaging v1.6.2
|
||||
github.com/dutchcoders/go-clamd v0.0.0-20170520113014-b970184f4d9e
|
||||
github.com/egirna/icap-client v0.1.1
|
||||
@@ -340,6 +340,3 @@ require (
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
sigs.k8s.io/yaml v1.3.0 // indirect
|
||||
)
|
||||
|
||||
// the replacement build is based on https://github.com/aduffeck/cs3apis/tree/master
|
||||
replace github.com/cs3org/go-cs3apis => github.com/aduffeck/go-cs3apis v0.0.0-20231009082215-ad45e19edac0
|
||||
|
||||
@@ -825,8 +825,6 @@ github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWX
|
||||
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
|
||||
github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk=
|
||||
github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4=
|
||||
github.com/aduffeck/go-cs3apis v0.0.0-20231009082215-ad45e19edac0 h1:y9gvblZJHMENTzgolQ9sChKONSILkJ4U/j7OqMIF4QM=
|
||||
github.com/aduffeck/go-cs3apis v0.0.0-20231009082215-ad45e19edac0/go.mod h1:UXha4TguuB52H14EMoSsCqDj7k8a/t7g4gVP+bgY5LY=
|
||||
github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8=
|
||||
github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo=
|
||||
github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU=
|
||||
@@ -1013,8 +1011,10 @@ github.com/crewjam/httperr v0.2.0 h1:b2BfXR8U3AlIHwNeFFvZ+BV1LFvKLlzMjzaTnZMybNo
|
||||
github.com/crewjam/httperr v0.2.0/go.mod h1:Jlz+Sg/XqBQhyMjdDiC+GNNRzZTD7x39Gu3pglZ5oH4=
|
||||
github.com/crewjam/saml v0.4.14 h1:g9FBNx62osKusnFzs3QTN5L9CVA/Egfgm+stJShzw/c=
|
||||
github.com/crewjam/saml v0.4.14/go.mod h1:UVSZCf18jJkk6GpWNVqcyQJMD5HsRugBPf4I1nl2mME=
|
||||
github.com/cs3org/reva/v2 v2.16.1-0.20231023124625-f9a66375fd79 h1:c6rk7hzCq+9lvOtWKPH6DbGnCHvNQosW2H8YQaslneU=
|
||||
github.com/cs3org/reva/v2 v2.16.1-0.20231023124625-f9a66375fd79/go.mod h1:rY/itYaRBW7NjLpLIrWHSUirqEeBz5kdKbF5Dh96yMA=
|
||||
github.com/cs3org/go-cs3apis v0.0.0-20231023073225-7748710e0781 h1:BUdwkIlf8IS2FasrrPg8gGPHQPOrQ18MS1Oew2tmGtY=
|
||||
github.com/cs3org/go-cs3apis v0.0.0-20231023073225-7748710e0781/go.mod h1:UXha4TguuB52H14EMoSsCqDj7k8a/t7g4gVP+bgY5LY=
|
||||
github.com/cs3org/reva/v2 v2.16.1-0.20231024092538-194fbe4a2c31 h1:FUCdIAKFYXcr+J6xYS/enrdLD0Hy+yVhS9WXBXtuJ4s=
|
||||
github.com/cs3org/reva/v2 v2.16.1-0.20231024092538-194fbe4a2c31/go.mod h1:utPCNSrWDdAwz2biLrKvzO6nDH9L7vRVGNzof13r8Kw=
|
||||
github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
|
||||
@@ -22,6 +22,7 @@ import (
|
||||
nats "github.com/owncloud/ocis/v2/services/nats/pkg/config"
|
||||
notifications "github.com/owncloud/ocis/v2/services/notifications/pkg/config"
|
||||
ocdav "github.com/owncloud/ocis/v2/services/ocdav/pkg/config"
|
||||
ocm "github.com/owncloud/ocis/v2/services/ocm/pkg/config"
|
||||
ocs "github.com/owncloud/ocis/v2/services/ocs/pkg/config"
|
||||
policies "github.com/owncloud/ocis/v2/services/policies/pkg/config"
|
||||
postprocessing "github.com/owncloud/ocis/v2/services/postprocessing/pkg/config"
|
||||
@@ -71,7 +72,7 @@ type Config struct {
|
||||
|
||||
Registry string `yaml:"registry"`
|
||||
TokenManager *shared.TokenManager `yaml:"token_manager"`
|
||||
MachineAuthAPIKey string `yaml:"machine_auth_api_key"env:"OCIS_MACHINE_AUTH_API_KEY" desc:"Machine auth API key used to validate internal requests necessary for the access to resources from other services."`
|
||||
MachineAuthAPIKey string `yaml:"machine_auth_api_key" env:"OCIS_MACHINE_AUTH_API_KEY" desc:"Machine auth API key used to validate internal requests necessary for the access to resources from other services."`
|
||||
TransferSecret string `yaml:"transfer_secret" env:"OCIS_TRANSFER_SECRET" desc:"Transfer secret for signing file up- and download requests."`
|
||||
SystemUserID string `yaml:"system_user_id" env:"OCIS_SYSTEM_USER_ID" desc:"ID of the oCIS storage-system system user. Admins need to set the ID for the storage-system system user in this config option which is then used to reference the user. Any reasonable long string is possible, preferably this would be an UUIDv4 format."`
|
||||
SystemUserAPIKey string `yaml:"system_user_api_key" env:"OCIS_SYSTEM_USER_API_KEY" desc:"API key for the storage-system system user."`
|
||||
@@ -98,6 +99,7 @@ type Config struct {
|
||||
Nats *nats.Config `yaml:"nats"`
|
||||
Notifications *notifications.Config `yaml:"notifications"`
|
||||
OCDav *ocdav.Config `yaml:"ocdav"`
|
||||
OCM *ocm.Config `yaml:"ocm"`
|
||||
OCS *ocs.Config `yaml:"ocs"`
|
||||
Postprocessing *postprocessing.Config `yaml:"postprocessing"`
|
||||
Policies *policies.Config `yaml:"policies"`
|
||||
|
||||
@@ -21,6 +21,7 @@ import (
|
||||
nats "github.com/owncloud/ocis/v2/services/nats/pkg/config/defaults"
|
||||
notifications "github.com/owncloud/ocis/v2/services/notifications/pkg/config/defaults"
|
||||
ocdav "github.com/owncloud/ocis/v2/services/ocdav/pkg/config/defaults"
|
||||
ocm "github.com/owncloud/ocis/v2/services/ocm/pkg/config/defaults"
|
||||
ocs "github.com/owncloud/ocis/v2/services/ocs/pkg/config/defaults"
|
||||
policies "github.com/owncloud/ocis/v2/services/policies/pkg/config/defaults"
|
||||
postprocessing "github.com/owncloud/ocis/v2/services/postprocessing/pkg/config/defaults"
|
||||
@@ -70,6 +71,7 @@ func DefaultConfig() *Config {
|
||||
Nats: nats.DefaultConfig(),
|
||||
Notifications: notifications.DefaultConfig(),
|
||||
OCDav: ocdav.DefaultConfig(),
|
||||
OCM: ocm.DefaultConfig(),
|
||||
OCS: ocs.DefaultConfig(),
|
||||
Postprocessing: postprocessing.DefaultConfig(),
|
||||
Policies: policies.DefaultConfig(),
|
||||
|
||||
@@ -39,6 +39,7 @@ import (
|
||||
nats "github.com/owncloud/ocis/v2/services/nats/pkg/command"
|
||||
notifications "github.com/owncloud/ocis/v2/services/notifications/pkg/command"
|
||||
ocdav "github.com/owncloud/ocis/v2/services/ocdav/pkg/command"
|
||||
ocm "github.com/owncloud/ocis/v2/services/ocm/pkg/command"
|
||||
ocs "github.com/owncloud/ocis/v2/services/ocs/pkg/command"
|
||||
policies "github.com/owncloud/ocis/v2/services/policies/pkg/command"
|
||||
postprocessing "github.com/owncloud/ocis/v2/services/postprocessing/pkg/command"
|
||||
@@ -317,6 +318,11 @@ func NewService(options ...Option) (*Service, error) {
|
||||
cfg.SSE.Commons = cfg.Commons
|
||||
return sse.Execute(cfg.SSE)
|
||||
})
|
||||
dreg(opts.Config.OCM.Service.Name, func(ctx context.Context, cfg *ociscfg.Config) error {
|
||||
cfg.OCM.Context = ctx
|
||||
cfg.OCM.Commons = cfg.Commons
|
||||
return ocm.Execute(cfg.OCM)
|
||||
})
|
||||
|
||||
return s, nil
|
||||
}
|
||||
|
||||
@@ -43,6 +43,7 @@ type Config struct {
|
||||
StorageUsersEndpoint string `yaml:"-"`
|
||||
StorageSharesEndpoint string `yaml:"-"`
|
||||
AppRegistryEndpoint string `yaml:"-"`
|
||||
OCMEndpoint string `yaml:"-"`
|
||||
|
||||
StorageRegistry StorageRegistry `yaml:"storage_registry"` // TODO: should we even support switching this?
|
||||
|
||||
|
||||
@@ -63,6 +63,7 @@ func DefaultConfig() *config.Config {
|
||||
StorageSharesEndpoint: "com.owncloud.api.storage-shares",
|
||||
StorageUsersEndpoint: "com.owncloud.api.storage-users",
|
||||
UsersEndpoint: "com.owncloud.api.users",
|
||||
OCMEndpoint: "com.owncloud.api.ocm",
|
||||
|
||||
StorageRegistry: config.StorageRegistry{
|
||||
Driver: "spaces",
|
||||
|
||||
@@ -50,7 +50,10 @@ func GatewayConfigFromStruct(cfg *config.Config, logger log.Logger) map[string]i
|
||||
// sharing is located on the sharing service
|
||||
"usershareprovidersvc": cfg.SharingEndpoint,
|
||||
"publicshareprovidersvc": cfg.SharingEndpoint,
|
||||
"ocmshareprovidersvc": cfg.SharingEndpoint,
|
||||
"ocmshareprovidersvc": cfg.OCMEndpoint,
|
||||
"ocminvitemanagersvc": cfg.OCMEndpoint,
|
||||
"ocmproviderauthorizersvc": cfg.OCMEndpoint,
|
||||
"ocmcoresvc": cfg.OCMEndpoint,
|
||||
"commit_share_to_storage_grant": cfg.CommitShareToStorageGrant,
|
||||
"share_folder": cfg.ShareFolder, // ShareFolder is the location where to create shares in the recipient's storage provider.
|
||||
// other
|
||||
@@ -84,6 +87,7 @@ func GatewayConfigFromStruct(cfg *config.Config, logger log.Logger) map[string]i
|
||||
"machine": cfg.AuthMachineEndpoint,
|
||||
"publicshares": cfg.StoragePublicLinkEndpoint,
|
||||
"serviceaccounts": cfg.AuthServiceEndpoint,
|
||||
"ocmshares": cfg.OCMEndpoint,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@@ -63,6 +63,7 @@ func Server(cfg *config.Config) *cli.Command {
|
||||
ocdav.AllowedOrigins(cfg.HTTP.CORS.AllowedOrigins),
|
||||
ocdav.FilesNamespace(cfg.FilesNamespace),
|
||||
ocdav.WebdavNamespace(cfg.WebdavNamespace),
|
||||
ocdav.OCMNamespace(cfg.OCMNamespace),
|
||||
ocdav.AllowDepthInfinity(cfg.AllowPropfindDepthInfinity),
|
||||
ocdav.SharesNamespace(cfg.SharesNamespace),
|
||||
ocdav.Timeout(cfg.Timeout),
|
||||
|
||||
@@ -23,6 +23,7 @@ type Config struct {
|
||||
WebdavNamespace string `yaml:"webdav_namespace" env:"OCDAV_WEBDAV_NAMESPACE" desc:"Jail requests to /dav/webdav into this CS3 namespace. Supports template layouting with CS3 User properties."`
|
||||
FilesNamespace string `yaml:"files_namespace" env:"OCDAV_FILES_NAMESPACE" desc:"Jail requests to /dav/files/{username} into this CS3 namespace. Supports template layouting with CS3 User properties."`
|
||||
SharesNamespace string `yaml:"shares_namespace" env:"OCDAV_SHARES_NAMESPACE" desc:"The human readable path for the share jail. Relative to a users personal space root. Upcased intentionally."`
|
||||
OCMNamespace string `yaml:"ocm_namespace" env:"OCDAV_OCM_NAMESPACE" desc:"The human readable path prefix for the ocm shares."`
|
||||
// PublicURL used to redirect /s/{token} URLs to
|
||||
PublicURL string `yaml:"public_url" env:"OCIS_URL;OCDAV_PUBLIC_URL" desc:"URL where oCIS is reachable for users."`
|
||||
|
||||
|
||||
@@ -81,6 +81,7 @@ func DefaultConfig() *config.Config {
|
||||
WebdavNamespace: "/users/{{.Id.OpaqueId}}",
|
||||
FilesNamespace: "/users/{{.Id.OpaqueId}}",
|
||||
SharesNamespace: "/Shares",
|
||||
OCMNamespace: "/public",
|
||||
PublicURL: "https://localhost:9200",
|
||||
Insecure: false,
|
||||
Timeout: 84300,
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
SHELL := bash
|
||||
NAME := ocm
|
||||
|
||||
include ../../.make/recursion.mk
|
||||
|
||||
############ tooling ############
|
||||
ifneq (, $(shell command -v go 2> /dev/null)) # suppress `command not found warnings` for non go targets in CI
|
||||
include ../../.bingo/Variables.mk
|
||||
endif
|
||||
|
||||
############ go tooling ############
|
||||
include ../../.make/go.mk
|
||||
|
||||
############ release ############
|
||||
include ../../.make/release.mk
|
||||
|
||||
############ docs generate ############
|
||||
include ../../.make/docs.mk
|
||||
|
||||
.PHONY: docs-generate
|
||||
docs-generate: config-docs-generate
|
||||
|
||||
############ generate ############
|
||||
include ../../.make/generate.mk
|
||||
|
||||
.PHONY: ci-go-generate
|
||||
ci-go-generate: # CI runs ci-node-generate automatically before this target
|
||||
|
||||
.PHONY: ci-node-generate
|
||||
ci-node-generate:
|
||||
|
||||
############ licenses ############
|
||||
.PHONY: ci-node-check-licenses
|
||||
ci-node-check-licenses:
|
||||
|
||||
.PHONY: ci-node-save-licenses
|
||||
ci-node-save-licenses:
|
||||
@@ -0,0 +1,3 @@
|
||||
# OCM
|
||||
|
||||
The `ocm` service provides federated sharing functionality based on [sciencemesh](https://sciencemesh.io/) and [ocm](https://github.com/cs3org/OCM-API).
|
||||
@@ -0,0 +1,14 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"os"
|
||||
|
||||
"github.com/owncloud/ocis/v2/services/ocm/pkg/command"
|
||||
"github.com/owncloud/ocis/v2/services/ocm/pkg/config/defaults"
|
||||
)
|
||||
|
||||
func main() {
|
||||
if err := command.Execute(defaults.DefaultConfig()); err != nil {
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package command
|
||||
|
||||
import (
|
||||
"github.com/owncloud/ocis/v2/services/ocm/pkg/config"
|
||||
"github.com/urfave/cli/v2"
|
||||
)
|
||||
|
||||
// Health is the entrypoint for the health command.
|
||||
func Health(cfg *config.Config) *cli.Command {
|
||||
return &cli.Command{
|
||||
Name: "health",
|
||||
Usage: "Check health status",
|
||||
Action: func(c *cli.Context) error {
|
||||
// Not implemented
|
||||
return nil
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package command
|
||||
|
||||
import (
|
||||
"os"
|
||||
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/clihelper"
|
||||
"github.com/owncloud/ocis/v2/services/ocm/pkg/config"
|
||||
"github.com/urfave/cli/v2"
|
||||
)
|
||||
|
||||
// GetCommands provides all commands for this service
|
||||
func GetCommands(cfg *config.Config) cli.Commands {
|
||||
return []*cli.Command{
|
||||
// start this service
|
||||
Server(cfg),
|
||||
|
||||
// interaction with this service
|
||||
|
||||
// infos about this service
|
||||
Health(cfg),
|
||||
Version(cfg),
|
||||
}
|
||||
}
|
||||
|
||||
// Execute is the entry point for the ocm command.
|
||||
func Execute(cfg *config.Config) error {
|
||||
app := clihelper.DefaultApp(&cli.App{
|
||||
Name: "ocm",
|
||||
Usage: "starts ocm service",
|
||||
Commands: GetCommands(cfg),
|
||||
})
|
||||
|
||||
return app.Run(os.Args)
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
package command
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"path"
|
||||
|
||||
"github.com/cs3org/reva/v2/cmd/revad/runtime"
|
||||
"github.com/gofrs/uuid"
|
||||
"github.com/oklog/run"
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/config/configlog"
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/registry"
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/sync"
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/tracing"
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/version"
|
||||
"github.com/owncloud/ocis/v2/services/ocm/pkg/config"
|
||||
"github.com/owncloud/ocis/v2/services/ocm/pkg/config/parser"
|
||||
"github.com/owncloud/ocis/v2/services/ocm/pkg/logging"
|
||||
"github.com/owncloud/ocis/v2/services/ocm/pkg/revaconfig"
|
||||
"github.com/owncloud/ocis/v2/services/ocm/pkg/server/debug"
|
||||
"github.com/urfave/cli/v2"
|
||||
)
|
||||
|
||||
// Server is the entrypoint for the server command.
|
||||
func Server(cfg *config.Config) *cli.Command {
|
||||
return &cli.Command{
|
||||
Name: "server",
|
||||
Usage: fmt.Sprintf("start the %s service without runtime (unsupervised mode)", cfg.Service.Name),
|
||||
Category: "server",
|
||||
Before: func(c *cli.Context) error {
|
||||
return configlog.ReturnFatal(parser.ParseConfig(cfg))
|
||||
},
|
||||
Action: func(c *cli.Context) error {
|
||||
logger := logging.Configure(cfg.Service.Name, cfg.Log)
|
||||
traceProvider, err := tracing.GetServiceTraceProvider(cfg.Tracing, cfg.Service.Name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
gr := run.Group{}
|
||||
ctx, cancel := defineContext(cfg)
|
||||
|
||||
defer cancel()
|
||||
|
||||
rCfg := revaconfig.OCMConfigFromStruct(cfg, logger)
|
||||
|
||||
gr.Add(func() error {
|
||||
pidFile := path.Join(os.TempDir(), "revad-"+cfg.Service.Name+"-"+uuid.Must(uuid.NewV4()).String()+".pid")
|
||||
reg := registry.GetRegistry()
|
||||
|
||||
runtime.RunWithOptions(rCfg, pidFile,
|
||||
runtime.WithLogger(&logger.Logger),
|
||||
runtime.WithRegistry(reg),
|
||||
runtime.WithTraceProvider(traceProvider),
|
||||
)
|
||||
|
||||
return nil
|
||||
}, func(err error) {
|
||||
logger.Error().
|
||||
Err(err).
|
||||
Str("server", cfg.Service.Name).
|
||||
Msg("Shutting down server")
|
||||
|
||||
cancel()
|
||||
os.Exit(1)
|
||||
})
|
||||
|
||||
debugServer, err := debug.Server(
|
||||
debug.Logger(logger),
|
||||
debug.Context(ctx),
|
||||
debug.Config(cfg),
|
||||
)
|
||||
if err != nil {
|
||||
logger.Info().Err(err).Str("server", "debug").Msg("Failed to initialize server")
|
||||
return err
|
||||
}
|
||||
|
||||
gr.Add(debugServer.ListenAndServe, func(_ error) {
|
||||
cancel()
|
||||
})
|
||||
|
||||
if !cfg.Supervised {
|
||||
sync.Trap(&gr, cancel)
|
||||
}
|
||||
|
||||
grpcSvc := registry.BuildGRPCService(cfg.GRPC.Namespace+"."+cfg.Service.Name, uuid.Must(uuid.NewV4()).String(), cfg.GRPC.Addr, version.GetString())
|
||||
if err := registry.RegisterService(ctx, grpcSvc, logger); err != nil {
|
||||
logger.Fatal().Err(err).Msg("failed to register the grpc service")
|
||||
}
|
||||
|
||||
httpSvc := registry.BuildHTTPService(cfg.HTTP.Namespace+"."+cfg.Service.Name, uuid.Must(uuid.NewV4()).String(), cfg.HTTP.Addr, version.GetString())
|
||||
if err := registry.RegisterService(ctx, httpSvc, logger); err != nil {
|
||||
logger.Fatal().Err(err).Msg("failed to register the http service")
|
||||
}
|
||||
|
||||
return gr.Run()
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// defineContext sets the context for the service. If there is a context configured it will create a new child from it,
|
||||
// if not, it will create a root context that can be cancelled.
|
||||
func defineContext(cfg *config.Config) (context.Context, context.CancelFunc) {
|
||||
return func() (context.Context, context.CancelFunc) {
|
||||
if cfg.Context == nil {
|
||||
return context.WithCancel(context.Background())
|
||||
}
|
||||
return context.WithCancel(cfg.Context)
|
||||
}()
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package command
|
||||
|
||||
import (
|
||||
"github.com/owncloud/ocis/v2/services/ocm/pkg/config"
|
||||
"github.com/urfave/cli/v2"
|
||||
)
|
||||
|
||||
// Version prints the service versions of all running instances.
|
||||
func Version(cfg *config.Config) *cli.Command {
|
||||
return &cli.Command{
|
||||
Name: "version",
|
||||
Usage: "print the version of this binary and the running service instances",
|
||||
Category: "info",
|
||||
Action: func(c *cli.Context) error {
|
||||
// not implemented
|
||||
return nil
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,131 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/shared"
|
||||
"go-micro.dev/v4/client"
|
||||
)
|
||||
|
||||
// Config combines all available configuration parts.
|
||||
type Config struct {
|
||||
Commons *shared.Commons `yaml:"-"` // don't use this directly as configuration for a service
|
||||
|
||||
Service Service `yaml:"-"`
|
||||
|
||||
Tracing *Tracing `yaml:"tracing"`
|
||||
Log *Log `yaml:"log"`
|
||||
Debug Debug `yaml:"debug"`
|
||||
|
||||
HTTP HTTPConfig `yaml:"http"`
|
||||
Middleware Middleware `yaml:"middleware"`
|
||||
GRPC GRPCConfig `yaml:"grpc"`
|
||||
GRPCClientTLS *shared.GRPCClientTLS `yaml:"grpc_client_tls"`
|
||||
GrpcClient client.Client `yaml:"-"`
|
||||
|
||||
Reva *shared.Reva `yaml:"reva"`
|
||||
OCMD OCMD `yaml:"ocmd"`
|
||||
ScienceMesh ScienceMesh `yaml:"sciencemesh"`
|
||||
OCMInviteManager OCMInviteManager `yaml:"ocm_invite_manager"`
|
||||
OCMProviderAuthorizerDriver string `yaml:"ocm_provider_authorizer_driver" env:"SHARING_OCM_PROVIDER_AUTHORIZER_DRIVER" desc:"Driver to be used to persist ocm invites. Supported values 'json'."`
|
||||
OCMProviderAuthorizerDrivers OCMProviderAuthorizerDrivers `yaml:"ocm_provider_authorizer_drivers"`
|
||||
OCMShareProvider OCMShareProvider `yaml:"ocm_share_provider"`
|
||||
OCMCore OCMCore `yaml:"ocm_core"`
|
||||
|
||||
Supervised bool `yaml:"-"`
|
||||
Context context.Context `yaml:"-"`
|
||||
}
|
||||
|
||||
// HTTPConfig defines the available http configuration.
|
||||
type HTTPConfig struct {
|
||||
Addr string `yaml:"addr" env:"OCM_HTTP_ADDR" desc:"The bind address of the HTTP service."`
|
||||
Namespace string `yaml:"-"`
|
||||
Protocol string `yaml:"protocol" env:"OCM_HTTP_PROTOCOL" desc:"The transport protocol of the HTTP service."`
|
||||
Prefix string `yaml:"prefix" env:"OCM_HTTP_PREFIX" desc:"The Path prefix where the OCM can be accessed (defaults to /)."`
|
||||
CORS CORS `yaml:"cors"`
|
||||
}
|
||||
|
||||
// Middleware configures reva middlewares.
|
||||
type Middleware struct {
|
||||
Auth Auth `yaml:"auth"`
|
||||
}
|
||||
|
||||
// Auth configures reva http auth middleware.
|
||||
type Auth struct {
|
||||
CredentialsByUserAgent map[string]string `yaml:"credentials_by_user_agent"`
|
||||
}
|
||||
|
||||
// CORS defines the available cors configuration.
|
||||
type CORS struct {
|
||||
AllowedOrigins []string `yaml:"allow_origins" env:"OCIS_CORS_ALLOW_ORIGINS;OCM_CORS_ALLOW_ORIGINS" desc:"A comma-separated list of allowed CORS origins. See following chapter for more details: *Access-Control-Allow-Origin* at https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin"`
|
||||
AllowedMethods []string `yaml:"allow_methods" env:"OCIS_CORS_ALLOW_METHODS;OCM_CORS_ALLOW_METHODS" desc:"A comma-separated list of allowed CORS methods. See following chapter for more details: *Access-Control-Request-Method* at https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Request-Method"`
|
||||
AllowedHeaders []string `yaml:"allow_headers" env:"OCIS_CORS_ALLOW_HEADERS;OCM_CORS_ALLOW_HEADERS" desc:"A blank or comma-separated list of allowed CORS headers. See following chapter for more details: *Access-Control-Request-Headers* at https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Request-Headers."`
|
||||
AllowCredentials bool `yaml:"allow_credentials" env:"OCIS_CORS_ALLOW_CREDENTIALS;OCM_CORS_ALLOW_CREDENTIALS" desc:"Allow credentials for CORS.See following chapter for more details: *Access-Control-Allow-Credentials* at https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials."`
|
||||
}
|
||||
|
||||
// GRPCConfig defines the available grpc configuration.
|
||||
type GRPCConfig struct {
|
||||
Addr string `ocisConfig:"addr" env:"OCM_GRPC_ADDR" desc:"The bind address of the GRPC service."`
|
||||
Namespace string `ocisConfig:"-" yaml:"-"`
|
||||
TLS *shared.GRPCServiceTLS `yaml:"tls"`
|
||||
Protocol string `yaml:"protocol" env:"OCM_GRPC_PROTOCOL" desc:"The transport protocol of the GRPC service."`
|
||||
}
|
||||
|
||||
type ScienceMesh struct {
|
||||
Prefix string `yaml:"prefix" env:"OCM_SCIENCEMESH_PREFIX" desc:"URL path prefix for the ScienceMesh service. Note that the string must not start with '/'."`
|
||||
}
|
||||
|
||||
type OCMD struct {
|
||||
Prefix string `yaml:"prefix" env:"OCM_OCMD_PREFIX" desc:"URL path prefix for the OCMD service. Note that the string must not start with '/'."`
|
||||
ExposeRecipientDisplayName bool `yaml:"expose_recipient_display_name" env:"OCM_OCMD_EXPOSE_RECIPIENT_DISPLAY_NAME" desc:"Expose the display name of OCM share recipients."`
|
||||
}
|
||||
|
||||
type OCMInviteManager struct {
|
||||
Driver string `yaml:"driver" env:"SHARING_OCM_INVITE_MANAGER_DRIVER" desc:"Driver to be used to persist ocm invites. Supported values 'json'."`
|
||||
Drivers OCMInviteManagerDrivers `yaml:"drivers"`
|
||||
Insecure bool `yaml:"insecure" env:"SHARING_OCM_INVITE_MANAGER_INSECURE" desc:"Disable TLS certificate validation for the OCM connections. Do not set this in production environments."`
|
||||
}
|
||||
|
||||
type OCMInviteManagerDrivers struct {
|
||||
JSON OCMInviteManagerJSONDriver `yaml:"json"`
|
||||
}
|
||||
|
||||
type OCMInviteManagerJSONDriver struct {
|
||||
File string `yaml:"file" env:"SHARING_OCM_INVITE_MANAGER_JSON_FILE" desc:"Path to the JSON file where ocm invites data will be stored. If not defined, the root directory derives from $OCIS_BASE_DATA_PATH:/storage."`
|
||||
}
|
||||
|
||||
type OCMProviderAuthorizerDrivers struct {
|
||||
JSON OCMProviderAuthorizerJSONDriver `yaml:"json"`
|
||||
}
|
||||
|
||||
type OCMProviderAuthorizerJSONDriver struct {
|
||||
Providers string `yaml:"providers" env:"SHARING_OCM_PROVIDER_AUTHORIZER_PROVIDERS_FILE" desc:"Path to the JSON file where ocm invites data will be stored. If not defined, the root directory derives from $OCIS_BASE_DATA_PATH:/storage."`
|
||||
VerifyRequestHostname bool `yaml:"verify_request_hostname" env:"SHARING_OCM_PROVIDER_AUTHORIZER_PROVIDERS_FILE"`
|
||||
}
|
||||
|
||||
type OCMCore struct {
|
||||
Driver string `yaml:"driver" env:"SHARING_OCM_CORE_DRIVER" desc:"Driver to be used for the ocm core. Supported values 'json'."`
|
||||
Drivers OCMCoreDrivers `yaml:"drivers"`
|
||||
}
|
||||
|
||||
type OCMCoreDrivers struct {
|
||||
JSON OCMCoreJSONDriver `yaml:"json"`
|
||||
}
|
||||
|
||||
type OCMCoreJSONDriver struct {
|
||||
File string `yaml:"file" env:"SHARING_OCM_CORE_JSON_FILE" desc:"Path to the JSON file where ocm share data will be stored. If not defined, the root directory derives from $OCIS_BASE_DATA_PATH:/storage."`
|
||||
}
|
||||
|
||||
type OCMShareProvider struct {
|
||||
Driver string `yaml:"driver" env:"SHARING_OCM_SHARE_PROVIDER_DRIVER" desc:"Driver to be used for the ocm share provider. Supported values 'json'."`
|
||||
Drivers OCMShareProviderDrivers `yaml:"drivers"`
|
||||
Insecure bool `yaml:"insecure" env:"SHARING_OCM_SHARE_PROVIDER_INSECURE" desc:"Disable TLS certificate validation for the OCM connections. Do not set this in production environments."`
|
||||
}
|
||||
|
||||
type OCMShareProviderDrivers struct {
|
||||
JSON OCMShareProviderJSONDriver `yaml:"json"`
|
||||
}
|
||||
|
||||
type OCMShareProviderJSONDriver struct {
|
||||
File string `yaml:"file" env:"SHARING_OCM_SHAREPROVIDER_JSON_FILE" desc:"Path to the JSON file where ocm share data will be stored. If not defined, the root directory derives from $OCIS_BASE_DATA_PATH:/storage."`
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package config
|
||||
|
||||
// Debug defines the available debug configuration.
|
||||
type Debug struct {
|
||||
Addr string `yaml:"addr" env:"OCM_DEBUG_ADDR" desc:"Bind address of the debug server, where metrics, health, config and debug endpoints will be exposed."`
|
||||
Token string `yaml:"token" env:"OCM_DEBUG_TOKEN" desc:"Token to secure the metrics endpoint."`
|
||||
Pprof bool `yaml:"pprof" env:"OCM_DEBUG_PPROF" desc:"Enables pprof, which can be used for profiling."`
|
||||
Zpages bool `yaml:"zpages" env:"OCM_DEBUG_ZPAGES" desc:"Enables zpages, which can be used for collecting and viewing in-memory traces."`
|
||||
}
|
||||
@@ -0,0 +1,169 @@
|
||||
package defaults
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/config/defaults"
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/shared"
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/structs"
|
||||
"github.com/owncloud/ocis/v2/services/ocm/pkg/config"
|
||||
)
|
||||
|
||||
// FullDefaultConfig returns the full default config
|
||||
func FullDefaultConfig() *config.Config {
|
||||
cfg := DefaultConfig()
|
||||
EnsureDefaults(cfg)
|
||||
Sanitize(cfg)
|
||||
return cfg
|
||||
}
|
||||
|
||||
// DefaultConfig return the default configuration
|
||||
func DefaultConfig() *config.Config {
|
||||
return &config.Config{
|
||||
Debug: config.Debug{
|
||||
Addr: "127.0.0.1:9281",
|
||||
Token: "",
|
||||
Pprof: false,
|
||||
Zpages: false,
|
||||
},
|
||||
HTTP: config.HTTPConfig{
|
||||
Addr: "127.0.0.1:9280",
|
||||
Namespace: "com.owncloud.web",
|
||||
Protocol: "tcp",
|
||||
Prefix: "",
|
||||
CORS: config.CORS{
|
||||
AllowedOrigins: []string{"*"},
|
||||
AllowedMethods: []string{
|
||||
"OPTIONS",
|
||||
"HEAD",
|
||||
"GET",
|
||||
"PUT",
|
||||
"POST",
|
||||
"DELETE",
|
||||
"MKCOL",
|
||||
"PROPFIND",
|
||||
"PROPPATCH",
|
||||
"MOVE",
|
||||
"COPY",
|
||||
"REPORT",
|
||||
"SEARCH",
|
||||
},
|
||||
AllowedHeaders: []string{
|
||||
"Origin",
|
||||
"Accept",
|
||||
"Content-Type",
|
||||
"Depth",
|
||||
"Authorization",
|
||||
"Ocs-Apirequest",
|
||||
"If-None-Match",
|
||||
"If-Match",
|
||||
"Destination",
|
||||
"Overwrite",
|
||||
"X-Request-Id",
|
||||
"X-Requested-With",
|
||||
"Tus-Resumable",
|
||||
"Tus-Checksum-Algorithm",
|
||||
"Upload-Concat",
|
||||
"Upload-Length",
|
||||
"Upload-Metadata",
|
||||
"Upload-Defer-Length",
|
||||
"Upload-Expires",
|
||||
"Upload-Checksum",
|
||||
"Upload-Offset",
|
||||
"X-HTTP-Method-Override",
|
||||
"Cache-Control",
|
||||
},
|
||||
AllowCredentials: true,
|
||||
},
|
||||
},
|
||||
GRPC: config.GRPCConfig{
|
||||
Addr: "127.0.0.1:9282",
|
||||
Namespace: "com.owncloud.api",
|
||||
},
|
||||
Reva: shared.DefaultRevaConfig(),
|
||||
Service: config.Service{
|
||||
Name: "ocm",
|
||||
},
|
||||
ScienceMesh: config.ScienceMesh{
|
||||
Prefix: "sciencemesh",
|
||||
},
|
||||
OCMD: config.OCMD{
|
||||
Prefix: "ocm",
|
||||
},
|
||||
OCMInviteManager: config.OCMInviteManager{
|
||||
Driver: "json",
|
||||
Drivers: config.OCMInviteManagerDrivers{
|
||||
JSON: config.OCMInviteManagerJSONDriver{
|
||||
File: filepath.Join(defaults.BaseDataPath(), "storage", "ocminvites.json"),
|
||||
},
|
||||
},
|
||||
Insecure: false,
|
||||
},
|
||||
OCMProviderAuthorizerDriver: "json",
|
||||
OCMProviderAuthorizerDrivers: config.OCMProviderAuthorizerDrivers{
|
||||
JSON: config.OCMProviderAuthorizerJSONDriver{
|
||||
Providers: filepath.Join(defaults.BaseDataPath(), "storage", "ocmproviders.json"),
|
||||
},
|
||||
},
|
||||
OCMShareProvider: config.OCMShareProvider{
|
||||
Driver: "json",
|
||||
Drivers: config.OCMShareProviderDrivers{
|
||||
JSON: config.OCMShareProviderJSONDriver{
|
||||
File: filepath.Join(defaults.BaseDataPath(), "storage", "ocmshares.json"),
|
||||
},
|
||||
},
|
||||
Insecure: false,
|
||||
},
|
||||
OCMCore: config.OCMCore{
|
||||
Driver: "json",
|
||||
Drivers: config.OCMCoreDrivers{
|
||||
JSON: config.OCMCoreJSONDriver{
|
||||
File: filepath.Join(defaults.BaseDataPath(), "storage", "ocmshares.json"),
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// EnsureDefaults ensures the config contains default values
|
||||
func EnsureDefaults(cfg *config.Config) {
|
||||
// provide with defaults for shared logging, since we need a valid destination address for "envdecode".
|
||||
if cfg.Log == nil && cfg.Commons != nil && cfg.Commons.Log != nil {
|
||||
cfg.Log = &config.Log{
|
||||
Level: cfg.Commons.Log.Level,
|
||||
Pretty: cfg.Commons.Log.Pretty,
|
||||
Color: cfg.Commons.Log.Color,
|
||||
File: cfg.Commons.Log.File,
|
||||
}
|
||||
} else if cfg.Log == nil {
|
||||
cfg.Log = &config.Log{}
|
||||
}
|
||||
|
||||
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{}
|
||||
}
|
||||
|
||||
if cfg.Reva == nil && cfg.Commons != nil {
|
||||
cfg.Reva = structs.CopyOrZeroValue(cfg.Commons.Reva)
|
||||
}
|
||||
|
||||
if cfg.GRPCClientTLS == nil && cfg.Commons != nil {
|
||||
cfg.GRPCClientTLS = structs.CopyOrZeroValue(cfg.Commons.GRPCClientTLS)
|
||||
}
|
||||
|
||||
if cfg.GRPC.TLS == nil && cfg.Commons != nil {
|
||||
cfg.GRPC.TLS = structs.CopyOrZeroValue(cfg.Commons.GRPCServiceTLS)
|
||||
}
|
||||
}
|
||||
|
||||
// Sanitize sanitizes the config
|
||||
func Sanitize(cfg *config.Config) {
|
||||
// nothing to sanitize here atm
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package config
|
||||
|
||||
// Log defines the available log configuration.
|
||||
type Log struct {
|
||||
Level string `mapstructure:"level" env:"OCIS_LOG_LEVEL;OCM_LOG_LEVEL" desc:"The log level. Valid values are: 'panic', 'fatal', 'error', 'warn', 'info', 'debug', 'trace'."`
|
||||
Pretty bool `mapstructure:"pretty" env:"OCIS_LOG_PRETTY;OCM_LOG_PRETTY" desc:"Activates pretty log output."`
|
||||
Color bool `mapstructure:"color" env:"OCIS_LOG_COLOR;OCM_LOG_COLOR" desc:"Activates colorized log output."`
|
||||
File string `mapstructure:"file" env:"OCIS_LOG_FILE;OCM_LOG_FILE" desc:"The path to the log file. Activates logging to this file if set."`
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
package parser
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
ociscfg "github.com/owncloud/ocis/v2/ocis-pkg/config"
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/structs"
|
||||
"github.com/owncloud/ocis/v2/services/ocm/pkg/config"
|
||||
"github.com/owncloud/ocis/v2/services/ocm/pkg/config/defaults"
|
||||
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/config/envdecode"
|
||||
)
|
||||
|
||||
// ParseConfig loads configuration from known paths.
|
||||
func ParseConfig(cfg *config.Config) error {
|
||||
_, err := ociscfg.BindSourcesToStructs(cfg.Service.Name, cfg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
defaults.EnsureDefaults(cfg)
|
||||
|
||||
// load all env variables relevant to the config in the current context.
|
||||
if err := envdecode.Decode(cfg); err != nil {
|
||||
// no environment variable set for this config is an expected "error"
|
||||
if !errors.Is(err, envdecode.ErrNoTargetFieldsAreSet) {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
defaults.Sanitize(cfg)
|
||||
|
||||
return Validate(cfg)
|
||||
}
|
||||
|
||||
// Validate validates the config
|
||||
func Validate(cfg *config.Config) error {
|
||||
if cfg.GRPCClientTLS == nil && cfg.Commons != nil {
|
||||
cfg.GRPCClientTLS = structs.CopyOrZeroValue(cfg.Commons.GRPCClientTLS)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package config
|
||||
|
||||
// Service defines the available service configuration.
|
||||
type Service struct {
|
||||
Name string `yaml:"-"`
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package config
|
||||
|
||||
import "github.com/owncloud/ocis/v2/ocis-pkg/tracing"
|
||||
|
||||
// Tracing defines the available tracing configuration.
|
||||
type Tracing struct {
|
||||
Enabled bool `yaml:"enabled" env:"OCIS_TRACING_ENABLED;OCM_TRACING_ENABLED" desc:"Activates tracing."`
|
||||
Type string `yaml:"type" env:"OCIS_TRACING_TYPE;OCM_TRACING_TYPE" desc:"The type of tracing. Defaults to '', which is the same as 'jaeger'. Allowed tracing types are 'jaeger' and '' as of now."`
|
||||
Endpoint string `yaml:"endpoint" env:"OCIS_TRACING_ENDPOINT;OCM_TRACING_ENDPOINT" desc:"The endpoint of the tracing agent."`
|
||||
Collector string `yaml:"collector" env:"OCIS_TRACING_COLLECTOR;OCM_TRACING_COLLECTOR" desc:"The HTTP endpoint for sending spans directly to a collector, i.e. http://jaeger-collector:14268/api/traces. Only used if the tracing endpoint is unset."`
|
||||
}
|
||||
|
||||
// Convert Tracing to the tracing package's Config struct.
|
||||
func (t Tracing) Convert() tracing.Config {
|
||||
return tracing.Config{
|
||||
Enabled: t.Enabled,
|
||||
Type: t.Type,
|
||||
Endpoint: t.Endpoint,
|
||||
Collector: t.Collector,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package logging
|
||||
|
||||
import (
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/log"
|
||||
"github.com/owncloud/ocis/v2/services/ocm/pkg/config"
|
||||
)
|
||||
|
||||
// LoggerFromConfig initializes a service-specific logger instance.
|
||||
func Configure(name string, cfg *config.Log) log.Logger {
|
||||
return log.NewLogger(
|
||||
log.Name(name),
|
||||
log.Level(cfg.Level),
|
||||
log.Pretty(cfg.Pretty),
|
||||
log.Color(cfg.Color),
|
||||
log.File(cfg.File),
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
package metrics
|
||||
|
||||
import "github.com/prometheus/client_golang/prometheus"
|
||||
|
||||
var (
|
||||
// Namespace defines the namespace for the defines metrics.
|
||||
Namespace = "ocis"
|
||||
|
||||
// Subsystem defines the subsystem for the defines metrics.
|
||||
Subsystem = "ocm"
|
||||
)
|
||||
|
||||
// Metrics defines the available metrics of this service.
|
||||
type Metrics struct {
|
||||
BuildInfo *prometheus.GaugeVec
|
||||
}
|
||||
|
||||
// New initializes the available metrics.
|
||||
func New() *Metrics {
|
||||
m := &Metrics{
|
||||
BuildInfo: prometheus.NewGaugeVec(prometheus.GaugeOpts{
|
||||
Namespace: Namespace,
|
||||
Subsystem: Subsystem,
|
||||
Name: "build_info",
|
||||
Help: "Build information",
|
||||
}, []string{"version"}),
|
||||
}
|
||||
|
||||
_ = prometheus.Register(
|
||||
m.BuildInfo,
|
||||
)
|
||||
|
||||
// TODO: implement metrics
|
||||
return m
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
package revaconfig
|
||||
|
||||
import (
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/log"
|
||||
"github.com/owncloud/ocis/v2/services/ocm/pkg/config"
|
||||
)
|
||||
|
||||
// OCMConfigFromStruct will adapt an oCIS config struct into a reva mapstructure to start a reva service.
|
||||
func OCMConfigFromStruct(cfg *config.Config, logger log.Logger) map[string]interface{} {
|
||||
return map[string]interface{}{
|
||||
"shared": map[string]interface{}{
|
||||
"gatewaysvc": cfg.Reva.Address, // Todo or address?
|
||||
"grpc_client_options": cfg.Reva.GetGRPCClientConfig(),
|
||||
},
|
||||
"http": map[string]interface{}{
|
||||
"network": cfg.HTTP.Protocol,
|
||||
"address": cfg.HTTP.Addr,
|
||||
"middlewares": map[string]interface{}{
|
||||
"cors": map[string]interface{}{
|
||||
"allowed_origins": cfg.HTTP.CORS.AllowedOrigins,
|
||||
"allowed_methods": cfg.HTTP.CORS.AllowedMethods,
|
||||
"allowed_headers": cfg.HTTP.CORS.AllowedHeaders,
|
||||
"allow_credentials": cfg.HTTP.CORS.AllowCredentials,
|
||||
// currently unused
|
||||
//"options_passthrough": ,
|
||||
//"debug": ,
|
||||
//"max_age": ,
|
||||
//"priority": ,
|
||||
//"exposed_headers": ,
|
||||
},
|
||||
"auth": map[string]interface{}{
|
||||
"credentials_by_user_agent": cfg.Middleware.Auth.CredentialsByUserAgent,
|
||||
},
|
||||
"prometheus": map[string]interface{}{
|
||||
"namespace": "ocis",
|
||||
"subsystem": "ocm",
|
||||
},
|
||||
"requestid": map[string]interface{}{},
|
||||
},
|
||||
// TODO build services dynamically
|
||||
"services": map[string]interface{}{
|
||||
"sciencemesh": map[string]interface{}{
|
||||
"prefix": cfg.ScienceMesh.Prefix,
|
||||
"smtp_credentials": map[string]string{},
|
||||
"gatewaysvc": cfg.Reva.Address,
|
||||
"mesh_directory_url": cfg.Commons.OcisURL,
|
||||
"provider_domain": cfg.Commons.OcisURL,
|
||||
},
|
||||
"ocmd": map[string]interface{}{
|
||||
"prefix": cfg.OCMD.Prefix,
|
||||
"gatewaysvc": cfg.Reva.Address,
|
||||
"expose_recipient_display_name": cfg.OCMD.ExposeRecipientDisplayName,
|
||||
},
|
||||
},
|
||||
},
|
||||
"grpc": map[string]interface{}{
|
||||
"network": cfg.GRPC.Protocol,
|
||||
"address": cfg.GRPC.Addr,
|
||||
"tls_settings": map[string]interface{}{
|
||||
"enabled": cfg.GRPC.TLS.Enabled,
|
||||
"certificate": cfg.GRPC.TLS.Cert,
|
||||
"key": cfg.GRPC.TLS.Key,
|
||||
},
|
||||
"services": map[string]interface{}{
|
||||
"ocminvitemanager": map[string]interface{}{
|
||||
"driver": cfg.OCMInviteManager.Driver,
|
||||
"drivers": map[string]interface{}{
|
||||
"json": map[string]interface{}{
|
||||
"file": cfg.OCMInviteManager.Drivers.JSON.File,
|
||||
},
|
||||
},
|
||||
"provider_domain": cfg.Commons.OcisURL,
|
||||
"ocm_insecure": cfg.OCMInviteManager.Insecure,
|
||||
},
|
||||
"ocmproviderauthorizer": map[string]interface{}{
|
||||
"driver": cfg.OCMProviderAuthorizerDriver,
|
||||
"drivers": map[string]interface{}{
|
||||
"json": map[string]interface{}{
|
||||
"providers": cfg.OCMProviderAuthorizerDrivers.JSON.Providers,
|
||||
"verify_request_hostname": cfg.OCMProviderAuthorizerDrivers.JSON.VerifyRequestHostname,
|
||||
},
|
||||
},
|
||||
},
|
||||
"ocmshareprovider": map[string]interface{}{
|
||||
"driver": cfg.OCMShareProvider.Driver,
|
||||
"drivers": map[string]interface{}{
|
||||
"json": map[string]interface{}{
|
||||
"file": cfg.OCMShareProvider.Drivers.JSON.File,
|
||||
},
|
||||
},
|
||||
"gatewaysvc": cfg.Reva.Address,
|
||||
"provider_domain": cfg.Commons.OcisURL,
|
||||
"webdav_endpoint": cfg.Commons.OcisURL,
|
||||
"client_insecure": cfg.OCMShareProvider.Insecure,
|
||||
},
|
||||
"ocmcore": map[string]interface{}{
|
||||
"driver": cfg.OCMCore.Driver,
|
||||
"drivers": map[string]interface{}{
|
||||
"json": map[string]interface{}{
|
||||
"file": cfg.OCMCore.Drivers.JSON.File,
|
||||
},
|
||||
},
|
||||
},
|
||||
"authprovider": map[string]interface{}{
|
||||
"auth_manager": "ocmshares",
|
||||
"auth_managers": map[string]interface{}{
|
||||
"ocmshares": map[string]interface{}{
|
||||
"gatewaysvc": cfg.Reva.Address,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
package debug
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/log"
|
||||
"github.com/owncloud/ocis/v2/services/ocm/pkg/config"
|
||||
)
|
||||
|
||||
// Option defines a single option function.
|
||||
type Option func(o *Options)
|
||||
|
||||
// Options defines the available options for this package.
|
||||
type Options struct {
|
||||
Logger log.Logger
|
||||
Context context.Context
|
||||
Config *config.Config
|
||||
}
|
||||
|
||||
// newOptions initializes the available default options.
|
||||
func newOptions(opts ...Option) Options {
|
||||
opt := Options{}
|
||||
|
||||
for _, o := range opts {
|
||||
o(&opt)
|
||||
}
|
||||
|
||||
return opt
|
||||
}
|
||||
|
||||
// Logger provides a function to set the logger option.
|
||||
func Logger(val log.Logger) Option {
|
||||
return func(o *Options) {
|
||||
o.Logger = val
|
||||
}
|
||||
}
|
||||
|
||||
// Context provides a function to set the context option.
|
||||
func Context(val context.Context) Option {
|
||||
return func(o *Options) {
|
||||
o.Context = val
|
||||
}
|
||||
}
|
||||
|
||||
// Config provides a function to set the config option.
|
||||
func Config(val *config.Config) Option {
|
||||
return func(o *Options) {
|
||||
o.Config = val
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
package debug
|
||||
|
||||
import (
|
||||
"io"
|
||||
"net/http"
|
||||
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/service/debug"
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/version"
|
||||
"github.com/owncloud/ocis/v2/services/ocm/pkg/config"
|
||||
)
|
||||
|
||||
// Server initializes the debug service and server.
|
||||
func Server(opts ...Option) (*http.Server, error) {
|
||||
options := newOptions(opts...)
|
||||
|
||||
return debug.NewService(
|
||||
debug.Logger(options.Logger),
|
||||
debug.Name(options.Config.Service.Name),
|
||||
debug.Version(version.GetString()),
|
||||
debug.Address(options.Config.Debug.Addr),
|
||||
debug.Token(options.Config.Debug.Token),
|
||||
debug.Pprof(options.Config.Debug.Pprof),
|
||||
debug.Zpages(options.Config.Debug.Zpages),
|
||||
debug.Health(health(options.Config)),
|
||||
debug.Ready(ready(options.Config)),
|
||||
//debug.CorsAllowedOrigins(options.Config.HTTP.CORS.AllowedOrigins),
|
||||
//debug.CorsAllowedMethods(options.Config.HTTP.CORS.AllowedMethods),
|
||||
//debug.CorsAllowedHeaders(options.Config.HTTP.CORS.AllowedHeaders),
|
||||
//debug.CorsAllowCredentials(options.Config.HTTP.CORS.AllowCredentials),
|
||||
), nil
|
||||
}
|
||||
|
||||
// health implements the health check.
|
||||
func health(cfg *config.Config) func(http.ResponseWriter, *http.Request) {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
w.Header().Set("Content-Type", "text/plain")
|
||||
w.WriteHeader(http.StatusOK)
|
||||
|
||||
// TODO: check if services are up and running
|
||||
|
||||
_, err := io.WriteString(w, http.StatusText(http.StatusOK))
|
||||
// io.WriteString should not fail but if it does we want to know.
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ready implements the ready check.
|
||||
func ready(cfg *config.Config) func(http.ResponseWriter, *http.Request) {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
w.Header().Set("Content-Type", "text/plain")
|
||||
w.WriteHeader(http.StatusOK)
|
||||
|
||||
// TODO: check if services are up and running
|
||||
|
||||
_, err := io.WriteString(w, http.StatusText(http.StatusOK))
|
||||
// io.WriteString should not fail but if it does we want to know.
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -143,6 +143,14 @@ func DefaultPolicies() []config.Policy {
|
||||
Service: "com.owncloud.web.frontend",
|
||||
Unprotected: true,
|
||||
},
|
||||
{
|
||||
Endpoint: "/sciencemesh/",
|
||||
Service: "com.owncloud.web.ocm",
|
||||
},
|
||||
{
|
||||
Endpoint: "/ocm/",
|
||||
Service: "com.owncloud.web.ocm",
|
||||
},
|
||||
{
|
||||
Endpoint: "/ocs/",
|
||||
Service: "com.owncloud.web.frontend",
|
||||
|
||||
@@ -25,6 +25,8 @@ var (
|
||||
|
||||
_publicPaths = [...]string{
|
||||
"/dav/public-files/",
|
||||
"/dav/ocm/",
|
||||
"/ocm/",
|
||||
"/remote.php/dav/public-files/",
|
||||
"/ocs/v1.php/apps/files_sharing/api/v1/tokeninfo/unprotected",
|
||||
"/ocs/v2.php/apps/files_sharing/api/v1/tokeninfo/unprotected",
|
||||
|
||||
@@ -105,7 +105,6 @@ type UserSharingJSONCS3Driver struct {
|
||||
SystemUserAPIKey string `yaml:"system_user_api_key" env:"OCIS_SYSTEM_USER_API_KEY;SHARING_USER_JSONCS3_SYSTEM_USER_API_KEY" desc:"API key for the STORAGE-SYSTEM system user."`
|
||||
CacheTTL int `yaml:"cache_ttl" env:"SHARING_USER_JSONCS3_CACHE_TTL" desc:"TTL for the internal caches in seconds."`
|
||||
}
|
||||
|
||||
type PublicSharingDrivers struct {
|
||||
JSON PublicSharingJSONDriver `yaml:"json"`
|
||||
JSONCS3 PublicSharingJSONCS3Driver `yaml:"jsoncs3"`
|
||||
|
||||
Generated
Vendored
+77
-77
@@ -147,13 +147,10 @@ type Share struct {
|
||||
Mtime *v1beta12.Timestamp `protobuf:"bytes,8,opt,name=mtime,proto3" json:"mtime,omitempty"`
|
||||
// Optional.
|
||||
// The expiration time of the share.
|
||||
Expiration *v1beta12.Timestamp `protobuf:"bytes,9,opt,name=expiration,proto3" json:"expiration,omitempty"`
|
||||
// Optional.
|
||||
// Hide share, default false
|
||||
Hide bool `protobuf:"varint,10,opt,name=hide,proto3" json:"hide,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
Expiration *v1beta12.Timestamp `protobuf:"bytes,9,opt,name=expiration,proto3" json:"expiration,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Share) Reset() { *m = Share{} }
|
||||
@@ -244,13 +241,6 @@ func (m *Share) GetExpiration() *v1beta12.Timestamp {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Share) GetHide() bool {
|
||||
if m != nil {
|
||||
return m.Hide
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// The permissions for a share.
|
||||
type SharePermissions struct {
|
||||
Permissions *v1beta1.ResourcePermissions `protobuf:"bytes,1,opt,name=permissions,proto3" json:"permissions,omitempty"`
|
||||
@@ -304,10 +294,13 @@ type ReceivedShare struct {
|
||||
State ShareState `protobuf:"varint,2,opt,name=state,proto3,enum=cs3.sharing.collaboration.v1beta1.ShareState" json:"state,omitempty"`
|
||||
// REQUIRED.
|
||||
// The mount point of the share.
|
||||
MountPoint *v1beta1.Reference `protobuf:"bytes,3,opt,name=mount_point,json=mountPoint,proto3" json:"mount_point,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
MountPoint *v1beta1.Reference `protobuf:"bytes,3,opt,name=mount_point,json=mountPoint,proto3" json:"mount_point,omitempty"`
|
||||
// Optional.
|
||||
// Hide share, default false
|
||||
Hidden bool `protobuf:"varint,4,opt,name=hidden,proto3" json:"hidden,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *ReceivedShare) Reset() { *m = ReceivedShare{} }
|
||||
@@ -356,6 +349,13 @@ func (m *ReceivedShare) GetMountPoint() *v1beta1.Reference {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *ReceivedShare) GetHidden() bool {
|
||||
if m != nil {
|
||||
return m.Hidden
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// Uniquely identifies a share in the share provider.
|
||||
// A share MUST be uniquely identify by four (4) elements:
|
||||
// 1) The share provider id
|
||||
@@ -788,64 +788,64 @@ func init() {
|
||||
}
|
||||
|
||||
var fileDescriptor_cb95b447da150104 = []byte{
|
||||
// 933 bytes of a gzipped FileDescriptorProto
|
||||
// 934 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x96, 0x4d, 0x6f, 0xe3, 0x44,
|
||||
0x18, 0xc7, 0xe3, 0x24, 0x4e, 0xd2, 0x27, 0xbb, 0x95, 0x77, 0x28, 0xc2, 0xda, 0x05, 0x69, 0x6b,
|
||||
0x69, 0xa1, 0xbb, 0x80, 0xa3, 0x34, 0x07, 0x04, 0x2c, 0xac, 0x12, 0xc7, 0x34, 0xa6, 0x55, 0x1a,
|
||||
0x8d, 0xd3, 0xe5, 0x45, 0x95, 0x22, 0xd7, 0x1e, 0x52, 0x8b, 0xc6, 0x36, 0x63, 0xb7, 0x90, 0x33,
|
||||
0x1f, 0x82, 0x13, 0x17, 0x8e, 0xdc, 0xf8, 0x1a, 0x5c, 0xb8, 0x71, 0xe4, 0xc0, 0x27, 0x41, 0xf3,
|
||||
0xd8, 0xce, 0x9b, 0xb4, 0x5b, 0xb7, 0xe5, 0xe6, 0x99, 0xf9, 0xff, 0x9e, 0x79, 0xe6, 0x79, 0x93,
|
||||
0xa1, 0xed, 0xc6, 0x9d, 0x56, 0x7c, 0xee, 0x70, 0x3f, 0x98, 0xb6, 0xdc, 0xf0, 0xe2, 0xc2, 0x39,
|
||||
0x0b, 0xb9, 0x93, 0xf8, 0x61, 0xd0, 0xba, 0x6a, 0x9f, 0xb1, 0xc4, 0x69, 0xb7, 0x38, 0x8b, 0xc3,
|
||||
0x4b, 0xee, 0xb2, 0x58, 0x8f, 0x78, 0x98, 0x84, 0x64, 0xd7, 0x8d, 0x3b, 0x7a, 0x86, 0xe8, 0x6b,
|
||||
0x88, 0x9e, 0x21, 0x0f, 0x9f, 0x0a, 0xab, 0xbe, 0xc7, 0x82, 0xc4, 0x4f, 0xe6, 0xad, 0xcb, 0x98,
|
||||
0xf1, 0x57, 0x59, 0x7b, 0xf8, 0x01, 0x3a, 0x90, 0x84, 0xdc, 0x99, 0xb2, 0x56, 0xc4, 0xc3, 0x2b,
|
||||
0xdf, 0x7b, 0x8d, 0xfa, 0x1d, 0xa1, 0x4e, 0xe6, 0x11, 0x8b, 0x17, 0x12, 0x5c, 0xa5, 0xc7, 0xda,
|
||||
0xdf, 0x55, 0x90, 0xed, 0x73, 0x87, 0x33, 0xf2, 0x09, 0x94, 0x7d, 0x4f, 0x95, 0x1e, 0x4b, 0x7b,
|
||||
0xcd, 0xfd, 0x67, 0xfa, 0xb5, 0x1e, 0xeb, 0x48, 0x59, 0x1e, 0x2d, 0xfb, 0x1e, 0xb1, 0xa0, 0x99,
|
||||
0xdf, 0x3b, 0xf1, 0x3d, 0xb5, 0x8c, 0x46, 0xf6, 0x52, 0x23, 0xa9, 0xa3, 0x7a, 0xee, 0xe8, 0x82,
|
||||
0xa7, 0x19, 0x60, 0x79, 0x14, 0xf8, 0xe2, 0x9b, 0x9c, 0x40, 0x33, 0x62, 0x7c, 0xe6, 0xc7, 0xb1,
|
||||
0x1f, 0x06, 0xb1, 0x5a, 0x41, 0x53, 0x9d, 0xa2, 0xfe, 0x8c, 0x96, 0x28, 0x5d, 0xb5, 0x43, 0x5e,
|
||||
0x40, 0x7d, 0xca, 0x9d, 0x20, 0x61, 0x4c, 0xad, 0xa2, 0xc9, 0x27, 0xaf, 0xf7, 0xee, 0x20, 0x15,
|
||||
0xd3, 0x9c, 0x22, 0x1f, 0x81, 0x1c, 0xfe, 0x18, 0x30, 0xae, 0xca, 0x88, 0xef, 0x22, 0x9e, 0x27,
|
||||
0x4c, 0x17, 0x09, 0x5b, 0xb0, 0x27, 0x31, 0xe3, 0x96, 0x47, 0x53, 0x3d, 0xf9, 0x14, 0xea, 0x2e,
|
||||
0x67, 0x4e, 0x12, 0x72, 0xb5, 0x56, 0x14, 0xcd, 0x09, 0xb2, 0x0f, 0xb2, 0x9b, 0xf8, 0x33, 0xa6,
|
||||
0xd6, 0x11, 0x7d, 0x1b, 0xd1, 0x34, 0x7f, 0x39, 0x32, 0xf6, 0x67, 0x2c, 0x4e, 0x9c, 0x59, 0x44,
|
||||
0x53, 0xa9, 0x60, 0x66, 0xc8, 0x34, 0x8a, 0x30, 0x28, 0x25, 0xcf, 0x01, 0xd8, 0x4f, 0x91, 0x9f,
|
||||
0x86, 0x54, 0xdd, 0x2a, 0x00, 0xae, 0xe8, 0x09, 0x81, 0xea, 0xb9, 0xef, 0x31, 0x15, 0x1e, 0x4b,
|
||||
0x7b, 0x0d, 0x8a, 0xdf, 0xda, 0x14, 0x94, 0xcd, 0x8c, 0x10, 0x7b, 0x3d, 0xb7, 0x69, 0xad, 0xb5,
|
||||
0x8b, 0x95, 0xc9, 0xab, 0x32, 0xab, 0xfd, 0x23, 0xc1, 0x7d, 0xca, 0x5c, 0xe6, 0x5f, 0x31, 0x2f,
|
||||
0xad, 0xe4, 0xcf, 0x41, 0x16, 0xa5, 0xc2, 0xb2, 0x0b, 0xf6, 0x8a, 0x16, 0x0f, 0x4d, 0x31, 0x62,
|
||||
0x80, 0x1c, 0x27, 0x4e, 0xc2, 0xb0, 0x8e, 0xb7, 0xf7, 0x3f, 0x2c, 0xca, 0xdb, 0x02, 0xa2, 0x29,
|
||||
0x4b, 0x06, 0xd0, 0x9c, 0x85, 0x97, 0x41, 0x32, 0x89, 0x42, 0x3f, 0x48, 0xb2, 0x3a, 0x7e, 0xef,
|
||||
0xba, 0xb7, 0x7e, 0xc7, 0x38, 0x0b, 0x5c, 0x46, 0x01, 0xd9, 0x91, 0x40, 0xb5, 0xbf, 0x24, 0x68,
|
||||
0xa0, 0xfd, 0x43, 0x36, 0x5f, 0x96, 0x61, 0xf9, 0x86, 0x65, 0xb8, 0xd1, 0xa2, 0x95, 0x3b, 0xb4,
|
||||
0xe8, 0x5d, 0x7b, 0x49, 0x7b, 0x17, 0xea, 0xd9, 0xf4, 0x20, 0x8f, 0x60, 0x2b, 0x8c, 0x9c, 0x1f,
|
||||
0x2e, 0x17, 0x73, 0x63, 0x8b, 0x36, 0xd2, 0x0d, 0xcb, 0xd3, 0x7e, 0x91, 0x60, 0x3b, 0xcd, 0x4c,
|
||||
0x1e, 0x18, 0xf2, 0xfc, 0x76, 0x53, 0x6a, 0x50, 0xc2, 0x39, 0xf5, 0x02, 0x2a, 0xdf, 0xb3, 0x79,
|
||||
0x16, 0xbb, 0xf7, 0x8b, 0xe2, 0x87, 0x6c, 0x3e, 0x28, 0x51, 0x41, 0xf6, 0x6a, 0x50, 0x8d, 0x23,
|
||||
0xe6, 0x6a, 0xff, 0x4a, 0x00, 0x78, 0x86, 0x6f, 0x5b, 0x8d, 0x88, 0x74, 0xab, 0xe9, 0xb2, 0x31,
|
||||
0xf5, 0xca, 0xff, 0xd3, 0xd4, 0x5b, 0x6f, 0xeb, 0xca, 0xcd, 0xda, 0x5a, 0xfb, 0x59, 0x86, 0xda,
|
||||
0x17, 0xfe, 0x45, 0xc2, 0x38, 0xe9, 0x41, 0x55, 0x10, 0x59, 0x47, 0xe8, 0x05, 0x1c, 0x4b, 0x41,
|
||||
0x7d, 0x3c, 0x8f, 0x18, 0x45, 0x96, 0x1c, 0xde, 0xa9, 0x02, 0x07, 0xa5, 0xb5, 0x1a, 0xfc, 0x38,
|
||||
0xef, 0x83, 0x6a, 0xc1, 0x3e, 0x18, 0x94, 0xf2, 0x4e, 0xf8, 0x6c, 0x39, 0x90, 0xe5, 0xe2, 0xf0,
|
||||
0x62, 0x24, 0x0f, 0xe1, 0x5e, 0x96, 0xb5, 0x09, 0x86, 0xa4, 0x86, 0x21, 0x79, 0x5a, 0x28, 0xe1,
|
||||
0x22, 0x1a, 0x83, 0x12, 0x6d, 0x4e, 0x97, 0x4b, 0xf2, 0x08, 0x1a, 0x71, 0xe4, 0xa4, 0x31, 0x11,
|
||||
0x53, 0x7e, 0x4b, 0x5c, 0x86, 0x3b, 0x96, 0x47, 0xcc, 0x7c, 0x14, 0x35, 0x6e, 0x31, 0x8a, 0xc4,
|
||||
0x93, 0x91, 0xd6, 0xfe, 0x90, 0xa0, 0x8a, 0x97, 0x29, 0x70, 0x6f, 0xfc, 0xcd, 0xc8, 0x9c, 0x58,
|
||||
0xc3, 0x97, 0xdd, 0x23, 0xab, 0xaf, 0x94, 0x48, 0x13, 0xea, 0xb8, 0x33, 0x3c, 0x56, 0x24, 0xb2,
|
||||
0x03, 0x0a, 0x2e, 0xa8, 0x69, 0x1f, 0x9f, 0x50, 0xc3, 0x9c, 0x58, 0x7d, 0xa5, 0x4c, 0xb6, 0x01,
|
||||
0x70, 0xf7, 0xf8, 0xab, 0xa1, 0x49, 0x95, 0xca, 0xc2, 0x88, 0x41, 0xcd, 0xee, 0xf8, 0x98, 0x2a,
|
||||
0x55, 0xf2, 0x26, 0x3c, 0xc0, 0x9d, 0x03, 0xda, 0x1d, 0x8e, 0x4d, 0x73, 0x22, 0x16, 0x8a, 0x4c,
|
||||
0x54, 0xd8, 0xc1, 0x6d, 0xf3, 0x6b, 0xe3, 0xe8, 0xa4, 0x6f, 0x4e, 0xfa, 0xe6, 0xd0, 0xea, 0x1e,
|
||||
0xd9, 0x4a, 0x8d, 0x3c, 0x80, 0xfb, 0x78, 0x62, 0x8f, 0xba, 0xe9, 0x2d, 0xf5, 0xc5, 0x2d, 0xf6,
|
||||
0xb8, 0x3b, 0x36, 0x95, 0x86, 0x68, 0xb5, 0x84, 0xf1, 0xd9, 0x33, 0x9e, 0x75, 0x1a, 0x3e, 0x89,
|
||||
0xbc, 0x05, 0x6f, 0xd8, 0x83, 0x2e, 0xcd, 0x64, 0x2b, 0xef, 0xd8, 0x38, 0x18, 0x99, 0xc3, 0xbe,
|
||||
0x35, 0x3c, 0x50, 0x24, 0xe1, 0xc4, 0xea, 0x41, 0xd7, 0x30, 0xcc, 0xd1, 0xd8, 0x14, 0xef, 0xda,
|
||||
0x38, 0xa1, 0xe6, 0x97, 0xa6, 0x21, 0x4e, 0x2a, 0xbd, 0x5f, 0x25, 0x78, 0xe2, 0x86, 0xb3, 0xeb,
|
||||
0xa3, 0xdd, 0xdb, 0xce, 0x2b, 0x34, 0x1e, 0x89, 0xff, 0xa9, 0x91, 0xf4, 0xed, 0xce, 0x9a, 0x30,
|
||||
0xd3, 0xfd, 0x56, 0xae, 0x18, 0xb6, 0xf1, 0x7b, 0x79, 0xd7, 0x88, 0x3b, 0x98, 0x21, 0x61, 0xd1,
|
||||
0x58, 0xb3, 0xf8, 0xb2, 0xdd, 0x13, 0xca, 0x3f, 0x51, 0x73, 0x9a, 0x69, 0x4e, 0xd7, 0x34, 0xa7,
|
||||
0x99, 0xe6, 0xac, 0x86, 0x3f, 0x6f, 0x9d, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0xf9, 0xc4, 0x6e,
|
||||
0x2c, 0x8c, 0x0a, 0x00, 0x00,
|
||||
0x18, 0xc7, 0xe3, 0x24, 0x4e, 0xd2, 0x27, 0xbb, 0x95, 0x77, 0x58, 0xc0, 0xda, 0x05, 0x89, 0x46,
|
||||
0x5a, 0xe8, 0x2e, 0xe0, 0x28, 0xcd, 0x01, 0x01, 0x0b, 0xab, 0xc4, 0x31, 0x8d, 0x69, 0x95, 0x46,
|
||||
0xe3, 0x74, 0x79, 0x51, 0xa5, 0xc8, 0xb5, 0x87, 0xd4, 0xa2, 0xb1, 0xcd, 0xd8, 0x2d, 0xe4, 0xcc,
|
||||
0x87, 0xe0, 0xc4, 0x85, 0x23, 0x37, 0xbe, 0x02, 0x47, 0x2e, 0x7c, 0x07, 0x3e, 0x04, 0x67, 0x34,
|
||||
0xcf, 0xd8, 0x69, 0x12, 0x69, 0xb7, 0xde, 0x96, 0x9b, 0x67, 0xe6, 0xff, 0x7b, 0xe6, 0x99, 0xe7,
|
||||
0x4d, 0x86, 0x8e, 0x97, 0x74, 0xdb, 0xc9, 0x99, 0xcb, 0x83, 0x70, 0xd6, 0xf6, 0xa2, 0xf3, 0x73,
|
||||
0xf7, 0x34, 0xe2, 0x6e, 0x1a, 0x44, 0x61, 0xfb, 0xb2, 0x73, 0xca, 0x52, 0xb7, 0xd3, 0xe6, 0x2c,
|
||||
0x89, 0x2e, 0xb8, 0xc7, 0x12, 0x23, 0xe6, 0x51, 0x1a, 0x91, 0x1d, 0x2f, 0xe9, 0x1a, 0x19, 0x62,
|
||||
0xac, 0x21, 0x46, 0x86, 0x3c, 0x78, 0x2c, 0xac, 0x06, 0x3e, 0x0b, 0xd3, 0x20, 0x5d, 0xb4, 0x2f,
|
||||
0x12, 0xc6, 0x5f, 0x64, 0xed, 0xc1, 0x07, 0xe8, 0x40, 0x1a, 0x71, 0x77, 0xc6, 0xda, 0x31, 0x8f,
|
||||
0x2e, 0x03, 0xff, 0x25, 0xea, 0xb7, 0x85, 0x3a, 0x5d, 0xc4, 0x2c, 0x59, 0x4a, 0x70, 0x25, 0x8f,
|
||||
0x5b, 0x7f, 0x56, 0x41, 0x75, 0xce, 0x5c, 0xce, 0xc8, 0x27, 0x50, 0x0e, 0x7c, 0x5d, 0x79, 0x47,
|
||||
0xd9, 0x6d, 0xee, 0x3d, 0x31, 0xae, 0xf5, 0xd8, 0x40, 0xca, 0xf6, 0x69, 0x39, 0xf0, 0x89, 0x0d,
|
||||
0xcd, 0xfc, 0xde, 0x69, 0xe0, 0xeb, 0x65, 0x34, 0xb2, 0x2b, 0x8d, 0x48, 0x47, 0x8d, 0xdc, 0xd1,
|
||||
0x25, 0x4f, 0x33, 0xc0, 0xf6, 0x29, 0xf0, 0xe5, 0x37, 0x39, 0x86, 0x66, 0xcc, 0xf8, 0x3c, 0x48,
|
||||
0x92, 0x20, 0x0a, 0x13, 0xbd, 0x82, 0xa6, 0xba, 0x45, 0xfd, 0x19, 0x5f, 0xa1, 0x74, 0xd5, 0x0e,
|
||||
0x79, 0x06, 0xf5, 0x19, 0x77, 0xc3, 0x94, 0x31, 0xbd, 0x8a, 0x26, 0x1f, 0xbd, 0xdc, 0xbb, 0x7d,
|
||||
0x29, 0xa6, 0x39, 0x45, 0x3e, 0x02, 0x35, 0xfa, 0x31, 0x64, 0x5c, 0x57, 0x11, 0xdf, 0x41, 0x3c,
|
||||
0x4f, 0x98, 0x21, 0x12, 0xb6, 0x64, 0x8f, 0x13, 0xc6, 0x6d, 0x9f, 0x4a, 0x3d, 0xf9, 0x14, 0xea,
|
||||
0x1e, 0x67, 0x6e, 0x1a, 0x71, 0xbd, 0x56, 0x14, 0xcd, 0x09, 0xb2, 0x07, 0xaa, 0x97, 0x06, 0x73,
|
||||
0xa6, 0xd7, 0x11, 0x7d, 0x0b, 0x51, 0x99, 0xbf, 0x1c, 0x99, 0x04, 0x73, 0x96, 0xa4, 0xee, 0x3c,
|
||||
0xa6, 0x52, 0x2a, 0x98, 0x39, 0x32, 0x8d, 0x22, 0x0c, 0x4a, 0xc9, 0x53, 0x00, 0xf6, 0x53, 0x1c,
|
||||
0xc8, 0x90, 0xea, 0x5b, 0x05, 0xc0, 0x15, 0x7d, 0x6b, 0x06, 0xda, 0x66, 0xf4, 0x89, 0xb3, 0x9e,
|
||||
0x47, 0x59, 0x57, 0x9d, 0x62, 0x25, 0xf1, 0xa2, 0x2c, 0xb6, 0xfe, 0x55, 0xe0, 0x2e, 0x65, 0x1e,
|
||||
0x0b, 0x2e, 0x99, 0x2f, 0xab, 0xf6, 0x73, 0x50, 0x45, 0x59, 0xb0, 0xec, 0x82, 0xdd, 0xa2, 0x85,
|
||||
0x42, 0x25, 0x46, 0x4c, 0x50, 0x93, 0xd4, 0x4d, 0x19, 0xd6, 0xec, 0xf6, 0xde, 0x87, 0x45, 0x79,
|
||||
0x47, 0x40, 0x54, 0xb2, 0x64, 0x08, 0xcd, 0x79, 0x74, 0x11, 0xa6, 0xd3, 0x38, 0x0a, 0xc2, 0x34,
|
||||
0xab, 0xd9, 0xf7, 0xae, 0x7b, 0xeb, 0x77, 0x8c, 0xb3, 0xd0, 0x63, 0x14, 0x90, 0x1d, 0x0b, 0x94,
|
||||
0xbc, 0x01, 0xb5, 0xb3, 0xc0, 0xf7, 0x59, 0x88, 0x55, 0xda, 0xa0, 0xd9, 0xaa, 0xf5, 0xb7, 0x02,
|
||||
0x0d, 0xbc, 0xf7, 0x80, 0x2d, 0xae, 0x4a, 0xb1, 0xfc, 0x8a, 0xa5, 0xb8, 0xd1, 0xa6, 0x95, 0x5b,
|
||||
0xb4, 0xe9, 0x6d, 0xfb, 0xa9, 0xf5, 0x2e, 0xd4, 0xb3, 0x09, 0x42, 0x1e, 0xc2, 0x56, 0x14, 0xbb,
|
||||
0x3f, 0x5c, 0x2c, 0x67, 0xc7, 0x16, 0x6d, 0xc8, 0x0d, 0xdb, 0x6f, 0xfd, 0xa2, 0xc0, 0xb6, 0xcc,
|
||||
0x58, 0x1e, 0x30, 0xf2, 0xf4, 0x66, 0x93, 0x6a, 0x58, 0xc2, 0x59, 0xf5, 0x0c, 0x2a, 0xdf, 0xb3,
|
||||
0x45, 0x16, 0xbb, 0xf7, 0x8b, 0xe2, 0x07, 0x6c, 0x31, 0x2c, 0x51, 0x41, 0xf6, 0x6b, 0x50, 0x4d,
|
||||
0x62, 0xe6, 0xb5, 0xfe, 0x51, 0x00, 0xf0, 0x0c, 0xdf, 0xb6, 0x1a, 0x11, 0xe5, 0x46, 0x13, 0x66,
|
||||
0x63, 0xf2, 0x95, 0xff, 0xa7, 0xc9, 0xb7, 0xde, 0xda, 0x95, 0x57, 0x6c, 0xed, 0x9f, 0x55, 0xa8,
|
||||
0x7d, 0x11, 0x9c, 0xa7, 0x8c, 0x93, 0x3e, 0x54, 0x05, 0x91, 0x75, 0x8a, 0x51, 0xc0, 0x31, 0x09,
|
||||
0x1a, 0x93, 0x45, 0xcc, 0x28, 0xb2, 0xe4, 0xe0, 0x56, 0x15, 0x38, 0x2c, 0xad, 0xd5, 0xe0, 0xc7,
|
||||
0x79, 0x1f, 0x54, 0x0b, 0xf6, 0xc1, 0xb0, 0x94, 0x77, 0xc2, 0x67, 0x57, 0x43, 0x59, 0x2d, 0x0e,
|
||||
0x2f, 0xc7, 0xf2, 0x08, 0xee, 0x64, 0x59, 0x9b, 0x62, 0x48, 0x6a, 0x18, 0x92, 0xc7, 0x85, 0x12,
|
||||
0x2e, 0xa2, 0x31, 0x2c, 0xd1, 0xe6, 0xec, 0x6a, 0x49, 0x1e, 0x42, 0x23, 0x89, 0x5d, 0x19, 0x13,
|
||||
0x31, 0xe9, 0xb7, 0xc4, 0x65, 0xb8, 0x63, 0xfb, 0xc4, 0xca, 0x47, 0x54, 0xe3, 0x06, 0x23, 0x4a,
|
||||
0x3c, 0x19, 0xe9, 0xd6, 0x1f, 0x0a, 0x54, 0xf1, 0x32, 0x0d, 0xee, 0x4c, 0xbe, 0x19, 0x5b, 0x53,
|
||||
0x7b, 0xf4, 0xbc, 0x77, 0x68, 0x0f, 0xb4, 0x12, 0x69, 0x42, 0x1d, 0x77, 0x46, 0x47, 0x9a, 0x42,
|
||||
0xee, 0x83, 0x86, 0x0b, 0x6a, 0x39, 0x47, 0xc7, 0xd4, 0xb4, 0xa6, 0xf6, 0x40, 0x2b, 0x93, 0x6d,
|
||||
0x00, 0xdc, 0x3d, 0xfa, 0x6a, 0x64, 0x51, 0xad, 0xb2, 0x34, 0x62, 0x52, 0xab, 0x37, 0x39, 0xa2,
|
||||
0x5a, 0x95, 0xbc, 0x0e, 0xf7, 0x70, 0x67, 0x9f, 0xf6, 0x46, 0x13, 0xcb, 0x9a, 0x8a, 0x85, 0xa6,
|
||||
0x12, 0x1d, 0xee, 0xe3, 0xb6, 0xf5, 0xb5, 0x79, 0x78, 0x3c, 0xb0, 0xa6, 0x03, 0x6b, 0x64, 0xf7,
|
||||
0x0e, 0x1d, 0xad, 0x46, 0xee, 0xc1, 0x5d, 0x3c, 0x71, 0xc6, 0x3d, 0x79, 0x4b, 0x7d, 0x79, 0x8b,
|
||||
0x33, 0xe9, 0x4d, 0x2c, 0xad, 0x21, 0x5a, 0x2d, 0x65, 0x7c, 0xfe, 0x84, 0x67, 0x9d, 0x86, 0x4f,
|
||||
0x22, 0x6f, 0xc2, 0x6b, 0xce, 0xb0, 0x47, 0x33, 0xd9, 0xca, 0x3b, 0x36, 0x0e, 0xc6, 0xd6, 0x68,
|
||||
0x60, 0x8f, 0xf6, 0x35, 0x45, 0x38, 0xb1, 0x7a, 0xd0, 0x33, 0x4d, 0x6b, 0x3c, 0xb1, 0xc4, 0xbb,
|
||||
0x36, 0x4e, 0xa8, 0xf5, 0xa5, 0x65, 0x8a, 0x93, 0x4a, 0xff, 0x57, 0x05, 0x1e, 0x79, 0xd1, 0xfc,
|
||||
0xfa, 0x68, 0xf7, 0xb7, 0xf3, 0x0a, 0x4d, 0xc6, 0xe2, 0x9f, 0x6a, 0xac, 0x7c, 0x7b, 0x7f, 0x4d,
|
||||
0x98, 0xe9, 0x7e, 0x2b, 0x57, 0x4c, 0xc7, 0xfc, 0xbd, 0xbc, 0x63, 0x26, 0x5d, 0xcc, 0x90, 0xb0,
|
||||
0x68, 0xae, 0x59, 0x7c, 0xde, 0xe9, 0x0b, 0xe5, 0x5f, 0xa8, 0x39, 0xc9, 0x34, 0x27, 0x6b, 0x9a,
|
||||
0x93, 0x4c, 0x73, 0x5a, 0xc3, 0x1f, 0xb8, 0xee, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x41, 0x35,
|
||||
0x12, 0xf0, 0x90, 0x0a, 0x00, 0x00,
|
||||
}
|
||||
|
||||
Generated
Vendored
+62
-26
@@ -122,9 +122,20 @@ func (h *Handler) AcceptReceivedShare(w http.ResponseWriter, r *http.Request) {
|
||||
// TODO we could delete shares here if the stat returns code NOT FOUND ... but listening for file deletes would be better
|
||||
}
|
||||
}
|
||||
// we need to add a path to the share
|
||||
receivedShare := &collaboration.ReceivedShare{
|
||||
Share: &collaboration.Share{
|
||||
Id: &collaboration.ShareId{OpaqueId: shareID},
|
||||
},
|
||||
State: collaboration.ShareState_SHARE_STATE_ACCEPTED,
|
||||
MountPoint: &provider.Reference{
|
||||
Path: mount,
|
||||
},
|
||||
}
|
||||
updateMask := &fieldmaskpb.FieldMask{Paths: []string{"state", "hidden", "mount_point"}}
|
||||
|
||||
for id := range sharesToAccept {
|
||||
data := h.updateReceivedShare(w, r, id, false, mount)
|
||||
data := h.updateReceivedShare(w, r, receivedShare, updateMask)
|
||||
// only render the data for the changed share
|
||||
if id == shareID && data != nil {
|
||||
response.WriteOCSSuccess(w, r, []*conversions.ShareData{data})
|
||||
@@ -135,45 +146,69 @@ func (h *Handler) AcceptReceivedShare(w http.ResponseWriter, r *http.Request) {
|
||||
// RejectReceivedShare handles DELETE Requests on /apps/files_sharing/api/v1/shares/{shareid}
|
||||
func (h *Handler) RejectReceivedShare(w http.ResponseWriter, r *http.Request) {
|
||||
shareID := chi.URLParam(r, "shareid")
|
||||
data := h.updateReceivedShare(w, r, shareID, true, "")
|
||||
// we need to add a path to the share
|
||||
receivedShare := &collaboration.ReceivedShare{
|
||||
Share: &collaboration.Share{
|
||||
Id: &collaboration.ShareId{OpaqueId: shareID},
|
||||
},
|
||||
State: collaboration.ShareState_SHARE_STATE_REJECTED,
|
||||
}
|
||||
updateMask := &fieldmaskpb.FieldMask{Paths: []string{"state", "hidden"}}
|
||||
|
||||
data := h.updateReceivedShare(w, r, receivedShare, updateMask)
|
||||
if data != nil {
|
||||
response.WriteOCSSuccess(w, r, []*conversions.ShareData{data})
|
||||
}
|
||||
}
|
||||
|
||||
func (h *Handler) updateReceivedShare(w http.ResponseWriter, r *http.Request, shareID string, rejectShare bool, mountPoint string) *conversions.ShareData {
|
||||
func (h *Handler) UpdateReceivedShare(w http.ResponseWriter, r *http.Request) {
|
||||
shareID := chi.URLParam(r, "shareid")
|
||||
hideFlag, _ := strconv.ParseBool(r.URL.Query().Get("hidden"))
|
||||
|
||||
// unfortunately we need to get the share first to read the state
|
||||
client, err := h.getClient()
|
||||
if err != nil {
|
||||
response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error getting grpc gateway client", err)
|
||||
return
|
||||
}
|
||||
|
||||
// we need to add a path to the share
|
||||
receivedShare := &collaboration.ReceivedShare{
|
||||
Share: &collaboration.Share{
|
||||
Id: &collaboration.ShareId{OpaqueId: shareID},
|
||||
},
|
||||
Hidden: hideFlag,
|
||||
}
|
||||
updateMask := &fieldmaskpb.FieldMask{Paths: []string{"state", "hidden"}}
|
||||
|
||||
rs, _ := getReceivedShareFromID(r.Context(), client, shareID)
|
||||
if rs != nil && rs.Share != nil {
|
||||
receivedShare.State = rs.Share.State
|
||||
}
|
||||
|
||||
data := h.updateReceivedShare(w, r, receivedShare, updateMask)
|
||||
if data != nil {
|
||||
response.WriteOCSSuccess(w, r, []*conversions.ShareData{data})
|
||||
}
|
||||
// TODO: do we need error handling here?
|
||||
}
|
||||
|
||||
func (h *Handler) updateReceivedShare(w http.ResponseWriter, r *http.Request, receivedShare *collaboration.ReceivedShare, fieldMask *fieldmaskpb.FieldMask) *conversions.ShareData {
|
||||
ctx := r.Context()
|
||||
logger := appctx.GetLogger(ctx)
|
||||
|
||||
updateShareRequest := &collaboration.UpdateReceivedShareRequest{
|
||||
Share: receivedShare,
|
||||
UpdateMask: fieldMask,
|
||||
}
|
||||
|
||||
client, err := h.getClient()
|
||||
if err != nil {
|
||||
response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error getting grpc gateway client", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
hideFlag, _ := strconv.ParseBool(r.URL.Query().Get("hide"))
|
||||
|
||||
// we need to add a path to the share
|
||||
shareRequest := &collaboration.UpdateReceivedShareRequest{
|
||||
Share: &collaboration.ReceivedShare{
|
||||
Share: &collaboration.Share{
|
||||
Id: &collaboration.ShareId{OpaqueId: shareID},
|
||||
Hide: hideFlag,
|
||||
},
|
||||
MountPoint: &provider.Reference{
|
||||
Path: mountPoint,
|
||||
},
|
||||
},
|
||||
UpdateMask: &fieldmaskpb.FieldMask{Paths: []string{"state", "hide"}},
|
||||
}
|
||||
if rejectShare {
|
||||
shareRequest.Share.State = collaboration.ShareState_SHARE_STATE_REJECTED
|
||||
} else {
|
||||
shareRequest.UpdateMask.Paths = append(shareRequest.UpdateMask.Paths, "mount_point")
|
||||
shareRequest.Share.State = collaboration.ShareState_SHARE_STATE_ACCEPTED
|
||||
}
|
||||
|
||||
shareRes, err := client.UpdateReceivedShare(ctx, shareRequest)
|
||||
shareRes, err := client.UpdateReceivedShare(ctx, updateShareRequest)
|
||||
if err != nil {
|
||||
response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "grpc update received share request failed", err)
|
||||
return nil
|
||||
@@ -203,6 +238,7 @@ func (h *Handler) updateReceivedShare(w http.ResponseWriter, r *http.Request, sh
|
||||
}
|
||||
|
||||
data.State = mapState(rs.GetState())
|
||||
data.Hidden = rs.Hidden
|
||||
|
||||
h.addFileInfo(ctx, data, info)
|
||||
h.mapUserIds(r.Context(), client, data)
|
||||
|
||||
Generated
Vendored
+3
-3
@@ -580,9 +580,9 @@ func (h *Handler) GetShare(w http.ResponseWriter, r *http.Request) {
|
||||
},
|
||||
})
|
||||
if err == nil && uRes.GetShare() != nil {
|
||||
receivedshare = uRes.Share
|
||||
resourceID = uRes.Share.Share.ResourceId
|
||||
share, err = conversions.CS3Share2ShareData(ctx, uRes.Share.Share)
|
||||
share.Hidden = uRes.Share.Hidden
|
||||
if err != nil {
|
||||
response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error mapping share data", err)
|
||||
return
|
||||
@@ -739,7 +739,7 @@ func (h *Handler) updateShare(w http.ResponseWriter, r *http.Request, share *col
|
||||
|
||||
share.Permissions = &collaboration.SharePermissions{Permissions: role.CS3ResourcePermissions()}
|
||||
|
||||
var fieldMaskPaths = []string{"permissions", "hide"}
|
||||
var fieldMaskPaths = []string{"permissions"}
|
||||
|
||||
expireDate := r.PostFormValue("expireDate")
|
||||
var expirationTs *types.Timestamp
|
||||
@@ -958,7 +958,7 @@ func (h *Handler) listSharesWithMe(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
// TODO(refs) filter out "invalid" shares
|
||||
for _, rs := range lrsRes.GetShares() {
|
||||
if rs.Share.Hide && !showHidden {
|
||||
if rs.Hidden && !showHidden {
|
||||
continue
|
||||
}
|
||||
if stateFilter != ocsStateUnknown && rs.GetState() != stateFilter {
|
||||
|
||||
+1
@@ -122,6 +122,7 @@ func (s *svc) routerInit(log *zerolog.Logger) error {
|
||||
r.Route("/pending/{shareid}", func(r chi.Router) {
|
||||
r.Post("/", sharesHandler.AcceptReceivedShare)
|
||||
r.Delete("/", sharesHandler.RejectReceivedShare)
|
||||
r.Put("/", sharesHandler.UpdateReceivedShare)
|
||||
})
|
||||
r.Route("/remote_shares", func(r chi.Router) {
|
||||
r.Get("/", sharesHandler.ListFederatedShares)
|
||||
|
||||
+1
-2
@@ -172,7 +172,7 @@ type ShareData struct {
|
||||
Quicklink bool `json:"quicklink,omitempty" xml:"quicklink,omitempty"`
|
||||
// PasswordProtected represents a public share is password protected
|
||||
// PasswordProtected bool `json:"password_protected,omitempty" xml:"password_protected,omitempty"`
|
||||
Hide bool `json:"hide" xml:"hide"`
|
||||
Hidden bool `json:"hidden" xml:"hidden"`
|
||||
}
|
||||
|
||||
// ShareeData holds share recipient search results
|
||||
@@ -233,7 +233,6 @@ func CS3Share2ShareData(ctx context.Context, share *collaboration.Share) (*Share
|
||||
// Displaynames are added later
|
||||
UIDOwner: LocalUserIDToString(share.GetCreator()),
|
||||
UIDFileOwner: LocalUserIDToString(share.GetOwner()),
|
||||
Hide: share.Hide,
|
||||
}
|
||||
|
||||
if share.Grantee.Type == provider.GranteeType_GRANTEE_TYPE_USER {
|
||||
|
||||
+4
@@ -23,6 +23,7 @@ import (
|
||||
"encoding/json"
|
||||
"io"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
@@ -69,6 +70,9 @@ func New(m map[string]interface{}) (share.Repository, error) {
|
||||
func loadOrCreate(file string) (*shareModel, error) {
|
||||
_, err := os.Stat(file)
|
||||
if os.IsNotExist(err) {
|
||||
if err := os.MkdirAll(filepath.Dir(file), 0700); err != nil {
|
||||
return nil, errors.Wrap(err, "error creating the base directory: "+filepath.Dir(file))
|
||||
}
|
||||
if err := os.WriteFile(file, []byte("{}"), 0700); err != nil {
|
||||
return nil, errors.Wrap(err, "error creating the file: "+file)
|
||||
}
|
||||
|
||||
+1
-1
@@ -647,7 +647,7 @@ func (m *Manager) UpdateReceivedShare(ctx context.Context, rshare *collaboration
|
||||
rs.State = rshare.State
|
||||
case "mount_point":
|
||||
rs.MountPoint = rshare.MountPoint
|
||||
case "hide":
|
||||
case "hidden":
|
||||
continue
|
||||
default:
|
||||
return nil, errtypes.NotSupported("updating " + fieldMask.Paths[i] + " is not supported")
|
||||
|
||||
+1
-1
@@ -403,7 +403,7 @@ func (m *mgr) UpdateShare(ctx context.Context, ref *collaboration.ShareReference
|
||||
m.model.Shares[idx].Permissions = updated.Permissions
|
||||
case "expiration":
|
||||
m.model.Shares[idx].Expiration = updated.Expiration
|
||||
case "hide":
|
||||
case "hidden":
|
||||
continue
|
||||
default:
|
||||
return nil, errtypes.NotSupported("updating " + fieldMask.Paths[i] + " is not supported")
|
||||
|
||||
+4
-6
@@ -511,8 +511,6 @@ func (m *Manager) UpdateShare(ctx context.Context, ref *collaboration.ShareRefer
|
||||
toUpdate.Permissions = updated.Permissions
|
||||
case "expiration":
|
||||
toUpdate.Expiration = updated.Expiration
|
||||
case "hide":
|
||||
toUpdate.Hide = updated.Hide
|
||||
default:
|
||||
return nil, errtypes.NotSupported("updating " + fieldMask.Paths[i] + " is not supported")
|
||||
}
|
||||
@@ -886,11 +884,11 @@ func (m *Manager) ListReceivedShares(ctx context.Context, filters []*collaborati
|
||||
|
||||
if share.IsGrantedToUser(s, user) {
|
||||
if share.MatchesFiltersWithState(s, state.State, filters) {
|
||||
s.Hide = state.Hide
|
||||
rs := &collaboration.ReceivedShare{
|
||||
Share: s,
|
||||
State: state.State,
|
||||
MountPoint: state.MountPoint,
|
||||
Hidden: state.Hidden,
|
||||
}
|
||||
select {
|
||||
case results <- rs:
|
||||
@@ -942,7 +940,7 @@ func (m *Manager) convert(ctx context.Context, userID string, s *collaboration.S
|
||||
if err == nil && state != nil {
|
||||
rs.State = state.State
|
||||
rs.MountPoint = state.MountPoint
|
||||
rs.Share.Hide = state.Hide
|
||||
rs.Hidden = state.Hidden
|
||||
}
|
||||
return rs
|
||||
}
|
||||
@@ -1007,8 +1005,8 @@ func (m *Manager) UpdateReceivedShare(ctx context.Context, receivedShare *collab
|
||||
rs.State = receivedShare.State
|
||||
case "mount_point":
|
||||
rs.MountPoint = receivedShare.MountPoint
|
||||
case "hide":
|
||||
rs.Share.Hide = receivedShare.Share.Hide
|
||||
case "hidden":
|
||||
rs.Hidden = receivedShare.Hidden
|
||||
default:
|
||||
return nil, errtypes.NotSupported("updating " + fieldMask.Paths[i] + " is not supported")
|
||||
}
|
||||
|
||||
Generated
Vendored
+3
-3
@@ -68,7 +68,7 @@ type Space struct {
|
||||
type State struct {
|
||||
State collaboration.ShareState
|
||||
MountPoint *provider.Reference
|
||||
Hide bool
|
||||
Hidden bool
|
||||
}
|
||||
|
||||
// New returns a new Cache instance
|
||||
@@ -118,7 +118,7 @@ func (c *Cache) Add(ctx context.Context, userID, spaceID string, rs *collaborati
|
||||
receivedSpace.States[rs.Share.Id.GetOpaqueId()] = &State{
|
||||
State: rs.State,
|
||||
MountPoint: rs.MountPoint,
|
||||
Hide: rs.Share.Hide,
|
||||
Hidden: rs.Hidden,
|
||||
}
|
||||
|
||||
return c.persist(ctx, userID)
|
||||
@@ -200,7 +200,7 @@ func (c *Cache) List(ctx context.Context, userID string) (map[string]*Space, err
|
||||
spaceCopy.States[shareID] = &State{
|
||||
State: state.State,
|
||||
MountPoint: state.MountPoint,
|
||||
Hide: state.Hide,
|
||||
Hidden: state.Hidden,
|
||||
}
|
||||
}
|
||||
spaces[spaceID] = spaceCopy
|
||||
|
||||
+1
-3
@@ -243,8 +243,6 @@ func (m *manager) UpdateShare(ctx context.Context, ref *collaboration.ShareRefer
|
||||
m.shares[i].Permissions = updated.Permissions
|
||||
case "expiration":
|
||||
m.shares[i].Expiration = updated.Expiration
|
||||
case "hide":
|
||||
m.shares[i].Hide = updated.Hide
|
||||
default:
|
||||
return nil, errtypes.NotSupported("updating " + path + " is not supported")
|
||||
}
|
||||
@@ -366,7 +364,7 @@ func (m *manager) UpdateReceivedShare(ctx context.Context, receivedShare *collab
|
||||
rs.State = receivedShare.State
|
||||
case "mount_point":
|
||||
rs.MountPoint = receivedShare.MountPoint
|
||||
case "hide":
|
||||
case "hidden":
|
||||
continue
|
||||
default:
|
||||
return nil, errtypes.NotSupported("updating " + fieldMask.Paths[i] + " is not supported")
|
||||
|
||||
+1
-1
@@ -454,7 +454,7 @@ func (m *mgr) UpdateReceivedShare(ctx context.Context, receivedShare *collaborat
|
||||
fields = append(fields, "file_target=?")
|
||||
rs.MountPoint = receivedShare.MountPoint
|
||||
params = append(params, rs.MountPoint.Path)
|
||||
case "hide":
|
||||
case "hidden":
|
||||
continue
|
||||
default:
|
||||
return nil, errtypes.NotSupported("updating " + fieldMask.Paths[i] + " is not supported")
|
||||
|
||||
Vendored
+2
-3
@@ -334,7 +334,7 @@ github.com/crewjam/saml
|
||||
github.com/crewjam/saml/logger
|
||||
github.com/crewjam/saml/samlsp
|
||||
github.com/crewjam/saml/xmlenc
|
||||
# github.com/cs3org/go-cs3apis v0.0.0-20230727093620-0f4399be4543 => github.com/aduffeck/go-cs3apis v0.0.0-20231009082215-ad45e19edac0
|
||||
# github.com/cs3org/go-cs3apis v0.0.0-20231023073225-7748710e0781
|
||||
## explicit; go 1.13
|
||||
github.com/cs3org/go-cs3apis/cs3/app/provider/v1beta1
|
||||
github.com/cs3org/go-cs3apis/cs3/app/registry/v1beta1
|
||||
@@ -357,7 +357,7 @@ github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1
|
||||
github.com/cs3org/go-cs3apis/cs3/storage/registry/v1beta1
|
||||
github.com/cs3org/go-cs3apis/cs3/tx/v1beta1
|
||||
github.com/cs3org/go-cs3apis/cs3/types/v1beta1
|
||||
# github.com/cs3org/reva/v2 v2.16.1-0.20231023124625-f9a66375fd79
|
||||
# github.com/cs3org/reva/v2 v2.16.1-0.20231024092538-194fbe4a2c31
|
||||
## explicit; go 1.20
|
||||
github.com/cs3org/reva/v2/cmd/revad/internal/grace
|
||||
github.com/cs3org/reva/v2/cmd/revad/runtime
|
||||
@@ -2255,4 +2255,3 @@ stash.kopano.io/kgol/oidc-go
|
||||
# stash.kopano.io/kgol/rndm v1.1.2
|
||||
## explicit; go 1.13
|
||||
stash.kopano.io/kgol/rndm
|
||||
# github.com/cs3org/go-cs3apis => github.com/aduffeck/go-cs3apis v0.0.0-20231009082215-ad45e19edac0
|
||||
|
||||
Reference in New Issue
Block a user