Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / untmp / whidbey / QFE / ndp / clr / src / BCL / System / Security / Policy / Evidence.cs / 3 / Evidence.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // // Evidence.cs // // Use this class to keep a list of evidence associated with an Assembly // namespace System.Security.Policy { using System; using System.Collections; using System.IO; using System.Configuration.Assemblies; using System.Reflection; using System.Runtime.InteropServices; using System.Runtime.Remoting; using System.Runtime.Serialization; using System.Security.Util; using System.Security.Permissions; using System.Runtime.Serialization.Formatters.Binary; [Serializable] [System.Runtime.InteropServices.ComVisible(true)] public sealed class Evidence : ICollection { private IList m_hostList; private IList m_assemblyList; private bool m_locked; public Evidence() { m_hostList = null; m_assemblyList = null; m_locked = false; } public Evidence(Evidence evidence) { if (evidence == null) return; m_locked = false; Merge( evidence ); } public Evidence( Object[] hostEvidence, Object[] assemblyEvidence ) { m_locked = false; if (hostEvidence != null) { this.m_hostList = ArrayList.Synchronized( new ArrayList( hostEvidence ) ); } if (assemblyEvidence != null) { this.m_assemblyList = ArrayList.Synchronized( new ArrayList( assemblyEvidence ) ); } } internal Evidence(char[] buffer) { int position = 0; while (position < buffer.Length) { switch (buffer[position++]) { case BuiltInEvidenceHelper.idApplicationDirectory: { IBuiltInEvidence ad = new ApplicationDirectory(); position = ad.InitFromBuffer(buffer, position); AddAssembly(ad); break; } #if !FEATURE_PAL case BuiltInEvidenceHelper.idPublisher: { IBuiltInEvidence p = new Publisher(); position = p.InitFromBuffer(buffer, position); AddHost(p); break; } #endif // !FEATURE_PAL case BuiltInEvidenceHelper.idStrongName: { IBuiltInEvidence sn = new StrongName(); position = sn.InitFromBuffer(buffer, position); AddHost(sn); break; } case BuiltInEvidenceHelper.idZone: { IBuiltInEvidence z = new Zone(); position = z.InitFromBuffer(buffer, position); AddHost(z); break; } case BuiltInEvidenceHelper.idUrl: { IBuiltInEvidence u = new Url(); position = u.InitFromBuffer(buffer, position); AddHost(u); break; } case BuiltInEvidenceHelper.idSite: { IBuiltInEvidence s = new Site(); position = s.InitFromBuffer(buffer, position); AddHost(s); break; } case BuiltInEvidenceHelper.idPermissionRequestEvidence: { IBuiltInEvidence pre = new PermissionRequestEvidence(); position = pre.InitFromBuffer(buffer, position); AddHost(pre); break; } #if !FEATURE_PAL case BuiltInEvidenceHelper.idHash: { IBuiltInEvidence h = new Hash(); position = h.InitFromBuffer(buffer, position); AddHost(h); break; } #endif // !FEATURE_PAL case BuiltInEvidenceHelper.idGac: { IBuiltInEvidence g = new GacInstalled(); position = g.InitFromBuffer(buffer, position); AddHost(g); break; } default: throw new SerializationException(Environment.GetResourceString("Serialization_UnableToFixup")); } // switch } // while } public void AddHost(Object id) { if (m_hostList == null) m_hostList = ArrayList.Synchronized( new ArrayList() ); if (m_locked) new SecurityPermission( SecurityPermissionFlag.ControlEvidence ).Demand(); m_hostList.Add( id ); } public void AddAssembly(Object id) { if (m_assemblyList == null) m_assemblyList = ArrayList.Synchronized( new ArrayList() ); m_assemblyList.Add( id ); } public bool Locked { get { return m_locked; } set { if (!value) { new SecurityPermission( SecurityPermissionFlag.ControlEvidence ).Demand(); m_locked = false; } else { m_locked = true; } } } public void Merge( Evidence evidence ) { IEnumerator enumerator; if (evidence == null) return; if (evidence.m_hostList != null) { if (m_hostList == null) m_hostList = ArrayList.Synchronized( new ArrayList() ); if (evidence.m_hostList.Count != 0 && this.m_locked) new SecurityPermission( SecurityPermissionFlag.ControlEvidence ).Demand(); enumerator = evidence.m_hostList.GetEnumerator(); while (enumerator.MoveNext()) { m_hostList.Add( enumerator.Current ); } } if (evidence.m_assemblyList != null) { if (m_assemblyList == null) m_assemblyList = ArrayList.Synchronized( new ArrayList() ); enumerator = evidence.m_assemblyList.GetEnumerator(); while (enumerator.MoveNext()) { m_assemblyList.Add( enumerator.Current ); } } } // Same as merge, except only one instance of any one evidence type is // allowed. When duplicates are found, the evidence in the input // argument will have priority. internal void MergeWithNoDuplicates( Evidence evidence ) { IEnumerator oldEnumerator, newEnumerator; if (evidence == null) return; if (evidence.m_hostList != null) { if (m_hostList == null) m_hostList = ArrayList.Synchronized( new ArrayList() ); newEnumerator = evidence.m_hostList.GetEnumerator(); while (newEnumerator.MoveNext()) { Type newItemType = newEnumerator.Current.GetType(); oldEnumerator = m_hostList.GetEnumerator(); while (oldEnumerator.MoveNext()) { if (oldEnumerator.Current.GetType() == newItemType) { m_hostList.Remove(oldEnumerator.Current); break; } } m_hostList.Add( newEnumerator.Current ); } } if (evidence.m_assemblyList != null) { if (m_assemblyList == null) m_assemblyList = ArrayList.Synchronized( new ArrayList() ); newEnumerator = evidence.m_assemblyList.GetEnumerator(); while (newEnumerator.MoveNext()) { Type newItemType = newEnumerator.Current.GetType(); oldEnumerator = m_assemblyList.GetEnumerator(); while (oldEnumerator.MoveNext()) { if (oldEnumerator.Current.GetType() == newItemType) { m_assemblyList.Remove(oldEnumerator.Current); break; } } m_assemblyList.Add( newEnumerator.Current ); } } } // ICollection implementation public void CopyTo(Array array, int index) { int currentIndex = index; if (m_hostList != null) { m_hostList.CopyTo( array, currentIndex ); currentIndex += m_hostList.Count; } if (m_assemblyList != null) { m_assemblyList.CopyTo( array, currentIndex ); } } public IEnumerator GetHostEnumerator() { if (m_hostList == null) m_hostList = ArrayList.Synchronized( new ArrayList() ); return m_hostList.GetEnumerator(); } public IEnumerator GetAssemblyEnumerator() { if (m_assemblyList == null) m_assemblyList = ArrayList.Synchronized( new ArrayList() ); return m_assemblyList.GetEnumerator(); } public IEnumerator GetEnumerator() { return new EvidenceEnumerator( this ); } public int Count { get { return (m_hostList != null ? m_hostList.Count : 0) + (m_assemblyList != null ? m_assemblyList.Count : 0); } } public Object SyncRoot { get { return this; } } public bool IsSynchronized { get { return false; } } public bool IsReadOnly { get { return false; } } internal Evidence Copy() { // Try the fast way. Will only work if all evidence components implement IBuiltInEvidence char[] serEvidence = PolicyManager.MakeEvidenceArray(this, true); if (serEvidence != null) { return new Evidence(serEvidence); } // Use the general purpose formatter new PermissionSet( true ).Assert(); MemoryStream stream = new MemoryStream(); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize( stream, this ); stream.Position = 0; return (Evidence)formatter.Deserialize( stream ); } internal Evidence ShallowCopy() { Evidence evidence = new Evidence(); IEnumerator enumerator; enumerator = this.GetHostEnumerator(); while (enumerator.MoveNext()) { evidence.AddHost( enumerator.Current ); } enumerator = this.GetAssemblyEnumerator(); while (enumerator.MoveNext()) { evidence.AddAssembly( enumerator.Current ); } return evidence; } [ComVisible(false)] public void Clear() { m_hostList = null; m_assemblyList = null; } [ComVisible(false)] public void RemoveType(Type t) { int i; for(i = 0; i < (m_hostList == null ? 0 : m_hostList.Count); i++) { if (m_hostList[i].GetType() == t) m_hostList.RemoveAt(i--); } for(i = 0; i < (m_assemblyList == null ? 0 : m_assemblyList.Count); i++) { if (m_assemblyList[i].GetType() == t) m_assemblyList.RemoveAt(i--); } } [ComVisible(false)] public override bool Equals( Object obj ) { Evidence other = obj as Evidence; if (other == null) return false; if (this.m_hostList != null && other.m_hostList != null) { if (this.m_hostList.Count != other.m_hostList.Count) return false; int count = this.m_hostList.Count; for (int i = 0; i < count; ++i) { bool found = false; for (int j = 0; j < count; ++j) { if (Object.Equals( this.m_hostList[i], other.m_hostList[j] )) { found = true; break; } } if (!found) return false; } } else if (this.m_hostList != null || other.m_hostList != null) { return false; } if (this.m_assemblyList != null && other.m_assemblyList != null) { if (this.m_assemblyList.Count != other.m_assemblyList.Count) return false; int count = this.m_assemblyList.Count; for (int i = 0; i < count; ++i) { bool found = false; for (int j = 0; j < count; ++j) { if (Object.Equals( m_assemblyList[i], other.m_assemblyList[j] )) { found = true; break; } } if (!found) return false; } } else if (this.m_assemblyList != null || other.m_assemblyList != null) { return false; } return true; } [ComVisible(false)] public override int GetHashCode() { int accumulator = 0; if (this.m_hostList != null) { int count = this.m_hostList.Count; for (int i = 0; i < count; ++i) { accumulator = accumulator ^ this.m_hostList[i].GetHashCode(); } } if (this.m_assemblyList != null) { int count = this.m_assemblyList.Count; for (int i = 0; i < count; ++i) { accumulator = accumulator ^ this.m_assemblyList[i].GetHashCode(); } } return accumulator; } internal Object FindType(Type t) { int i; for(i = 0; i < (m_hostList == null ? 0 : m_hostList.Count); i++) { if (m_hostList[i].GetType() == t) return m_hostList[i]; } for(i = 0; i < (m_assemblyList == null ? 0 : m_assemblyList.Count); i++) { if (m_assemblyList[i].GetType() == t) return m_hostList[i]; } return null; } ////// Mark all of the evidence in the collection as having been used /// internal void MarkAllEvidenceAsUsed() { foreach (object o in this) { IDelayEvaluatedEvidence delayEvidence = o as IDelayEvaluatedEvidence; if (delayEvidence != null) { delayEvidence.MarkUsed(); } } } ////// Determine if delay evaluated strong name evidence is contained in this collection, and if so /// if it was used during policy evaluation. /// /// This method is called from the VM in SecurityPolicy::WasStrongNameEvidenceUsed /// private bool WasStrongNameEvidenceUsed() { IDelayEvaluatedEvidence snEvidence = FindType(typeof(StrongName)) as IDelayEvaluatedEvidence; return snEvidence != null && snEvidence.WasUsed; } } sealed class EvidenceEnumerator : IEnumerator { private bool m_first; private Evidence m_evidence; private IEnumerator m_enumerator; public EvidenceEnumerator( Evidence evidence ) { this.m_evidence = evidence; Reset(); } public bool MoveNext() { if (m_enumerator == null) { return false; } if (!m_enumerator.MoveNext()) { if (m_first) { m_enumerator = m_evidence.GetAssemblyEnumerator(); m_first = false; if (m_enumerator != null) return m_enumerator.MoveNext(); else return false; } else { return false; } } return true; } public Object Current { get { if (m_enumerator == null) return null; else return m_enumerator.Current; } } public void Reset() { this.m_first = true; if (m_evidence != null) { m_enumerator = m_evidence.GetHostEnumerator(); } else { m_enumerator = null; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- BitmapFrameDecode.cs
- FontFamilyConverter.cs
- XmlCDATASection.cs
- AppDomainManager.cs
- Separator.cs
- ConfigurationLocationCollection.cs
- XmlHierarchicalEnumerable.cs
- PersonalizationProviderCollection.cs
- HttpListener.cs
- ContractInferenceHelper.cs
- NegotiateStream.cs
- VarRefManager.cs
- XmlSerializerSection.cs
- XmlSerializerAssemblyAttribute.cs
- securestring.cs
- OleDbErrorCollection.cs
- SqlClientFactory.cs
- WindowsFormsHostPropertyMap.cs
- PackageRelationship.cs
- PKCS1MaskGenerationMethod.cs
- RuleInfoComparer.cs
- TextFormatterImp.cs
- AssociationTypeEmitter.cs
- NameHandler.cs
- List.cs
- RealizationDrawingContextWalker.cs
- XmlDocumentSerializer.cs
- AstNode.cs
- UnsupportedPolicyOptionsException.cs
- SqlDependency.cs
- MetadataPropertyCollection.cs
- SendKeys.cs
- GenericQueueSurrogate.cs
- FloaterParagraph.cs
- StdRegProviderWrapper.cs
- CounterCreationDataCollection.cs
- BuildProviderCollection.cs
- documentsequencetextpointer.cs
- ControlBindingsConverter.cs
- PingOptions.cs
- NativeWindow.cs
- OutputCacheProfileCollection.cs
- DocumentSchemaValidator.cs
- Misc.cs
- DirectoryObjectSecurity.cs
- DNS.cs
- ObjectNavigationPropertyMapping.cs
- RepeaterItemEventArgs.cs
- ObjectDataSourceEventArgs.cs
- PackageRelationshipCollection.cs
- Gdiplus.cs
- RealizationDrawingContextWalker.cs
- Application.cs
- Int32CAMarshaler.cs
- Size3DConverter.cs
- TabControlAutomationPeer.cs
- TableItemProviderWrapper.cs
- ChildrenQuery.cs
- EntitySetRetriever.cs
- MimeTypePropertyAttribute.cs
- ToolStripItemEventArgs.cs
- EntityDataSourceEntitySetNameItem.cs
- PassportAuthenticationModule.cs
- DataGridViewLinkCell.cs
- OutputCacheModule.cs
- CookieProtection.cs
- WorkflowMessageEventHandler.cs
- ComplexBindingPropertiesAttribute.cs
- ResourceAssociationSetEnd.cs
- XslAst.cs
- ExtensionFile.cs
- MarkupObject.cs
- BinaryNode.cs
- StoreContentChangedEventArgs.cs
- FileStream.cs
- FolderBrowserDialog.cs
- SatelliteContractVersionAttribute.cs
- _LazyAsyncResult.cs
- HwndSourceKeyboardInputSite.cs
- CancellableEnumerable.cs
- WebEvents.cs
- EraserBehavior.cs
- PropertyMetadata.cs
- _CookieModule.cs
- SecUtil.cs
- DropSource.cs
- InfocardExtendedInformationCollection.cs
- MimeTypeMapper.cs
- ConfigXmlText.cs
- Point3DValueSerializer.cs
- ContourSegment.cs
- HashStream.cs
- KeyNotFoundException.cs
- HttpResponse.cs
- PathFigureCollectionConverter.cs
- NeutralResourcesLanguageAttribute.cs
- CodeLabeledStatement.cs
- MonitoringDescriptionAttribute.cs
- SafeNativeMethods.cs
- CodeTypeReferenceCollection.cs