Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / clr / src / BCL / System / Security / Policy / ApplicationTrust.cs / 2 / ApplicationTrust.cs
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
//
// ApplicationTrust.cs
//
// This class encapsulates security decisions about an application.
//
namespace System.Security.Policy {
using System.Collections;
using System.Deployment.Internal.Isolation;
using System.Deployment.Internal.Isolation.Manifest;
using System.Globalization;
using System.IO;
using System.Runtime.InteropServices;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Permissions;
using System.Security.Util;
using System.Text;
using System.Threading;
[System.Runtime.InteropServices.ComVisible(true)]
public enum ApplicationVersionMatch {
MatchExactVersion,
MatchAllVersions
}
[System.Runtime.InteropServices.ComVisible(true)]
[Serializable]
public sealed class ApplicationTrust : ISecurityEncodable {
private ApplicationIdentity m_appId;
private bool m_appTrustedToRun;
private bool m_persist;
private object m_extraInfo;
private SecurityElement m_elExtraInfo;
private PolicyStatement m_psDefaultGrant;
private StrongName[] m_fullTrustAssemblies;
// Permission special flags for the default grant set in this ApplicationTrust. This should be
// updated in [....] with any updates to the default grant set.
//
// In the general case, these values cannot be trusted - we only store a reference to the
// DefaultGrantSet, and return the reference directly, which means that code can update the
// permission set without our knowledge. That would lead to the flags getting out of [....] with the
// grant set.
//
// However, we only care about these flags when we're creating a homogenous AppDomain, and in that
// case we control the ApplicationTrust object end-to-end, and know that the permission set will not
// change after the flags are calculated.
[NonSerialized]
private int m_grantSetSpecialFlags;
public ApplicationTrust (ApplicationIdentity applicationIdentity) : this () {
ApplicationIdentity = applicationIdentity;
}
public ApplicationTrust () : this (new PermissionSet(PermissionState.None)) {}
internal ApplicationTrust (PermissionSet defaultGrantSet) : this (defaultGrantSet, null) {}
internal ApplicationTrust (PermissionSet defaultGrantSet, StrongName[] fullTrustAssemblies) {
// Creating a PolicyStatement copies the incoming permission set, so we don't have to worry
// about the PermissionSet parameter changing underneath us after we've calculated the
// permisison flags in the DefaultGrantSet setter.
DefaultGrantSet = new PolicyStatement(defaultGrantSet);
FullTrustAssemblies = fullTrustAssemblies;
}
public ApplicationIdentity ApplicationIdentity {
get {
return m_appId;
}
set {
if (value == null)
throw new ArgumentNullException(Environment.GetResourceString("Argument_InvalidAppId"));
m_appId = value;
}
}
public PolicyStatement DefaultGrantSet {
get {
if (m_psDefaultGrant == null)
return new PolicyStatement(new PermissionSet(PermissionState.None));
return m_psDefaultGrant;
}
set {
if (value == null) {
m_psDefaultGrant = null;
m_grantSetSpecialFlags = 0;
}
else {
m_psDefaultGrant = value;
m_grantSetSpecialFlags = SecurityManager.GetSpecialFlags(m_psDefaultGrant.PermissionSet, null);
}
}
}
internal StrongName[] FullTrustAssemblies {
get {
return m_fullTrustAssemblies;
}
set {
m_fullTrustAssemblies = value;
}
}
public bool IsApplicationTrustedToRun {
get {
return m_appTrustedToRun;
}
set {
m_appTrustedToRun = value;
}
}
public bool Persist {
get {
return m_persist;
}
set {
m_persist = value;
}
}
public object ExtraInfo {
get {
if (m_elExtraInfo != null) {
m_extraInfo = ObjectFromXml(m_elExtraInfo);
m_elExtraInfo = null;
}
return m_extraInfo;
}
set {
m_elExtraInfo = null;
m_extraInfo = value;
}
}
public SecurityElement ToXml () {
SecurityElement elRoot = new SecurityElement("ApplicationTrust");
elRoot.AddAttribute("version", "1");
if (m_appId != null)
elRoot.AddAttribute("FullName", SecurityElement.Escape(m_appId.FullName));
if (m_appTrustedToRun)
elRoot.AddAttribute("TrustedToRun", "true");
if (m_persist)
elRoot.AddAttribute("Persist", "true");
if (m_psDefaultGrant != null) {
SecurityElement elDefaultGrant = new SecurityElement("DefaultGrant");
elDefaultGrant.AddChild(m_psDefaultGrant.ToXml());
elRoot.AddChild(elDefaultGrant);
}
if (m_fullTrustAssemblies != null) {
SecurityElement elFullTrustAssemblies = new SecurityElement("FullTrustAssemblies");
for (int index = 0; index < m_fullTrustAssemblies.Length; index++) {
if (m_fullTrustAssemblies[index] != null)
elFullTrustAssemblies.AddChild(m_fullTrustAssemblies[index].ToXml());
}
elRoot.AddChild(elFullTrustAssemblies);
}
if (ExtraInfo != null)
elRoot.AddChild(ObjectToXml("ExtraInfo", ExtraInfo));
return elRoot;
}
public void FromXml (SecurityElement element) {
if (element == null)
throw new ArgumentNullException("element");
if (String.Compare(element.Tag, "ApplicationTrust", StringComparison.Ordinal) != 0)
throw new ArgumentException(Environment.GetResourceString("Argument_InvalidXML"));
m_psDefaultGrant = null;
m_grantSetSpecialFlags = 0;
m_fullTrustAssemblies = null;
m_appTrustedToRun = false;
string isAppTrustedToRun = element.Attribute("TrustedToRun");
if (isAppTrustedToRun != null && String.Compare(isAppTrustedToRun, "true", StringComparison.Ordinal) == 0)
m_appTrustedToRun = true;
string persist = element.Attribute("Persist");
if (persist != null && String.Compare(persist, "true", StringComparison.Ordinal) == 0)
m_persist = true;
string fullName = element.Attribute("FullName");
if (fullName != null && fullName.Length > 0)
m_appId = new ApplicationIdentity(fullName);
SecurityElement elDefaultGrant = element.SearchForChildByTag("DefaultGrant");
if (elDefaultGrant != null) {
SecurityElement elDefaultGrantPS = elDefaultGrant.SearchForChildByTag("PolicyStatement");
if (elDefaultGrantPS != null) {
PolicyStatement ps = new PolicyStatement(null);
ps.FromXml(elDefaultGrantPS);
m_psDefaultGrant = ps;
m_grantSetSpecialFlags = SecurityManager.GetSpecialFlags(ps.PermissionSet, null);
}
}
SecurityElement elFullTrustAssemblies = element.SearchForChildByTag("FullTrustAssemblies");
if (elFullTrustAssemblies != null && elFullTrustAssemblies.InternalChildren != null) {
m_fullTrustAssemblies = new StrongName[elFullTrustAssemblies.Children.Count];
IEnumerator enumerator = elFullTrustAssemblies.Children.GetEnumerator();
int index = 0;
while (enumerator.MoveNext()) {
m_fullTrustAssemblies[index] = new StrongName();
m_fullTrustAssemblies[index].FromXml(enumerator.Current as SecurityElement);
index++;
}
}
m_elExtraInfo = element.SearchForChildByTag("ExtraInfo");
}
private static SecurityElement ObjectToXml (string tag, Object obj) {
BCLDebug.Assert(obj != null, "You need to pass in an object");
ISecurityEncodable encodableObj = obj as ISecurityEncodable;
SecurityElement elObject;
if (encodableObj != null) {
elObject = encodableObj.ToXml();
if (!elObject.Tag.Equals(tag))
throw new ArgumentException(Environment.GetResourceString("Argument_InvalidXML"));
}
MemoryStream stream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, obj);
byte[] array = stream.ToArray();
elObject = new SecurityElement(tag);
elObject.AddAttribute("Data", Hex.EncodeHexString(array));
return elObject;
}
private static Object ObjectFromXml (SecurityElement elObject) {
BCLDebug.Assert(elObject != null, "You need to pass in a security element");
if (elObject.Attribute("class") != null) {
ISecurityEncodable encodableObj = XMLUtil.CreateCodeGroup(elObject) as ISecurityEncodable;
if (encodableObj != null) {
encodableObj.FromXml(elObject);
return encodableObj;
}
}
string objectData = elObject.Attribute("Data");
MemoryStream stream = new MemoryStream(Hex.DecodeHexString(objectData));
BinaryFormatter formatter = new BinaryFormatter();
return formatter.Deserialize(stream);
}
}
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.ControlPolicy)]
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class ApplicationTrustCollection : ICollection {
private const string ApplicationTrustProperty = "ApplicationTrust";
private const string InstallerIdentifier = "{60051b8f-4f12-400a-8e50-dd05ebd438d1}";
private static Guid ClrPropertySet = new Guid("c989bb7a-8385-4715-98cf-a741a8edb823");
// The CLR specific constant install reference.
private static object s_installReference = null;
private static StoreApplicationReference InstallReference {
get {
if (s_installReference == null) {
Interlocked.CompareExchange(ref s_installReference,
new StoreApplicationReference(
IsolationInterop.GUID_SXS_INSTALL_REFERENCE_SCHEME_OPAQUESTRING,
InstallerIdentifier,
null),
null);
}
return (StoreApplicationReference) s_installReference;
}
}
private readonly object m_syncRoot = new object();
private object m_appTrusts = null;
private ArrayList AppTrusts {
get {
if (m_appTrusts == null) {
ArrayList appTrusts = new ArrayList();
if (m_storeBounded) {
RefreshStorePointer();
// enumerate the user store and populate the collection
StoreDeploymentMetadataEnumeration deplEnum = m_pStore.EnumInstallerDeployments(IsolationInterop.GUID_SXS_INSTALL_REFERENCE_SCHEME_OPAQUESTRING, InstallerIdentifier, ApplicationTrustProperty, null);
foreach (IDefinitionAppId defAppId in deplEnum) {
StoreDeploymentMetadataPropertyEnumeration metadataEnum = m_pStore.EnumInstallerDeploymentProperties(IsolationInterop.GUID_SXS_INSTALL_REFERENCE_SCHEME_OPAQUESTRING, InstallerIdentifier, ApplicationTrustProperty, defAppId);
foreach (StoreOperationMetadataProperty appTrustProperty in metadataEnum) {
string appTrustXml = appTrustProperty.Value;
if (appTrustXml != null && appTrustXml.Length > 0) {
SecurityElement seTrust = SecurityElement.FromString(appTrustXml);
ApplicationTrust appTrust = new ApplicationTrust();
appTrust.FromXml(seTrust);
appTrusts.Add(appTrust);
}
}
}
}
Interlocked.CompareExchange(ref m_appTrusts, appTrusts, null);
}
return m_appTrusts as ArrayList;
}
}
private bool m_storeBounded = false;
private Store m_pStore = null; // Component store interface pointer.
// Only internal constructors are exposed.
internal ApplicationTrustCollection () : this(false) {}
internal ApplicationTrustCollection (bool storeBounded) {
m_storeBounded = storeBounded;
}
private void RefreshStorePointer () {
// Refresh store pointer.
if (m_pStore != null)
Marshal.ReleaseComObject(m_pStore.InternalStore);
m_pStore = IsolationInterop.GetUserStore();
}
public int Count {
get {
return AppTrusts.Count;
}
}
public ApplicationTrust this[int index] {
get {
return AppTrusts[index] as ApplicationTrust;
}
}
public ApplicationTrust this[string appFullName] {
get {
ApplicationIdentity identity = new ApplicationIdentity(appFullName);
ApplicationTrustCollection appTrusts = Find(identity, ApplicationVersionMatch.MatchExactVersion);
if (appTrusts.Count > 0)
return appTrusts[0];
return null;
}
}
private void CommitApplicationTrust(ApplicationIdentity applicationIdentity, string trustXml) {
StoreOperationMetadataProperty[] properties = new StoreOperationMetadataProperty[] {
new StoreOperationMetadataProperty(ClrPropertySet, ApplicationTrustProperty, trustXml)
};
IEnumDefinitionIdentity idenum = applicationIdentity.Identity.EnumAppPath();
IDefinitionIdentity[] asbId = new IDefinitionIdentity[1];
IDefinitionIdentity deplId = null;
if (idenum.Next(1, asbId) == 1)
deplId = asbId[0];
IDefinitionAppId defAppId = IsolationInterop.AppIdAuthority.CreateDefinition();
defAppId.SetAppPath(1, new IDefinitionIdentity[] {deplId});
defAppId.put_Codebase(applicationIdentity.CodeBase);
using (StoreTransaction storeTxn = new StoreTransaction()) {
storeTxn.Add(new StoreOperationSetDeploymentMetadata(defAppId, InstallReference, properties));
RefreshStorePointer();
m_pStore.Transact(storeTxn.Operations);
}
m_appTrusts = null; // reset the app trusts in the collection.
}
public int Add (ApplicationTrust trust) {
if (trust == null)
throw new ArgumentNullException("trust");
if (trust.ApplicationIdentity == null)
throw new ArgumentException(Environment.GetResourceString("Argument_ApplicationTrustShouldHaveIdentity"));
// Add the trust decision of the application to the fusion store.
if (m_storeBounded) {
CommitApplicationTrust(trust.ApplicationIdentity, trust.ToXml().ToString());
return -1;
} else {
return AppTrusts.Add(trust);
}
}
public void AddRange (ApplicationTrust[] trusts) {
if (trusts == null)
throw new ArgumentNullException("trusts");
int i=0;
try {
for (; i
IEnumerator IEnumerable.GetEnumerator() {
return new ApplicationTrustEnumerator(this);
}
///
void ICollection.CopyTo(Array array, int index) {
if (array == null)
throw new ArgumentNullException("array");
if (array.Rank != 1)
throw new ArgumentException(Environment.GetResourceString("Arg_RankMultiDimNotSupported"));
if (index < 0 || index >= array.Length)
throw new ArgumentOutOfRangeException("index", Environment.GetResourceString("ArgumentOutOfRange_Index"));
if (array.Length - index < this.Count)
throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));
for (int i=0; i < this.Count; i++) {
array.SetValue(this[i], index++);
}
}
public void CopyTo (ApplicationTrust[] array, int index) {
((ICollection)this).CopyTo(array, index);
}
public bool IsSynchronized {
get {
return false;
}
}
public object SyncRoot {
get {
return this;
}
}
}
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class ApplicationTrustEnumerator : IEnumerator {
private ApplicationTrustCollection m_trusts;
private int m_current;
private ApplicationTrustEnumerator() {}
internal ApplicationTrustEnumerator(ApplicationTrustCollection trusts) {
m_trusts = trusts;
m_current = -1;
}
public ApplicationTrust Current {
get {
return m_trusts[m_current];
}
}
///
object IEnumerator.Current {
get {
return (object) m_trusts[m_current];
}
}
public bool MoveNext() {
if (m_current == ((int) m_trusts.Count - 1))
return false;
m_current++;
return true;
}
public void Reset() {
m_current = -1;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
//
// ApplicationTrust.cs
//
// This class encapsulates security decisions about an application.
//
namespace System.Security.Policy {
using System.Collections;
using System.Deployment.Internal.Isolation;
using System.Deployment.Internal.Isolation.Manifest;
using System.Globalization;
using System.IO;
using System.Runtime.InteropServices;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Permissions;
using System.Security.Util;
using System.Text;
using System.Threading;
[System.Runtime.InteropServices.ComVisible(true)]
public enum ApplicationVersionMatch {
MatchExactVersion,
MatchAllVersions
}
[System.Runtime.InteropServices.ComVisible(true)]
[Serializable]
public sealed class ApplicationTrust : ISecurityEncodable {
private ApplicationIdentity m_appId;
private bool m_appTrustedToRun;
private bool m_persist;
private object m_extraInfo;
private SecurityElement m_elExtraInfo;
private PolicyStatement m_psDefaultGrant;
private StrongName[] m_fullTrustAssemblies;
// Permission special flags for the default grant set in this ApplicationTrust. This should be
// updated in [....] with any updates to the default grant set.
//
// In the general case, these values cannot be trusted - we only store a reference to the
// DefaultGrantSet, and return the reference directly, which means that code can update the
// permission set without our knowledge. That would lead to the flags getting out of [....] with the
// grant set.
//
// However, we only care about these flags when we're creating a homogenous AppDomain, and in that
// case we control the ApplicationTrust object end-to-end, and know that the permission set will not
// change after the flags are calculated.
[NonSerialized]
private int m_grantSetSpecialFlags;
public ApplicationTrust (ApplicationIdentity applicationIdentity) : this () {
ApplicationIdentity = applicationIdentity;
}
public ApplicationTrust () : this (new PermissionSet(PermissionState.None)) {}
internal ApplicationTrust (PermissionSet defaultGrantSet) : this (defaultGrantSet, null) {}
internal ApplicationTrust (PermissionSet defaultGrantSet, StrongName[] fullTrustAssemblies) {
// Creating a PolicyStatement copies the incoming permission set, so we don't have to worry
// about the PermissionSet parameter changing underneath us after we've calculated the
// permisison flags in the DefaultGrantSet setter.
DefaultGrantSet = new PolicyStatement(defaultGrantSet);
FullTrustAssemblies = fullTrustAssemblies;
}
public ApplicationIdentity ApplicationIdentity {
get {
return m_appId;
}
set {
if (value == null)
throw new ArgumentNullException(Environment.GetResourceString("Argument_InvalidAppId"));
m_appId = value;
}
}
public PolicyStatement DefaultGrantSet {
get {
if (m_psDefaultGrant == null)
return new PolicyStatement(new PermissionSet(PermissionState.None));
return m_psDefaultGrant;
}
set {
if (value == null) {
m_psDefaultGrant = null;
m_grantSetSpecialFlags = 0;
}
else {
m_psDefaultGrant = value;
m_grantSetSpecialFlags = SecurityManager.GetSpecialFlags(m_psDefaultGrant.PermissionSet, null);
}
}
}
internal StrongName[] FullTrustAssemblies {
get {
return m_fullTrustAssemblies;
}
set {
m_fullTrustAssemblies = value;
}
}
public bool IsApplicationTrustedToRun {
get {
return m_appTrustedToRun;
}
set {
m_appTrustedToRun = value;
}
}
public bool Persist {
get {
return m_persist;
}
set {
m_persist = value;
}
}
public object ExtraInfo {
get {
if (m_elExtraInfo != null) {
m_extraInfo = ObjectFromXml(m_elExtraInfo);
m_elExtraInfo = null;
}
return m_extraInfo;
}
set {
m_elExtraInfo = null;
m_extraInfo = value;
}
}
public SecurityElement ToXml () {
SecurityElement elRoot = new SecurityElement("ApplicationTrust");
elRoot.AddAttribute("version", "1");
if (m_appId != null)
elRoot.AddAttribute("FullName", SecurityElement.Escape(m_appId.FullName));
if (m_appTrustedToRun)
elRoot.AddAttribute("TrustedToRun", "true");
if (m_persist)
elRoot.AddAttribute("Persist", "true");
if (m_psDefaultGrant != null) {
SecurityElement elDefaultGrant = new SecurityElement("DefaultGrant");
elDefaultGrant.AddChild(m_psDefaultGrant.ToXml());
elRoot.AddChild(elDefaultGrant);
}
if (m_fullTrustAssemblies != null) {
SecurityElement elFullTrustAssemblies = new SecurityElement("FullTrustAssemblies");
for (int index = 0; index < m_fullTrustAssemblies.Length; index++) {
if (m_fullTrustAssemblies[index] != null)
elFullTrustAssemblies.AddChild(m_fullTrustAssemblies[index].ToXml());
}
elRoot.AddChild(elFullTrustAssemblies);
}
if (ExtraInfo != null)
elRoot.AddChild(ObjectToXml("ExtraInfo", ExtraInfo));
return elRoot;
}
public void FromXml (SecurityElement element) {
if (element == null)
throw new ArgumentNullException("element");
if (String.Compare(element.Tag, "ApplicationTrust", StringComparison.Ordinal) != 0)
throw new ArgumentException(Environment.GetResourceString("Argument_InvalidXML"));
m_psDefaultGrant = null;
m_grantSetSpecialFlags = 0;
m_fullTrustAssemblies = null;
m_appTrustedToRun = false;
string isAppTrustedToRun = element.Attribute("TrustedToRun");
if (isAppTrustedToRun != null && String.Compare(isAppTrustedToRun, "true", StringComparison.Ordinal) == 0)
m_appTrustedToRun = true;
string persist = element.Attribute("Persist");
if (persist != null && String.Compare(persist, "true", StringComparison.Ordinal) == 0)
m_persist = true;
string fullName = element.Attribute("FullName");
if (fullName != null && fullName.Length > 0)
m_appId = new ApplicationIdentity(fullName);
SecurityElement elDefaultGrant = element.SearchForChildByTag("DefaultGrant");
if (elDefaultGrant != null) {
SecurityElement elDefaultGrantPS = elDefaultGrant.SearchForChildByTag("PolicyStatement");
if (elDefaultGrantPS != null) {
PolicyStatement ps = new PolicyStatement(null);
ps.FromXml(elDefaultGrantPS);
m_psDefaultGrant = ps;
m_grantSetSpecialFlags = SecurityManager.GetSpecialFlags(ps.PermissionSet, null);
}
}
SecurityElement elFullTrustAssemblies = element.SearchForChildByTag("FullTrustAssemblies");
if (elFullTrustAssemblies != null && elFullTrustAssemblies.InternalChildren != null) {
m_fullTrustAssemblies = new StrongName[elFullTrustAssemblies.Children.Count];
IEnumerator enumerator = elFullTrustAssemblies.Children.GetEnumerator();
int index = 0;
while (enumerator.MoveNext()) {
m_fullTrustAssemblies[index] = new StrongName();
m_fullTrustAssemblies[index].FromXml(enumerator.Current as SecurityElement);
index++;
}
}
m_elExtraInfo = element.SearchForChildByTag("ExtraInfo");
}
private static SecurityElement ObjectToXml (string tag, Object obj) {
BCLDebug.Assert(obj != null, "You need to pass in an object");
ISecurityEncodable encodableObj = obj as ISecurityEncodable;
SecurityElement elObject;
if (encodableObj != null) {
elObject = encodableObj.ToXml();
if (!elObject.Tag.Equals(tag))
throw new ArgumentException(Environment.GetResourceString("Argument_InvalidXML"));
}
MemoryStream stream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, obj);
byte[] array = stream.ToArray();
elObject = new SecurityElement(tag);
elObject.AddAttribute("Data", Hex.EncodeHexString(array));
return elObject;
}
private static Object ObjectFromXml (SecurityElement elObject) {
BCLDebug.Assert(elObject != null, "You need to pass in a security element");
if (elObject.Attribute("class") != null) {
ISecurityEncodable encodableObj = XMLUtil.CreateCodeGroup(elObject) as ISecurityEncodable;
if (encodableObj != null) {
encodableObj.FromXml(elObject);
return encodableObj;
}
}
string objectData = elObject.Attribute("Data");
MemoryStream stream = new MemoryStream(Hex.DecodeHexString(objectData));
BinaryFormatter formatter = new BinaryFormatter();
return formatter.Deserialize(stream);
}
}
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.ControlPolicy)]
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class ApplicationTrustCollection : ICollection {
private const string ApplicationTrustProperty = "ApplicationTrust";
private const string InstallerIdentifier = "{60051b8f-4f12-400a-8e50-dd05ebd438d1}";
private static Guid ClrPropertySet = new Guid("c989bb7a-8385-4715-98cf-a741a8edb823");
// The CLR specific constant install reference.
private static object s_installReference = null;
private static StoreApplicationReference InstallReference {
get {
if (s_installReference == null) {
Interlocked.CompareExchange(ref s_installReference,
new StoreApplicationReference(
IsolationInterop.GUID_SXS_INSTALL_REFERENCE_SCHEME_OPAQUESTRING,
InstallerIdentifier,
null),
null);
}
return (StoreApplicationReference) s_installReference;
}
}
private readonly object m_syncRoot = new object();
private object m_appTrusts = null;
private ArrayList AppTrusts {
get {
if (m_appTrusts == null) {
ArrayList appTrusts = new ArrayList();
if (m_storeBounded) {
RefreshStorePointer();
// enumerate the user store and populate the collection
StoreDeploymentMetadataEnumeration deplEnum = m_pStore.EnumInstallerDeployments(IsolationInterop.GUID_SXS_INSTALL_REFERENCE_SCHEME_OPAQUESTRING, InstallerIdentifier, ApplicationTrustProperty, null);
foreach (IDefinitionAppId defAppId in deplEnum) {
StoreDeploymentMetadataPropertyEnumeration metadataEnum = m_pStore.EnumInstallerDeploymentProperties(IsolationInterop.GUID_SXS_INSTALL_REFERENCE_SCHEME_OPAQUESTRING, InstallerIdentifier, ApplicationTrustProperty, defAppId);
foreach (StoreOperationMetadataProperty appTrustProperty in metadataEnum) {
string appTrustXml = appTrustProperty.Value;
if (appTrustXml != null && appTrustXml.Length > 0) {
SecurityElement seTrust = SecurityElement.FromString(appTrustXml);
ApplicationTrust appTrust = new ApplicationTrust();
appTrust.FromXml(seTrust);
appTrusts.Add(appTrust);
}
}
}
}
Interlocked.CompareExchange(ref m_appTrusts, appTrusts, null);
}
return m_appTrusts as ArrayList;
}
}
private bool m_storeBounded = false;
private Store m_pStore = null; // Component store interface pointer.
// Only internal constructors are exposed.
internal ApplicationTrustCollection () : this(false) {}
internal ApplicationTrustCollection (bool storeBounded) {
m_storeBounded = storeBounded;
}
private void RefreshStorePointer () {
// Refresh store pointer.
if (m_pStore != null)
Marshal.ReleaseComObject(m_pStore.InternalStore);
m_pStore = IsolationInterop.GetUserStore();
}
public int Count {
get {
return AppTrusts.Count;
}
}
public ApplicationTrust this[int index] {
get {
return AppTrusts[index] as ApplicationTrust;
}
}
public ApplicationTrust this[string appFullName] {
get {
ApplicationIdentity identity = new ApplicationIdentity(appFullName);
ApplicationTrustCollection appTrusts = Find(identity, ApplicationVersionMatch.MatchExactVersion);
if (appTrusts.Count > 0)
return appTrusts[0];
return null;
}
}
private void CommitApplicationTrust(ApplicationIdentity applicationIdentity, string trustXml) {
StoreOperationMetadataProperty[] properties = new StoreOperationMetadataProperty[] {
new StoreOperationMetadataProperty(ClrPropertySet, ApplicationTrustProperty, trustXml)
};
IEnumDefinitionIdentity idenum = applicationIdentity.Identity.EnumAppPath();
IDefinitionIdentity[] asbId = new IDefinitionIdentity[1];
IDefinitionIdentity deplId = null;
if (idenum.Next(1, asbId) == 1)
deplId = asbId[0];
IDefinitionAppId defAppId = IsolationInterop.AppIdAuthority.CreateDefinition();
defAppId.SetAppPath(1, new IDefinitionIdentity[] {deplId});
defAppId.put_Codebase(applicationIdentity.CodeBase);
using (StoreTransaction storeTxn = new StoreTransaction()) {
storeTxn.Add(new StoreOperationSetDeploymentMetadata(defAppId, InstallReference, properties));
RefreshStorePointer();
m_pStore.Transact(storeTxn.Operations);
}
m_appTrusts = null; // reset the app trusts in the collection.
}
public int Add (ApplicationTrust trust) {
if (trust == null)
throw new ArgumentNullException("trust");
if (trust.ApplicationIdentity == null)
throw new ArgumentException(Environment.GetResourceString("Argument_ApplicationTrustShouldHaveIdentity"));
// Add the trust decision of the application to the fusion store.
if (m_storeBounded) {
CommitApplicationTrust(trust.ApplicationIdentity, trust.ToXml().ToString());
return -1;
} else {
return AppTrusts.Add(trust);
}
}
public void AddRange (ApplicationTrust[] trusts) {
if (trusts == null)
throw new ArgumentNullException("trusts");
int i=0;
try {
for (; i
IEnumerator IEnumerable.GetEnumerator() {
return new ApplicationTrustEnumerator(this);
}
///
void ICollection.CopyTo(Array array, int index) {
if (array == null)
throw new ArgumentNullException("array");
if (array.Rank != 1)
throw new ArgumentException(Environment.GetResourceString("Arg_RankMultiDimNotSupported"));
if (index < 0 || index >= array.Length)
throw new ArgumentOutOfRangeException("index", Environment.GetResourceString("ArgumentOutOfRange_Index"));
if (array.Length - index < this.Count)
throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));
for (int i=0; i < this.Count; i++) {
array.SetValue(this[i], index++);
}
}
public void CopyTo (ApplicationTrust[] array, int index) {
((ICollection)this).CopyTo(array, index);
}
public bool IsSynchronized {
get {
return false;
}
}
public object SyncRoot {
get {
return this;
}
}
}
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class ApplicationTrustEnumerator : IEnumerator {
private ApplicationTrustCollection m_trusts;
private int m_current;
private ApplicationTrustEnumerator() {}
internal ApplicationTrustEnumerator(ApplicationTrustCollection trusts) {
m_trusts = trusts;
m_current = -1;
}
public ApplicationTrust Current {
get {
return m_trusts[m_current];
}
}
///
object IEnumerator.Current {
get {
return (object) m_trusts[m_current];
}
}
public bool MoveNext() {
if (m_current == ((int) m_trusts.Count - 1))
return false;
m_current++;
return true;
}
public void Reset() {
m_current = -1;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Action.cs
- DataBindingValueUIHandler.cs
- ListControlConvertEventArgs.cs
- clipboard.cs
- PrintPreviewControl.cs
- GridEntryCollection.cs
- ListControlBoundActionList.cs
- ClaimComparer.cs
- WebHttpElement.cs
- CompilerError.cs
- SupportingTokenAuthenticatorSpecification.cs
- ListViewPagedDataSource.cs
- Rfc2898DeriveBytes.cs
- TreeView.cs
- RegistrySecurity.cs
- EdmTypeAttribute.cs
- RefreshEventArgs.cs
- Vector3DValueSerializer.cs
- versioninfo.cs
- SecUtil.cs
- ReadOnlyDataSourceView.cs
- BamlTreeUpdater.cs
- RelationshipWrapper.cs
- CryptoStream.cs
- FacetDescriptionElement.cs
- TextTreeRootNode.cs
- TextEncodedRawTextWriter.cs
- PackWebRequestFactory.cs
- ResourceDescriptionAttribute.cs
- MutexSecurity.cs
- ReadOnlyCollectionBuilder.cs
- CorrelationInitializer.cs
- SchemaUtility.cs
- TextDecoration.cs
- WindowsComboBox.cs
- FrameworkName.cs
- Psha1DerivedKeyGenerator.cs
- ScrollChangedEventArgs.cs
- MethodBuilderInstantiation.cs
- SrgsElementList.cs
- PeerCollaborationPermission.cs
- LinkTarget.cs
- SafePEFileHandle.cs
- PersistenceTypeAttribute.cs
- Ray3DHitTestResult.cs
- SqlDataAdapter.cs
- XamlReader.cs
- ToolStripSettings.cs
- SqlDataSource.cs
- DocumentViewerConstants.cs
- ModuleBuilder.cs
- ListenerAdaptersInstallComponent.cs
- RoutedEventHandlerInfo.cs
- FormViewPagerRow.cs
- DynamicControl.cs
- SkinBuilder.cs
- StringFunctions.cs
- MapPathBasedVirtualPathProvider.cs
- DependencyPropertyKey.cs
- RequestQueue.cs
- ProviderCollection.cs
- ApplicationServicesHostFactory.cs
- MimeTextImporter.cs
- XmlSerializationReader.cs
- KoreanLunisolarCalendar.cs
- DataSourceHelper.cs
- BamlMapTable.cs
- PlatformCulture.cs
- ContextProperty.cs
- UpdateExpressionVisitor.cs
- Path.cs
- BaseParser.cs
- DataGridViewColumnDesignTimeVisibleAttribute.cs
- AssemblyResourceLoader.cs
- AnonymousIdentificationSection.cs
- DesignBinding.cs
- XmlnsDictionary.cs
- Encoder.cs
- ButtonFieldBase.cs
- HttpContext.cs
- ExtendedProtectionPolicyElement.cs
- TextOptionsInternal.cs
- ProtocolsConfigurationEntry.cs
- FormViewDeletedEventArgs.cs
- TraceEventCache.cs
- Helpers.cs
- OleTxTransactionInfo.cs
- AssemblySettingAttributes.cs
- ObjectCacheHost.cs
- ChunkedMemoryStream.cs
- TextBox.cs
- _DigestClient.cs
- JpegBitmapDecoder.cs
- CodeTypeParameter.cs
- DialogResultConverter.cs
- SimpleRecyclingCache.cs
- LinkUtilities.cs
- EntityContainerAssociationSet.cs
- SiteOfOriginPart.cs
- DataGridViewCellCollection.cs