From eefe9914872ecfe7c25facc99bc90ffe28e729ef Mon Sep 17 00:00:00 2001 From: Roman Perekhod Date: Mon, 13 May 2024 13:53:07 +0200 Subject: [PATCH] added the watermark text for the Secure View mode --- .../enhancement-add-watermark-text.md | 5 ++ .../pkg/connector/fileconnector.go | 59 +++++++++++-------- .../pkg/connector/fileconnector_test.go | 55 ++++++++++++++++- 3 files changed, 93 insertions(+), 26 deletions(-) create mode 100644 changelog/unreleased/enhancement-add-watermark-text.md diff --git a/changelog/unreleased/enhancement-add-watermark-text.md b/changelog/unreleased/enhancement-add-watermark-text.md new file mode 100644 index 000000000..3ad623dd4 --- /dev/null +++ b/changelog/unreleased/enhancement-add-watermark-text.md @@ -0,0 +1,5 @@ +Enhancement: Add watermark text + +We've added the watermark text for the Secure View mode. + +https://github.com/owncloud/ocis/pull/9144 diff --git a/services/collaboration/pkg/connector/fileconnector.go b/services/collaboration/pkg/connector/fileconnector.go index f8fe28d2c..a498bc3e2 100644 --- a/services/collaboration/pkg/connector/fileconnector.go +++ b/services/collaboration/pkg/connector/fileconnector.go @@ -5,6 +5,7 @@ import ( "encoding/hex" "path" "strconv" + "strings" "time" appproviderv1beta1 "github.com/cs3org/go-cs3apis/cs3/app/provider/v1beta1" @@ -13,6 +14,7 @@ import ( rpcv1beta1 "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" providerv1beta1 "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" typesv1beta1 "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" + "github.com/cs3org/reva/v2/pkg/utils" "github.com/google/uuid" "github.com/owncloud/ocis/v2/services/collaboration/pkg/config" "github.com/owncloud/ocis/v2/services/collaboration/pkg/middleware" @@ -521,6 +523,29 @@ func (f *FileConnector) CheckFileInfo(ctx context.Context) (FileInfo, error) { SupportsLocks: true, } + // user logic from reva wopi driver #TODO: refactor + var isPublicShare bool = false + if wopiContext.User != nil { + // UserId must use only alphanumeric chars (https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/files/checkfileinfo/checkfileinfo-response#requirements-for-user-identity-properties) + if wopiContext.User.GetId().GetType() == userv1beta1.UserType_USER_TYPE_LIGHTWEIGHT { + fileInfo.UserId = hex.EncodeToString([]byte(statRes.GetInfo().GetOwner().GetOpaqueId() + "@" + statRes.GetInfo().GetOwner().GetIdp())) + } else { + fileInfo.UserId = hex.EncodeToString([]byte(wopiContext.User.GetId().GetOpaqueId() + "@" + wopiContext.User.GetId().GetIdp())) + } + + isPublicShare = utils.ExistsInOpaque(wopiContext.User.GetOpaque(), "public-share-role") + if !isPublicShare { + fileInfo.UserFriendlyName = wopiContext.User.GetDisplayName() + fileInfo.UserId = hex.EncodeToString([]byte(wopiContext.User.GetId().GetOpaqueId() + "@" + wopiContext.User.GetId().GetIdp())) + } + } + if wopiContext.User == nil || isPublicShare { + randomID, _ := uuid.NewUUID() + fileInfo.UserId = hex.EncodeToString([]byte("guest-" + randomID.String())) + fileInfo.UserFriendlyName = "Guest " + randomID.String() + fileInfo.IsAnonymousUser = true + } + switch wopiContext.ViewMode { case appproviderv1beta1.ViewMode_VIEW_MODE_READ_WRITE: fileInfo.SupportsUpdate = true @@ -533,35 +558,19 @@ func (f *FileConnector) CheckFileInfo(ctx context.Context) (FileInfo, error) { fileInfo.DisableExport = true fileInfo.DisableCopy = true fileInfo.DisablePrint = true - } - - // user logic from reva wopi driver #TODO: refactor - var isPublicShare bool = false - if wopiContext.User != nil { - // UserId must use only alphanumeric chars (https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/files/checkfileinfo/checkfileinfo-response#requirements-for-user-identity-properties) - if wopiContext.User.GetId().GetType() == userv1beta1.UserType_USER_TYPE_LIGHTWEIGHT { - fileInfo.UserId = hex.EncodeToString([]byte(statRes.GetInfo().GetOwner().GetOpaqueId() + "@" + statRes.GetInfo().GetOwner().GetIdp())) - } else { - fileInfo.UserId = hex.EncodeToString([]byte(wopiContext.User.GetId().GetOpaqueId() + "@" + wopiContext.User.GetId().GetIdp())) - } - - if wopiContext.User.GetOpaque() != nil { - if _, ok := wopiContext.User.GetOpaque().GetMap()["public-share-role"]; ok { - isPublicShare = true - } - } if !isPublicShare { - fileInfo.UserFriendlyName = wopiContext.User.GetUsername() - fileInfo.UserId = hex.EncodeToString([]byte(wopiContext.User.GetId().GetOpaqueId() + "@" + wopiContext.User.GetId().GetIdp())) + // the fileInfo.WatermarkText supported by Collabora only + fileInfo.WatermarkText = f.watermarkText(wopiContext.User) } } - if wopiContext.User == nil || isPublicShare { - randomID, _ := uuid.NewUUID() - fileInfo.UserId = hex.EncodeToString([]byte("guest-" + randomID.String())) - fileInfo.UserFriendlyName = "Guest " + randomID.String() - fileInfo.IsAnonymousUser = true - } logger.Debug().Msg("CheckFileInfo: success") return fileInfo, nil } + +func (f *FileConnector) watermarkText(user *userv1beta1.User) string { + if user != nil { + return strings.TrimSpace(user.GetDisplayName() + " " + user.GetMail()) + } + return "Watermark" +} diff --git a/services/collaboration/pkg/connector/fileconnector_test.go b/services/collaboration/pkg/connector/fileconnector_test.go index 4ed54e2da..bc4253067 100644 --- a/services/collaboration/pkg/connector/fileconnector_test.go +++ b/services/collaboration/pkg/connector/fileconnector_test.go @@ -52,7 +52,9 @@ var _ = Describe("FileConnector", func() { OpaqueId: "opaqueId", Type: userv1beta1.UserType_USER_TYPE_PRIMARY, }, - Username: "Pet Shaft", + Username: "Shaft", + DisplayName: "Pet Shaft", + Mail: "shaft@example.com", // Opaque is here for reference, not used by default but might be needed for some tests //Opaque: &typesv1beta1.Opaque{ // Map: map[string]*typesv1beta1.OpaqueEntry{ @@ -871,5 +873,56 @@ var _ = Describe("FileConnector", func() { Expect(err).To(Succeed()) Expect(newFileInfo).To(Equal(expectedFileInfo)) }) + + It("Stat success authenticated user", func() { + // change view mode to view only + wopiCtx.ViewMode = appproviderv1beta1.ViewMode_VIEW_MODE_VIEW_ONLY + + ctx := middleware.WopiContextToCtx(context.Background(), wopiCtx) + + gatewayClient.On("Stat", mock.Anything, mock.Anything).Times(1).Return(&providerv1beta1.StatResponse{ + Status: status.NewOK(ctx), + Info: &providerv1beta1.ResourceInfo{ + Owner: &userv1beta1.UserId{ + Idp: "customIdp", + OpaqueId: "aabbcc", + Type: userv1beta1.UserType_USER_TYPE_PRIMARY, + }, + Size: uint64(998877), + Mtime: &typesv1beta1.Timestamp{ + Seconds: uint64(16273849), + }, + Path: "/path/to/test.txt", + // Other properties aren't used for now. + }, + }, nil) + + expectedFileInfo := connector.FileInfo{ + OwnerId: "61616262636340637573746f6d496470", // hex of aabbcc@customIdp + Size: int64(998877), + Version: "16273849.0", + BaseFileName: "test.txt", + BreadcrumbDocName: "test.txt", + UserCanNotWriteRelative: true, + HostViewUrl: "http://test.ex.prv/view", + HostEditUrl: "http://test.ex.prv/edit", + EnableOwnerTermination: false, + SupportsExtendedLockLength: true, + SupportsGetLock: true, + SupportsLocks: true, + DisableExport: true, + DisableCopy: true, + DisablePrint: true, + IsAnonymousUser: false, + UserId: hex.EncodeToString([]byte("opaqueId@inmemory")), + UserFriendlyName: "Pet Shaft", + WatermarkText: "Pet Shaft shaft@example.com", + } + + newFileInfo, err := fc.CheckFileInfo(ctx) + + Expect(err).To(Succeed()) + Expect(newFileInfo).To(Equal(expectedFileInfo)) + }) }) })