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 }