From 192974e159cd6ebf4f8f70c2666964231592c6ed Mon Sep 17 00:00:00 2001 From: Gianmaria Del Monte Date: Tue, 4 Oct 2022 10:30:47 +0200 Subject: [PATCH] add option to hide public shares --- cmd/reva/public-share-create.go | 2 + go.mod | 1 + go.sum | 4 +- .../publicshareprovider.go | 2 +- .../handlers/apps/sharing/shares/public.go | 3 + pkg/cbox/publicshare/sql/sql.go | 71 ++++--------------- pkg/publicshare/manager/json/json.go | 2 +- pkg/publicshare/manager/memory/memory.go | 2 +- pkg/publicshare/publicshare.go | 2 +- 9 files changed, 27 insertions(+), 62 deletions(-) diff --git a/cmd/reva/public-share-create.go b/cmd/reva/public-share-create.go index 77b8126e51a..3fa63d97fbb 100644 --- a/cmd/reva/public-share-create.go +++ b/cmd/reva/public-share-create.go @@ -36,6 +36,7 @@ func publicShareCreateCommand() *command { cmd.Usage = func() string { return "Usage: public-share-create [-flags] " } rol := cmd.String("rol", "viewer", "the permission for the share (viewer or editor)") description := cmd.String("description", "", "the description for the share") + internal := cmd.Bool("internal", false, "mark the public share as internal") cmd.ResetFlags = func() { *rol, *description = "viewer", "" @@ -80,6 +81,7 @@ func publicShareCreateCommand() *command { ResourceInfo: res.Info, Grant: grant, Description: *description, + Internal: *internal, } shareRes, err := client.CreatePublicShare(ctx, shareRequest) diff --git a/go.mod b/go.mod index de6c5be3578..0784dd12b9a 100644 --- a/go.mod +++ b/go.mod @@ -86,6 +86,7 @@ require ( go 1.16 replace ( + github.com/cs3org/go-cs3apis => github.com/gmgigi96/go-cs3apis v0.0.0-20221004074314-b2292f6a794c github.com/eventials/go-tus => github.com/andrewmostello/go-tus v0.0.0-20200314041820-904a9904af9a github.com/oleiade/reflections => github.com/oleiade/reflections v1.0.1 ) diff --git a/go.sum b/go.sum index 091d23fa39c..05700557dd9 100644 --- a/go.sum +++ b/go.sum @@ -224,8 +224,6 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e h1:tqSPWQeueWTKnJVMJffz4pz0o1WuQxJ28+5x5JgaHD8= github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e/go.mod h1:XJEZ3/EQuI3BXTp/6DUzFr850vlxq11I6satRtz0YQ4= -github.com/cs3org/go-cs3apis v0.0.0-20220930140901-5777bc1ccfaa h1:MDbQLEHxlgEB9Xca1NKMqKR4c1r5S94SoP5hEkWLPC8= -github.com/cs3org/go-cs3apis v0.0.0-20220930140901-5777bc1ccfaa/go.mod h1:UXha4TguuB52H14EMoSsCqDj7k8a/t7g4gVP+bgY5LY= github.com/cubewise-code/go-mime v0.0.0-20200519001935-8c5762b177d8 h1:Z9lwXumT5ACSmJ7WGnFl+OMLLjpz5uR2fyz7dC255FI= github.com/cubewise-code/go-mime v0.0.0-20200519001935-8c5762b177d8/go.mod h1:4abs/jPXcmJzYoYGF91JF9Uq9s/KL5n1jvFDix8KcqY= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= @@ -283,6 +281,8 @@ github.com/gdexlab/go-render v1.0.1/go.mod h1:wRi5nW2qfjiGj4mPukH4UV0IknS1cHD4Vg github.com/getkin/kin-openapi v0.13.0/go.mod h1:WGRs2ZMM1Q8LR1QBEwUxC6RJEfaBcD0s+pcEVXFuAjw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/gmgigi96/go-cs3apis v0.0.0-20221004074314-b2292f6a794c h1:mC9jwnDK3weg0S3md2euO0iIvlD33JE/MsFQGaZ/zX0= +github.com/gmgigi96/go-cs3apis v0.0.0-20221004074314-b2292f6a794c/go.mod h1:UXha4TguuB52H14EMoSsCqDj7k8a/t7g4gVP+bgY5LY= github.com/go-acme/lego/v4 v4.4.0/go.mod h1:l3+tFUFZb590dWcqhWZegynUthtaHJbG2fevUpoOOE0= github.com/go-asn1-ber/asn1-ber v1.5.4 h1:vXT6d/FNDiELJnLb6hGNa309LMsrCoYFvpwHDF0+Y1A= github.com/go-asn1-ber/asn1-ber v1.5.4/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= diff --git a/internal/grpc/services/publicshareprovider/publicshareprovider.go b/internal/grpc/services/publicshareprovider/publicshareprovider.go index 03cf855694c..b43a2bf22e7 100644 --- a/internal/grpc/services/publicshareprovider/publicshareprovider.go +++ b/internal/grpc/services/publicshareprovider/publicshareprovider.go @@ -146,7 +146,7 @@ func (s *service) CreatePublicShare(ctx context.Context, req *link.CreatePublicS log.Error().Msg("error getting user from context") } - share, err := s.sm.CreatePublicShare(ctx, u, req.ResourceInfo, req.Grant, req.Description) + share, err := s.sm.CreatePublicShare(ctx, u, req.ResourceInfo, req.Grant, req.Description, req.Internal) if err != nil { log.Debug().Err(err).Str("createShare", "shares").Msg("error connecting to storage provider") } diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/public.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/public.go index a1b05922e1b..917a6d9d182 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/public.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/public.go @@ -110,6 +110,8 @@ func (h *Handler) createPublicLinkShare(w http.ResponseWriter, r *http.Request, newPermissions = conversions.RoleFromOCSPermissions(permissions).CS3ResourcePermissions() } + internal, _ := strconv.ParseBool(r.FormValue("internal")) + req := link.CreatePublicShareRequest{ ResourceInfo: statInfo, Grant: &link.Grant{ @@ -119,6 +121,7 @@ func (h *Handler) createPublicLinkShare(w http.ResponseWriter, r *http.Request, Password: r.FormValue("password"), }, Description: r.FormValue("description"), + Internal: internal, } expireTimeString, ok := r.Form["expireDate"] diff --git a/pkg/cbox/publicshare/sql/sql.go b/pkg/cbox/publicshare/sql/sql.go index ce85c383b06..b7aa9c36c28 100644 --- a/pkg/cbox/publicshare/sql/sql.go +++ b/pkg/cbox/publicshare/sql/sql.go @@ -60,25 +60,20 @@ func init() { } type config struct { - SharePasswordHashCost int `mapstructure:"password_hash_cost"` - JanitorRunInterval int `mapstructure:"janitor_run_interval"` - EnableExpiredSharesCleanup bool `mapstructure:"enable_expired_shares_cleanup"` - DbUsername string `mapstructure:"db_username"` - DbPassword string `mapstructure:"db_password"` - DbHost string `mapstructure:"db_host"` - DbPort int `mapstructure:"db_port"` - DbName string `mapstructure:"db_name"` - GatewaySvc string `mapstructure:"gatewaysvc"` - HiddenTags []string `mapstructure:"hidden_tags"` + SharePasswordHashCost int `mapstructure:"password_hash_cost"` + JanitorRunInterval int `mapstructure:"janitor_run_interval"` + EnableExpiredSharesCleanup bool `mapstructure:"enable_expired_shares_cleanup"` + DbUsername string `mapstructure:"db_username"` + DbPassword string `mapstructure:"db_password"` + DbHost string `mapstructure:"db_host"` + DbPort int `mapstructure:"db_port"` + DbName string `mapstructure:"db_name"` + GatewaySvc string `mapstructure:"gatewaysvc"` } type manager struct { - c *config - db *sql.DB - hiddenTags struct { - query string - params []interface{} - } + c *config + db *sql.DB } func (c *config) init() { @@ -124,43 +119,16 @@ func New(m map[string]interface{}) (publicshare.Manager, error) { return nil, err } - hdnQuery, hdnParams := hiddenTagsQuery(c.HiddenTags) - mgr := manager{ c: c, db: db, - hiddenTags: struct { - query string - params []interface{} - }{ - query: hdnQuery, - params: hdnParams, - }, } go mgr.startJanitorRun() return &mgr, nil } -func hiddenTagsQuery(hiddenTags []string) (string, []interface{}) { - query := "" - for range hiddenTags { - query += "?," - } - if query != "" { - // remove last , - query = query[:len(query)-1] - } - - params := make([]interface{}, 0, len(hiddenTags)) - for _, t := range hiddenTags { - params = append(params, t) - } - query = fmt.Sprintf(" AND description NOT IN (%s)", query) - return query, params -} - -func (m *manager) CreatePublicShare(ctx context.Context, u *user.User, rInfo *provider.ResourceInfo, g *link.Grant, description string) (*link.PublicShare, error) { +func (m *manager) CreatePublicShare(ctx context.Context, u *user.User, rInfo *provider.ResourceInfo, g *link.Grant, description string, internal bool) (*link.PublicShare, error) { tkn := utils.RandString(15) now := time.Now().Unix() @@ -188,8 +156,8 @@ func (m *manager) CreatePublicShare(ctx context.Context, u *user.User, rInfo *pr fileSource = 0 } - query := "insert into oc_share set share_type=?,uid_owner=?,uid_initiator=?,item_type=?,fileid_prefix=?,item_source=?,file_source=?,permissions=?,stime=?,token=?,share_name=?,quicklink=?,description=?" - params := []interface{}{publicShareType, owner, creator, itemType, prefix, itemSource, fileSource, permissions, now, tkn, displayName, quicklink, description} + query := "insert into oc_share set share_type=?,uid_owner=?,uid_initiator=?,item_type=?,fileid_prefix=?,item_source=?,file_source=?,permissions=?,stime=?,token=?,share_name=?,quicklink=?,description=?,internal=?" + params := []interface{}{publicShareType, owner, creator, itemType, prefix, itemSource, fileSource, permissions, now, tkn, displayName, quicklink, description, internal} var passwordProtected bool password := g.Password @@ -358,15 +326,8 @@ func (m *manager) GetPublicShare(ctx context.Context, u *user.User, ref *link.Pu return s, nil } -func (m *manager) filterHiddenTagsQuery(query *string, params *[]interface{}) { - if len(m.hiddenTags.params) != 0 { - *query += m.hiddenTags.query - *params = append(*params, m.hiddenTags.params...) - } -} - func (m *manager) ListPublicShares(ctx context.Context, u *user.User, filters []*link.ListPublicSharesRequest_Filter, md *provider.ResourceInfo, sign bool) ([]*link.PublicShare, error) { - query := "select coalesce(uid_owner, '') as uid_owner, coalesce(uid_initiator, '') as uid_initiator, coalesce(share_with, '') as share_with, coalesce(fileid_prefix, '') as fileid_prefix, coalesce(item_source, '') as item_source, coalesce(item_type, '') as item_type, coalesce(token,'') as token, coalesce(expiration, '') as expiration, coalesce(share_name, '') as share_name, id, stime, permissions, quicklink, description FROM oc_share WHERE (orphan = 0 or orphan IS NULL) AND (share_type=?)" + query := "select coalesce(uid_owner, '') as uid_owner, coalesce(uid_initiator, '') as uid_initiator, coalesce(share_with, '') as share_with, coalesce(fileid_prefix, '') as fileid_prefix, coalesce(item_source, '') as item_source, coalesce(item_type, '') as item_type, coalesce(token,'') as token, coalesce(expiration, '') as expiration, coalesce(share_name, '') as share_name, id, stime, permissions, quicklink, description FROM oc_share WHERE (orphan = 0 or orphan IS NULL) AND (share_type=?) AND internal=false" var resourceFilters, ownerFilters, creatorFilters string var resourceParams, ownerParams, creatorParams []interface{} params := []interface{}{publicShareType} @@ -415,8 +376,6 @@ func (m *manager) ListPublicShares(ctx context.Context, u *user.User, filters [] query = fmt.Sprintf("%s AND (%s)", query, uidOwnersQuery) } - m.filterHiddenTagsQuery(&query, ¶ms) - rows, err := m.db.Query(query, params...) if err != nil { return nil, err diff --git a/pkg/publicshare/manager/json/json.go b/pkg/publicshare/manager/json/json.go index 24bc67e0a51..e0c537eac6a 100644 --- a/pkg/publicshare/manager/json/json.go +++ b/pkg/publicshare/manager/json/json.go @@ -140,7 +140,7 @@ func (m *manager) startJanitorRun() { } // CreatePublicShare adds a new entry to manager.shares -func (m *manager) CreatePublicShare(ctx context.Context, u *user.User, rInfo *provider.ResourceInfo, g *link.Grant, description string) (*link.PublicShare, error) { +func (m *manager) CreatePublicShare(ctx context.Context, u *user.User, rInfo *provider.ResourceInfo, g *link.Grant, description string, internal bool) (*link.PublicShare, error) { id := &link.PublicShareId{ OpaqueId: utils.RandString(15), } diff --git a/pkg/publicshare/manager/memory/memory.go b/pkg/publicshare/manager/memory/memory.go index 49aa7fb9400..d298fa8efaa 100644 --- a/pkg/publicshare/manager/memory/memory.go +++ b/pkg/publicshare/manager/memory/memory.go @@ -58,7 +58,7 @@ var ( ) // CreatePublicShare adds a new entry to manager.shares -func (m *manager) CreatePublicShare(ctx context.Context, u *user.User, rInfo *provider.ResourceInfo, g *link.Grant, description string) (*link.PublicShare, error) { +func (m *manager) CreatePublicShare(ctx context.Context, u *user.User, rInfo *provider.ResourceInfo, g *link.Grant, description string, internal bool) (*link.PublicShare, error) { id := &link.PublicShareId{ OpaqueId: randString(15), } diff --git a/pkg/publicshare/publicshare.go b/pkg/publicshare/publicshare.go index 8fbb17046d7..a5fb0847e2a 100644 --- a/pkg/publicshare/publicshare.go +++ b/pkg/publicshare/publicshare.go @@ -35,7 +35,7 @@ import ( // Manager manipulates public shares. type Manager interface { - CreatePublicShare(ctx context.Context, u *user.User, md *provider.ResourceInfo, g *link.Grant, description string) (*link.PublicShare, error) + CreatePublicShare(ctx context.Context, u *user.User, md *provider.ResourceInfo, g *link.Grant, description string, internal bool) (*link.PublicShare, error) UpdatePublicShare(ctx context.Context, u *user.User, req *link.UpdatePublicShareRequest, g *link.Grant) (*link.PublicShare, error) GetPublicShare(ctx context.Context, u *user.User, ref *link.PublicShareReference, sign bool) (*link.PublicShare, error) ListPublicShares(ctx context.Context, u *user.User, filters []*link.ListPublicSharesRequest_Filter, md *provider.ResourceInfo, sign bool) ([]*link.PublicShare, error)