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: case selectors.ServiceOneDrive:
status, err = onedrive.RestoreCollections(ctx, creds, backupVersion, gc.Service, dest, opts, dcs, deets, errs) status, err = onedrive.RestoreCollections(ctx, creds, backupVersion, gc.Service, dest, opts, dcs, deets, errs)
case selectors.ServiceSharePoint: 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: default:
err = clues.Wrap(clues.New(selector.Service.String()), "service not supported") err = clues.Wrap(clues.New(selector.Service.String()), "service not supported")
} }

View File

@ -372,3 +372,21 @@ func GetFolderByName(
return foundItem, nil 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 // read - Read
// empty - Restricted View // empty - Restricted View
roles := p.GetRoles() roles := p.GetRoles()
entityID := "" 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 { switch true {
entityID = ptr.Val(gv2.GetApplication().GetId()) case gv2.GetUser() != nil:
} else if gv2.GetDevice() != nil { entityID = ptr.Val(gv2.GetUser().GetId())
entityID = ptr.Val(gv2.GetDevice().GetId()) case gv2.GetGroup() != nil:
} entityID = ptr.Val(gv2.GetGroup().GetId())
if gv2.GetDevice() != nil { case gv2.GetApplication() != nil:
logm.With("device_id", ptr.Val(gv2.GetDevice().GetId())) entityID = ptr.Val(gv2.GetApplication().GetId())
} case gv2.GetDevice() != nil:
logm.Info("untracked permission") 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 // 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)}) suite.Run(t, &ItemUnitTestSuite{Suite: tester.NewUnitSuite(t)})
} }
func (suite *ItemUnitTestSuite) TestOneDrivePermissionsFilter() { func (suite *ItemUnitTestSuite) TestDrivePermissionsFilter() {
permID := "fakePermId" permID := "fakePermId"
userID := "fakeuser@provider.com" userID := "fakeuser@provider.com"
userID2 := "fakeuser2@provider.com" userID2 := "fakeuser2@provider.com"

View File

@ -2,13 +2,15 @@ package onedrive
import ( import (
"context" "context"
"fmt"
"github.com/alcionai/clues" "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/microsoftgraph/msgraph-sdk-go/models"
"github.com/alcionai/corso/src/internal/common/ptr" "github.com/alcionai/corso/src/internal/common/ptr"
"github.com/alcionai/corso/src/internal/connector/graph" "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/connector/onedrive/metadata"
"github.com/alcionai/corso/src/internal/data" "github.com/alcionai/corso/src/internal/data"
"github.com/alcionai/corso/src/internal/version" "github.com/alcionai/corso/src/internal/version"
@ -41,7 +43,7 @@ func getCollectionMetadata(
ctx context.Context, ctx context.Context,
drivePath *path.DrivePath, drivePath *path.DrivePath,
dc data.RestoreCollection, dc data.RestoreCollection,
metas map[string]metadata.Metadata, parentDirToMeta map[string]metadata.Metadata,
backupVersion int, backupVersion int,
restorePerms bool, restorePerms bool,
) (metadata.Metadata, error) { ) (metadata.Metadata, error) {
@ -59,12 +61,16 @@ func getCollectionMetadata(
return metadata.Metadata{}, nil return metadata.Metadata{}, nil
} }
fmt.Printf("\n-----\nbackupVersion %+v\n-----\n", backupVersion)
if backupVersion < version.OneDrive4DirIncludesPermissions { if backupVersion < version.OneDrive4DirIncludesPermissions {
colMeta, err := getParentMetadata(collectionPath, metas) colMeta, err := getParentMetadata(collectionPath, parentDirToMeta)
if err != nil { if err != nil {
return metadata.Metadata{}, clues.Wrap(err, "collection metadata") return metadata.Metadata{}, clues.Wrap(err, "collection metadata")
} }
fmt.Printf("\n-----\ngot colMeta %+v\n-----\n", colMeta)
return colMeta, nil return colMeta, nil
} }
@ -91,7 +97,7 @@ func getCollectionMetadata(
func computeParentPermissions( func computeParentPermissions(
originDir path.Path, originDir path.Path,
// map parent dir -> parent's metadata // map parent dir -> parent's metadata
parentMetas map[string]metadata.Metadata, parentDirToMeta map[string]metadata.Metadata,
) (metadata.Metadata, error) { ) (metadata.Metadata, error) {
var ( var (
parent path.Path parent path.Path
@ -111,19 +117,22 @@ func computeParentPermissions(
drivePath, err := path.ToDrivePath(parent) drivePath, err := path.ToDrivePath(parent)
if err != nil { 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 { if len(drivePath.Folders) == 0 {
return metadata.Metadata{}, nil return metadata.Metadata{}, nil
} }
meta, ok = parentMetas[parent.String()] meta, ok = parentDirToMeta[parent.String()]
if !ok { 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 { if meta.SharingMode == metadata.SharingModeCustom {
fmt.Printf("\n-----\nbefore return %+v\n-----\n", parentDirToMeta)
return meta, nil return meta, nil
} }
} }
@ -183,7 +192,7 @@ func UpdatePermissions(
continue continue
} }
pbody := msdrive.NewItemsItemInvitePostRequestBody() pbody := drive.NewItemsItemInvitePostRequestBody()
pbody.SetRoles(roles) pbody.SetRoles(roles)
if p.Expiration != nil { if p.Expiration != nil {
@ -208,12 +217,12 @@ func UpdatePermissions(
pbody.SetRecipients([]models.DriveRecipientable{rec}) 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 { 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 return nil
@ -232,7 +241,7 @@ func RestorePermissions(
originDir path.Path, originDir path.Path,
current metadata.Metadata, current metadata.Metadata,
// map parent dir -> parent's metadata // map parent dir -> parent's metadata
parentMetas map[string]metadata.Metadata, parentDirToMeta map[string]metadata.Metadata,
oldPermIDToNewID map[string]string, oldPermIDToNewID map[string]string,
) error { ) error {
if current.SharingMode == metadata.SharingModeInherited { if current.SharingMode == metadata.SharingModeInherited {
@ -241,12 +250,16 @@ func RestorePermissions(
ctx = clues.Add(ctx, "permission_item_id", itemID) 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 { if err != nil {
return clues.Wrap(err, "parent permissions").WithClues(ctx) 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) return UpdatePermissions(ctx, creds, service, driveID, itemID, permAdded, permRemoved, oldPermIDToNewID)
} }

View File

@ -3,6 +3,7 @@ package onedrive
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"fmt"
"io" "io"
"runtime/trace" "runtime/trace"
"sort" "sort"
@ -187,6 +188,8 @@ func RestoreCollection(
trace.Log(ctx, "gc:oneDrive:restoreCollection", directory.String()) trace.Log(ctx, "gc:oneDrive:restoreCollection", directory.String())
logger.Ctx(ctx).Info("restoring onedrive collection") logger.Ctx(ctx).Info("restoring onedrive collection")
fmt.Printf("\n-----\n1 %+v\n-----\n", parentDirToMeta)
colMeta, err := getCollectionMetadata( colMeta, err := getCollectionMetadata(
ctx, ctx,
drivePath, drivePath,
@ -198,6 +201,8 @@ func RestoreCollection(
return metrics, clues.Wrap(err, "getting permissions").WithClues(ctx) 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 // Create restore folders and get the folder ID of the folder the data stream will be restored in
restoreFolderID, err := CreateRestoreFolders( restoreFolderID, err := CreateRestoreFolders(
ctx, ctx,
@ -216,6 +221,8 @@ func RestoreCollection(
return metrics, clues.Wrap(err, "creating folders for restore") 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 parentDirToMeta[dc.FullPath().String()] = colMeta
items := dc.Items(ctx, errs) items := dc.Items(ctx, errs)

View File

@ -46,6 +46,7 @@ func RestoreCollections(
creds account.M365Config, creds account.M365Config,
service graph.Servicer, service graph.Servicer,
dest control.RestoreDestination, dest control.RestoreDestination,
opts control.Options,
dcs []data.RestoreCollection, dcs []data.RestoreCollection,
deets *details.Builder, deets *details.Builder,
errs *fault.Bus, errs *fault.Bus,
@ -82,7 +83,7 @@ func RestoreCollections(
onedrive.SharePointSource, onedrive.SharePointSource,
dest.ContainerName, dest.ContainerName,
deets, deets,
false, opts.RestorePermissions,
errs) errs)
case path.ListsCategory: case path.ListsCategory:

View File

@ -1336,7 +1336,6 @@ func runDriveIncrementalTest(
updateFiles func(t *testing.T) updateFiles func(t *testing.T)
itemsRead int itemsRead int
itemsWritten int itemsWritten int
skip bool
}{ }{
{ {
name: "clean incremental, no changes", name: "clean incremental, no changes",
@ -1364,7 +1363,6 @@ func runDriveIncrementalTest(
}, },
{ {
name: "add permission to new file", name: "add permission to new file",
skip: skipPermissionsTests,
updateFiles: func(t *testing.T) { updateFiles: func(t *testing.T) {
driveItem := models.NewDriveItem() driveItem := models.NewDriveItem()
driveItem.SetName(&newFileName) driveItem.SetName(&newFileName)
@ -1385,7 +1383,6 @@ func runDriveIncrementalTest(
}, },
{ {
name: "remove permission from new file", name: "remove permission from new file",
skip: skipPermissionsTests,
updateFiles: func(t *testing.T) { updateFiles: func(t *testing.T) {
driveItem := models.NewDriveItem() driveItem := models.NewDriveItem()
driveItem.SetName(&newFileName) driveItem.SetName(&newFileName)
@ -1399,14 +1396,13 @@ func runDriveIncrementalTest(
[]metadata.Permission{}, []metadata.Permission{},
[]metadata.Permission{writePerm}, []metadata.Permission{writePerm},
permissionIDMappings) 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 itemsRead: 1, // .data file for newitem
itemsWritten: 2, // .meta for newitem, .dirmeta for parent (.data is not written as it is not updated) itemsWritten: 2, // .meta for newitem, .dirmeta for parent (.data is not written as it is not updated)
}, },
{ {
name: "add permission to container", name: "add permission to container",
skip: skipPermissionsTests,
updateFiles: func(t *testing.T) { updateFiles: func(t *testing.T) {
targetContainer := containerIDs[container1] targetContainer := containerIDs[container1]
driveItem := models.NewDriveItem() driveItem := models.NewDriveItem()
@ -1421,14 +1417,13 @@ func runDriveIncrementalTest(
[]metadata.Permission{writePerm}, []metadata.Permission{writePerm},
[]metadata.Permission{}, []metadata.Permission{},
permissionIDMappings) 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, itemsRead: 0,
itemsWritten: 1, // .dirmeta for collection itemsWritten: 1, // .dirmeta for collection
}, },
{ {
name: "remove permission from container", name: "remove permission from container",
skip: skipPermissionsTests,
updateFiles: func(t *testing.T) { updateFiles: func(t *testing.T) {
targetContainer := containerIDs[container1] targetContainer := containerIDs[container1]
driveItem := models.NewDriveItem() driveItem := models.NewDriveItem()
@ -1443,7 +1438,7 @@ func runDriveIncrementalTest(
[]metadata.Permission{}, []metadata.Permission{},
[]metadata.Permission{writePerm}, []metadata.Permission{writePerm},
permissionIDMappings) 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, itemsRead: 0,
itemsWritten: 1, // .dirmeta for collection itemsWritten: 1, // .dirmeta for collection
@ -1614,10 +1609,6 @@ func runDriveIncrementalTest(
} }
for _, test := range table { for _, test := range table {
suite.Run(test.name, func() { suite.Run(test.name, func() {
if test.skip {
suite.T().Skip("flagged to skip")
}
cleanGC, err := connector.NewGraphConnector(ctx, acct, resource) cleanGC, err := connector.NewGraphConnector(ctx, acct, resource)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))