enhancement: bump reva and remove unnecessary explicit automount mount point naming
This commit is contained in:
@@ -4,16 +4,14 @@ import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"slices"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/cs3org/reva/v2/pkg/events"
|
||||
"github.com/cs3org/reva/v2/pkg/events/stream"
|
||||
"github.com/cs3org/reva/v2/pkg/rgrpc/todo/pool"
|
||||
"github.com/cs3org/reva/v2/pkg/utils"
|
||||
"go-micro.dev/v4/metadata"
|
||||
"google.golang.org/protobuf/types/known/fieldmaskpb"
|
||||
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/log"
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/middleware"
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/registry"
|
||||
@@ -21,15 +19,13 @@ import (
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/tracing"
|
||||
"github.com/owncloud/ocis/v2/services/frontend/pkg/config"
|
||||
"github.com/owncloud/ocis/v2/services/settings/pkg/store/defaults"
|
||||
"go-micro.dev/v4/metadata"
|
||||
"google.golang.org/protobuf/types/known/fieldmaskpb"
|
||||
|
||||
gateway "github.com/cs3org/go-cs3apis/cs3/gateway/v1beta1"
|
||||
group "github.com/cs3org/go-cs3apis/cs3/identity/group/v1beta1"
|
||||
user "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1"
|
||||
rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1"
|
||||
collaboration "github.com/cs3org/go-cs3apis/cs3/sharing/collaboration/v1beta1"
|
||||
provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1"
|
||||
|
||||
settingssvc "github.com/owncloud/ocis/v2/protogen/gen/ocis/services/settings/v0"
|
||||
)
|
||||
|
||||
@@ -116,41 +112,23 @@ func AutoAcceptShares(ev events.ShareCreated, autoAcceptDefault bool, l log.Logg
|
||||
return
|
||||
}
|
||||
|
||||
uids, err := getUserIDs(ctx, gatewaySelector, ev.GranteeUserID, ev.GranteeGroupID)
|
||||
userIDs, err := getUserIDs(ctx, gatewaySelector, ev.GranteeUserID, ev.GranteeGroupID)
|
||||
if err != nil {
|
||||
l.Error().Err(err).Msg("cannot get grantees")
|
||||
return
|
||||
}
|
||||
|
||||
gwc, err = gatewaySelector.Next()
|
||||
if err != nil {
|
||||
l.Error().Err(err).Msg("cannot get gateway client")
|
||||
return
|
||||
}
|
||||
info, err := utils.GetResourceByID(ctx, ev.ItemID, gwc)
|
||||
if err != nil {
|
||||
l.Error().Err(err).Msg("error getting resource")
|
||||
return
|
||||
}
|
||||
|
||||
for _, uid := range uids {
|
||||
for _, uid := range userIDs {
|
||||
if !autoAcceptShares(ctx, uid, autoAcceptDefault, vs) {
|
||||
continue
|
||||
}
|
||||
|
||||
mp, err := getMountPoint(ctx, l, ev.ItemID, uid, gatewaySelector, info)
|
||||
if err != nil {
|
||||
l.Error().Err(err).Msg("error getting mount point")
|
||||
continue
|
||||
|
||||
}
|
||||
|
||||
gwc, err := gatewaySelector.Next()
|
||||
if err != nil {
|
||||
l.Error().Err(err).Msg("cannot get gateway client")
|
||||
continue
|
||||
}
|
||||
resp, err := gwc.UpdateReceivedShare(ctx, updateShareRequest(ev.ShareID, uid, mp))
|
||||
resp, err := gwc.UpdateReceivedShare(ctx, updateShareRequest(ev.ShareID, uid))
|
||||
if err != nil {
|
||||
l.Error().Err(err).Msg("error sending grpc request")
|
||||
continue
|
||||
@@ -163,66 +141,6 @@ func AutoAcceptShares(ev events.ShareCreated, autoAcceptDefault bool, l log.Logg
|
||||
|
||||
}
|
||||
|
||||
func getMountPoint(ctx context.Context, l log.Logger, itemid *provider.ResourceId, uid *user.UserId, gatewaySelector pool.Selectable[gateway.GatewayAPIClient], info *provider.ResourceInfo) (string, error) {
|
||||
lrs, err := getSharesList(ctx, gatewaySelector, uid)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// we need to sort the received shares by mount point in order to make things easier to evaluate.
|
||||
base := path.Base(info.GetPath())
|
||||
mount := base
|
||||
mounts := make([]string, 0, len(lrs.Shares))
|
||||
var exists bool
|
||||
|
||||
for _, s := range lrs.Shares {
|
||||
if s.State != collaboration.ShareState_SHARE_STATE_ACCEPTED {
|
||||
// we don't care about unaccepted shares
|
||||
continue
|
||||
}
|
||||
|
||||
if utils.ResourceIDEqual(s.GetShare().GetResourceId(), itemid) {
|
||||
// a share to the same resource already exists and is mounted
|
||||
return s.GetMountPoint().GetPath(), nil
|
||||
}
|
||||
|
||||
if s.GetMountPoint().GetPath() == mount {
|
||||
// does the shared resource still exist?
|
||||
gwc, err := gatewaySelector.Next()
|
||||
if err != nil {
|
||||
l.Error().Err(err).Msg("cannot get gateway client")
|
||||
continue
|
||||
}
|
||||
_, err = utils.GetResourceByID(ctx, s.GetShare().GetResourceId(), gwc)
|
||||
if err == nil {
|
||||
exists = true
|
||||
}
|
||||
// TODO we could delete shares here if the stat returns code NOT FOUND ... but listening for file deletes would be better
|
||||
}
|
||||
// collect all mount points
|
||||
mounts = append(mounts, s.GetMountPoint().GetPath())
|
||||
}
|
||||
|
||||
// If the mount point really already exists, we need to insert a number into the filename
|
||||
if exists {
|
||||
// now we have a list of shares, we want to iterate over all of them and check for name collisions agents a mount points list
|
||||
for i := 1; i <= len(mounts)+1; i++ {
|
||||
ext := filepath.Ext(base)
|
||||
name := strings.TrimSuffix(base, ext)
|
||||
// be smart about .tar.(gz|bz) files
|
||||
if strings.HasSuffix(name, ".tar") {
|
||||
name = strings.TrimSuffix(name, ".tar")
|
||||
ext = ".tar" + ext
|
||||
}
|
||||
mount = name + " (" + strconv.Itoa(i) + ")" + ext
|
||||
if !slices.Contains(mounts, mount) {
|
||||
return mount, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
return mount, nil
|
||||
}
|
||||
|
||||
func getUserIDs(ctx context.Context, gatewaySelector pool.Selectable[gateway.GatewayAPIClient], uid *user.UserId, gid *group.GroupId) ([]*user.UserId, error) {
|
||||
if uid != nil {
|
||||
return []*user.UserId{uid}, nil
|
||||
@@ -257,19 +175,16 @@ func autoAcceptShares(ctx context.Context, uid *user.UserId, defaultValue bool,
|
||||
return defaultValue
|
||||
}
|
||||
|
||||
func updateShareRequest(shareID *collaboration.ShareId, uid *user.UserId, path string) *collaboration.UpdateReceivedShareRequest {
|
||||
func updateShareRequest(shareID *collaboration.ShareId, uid *user.UserId) *collaboration.UpdateReceivedShareRequest {
|
||||
return &collaboration.UpdateReceivedShareRequest{
|
||||
Opaque: utils.AppendJSONToOpaque(nil, "userid", uid),
|
||||
Share: &collaboration.ReceivedShare{
|
||||
Share: &collaboration.Share{
|
||||
Id: shareID,
|
||||
},
|
||||
MountPoint: &provider.Reference{
|
||||
Path: path,
|
||||
},
|
||||
State: collaboration.ShareState_SHARE_STATE_ACCEPTED,
|
||||
},
|
||||
UpdateMask: &fieldmaskpb.FieldMask{Paths: []string{"state", "mount_point"}},
|
||||
UpdateMask: &fieldmaskpb.FieldMask{Paths: []string{"state"}},
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user