File: System\DirectoryServices\AccountManagement\QbeFilterDescription.cs
Web Access
Project: src\src\runtime\src\libraries\System.DirectoryServices.AccountManagement\src\System.DirectoryServices.AccountManagement.csproj (System.DirectoryServices.AccountManagement)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Collections;
using System.Diagnostics;

namespace System.DirectoryServices.AccountManagement
{
    //
    // A collection of individual property filters
    //
    internal sealed class QbeFilterDescription
    {
        private readonly ArrayList _filtersToApply = new ArrayList();

        public QbeFilterDescription()
        {
            // Nothing to do
        }

        public ArrayList FiltersToApply
        {
            get
            {
                return _filtersToApply;
            }
        }
    }

    //
    // Constructs individual property filters, given the name of the property
    //
    internal static class FilterFactory
    {
        private static readonly Hashtable s_subclasses = new Hashtable();

        static FilterFactory()
        {
            s_subclasses[DescriptionFilter.PropertyNameStatic] = typeof(DescriptionFilter);
            s_subclasses[DisplayNameFilter.PropertyNameStatic] = typeof(DisplayNameFilter);
            s_subclasses[IdentityClaimFilter.PropertyNameStatic] = typeof(IdentityClaimFilter);
            s_subclasses[SamAccountNameFilter.PropertyNameStatic] = typeof(SamAccountNameFilter);
            s_subclasses[DistinguishedNameFilter.PropertyNameStatic] = typeof(DistinguishedNameFilter);
            s_subclasses[GuidFilter.PropertyNameStatic] = typeof(GuidFilter);
            s_subclasses[UserPrincipalNameFilter.PropertyNameStatic] = typeof(UserPrincipalNameFilter);
            s_subclasses[StructuralObjectClassFilter.PropertyNameStatic] = typeof(StructuralObjectClassFilter);
            s_subclasses[NameFilter.PropertyNameStatic] = typeof(NameFilter);
            s_subclasses[CertificateFilter.PropertyNameStatic] = typeof(CertificateFilter);
            s_subclasses[AuthPrincEnabledFilter.PropertyNameStatic] = typeof(AuthPrincEnabledFilter);
            s_subclasses[PermittedWorkstationFilter.PropertyNameStatic] = typeof(PermittedWorkstationFilter);
            s_subclasses[PermittedLogonTimesFilter.PropertyNameStatic] = typeof(PermittedLogonTimesFilter);
            s_subclasses[ExpirationDateFilter.PropertyNameStatic] = typeof(ExpirationDateFilter);
            s_subclasses[SmartcardLogonRequiredFilter.PropertyNameStatic] = typeof(SmartcardLogonRequiredFilter);
            s_subclasses[DelegationPermittedFilter.PropertyNameStatic] = typeof(DelegationPermittedFilter);
            s_subclasses[HomeDirectoryFilter.PropertyNameStatic] = typeof(HomeDirectoryFilter);
            s_subclasses[HomeDriveFilter.PropertyNameStatic] = typeof(HomeDriveFilter);
            s_subclasses[ScriptPathFilter.PropertyNameStatic] = typeof(ScriptPathFilter);
            s_subclasses[PasswordNotRequiredFilter.PropertyNameStatic] = typeof(PasswordNotRequiredFilter);
            s_subclasses[PasswordNeverExpiresFilter.PropertyNameStatic] = typeof(PasswordNeverExpiresFilter);
            s_subclasses[CannotChangePasswordFilter.PropertyNameStatic] = typeof(CannotChangePasswordFilter);
            s_subclasses[AllowReversiblePasswordEncryptionFilter.PropertyNameStatic] = typeof(AllowReversiblePasswordEncryptionFilter);
            s_subclasses[GivenNameFilter.PropertyNameStatic] = typeof(GivenNameFilter);
            s_subclasses[MiddleNameFilter.PropertyNameStatic] = typeof(MiddleNameFilter);
            s_subclasses[SurnameFilter.PropertyNameStatic] = typeof(SurnameFilter);
            s_subclasses[EmailAddressFilter.PropertyNameStatic] = typeof(EmailAddressFilter);
            s_subclasses[VoiceTelephoneNumberFilter.PropertyNameStatic] = typeof(VoiceTelephoneNumberFilter);
            s_subclasses[EmployeeIDFilter.PropertyNameStatic] = typeof(EmployeeIDFilter);
            s_subclasses[GroupIsSecurityGroupFilter.PropertyNameStatic] = typeof(GroupIsSecurityGroupFilter);
            s_subclasses[GroupScopeFilter.PropertyNameStatic] = typeof(GroupScopeFilter);
            s_subclasses[ServicePrincipalNameFilter.PropertyNameStatic] = typeof(ServicePrincipalNameFilter);
            s_subclasses[ExtensionCacheFilter.PropertyNameStatic] = typeof(ExtensionCacheFilter);
            s_subclasses[BadPasswordAttemptFilter.PropertyNameStatic] = typeof(BadPasswordAttemptFilter);
            s_subclasses[ExpiredAccountFilter.PropertyNameStatic] = typeof(ExpiredAccountFilter);
            s_subclasses[LastLogonTimeFilter.PropertyNameStatic] = typeof(LastLogonTimeFilter);
            s_subclasses[LockoutTimeFilter.PropertyNameStatic] = typeof(LockoutTimeFilter);
            s_subclasses[PasswordSetTimeFilter.PropertyNameStatic] = typeof(PasswordSetTimeFilter);
            s_subclasses[BadLogonCountFilter.PropertyNameStatic] = typeof(BadLogonCountFilter);
        }

