Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / clr / src / BCL / System / Security / Policy / Evidence.cs / 1 / 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;
}
}
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;
}
}
}
}
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- WindowsFormsLinkLabel.cs
- ScriptingProfileServiceSection.cs
- AdapterUtil.cs
- UIPermission.cs
- TransactedBatchingElement.cs
- RuntimeIdentifierPropertyAttribute.cs
- SystemException.cs
- Decimal.cs
- QueryTreeBuilder.cs
- remotingproxy.cs
- XmlSchemaFacet.cs
- XmlSchemaGroupRef.cs
- Decimal.cs
- Rect3DConverter.cs
- NameNode.cs
- MenuItem.cs
- QueryCacheKey.cs
- TableItemPatternIdentifiers.cs
- LinkedResource.cs
- Shape.cs
- BypassElement.cs
- HttpCachePolicy.cs
- SetIndexBinder.cs
- MsmqIntegrationValidationBehavior.cs
- HttpTransportSecurity.cs
- DefaultEvaluationContext.cs
- RequestSecurityTokenForGetBrowserToken.cs
- BoolExpr.cs
- HotCommands.cs
- EmptyStringExpandableObjectConverter.cs
- ServiceContractViewControl.Designer.cs
- HtmlWindow.cs
- JulianCalendar.cs
- HttpListenerElement.cs
- XmlSecureResolver.cs
- FixedSOMTextRun.cs
- XmlUrlResolver.cs
- NavigationProgressEventArgs.cs
- StylusOverProperty.cs
- SimpleType.cs
- UserMapPath.cs
- SqlCacheDependency.cs
- UniqueConstraint.cs
- MediaContext.cs
- XsdDateTime.cs
- Light.cs
- BitmapCacheBrush.cs
- FlowDocumentPage.cs
- CodeCommentStatement.cs
- TextProviderWrapper.cs
- CharacterHit.cs
- AVElementHelper.cs
- RuleSetCollection.cs
- DoWorkEventArgs.cs
- XmlSchemaResource.cs
- AssemblyBuilderData.cs
- XmlSerializerSection.cs
- PartialList.cs
- ListMarkerLine.cs
- ExtensionQuery.cs
- TableCell.cs
- Group.cs
- updateconfighost.cs
- KernelTypeValidation.cs
- Vector3DCollection.cs
- CmsInterop.cs
- ToolStripPanelSelectionBehavior.cs
- ContainerUtilities.cs
- CodeArgumentReferenceExpression.cs
- Variant.cs
- TraceHandlerErrorFormatter.cs
- ExtensionSimplifierMarkupObject.cs
- _KerberosClient.cs
- DBSqlParser.cs
- FactoryGenerator.cs
- ScalarOps.cs
- BmpBitmapEncoder.cs
- DefaultTextStoreTextComposition.cs
- SqlGenericUtil.cs
- MatrixCamera.cs
- WindowsStatusBar.cs
- ReadOnlyDataSourceView.cs
- ThicknessAnimationUsingKeyFrames.cs
- Menu.cs
- XhtmlBasicValidatorAdapter.cs
- BitmapEffectDrawingContextWalker.cs
- CallSiteBinder.cs
- HtmlInputControl.cs
- GridViewSelectEventArgs.cs
- TextParaClient.cs
- DocumentPageTextView.cs
- DownloadProgressEventArgs.cs
- QilNode.cs
- ElementHostPropertyMap.cs
- PriorityBinding.cs
- UpDownBase.cs
- SelectedCellsChangedEventArgs.cs
- ScriptResourceHandler.cs
- RichTextBox.cs
- TickBar.cs