github.com/cs3org/reva/v2@v2.27.7/internal/grpc/interceptors/eventsmiddleware/conversion.go (about)

     1  // Copyright 2018-2021 CERN
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  //
    15  // In applying this license, CERN does not waive the privileges and immunities
    16  // granted to it by virtue of its status as an Intergovernmental Organization
    17  // or submit itself to any jurisdiction.
    18  
    19  package eventsmiddleware
    20  
    21  import (
    22  	"time"
    23  
    24  	group "github.com/cs3org/go-cs3apis/cs3/identity/group/v1beta1"
    25  	user "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1"
    26  	ocmcore "github.com/cs3org/go-cs3apis/cs3/ocm/core/v1beta1"
    27  	collaboration "github.com/cs3org/go-cs3apis/cs3/sharing/collaboration/v1beta1"
    28  	link "github.com/cs3org/go-cs3apis/cs3/sharing/link/v1beta1"
    29  	provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1"
    30  	"github.com/cs3org/reva/v2/pkg/events"
    31  	"github.com/cs3org/reva/v2/pkg/storagespace"
    32  	"github.com/cs3org/reva/v2/pkg/utils"
    33  )
    34  
    35  // ContainerCreated converts the response to an event
    36  func ContainerCreated(r *provider.CreateContainerResponse, req *provider.CreateContainerRequest, spaceOwner *user.UserId, executant *user.User) events.ContainerCreated {
    37  	return events.ContainerCreated{
    38  		SpaceOwner:        spaceOwner,
    39  		Executant:         executant.GetId(),
    40  		Ref:               req.Ref,
    41  		Timestamp:         utils.TSNow(),
    42  		ImpersonatingUser: extractImpersonator(executant),
    43  	}
    44  }
    45  
    46  // ShareCreated converts the response to an event
    47  func ShareCreated(r *collaboration.CreateShareResponse, executant *user.User) events.ShareCreated {
    48  	return events.ShareCreated{
    49  		ShareID:        r.Share.GetId(),
    50  		Executant:      executant.GetId(),
    51  		Sharer:         r.Share.Creator,
    52  		GranteeUserID:  r.Share.GetGrantee().GetUserId(),
    53  		GranteeGroupID: r.Share.GetGrantee().GetGroupId(),
    54  		ItemID:         r.Share.ResourceId,
    55  		ResourceName:   utils.ReadPlainFromOpaque(r.Opaque, "resourcename"),
    56  		CTime:          r.Share.Ctime,
    57  		Permissions:    r.Share.Permissions,
    58  	}
    59  }
    60  
    61  // ShareRemoved converts the response to an event
    62  func ShareRemoved(r *collaboration.RemoveShareResponse, req *collaboration.RemoveShareRequest, executant *user.User) events.ShareRemoved {
    63  	var (
    64  		userid  *user.UserId
    65  		groupid *group.GroupId
    66  		rid     *provider.ResourceId
    67  	)
    68  	_ = utils.ReadJSONFromOpaque(r.Opaque, "granteeuserid", &userid)
    69  	_ = utils.ReadJSONFromOpaque(r.Opaque, "granteegroupid", &userid)
    70  	_ = utils.ReadJSONFromOpaque(r.Opaque, "resourceid", &rid)
    71  	return events.ShareRemoved{
    72  		Executant:      executant.GetId(),
    73  		ShareID:        req.Ref.GetId(),
    74  		ShareKey:       req.Ref.GetKey(),
    75  		GranteeUserID:  userid,
    76  		GranteeGroupID: groupid,
    77  		ItemID:         rid,
    78  		ResourceName:   utils.ReadPlainFromOpaque(r.Opaque, "resourcename"),
    79  		Timestamp:      time.Now(),
    80  	}
    81  }
    82  
    83  // ShareUpdated converts the response to an event
    84  func ShareUpdated(r *collaboration.UpdateShareResponse, req *collaboration.UpdateShareRequest, executant *user.User) events.ShareUpdated {
    85  	return events.ShareUpdated{
    86  		Executant:      executant.GetId(),
    87  		ShareID:        r.Share.Id,
    88  		ItemID:         r.Share.ResourceId,
    89  		ResourceName:   utils.ReadPlainFromOpaque(r.Opaque, "resourcename"),
    90  		Permissions:    r.Share.Permissions,
    91  		GranteeUserID:  r.Share.GetGrantee().GetUserId(),
    92  		GranteeGroupID: r.Share.GetGrantee().GetGroupId(),
    93  		Sharer:         r.Share.Creator,
    94  		MTime:          r.Share.Mtime,
    95  		UpdateMask:     req.GetUpdateMask().GetPaths(),
    96  	}
    97  }
    98  
    99  // ReceivedShareUpdated converts the response to an event
   100  func ReceivedShareUpdated(r *collaboration.UpdateReceivedShareResponse, executant *user.User) events.ReceivedShareUpdated {
   101  	return events.ReceivedShareUpdated{
   102  		Executant:      executant.GetId(),
   103  		ShareID:        r.Share.Share.Id,
   104  		ItemID:         r.Share.Share.ResourceId,
   105  		Permissions:    r.Share.Share.Permissions,
   106  		GranteeUserID:  r.Share.Share.GetGrantee().GetUserId(),
   107  		GranteeGroupID: r.Share.Share.GetGrantee().GetGroupId(),
   108  		Sharer:         r.Share.Share.Creator,
   109  		MTime:          r.Share.Share.Mtime,
   110  		State:          collaboration.ShareState_name[int32(r.Share.State)],
   111  	}
   112  }
   113  
   114  // LinkCreated converts the response to an event
   115  func LinkCreated(r *link.CreatePublicShareResponse, executant *user.User) events.LinkCreated {
   116  	return events.LinkCreated{
   117  		Executant:         executant.GetId(),
   118  		ShareID:           r.Share.Id,
   119  		Sharer:            r.Share.Creator,
   120  		ItemID:            r.Share.ResourceId,
   121  		ResourceName:      utils.ReadPlainFromOpaque(r.Opaque, "resourcename"),
   122  		Permissions:       r.Share.Permissions,
   123  		DisplayName:       r.Share.DisplayName,
   124  		Expiration:        r.Share.Expiration,
   125  		PasswordProtected: r.Share.PasswordProtected,
   126  		CTime:             r.Share.Ctime,
   127  		Token:             r.Share.Token,
   128  	}
   129  }
   130  
   131  // LinkUpdated converts the response to an event
   132  func LinkUpdated(r *link.UpdatePublicShareResponse, req *link.UpdatePublicShareRequest, executant *user.User) events.LinkUpdated {
   133  	return events.LinkUpdated{
   134  		Executant:         executant.GetId(),
   135  		ShareID:           r.Share.Id,
   136  		Sharer:            r.Share.Creator,
   137  		ItemID:            r.Share.ResourceId,
   138  		ResourceName:      utils.ReadPlainFromOpaque(r.Opaque, "resourcename"),
   139  		Permissions:       r.Share.Permissions,
   140  		DisplayName:       r.Share.DisplayName,
   141  		Expiration:        r.Share.Expiration,
   142  		PasswordProtected: r.Share.PasswordProtected,
   143  		MTime:             r.Share.Mtime,
   144  		Token:             r.Share.Token,
   145  		FieldUpdated:      link.UpdatePublicShareRequest_Update_Type_name[int32(req.Update.GetType())],
   146  	}
   147  }
   148  
   149  // LinkAccessed converts the response to an event
   150  func LinkAccessed(r *link.GetPublicShareByTokenResponse, executant *user.User) events.LinkAccessed {
   151  	return events.LinkAccessed{
   152  		Executant:         executant.GetId(),
   153  		ShareID:           r.Share.Id,
   154  		Sharer:            r.Share.Creator,
   155  		ItemID:            r.Share.ResourceId,
   156  		Permissions:       r.Share.Permissions,
   157  		DisplayName:       r.Share.DisplayName,
   158  		Expiration:        r.Share.Expiration,
   159  		PasswordProtected: r.Share.PasswordProtected,
   160  		CTime:             r.Share.Ctime,
   161  		Token:             r.Share.Token,
   162  	}
   163  }
   164  
   165  // LinkAccessFailed converts the response to an event
   166  func LinkAccessFailed(r *link.GetPublicShareByTokenResponse, req *link.GetPublicShareByTokenRequest, executant *user.User) events.LinkAccessFailed {
   167  	e := events.LinkAccessFailed{
   168  		Executant: executant.GetId(),
   169  		Status:    r.Status.Code,
   170  		Message:   r.Status.Message,
   171  		Timestamp: utils.TSNow(),
   172  		Token:     req.Token,
   173  	}
   174  	if r.Share != nil {
   175  		e.ShareID = r.Share.Id
   176  		e.Token = r.Share.Token
   177  	}
   178  	return e
   179  }
   180  
   181  // LinkRemoved converts the response to an event
   182  func LinkRemoved(r *link.RemovePublicShareResponse, req *link.RemovePublicShareRequest, executant *user.User) events.LinkRemoved {
   183  	var rid *provider.ResourceId
   184  	_ = utils.ReadJSONFromOpaque(r.Opaque, "resourceid", &rid)
   185  	return events.LinkRemoved{
   186  		Executant:    executant.GetId(),
   187  		ShareID:      req.Ref.GetId(),
   188  		ShareToken:   req.Ref.GetToken(),
   189  		Timestamp:    utils.TSNow(),
   190  		ItemID:       rid,
   191  		ResourceName: utils.ReadPlainFromOpaque(r.Opaque, "resourcename"),
   192  	}
   193  }
   194  
   195  func OCMCoreShareCreated(r *ocmcore.CreateOCMCoreShareResponse, req *ocmcore.CreateOCMCoreShareRequest, executant *user.User) events.OCMCoreShareCreated {
   196  	var permissions *provider.ResourcePermissions
   197  	for _, p := range req.GetProtocols() {
   198  		if p.GetWebdavOptions() != nil {
   199  			permissions = p.GetWebdavOptions().GetPermissions().GetPermissions()
   200  			break
   201  		}
   202  	}
   203  	return events.OCMCoreShareCreated{
   204  		ShareID:       r.GetId(),
   205  		Executant:     executant.GetId(),
   206  		Sharer:        req.GetSender(),
   207  		GranteeUserID: req.GetShareWith(),
   208  		ItemID:        req.GetResourceId(),
   209  		ResourceName:  req.GetName(),
   210  		CTime:         r.GetCreated(),
   211  		Permissions:   permissions,
   212  	}
   213  }
   214  
   215  // FileTouched converts the response to an event
   216  func FileTouched(r *provider.TouchFileResponse, req *provider.TouchFileRequest, spaceOwner *user.UserId, executant *user.User) events.FileTouched {
   217  	return events.FileTouched{
   218  		SpaceOwner:        spaceOwner,
   219  		Executant:         executant.GetId(),
   220  		Ref:               req.Ref,
   221  		Timestamp:         utils.TSNow(),
   222  		ImpersonatingUser: extractImpersonator(executant),
   223  	}
   224  }
   225  
   226  // FileUploaded converts the response to an event
   227  func FileUploaded(r *provider.InitiateFileUploadResponse, req *provider.InitiateFileUploadRequest, spaceOwner *user.UserId, executant *user.User) events.FileUploaded {
   228  	return events.FileUploaded{
   229  		SpaceOwner:        spaceOwner,
   230  		Executant:         executant.GetId(),
   231  		Ref:               req.Ref,
   232  		Timestamp:         utils.TSNow(),
   233  		ImpersonatingUser: extractImpersonator(executant),
   234  	}
   235  }
   236  
   237  // FileDownloaded converts the response to an event
   238  func FileDownloaded(r *provider.InitiateFileDownloadResponse, req *provider.InitiateFileDownloadRequest, executant *user.User) events.FileDownloaded {
   239  	return events.FileDownloaded{
   240  		Executant:         executant.GetId(),
   241  		Ref:               req.Ref,
   242  		Timestamp:         utils.TSNow(),
   243  		ImpersonatingUser: extractImpersonator(executant),
   244  	}
   245  }
   246  
   247  // FileLocked converts the response to an events
   248  func FileLocked(r *provider.SetLockResponse, req *provider.SetLockRequest, owner *user.UserId, executant *user.User) events.FileLocked {
   249  	return events.FileLocked{
   250  		Executant:         executant.GetId(),
   251  		Ref:               req.Ref,
   252  		Timestamp:         utils.TSNow(),
   253  		ImpersonatingUser: extractImpersonator(executant),
   254  	}
   255  }
   256  
   257  // FileUnlocked converts the response to an event
   258  func FileUnlocked(r *provider.UnlockResponse, req *provider.UnlockRequest, owner *user.UserId, executant *user.User) events.FileUnlocked {
   259  	return events.FileUnlocked{
   260  		Executant:         executant.GetId(),
   261  		Ref:               req.Ref,
   262  		Timestamp:         utils.TSNow(),
   263  		ImpersonatingUser: extractImpersonator(executant),
   264  	}
   265  }
   266  
   267  // ItemTrashed converts the response to an event
   268  func ItemTrashed(r *provider.DeleteResponse, req *provider.DeleteRequest, spaceOwner *user.UserId, executant *user.User) events.ItemTrashed {
   269  	opaqueID := utils.ReadPlainFromOpaque(r.Opaque, "opaque_id")
   270  	return events.ItemTrashed{
   271  		SpaceOwner: spaceOwner,
   272  		Executant:  executant.GetId(),
   273  		Ref:        req.Ref,
   274  		ID: &provider.ResourceId{
   275  			StorageId: req.Ref.GetResourceId().GetStorageId(),
   276  			SpaceId:   req.Ref.GetResourceId().GetSpaceId(),
   277  			OpaqueId:  opaqueID,
   278  		},
   279  		Timestamp:         utils.TSNow(),
   280  		ImpersonatingUser: extractImpersonator(executant),
   281  	}
   282  }
   283  
   284  // ItemMoved converts the response to an event
   285  func ItemMoved(r *provider.MoveResponse, req *provider.MoveRequest, spaceOwner *user.UserId, executant *user.User) events.ItemMoved {
   286  	return events.ItemMoved{
   287  		SpaceOwner:        spaceOwner,
   288  		Executant:         executant.GetId(),
   289  		Ref:               req.Destination,
   290  		OldReference:      req.Source,
   291  		Timestamp:         utils.TSNow(),
   292  		ImpersonatingUser: extractImpersonator(executant),
   293  	}
   294  }
   295  
   296  // ItemPurged converts the response to an event
   297  func ItemPurged(r *provider.PurgeRecycleResponse, req *provider.PurgeRecycleRequest, executant *user.User) events.ItemPurged {
   298  	return events.ItemPurged{
   299  		Executant:         executant.GetId(),
   300  		Ref:               req.Ref,
   301  		Timestamp:         utils.TSNow(),
   302  		ImpersonatingUser: extractImpersonator(executant),
   303  	}
   304  }
   305  
   306  // ItemRestored converts the response to an event
   307  func ItemRestored(r *provider.RestoreRecycleItemResponse, req *provider.RestoreRecycleItemRequest, spaceOwner *user.UserId, executant *user.User) events.ItemRestored {
   308  	ref := req.Ref
   309  	if req.RestoreRef != nil {
   310  		ref = req.RestoreRef
   311  	}
   312  	return events.ItemRestored{
   313  		SpaceOwner:        spaceOwner,
   314  		Executant:         executant.GetId(),
   315  		Ref:               ref,
   316  		OldReference:      req.Ref,
   317  		Key:               req.Key,
   318  		Timestamp:         utils.TSNow(),
   319  		ImpersonatingUser: extractImpersonator(executant),
   320  	}
   321  }
   322  
   323  // FileVersionRestored converts the response to an event
   324  func FileVersionRestored(r *provider.RestoreFileVersionResponse, req *provider.RestoreFileVersionRequest, spaceOwner *user.UserId, executant *user.User) events.FileVersionRestored {
   325  	return events.FileVersionRestored{
   326  		SpaceOwner:        spaceOwner,
   327  		Executant:         executant.GetId(),
   328  		Ref:               req.Ref,
   329  		Key:               req.Key,
   330  		Timestamp:         utils.TSNow(),
   331  		ImpersonatingUser: extractImpersonator(executant),
   332  	}
   333  }
   334  
   335  // SpaceCreated converts the response to an event
   336  func SpaceCreated(r *provider.CreateStorageSpaceResponse, executant *user.User) events.SpaceCreated {
   337  	return events.SpaceCreated{
   338  		Executant: executant.GetId(),
   339  		ID:        r.StorageSpace.Id,
   340  		Owner:     extractOwner(r.StorageSpace.Owner),
   341  		Root:      r.StorageSpace.Root,
   342  		Name:      r.StorageSpace.Name,
   343  		Type:      r.StorageSpace.SpaceType,
   344  		Quota:     r.StorageSpace.Quota,
   345  		MTime:     r.StorageSpace.Mtime,
   346  	}
   347  }
   348  
   349  // SpaceRenamed converts the response to an event
   350  func SpaceRenamed(r *provider.UpdateStorageSpaceResponse, req *provider.UpdateStorageSpaceRequest, executant *user.User) events.SpaceRenamed {
   351  	return events.SpaceRenamed{
   352  		Executant: executant.GetId(),
   353  		ID:        r.StorageSpace.Id,
   354  		Owner:     extractOwner(r.StorageSpace.Owner),
   355  		Name:      r.StorageSpace.Name,
   356  		Timestamp: utils.TSNow(),
   357  	}
   358  }
   359  
   360  // SpaceUpdated converts the response to an event
   361  func SpaceUpdated(r *provider.UpdateStorageSpaceResponse, req *provider.UpdateStorageSpaceRequest, executant *user.User) events.SpaceUpdated {
   362  	return events.SpaceUpdated{
   363  		Executant: executant.GetId(),
   364  		ID:        r.StorageSpace.Id,
   365  		Space:     r.StorageSpace,
   366  		Timestamp: utils.TSNow(),
   367  	}
   368  }
   369  
   370  // SpaceEnabled converts the response to an event
   371  func SpaceEnabled(r *provider.UpdateStorageSpaceResponse, req *provider.UpdateStorageSpaceRequest, executant *user.User) events.SpaceEnabled {
   372  	return events.SpaceEnabled{
   373  		Executant: executant.GetId(),
   374  		ID:        r.StorageSpace.Id,
   375  		Owner:     extractOwner(r.StorageSpace.Owner),
   376  		Timestamp: utils.TSNow(),
   377  	}
   378  }
   379  
   380  // SpaceShared converts the response to an event
   381  // func SpaceShared(req *provider.AddGrantRequest, executant, sharer *user.UserId, grantee *provider.Grantee) events.SpaceShared {
   382  func SpaceShared(r *provider.AddGrantResponse, req *provider.AddGrantRequest, executant *user.User) events.SpaceShared {
   383  	id := storagespace.FormatStorageID(req.Ref.ResourceId.StorageId, req.Ref.ResourceId.SpaceId)
   384  	return events.SpaceShared{
   385  		Executant:      executant.GetId(),
   386  		Creator:        req.Grant.Creator,
   387  		GranteeUserID:  req.Grant.GetGrantee().GetUserId(),
   388  		GranteeGroupID: req.Grant.GetGrantee().GetGroupId(),
   389  		ID:             &provider.StorageSpaceId{OpaqueId: id},
   390  		Timestamp:      time.Now(),
   391  	}
   392  }
   393  
   394  // SpaceShareUpdated converts the response to an events
   395  func SpaceShareUpdated(r *provider.UpdateGrantResponse, req *provider.UpdateGrantRequest, executant *user.User) events.SpaceShareUpdated {
   396  	id := storagespace.FormatStorageID(req.Ref.ResourceId.StorageId, req.Ref.ResourceId.SpaceId)
   397  	return events.SpaceShareUpdated{
   398  		Executant:      executant.GetId(),
   399  		GranteeUserID:  req.Grant.GetGrantee().GetUserId(),
   400  		GranteeGroupID: req.Grant.GetGrantee().GetGroupId(),
   401  		ID:             &provider.StorageSpaceId{OpaqueId: id},
   402  		Timestamp:      time.Now(),
   403  	}
   404  }
   405  
   406  // SpaceUnshared  converts the response to an event
   407  func SpaceUnshared(r *provider.RemoveGrantResponse, req *provider.RemoveGrantRequest, executant *user.User) events.SpaceUnshared {
   408  	id := storagespace.FormatStorageID(req.Ref.ResourceId.StorageId, req.Ref.ResourceId.SpaceId)
   409  	return events.SpaceUnshared{
   410  		Executant:      executant.GetId(),
   411  		GranteeUserID:  req.Grant.GetGrantee().GetUserId(),
   412  		GranteeGroupID: req.Grant.GetGrantee().GetGroupId(),
   413  		ID:             &provider.StorageSpaceId{OpaqueId: id},
   414  		Timestamp:      time.Now(),
   415  	}
   416  }
   417  
   418  // SpaceDisabled converts the response to an event
   419  func SpaceDisabled(r *provider.DeleteStorageSpaceResponse, req *provider.DeleteStorageSpaceRequest, executant *user.User) events.SpaceDisabled {
   420  	return events.SpaceDisabled{
   421  		Executant: executant.GetId(),
   422  		ID:        req.Id,
   423  		Timestamp: time.Now(),
   424  	}
   425  }
   426  
   427  // SpaceDeleted converts the response to an event
   428  func SpaceDeleted(r *provider.DeleteStorageSpaceResponse, req *provider.DeleteStorageSpaceRequest, executant *user.User) events.SpaceDeleted {
   429  	var final map[string]provider.ResourcePermissions
   430  	_ = utils.ReadJSONFromOpaque(r.GetOpaque(), "grants", &final)
   431  	return events.SpaceDeleted{
   432  		Executant:    executant.GetId(),
   433  		ID:           req.Id,
   434  		SpaceName:    utils.ReadPlainFromOpaque(r.GetOpaque(), "spacename"),
   435  		FinalMembers: final,
   436  		Timestamp:    time.Now(),
   437  	}
   438  }
   439  
   440  func extractOwner(u *user.User) *user.UserId {
   441  	if u != nil {
   442  		return u.Id
   443  	}
   444  	return nil
   445  }
   446  
   447  func extractImpersonator(u *user.User) *user.User {
   448  	var impersonator user.User
   449  	if err := utils.ReadJSONFromOpaque(u.Opaque, "impersonating-user", &impersonator); err != nil {
   450  		return nil
   451  	}
   452  	return &impersonator
   453  }