From d1c12aae40320cd17c3d27b87746de65ee11129a Mon Sep 17 00:00:00 2001 From: Gianmaria Del Monte Date: Tue, 9 May 2023 14:54:24 +0200 Subject: [PATCH 01/20] adapt webdav ocm endpoint according to historical way of contructing webdav url --- internal/http/services/owncloud/ocdav/dav.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/internal/http/services/owncloud/ocdav/dav.go b/internal/http/services/owncloud/ocdav/dav.go index 54589c322c..7620cd2144 100644 --- a/internal/http/services/owncloud/ocdav/dav.go +++ b/internal/http/services/owncloud/ocdav/dav.go @@ -21,6 +21,7 @@ package ocdav import ( "context" "net/http" + "net/url" "path" "strings" @@ -187,7 +188,18 @@ func (h *DavHandler) Handler(s *svc) http.Handler { return } - token, _ := router.ShiftPath(r.URL.Path) + // OC10 and Nextcloud (OCM 1.0) are using basic auth for carrying the + // shared token. + var token string + username, _, ok := r.BasicAuth() + if ok { + // OCM 1.0 + token = username + r.URL.Path, _ = url.JoinPath("/", token, r.URL.Path) + } else { + token, _ = router.ShiftPath(r.URL.Path) + } + authRes, err := handleOCMAuth(ctx, c, token) switch { case err != nil: From 8cb411a3113ac565a8d8f2f77616951b7c2ff656 Mon Sep 17 00:00:00 2001 From: Gianmaria Del Monte Date: Tue, 9 May 2023 15:35:19 +0200 Subject: [PATCH 02/20] add discovery endpoint in the ocm client --- pkg/ocm/client/client.go | 47 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/pkg/ocm/client/client.go b/pkg/ocm/client/client.go index 4f291bd6d6..651129bf5b 100644 --- a/pkg/ocm/client/client.go +++ b/pkg/ocm/client/client.go @@ -231,3 +231,50 @@ func (c *OCMClient) parseNewShareResponse(r *http.Response) (*NewShareResponse, } return nil, errtypes.InternalError(string(body)) } + +// Capabilities contains a set of properties exposed by +// a remote cloud storage. +type Capabilities struct { + Enabled bool `json:"enabled"` + APIVersion string `json:"apiVersion"` + EndPoint string `json:"endPoint"` + Provider string `json:"provider"` + ResourceTypes []struct { + Name string `json:"name"` + ShareTypes []string `json:"shareTypes"` + Protocols struct { + Webdav *string `json:"webdav"` + Webapp *string `json:"webapp"` + Datatx *string `json:"datatx"` + } `json:"protocols"` + } `json:"resourceTypes"` + Capabilities []string `json:"capabilities"` +} + +// Discovery returns a number of properties used to discover the capabilities offered by a remote cloud storage. +// https://cs3org.github.io/OCM-API/docs.html?branch=develop&repo=OCM-API&user=cs3org#/paths/~1ocm-provider/get +func (c *OCMClient) Discovery(ctx context.Context, endpoint string) (*Capabilities, error) { + url, err := url.JoinPath(endpoint, "shares") + if err != nil { + return nil, err + } + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + return nil, errors.Wrap(err, "error creating request") + } + req.Header.Set("Content-Type", "application/json") + + resp, err := c.client.Do(req) + if err != nil { + return nil, errors.Wrap(err, "error doing request") + } + defer resp.Body.Close() + + var cap Capabilities + if err := json.NewDecoder(resp.Body).Decode(&c); err != nil { + return nil, err + } + + return &cap, nil +} From 6f6c6920f58278aaea7cd2039d6dd9ed389bbbc7 Mon Sep 17 00:00:00 2001 From: Giuseppe Lo Presti Date: Wed, 10 May 2023 09:26:54 +0200 Subject: [PATCH 03/20] Make root OCM URLs configurable in /ocm-provider --- internal/http/services/ocmd/discovery.go | 6 +++--- internal/http/services/ocmd/ocm.go | 8 ++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/internal/http/services/ocmd/discovery.go b/internal/http/services/ocmd/discovery.go index 891f914cf9..d53e660819 100644 --- a/internal/http/services/ocmd/discovery.go +++ b/internal/http/services/ocmd/discovery.go @@ -52,12 +52,12 @@ func (h *discoHandler) init(c *config) { h.d.Provider = c.Provider rtProtos := map[string]string{} // webdav is always enabled - rtProtos["webdav"] = fmt.Sprintf("%s/remote.php/dav/%s", c.Endpoint, c.Prefix) + rtProtos["webdav"] = fmt.Sprintf("%s/%s/%s", c.Endpoint, c.WebDAVRoot, c.Prefix) if c.EnableWebApp { - rtProtos["webapp"] = fmt.Sprintf("%s/external/sciencemesh", c.Endpoint) + rtProtos["webapp"] = fmt.Sprintf("%s/%s", c.Endpoint, c.WebAppRoot) } if c.EnableDataTx { - rtProtos["datatx"] = fmt.Sprintf("%s/remote.php/dav/%s", c.Endpoint, c.Prefix) + rtProtos["datatx"] = fmt.Sprintf("%s/%s/%s", c.Endpoint, c.WebDAVRoot, c.Prefix) } h.d.ResourceTypes = []resourceTypes{{ Name: "file", // so far we only support `file` diff --git a/internal/http/services/ocmd/ocm.go b/internal/http/services/ocmd/ocm.go index f91f29c4ae..c7078fc5be 100644 --- a/internal/http/services/ocmd/ocm.go +++ b/internal/http/services/ocmd/ocm.go @@ -38,6 +38,8 @@ type config struct { GatewaySvc string `mapstructure:"gatewaysvc"` Endpoint string `mapstructure:"endpoint"` Provider string `mapstructure:"provider"` + WebDAVRoot string `mapstructure:"webdav_root"` + WebAppRoot string `mapstructure:"webapp_root"` EnableWebApp bool `mapstructure:"enable_webapp"` EnableDataTx bool `mapstructure:"enable_datatx"` ExposeRecipientDisplayName bool `mapstructure:"expose_recipient_display_name"` @@ -55,6 +57,12 @@ func (c *config) init() { if c.Provider == "" { c.Provider = "reva" } + if c.WebDAVRoot == "" { + c.WebDAVRoot = "remote.php/dav" + } + if c.WebAppRoot == "" { + c.WebAppRoot = "external/sciencemesh" + } } type svc struct { From 992805208291c0a7657f2ddbaf0b80a99d563d44 Mon Sep 17 00:00:00 2001 From: Gianmaria Del Monte Date: Wed, 10 May 2023 13:54:24 +0200 Subject: [PATCH 04/20] add changelog --- changelog/unreleased/expose-historical-ocm-webdav.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 changelog/unreleased/expose-historical-ocm-webdav.md diff --git a/changelog/unreleased/expose-historical-ocm-webdav.md b/changelog/unreleased/expose-historical-ocm-webdav.md new file mode 100644 index 0000000000..55b47ce051 --- /dev/null +++ b/changelog/unreleased/expose-historical-ocm-webdav.md @@ -0,0 +1,8 @@ +Enhancement: Implement historical way of constructing OCM WebDAV URL + +Expose the expected WebDAV endpoint for OCM by OC10 and Nextcloud as described +in https://github.com/cs3org/OCM-API/issues/70#issuecomment-1538551138 to allow +reva providers to participate to mesh. + +https://github.com/cs3org/reva/pull/3868 +https://github.com/cs3org/reva/issues/3855 \ No newline at end of file From bb74d537b27b8b8a589140ac62ba7f89284a8292 Mon Sep 17 00:00:00 2001 From: Gianmaria Del Monte Date: Wed, 10 May 2023 14:28:10 +0200 Subject: [PATCH 05/20] fix path for old ocm webdav --- internal/http/services/owncloud/ocdav/dav.go | 2 ++ internal/http/services/owncloud/ocdav/ocdav.go | 1 + internal/http/services/owncloud/ocdav/propfind.go | 12 ++++++++++++ 3 files changed, 15 insertions(+) diff --git a/internal/http/services/owncloud/ocdav/dav.go b/internal/http/services/owncloud/ocdav/dav.go index 7620cd2144..5c85222df8 100644 --- a/internal/http/services/owncloud/ocdav/dav.go +++ b/internal/http/services/owncloud/ocdav/dav.go @@ -196,8 +196,10 @@ func (h *DavHandler) Handler(s *svc) http.Handler { // OCM 1.0 token = username r.URL.Path, _ = url.JoinPath("/", token, r.URL.Path) + ctx = context.WithValue(ctx, ctxOldVersionOCM, true) } else { token, _ = router.ShiftPath(r.URL.Path) + ctx = context.WithValue(ctx, ctxOldVersionOCM, false) } authRes, err := handleOCMAuth(ctx, c, token) diff --git a/internal/http/services/owncloud/ocdav/ocdav.go b/internal/http/services/owncloud/ocdav/ocdav.go index ad608ad67b..6b9670f331 100644 --- a/internal/http/services/owncloud/ocdav/ocdav.go +++ b/internal/http/services/owncloud/ocdav/ocdav.go @@ -50,6 +50,7 @@ type ctxKey int const ( ctxKeyBaseURI ctxKey = iota + ctxOldVersionOCM ) var ( diff --git a/internal/http/services/owncloud/ocdav/propfind.go b/internal/http/services/owncloud/ocdav/propfind.go index 3fbd197be6..b37fb0bebe 100644 --- a/internal/http/services/owncloud/ocdav/propfind.go +++ b/internal/http/services/owncloud/ocdav/propfind.go @@ -43,6 +43,7 @@ import ( "github.com/cs3org/reva/pkg/appctx" ctxpkg "github.com/cs3org/reva/pkg/ctx" "github.com/cs3org/reva/pkg/publicshare" + "github.com/cs3org/reva/pkg/rhttp/router" "github.com/cs3org/reva/pkg/share" rtrace "github.com/cs3org/reva/pkg/trace" "github.com/cs3org/reva/pkg/utils" @@ -501,6 +502,16 @@ func (s *svc) newPropRaw(key, val string) *propertyXML { } } +func fixForOldOCM(ctx context.Context, md *provider.ResourceInfo) { + oldOCM := ctx.Value(ctxOldVersionOCM).(bool) + if oldOCM { + // the path is something like //... + // we need to strip the token part as this + // is passed as username in the basic auth + _, md.Path = router.ShiftPath(md.Path) + } +} + // mdToPropResponse converts the CS3 metadata into a webdav PropResponse // ns is the CS3 namespace that needs to be removed from the CS3 path before // prefixing it with the baseURI. @@ -510,6 +521,7 @@ func (s *svc) mdToPropResponse(ctx context.Context, pf *propfindXML, md *provide baseURI := ctx.Value(ctxKeyBaseURI).(string) + fixForOldOCM(ctx, md) ref := path.Join(baseURI, md.Path) if md.Type == provider.ResourceType_RESOURCE_TYPE_CONTAINER { ref += "/" From 3fc535ee90d570ca1f7cb2038be19726510a9d9c Mon Sep 17 00:00:00 2001 From: Giuseppe Lo Presti Date: Wed, 10 May 2023 14:46:54 +0200 Subject: [PATCH 06/20] Added reverse proxy for /ocm-provider --- .../http/services/owncloud/ocdav/ocdav.go | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/internal/http/services/owncloud/ocdav/ocdav.go b/internal/http/services/owncloud/ocdav/ocdav.go index 6b9670f331..83e6272942 100644 --- a/internal/http/services/owncloud/ocdav/ocdav.go +++ b/internal/http/services/owncloud/ocdav/ocdav.go @@ -21,6 +21,7 @@ package ocdav import ( "context" "fmt" + "io" "net/http" "net/url" "path" @@ -184,7 +185,7 @@ func (s *svc) Close() error { } func (s *svc) Unprotected() []string { - return []string{"/status.php", "/remote.php/dav/public-files/", "/apps/files/", "/index.php/f/", "/index.php/s/", "/remote.php/dav/ocm/"} + return []string{"/status.php", "/remote.php/dav/public-files/", "/apps/files/", "/index.php/f/", "/index.php/s/", "/remote.php/dav/ocm/", "/ocm-provider"} } func (s *svc) Handler() http.Handler { @@ -233,7 +234,45 @@ func (s *svc) Handler() http.Handler { http.Redirect(w, r, rURL, http.StatusMovedPermanently) return } + case "ocm-provider": + // Reverse proxy of /ocm/ocm-provider, assuming it is exposed in localhost. When not configured, returns 404. + // TODO(lopresti) this as well as other endpoints here should go to some common place for + // routes served from the root, including the reverseproxy service (which if configured + // together with ocdav would just override it!). + proto := "https" + if s.c.Insecure { + proto = "http" + } + ocmEP := fmt.Sprintf("%s://localhost/ocm/ocm-provider", proto) + httpReq, err := rhttp.NewRequest(ctx, http.MethodGet, ocmEP, nil) + if err != nil { + log.Error().Msg("ocm-provider: failed to create forward request") + w.WriteHeader(http.StatusInternalServerError) + return + } + httpRes, err := rhttp.GetHTTPClient(rhttp.Context(ctx), rhttp.Insecure(s.c.Insecure)).Do(httpReq) + if err != nil { + log.Warn().Msg("ocm-provider: error attempting to call /ocm/ocm-provider") + w.WriteHeader(http.StatusNotFound) + return + } + defer httpRes.Body.Close() + payload, err := io.ReadAll(httpRes.Body) + if err != nil { + log.Warn().Msg("ocm-provider: error attempting to read payload") + w.WriteHeader(http.StatusInternalServerError) + return + } + if _, err = w.Write(payload); err != nil { + log.Error().Msg("ocm-provider: failed to return payload") + w.WriteHeader(http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + return } + switch head { // the old `/webdav` endpoint uses remote.php/webdav/$path case "webdav": From 0022279b9b5f52851dd3015dcaa8e20010e2a6ab Mon Sep 17 00:00:00 2001 From: Giuseppe Lo Presti Date: Wed, 10 May 2023 15:04:28 +0200 Subject: [PATCH 07/20] Revert "Added reverse proxy for /ocm-provider" This reverts commit 1ecb6e4e48910209b790ed5138fce8d007dea788. --- .../http/services/owncloud/ocdav/ocdav.go | 41 +------------------ 1 file changed, 1 insertion(+), 40 deletions(-) diff --git a/internal/http/services/owncloud/ocdav/ocdav.go b/internal/http/services/owncloud/ocdav/ocdav.go index 83e6272942..6b9670f331 100644 --- a/internal/http/services/owncloud/ocdav/ocdav.go +++ b/internal/http/services/owncloud/ocdav/ocdav.go @@ -21,7 +21,6 @@ package ocdav import ( "context" "fmt" - "io" "net/http" "net/url" "path" @@ -185,7 +184,7 @@ func (s *svc) Close() error { } func (s *svc) Unprotected() []string { - return []string{"/status.php", "/remote.php/dav/public-files/", "/apps/files/", "/index.php/f/", "/index.php/s/", "/remote.php/dav/ocm/", "/ocm-provider"} + return []string{"/status.php", "/remote.php/dav/public-files/", "/apps/files/", "/index.php/f/", "/index.php/s/", "/remote.php/dav/ocm/"} } func (s *svc) Handler() http.Handler { @@ -234,45 +233,7 @@ func (s *svc) Handler() http.Handler { http.Redirect(w, r, rURL, http.StatusMovedPermanently) return } - case "ocm-provider": - // Reverse proxy of /ocm/ocm-provider, assuming it is exposed in localhost. When not configured, returns 404. - // TODO(lopresti) this as well as other endpoints here should go to some common place for - // routes served from the root, including the reverseproxy service (which if configured - // together with ocdav would just override it!). - proto := "https" - if s.c.Insecure { - proto = "http" - } - ocmEP := fmt.Sprintf("%s://localhost/ocm/ocm-provider", proto) - httpReq, err := rhttp.NewRequest(ctx, http.MethodGet, ocmEP, nil) - if err != nil { - log.Error().Msg("ocm-provider: failed to create forward request") - w.WriteHeader(http.StatusInternalServerError) - return - } - httpRes, err := rhttp.GetHTTPClient(rhttp.Context(ctx), rhttp.Insecure(s.c.Insecure)).Do(httpReq) - if err != nil { - log.Warn().Msg("ocm-provider: error attempting to call /ocm/ocm-provider") - w.WriteHeader(http.StatusNotFound) - return - } - defer httpRes.Body.Close() - payload, err := io.ReadAll(httpRes.Body) - if err != nil { - log.Warn().Msg("ocm-provider: error attempting to read payload") - w.WriteHeader(http.StatusInternalServerError) - return - } - if _, err = w.Write(payload); err != nil { - log.Error().Msg("ocm-provider: failed to return payload") - w.WriteHeader(http.StatusInternalServerError) - return - } - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - return } - switch head { // the old `/webdav` endpoint uses remote.php/webdav/$path case "webdav": From 2a0bf6537a1d290481236847012658579aab2bf7 Mon Sep 17 00:00:00 2001 From: Giuseppe Lo Presti Date: Wed, 10 May 2023 15:30:43 +0200 Subject: [PATCH 08/20] Moved ocm-provider to a new http service --- internal/http/services/loader/loader.go | 1 + internal/http/services/ocmd/ocm.go | 25 +---- .../ocmprovider.go} | 104 +++++++++++++++++- 3 files changed, 102 insertions(+), 28 deletions(-) rename internal/http/services/{ocmd/discovery.go => ocmprovider/ocmprovider.go} (53%) diff --git a/internal/http/services/loader/loader.go b/internal/http/services/loader/loader.go index 87a96be029..02511a01bf 100644 --- a/internal/http/services/loader/loader.go +++ b/internal/http/services/loader/loader.go @@ -29,6 +29,7 @@ import ( _ "github.com/cs3org/reva/internal/http/services/mentix" _ "github.com/cs3org/reva/internal/http/services/meshdirectory" _ "github.com/cs3org/reva/internal/http/services/metrics" + _ "github.com/cs3org/reva/internal/http/services/ocmprovider" _ "github.com/cs3org/reva/internal/http/services/ocmd" _ "github.com/cs3org/reva/internal/http/services/owncloud/ocdav" _ "github.com/cs3org/reva/internal/http/services/owncloud/ocs" diff --git a/internal/http/services/ocmd/ocm.go b/internal/http/services/ocmd/ocm.go index c7078fc5be..ab178796f6 100644 --- a/internal/http/services/ocmd/ocm.go +++ b/internal/http/services/ocmd/ocm.go @@ -36,33 +36,14 @@ func init() { type config struct { Prefix string `mapstructure:"prefix"` GatewaySvc string `mapstructure:"gatewaysvc"` - Endpoint string `mapstructure:"endpoint"` - Provider string `mapstructure:"provider"` - WebDAVRoot string `mapstructure:"webdav_root"` - WebAppRoot string `mapstructure:"webapp_root"` - EnableWebApp bool `mapstructure:"enable_webapp"` - EnableDataTx bool `mapstructure:"enable_datatx"` ExposeRecipientDisplayName bool `mapstructure:"expose_recipient_display_name"` } func (c *config) init() { c.GatewaySvc = sharedconf.GetGatewaySVC(c.GatewaySvc) - if c.Prefix == "" { c.Prefix = "ocm" } - if c.Endpoint == "" { - c.Endpoint = "http://localhost" - } - if c.Provider == "" { - c.Provider = "reva" - } - if c.WebDAVRoot == "" { - c.WebDAVRoot = "remote.php/dav" - } - if c.WebAppRoot == "" { - c.WebAppRoot = "external/sciencemesh" - } } type svc struct { @@ -93,12 +74,10 @@ func New(m map[string]interface{}, log *zerolog.Logger) (global.Service, error) } func (s *svc) routerInit() error { - discoHandler := new(discoHandler) sharesHandler := new(sharesHandler) notificationsHandler := new(notificationsHandler) invitesHandler := new(invitesHandler) - discoHandler.init(s.Conf) if err := sharesHandler.init(s.Conf); err != nil { return err } @@ -107,11 +86,9 @@ func (s *svc) routerInit() error { return err } - s.router.Get("/ocm-provider", discoHandler.Send) s.router.Post("/shares", sharesHandler.CreateShare) s.router.Post("/notifications", notificationsHandler.SendNotification) s.router.Post("/invite-accepted", invitesHandler.AcceptInvite) - return nil } @@ -131,7 +108,7 @@ func (s *svc) Unprotected() []string { func (s *svc) Handler() http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log := appctx.GetLogger(r.Context()) - log.Debug().Str("path", r.URL.Path).Msg("ocs routing") + log.Debug().Str("path", r.URL.Path).Msg("ocm routing") // unset raw path, otherwise chi uses it to route and then fails to match percent encoded path segments r.URL.RawPath = "" diff --git a/internal/http/services/ocmd/discovery.go b/internal/http/services/ocmprovider/ocmprovider.go similarity index 53% rename from internal/http/services/ocmd/discovery.go rename to internal/http/services/ocmprovider/ocmprovider.go index d53e660819..f0a7d9d007 100644 --- a/internal/http/services/ocmd/discovery.go +++ b/internal/http/services/ocmprovider/ocmprovider.go @@ -16,7 +16,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -package ocmd +package ocmprovider import ( "encoding/json" @@ -24,8 +24,31 @@ import ( "net/http" "github.com/cs3org/reva/pkg/appctx" + "github.com/cs3org/reva/pkg/rhttp/global" + "github.com/go-chi/chi/v5" + "github.com/mitchellh/mapstructure" + "github.com/rs/zerolog" ) +func init() { + global.Register("ocmprovider", New) +} + +type config struct { + OCMPrefix string `mapstructure:"ocm_prefix"` + Endpoint string `mapstructure:"endpoint"` + Provider string `mapstructure:"provider"` + WebDAVRoot string `mapstructure:"webdav_root"` + WebAppRoot string `mapstructure:"webapp_root"` + EnableWebApp bool `mapstructure:"enable_webapp"` + EnableDataTx bool `mapstructure:"enable_datatx"` +} + +type svc struct { + Conf *config + router chi.Router +} + type discoveryData struct { Enabled bool `json:"enabled" xml:"enabled"` APIVersion string `json:"apiVersion" xml:"apiVersion"` @@ -45,19 +68,37 @@ type discoHandler struct { d discoveryData } +func (c *config) init() { + if c.OCMPrefix == "" { + c.OCMPrefix = "ocm" + } + if c.Endpoint == "" { + c.Endpoint = "http://localhost" + } + if c.Provider == "" { + c.Provider = "reva" + } + if c.WebDAVRoot == "" { + c.WebDAVRoot = "remote.php/dav" + } + if c.WebAppRoot == "" { + c.WebAppRoot = "external/sciencemesh" + } +} + func (h *discoHandler) init(c *config) { h.d.Enabled = true h.d.APIVersion = "1.1.0" - h.d.Endpoint = fmt.Sprintf("%s/%s", c.Endpoint, c.Prefix) + h.d.Endpoint = fmt.Sprintf("%s/%s", c.Endpoint, c.OCMPrefix) h.d.Provider = c.Provider rtProtos := map[string]string{} // webdav is always enabled - rtProtos["webdav"] = fmt.Sprintf("%s/%s/%s", c.Endpoint, c.WebDAVRoot, c.Prefix) + rtProtos["webdav"] = fmt.Sprintf("%s/%s/%s", c.Endpoint, c.WebDAVRoot, c.OCMPrefix) if c.EnableWebApp { rtProtos["webapp"] = fmt.Sprintf("%s/%s", c.Endpoint, c.WebAppRoot) } if c.EnableDataTx { - rtProtos["datatx"] = fmt.Sprintf("%s/%s/%s", c.Endpoint, c.WebDAVRoot, c.Prefix) + rtProtos["datatx"] = fmt.Sprintf("%s/%s/%s", c.Endpoint, c.WebDAVRoot, c.OCMPrefix) } h.d.ResourceTypes = []resourceTypes{{ Name: "file", // so far we only support `file` @@ -68,6 +109,61 @@ func (h *discoHandler) init(c *config) { h.d.Capabilities = []string{"/invite-accepted"} } +// New returns a new ocmprovider object, that implements +// the OCM discovery endpoint specified in +// https://cs3org.github.io/OCM-API/docs.html?repo=OCM-API&user=cs3org#/paths/~1ocm-provider/get +func New(m map[string]interface{}, log *zerolog.Logger) (global.Service, error) { + conf := &config{} + if err := mapstructure.Decode(m, conf); err != nil { + return nil, err + } + conf.init() + + r := chi.NewRouter() + s := &svc{ + Conf: conf, + router: r, + } + + if err := s.routerInit(); err != nil { + return nil, err + } + + return s, nil +} + +func (s *svc) routerInit() error { + discoHandler := new(discoHandler) + discoHandler.init(s.Conf) + s.router.Get(".", discoHandler.Send) + return nil +} + +// Close performs cleanup. +func (s *svc) Close() error { + return nil +} + +func (s *svc) Prefix() string { + // this is hardcoded as per OCM specifications + return "/ocm-provider" +} + +func (s *svc) Unprotected() []string { + return []string{"."} +} + +func (s *svc) Handler() http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + log := appctx.GetLogger(r.Context()) + log.Debug().Str("path", r.URL.Path).Msg("ocm-provider routing") + + // unset raw path, otherwise chi may use it to route and then failto match percent encoded path segments + r.URL.RawPath = "" + s.router.ServeHTTP(w, r) + }) +} + // Send sends the discovery info to the caller. func (h *discoHandler) Send(w http.ResponseWriter, r *http.Request) { log := appctx.GetLogger(r.Context()) From 6504e6346b2a585ce5efd49fc775d91aeddc4556 Mon Sep 17 00:00:00 2001 From: Giuseppe Lo Presti Date: Wed, 10 May 2023 15:42:23 +0200 Subject: [PATCH 09/20] Updated examples --- examples/meshdirectory/meshdirectory.toml | 1 + examples/nextcloud-integration/revad.toml | 6 ++++-- examples/oc-phoenix/ocmd.toml | 4 +++- examples/ocmd/server-1/ocmd-server-1.toml | 3 +++ examples/ocmd/server-2/ocmd-server-2.toml | 3 ++- examples/oidc-mapping-tpc/server-1.toml | 1 + examples/oidc-mapping-tpc/server-2.toml | 1 + .../{serverless-example => serverless}/notifications.toml | 0 examples/standalone/standalone.toml | 1 + examples/storage-references/gateway.toml | 1 + examples/two-server-setup/gateway-1.toml | 1 + examples/two-server-setup/gateway-2.toml | 1 + 12 files changed, 19 insertions(+), 4 deletions(-) rename examples/{serverless-example => serverless}/notifications.toml (100%) diff --git a/examples/meshdirectory/meshdirectory.toml b/examples/meshdirectory/meshdirectory.toml index c525e9ad0c..9711044416 100644 --- a/examples/meshdirectory/meshdirectory.toml +++ b/examples/meshdirectory/meshdirectory.toml @@ -24,6 +24,7 @@ file = "/var/tmp/reva/shares_server_1.json" [http.services.dataprovider] [http.services.prometheus] [http.services.ocmd] +[http.services.ocmprovider] [http.services.ocdav] [http.services.ocs] diff --git a/examples/nextcloud-integration/revad.toml b/examples/nextcloud-integration/revad.toml index f44a43f4fa..de31cd8a7a 100644 --- a/examples/nextcloud-integration/revad.toml +++ b/examples/nextcloud-integration/revad.toml @@ -112,7 +112,7 @@ driver = "nextcloud" endpoint = "http://localhost/apps/sciencemesh/" [http] -enabled_services = ["ocmd"] +enabled_services = ["ocmd", "ocmprovider"] enabled_middlewares = ["providerauthorizer", "cors"] address = "0.0.0.0:19001" @@ -126,9 +126,11 @@ driver = "nextcloud" user_layout = "{{.Username}}" [http.services.ocmd] -prefix = "ocm" + +[http.services.ocmprovider] provider = "Reva-Nextcloud" endpoint = "http://localhost" +webdav_root = "/remote.php/dav" enable_webapp = true enable_datatx = true diff --git a/examples/oc-phoenix/ocmd.toml b/examples/oc-phoenix/ocmd.toml index 1814c6157f..0864d48b54 100644 --- a/examples/oc-phoenix/ocmd.toml +++ b/examples/oc-phoenix/ocmd.toml @@ -28,12 +28,14 @@ driver = "json" providers = "providers.demo.json" [http] -enabled_services = ["ocmd"] +enabled_services = ["ocmd", "ocmprovider"] enabled_middlewares = ["providerauthorizer", "cors"] address = "0.0.0.0:13001" [http.services.ocmd] prefix = "ocm" + +[http.services.ocmprovider] endpoint = "http://localhost:13001" [http.middlewares.providerauthorizer] diff --git a/examples/ocmd/server-1/ocmd-server-1.toml b/examples/ocmd/server-1/ocmd-server-1.toml index 7f826f3da8..5ecf585745 100644 --- a/examples/ocmd/server-1/ocmd-server-1.toml +++ b/examples/ocmd/server-1/ocmd-server-1.toml @@ -122,6 +122,9 @@ user_layout = "{{.Username}}" [http.services.ocmd] prefix = "ocm" + +[http.services.ocmprovider] +ocm_prefix = "ocm" provider = "reva@cern" endpoint = "http://localhost:19001" enable_webapp = true diff --git a/examples/ocmd/server-2/ocmd-server-2.toml b/examples/ocmd/server-2/ocmd-server-2.toml index 745c46eefa..8ac94f9ba9 100644 --- a/examples/ocmd/server-2/ocmd-server-2.toml +++ b/examples/ocmd/server-2/ocmd-server-2.toml @@ -112,7 +112,8 @@ driver = "localhome" user_layout = "{{.Username}}" [http.services.ocmd] -prefix = "ocm" + +[http.services.ocmprovider] provider = "reva@cesnet" endpoint = "http://localhost:17001" enable_webapp = true diff --git a/examples/oidc-mapping-tpc/server-1.toml b/examples/oidc-mapping-tpc/server-1.toml index c212892e59..61248b2a13 100644 --- a/examples/oidc-mapping-tpc/server-1.toml +++ b/examples/oidc-mapping-tpc/server-1.toml @@ -62,6 +62,7 @@ driver = "localhome" [http.services.datagateway] [http.services.prometheus] [http.services.ocmd] +[http.services.ocmprovider] [http.services.ocs] [http.services.ocdav] enable_http_tpc = true diff --git a/examples/oidc-mapping-tpc/server-2.toml b/examples/oidc-mapping-tpc/server-2.toml index 259c4b77d8..02eaee63bc 100644 --- a/examples/oidc-mapping-tpc/server-2.toml +++ b/examples/oidc-mapping-tpc/server-2.toml @@ -62,6 +62,7 @@ driver = "localhome" [http.services.datagateway] [http.services.prometheus] [http.services.ocmd] +[http.services.ocmprovider] [http.services.ocs] [http.services.ocdav] enable_http_tpc = true diff --git a/examples/serverless-example/notifications.toml b/examples/serverless/notifications.toml similarity index 100% rename from examples/serverless-example/notifications.toml rename to examples/serverless/notifications.toml diff --git a/examples/standalone/standalone.toml b/examples/standalone/standalone.toml index fe293dbb01..0b54edd841 100644 --- a/examples/standalone/standalone.toml +++ b/examples/standalone/standalone.toml @@ -17,5 +17,6 @@ [http.services.dataprovider] [http.services.prometheus] [http.services.ocmd] +[http.services.ocmprovider] [http.services.ocdav] [http.services.ocs] diff --git a/examples/storage-references/gateway.toml b/examples/storage-references/gateway.toml index a8e90d8866..8b887d1d3d 100644 --- a/examples/storage-references/gateway.toml +++ b/examples/storage-references/gateway.toml @@ -44,6 +44,7 @@ mime_types = [ [http.services.datagateway] [http.services.prometheus] [http.services.ocmd] +[http.services.ocmprovider] [http.services.ocdav] [http.services.ocs] [http.services.appprovider] diff --git a/examples/two-server-setup/gateway-1.toml b/examples/two-server-setup/gateway-1.toml index 912b24d043..4a6990a42a 100644 --- a/examples/two-server-setup/gateway-1.toml +++ b/examples/two-server-setup/gateway-1.toml @@ -54,6 +54,7 @@ address = "0.0.0.0:19001" [http.services.datagateway] [http.services.prometheus] [http.services.ocmd] +[http.services.ocmprovider] provider = "Reva-Server-1" endpoint = "http://localhost:19001" enable_webapp = true diff --git a/examples/two-server-setup/gateway-2.toml b/examples/two-server-setup/gateway-2.toml index 04186a7e5b..808ec4c9ed 100644 --- a/examples/two-server-setup/gateway-2.toml +++ b/examples/two-server-setup/gateway-2.toml @@ -69,6 +69,7 @@ address = "0.0.0.0:29001" [http.services.datagateway] [http.services.prometheus] [http.services.ocmd] +[http.services.ocmprovider] provider = "Reva-Server-2" endpoint = "http://localhost:29001" enable_webapp = true From e4e635ee4527c25b3970f4009c856dd888417cc3 Mon Sep 17 00:00:00 2001 From: Giuseppe Lo Presti Date: Wed, 10 May 2023 15:53:56 +0200 Subject: [PATCH 10/20] Linting --- internal/http/services/loader/loader.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/http/services/loader/loader.go b/internal/http/services/loader/loader.go index 02511a01bf..693264c157 100644 --- a/internal/http/services/loader/loader.go +++ b/internal/http/services/loader/loader.go @@ -29,8 +29,8 @@ import ( _ "github.com/cs3org/reva/internal/http/services/mentix" _ "github.com/cs3org/reva/internal/http/services/meshdirectory" _ "github.com/cs3org/reva/internal/http/services/metrics" - _ "github.com/cs3org/reva/internal/http/services/ocmprovider" _ "github.com/cs3org/reva/internal/http/services/ocmd" + _ "github.com/cs3org/reva/internal/http/services/ocmprovider" _ "github.com/cs3org/reva/internal/http/services/owncloud/ocdav" _ "github.com/cs3org/reva/internal/http/services/owncloud/ocs" _ "github.com/cs3org/reva/internal/http/services/preferences" From bbb687140dd97641fa893181abc7e06c9d10a54b Mon Sep 17 00:00:00 2001 From: Giuseppe Lo Presti Date: Wed, 10 May 2023 20:45:03 +0200 Subject: [PATCH 11/20] Simplified ocmprovider and documented config --- examples/nextcloud-integration/revad.toml | 2 +- .../http/services/ocmprovider/ocmprovider.go | 109 +++++++----------- 2 files changed, 42 insertions(+), 69 deletions(-) diff --git a/examples/nextcloud-integration/revad.toml b/examples/nextcloud-integration/revad.toml index de31cd8a7a..b37faacdc8 100644 --- a/examples/nextcloud-integration/revad.toml +++ b/examples/nextcloud-integration/revad.toml @@ -130,7 +130,7 @@ user_layout = "{{.Username}}" [http.services.ocmprovider] provider = "Reva-Nextcloud" endpoint = "http://localhost" -webdav_root = "/remote.php/dav" +webdav_root = "/remote.php/dav/ocm" enable_webapp = true enable_datatx = true diff --git a/internal/http/services/ocmprovider/ocmprovider.go b/internal/http/services/ocmprovider/ocmprovider.go index f0a7d9d007..b329c8702d 100644 --- a/internal/http/services/ocmprovider/ocmprovider.go +++ b/internal/http/services/ocmprovider/ocmprovider.go @@ -25,7 +25,6 @@ import ( "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/rhttp/global" - "github.com/go-chi/chi/v5" "github.com/mitchellh/mapstructure" "github.com/rs/zerolog" ) @@ -35,18 +34,13 @@ func init() { } type config struct { - OCMPrefix string `mapstructure:"ocm_prefix"` - Endpoint string `mapstructure:"endpoint"` - Provider string `mapstructure:"provider"` - WebDAVRoot string `mapstructure:"webdav_root"` - WebAppRoot string `mapstructure:"webapp_root"` - EnableWebApp bool `mapstructure:"enable_webapp"` - EnableDataTx bool `mapstructure:"enable_datatx"` -} - -type svc struct { - Conf *config - router chi.Router + OCMPrefix string `mapstructure:"ocm_prefix" docs:"ocm;The prefix URL where the OCM API is served."` + Endpoint string `mapstructure:"endpoint" docs:"http://localhost;This host's URL."` + Provider string `mapstructure:"provider" docs:"reva;A friendly name that defines this service."` + WebdavRoot string `mapstructure:"webdav_root" docs:"/remote.php/dav/ocm;The root URL of the WebDAV endpoint to serve OCM shares."` + WebappRoot string `mapstructure:"webapp_root" docs:"/external/sciencemesh;The root URL to serve Web apps via OCM."` + EnableWebapp bool `mapstructure:"enable_webapp" docs:"false;Whether web apps are enabled in OCM shares."` + EnableDatatx bool `mapstructure:"enable_datatx" docs:"false;Whether data transfers are enabled in OCM shares."` } type discoveryData struct { @@ -64,8 +58,9 @@ type resourceTypes struct { Protocols map[string]string `json:"protocols"` } -type discoHandler struct { - d discoveryData +type svc struct { + conf *config + d *discoveryData } func (c *config) init() { @@ -78,35 +73,38 @@ func (c *config) init() { if c.Provider == "" { c.Provider = "reva" } - if c.WebDAVRoot == "" { - c.WebDAVRoot = "remote.php/dav" + if c.WebdavRoot == "" { + c.WebdavRoot = "/remote.php/dav/ocm" } - if c.WebAppRoot == "" { - c.WebAppRoot = "external/sciencemesh" + if c.WebappRoot == "" { + c.WebappRoot = "/external/sciencemesh" } } -func (h *discoHandler) init(c *config) { - h.d.Enabled = true - h.d.APIVersion = "1.1.0" - h.d.Endpoint = fmt.Sprintf("%s/%s", c.Endpoint, c.OCMPrefix) - h.d.Provider = c.Provider +func (c *config) prepare() *discoveryData { + // generates the (static) data structure to be exposed by /ocm-provider + d := &discoveryData{} + d.Enabled = true + d.APIVersion = "1.1.0" + d.Endpoint = fmt.Sprintf("%s/%s", c.Endpoint, c.OCMPrefix) + d.Provider = c.Provider rtProtos := map[string]string{} // webdav is always enabled - rtProtos["webdav"] = fmt.Sprintf("%s/%s/%s", c.Endpoint, c.WebDAVRoot, c.OCMPrefix) - if c.EnableWebApp { - rtProtos["webapp"] = fmt.Sprintf("%s/%s", c.Endpoint, c.WebAppRoot) + rtProtos["webdav"] = fmt.Sprintf("%s%s", c.Endpoint, c.WebdavRoot) + if c.EnableWebapp { + rtProtos["webapp"] = fmt.Sprintf("%s%s", c.Endpoint, c.WebappRoot) } - if c.EnableDataTx { - rtProtos["datatx"] = fmt.Sprintf("%s/%s/%s", c.Endpoint, c.WebDAVRoot, c.OCMPrefix) + if c.EnableDatatx { + rtProtos["datatx"] = fmt.Sprintf("%s%s", c.Endpoint, c.WebdavRoot) } - h.d.ResourceTypes = []resourceTypes{{ + d.ResourceTypes = []resourceTypes{{ Name: "file", // so far we only support `file` ShareTypes: []string{"user"}, // so far we only support `user` Protocols: rtProtos, // expose the protocols as per configuration }} // for now we hardcode the capabilities, as this is currently only advisory - h.d.Capabilities = []string{"/invite-accepted"} + d.Capabilities = []string{"/invite-accepted"} + return d } // New returns a new ocmprovider object, that implements @@ -117,26 +115,12 @@ func New(m map[string]interface{}, log *zerolog.Logger) (global.Service, error) if err := mapstructure.Decode(m, conf); err != nil { return nil, err } - conf.init() - - r := chi.NewRouter() - s := &svc{ - Conf: conf, - router: r, - } - - if err := s.routerInit(); err != nil { - return nil, err - } - return s, nil -} - -func (s *svc) routerInit() error { - discoHandler := new(discoHandler) - discoHandler.init(s.Conf) - s.router.Get(".", discoHandler.Send) - return nil + conf.init() + return &svc{ + conf: conf, + d: conf.prepare(), + }, nil } // Close performs cleanup. @@ -150,28 +134,17 @@ func (s *svc) Prefix() string { } func (s *svc) Unprotected() []string { - return []string{"."} + return []string{"/"} } func (s *svc) Handler() http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log := appctx.GetLogger(r.Context()) - log.Debug().Str("path", r.URL.Path).Msg("ocm-provider routing") - - // unset raw path, otherwise chi may use it to route and then failto match percent encoded path segments - r.URL.RawPath = "" - s.router.ServeHTTP(w, r) + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + indented, _ := json.MarshalIndent(s.d, "", " ") + if _, err := w.Write(indented); err != nil { + log.Err(err).Msg("Error writing to ResponseWriter") + } }) } - -// Send sends the discovery info to the caller. -func (h *discoHandler) Send(w http.ResponseWriter, r *http.Request) { - log := appctx.GetLogger(r.Context()) - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - indentedConf, _ := json.MarshalIndent(h.d, "", " ") - if _, err := w.Write(indentedConf); err != nil { - log.Err(err).Msg("Error writing to ResponseWriter") - } -} From 50059d3d45b035dda8ef1714ee758d3e6fd98991 Mon Sep 17 00:00:00 2001 From: Giuseppe Lo Presti Date: Wed, 10 May 2023 21:29:05 +0200 Subject: [PATCH 12/20] Further simplification + relaunching the CI --- internal/http/services/ocmprovider/ocmprovider.go | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/internal/http/services/ocmprovider/ocmprovider.go b/internal/http/services/ocmprovider/ocmprovider.go index b329c8702d..fb5033da88 100644 --- a/internal/http/services/ocmprovider/ocmprovider.go +++ b/internal/http/services/ocmprovider/ocmprovider.go @@ -59,8 +59,7 @@ type resourceTypes struct { } type svc struct { - conf *config - d *discoveryData + data *discoveryData } func (c *config) init() { @@ -117,10 +116,7 @@ func New(m map[string]interface{}, log *zerolog.Logger) (global.Service, error) } conf.init() - return &svc{ - conf: conf, - d: conf.prepare(), - }, nil + return &svc{data: conf.prepare()}, nil } // Close performs cleanup. @@ -142,7 +138,7 @@ func (s *svc) Handler() http.Handler { log := appctx.GetLogger(r.Context()) w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) - indented, _ := json.MarshalIndent(s.d, "", " ") + indented, _ := json.MarshalIndent(s.data, "", " ") if _, err := w.Write(indented); err != nil { log.Err(err).Msg("Error writing to ResponseWriter") } From d2e9fa82772d1ce79efcfb165fb6f879fa83a7a2 Mon Sep 17 00:00:00 2001 From: Giuseppe Lo Presti Date: Wed, 10 May 2023 21:34:11 +0200 Subject: [PATCH 13/20] Regenerated docs --- .../http/services/ocmprovider/_index.md | 66 +++++++++++++++++++ .../http/services/owncloud/ocdav/_index.md | 2 +- .../packages/auth/manager/oidc/_index.md | 16 ++--- .../config/packages/cbox/group/rest/_index.md | 18 ++--- 4 files changed, 84 insertions(+), 18 deletions(-) create mode 100644 docs/content/en/docs/config/http/services/ocmprovider/_index.md diff --git a/docs/content/en/docs/config/http/services/ocmprovider/_index.md b/docs/content/en/docs/config/http/services/ocmprovider/_index.md new file mode 100644 index 0000000000..20e5938918 --- /dev/null +++ b/docs/content/en/docs/config/http/services/ocmprovider/_index.md @@ -0,0 +1,66 @@ +--- +title: "ocmprovider" +linkTitle: "ocmprovider" +weight: 10 +description: > + Configuration for the ocmprovider service +--- + +# _struct: config_ + +{{% dir name="ocm_prefix" type="string" default="ocm" %}} +The prefix URL where the OCM API is served. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/http/services/ocmprovider/ocmprovider.go#L37) +{{< highlight toml >}} +[http.services.ocmprovider] +ocm_prefix = "ocm" +{{< /highlight >}} +{{% /dir %}} + +{{% dir name="endpoint" type="string" default="http://localhost" %}} +This host's URL. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/http/services/ocmprovider/ocmprovider.go#L38) +{{< highlight toml >}} +[http.services.ocmprovider] +endpoint = "http://localhost" +{{< /highlight >}} +{{% /dir %}} + +{{% dir name="provider" type="string" default="reva" %}} +A friendly name that defines this service. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/http/services/ocmprovider/ocmprovider.go#L39) +{{< highlight toml >}} +[http.services.ocmprovider] +provider = "reva" +{{< /highlight >}} +{{% /dir %}} + +{{% dir name="webdav_root" type="string" default="/remote.php/dav/ocm" %}} +The root URL of the WebDAV endpoint to serve OCM shares. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/http/services/ocmprovider/ocmprovider.go#L40) +{{< highlight toml >}} +[http.services.ocmprovider] +webdav_root = "/remote.php/dav/ocm" +{{< /highlight >}} +{{% /dir %}} + +{{% dir name="webapp_root" type="string" default="/external/sciencemesh" %}} +The root URL to serve Web apps via OCM. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/http/services/ocmprovider/ocmprovider.go#L41) +{{< highlight toml >}} +[http.services.ocmprovider] +webapp_root = "/external/sciencemesh" +{{< /highlight >}} +{{% /dir %}} + +{{% dir name="enable_webapp" type="bool" default=false %}} +Whether web apps are enabled in OCM shares. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/http/services/ocmprovider/ocmprovider.go#L42) +{{< highlight toml >}} +[http.services.ocmprovider] +enable_webapp = false +{{< /highlight >}} +{{% /dir %}} + +{{% dir name="enable_datatx" type="bool" default=false %}} +Whether data transfers are enabled in OCM shares. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/http/services/ocmprovider/ocmprovider.go#L43) +{{< highlight toml >}} +[http.services.ocmprovider] +enable_datatx = false +{{< /highlight >}} +{{% /dir %}} + diff --git a/docs/content/en/docs/config/http/services/owncloud/ocdav/_index.md b/docs/content/en/docs/config/http/services/owncloud/ocdav/_index.md index 887d0acc24..edeb84444c 100644 --- a/docs/content/en/docs/config/http/services/owncloud/ocdav/_index.md +++ b/docs/content/en/docs/config/http/services/owncloud/ocdav/_index.md @@ -9,7 +9,7 @@ description: > # _struct: Config_ {{% dir name="insecure" type="bool" default=false %}} -Whether to skip certificate checks when sending requests. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/http/services/owncloud/ocdav/ocdav.go#L102) +Whether to skip certificate checks when sending requests. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/http/services/owncloud/ocdav/ocdav.go#L103) {{< highlight toml >}} [http.services.owncloud.ocdav] insecure = false diff --git a/docs/content/en/docs/config/packages/auth/manager/oidc/_index.md b/docs/content/en/docs/config/packages/auth/manager/oidc/_index.md index 758a8a14af..96d81c6d93 100644 --- a/docs/content/en/docs/config/packages/auth/manager/oidc/_index.md +++ b/docs/content/en/docs/config/packages/auth/manager/oidc/_index.md @@ -9,7 +9,7 @@ description: > # _struct: config_ {{% dir name="insecure" type="bool" default=false %}} -Whether to skip certificate checks when sending requests. [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/auth/manager/oidc/oidc.go#L61) +Whether to skip certificate checks when sending requests. [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/auth/manager/oidc/oidc.go#L63) {{< highlight toml >}} [auth.manager.oidc] insecure = false @@ -17,7 +17,7 @@ insecure = false {{% /dir %}} {{% dir name="issuer" type="string" default="" %}} -The issuer of the OIDC token. [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/auth/manager/oidc/oidc.go#L62) +The issuer of the OIDC token. [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/auth/manager/oidc/oidc.go#L64) {{< highlight toml >}} [auth.manager.oidc] issuer = "" @@ -25,7 +25,7 @@ issuer = "" {{% /dir %}} {{% dir name="id_claim" type="string" default="sub" %}} -The claim containing the ID of the user. [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/auth/manager/oidc/oidc.go#L63) +The claim containing the ID of the user. [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/auth/manager/oidc/oidc.go#L65) {{< highlight toml >}} [auth.manager.oidc] id_claim = "sub" @@ -33,7 +33,7 @@ id_claim = "sub" {{% /dir %}} {{% dir name="uid_claim" type="string" default="" %}} -The claim containing the UID of the user. [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/auth/manager/oidc/oidc.go#L64) +The claim containing the UID of the user. [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/auth/manager/oidc/oidc.go#L66) {{< highlight toml >}} [auth.manager.oidc] uid_claim = "" @@ -41,7 +41,7 @@ uid_claim = "" {{% /dir %}} {{% dir name="gid_claim" type="string" default="" %}} -The claim containing the GID of the user. [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/auth/manager/oidc/oidc.go#L65) +The claim containing the GID of the user. [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/auth/manager/oidc/oidc.go#L67) {{< highlight toml >}} [auth.manager.oidc] gid_claim = "" @@ -49,7 +49,7 @@ gid_claim = "" {{% /dir %}} {{% dir name="gatewaysvc" type="string" default="" %}} -The endpoint at which the GRPC gateway is exposed. [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/auth/manager/oidc/oidc.go#L66) +The endpoint at which the GRPC gateway is exposed. [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/auth/manager/oidc/oidc.go#L68) {{< highlight toml >}} [auth.manager.oidc] gatewaysvc = "" @@ -57,7 +57,7 @@ gatewaysvc = "" {{% /dir %}} {{% dir name="users_mapping" type="string" default="" %}} - The optional OIDC users mapping file path [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/auth/manager/oidc/oidc.go#L67) + The optional OIDC users mapping file path [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/auth/manager/oidc/oidc.go#L69) {{< highlight toml >}} [auth.manager.oidc] users_mapping = "" @@ -65,7 +65,7 @@ users_mapping = "" {{% /dir %}} {{% dir name="group_claim" type="string" default="" %}} - The group claim to be looked up to map the user (default to 'groups'). [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/auth/manager/oidc/oidc.go#L68) + The group claim to be looked up to map the user (default to 'groups'). [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/auth/manager/oidc/oidc.go#L70) {{< highlight toml >}} [auth.manager.oidc] group_claim = "" diff --git a/docs/content/en/docs/config/packages/cbox/group/rest/_index.md b/docs/content/en/docs/config/packages/cbox/group/rest/_index.md index 4f7bf6bd9a..36888b42b1 100644 --- a/docs/content/en/docs/config/packages/cbox/group/rest/_index.md +++ b/docs/content/en/docs/config/packages/cbox/group/rest/_index.md @@ -9,7 +9,7 @@ description: > # _struct: config_ {{% dir name="redis_address" type="string" default="localhost:6379" %}} -The address at which the redis server is running [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/cbox/group/rest/rest.go#L54) +The address at which the redis server is running [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/cbox/group/rest/rest.go#L56) {{< highlight toml >}} [cbox.group.rest] redis_address = "localhost:6379" @@ -17,7 +17,7 @@ redis_address = "localhost:6379" {{% /dir %}} {{% dir name="group_members_cache_expiration" type="int" default=5 %}} -The time in minutes for which the members of a group would be cached [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/cbox/group/rest/rest.go#L60) +The time in minutes for which the members of a group would be cached [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/cbox/group/rest/rest.go#L62) {{< highlight toml >}} [cbox.group.rest] group_members_cache_expiration = 5 @@ -25,7 +25,7 @@ group_members_cache_expiration = 5 {{% /dir %}} {{% dir name="id_provider" type="string" default="http://cernbox.cern.ch" %}} -The OIDC Provider [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/cbox/group/rest/rest.go#L62) +The OIDC Provider [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/cbox/group/rest/rest.go#L64) {{< highlight toml >}} [cbox.group.rest] id_provider = "http://cernbox.cern.ch" @@ -33,7 +33,7 @@ id_provider = "http://cernbox.cern.ch" {{% /dir %}} {{% dir name="api_base_url" type="string" default="https://authorization-service-api-dev.web.cern.ch" %}} -Base API Endpoint [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/cbox/group/rest/rest.go#L64) +Base API Endpoint [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/cbox/group/rest/rest.go#L66) {{< highlight toml >}} [cbox.group.rest] api_base_url = "https://authorization-service-api-dev.web.cern.ch" @@ -41,7 +41,7 @@ api_base_url = "https://authorization-service-api-dev.web.cern.ch" {{% /dir %}} {{% dir name="client_id" type="string" default="-" %}} -Client ID needed to authenticate [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/cbox/group/rest/rest.go#L66) +Client ID needed to authenticate [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/cbox/group/rest/rest.go#L68) {{< highlight toml >}} [cbox.group.rest] client_id = "-" @@ -49,7 +49,7 @@ client_id = "-" {{% /dir %}} {{% dir name="client_secret" type="string" default="-" %}} -Client Secret [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/cbox/group/rest/rest.go#L68) +Client Secret [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/cbox/group/rest/rest.go#L70) {{< highlight toml >}} [cbox.group.rest] client_secret = "-" @@ -57,7 +57,7 @@ client_secret = "-" {{% /dir %}} {{% dir name="oidc_token_endpoint" type="string" default="https://keycloak-dev.cern.ch/auth/realms/cern/api-access/token" %}} -Endpoint to generate token to access the API [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/cbox/group/rest/rest.go#L71) +Endpoint to generate token to access the API [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/cbox/group/rest/rest.go#L73) {{< highlight toml >}} [cbox.group.rest] oidc_token_endpoint = "https://keycloak-dev.cern.ch/auth/realms/cern/api-access/token" @@ -65,7 +65,7 @@ oidc_token_endpoint = "https://keycloak-dev.cern.ch/auth/realms/cern/api-access/ {{% /dir %}} {{% dir name="target_api" type="string" default="authorization-service-api" %}} -The target application for which token needs to be generated [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/cbox/group/rest/rest.go#L73) +The target application for which token needs to be generated [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/cbox/group/rest/rest.go#L75) {{< highlight toml >}} [cbox.group.rest] target_api = "authorization-service-api" @@ -73,7 +73,7 @@ target_api = "authorization-service-api" {{% /dir %}} {{% dir name="group_fetch_interval" type="int" default=3600 %}} -The time in seconds between bulk fetch of groups [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/cbox/group/rest/rest.go#L75) +The time in seconds between bulk fetch of groups [[Ref]](https://github.com/cs3org/reva/tree/master/pkg/cbox/group/rest/rest.go#L77) {{< highlight toml >}} [cbox.group.rest] group_fetch_interval = 3600 From 726557efb328445ed5c56eba7bb8e383578e11bb Mon Sep 17 00:00:00 2001 From: Giuseppe Lo Presti Date: Thu, 11 May 2023 09:00:07 +0200 Subject: [PATCH 14/20] Expose OCM as disabled if no endpoint is configured for it --- .../http/services/ocmprovider/ocmprovider.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/internal/http/services/ocmprovider/ocmprovider.go b/internal/http/services/ocmprovider/ocmprovider.go index fb5033da88..a88f9e52a0 100644 --- a/internal/http/services/ocmprovider/ocmprovider.go +++ b/internal/http/services/ocmprovider/ocmprovider.go @@ -35,7 +35,7 @@ func init() { type config struct { OCMPrefix string `mapstructure:"ocm_prefix" docs:"ocm;The prefix URL where the OCM API is served."` - Endpoint string `mapstructure:"endpoint" docs:"http://localhost;This host's URL."` + Endpoint string `mapstructure:"endpoint" docs:"This host's URL. If it's not configured, it is assumed OCM is not available."` Provider string `mapstructure:"provider" docs:"reva;A friendly name that defines this service."` WebdavRoot string `mapstructure:"webdav_root" docs:"/remote.php/dav/ocm;The root URL of the WebDAV endpoint to serve OCM shares."` WebappRoot string `mapstructure:"webapp_root" docs:"/external/sciencemesh;The root URL to serve Web apps via OCM."` @@ -66,9 +66,6 @@ func (c *config) init() { if c.OCMPrefix == "" { c.OCMPrefix = "ocm" } - if c.Endpoint == "" { - c.Endpoint = "http://localhost" - } if c.Provider == "" { c.Provider = "reva" } @@ -83,6 +80,19 @@ func (c *config) init() { func (c *config) prepare() *discoveryData { // generates the (static) data structure to be exposed by /ocm-provider d := &discoveryData{} + if c.Endpoint == "" { + d.Enabled = false + d.Endpoint = "" + d.APIVersion = "1.1.0" + d.Provider = c.Provider + d.ResourceTypes = []resourceTypes{{ + Name: "file", + ShareTypes: []string{}, + Protocols: map[string]string{}, + }} + d.Capabilities = []string{} + return d + } d.Enabled = true d.APIVersion = "1.1.0" d.Endpoint = fmt.Sprintf("%s/%s", c.Endpoint, c.OCMPrefix) From ba223eee0a044b3e52c05f5bbfd0e88cff937fe6 Mon Sep 17 00:00:00 2001 From: Gianmaria Del Monte <39946305+gmgigi96@users.noreply.github.com> Date: Thu, 11 May 2023 10:20:01 +0200 Subject: [PATCH 15/20] Update internal/http/services/owncloud/ocdav/propfind.go Co-authored-by: Giuseppe Lo Presti --- internal/http/services/owncloud/ocdav/propfind.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/http/services/owncloud/ocdav/propfind.go b/internal/http/services/owncloud/ocdav/propfind.go index b37fb0bebe..5104f10b09 100644 --- a/internal/http/services/owncloud/ocdav/propfind.go +++ b/internal/http/services/owncloud/ocdav/propfind.go @@ -521,7 +521,7 @@ func (s *svc) mdToPropResponse(ctx context.Context, pf *propfindXML, md *provide baseURI := ctx.Value(ctxKeyBaseURI).(string) - fixForOldOCM(ctx, md) + supportLegacyOCMAccess(ctx, md) ref := path.Join(baseURI, md.Path) if md.Type == provider.ResourceType_RESOURCE_TYPE_CONTAINER { ref += "/" From bc219e9b6ca7ed142e9eea69253a7c0590a2edac Mon Sep 17 00:00:00 2001 From: Gianmaria Del Monte <39946305+gmgigi96@users.noreply.github.com> Date: Thu, 11 May 2023 10:20:19 +0200 Subject: [PATCH 16/20] Update internal/http/services/owncloud/ocdav/dav.go Co-authored-by: Giuseppe Lo Presti --- internal/http/services/owncloud/ocdav/dav.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/http/services/owncloud/ocdav/dav.go b/internal/http/services/owncloud/ocdav/dav.go index 5c85222df8..a7560149a0 100644 --- a/internal/http/services/owncloud/ocdav/dav.go +++ b/internal/http/services/owncloud/ocdav/dav.go @@ -196,7 +196,7 @@ func (h *DavHandler) Handler(s *svc) http.Handler { // OCM 1.0 token = username r.URL.Path, _ = url.JoinPath("/", token, r.URL.Path) - ctx = context.WithValue(ctx, ctxOldVersionOCM, true) + ctx = context.WithValue(ctx, ctxOCM10, true) } else { token, _ = router.ShiftPath(r.URL.Path) ctx = context.WithValue(ctx, ctxOldVersionOCM, false) From d6bf23a35837fdf0b70b9b69a1a6e55f73b1a0c2 Mon Sep 17 00:00:00 2001 From: Gianmaria Del Monte <39946305+gmgigi96@users.noreply.github.com> Date: Thu, 11 May 2023 10:20:26 +0200 Subject: [PATCH 17/20] Update internal/http/services/owncloud/ocdav/dav.go Co-authored-by: Giuseppe Lo Presti --- internal/http/services/owncloud/ocdav/dav.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/http/services/owncloud/ocdav/dav.go b/internal/http/services/owncloud/ocdav/dav.go index a7560149a0..ca42666023 100644 --- a/internal/http/services/owncloud/ocdav/dav.go +++ b/internal/http/services/owncloud/ocdav/dav.go @@ -199,7 +199,7 @@ func (h *DavHandler) Handler(s *svc) http.Handler { ctx = context.WithValue(ctx, ctxOCM10, true) } else { token, _ = router.ShiftPath(r.URL.Path) - ctx = context.WithValue(ctx, ctxOldVersionOCM, false) + ctx = context.WithValue(ctx, ctxOCM10, false) } authRes, err := handleOCMAuth(ctx, c, token) From ec3c5db07e46358dbf136eb195962ce7ba8aa17c Mon Sep 17 00:00:00 2001 From: Gianmaria Del Monte <39946305+gmgigi96@users.noreply.github.com> Date: Thu, 11 May 2023 10:20:51 +0200 Subject: [PATCH 18/20] Update internal/http/services/owncloud/ocdav/ocdav.go Co-authored-by: Giuseppe Lo Presti --- internal/http/services/owncloud/ocdav/ocdav.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/http/services/owncloud/ocdav/ocdav.go b/internal/http/services/owncloud/ocdav/ocdav.go index 6b9670f331..4c029c6560 100644 --- a/internal/http/services/owncloud/ocdav/ocdav.go +++ b/internal/http/services/owncloud/ocdav/ocdav.go @@ -50,7 +50,7 @@ type ctxKey int const ( ctxKeyBaseURI ctxKey = iota - ctxOldVersionOCM + ctxOCM10 ) var ( From 8b5d2514e73f695307589b68ba958faa6188b29d Mon Sep 17 00:00:00 2001 From: Gianmaria Del Monte <39946305+gmgigi96@users.noreply.github.com> Date: Thu, 11 May 2023 10:20:59 +0200 Subject: [PATCH 19/20] Update internal/http/services/owncloud/ocdav/propfind.go Co-authored-by: Giuseppe Lo Presti --- internal/http/services/owncloud/ocdav/propfind.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/http/services/owncloud/ocdav/propfind.go b/internal/http/services/owncloud/ocdav/propfind.go index 5104f10b09..9e076dbb21 100644 --- a/internal/http/services/owncloud/ocdav/propfind.go +++ b/internal/http/services/owncloud/ocdav/propfind.go @@ -502,9 +502,9 @@ func (s *svc) newPropRaw(key, val string) *propertyXML { } } -func fixForOldOCM(ctx context.Context, md *provider.ResourceInfo) { - oldOCM := ctx.Value(ctxOldVersionOCM).(bool) - if oldOCM { +func supportLegacyOCMAccess(ctx context.Context, md *provider.ResourceInfo) { + ocm10 := ctx.Value(ctxOCM10).(bool) + if ocm10 { // the path is something like //... // we need to strip the token part as this // is passed as username in the basic auth From ca75c78f1c05b90aaa15d2711e8757bf2bfcab62 Mon Sep 17 00:00:00 2001 From: Gianmaria Del Monte Date: Thu, 11 May 2023 14:28:29 +0200 Subject: [PATCH 20/20] fix support legacy ocm access --- internal/http/services/owncloud/ocdav/propfind.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/http/services/owncloud/ocdav/propfind.go b/internal/http/services/owncloud/ocdav/propfind.go index 9e076dbb21..fda9e06e17 100644 --- a/internal/http/services/owncloud/ocdav/propfind.go +++ b/internal/http/services/owncloud/ocdav/propfind.go @@ -503,7 +503,7 @@ func (s *svc) newPropRaw(key, val string) *propertyXML { } func supportLegacyOCMAccess(ctx context.Context, md *provider.ResourceInfo) { - ocm10 := ctx.Value(ctxOCM10).(bool) + ocm10, _ := ctx.Value(ctxOCM10).(bool) if ocm10 { // the path is something like //... // we need to strip the token part as this