File: Role\ADRole.cs
Project: ndp\cdf\src\WF\Activities\System.Workflow.Activities.csproj (System.Workflow.Activities)
#region Using directives
 
using System;
using System.Collections.Generic;
using System.Text;
using System.DirectoryServices;
using System.Security.Permissions;
using System.Security.Principal;
using System.Runtime.Serialization;
 
using System.Workflow.ComponentModel;
using System.Diagnostics;
 
#endregion
 
namespace System.Workflow.Activities
{
    [Serializable]
    [Obsolete("The System.Workflow.* types are deprecated.  Instead, please use the new types from System.Activities.*")]
    public abstract class WorkflowRole
    {
        public abstract String Name { set; get; }
 
        public abstract IList<String> GetIdentities();
 
        public abstract bool IncludesIdentity(String identity);
    }
 
    [Serializable]
    [Obsolete("The System.Workflow.* types are deprecated.  Instead, please use the new types from System.Activities.*")]
    sealed public class WorkflowRoleCollection : List<WorkflowRole>
    {
        public WorkflowRoleCollection()
            : base()
        {
        }
 
        public bool IncludesIdentity(String identity)
        {
            if (identity == null)
                return false;
 
            foreach (WorkflowRole role in this)
            {
                if (role != null)
                {
                    if (role.IncludesIdentity(identity))
                        return true;
                }
            }
 
            return false;
        }
    }
 
    [Serializable]
    [Obsolete("The System.Workflow.* types are deprecated.  Instead, please use the new types from System.Activities.*")]
    sealed public class ActiveDirectoryRole : WorkflowRole, ISerializable, IDisposable
    {
        private String m_name;
        private DirectoryEntry m_root;
        private List<IDirectoryOperation> m_operations;
 
        internal ActiveDirectoryRole(DirectoryEntry rootEntry, IDirectoryOperation operation)
        {
            if (rootEntry == null)
                throw new ArgumentNullException("rootEntry");
 
            this.m_root = rootEntry;
 
            this.m_operations = new List<IDirectoryOperation>();
            if (operation != null)
                this.m_operations.Add(operation);
        }
 
        internal ActiveDirectoryRole(DirectoryEntry rootEntry, ICollection<IDirectoryOperation> operations)
        {
            if (rootEntry == null)
                throw new ArgumentNullException("rootEntry");
 
            this.m_root = rootEntry;
 
            if (operations == null)
                this.m_operations = new List<IDirectoryOperation>();
            else
                this.m_operations = new List<IDirectoryOperation>(operations);
        }
 
        private ActiveDirectoryRole(SerializationInfo info, StreamingContext context)
        {
            this.m_name = info.GetString("m_name");
            this.m_operations = (List<IDirectoryOperation>)info.GetValue("m_operations", typeof(List<IDirectoryOperation>));
 
            String path = info.GetString("m_root\\path");
 
            this.m_root = new DirectoryEntry(path);
        }
 
        [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
        void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("m_name", this.m_name);
            info.AddValue("m_operations", this.m_operations);
 
            info.AddValue("m_root\\path", this.m_root.Path);
        }
 
        public override String Name
        {
            get
            {
                return this.m_name;
            }
 
            set
            {
                this.m_name = value;
            }
        }
 
        public DirectoryEntry RootEntry
        {
            get
            {
                return this.m_root;
            }
        }
 
        internal ICollection<IDirectoryOperation> Operations
        {
            get
            {
                return this.m_operations;
            }
        }
 
        public ActiveDirectoryRole GetManager()
        {
            List<IDirectoryOperation> queries = new List<IDirectoryOperation>(this.Operations);
            queries.Add(new DirectoryRedirect(ActiveDirectoryRoleFactory.Configuration.DistinguishedName, ActiveDirectoryRoleFactory.Configuration.DirectReports));
 
            return new ActiveDirectoryRole(this.RootEntry, queries);
        }
 
        public ActiveDirectoryRole GetManagerialChain()
        {
            List<IDirectoryOperation> queries = new List<IDirectoryOperation>(this.Operations);
            queries.Add(new DirectoryRedirect(ActiveDirectoryRoleFactory.Configuration.DistinguishedName, ActiveDirectoryRoleFactory.Configuration.DirectReports, true));
 
            return new ActiveDirectoryRole(this.RootEntry, queries);
        }
 
