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
- IEnumerable.cs
- QueryExpr.cs
- RectConverter.cs
- RepeaterItem.cs
- ReferencedAssembly.cs
- Helpers.cs
- ClientRuntimeConfig.cs
- DateTimeOffset.cs
- ClassicBorderDecorator.cs
- ItemDragEvent.cs
- HyperLink.cs
- InternalConfigEventArgs.cs
- DynamicPropertyReader.cs
- HashAlgorithm.cs
- coordinatorfactory.cs
- PropertyGridCommands.cs
- Selector.cs
- ObjectViewListener.cs
- QuaternionRotation3D.cs
- RegexParser.cs
- SmtpSection.cs
- SelectQueryOperator.cs
- CdpEqualityComparer.cs
- ServiceThrottlingElement.cs
- HtmlInputCheckBox.cs
- ViewSimplifier.cs
- PackageProperties.cs
- HideDisabledControlAdapter.cs
- DataListItemEventArgs.cs
- GridView.cs
- Underline.cs
- MemoryFailPoint.cs
- DbBuffer.cs
- XmlIncludeAttribute.cs
- TabItemWrapperAutomationPeer.cs
- RelationshipManager.cs
- MaxValueConverter.cs
- SqlProcedureAttribute.cs
- TreeChangeInfo.cs
- ManipulationDevice.cs
- HttpFileCollectionBase.cs
- DynamicObjectAccessor.cs
- ClientSettingsSection.cs
- ProviderSettingsCollection.cs
- GridViewCommandEventArgs.cs
- LabelDesigner.cs
- Error.cs
- HierarchicalDataBoundControl.cs
- ExtendedPropertyDescriptor.cs
- EditCommandColumn.cs
- CorrelationToken.cs
- LiteralLink.cs
- FlowDocumentFormatter.cs
- TripleDES.cs
- ActivityExecutionContextCollection.cs
- NodeLabelEditEvent.cs
- QueryConverter.cs
- XmlExpressionDumper.cs
- HebrewNumber.cs
- HexParser.cs
- COSERVERINFO.cs
- UserControl.cs
- FileLogRecordStream.cs
- HwndHost.cs
- ApplicationHost.cs
- XmlQualifiedName.cs
- BaseDataList.cs
- XamlInterfaces.cs
- BinaryExpressionHelper.cs
- PickBranch.cs
- OracleException.cs
- HttpListenerRequest.cs
- XmlWriterTraceListener.cs
- VisualStyleTypesAndProperties.cs
- ChangeTracker.cs
- CompilerGlobalScopeAttribute.cs
- AlternateView.cs
- TextPointerBase.cs
- OrCondition.cs
- Transactions.cs
- UrlMappingCollection.cs
- ComplexLine.cs
- IPGlobalProperties.cs
- UrlPath.cs
- ToolStripOverflow.cs
- CreatingCookieEventArgs.cs
- ImportCatalogPart.cs
- COSERVERINFO.cs
- OdbcHandle.cs
- ResourceProperty.cs
- jithelpers.cs
- OciEnlistContext.cs
- Single.cs
- VerificationAttribute.cs
- HandlerFactoryWrapper.cs
- ProviderException.cs
- HttpResponseInternalBase.cs
- TextTreeTextNode.cs
- ListViewDeleteEventArgs.cs
- DataFormats.cs