diff --git a/proprietary/Office365/RestoreProvider/RestoreProvider.Calendar.cs b/proprietary/Office365/RestoreProvider/RestoreProvider.Calendar.cs index 2fbe73f8e..51ba1c931 100644 --- a/proprietary/Office365/RestoreProvider/RestoreProvider.Calendar.cs +++ b/proprietary/Office365/RestoreProvider/RestoreProvider.Calendar.cs @@ -381,13 +381,14 @@ partial class RestoreProvider if (target.Type == SourceItemType.User) { - _targetUserId = target.Metadata["o365:Id"]!; - _targetCalendarId = await GetDefaultRestoreTargetCalendar(_targetUserId, cancel); + _targetUserId = target.Metadata.GetValueOrDefault("o365:Id"); + if (!string.IsNullOrWhiteSpace(_targetUserId)) + _targetCalendarId = await GetDefaultRestoreTargetCalendar(_targetUserId, cancel); } else if (target.Type == SourceItemType.UserCalendar || target.Type == SourceItemType.Calendar) { _targetUserId = target.Path.TrimStart(Path.DirectorySeparatorChar).Split(Path.DirectorySeparatorChar).Skip(1).FirstOrDefault(); - _targetCalendarId = target.Metadata["o365:Id"]; + _targetCalendarId = target.Metadata.GetValueOrDefault("o365:Id"); } else { diff --git a/proprietary/Office365/RestoreProvider/RestoreProvider.Contact.cs b/proprietary/Office365/RestoreProvider/RestoreProvider.Contact.cs index 91ef4af4a..c2f5381c1 100644 --- a/proprietary/Office365/RestoreProvider/RestoreProvider.Contact.cs +++ b/proprietary/Office365/RestoreProvider/RestoreProvider.Contact.cs @@ -375,7 +375,8 @@ partial class RestoreProvider if (target.Type == SourceItemType.User) { - _targetUserId = target.Metadata["o365:Id"]!; + _targetUserId = target.Metadata.GetValueOrDefault("o365:Id"); + if (!string.IsNullOrWhiteSpace(_targetUserId)) _targetFolderId = await GetDefaultRestoreTargetContactFolder(_targetUserId, cancel); } else if (target.Type == SourceItemType.UserContacts) diff --git a/proprietary/Office365/RestoreProvider/RestoreProvider.Email.cs b/proprietary/Office365/RestoreProvider/RestoreProvider.Email.cs index 89da6343c..f62156c6a 100644 --- a/proprietary/Office365/RestoreProvider/RestoreProvider.Email.cs +++ b/proprietary/Office365/RestoreProvider/RestoreProvider.Email.cs @@ -31,8 +31,9 @@ partial class RestoreProvider if (target.Type == SourceItemType.User) { - _targetUserId = target.Metadata["o365:Id"]!; - _targetMailboxId = await GetDefaultRestoreTargetMailbox(_targetUserId, cancel); + _targetUserId = target.Metadata.GetValueOrDefault("o365:Id"); + if (!string.IsNullOrWhiteSpace(_targetUserId)) + _targetMailboxId = await GetDefaultRestoreTargetMailbox(_targetUserId, cancel); } else if (target.Type == SourceItemType.UserMailbox) { @@ -44,7 +45,7 @@ partial class RestoreProvider else if (target.Type == SourceItemType.UserMailboxFolder) { _targetUserId = target.Path.TrimStart(Path.DirectorySeparatorChar).Split(Path.DirectorySeparatorChar).Skip(1).FirstOrDefault(); - _targetMailboxId = target.Metadata["o365:Id"]; + _targetMailboxId = target.Metadata.GetValueOrDefault("o365:Id"); } else { @@ -69,7 +70,7 @@ partial class RestoreProvider var targetNames = new[] { RESTORED_FOLDER_NAME }; - var path = string.Join("/", new[] { + var path = string.Join(Path.DirectorySeparatorChar, new[] { Uri.EscapeDataString(Office365MetaType.Users.ToString().ToLowerInvariant()), Uri.EscapeDataString(userId), Uri.EscapeDataString(Office365UserType.Mailbox.ToString().ToLowerInvariant()) @@ -85,12 +86,18 @@ partial class RestoreProvider break; var folderMetadata = await folder.GetMinorMetadata(cancel); - var folderId = folderMetadata["o365:Id"]; + if (!Enum.TryParse(folderMetadata.GetValueOrDefault("o365:Type"), out var type)) + continue; + + if (type != SourceItemType.UserMailboxFolder) + continue; + + var folderId = folderMetadata.GetValueOrDefault("o365:Id"); if (string.IsNullOrWhiteSpace(folderId)) continue; - var folderName = folderMetadata["o365:Name"]; - if (targetNames.Contains(folderName, StringComparer.OrdinalIgnoreCase)) + var folderName = folderMetadata.GetValueOrDefault("o365:Name"); + if (!string.IsNullOrWhiteSpace(folderName) && targetNames.Contains(folderName, StringComparer.OrdinalIgnoreCase)) return folderId; } diff --git a/proprietary/Office365/RestoreProvider/RestoreProvider.Group.cs b/proprietary/Office365/RestoreProvider/RestoreProvider.Group.cs index e3025e72b..bed3859f7 100644 --- a/proprietary/Office365/RestoreProvider/RestoreProvider.Group.cs +++ b/proprietary/Office365/RestoreProvider/RestoreProvider.Group.cs @@ -1276,15 +1276,15 @@ public partial class RestoreProvider if (target.Type == SourceItemType.Group) { - _targetGroupId = target.Metadata["o365:Id"]!; + _targetGroupId = target.Metadata.GetValueOrDefault("o365:Id"); } else if (target.Type == SourceItemType.GroupTeams) { - _targetGroupId = target.Metadata["o365:Id"]!; + _targetGroupId = target.Metadata.GetValueOrDefault("o365:Id"); } else if (target.Type == SourceItemType.GroupChannel) { - _targetGroupId = target.Metadata["o365:GroupId"]!; + _targetGroupId = target.Metadata.GetValueOrDefault("o365:GroupId"); } else { @@ -1333,7 +1333,7 @@ public partial class RestoreProvider if (string.IsNullOrWhiteSpace(groupId)) return null; - channelId = target.Metadata["o365:Id"]; + channelId = target.Metadata.GetValueOrDefault("o365:Id"); if (string.IsNullOrWhiteSpace(channelId)) return null; diff --git a/proprietary/Office365/WebModule/WebModule.cs b/proprietary/Office365/WebModule/WebModule.cs index 186626636..846ebaaae 100644 --- a/proprietary/Office365/WebModule/WebModule.cs +++ b/proprietary/Office365/WebModule/WebModule.cs @@ -92,7 +92,7 @@ public class WebModule : IWebModule using var client = new SourceProvider(url, "", forwardoptions); await client.Initialize(cancellationToken); - var targetEntry = await client.GetEntry(path ?? "", isFolder: true, cancellationToken).ConfigureAwait(false); + var targetEntry = await client.GetEntry((path ?? "").TrimStart('/'), isFolder: true, cancellationToken).ConfigureAwait(false); if (targetEntry == null) throw new DirectoryNotFoundException($"Path not found: {path}");