using Duplicati.Library.Interface; using Duplicati.Library.Utility.Options; using Duplicati.Proprietary.Office365.SourceItems; namespace Duplicati.Proprietary.Office365; internal static class OptionsHelper { internal const string ModuleKey = "office365"; internal const string OFFICE_TENANT_OPTION = "office365-tenant-id"; internal const string OFFICE_CLIENT_OPTION = "office365-client-id"; internal const string OFFICE_SECRET_OPTION = "office365-client-secret"; internal const string OFFICE_CERTIFICATE_PATH_OPTION = "office365-certificate-path"; internal const string OFFICE_CERTIFICATE_PASSWORD_OPTION = "office365-certificate-password"; internal const string OFFICE_GRAPH_BASE_OPTION = "office365-graph-base-url"; internal const string OFFICE_SCOPE_OPTION = "office365-scope"; internal const string OFFICE_SCOPE_OPTION_DEFAULT = "https://graph.microsoft.com/.default"; internal const string OFFICE_IGNORE_EXISTING_OPTION = "office365-ignore-existing"; internal const string OFFICE_INCLUDED_ROOT_TYPES_OPTION = "office365-included-root-types"; internal const string OFFICE_INCLUDED_USER_TYPES_OPTION = "office365-included-user-types"; internal const string OFFICE_INCLUDED_GROUP_TYPES_OPTION = "office365-included-group-types"; /// /// User types that require delegated permissions, default disabled. /// private static readonly Office365UserType[] DELEGATED_USER_TYPES = [ Office365UserType.Tasks, Office365UserType.Notes ]; /// /// Group types that require delegated permissions, default disabled. /// private static readonly Office365GroupType[] DELEGATED_GROUP_TYPES = [ Office365GroupType.Calendar, Office365GroupType.Notes ]; /// /// The default included root types. /// private static readonly Office365MetaType[] DEFAULT_INCLUDED_ROOT_TYPES = Enum.GetValues() .ToArray(); /// /// The default included group types. /// private static readonly Office365GroupType[] DEFAULT_INCLUDED_GROUP_TYPES = Enum.GetValues() .Except(DELEGATED_GROUP_TYPES) .ToArray(); /// /// The default included user types. /// private static readonly Office365UserType[] DEFAULT_INCLUDED_USER_TYPES = Enum.GetValues() .Except(DELEGATED_USER_TYPES) .ToArray(); internal const string DEFAULT_GRAPH_BASE_URL = "https://graph.microsoft.com"; internal sealed record ParsedOptions( string TenantId, AuthOptionsHelper.AuthOptions AuthOptions, string GraphBaseUrl, string? CertificatePath, string? CertificatePassword, string Scope, Office365MetaType[] IncludedRootTypes, Office365UserType[] IncludedUserTypes, Office365GroupType[] IncludedGroupTypes ); internal static ParsedOptions ParseAndValidateOptions(string url, Dictionary options) { var _authOptions = AuthOptionsHelper.ParseWithAlias(options, new Library.Utility.Uri(url), OFFICE_CLIENT_OPTION, OFFICE_SECRET_OPTION) .RequireCredentials(); var _tenantId = options.GetValueOrDefault(OFFICE_TENANT_OPTION)!; if (string.IsNullOrWhiteSpace(_tenantId)) throw new UserInformationException(Strings.MissingTenantId, "MissingTenantId"); var _graphBaseUrl = options.GetValueOrDefault(OFFICE_GRAPH_BASE_OPTION) ?? DEFAULT_GRAPH_BASE_URL; if (string.IsNullOrWhiteSpace(_graphBaseUrl)) _graphBaseUrl = DEFAULT_GRAPH_BASE_URL; var _certificatePath = options.GetValueOrDefault(OFFICE_CERTIFICATE_PATH_OPTION); var _certificatePassword = options.GetValueOrDefault(OFFICE_CERTIFICATE_PASSWORD_OPTION); var _scope = options.GetValueOrDefault(OFFICE_SCOPE_OPTION); if (string.IsNullOrWhiteSpace(_scope)) _scope = OFFICE_SCOPE_OPTION_DEFAULT; var includedRootTypes = Library.Utility.Utility.ParseFlagsOption(options, OFFICE_INCLUDED_ROOT_TYPES_OPTION, (Office365MetaType)DEFAULT_INCLUDED_ROOT_TYPES.Aggregate(0, (acc, type) => acc | (int)type)); var includedUserTypes = Library.Utility.Utility.ParseFlagsOption(options, OFFICE_INCLUDED_USER_TYPES_OPTION, (Office365UserType)DEFAULT_INCLUDED_USER_TYPES.Aggregate(0, (acc, type) => acc | (int)type)); var includedGroupTypes = Library.Utility.Utility.ParseFlagsOption(options, OFFICE_INCLUDED_GROUP_TYPES_OPTION, (Office365GroupType)DEFAULT_INCLUDED_GROUP_TYPES.Aggregate(0, (acc, type) => acc | (int)type)); return new ParsedOptions( TenantId: _tenantId, AuthOptions: _authOptions, GraphBaseUrl: _graphBaseUrl, CertificatePath: _certificatePath, CertificatePassword: _certificatePassword, Scope: _scope, IncludedRootTypes: Enum.GetValues().Where(n => includedRootTypes.HasFlag(n)).ToArray(), IncludedUserTypes: Enum.GetValues().Where(n => includedUserTypes.HasFlag(n)).ToArray(), IncludedGroupTypes: Enum.GetValues().Where(n => includedGroupTypes.HasFlag(n)).ToArray() ); } internal static IList SupportedCommands => [ new CommandLineArgument(OFFICE_TENANT_OPTION, CommandLineArgument.ArgumentType.String, Strings.OfficeTenantOptionShort, Strings.OfficeTenantOptionLong), new CommandLineArgument(OFFICE_CLIENT_OPTION, CommandLineArgument.ArgumentType.String, Strings.OfficeClientOptionShort, Strings.OfficeClientOptionLong, null, [AuthOptionsHelper.AuthUsernameOption], null), new CommandLineArgument(OFFICE_SECRET_OPTION, CommandLineArgument.ArgumentType.Password, Strings.OfficeSecretOptionShort, Strings.OfficeSecretOptionLong, null, [AuthOptionsHelper.AuthPasswordOption], null), new CommandLineArgument(OFFICE_CERTIFICATE_PATH_OPTION, CommandLineArgument.ArgumentType.Path, Strings.OfficeCertificatePathOptionShort, Strings.OfficeCertificatePathOptionLong), new CommandLineArgument(OFFICE_CERTIFICATE_PASSWORD_OPTION, CommandLineArgument.ArgumentType.Password, Strings.OfficeCertificatePasswordOptionShort, Strings.OfficeCertificatePasswordOptionLong), new CommandLineArgument(OFFICE_GRAPH_BASE_OPTION, CommandLineArgument.ArgumentType.String, Strings.OfficeGraphBaseOptionShort, Strings.OfficeGraphBaseOptionLong, DEFAULT_GRAPH_BASE_URL), new CommandLineArgument(OFFICE_SCOPE_OPTION, CommandLineArgument.ArgumentType.String, Strings.OfficeScopeOptionShort, Strings.OfficeScopeOptionLong, OFFICE_SCOPE_OPTION_DEFAULT), new CommandLineArgument(OFFICE_INCLUDED_ROOT_TYPES_OPTION, CommandLineArgument.ArgumentType.Flags, Strings.OfficeIncludedRootTypesShort, Strings.OfficeIncludedRootTypesLong, string.Join(",", DEFAULT_INCLUDED_ROOT_TYPES.Select(n => n.ToString()).ToArray()), null, Enum.GetNames()), new CommandLineArgument(OFFICE_INCLUDED_USER_TYPES_OPTION, CommandLineArgument.ArgumentType.Flags, Strings.OfficeIncludedUserTypesShort, Strings.OfficeIncludedUserTypesLong, string.Join(",", DEFAULT_INCLUDED_USER_TYPES.Select(n => n.ToString()).ToArray()), null, Enum.GetNames()), new CommandLineArgument(OFFICE_INCLUDED_GROUP_TYPES_OPTION, CommandLineArgument.ArgumentType.Flags, Strings.OfficeIncludedGroupTypesShort, Strings.OfficeIncludedGroupTypesLong, string.Join(",", DEFAULT_INCLUDED_GROUP_TYPES.Select(n => n.ToString()).ToArray()), null, Enum.GetNames()) ]; }