setting aside

This commit is contained in:
ryanfkeepers 2023-05-03 15:19:52 -06:00
parent 45c40993d4
commit 79a7288d99
8 changed files with 74 additions and 45 deletions

View File

@ -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")
}

View File

@ -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
}

View File

@ -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

View File

@ -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"

View File

@ -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)
}

View File

@ -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)

View File

@ -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:

View File

@ -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))