diff --git a/pkg/eosclient/eosgrpc/eosgrpc.go b/pkg/eosclient/eosgrpc/eosgrpc.go index 48bab1a66e8..23cb88f56ab 100644 --- a/pkg/eosclient/eosgrpc/eosgrpc.go +++ b/pkg/eosclient/eosgrpc/eosgrpc.go @@ -36,10 +36,10 @@ import ( "syscall" "time" + erpc "github.com/cern-eos/go-eosgrpc" userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/eosclient" - erpc "github.com/cern-eos/go-eosgrpc" "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/storage/utils/acl" "github.com/google/uuid" @@ -1361,20 +1361,6 @@ func (c *Client) Write(ctx context.Context, auth eosclient.Authorization, path s } return c.httpcl.PUTFile(ctx, u.Username, auth, path, stream, length, app) - - // return c.httpcl.PUTFile(ctx, remoteuser, auth, urlpathng, stream) - // return c.WriteFile(ctx, uid, gid, path, fd.Name()) -} - -// WriteFile writes an existing file to the mgm. Old xrdcp utility. -func (c *Client) WriteFile(ctx context.Context, auth eosclient.Authorization, path, source, app string) error { - log := appctx.GetLogger(ctx) - log.Info().Str("func", "WriteFile").Str("uid,gid", auth.Role.UID+","+auth.Role.GID).Str("path", path).Str("source", source).Msg("") - - xrdPath := fmt.Sprintf("%s//%s", c.opt.URL, path) - cmd := exec.CommandContext(ctx, c.opt.XrdcopyBinary, "--nopbar", "--silent", "-f", source, xrdPath, fmt.Sprintf("-ODeos.ruid=%s&eos.rgid=%s", auth.Role.UID, auth.Role.GID)) - _, _, err := c.execute(ctx, cmd) - return err } // ListDeletedEntries returns a list of the deleted entries. diff --git a/pkg/eosclient/eosgrpc/eoshttp.go b/pkg/eosclient/eosgrpc/eoshttp.go index f7bb9b20b04..ee1aa3aacf4 100644 --- a/pkg/eosclient/eosgrpc/eoshttp.go +++ b/pkg/eosclient/eosgrpc/eoshttp.go @@ -283,6 +283,8 @@ func (c *EOSHTTPClient) GETFile(ctx context.Context, remoteuser string, auth eos log.Error().Str("func", "GETFile").Str("url", finalurl).Str("err", err.Error()).Msg("can't create request") return nil, err } + // similar to eosbinary.go::Read() + req.Header.Set("app", "reva_eosclient::read") ntries := 0 nredirs := 0 diff --git a/pkg/storage/utils/eosfs/eosfs.go b/pkg/storage/utils/eosfs/eosfs.go index dc2d53ea03c..7e1043d2557 100644 --- a/pkg/storage/utils/eosfs/eosfs.go +++ b/pkg/storage/utils/eosfs/eosfs.go @@ -594,6 +594,12 @@ func (fs *eosfs) UnsetArbitraryMetadata(ctx context.Context, ref *provider.Refer return nil } +func (fs *eosfs) EncodeAppName(a string) string { + // this function returns the string to be used as EOS "app" tag, both in uploads and when handling locks + r := strings.NewReplacer(" ", "_") + return "reva_eosclient::app_" + strings.ToLower(r.Replace(a)) +} + func (fs *eosfs) getLockPayloads(ctx context.Context, path string) (string, string, error) { // sys attributes want root auth, buddy rootauth, err := fs.getRootAuth(ctx) @@ -663,7 +669,7 @@ func (fs *eosfs) getLock(ctx context.Context, user *userpb.User, path string, re if time.Unix(int64(l.Expiration.Seconds), 0).Before(time.Now()) { // the lock expired - if err := fs.removeLockAttrs(ctx, path, encodeAppName(l.AppName)); err != nil { + if err := fs.removeLockAttrs(ctx, path, fs.EncodeAppName(l.AppName)); err != nil { return nil, err } return nil, errtypes.NotFound("lock not found for ref") @@ -704,7 +710,7 @@ func (fs *eosfs) setLock(ctx context.Context, lock *provider.Lock, path string) return err } - encodedLock, eosLock, err := encodeLock(lock) + encodedLock, eosLock, err := fs.encodeLock(lock) if err != nil { return errors.Wrap(err, "eosfs: error encoding lock") } @@ -714,7 +720,7 @@ func (fs *eosfs) setLock(ctx context.Context, lock *provider.Lock, path string) Type: SystemAttr, Key: eosLockKey, Val: eosLock, - }, false, false, path, encodeAppName(lock.AppName)) + }, false, false, path, fs.EncodeAppName(lock.AppName)) switch { case errors.Is(err, eosclient.FileIsLockedError): return errtypes.Conflict("resource already locked") @@ -727,7 +733,7 @@ func (fs *eosfs) setLock(ctx context.Context, lock *provider.Lock, path string) Type: SystemAttr, Key: lockPayloadKey, Val: encodedLock, - }, false, false, path, encodeAppName(lock.AppName)) + }, false, false, path, fs.EncodeAppName(lock.AppName)) if err != nil { return errors.Wrap(err, "eosfs: error setting lock payload") } @@ -822,12 +828,7 @@ func (fs *eosfs) userHasReadAccess(ctx context.Context, user *userpb.User, ref * return resInfo.PermissionSet.InitiateFileDownload, nil } -func encodeAppName(a string) string { - r := strings.NewReplacer(" ", "_") - return "reva_" + strings.ToLower(r.Replace(a)) -} - -func encodeLock(l *provider.Lock) (string, string, error) { +func (fs *eosfs) encodeLock(l *provider.Lock) (string, string, error) { data, err := json.Marshal(l) if err != nil { return "", "", err @@ -835,7 +836,7 @@ func encodeLock(l *provider.Lock) (string, string, error) { var a string if l.AppName != "" { // cf. upload implementation - a = encodeAppName(l.AppName) + a = fs.EncodeAppName(l.AppName) } else { a = "*" } @@ -976,7 +977,7 @@ func (fs *eosfs) Unlock(ctx context.Context, ref *provider.Reference, lock *prov } path = fs.wrap(ctx, path) - return fs.removeLockAttrs(ctx, path, encodeAppName(lock.AppName)) + return fs.removeLockAttrs(ctx, path, fs.EncodeAppName(lock.AppName)) } func (fs *eosfs) AddGrant(ctx context.Context, ref *provider.Reference, g *provider.Grant) error { diff --git a/pkg/storage/utils/eosfs/upload.go b/pkg/storage/utils/eosfs/upload.go index 0213dd78cb6..8059ed5e18e 100644 --- a/pkg/storage/utils/eosfs/upload.go +++ b/pkg/storage/utils/eosfs/upload.go @@ -23,7 +23,6 @@ import ( "io" "os" "path" - "strings" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" "github.com/cs3org/reva/pkg/errtypes" @@ -81,8 +80,8 @@ func (fs *eosfs) Upload(ctx context.Context, ref *provider.Reference, r io.ReadC if app == "" { app = "reva_eosclient::write" } else { - r := strings.NewReplacer(" ", "_") - app = "reva_" + strings.ToLower(r.Replace(app)) + // if we have a lock context, the app for EOS must match the lock holder + app = fs.EncodeAppName(app) } return fs.c.Write(ctx, auth, fn, r, app) }