setting aside
This commit is contained in:
parent
45c40993d4
commit
79a7288d99
@ -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")
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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"
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
|
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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))
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user