        public ActiveDirectoryRole GetDirectReports()
        {
            List<IDirectoryOperation> queries = new List<IDirectoryOperation>(this.Operations);
            queries.Add(new DirectoryRedirect(ActiveDirectoryRoleFactory.Configuration.DistinguishedName, ActiveDirectoryRoleFactory.Configuration.Manager));
 
            return new ActiveDirectoryRole(this.RootEntry, queries);
        }
 
        public ActiveDirectoryRole GetAllReports()
        {
            List<IDirectoryOperation> queries = new List<IDirectoryOperation>(this.Operations);
            queries.Add(new DirectoryRedirect(ActiveDirectoryRoleFactory.Configuration.DistinguishedName, ActiveDirectoryRoleFactory.Configuration.Manager, true));
 
            return new ActiveDirectoryRole(this.RootEntry, queries);
        }
 
        public ActiveDirectoryRole GetPeers()
        {
            ICollection<DirectoryEntry> entries = this.GetEntries();
 
            List<IDirectoryOperation> queries = new List<IDirectoryOperation>(this.Operations);
            queries.Add(new DirectoryRedirect(ActiveDirectoryRoleFactory.Configuration.DistinguishedName, ActiveDirectoryRoleFactory.Configuration.DirectReports));
            queries.Add(new DirectoryRedirect(ActiveDirectoryRoleFactory.Configuration.DistinguishedName, ActiveDirectoryRoleFactory.Configuration.Manager));
 
            foreach (DirectoryEntry entry in entries)
            {
                queries.Add(new DirectoryLocalQuery(ActiveDirectoryRoleFactory.Configuration.DistinguishedName, (String)entry.Properties[ActiveDirectoryRoleFactory.Configuration.DistinguishedName][0], DirectoryQueryOperation.NotEqual));
            }
 
            return new ActiveDirectoryRole(this.RootEntry, queries);
        }
 
 
        public ICollection<DirectoryEntry> GetEntries()
        {
            List<DirectoryEntry> currentEntries = new List<DirectoryEntry>();
            currentEntries.Add(this.m_root);
            List<DirectoryEntry> newEntries = new List<DirectoryEntry>();
 
            for (int i = 0; i < this.m_operations.Count; ++i)
            {
                for (int j = 0; j < currentEntries.Count; ++j)
                {
                    this.m_operations[i].GetResult(this.m_root, currentEntries[j], newEntries);
                }
 
                // Swap between new and current, as the for the new iteration the 'new' of
                // now will be the current.  After the swap we clear out the 'new' list as to
                // reuse it.
 
                List<DirectoryEntry> tempEntries = currentEntries;
                currentEntries = newEntries;
                newEntries = tempEntries;
                newEntries.Clear();
            }
 
            // Remove duplicates
 
            Dictionary<Guid, DirectoryEntry> dFinal = new Dictionary<Guid, DirectoryEntry>();
            for (int i = 0; i < currentEntries.Count; ++i)
            {
                if (!dFinal.ContainsKey(currentEntries[i].Guid))
                    dFinal.Add(currentEntries[i].Guid, currentEntries[i]);
            }
 
            return dFinal.Values;
        }
 
        public IList<SecurityIdentifier> GetSecurityIdentifiers()
        {
            List<SecurityIdentifier> identifiers = new List<SecurityIdentifier>();
 
            foreach (DirectoryEntry entry in this.GetEntries())
            {
                if (entry.Properties["objectSid"] != null &&
                    entry.Properties["objectSid"].Count != 0)
                {
                    identifiers.Add(new SecurityIdentifier((byte[])(entry.Properties["objectSid"][0]), 0));
                }
                else
                {
                    WorkflowActivityTrace.Activity.TraceEvent(TraceEventType.Information, 0, "Unable to find 'objectSid' property for directory entry = {0}.", entry.Path);
                }
            }
 
            return identifiers;
        }
 
        public override IList<String> GetIdentities()
        {
            List<String> identityRefs = new List<String>();
            foreach (SecurityIdentifier entrySid in this.GetSecurityIdentifiers())
            {
                identityRefs.Add(entrySid.Translate(typeof(NTAccount)).ToString());
            }
            return identityRefs;
        }
 
        public override bool IncludesIdentity(String identity)
        {
            if (identity == null)
                return false;
 
            foreach (String roleIdentity in this.GetIdentities())
            {
                if (String.Compare(identity, roleIdentity, StringComparison.Ordinal) == 0)
                    return true;
            }
 
            return false;
        }
 
        void IDisposable.Dispose()
        {
            this.m_root.Dispose();
        }
 
    }
}