diff --git a/changelog/1.18.0_2022-02-11/ocs-user-data.md b/changelog/1.18.0_2022-02-11/ocs-user-data.md deleted file mode 100644 index 7892d4c4ea7..00000000000 --- a/changelog/1.18.0_2022-02-11/ocs-user-data.md +++ /dev/null @@ -1,3 +0,0 @@ -Enhancement: Populate owner data in the ocs and ocdav services - -https://github.com/cs3org/reva/pull/2233 \ No newline at end of file diff --git a/internal/http/services/owncloud/ocdav/ocdav.go b/internal/http/services/owncloud/ocdav/ocdav.go index 40913d8aa0e..dfccaa2c6ba 100644 --- a/internal/http/services/owncloud/ocdav/ocdav.go +++ b/internal/http/services/owncloud/ocdav/ocdav.go @@ -28,7 +28,6 @@ import ( "strings" "time" - "github.com/ReneKroon/ttlcache/v2" gateway "github.com/cs3org/go-cs3apis/cs3/gateway/v1beta1" userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" "github.com/cs3org/reva/pkg/appctx" @@ -117,12 +116,11 @@ func (c *Config) init() { } type svc struct { - c *Config - webDavHandler *WebDavHandler - davHandler *DavHandler - favoritesManager favorite.Manager - client *http.Client - userIdentifierCache *ttlcache.Cache + c *Config + webDavHandler *WebDavHandler + davHandler *DavHandler + favoritesManager favorite.Manager + client *http.Client } func getFavoritesManager(c *Config) (favorite.Manager, error) { @@ -154,11 +152,8 @@ func New(m map[string]interface{}, log *zerolog.Logger) (global.Service, error) rhttp.Timeout(time.Duration(conf.Timeout*int64(time.Second))), rhttp.Insecure(conf.Insecure), ), - favoritesManager: fm, - userIdentifierCache: ttlcache.NewCache(), + favoritesManager: fm, } - _ = s.userIdentifierCache.SetTTL(60 * time.Second) - // initialize handlers and set default configs if err := s.webDavHandler.init(conf.WebdavNamespace, true); err != nil { return nil, err diff --git a/internal/http/services/owncloud/ocdav/propfind.go b/internal/http/services/owncloud/ocdav/propfind.go index 4cc88ef9708..e5e69cb5379 100644 --- a/internal/http/services/owncloud/ocdav/propfind.go +++ b/internal/http/services/owncloud/ocdav/propfind.go @@ -41,7 +41,6 @@ import ( "github.com/cs3org/reva/internal/http/services/owncloud/ocs/conversions" "github.com/cs3org/reva/pkg/appctx" ctxpkg "github.com/cs3org/reva/pkg/ctx" - "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/publicshare" rtrace "github.com/cs3org/reva/pkg/trace" "github.com/cs3org/reva/pkg/utils" @@ -643,13 +642,6 @@ func (s *svc) mdToPropResponse(ctx context.Context, pf *propfindXML, md *provide // TODO return other properties ... but how do we put them in a namespace? } else { // otherwise return only the requested properties - var ownerUsername, ownerDisplayName string - owner, err := s.getOwnerInfo(ctx, md.Owner) - if err == nil { - ownerUsername = owner.Username - ownerDisplayName = owner.DisplayName - } - for i := range pf.Prop { switch pf.Prop[i].Space { case _nsOwncloud: @@ -739,8 +731,14 @@ func (s *svc) mdToPropResponse(ctx context.Context, pf *propfindXML, md *provide propstatNotFound.Prop = append(propstatNotFound.Prop, s.newProp("oc:size", "")) } case "owner-id": // phoenix only - if ownerUsername != "" { - propstatOK.Prop = append(propstatOK.Prop, s.newProp("oc:owner-id", ownerUsername)) + if md.Owner != nil { + if isCurrentUserOwner(ctx, md.Owner) { + u := ctxpkg.ContextMustGetUser(ctx) + propstatOK.Prop = append(propstatOK.Prop, s.newProp("oc:owner-id", u.Username)) + } else { + sublog.Debug().Msg("TODO fetch user username") + propstatNotFound.Prop = append(propstatNotFound.Prop, s.newProp("oc:owner-id", "")) + } } else { propstatNotFound.Prop = append(propstatNotFound.Prop, s.newProp("oc:owner-id", "")) } @@ -818,8 +816,14 @@ func (s *svc) mdToPropResponse(ctx context.Context, pf *propfindXML, md *provide propstatNotFound.Prop = append(propstatNotFound.Prop, s.newProp("oc:"+pf.Prop[i].Local, "")) } case "owner-display-name": // phoenix only - if ownerDisplayName != "" { - propstatOK.Prop = append(propstatOK.Prop, s.newProp("oc:owner-display-name", ownerDisplayName)) + if md.Owner != nil { + if isCurrentUserOwner(ctx, md.Owner) { + u := ctxpkg.ContextMustGetUser(ctx) + propstatOK.Prop = append(propstatOK.Prop, s.newProp("oc:owner-display-name", u.DisplayName)) + } else { + sublog.Debug().Msg("TODO fetch user displayname") + propstatNotFound.Prop = append(propstatNotFound.Prop, s.newProp("oc:owner-display-name", "")) + } } else { propstatNotFound.Prop = append(propstatNotFound.Prop, s.newProp("oc:owner-display-name", "")) } @@ -993,44 +997,6 @@ func quoteEtag(etag string) string { return `"` + strings.Trim(etag, `"`) + `"` } -func (s *svc) getOwnerInfo(ctx context.Context, owner *userv1beta1.UserId) (*userv1beta1.User, error) { - if owner == nil { - return nil, errtypes.NotFound("owner is nil") - } - - if isCurrentUserOwner(ctx, owner) { - return ctxpkg.ContextMustGetUser(ctx), nil - } - - log := appctx.GetLogger(ctx) - if idIf, err := s.userIdentifierCache.Get(owner.OpaqueId); err == nil { - log.Debug().Msg("cache hit") - return idIf.(*userv1beta1.User), nil - } - - client, err := s.getClient() - if err != nil { - log.Error().Err(err).Msg("error getting grpc client") - return nil, err - } - - res, err := client.GetUser(ctx, &userv1beta1.GetUserRequest{UserId: owner}) - if err != nil { - log.Err(err).Msg("could not look up user") - return nil, err - } - if res.GetStatus().GetCode() != rpc.Code_CODE_OK { - log.Err(err).Msg("get user call failed") - return nil, err - } - if res.User == nil { - log.Debug().Msg("user not found") - return nil, err - } - _ = s.userIdentifierCache.Set(owner.OpaqueId, res.User) - return res.User, nil -} - // a file is only yours if you are the owner func isCurrentUserOwner(ctx context.Context, owner *userv1beta1.UserId) bool { contextUser, ok := ctxpkg.ContextGetUser(ctx) diff --git a/internal/http/services/owncloud/ocs/handlers/cloud/users/users.go b/internal/http/services/owncloud/ocs/handlers/cloud/users/users.go index 015e7076282..dda3e4be8d2 100644 --- a/internal/http/services/owncloud/ocs/handlers/cloud/users/users.go +++ b/internal/http/services/owncloud/ocs/handlers/cloud/users/users.go @@ -49,22 +49,7 @@ func (h *Handler) Init(c *config.Config) { // GetGroups handles GET requests on /cloud/users/groups // TODO: implement func (h *Handler) GetGroups(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - user := chi.URLParam(r, "userid") - // FIXME use ldap to fetch user info - u, ok := ctxpkg.ContextGetUser(ctx) - if !ok { - response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "missing user in context", fmt.Errorf("missing user in context")) - return - } - if user != u.Username { - // FIXME allow fetching other users info? only for admins - response.WriteOCSError(w, r, http.StatusForbidden, "user id mismatch", fmt.Errorf("%s tried to access %s user info endpoint", u.Id.OpaqueId, user)) - return - } - - response.WriteOCSSuccess(w, r, &Groups{Groups: u.Groups}) + response.WriteOCSSuccess(w, r, &Groups{}) } // Quota holds quota information