        // Given a property name, constructs and returns the appropriate individual property
        // filter
        public static object CreateFilter(string propertyName)
        {
            GlobalDebug.WriteLineIf(GlobalDebug.Info, "QbeFilterDescription", "FilterFactory.CreateFilter: name=" + propertyName);

            Type type = (Type)s_subclasses[propertyName];
            Debug.Assert(type != null);

            return System.Activator.CreateInstance(type);
        }
    }

    //
    // The individual property filters
    //

    // Base class: Defines the external interface shared by all individual property filters
    internal abstract class FilterBase
    {
        public object Value
        {
            get { return _value; }
            set { _value = value; }
        }

        private object _value;

        // Some providers need place to store extra state, e.g., a processed form of Value
        public object Extra
        {
            get { return _extra; }
            set { _extra = value; }
        }

        private object _extra;

        public abstract string PropertyName { get; }
    }

    // The derived classes

    internal sealed class DescriptionFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.PrincipalDescription;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class SidFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.PrincipalSid;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class SamAccountNameFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.PrincipalSamAccountName;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class DistinguishedNameFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.PrincipalDistinguishedName;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }
    internal sealed class GuidFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.PrincipalGuid;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }
    internal sealed class IdentityClaimFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.PrincipalIdentityClaims;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class UserPrincipalNameFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.PrincipalUserPrincipalName;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }
    internal sealed class StructuralObjectClassFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.PrincipalStructuralObjectClass;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }
    internal sealed class NameFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.PrincipalName;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class DisplayNameFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.PrincipalDisplayName;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }
    internal sealed class CertificateFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.AuthenticablePrincipalCertificates;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class AuthPrincEnabledFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.AuthenticablePrincipalEnabled;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class PermittedWorkstationFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.AcctInfoPermittedWorkstations;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class PermittedLogonTimesFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.AcctInfoPermittedLogonTimes;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class ExpirationDateFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.AcctInfoExpirationDate;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class SmartcardLogonRequiredFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.AcctInfoSmartcardRequired;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class DelegationPermittedFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.AcctInfoDelegationPermitted;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class HomeDirectoryFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.AcctInfoHomeDirectory;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class HomeDriveFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.AcctInfoHomeDrive;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class ScriptPathFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.AcctInfoScriptPath;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class PasswordNotRequiredFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.PwdInfoPasswordNotRequired;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class PasswordNeverExpiresFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.PwdInfoPasswordNeverExpires;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class CannotChangePasswordFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.PwdInfoCannotChangePassword;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class AllowReversiblePasswordEncryptionFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.PwdInfoAllowReversiblePasswordEncryption;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class GivenNameFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.UserGivenName;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class MiddleNameFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.UserMiddleName;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class SurnameFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.UserSurname;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class EmailAddressFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.UserEmailAddress;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class VoiceTelephoneNumberFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.UserVoiceTelephoneNumber;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class EmployeeIDFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.UserEmployeeID;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class GroupIsSecurityGroupFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.GroupIsSecurityGroup;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class GroupScopeFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.GroupGroupScope;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class ServicePrincipalNameFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.ComputerServicePrincipalNames;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class ExtensionCacheFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.PrincipalExtensionCache;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class BadPasswordAttemptFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.PwdInfoLastBadPasswordAttempt;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class LastLogonTimeFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.AcctInfoLastLogon;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class LockoutTimeFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.AcctInfoAcctLockoutTime;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class ExpiredAccountFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.AcctInfoExpiredAccount;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class PasswordSetTimeFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.PwdInfoLastPasswordSet;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }

    internal sealed class BadLogonCountFilter : FilterBase
    {
        public const string PropertyNameStatic = PropertyNames.AcctInfoBadLogonCount;
        public override string PropertyName { get { return PropertyNameStatic; } }
    }
}