From 79a7288d99a7bddf4c2bd49beddc9eac0a7b306b Mon Sep 17 00:00:00 2001 From: ryanfkeepers Date: Wed, 3 May 2023 15:19:52 -0600 Subject: [PATCH] setting aside --- src/internal/connector/data_collections.go | 2 +- src/internal/connector/onedrive/api/drive.go | 18 ++++++++ src/internal/connector/onedrive/item.go | 31 +++++++------- src/internal/connector/onedrive/item_test.go | 2 +- src/internal/connector/onedrive/permission.go | 41 ++++++++++++------- src/internal/connector/onedrive/restore.go | 7 ++++ src/internal/connector/sharepoint/restore.go | 3 +- .../operations/backup_integration_test.go | 15 ++----- 8 files changed, 74 insertions(+), 45 deletions(-) diff --git a/src/internal/connector/data_collections.go b/src/internal/connector/data_collections.go index 77b5ba7ca..fe19ec5cf 100644 --- a/src/internal/connector/data_collections.go +++ b/src/internal/connector/data_collections.go @@ -218,7 +218,7 @@ func (gc *GraphConnector) ConsumeRestoreCollections( case selectors.ServiceOneDrive: status, err = onedrive.RestoreCollections(ctx, creds, backupVersion, gc.Service, dest, opts, dcs, deets, errs) case selectors.ServiceSharePoint: - status, err = sharepoint.RestoreCollections(ctx, backupVersion, creds, gc.Service, dest, dcs, deets, errs) + status, err = sharepoint.RestoreCollections(ctx, backupVersion, creds, gc.Service, dest, opts, dcs, deets, errs) default: err = clues.Wrap(clues.New(selector.Service.String()), "service not supported") } diff --git a/src/internal/connector/onedrive/api/drive.go b/src/internal/connector/onedrive/api/drive.go index 3567ece4c..feeead395 100644 --- a/src/internal/connector/onedrive/api/drive.go +++ b/src/internal/connector/onedrive/api/drive.go @@ -372,3 +372,21 @@ func GetFolderByName( return foundItem, nil } + +func PostItemPermissionUpdate( + ctx context.Context, + service graph.Servicer, + driveID, itemID string, + body *drive.ItemsItemInvitePostRequestBody, +) (drives.ItemItemsItemInviteResponseable, error) { + itm, err := service.Client(). + DrivesById(driveID). + ItemsById(itemID). + Invite(). + Post(ctx, body, nil) + if err != nil { + return nil, graph.Wrap(ctx, err, "posting permissions") + } + + return itm, nil +} diff --git a/src/internal/connector/onedrive/item.go b/src/internal/connector/onedrive/item.go index 0dbac6508..3209bdb54 100644 --- a/src/internal/connector/onedrive/item.go +++ b/src/internal/connector/onedrive/item.go @@ -242,24 +242,23 @@ func filterUserPermissions(ctx context.Context, perms []models.Permissionable) [ // read - Read // empty - Restricted View roles := p.GetRoles() - entityID := "" - if gv2.GetUser() != nil { - entityID = ptr.Val(gv2.GetUser().GetId()) - } else if gv2.GetGroup() != nil { - entityID = ptr.Val(gv2.GetGroup().GetId()) - } else { - logm := logger.Ctx(ctx) - if gv2.GetApplication() != nil { - entityID = ptr.Val(gv2.GetApplication().GetId()) - } else if gv2.GetDevice() != nil { - entityID = ptr.Val(gv2.GetDevice().GetId()) - } - if gv2.GetDevice() != nil { - logm.With("device_id", ptr.Val(gv2.GetDevice().GetId())) - } - logm.Info("untracked permission") + switch true { + case gv2.GetUser() != nil: + entityID = ptr.Val(gv2.GetUser().GetId()) + case gv2.GetGroup() != nil: + entityID = ptr.Val(gv2.GetGroup().GetId()) + case gv2.GetApplication() != nil: + entityID = ptr.Val(gv2.GetApplication().GetId()) + case gv2.GetDevice() != nil: + entityID = ptr.Val(gv2.GetDevice().GetId()) + default: + logger.Ctx(ctx).Info("untracked permission") + } + + if gv2.GetDevice() != nil { + logger.Ctx(ctx).With("device_id", ptr.Val(gv2.GetDevice().GetId())) } // Technically GrantedToV2 can also contain devices, but the diff --git a/src/internal/connector/onedrive/item_test.go b/src/internal/connector/onedrive/item_test.go index 65b69ede7..bcad2ced3 100644 --- a/src/internal/connector/onedrive/item_test.go +++ b/src/internal/connector/onedrive/item_test.go @@ -288,7 +288,7 @@ func TestItemUnitTestSuite(t *testing.T) { suite.Run(t, &ItemUnitTestSuite{Suite: tester.NewUnitSuite(t)}) } -func (suite *ItemUnitTestSuite) TestOneDrivePermissionsFilter() { +func (suite *ItemUnitTestSuite) TestDrivePermissionsFilter() { permID := "fakePermId" userID := "fakeuser@provider.com" userID2 := "fakeuser2@provider.com" diff --git a/src/internal/connector/onedrive/permission.go b/src/internal/connector/onedrive/permission.go index a6982e742..505ae4bfa 100644 --- a/src/internal/connector/onedrive/permission.go +++ b/src/internal/connector/onedrive/permission.go @@ -2,13 +2,15 @@ package onedrive import ( "context" + "fmt" "github.com/alcionai/clues" - msdrive "github.com/microsoftgraph/msgraph-sdk-go/drive" + "github.com/microsoftgraph/msgraph-sdk-go/drive" "github.com/microsoftgraph/msgraph-sdk-go/models" "github.com/alcionai/corso/src/internal/common/ptr" "github.com/alcionai/corso/src/internal/connector/graph" + "github.com/alcionai/corso/src/internal/connector/onedrive/api" "github.com/alcionai/corso/src/internal/connector/onedrive/metadata" "github.com/alcionai/corso/src/internal/data" "github.com/alcionai/corso/src/internal/version" @@ -41,7 +43,7 @@ func getCollectionMetadata( ctx context.Context, drivePath *path.DrivePath, dc data.RestoreCollection, - metas map[string]metadata.Metadata, + parentDirToMeta map[string]metadata.Metadata, backupVersion int, restorePerms bool, ) (metadata.Metadata, error) { @@ -59,12 +61,16 @@ func getCollectionMetadata( return metadata.Metadata{}, nil } + fmt.Printf("\n-----\nbackupVersion %+v\n-----\n", backupVersion) + if backupVersion < version.OneDrive4DirIncludesPermissions { - colMeta, err := getParentMetadata(collectionPath, metas) + colMeta, err := getParentMetadata(collectionPath, parentDirToMeta) if err != nil { return metadata.Metadata{}, clues.Wrap(err, "collection metadata") } + fmt.Printf("\n-----\ngot colMeta %+v\n-----\n", colMeta) + return colMeta, nil } @@ -91,7 +97,7 @@ func getCollectionMetadata( func computeParentPermissions( originDir path.Path, // map parent dir -> parent's metadata - parentMetas map[string]metadata.Metadata, + parentDirToMeta map[string]metadata.Metadata, ) (metadata.Metadata, error) { var ( parent path.Path @@ -111,19 +117,22 @@ func computeParentPermissions( drivePath, err := path.ToDrivePath(parent) if err != nil { - return metadata.Metadata{}, clues.New("get parent path") + return metadata.Metadata{}, clues.New("transforming dir to drivePath") } if len(drivePath.Folders) == 0 { return metadata.Metadata{}, nil } - meta, ok = parentMetas[parent.String()] + meta, ok = parentDirToMeta[parent.String()] if !ok { - return metadata.Metadata{}, clues.New("no parent meta") + return metadata.Metadata{}, clues. + New("parent permissions not found"). + With("parent_dir", parent) } if meta.SharingMode == metadata.SharingModeCustom { + fmt.Printf("\n-----\nbefore return %+v\n-----\n", parentDirToMeta) return meta, nil } } @@ -183,7 +192,7 @@ func UpdatePermissions( continue } - pbody := msdrive.NewItemsItemInvitePostRequestBody() + pbody := drive.NewItemsItemInvitePostRequestBody() pbody.SetRoles(roles) if p.Expiration != nil { @@ -208,12 +217,12 @@ func UpdatePermissions( pbody.SetRecipients([]models.DriveRecipientable{rec}) - np, err := service.Client().DrivesById(driveID).ItemsById(itemID).Invite().Post(ctx, pbody, nil) + newPerm, err := api.PostItemPermissionUpdate(ctx, service, driveID, itemID, pbody) if err != nil { - return graph.Wrap(ctx, err, "setting permissions") + return err } - oldPermIDToNewID[p.ID] = ptr.Val(np.GetValue()[0].GetId()) + oldPermIDToNewID[p.ID] = ptr.Val(newPerm.GetValue()[0].GetId()) } return nil @@ -232,7 +241,7 @@ func RestorePermissions( originDir path.Path, current metadata.Metadata, // map parent dir -> parent's metadata - parentMetas map[string]metadata.Metadata, + parentDirToMeta map[string]metadata.Metadata, oldPermIDToNewID map[string]string, ) error { if current.SharingMode == metadata.SharingModeInherited { @@ -241,12 +250,16 @@ func RestorePermissions( ctx = clues.Add(ctx, "permission_item_id", itemID) - parentPermissions, err := computeParentPermissions(originDir, parentMetas) + fmt.Printf("\n-----\nbefore %+v\n-----\n", parentDirToMeta) + + parents, err := computeParentPermissions(originDir, parentDirToMeta) if err != nil { return clues.Wrap(err, "parent permissions").WithClues(ctx) } - permAdded, permRemoved := metadata.DiffPermissions(parentPermissions.Permissions, current.Permissions) + fmt.Printf("\n-----\nafter %+v\n-----\n", parentDirToMeta) + + permAdded, permRemoved := metadata.DiffPermissions(parents.Permissions, current.Permissions) return UpdatePermissions(ctx, creds, service, driveID, itemID, permAdded, permRemoved, oldPermIDToNewID) } diff --git a/src/internal/connector/onedrive/restore.go b/src/internal/connector/onedrive/restore.go index 21a249964..85b2d8a84 100644 --- a/src/internal/connector/onedrive/restore.go +++ b/src/internal/connector/onedrive/restore.go @@ -3,6 +3,7 @@ package onedrive import ( "context" "encoding/json" + "fmt" "io" "runtime/trace" "sort" @@ -187,6 +188,8 @@ func RestoreCollection( trace.Log(ctx, "gc:oneDrive:restoreCollection", directory.String()) logger.Ctx(ctx).Info("restoring onedrive collection") + fmt.Printf("\n-----\n1 %+v\n-----\n", parentDirToMeta) + colMeta, err := getCollectionMetadata( ctx, drivePath, @@ -198,6 +201,8 @@ func RestoreCollection( return metrics, clues.Wrap(err, "getting permissions").WithClues(ctx) } + fmt.Printf("\n-----\n2 %+v\n-----\n", parentDirToMeta) + // Create restore folders and get the folder ID of the folder the data stream will be restored in restoreFolderID, err := CreateRestoreFolders( ctx, @@ -216,6 +221,8 @@ func RestoreCollection( return metrics, clues.Wrap(err, "creating folders for restore") } + fmt.Printf("\n-----\nsetting %s\nto %+v\n-----\n", dc.FullPath(), colMeta) + parentDirToMeta[dc.FullPath().String()] = colMeta items := dc.Items(ctx, errs) diff --git a/src/internal/connector/sharepoint/restore.go b/src/internal/connector/sharepoint/restore.go index 1c06e8ae3..e79151692 100644 --- a/src/internal/connector/sharepoint/restore.go +++ b/src/internal/connector/sharepoint/restore.go @@ -46,6 +46,7 @@ func RestoreCollections( creds account.M365Config, service graph.Servicer, dest control.RestoreDestination, + opts control.Options, dcs []data.RestoreCollection, deets *details.Builder, errs *fault.Bus, @@ -82,7 +83,7 @@ func RestoreCollections( onedrive.SharePointSource, dest.ContainerName, deets, - false, + opts.RestorePermissions, errs) case path.ListsCategory: diff --git a/src/internal/operations/backup_integration_test.go b/src/internal/operations/backup_integration_test.go index 5e710a5bb..ea5d4187a 100644 --- a/src/internal/operations/backup_integration_test.go +++ b/src/internal/operations/backup_integration_test.go @@ -1336,7 +1336,6 @@ func runDriveIncrementalTest( updateFiles func(t *testing.T) itemsRead int itemsWritten int - skip bool }{ { name: "clean incremental, no changes", @@ -1364,7 +1363,6 @@ func runDriveIncrementalTest( }, { name: "add permission to new file", - skip: skipPermissionsTests, updateFiles: func(t *testing.T) { driveItem := models.NewDriveItem() driveItem.SetName(&newFileName) @@ -1385,7 +1383,6 @@ func runDriveIncrementalTest( }, { name: "remove permission from new file", - skip: skipPermissionsTests, updateFiles: func(t *testing.T) { driveItem := models.NewDriveItem() driveItem.SetName(&newFileName) @@ -1399,14 +1396,13 @@ func runDriveIncrementalTest( []metadata.Permission{}, []metadata.Permission{writePerm}, permissionIDMappings) - require.NoErrorf(t, err, "adding permission to file %v", clues.ToCore(err)) + require.NoErrorf(t, err, "removing permission from file %v", clues.ToCore(err)) }, itemsRead: 1, // .data file for newitem itemsWritten: 2, // .meta for newitem, .dirmeta for parent (.data is not written as it is not updated) }, { name: "add permission to container", - skip: skipPermissionsTests, updateFiles: func(t *testing.T) { targetContainer := containerIDs[container1] driveItem := models.NewDriveItem() @@ -1421,14 +1417,13 @@ func runDriveIncrementalTest( []metadata.Permission{writePerm}, []metadata.Permission{}, permissionIDMappings) - require.NoErrorf(t, err, "adding permission to file %v", clues.ToCore(err)) + require.NoErrorf(t, err, "adding permission to container %v", clues.ToCore(err)) }, itemsRead: 0, itemsWritten: 1, // .dirmeta for collection }, { name: "remove permission from container", - skip: skipPermissionsTests, updateFiles: func(t *testing.T) { targetContainer := containerIDs[container1] driveItem := models.NewDriveItem() @@ -1443,7 +1438,7 @@ func runDriveIncrementalTest( []metadata.Permission{}, []metadata.Permission{writePerm}, permissionIDMappings) - require.NoErrorf(t, err, "adding permission to file %v", clues.ToCore(err)) + require.NoErrorf(t, err, "removing permission from container %v", clues.ToCore(err)) }, itemsRead: 0, itemsWritten: 1, // .dirmeta for collection @@ -1614,10 +1609,6 @@ func runDriveIncrementalTest( } for _, test := range table { suite.Run(test.name, func() { - if test.skip { - suite.T().Skip("flagged to skip") - } - cleanGC, err := connector.NewGraphConnector(ctx, acct, resource) require.NoError(t, err, clues.ToCore(err))