diff --git a/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/Permissions/XamlAccessLevel.cs b/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/Permissions/XamlAccessLevel.cs index 32f5f5d5943..f7320d39129 100644 --- a/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/Permissions/XamlAccessLevel.cs +++ b/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/Permissions/XamlAccessLevel.cs @@ -7,11 +7,6 @@ namespace System.Xaml.Permissions { - /// - /// This class is immutable. Various consumers copy references into SecurityCritical fields, - /// and their security depends on the immutability of the members defined here. - /// Derived classes may add mutable members, those have no impact on the consumers of this class. - /// [Serializable] public class XamlAccessLevel { @@ -23,59 +18,28 @@ private XamlAccessLevel(string assemblyName, string typeName) public static XamlAccessLevel AssemblyAccessTo(Assembly assembly) { - if (assembly == null) - { - throw new ArgumentNullException(nameof(assembly)); - } return new XamlAccessLevel(assembly.FullName, null); } public static XamlAccessLevel AssemblyAccessTo(AssemblyName assemblyName) { - if (assemblyName == null) - { - throw new ArgumentNullException(nameof(assemblyName)); - } - ValidateAssemblyName(assemblyName, "assemblyName"); return new XamlAccessLevel(assemblyName.FullName, null); } public static XamlAccessLevel PrivateAccessTo(Type type) { - if (type == null) - { - throw new ArgumentNullException(nameof(type)); - } return new XamlAccessLevel(type.Assembly.FullName, type.FullName); } public static XamlAccessLevel PrivateAccessTo(string assemblyQualifiedTypeName) { - if (assemblyQualifiedTypeName == null) - { - throw new ArgumentNullException(nameof(assemblyQualifiedTypeName)); - } int nameBoundary = assemblyQualifiedTypeName.IndexOf(','); - if (nameBoundary < 0) - { - throw new ArgumentException(SR.Get(SRID.ExpectedQualifiedTypeName, assemblyQualifiedTypeName), nameof(assemblyQualifiedTypeName)); - } - string typeName = assemblyQualifiedTypeName.Substring(0, nameBoundary).Trim(); string assemblyFullName = assemblyQualifiedTypeName.Substring(nameBoundary + 1).Trim(); AssemblyName assemblyName = new AssemblyName(assemblyFullName); - ValidateAssemblyName(assemblyName, "assemblyQualifiedTypeName"); - return new XamlAccessLevel(assemblyName.FullName, typeName); - } - - // Read-only: these properties should not be allowed to be modified once this object - // has been passed to XamlLoadPermission - - // Stored as string: we need to store the assembly and type names, rather than Assembly or - // Type references, because permissions can be serialized, and we don't want to force an - // assembly load on deserialization in a different AppDomain. - + } + public AssemblyName AssemblyAccessToAssemblyName { get { return new AssemblyName(AssemblyNameString); } @@ -84,67 +48,5 @@ public AssemblyName AssemblyAccessToAssemblyName public string PrivateAccessToTypeName { get; private set; } internal string AssemblyNameString { get; private set; } - - internal XamlAccessLevel AssemblyOnly() - { - return new XamlAccessLevel(AssemblyNameString, null); - } - - internal static XamlAccessLevel FromXml(SecurityElement elem) - { - if (elem.Tag != XmlConstants.XamlAccessLevel) - { - throw new ArgumentException(SR.Get(SRID.SecurityXmlUnexpectedTag, elem.Tag, XmlConstants.XamlAccessLevel), nameof(elem)); - } - - string assemblyNameString = elem.Attribute(XmlConstants.AssemblyName); - if (assemblyNameString == null) - { - throw new ArgumentException(SR.Get(SRID.SecurityXmlMissingAttribute, XmlConstants.AssemblyName), nameof(elem)); - } - AssemblyName assemblyName = new AssemblyName(assemblyNameString); - ValidateAssemblyName(assemblyName, "elem"); - - string typeName = elem.Attribute(XmlConstants.TypeName); - if (typeName != null) - { - typeName = typeName.Trim(); - } - - return new XamlAccessLevel(assemblyName.FullName, typeName); - } - - internal bool Includes(XamlAccessLevel other) - { - return other.AssemblyNameString == AssemblyNameString && - (other.PrivateAccessToTypeName == null || other.PrivateAccessToTypeName == PrivateAccessToTypeName); - } - - internal SecurityElement ToXml() - { - SecurityElement element = new SecurityElement(XmlConstants.XamlAccessLevel); - element.AddAttribute(XmlConstants.AssemblyName, AssemblyNameString); - if (PrivateAccessToTypeName != null) - { - element.AddAttribute(XmlConstants.TypeName, PrivateAccessToTypeName); - } - return element; - } - - private static void ValidateAssemblyName(AssemblyName assemblyName, string argName) - { - if (assemblyName.Name == null || assemblyName.Version == null || - assemblyName.CultureInfo == null || assemblyName.GetPublicKeyToken() == null) - { - throw new ArgumentException(SR.Get(SRID.ExpectedQualifiedAssemblyName, assemblyName.FullName), argName); - } - } - - private static class XmlConstants - { - public const string XamlAccessLevel = "XamlAccessLevel"; - public const string AssemblyName = "AssemblyName"; - public const string TypeName = "TypeName"; - } } } diff --git a/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/Permissions/XamlLoadPermission.cs b/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/Permissions/XamlLoadPermission.cs index 6c239c6c12a..7b1597ba86e 100644 --- a/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/Permissions/XamlLoadPermission.cs +++ b/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/Permissions/XamlLoadPermission.cs @@ -4,7 +4,6 @@ using System.Collections.Generic; using System.Collections.ObjectModel; -using System.Diagnostics; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; @@ -14,327 +13,21 @@ namespace System.Xaml.Permissions [Serializable] public sealed class XamlLoadPermission : CodeAccessPermission, IUnrestrictedPermission { - private static IList s_emptyAccessLevel; - private bool _isUnrestricted; - - public XamlLoadPermission(PermissionState state) - { - Init(state == PermissionState.Unrestricted, null); - } - - public XamlLoadPermission(XamlAccessLevel allowedAccess) - { - if (allowedAccess == null) - { - throw new ArgumentNullException(nameof(allowedAccess)); - } - Init(false, new XamlAccessLevel[] { allowedAccess }); - } - - public XamlLoadPermission(IEnumerable allowedAccess) - { - if (allowedAccess == null) - { - throw new ArgumentNullException(nameof(allowedAccess)); - } - List accessList = new List(allowedAccess); - foreach (XamlAccessLevel accessLevel in allowedAccess) - { - if (accessLevel == null) - { - throw new ArgumentException(SR.Get(SRID.CollectionCannotContainNulls, "allowedAccess")); - } - accessList.Add(accessLevel); - } - Init(false, accessList); - } - -#if NETCOREAPP3_0 - + public XamlLoadPermission(PermissionState state) { } + public XamlLoadPermission(XamlAccessLevel allowedAccess) { } + public XamlLoadPermission(IEnumerable allowedAccess) { } [ComVisible(false)] - public override bool Equals(object obj) - { - IPermission perm = obj as IPermission; - if (obj != null && perm == null) - { - return false; - } - - try - { - if (!IsSubsetOf(perm)) - { - return false; - } - - if (perm != null && !perm.IsSubsetOf(this)) - { - return false; - } - } - catch (ArgumentException) - { - // Any argument exception implies inequality - // Note that we require a try/catch here because we have to deal with - // custom permissions that may throw exceptions indiscriminately - return false; - } - - return true; - } - + public override bool Equals(object obj) { return false; } [ComVisible(false)] - public override int GetHashCode() - { - // This implementation is only to silence a compiler warning - return base.GetHashCode(); - } - -#endif - - // copy ctor. We can reuse the list of the existing instance, because it is a - // ReadOnlyCollection over a privately created array, hence is never mutated, - // even if the other instance is mutated via FromXml(). - private XamlLoadPermission(XamlLoadPermission other) - { - _isUnrestricted = other._isUnrestricted; - AllowedAccess = other.AllowedAccess; - } - - private void Init(bool isUnrestricted, IList allowedAccess) - { - _isUnrestricted = isUnrestricted; - if (allowedAccess == null) - { - if (s_emptyAccessLevel == null) - { - s_emptyAccessLevel = new ReadOnlyCollection(Array.Empty()); - } - AllowedAccess = s_emptyAccessLevel; - } - else - { - Debug.Assert(!isUnrestricted); - AllowedAccess = new ReadOnlyCollection(allowedAccess); - } - } - - public IList AllowedAccess { get; private set; } // ReadOnlyCollection - - public override IPermission Copy() - { - return new XamlLoadPermission(this); - } - - public override void FromXml(SecurityElement elem) - { - if (elem == null) - { - throw new ArgumentNullException(nameof(elem)); - } - if (elem.Tag != XmlConstants.IPermission) - { - throw new ArgumentException(SR.Get(SRID.SecurityXmlUnexpectedTag, elem.Tag, XmlConstants.IPermission), nameof(elem)); - } - - string className = elem.Attribute(XmlConstants.Class); - if (!className.StartsWith(GetType().FullName, false, TypeConverterHelper.InvariantEnglishUS)) - { - throw new ArgumentException(SR.Get(SRID.SecurityXmlUnexpectedValue, className, XmlConstants.Class, GetType().FullName), nameof(elem)); - } - - string version = elem.Attribute(XmlConstants.Version); - if (version != null && version != XmlConstants.VersionNumber) - { - throw new ArgumentException(SR.Get(SRID.SecurityXmlUnexpectedValue, className, XmlConstants.Version, XmlConstants.VersionNumber), nameof(elem)); - } - - string unrestricted = elem.Attribute(XmlConstants.Unrestricted); - if (unrestricted != null && bool.Parse(unrestricted)) - { - Init(true, null); - } - else - { - List allowedAccess = null; - if (elem.Children != null) - { - allowedAccess = new List(elem.Children.Count); - foreach (SecurityElement child in elem.Children) - { - allowedAccess.Add(XamlAccessLevel.FromXml(child)); - } - } - Init(false, allowedAccess); - } - } - - public bool Includes(XamlAccessLevel requestedAccess) - { - if (requestedAccess == null) - { - throw new ArgumentNullException(nameof(requestedAccess)); - } - if (_isUnrestricted) - { - return true; - } - foreach (XamlAccessLevel allowedAccess in AllowedAccess) - { - if (allowedAccess.Includes(requestedAccess)) - { - return true; - } - } - return false; - } - - public override IPermission Intersect(IPermission target) - { - if (target == null) - { - return null; - } - XamlLoadPermission other = CastPermission(target, "target"); - if (other.IsUnrestricted()) - { - return Copy(); - } - if (IsUnrestricted()) - { - return other.Copy(); - } - - List result = new List(); - // We could optimize this with a hash, but we don't expect people to be creating - // large unions of access levels. - foreach (XamlAccessLevel accessLevel in AllowedAccess) - { - // First try the full access level - if (other.Includes(accessLevel)) - { - result.Add(accessLevel); - } - // Then try the assembly subset - else if (accessLevel.PrivateAccessToTypeName != null) - { - XamlAccessLevel assemblyAccess = accessLevel.AssemblyOnly(); - if (other.Includes(assemblyAccess)) - { - result.Add(assemblyAccess); - } - } - } - return new XamlLoadPermission(result); - } - - public override bool IsSubsetOf(IPermission target) - { - if (target == null) - { - bool isEmpty = !IsUnrestricted() && AllowedAccess.Count == 0; - return isEmpty; - } - XamlLoadPermission other = CastPermission(target, "target"); - if (other.IsUnrestricted()) - { - return true; - } - if (IsUnrestricted()) - { - return false; - } - - foreach (XamlAccessLevel accessLevel in AllowedAccess) - { - if (!other.Includes(accessLevel)) - { - return false; - } - } - return true; - } - - public override SecurityElement ToXml() - { - SecurityElement securityElement = new SecurityElement(XmlConstants.IPermission); - securityElement.AddAttribute(XmlConstants.Class, GetType().AssemblyQualifiedName); - securityElement.AddAttribute(XmlConstants.Version, XmlConstants.VersionNumber); - - if (IsUnrestricted()) - { - securityElement.AddAttribute(XmlConstants.Unrestricted, Boolean.TrueString); - } - else - { - foreach (XamlAccessLevel accessLevel in AllowedAccess) - { - securityElement.AddChild(accessLevel.ToXml()); - } - } - - return securityElement; - } - - public override IPermission Union(IPermission other) - { - if (other == null) - { - return Copy(); - } - XamlLoadPermission xamlOther = CastPermission(other, "other"); - if (IsUnrestricted() || xamlOther.IsUnrestricted()) - { - return new XamlLoadPermission(PermissionState.Unrestricted); - } - - List mergedAccess = new List(AllowedAccess); - foreach (XamlAccessLevel accessLevel in xamlOther.AllowedAccess) - { - if (!Includes(accessLevel)) - { - mergedAccess.Add(accessLevel); - if (accessLevel.PrivateAccessToTypeName != null) - { - // If we have an entry for access to just the assembly of this type, it is now redundant - for (int i = 0; i < mergedAccess.Count; i++) - { - if (mergedAccess[i].PrivateAccessToTypeName == null && - mergedAccess[i].AssemblyNameString == accessLevel.AssemblyNameString) - { - mergedAccess.RemoveAt(i); - break; - } - } - } - } - } - return new XamlLoadPermission(mergedAccess); - } - - public bool IsUnrestricted() - { - return _isUnrestricted; - } - - private static XamlLoadPermission CastPermission(IPermission other, string argName) - { - XamlLoadPermission result = other as XamlLoadPermission; - if (result == null) - { - throw new ArgumentException(SR.Get(SRID.ExpectedLoadPermission), argName); - } - return result; - } - - private static class XmlConstants - { - public const string IPermission = "IPermission"; - public const string Class = "class"; - public const string Version = "version"; - public const string VersionNumber = "1"; - public const string Unrestricted = "Unrestricted"; - } + public override int GetHashCode() { return base.GetHashCode(); } + public IList AllowedAccess {get; private set;} = new ReadOnlyCollection(Array.Empty()); + public override IPermission Copy() { return new XamlLoadPermission(PermissionState.Unrestricted); } + public override void FromXml(SecurityElement elem) { } + public bool Includes(XamlAccessLevel requestedAccess) { return true; } + public override IPermission Intersect(IPermission target) { return new XamlLoadPermission(PermissionState.Unrestricted); } + public override bool IsSubsetOf(IPermission target) { return true; } + public override SecurityElement ToXml() { return default(SecurityElement); } + public override IPermission Union(IPermission other) { return new XamlLoadPermission(PermissionState.Unrestricted); } + public bool IsUnrestricted() { return true; } } - } diff --git a/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Security/Permissions/MediaPermission.cs b/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Security/Permissions/MediaPermission.cs index 7c49e1d3538..cdb17e33fd4 100644 --- a/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Security/Permissions/MediaPermission.cs +++ b/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Security/Permissions/MediaPermission.cs @@ -1,687 +1,59 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. - -// -// -// Description: -// The MediaPermission controls the ability to create rich Media in Avalon. -// -// -// -// - -using System; -using System.Security; -using System.Security.Permissions; -using System.IO; -using System.Runtime.Serialization; -using System.Collections; -using System.Globalization; -using System.Diagnostics.CodeAnalysis; -using System.Windows; -using MS.Internal.WindowsBase; - -namespace System.Security.Permissions +namespace System.Security.Permissions { - /// - /// Enum of audio permission levels. - /// public enum MediaPermissionAudio { - /// - /// NoAudio - no sound allowed to play. - /// NoAudio, - - /// - /// SiteOfOriginAudio - only allow audio from site of origin. - /// - SiteOfOriginAudio, - - /// - /// SafeAudio - allowed to play audio with some restrictions. - /// + SiteOfOriginAudio, SafeAudio, - - /// - /// Allowed to play audio with no restrictions - /// AllAudio -} - - /// - /// Enum of video permission levels. - /// + } public enum MediaPermissionVideo { - /// - /// NoVideo - no video allowed to play. - /// NoVideo, - - /// - /// SiteOfOriginVideo - only allow video from site of origin. - /// - SiteOfOriginVideo, - - /// - /// SafeVideo - allowed to play video with some restrictions. - /// + SiteOfOriginVideo, SafeVideo, - - /// - /// allowed to play video with no restrictions - /// AllVideo, -} - - /// - /// Enum of image permission levels. - /// + } public enum MediaPermissionImage { - /// - /// NoImage - no images allowed to display - /// NoImage, - - /// - /// SiteOfOriginImage -only allow image from site of origin. - /// - SiteOfOriginImage, - - /// - /// SafeImage - allowed to display images with some restrictions. - /// Only certified codecs allowed. - /// + SiteOfOriginImage, SafeImage, - - /// - /// Allowed to display images with no restrictions. - /// AllImage, -} - - /// - /// The MediaPermission controls the ability for richMedia to work in partial trust. - /// - /// There are 3 enum values that control the type of media that can work. - /// - /// MediaPermissionAudio - controls the level of audio support. - /// MediaPermissionVideo - controls the level of video supported. - /// MeidaPermissionImage - controls the level of image display supported. - /// + } [Serializable()] - sealed public class MediaPermission : CodeAccessPermission, IUnrestrictedPermission + sealed public class MediaPermission : CodeAccessPermission, IUnrestrictedPermission { - //------------------------------------------------------ - // - // Constructors - // - //------------------------------------------------------ - - #region Constructors - - /// - /// MediaPermission ctor. - /// - public MediaPermission() - { - InitDefaults(); - } - - /// - /// MediaPermission ctor. - /// - public MediaPermission(PermissionState state) - { - if (state == PermissionState.Unrestricted) - { - _mediaPermissionAudio = MediaPermissionAudio.AllAudio; - _mediaPermissionVideo = MediaPermissionVideo.AllVideo; - _mediaPermissionImage = MediaPermissionImage.AllImage; - } - else if (state == PermissionState.None) - { - _mediaPermissionAudio = MediaPermissionAudio.NoAudio; - _mediaPermissionVideo = MediaPermissionVideo.NoVideo; - _mediaPermissionImage = MediaPermissionImage.NoImage; - } - else - { - throw new ArgumentException( SR.Get(SRID.InvalidPermissionState) ); - } - } - - /// - /// MediaPermission ctor. - /// - public MediaPermission(MediaPermissionAudio permissionAudio ) - { - VerifyMediaPermissionAudio( permissionAudio ) ; - InitDefaults(); - - _mediaPermissionAudio = permissionAudio ; - } - - /// - /// MediaPermission ctor. - /// - public MediaPermission(MediaPermissionVideo permissionVideo ) - { - VerifyMediaPermissionVideo( permissionVideo ) ; - InitDefaults(); - - _mediaPermissionVideo = permissionVideo ; - } - - /// - /// MediaPermission ctor. - /// - public MediaPermission(MediaPermissionImage permissionImage ) - { - VerifyMediaPermissionImage( permissionImage ); - InitDefaults(); - - _mediaPermissionImage = permissionImage ; - } - - /// - /// MediaPermission ctor. - /// - public MediaPermission(MediaPermissionAudio permissionAudio, - MediaPermissionVideo permissionVideo, - MediaPermissionImage permissionImage ) - { - VerifyMediaPermissionAudio( permissionAudio ); - VerifyMediaPermissionVideo( permissionVideo ); - VerifyMediaPermissionImage( permissionImage ); - - _mediaPermissionAudio = permissionAudio ; - _mediaPermissionVideo = permissionVideo ; - _mediaPermissionImage = permissionImage ; - } - - #endregion Constructors - - //------------------------------------------------------ - // - // Public Methods - // - //------------------------------------------------------ - - #region Public Methods - - - // - // IUnrestrictedPermission implementation - // - - /// - /// Is this an unrestricted permisison ? - /// - public bool IsUnrestricted() - { - return EqualsLevel( MediaPermissionAudio.AllAudio , - MediaPermissionVideo.AllVideo, - MediaPermissionImage.AllImage ) ; - } - - // - // CodeAccessPermission implementation - // - - - /// - /// Is this a subsetOf the target ? - /// - public override bool IsSubsetOf(IPermission target) - { - if (target == null) - { - return EqualsLevel( MediaPermissionAudio.NoAudio, - MediaPermissionVideo.NoVideo, - MediaPermissionImage.NoImage ) ; - } - - MediaPermission operand = target as MediaPermission ; - if ( operand != null ) - { - return ( ( this._mediaPermissionAudio <= operand._mediaPermissionAudio) && - ( this._mediaPermissionVideo <= operand._mediaPermissionVideo ) && - ( this._mediaPermissionImage <= operand._mediaPermissionImage ) ) ; - } - else - { - throw new ArgumentException(SR.Get(SRID.TargetNotMediaPermissionLevel)); - } - } - - /// - /// Return the intersection with the target - /// - public override IPermission Intersect(IPermission target) - { - if (target == null) - { - return null; - } - - MediaPermission operand = target as MediaPermission ; - if ( operand != null ) - { - // - // Construct a permission that is the aggregate of the - // least priveleged level of the 3 enums. - // - MediaPermissionAudio audioIntersectLevel = _mediaPermissionAudio < operand._mediaPermissionAudio - ? _mediaPermissionAudio : operand._mediaPermissionAudio; - - MediaPermissionVideo videoIntersectLevel = _mediaPermissionVideo < operand._mediaPermissionVideo - ? _mediaPermissionVideo : operand._mediaPermissionVideo; - - MediaPermissionImage imageIntersectLevel = _mediaPermissionImage < operand._mediaPermissionImage - ? _mediaPermissionImage : operand._mediaPermissionImage ; - - if ( ( audioIntersectLevel == MediaPermissionAudio.NoAudio ) && - ( videoIntersectLevel == MediaPermissionVideo.NoVideo ) && - ( imageIntersectLevel == MediaPermissionImage.NoImage ) ) - - { - return null; - } - else - { - return new MediaPermission( audioIntersectLevel, videoIntersectLevel, imageIntersectLevel ) ; - } - } - else - { - throw new ArgumentException(SR.Get(SRID.TargetNotMediaPermissionLevel)); - } - } - - /// - /// Return the Union with the target - /// - public override IPermission Union(IPermission target) - { - if (target == null) - { - return this.Copy(); - } - - MediaPermission operand = target as MediaPermission ; - if ( operand != null ) - { - // - // Construct a permission that is the aggregate of the - // most priveleged level of the 3 enums. - // - MediaPermissionAudio audioUnionLevel = _mediaPermissionAudio > operand._mediaPermissionAudio - ? _mediaPermissionAudio : operand._mediaPermissionAudio; - - MediaPermissionVideo videoUnionLevel = _mediaPermissionVideo > operand._mediaPermissionVideo - ? _mediaPermissionVideo : operand._mediaPermissionVideo; - - MediaPermissionImage imageUnionLevel = _mediaPermissionImage > operand._mediaPermissionImage - ? _mediaPermissionImage : operand._mediaPermissionImage ; - - if ( ( audioUnionLevel == MediaPermissionAudio.NoAudio ) && - ( videoUnionLevel == MediaPermissionVideo.NoVideo ) && - ( imageUnionLevel == MediaPermissionImage.NoImage ) ) - { - return null; - } - else - { - return new MediaPermission( audioUnionLevel, videoUnionLevel, imageUnionLevel ) ; - } - } - else - { - throw new ArgumentException(SR.Get(SRID.TargetNotMediaPermissionLevel)); - } - } - - /// - /// Copy this permission. - /// - public override IPermission Copy() - { - return new MediaPermission( - this._mediaPermissionAudio, - this._mediaPermissionVideo, - this._mediaPermissionImage ); - } - - /// - /// Return an XML instantiation of this permisson. - /// - public override SecurityElement ToXml() - { - SecurityElement securityElement = new SecurityElement("IPermission"); - securityElement.AddAttribute("class", this.GetType().AssemblyQualifiedName); - securityElement.AddAttribute("version", "1"); - - if (IsUnrestricted()) - { - securityElement.AddAttribute("Unrestricted", Boolean.TrueString); - } - else - { - securityElement.AddAttribute("Audio", _mediaPermissionAudio.ToString()); - securityElement.AddAttribute("Video", _mediaPermissionVideo.ToString()); - securityElement.AddAttribute("Image", _mediaPermissionImage.ToString()); - } - - return securityElement; - } - - /// - /// Create a permission from XML - /// - public override void FromXml(SecurityElement securityElement) - { - if (securityElement == null) - { - throw new ArgumentNullException("securityElement"); - } - - - String className = securityElement.Attribute("class"); - - if (className == null || className.IndexOf(this.GetType().FullName, StringComparison.Ordinal) == -1) - { - throw new ArgumentNullException("securityElement"); - } - - String unrestricted = securityElement.Attribute("Unrestricted"); - if (unrestricted != null && Boolean.Parse(unrestricted)) - { - _mediaPermissionAudio = MediaPermissionAudio.AllAudio ; - _mediaPermissionVideo = MediaPermissionVideo.AllVideo ; - _mediaPermissionImage = MediaPermissionImage.AllImage; - return; - } - - InitDefaults(); - - String audio = securityElement.Attribute("Audio"); - - if (audio != null) - { - _mediaPermissionAudio = (MediaPermissionAudio)Enum.Parse(typeof(MediaPermissionAudio), audio ); - } - else - { - throw new ArgumentException(SR.Get(SRID.BadXml,"audio")); // bad XML - } - - String video = securityElement.Attribute("Video"); - - if (video != null) - { - _mediaPermissionVideo = (MediaPermissionVideo)Enum.Parse(typeof(MediaPermissionVideo), video ); - } - else - { - throw new ArgumentException(SR.Get(SRID.BadXml,"video")); // bad XML - } - - String image = securityElement.Attribute("Image"); - - if (image != null) - { - _mediaPermissionImage = (MediaPermissionImage)Enum.Parse(typeof(MediaPermissionImage), image ); - } - else - { - throw new ArgumentException(SR.Get(SRID.BadXml,"image")); // bad XML - } -} - - - #endregion Public Methods - - //------------------------------------------------------ - // - // Public Properties - // - //------------------------------------------------------ - - #region Public Properties - - /// - /// Current value of allowed audio permission level - /// - public MediaPermissionAudio Audio - { - get - { - return _mediaPermissionAudio ; - } - } - - /// - /// Current value of allowed video permission level - /// - public MediaPermissionVideo Video - { - get - { - return _mediaPermissionVideo ; - } - } - - /// - /// Current value of allowed image permission level - /// - public MediaPermissionImage Image - { - get - { - return _mediaPermissionImage ; - } - } - - #endregion Public Properties - - //------------------------------------------------------ - // - // Internal Methods - // - //------------------------------------------------------ - - #region Internal Methods - - internal static void VerifyMediaPermissionAudio(MediaPermissionAudio level) - { - if (level < MediaPermissionAudio.NoAudio || level > MediaPermissionAudio.AllAudio ) - { - throw new ArgumentException(SR.Get(SRID.InvalidPermissionLevel)); - } - } - - internal static void VerifyMediaPermissionVideo(MediaPermissionVideo level) - { - if (level < MediaPermissionVideo.NoVideo || level > MediaPermissionVideo.AllVideo ) - { - throw new ArgumentException(SR.Get(SRID.InvalidPermissionLevel)); - } - } - - internal static void VerifyMediaPermissionImage(MediaPermissionImage level) - { - if (level < MediaPermissionImage.NoImage || level > MediaPermissionImage.AllImage ) - { - throw new ArgumentException(SR.Get(SRID.InvalidPermissionLevel)); - } - } - - - #endregion Internal Methods - - //------------------------------------------------------ - // - // Private Methods - // - //------------------------------------------------------ - - #region Private Methods - - private void InitDefaults() - { - _mediaPermissionAudio = MediaPermissionAudio.SafeAudio; - _mediaPermissionVideo = MediaPermissionVideo.SafeVideo; - _mediaPermissionImage = MediaPermissionImage.SafeImage; - } - - /// - /// Private helper to compare the level of the 3 enum fields. - /// - private bool EqualsLevel( MediaPermissionAudio audioLevel, - MediaPermissionVideo videoLevel, - MediaPermissionImage imageLevel ) - { - return ( ( _mediaPermissionAudio == audioLevel ) && - ( _mediaPermissionVideo == videoLevel ) && - ( _mediaPermissionImage == imageLevel ) ) ; - } - - #endregion Private Methods - - // - // Private fields: - // - - - private MediaPermissionAudio _mediaPermissionAudio ; - private MediaPermissionVideo _mediaPermissionVideo ; - private MediaPermissionImage _mediaPermissionImage ; -} - - - /// - /// Imperative attribute to create a MediaPermission. - /// - [AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Assembly, AllowMultiple = true, Inherited = false )] - sealed public class MediaPermissionAttribute : CodeAccessSecurityAttribute - { - //------------------------------------------------------ - // - // Constructors - // - //------------------------------------------------------ - - #region Constructors - - /// - /// Imperative attribute to create a MediaPermission. - /// - public MediaPermissionAttribute(SecurityAction action) : base(action) - { -} - - #endregion Constructors - - - //------------------------------------------------------ - // - // Public Methods - // - //------------------------------------------------------ - - #region Public Methods - - /// - /// Create a MediaPermisison. - /// - public override IPermission CreatePermission() - { - if (Unrestricted) - { - return new MediaPermission(PermissionState.Unrestricted); - } - - else - { - return new MediaPermission( _mediaPermissionAudio, - _mediaPermissionVideo, - _mediaPermissionImage ); - } - } - - #endregion Public Methods - - //------------------------------------------------------ - // - // Public Properties - // - //------------------------------------------------------ - - #region Public Properties - - /// - /// Current audio level. - /// - public MediaPermissionAudio Audio - { - get - { - return _mediaPermissionAudio ; - } - - set - { - MediaPermission.VerifyMediaPermissionAudio(value); - _mediaPermissionAudio = value; - } - } - - /// - /// Current Video level. - /// - public MediaPermissionVideo Video - { - get - { - return _mediaPermissionVideo ; - } - - set - { - MediaPermission.VerifyMediaPermissionVideo(value); - _mediaPermissionVideo = value; - } - } - - /// - /// Current Image level. - /// - public MediaPermissionImage Image - { - get - { - return _mediaPermissionImage ; - } - - set - { - MediaPermission.VerifyMediaPermissionImage(value); - _mediaPermissionImage = value; - } - } - - #endregion Public Properties - - // - // Private fields: - // - - private MediaPermissionAudio _mediaPermissionAudio ; - private MediaPermissionVideo _mediaPermissionVideo ; - private MediaPermissionImage _mediaPermissionImage ; -} + public MediaPermission() { } + public MediaPermission(PermissionState state) { } + public MediaPermission(MediaPermissionAudio permissionAudio) { } + public MediaPermission(MediaPermissionVideo permissionVideo) { } + public MediaPermission(MediaPermissionImage permissionImage) { } + public MediaPermission(MediaPermissionAudio permissionAudio, + MediaPermissionVideo permissionVideo, + MediaPermissionImage permissionImage) + { } + public bool IsUnrestricted() { return true; } + public override bool IsSubsetOf(IPermission target) { return true; } + public override IPermission Intersect(IPermission target) { return new MediaPermission(); } + public override IPermission Union(IPermission target) { return new MediaPermission(); } + public override IPermission Copy() { return new MediaPermission(); } + public override SecurityElement ToXml() { return default(SecurityElement); } + public override void FromXml(SecurityElement securityElement) { } + public MediaPermissionAudio Audio { get { return MediaPermissionAudio.AllAudio; } } + public MediaPermissionVideo Video { get { return MediaPermissionVideo.AllVideo; } } + public MediaPermissionImage Image { get { return MediaPermissionImage.AllImage; } } + } + [AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Assembly, AllowMultiple = true, Inherited = false)] + sealed public class MediaPermissionAttribute : CodeAccessSecurityAttribute + { + public MediaPermissionAttribute(SecurityAction action) : base(action) { } + public override IPermission CreatePermission() { return new MediaPermission(); } + public MediaPermissionAudio Audio { get { return MediaPermissionAudio.AllAudio; } set { } } + public MediaPermissionVideo Video { get { return MediaPermissionVideo.AllVideo; } set { } } + public MediaPermissionImage Image { get { return MediaPermissionImage.AllImage; } set { } } + } } diff --git a/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Security/Permissions/WebBrowserPermission.cs b/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Security/Permissions/WebBrowserPermission.cs index ccacc1250c1..6cc77c81b20 100644 --- a/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Security/Permissions/WebBrowserPermission.cs +++ b/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Security/Permissions/WebBrowserPermission.cs @@ -1,427 +1,36 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -// -// -// Description: -// The WebBrowserPermission controls the ability to create the WebBrowsercontrol. -// In avalon - this control creates the ability for frames to navigate to html. -// -// -// -// - -using System; -using System.Security; -using System.Security.Permissions; -using System.IO; -using System.Runtime.Serialization; -using System.Collections; -using System.Globalization; -using System.Diagnostics.CodeAnalysis; -using System.Windows; -using MS.Internal.WindowsBase; - -namespace System.Security.Permissions -{ - /// - /// Enum of permission levels. - /// - public enum WebBrowserPermissionLevel - { - /// - /// WebBrowser not allowed - /// - None, - /// - /// Safe. Can create webbrowser with some restrictions. - /// - Safe, - /// - /// Unrestricted. Can create webbrowser with no restrictions. - /// - Unrestricted - } - - /// - /// The WebBrowserPermission controls the ability to create the WebBrowsercontrol. - /// In avalon - this permission grants the ability for frames to navigate to html. - /// The levels for this permission are : - /// None - not able to navigate frames to HTML. - /// Safe - able to navigate frames to HTML safely. This means that - /// there are several mitigations in effect. Namely. - /// Popup mitigation - unable to place an avalon popup over the weboc. - /// SiteLock - the WebOC can only be navigated to site of origin. - /// Url-Action-lockdown - the security settings of the weboc are reduced. - /// Unrestricted - able to navigate the weboc with no restrictions. - /// - [Serializable()] - sealed public class WebBrowserPermission : CodeAccessPermission, IUnrestrictedPermission - { - //------------------------------------------------------ - // - // Constructors - // - //------------------------------------------------------ - - #region Constructors - - /// - /// WebBrowserPermission ctor. - /// - public WebBrowserPermission() - { - _webBrowserPermissionLevel = WebBrowserPermissionLevel.Safe; - } - - /// - /// WebBrowserPermission ctor. - /// - public WebBrowserPermission(PermissionState state) - { - if (state == PermissionState.Unrestricted) - { - _webBrowserPermissionLevel = WebBrowserPermissionLevel.Unrestricted; - } - else if (state == PermissionState.None) - { - _webBrowserPermissionLevel = WebBrowserPermissionLevel.None; - } - else - { - throw new ArgumentException( SR.Get(SRID.InvalidPermissionState) ); - } - } - - /// - /// WebBrowserPermission ctor. - /// - public WebBrowserPermission(WebBrowserPermissionLevel webBrowserPermissionLevel) - { - WebBrowserPermission.VerifyWebBrowserPermissionLevel(webBrowserPermissionLevel); - this._webBrowserPermissionLevel = webBrowserPermissionLevel; - } - - #endregion Constructors - - //------------------------------------------------------ - // - // Public Methods - // - //------------------------------------------------------ - - #region Public Methods - - - // - // IUnrestrictedPermission implementation - // - - /// - /// Is this an unrestricted permisison ? - /// - public bool IsUnrestricted() - { - return _webBrowserPermissionLevel == WebBrowserPermissionLevel.Unrestricted ; - } - - // - // CodeAccessPermission implementation - // - - - /// - /// Is this a subsetOf the target ? - /// - public override bool IsSubsetOf(IPermission target) - { - if (target == null) - { - return _webBrowserPermissionLevel == WebBrowserPermissionLevel.None; - } - - WebBrowserPermission operand = target as WebBrowserPermission ; - if ( operand != null ) - { - return this._webBrowserPermissionLevel <= operand._webBrowserPermissionLevel; - } - else - { - throw new ArgumentException(SR.Get(SRID.TargetNotWebBrowserPermissionLevel)); - } - } - - /// - /// Return the intersection with the target - /// - public override IPermission Intersect(IPermission target) - { - if (target == null) - { - return null; - } - - WebBrowserPermission operand = target as WebBrowserPermission ; - if ( operand != null ) - { - WebBrowserPermissionLevel intersectLevel = _webBrowserPermissionLevel < operand._webBrowserPermissionLevel - ? _webBrowserPermissionLevel : operand._webBrowserPermissionLevel; - - if (intersectLevel == WebBrowserPermissionLevel.None) - { - return null; - } - else - { - return new WebBrowserPermission(intersectLevel); - } - } - else - { - throw new ArgumentException(SR.Get(SRID.TargetNotWebBrowserPermissionLevel)); - } - } - - /// - /// Return the Union with the target - /// - public override IPermission Union(IPermission target) - { - if (target == null) - { - return this.Copy(); - } - - WebBrowserPermission operand = target as WebBrowserPermission ; - if ( operand != null ) - { - WebBrowserPermissionLevel unionLevel = _webBrowserPermissionLevel > operand._webBrowserPermissionLevel ? - - _webBrowserPermissionLevel : operand._webBrowserPermissionLevel; - - if (unionLevel == WebBrowserPermissionLevel.None) - { - return null; - } - else - { - return new WebBrowserPermission(unionLevel); - } - } - else - { - throw new ArgumentException(SR.Get(SRID.TargetNotWebBrowserPermissionLevel)); - } - } - - /// - /// Copy this permission. - /// - public override IPermission Copy() - { - return new WebBrowserPermission(this._webBrowserPermissionLevel); - } - - /// - /// Return an XML instantiation of this permisison. - /// - public override SecurityElement ToXml() - { - SecurityElement securityElement = new SecurityElement("IPermission"); - securityElement.AddAttribute("class", this.GetType().AssemblyQualifiedName); - securityElement.AddAttribute("version", "1"); - - if (IsUnrestricted()) - { - securityElement.AddAttribute("Unrestricted", Boolean.TrueString); - } - else - { - securityElement.AddAttribute("Level", _webBrowserPermissionLevel.ToString()); - } - - return securityElement; - } - - /// - /// Create a permission from XML - /// - public override void FromXml(SecurityElement securityElement) - { - if (securityElement == null) - { - throw new ArgumentNullException("securityElement"); - } - - - String className = securityElement.Attribute("class"); - - if (className == null || className.IndexOf(this.GetType().FullName, StringComparison.Ordinal) == -1) - { - throw new ArgumentNullException("securityElement"); - } - - String unrestricted = securityElement.Attribute("Unrestricted"); - if (unrestricted != null && Boolean.Parse(unrestricted)) - { - _webBrowserPermissionLevel = WebBrowserPermissionLevel.Unrestricted; - return; - } - - this._webBrowserPermissionLevel = WebBrowserPermissionLevel.None; - - String level = securityElement.Attribute("Level"); - - if (level != null) - { - _webBrowserPermissionLevel = (WebBrowserPermissionLevel)Enum.Parse(typeof(WebBrowserPermissionLevel), level); - } - else - { - throw new ArgumentException(SR.Get(SRID.BadXml,"level")); // bad XML - } -} - - - #endregion Public Methods - - - //------------------------------------------------------ - // - // Public Properties - // - //------------------------------------------------------ - - #region Public Properties - - /// - /// Current permission level. - /// - public WebBrowserPermissionLevel Level - { - get - { - return _webBrowserPermissionLevel; - } - set - { - WebBrowserPermission.VerifyWebBrowserPermissionLevel(value); - _webBrowserPermissionLevel = value; - } - } - - #endregion Public Properties - - //------------------------------------------------------ - // - // Private Methods - // - //------------------------------------------------------ - - #region Private Methods - - - internal static void VerifyWebBrowserPermissionLevel(WebBrowserPermissionLevel level) - { - if (level < WebBrowserPermissionLevel.None || level > WebBrowserPermissionLevel.Unrestricted ) - { - throw new ArgumentException(SR.Get(SRID.InvalidPermissionLevel)); - } - } - - - #endregion Private Methods - - // - // Private fields: - // - - private WebBrowserPermissionLevel _webBrowserPermissionLevel; -} - - - /// - /// Imperative attribute to create a WebBrowserPermission. - /// - [AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Assembly, AllowMultiple = true, Inherited = false )] - sealed public class WebBrowserPermissionAttribute : CodeAccessSecurityAttribute - { - //------------------------------------------------------ - // - // Constructors - // - //------------------------------------------------------ - - #region Constructors - - /// - /// Imperative attribute to create a WebBrowserPermission. - /// - public WebBrowserPermissionAttribute(SecurityAction action) : base(action) - { -} - - #endregion Constructors - - - //------------------------------------------------------ - // - // Public Methods - // - //------------------------------------------------------ - - #region Public Methods - - /// - /// Create a WebBrowserPermisison. - /// - public override IPermission CreatePermission() - { - if (Unrestricted) - { - return new WebBrowserPermission(PermissionState.Unrestricted); - } - - else - { - return new WebBrowserPermission(_webBrowserPermissionLevel); - } - } - - #endregion Public Methods - - //------------------------------------------------------ - // - // Public Properties - // - //------------------------------------------------------ - - #region Public Properties - - /// - /// Current permission level. - /// - public WebBrowserPermissionLevel Level - { - get - { - return _webBrowserPermissionLevel; - } - - set - { - WebBrowserPermission.VerifyWebBrowserPermissionLevel(value); - _webBrowserPermissionLevel = value; - } -} - - #endregion Public Properties - - // - // Private fields: - // - - private WebBrowserPermissionLevel _webBrowserPermissionLevel; -} -} +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. +namespace System.Security.Permissions +{ + public enum WebBrowserPermissionLevel + { + None, + Safe, + Unrestricted + } + + [Serializable()] + sealed public class WebBrowserPermission : CodeAccessPermission, IUnrestrictedPermission + { + public WebBrowserPermission() { } + public WebBrowserPermission(PermissionState state) { } + public WebBrowserPermission(WebBrowserPermissionLevel webBrowserPermissionLevel) { } + public bool IsUnrestricted() { return true; } + public override bool IsSubsetOf(IPermission target) { return true; } + public override IPermission Intersect(IPermission target) { return new WebBrowserPermission(); } + public override IPermission Union(IPermission target) { return new WebBrowserPermission(); } + public override IPermission Copy() { return new WebBrowserPermission(); } + public override SecurityElement ToXml() { return default(SecurityElement); } + public override void FromXml(SecurityElement securityElement) { } + public WebBrowserPermissionLevel Level { get { return WebBrowserPermissionLevel.Unrestricted; } set { } } + } + + [AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Assembly, AllowMultiple = true, Inherited = false )] + sealed public class WebBrowserPermissionAttribute : CodeAccessSecurityAttribute + { + public WebBrowserPermissionAttribute(SecurityAction action) : base(action) { } + public override IPermission CreatePermission() { return new WebBrowserPermission(); } + public WebBrowserPermissionLevel Level { get { return WebBrowserPermissionLevel.Unrestricted; } set { } } + } +} diff --git a/src/Microsoft.DotNet.Wpf/test/DRT/DrtXaml/DrtXaml/Tests/LoadPermissionTests.cs b/src/Microsoft.DotNet.Wpf/test/DRT/DrtXaml/DrtXaml/Tests/LoadPermissionTests.cs deleted file mode 100644 index 79ac5b6fb73..00000000000 --- a/src/Microsoft.DotNet.Wpf/test/DRT/DrtXaml/DrtXaml/Tests/LoadPermissionTests.cs +++ /dev/null @@ -1,223 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Collections.Generic; -using System.Reflection; -using System.Security.Permissions; -using System.Xaml; -using System.Xaml.Permissions; -using DRT; -using DrtXaml.XamlTestFramework; - -namespace DrtXaml.Tests -{ - [TestClass] - sealed class LoadPermissionTests : XamlTestSuite - { - public LoadPermissionTests() - : base("LoadPermissionTests") - { - } - - public override DrtTest[] PrepareTests() - { - DrtTest[] tests = DrtTestFinder.FindTests(this); - return tests; - } - - [TestMethod] - public void Unrestricted() - { - VerifyInvariants(s_UnrestrictedPerm, isUnrestricted : true); - - XamlAccessLevel assemblyAccess = XamlAccessLevel.AssemblyAccessTo(typeof(LoadPermissionTests).Assembly); - Assert.IsTrue(s_UnrestrictedPerm.Includes(assemblyAccess)); - } - - [TestMethod] - public void Empty() - { - VerifyInvariants(s_EmptyPerm); - XamlLoadPermission emptyPerm = new XamlLoadPermission(new XamlAccessLevel[0]); - VerifyInvariants(emptyPerm); - Assert.AreEqual(s_EmptyPerm, emptyPerm); - - XamlAccessLevel assemblyAccess = XamlAccessLevel.AssemblyAccessTo(typeof(LoadPermissionTests).Assembly); - Assert.IsFalse(s_EmptyPerm.Includes(assemblyAccess)); - } - - [TestMethod] - public void SingleAssembly() - { - XamlAccessLevel assemblyAccess = XamlAccessLevel.AssemblyAccessTo(typeof(LoadPermissionTests).Assembly); - XamlLoadPermission assemblyPerm = new XamlLoadPermission(assemblyAccess); - VerifyInvariants(assemblyPerm); - - XamlLoadPermission testPerm, intersect, union; - - // Identical permission - XamlAccessLevel sameAssemblyAccess = XamlAccessLevel.AssemblyAccessTo(typeof(LoadPermissionTests).Assembly); - testPerm = new XamlLoadPermission(sameAssemblyAccess); - VerifyInvariants(testPerm); - Assert.AreEqual(assemblyPerm, testPerm); - Assert.IsTrue(testPerm.IsSubsetOf(assemblyPerm)); - Assert.IsTrue(assemblyPerm.IsSubsetOf(testPerm)); - intersect = (XamlLoadPermission)testPerm.Intersect(assemblyPerm); - Assert.AreEqual(assemblyPerm, intersect); - union = (XamlLoadPermission)testPerm.Union(assemblyPerm); - Assert.AreEqual(assemblyPerm, union); - Assert.IsTrue(testPerm.Includes(sameAssemblyAccess)); - - // Type permission to same assembly - XamlAccessLevel typeAccess = XamlAccessLevel.PrivateAccessTo(typeof(LoadPermissionTests)); - testPerm = new XamlLoadPermission(typeAccess); - VerifyInvariants(testPerm); - Assert.AreNotEqual(assemblyPerm, testPerm); - Assert.IsFalse(testPerm.IsSubsetOf(assemblyPerm)); - Assert.IsTrue(assemblyPerm.IsSubsetOf(testPerm)); - intersect = (XamlLoadPermission)testPerm.Intersect(assemblyPerm); - Assert.AreEqual(assemblyPerm, intersect); - union = (XamlLoadPermission)testPerm.Union(assemblyPerm); - Assert.AreEqual(testPerm, union); - Assert.IsTrue(testPerm.Includes(sameAssemblyAccess)); - Assert.IsTrue(testPerm.Includes(typeAccess)); - - // Assembly permission on different assembly - XamlAccessLevel diffAssemblyAccess = XamlAccessLevel.AssemblyAccessTo(typeof(string).Assembly); - testPerm = new XamlLoadPermission(diffAssemblyAccess); - VerifyInvariants(testPerm); - Assert.AreNotEqual(assemblyPerm, testPerm); - Assert.IsFalse(testPerm.IsSubsetOf(assemblyPerm)); - Assert.IsFalse(assemblyPerm.IsSubsetOf(testPerm)); - intersect = (XamlLoadPermission)testPerm.Intersect(assemblyPerm); - Assert.AreEqual(s_EmptyPerm, intersect); - union = (XamlLoadPermission)testPerm.Union(assemblyPerm); - Assert.IsTrue(testPerm.IsSubsetOf(union)); - Assert.IsTrue(assemblyPerm.IsSubsetOf(union)); - Assert.IsFalse(testPerm.Includes(sameAssemblyAccess)); - Assert.IsFalse(testPerm.Includes(typeAccess)); - } - - [TestMethod] - public void SingleType() - { - XamlAccessLevel typeAccess = XamlAccessLevel.PrivateAccessTo(typeof(LoadPermissionTests)); - XamlLoadPermission typePerm = new XamlLoadPermission(typeAccess); - VerifyInvariants(typePerm); - - XamlLoadPermission testPerm, intersect, union; - - // Identical permission - XamlAccessLevel sameTypeAccess = XamlAccessLevel.PrivateAccessTo(typeof(LoadPermissionTests)); - testPerm = new XamlLoadPermission(sameTypeAccess); - VerifyInvariants(testPerm); - Assert.AreEqual(typePerm, testPerm); - Assert.IsTrue(testPerm.IsSubsetOf(typePerm)); - Assert.IsTrue(typePerm.IsSubsetOf(testPerm)); - intersect = (XamlLoadPermission)testPerm.Intersect(typePerm); - Assert.AreEqual(typePerm, intersect); - union = (XamlLoadPermission)testPerm.Union(typePerm); - Assert.AreEqual(typePerm, union); - - // Assembly permission to the same assembly - XamlAccessLevel assemblyAccess = XamlAccessLevel.AssemblyAccessTo(typeof(LoadPermissionTests).Assembly); - testPerm = new XamlLoadPermission(assemblyAccess); - VerifyInvariants(testPerm); - Assert.AreNotEqual(typePerm, testPerm); - Assert.IsTrue(testPerm.IsSubsetOf(typePerm)); - Assert.IsFalse(typePerm.IsSubsetOf(testPerm)); - intersect = (XamlLoadPermission)testPerm.Intersect(typePerm); - Assert.AreEqual(testPerm, intersect); - union = (XamlLoadPermission)testPerm.Union(typePerm); - Assert.AreEqual(typePerm, union); - - // Type permission on different type in same assembly - XamlAccessLevel sameAsmTypeAccess = XamlAccessLevel.PrivateAccessTo(typeof(SchemaTests)); - testPerm = new XamlLoadPermission(sameAsmTypeAccess); - VerifyInvariants(testPerm); - Assert.AreNotEqual(typePerm, testPerm); - Assert.IsFalse(testPerm.IsSubsetOf(typePerm)); - Assert.IsFalse(typePerm.IsSubsetOf(testPerm)); - intersect = (XamlLoadPermission)testPerm.Intersect(typePerm); - XamlLoadPermission assemblyPerm = new XamlLoadPermission(assemblyAccess); - Assert.AreEqual(assemblyPerm, intersect); - union = (XamlLoadPermission)testPerm.Union(typePerm); - Assert.IsTrue(testPerm.IsSubsetOf(union)); - Assert.IsTrue(typePerm.IsSubsetOf(union)); - Assert.IsTrue(assemblyPerm.IsSubsetOf(union)); - - // Type permission in different assembly - XamlAccessLevel diffTypeAccess = XamlAccessLevel.PrivateAccessTo(typeof(string)); - testPerm = new XamlLoadPermission(diffTypeAccess); - VerifyInvariants(testPerm); - Assert.AreNotEqual(typePerm, testPerm); - Assert.IsFalse(testPerm.IsSubsetOf(typePerm)); - Assert.IsFalse(typePerm.IsSubsetOf(testPerm)); - intersect = (XamlLoadPermission)testPerm.Intersect(typePerm); - Assert.AreEqual(s_EmptyPerm, intersect); - union = (XamlLoadPermission)testPerm.Union(typePerm); - Assert.IsTrue(testPerm.IsSubsetOf(union)); - Assert.IsTrue(typePerm.IsSubsetOf(union)); - } - - [TestMethod] - public void AccessLevelCtorsPositive() - { - XamlAccessLevel byRef = XamlAccessLevel.AssemblyAccessTo(typeof(LoadPermissionTests).Assembly); - XamlAccessLevel byName = XamlAccessLevel.AssemblyAccessTo(typeof(LoadPermissionTests).Assembly.GetName()); - Assert.AreEqual(new XamlLoadPermission(byRef), new XamlLoadPermission(byName)); - - byRef = XamlAccessLevel.PrivateAccessTo(typeof(LoadPermissionTests)); - byName = XamlAccessLevel.PrivateAccessTo(typeof(LoadPermissionTests).AssemblyQualifiedName); - Assert.AreEqual(new XamlLoadPermission(byRef), new XamlLoadPermission(byName)); - } - - [TestMethod, TestExpectedException(typeof(ArgumentException))] - public void AccessLevelCtorUnqualifiedAssemblyName() - { - XamlAccessLevel.AssemblyAccessTo(new AssemblyName("DRTXaml")); - } - - [TestMethod, TestExpectedException(typeof(ArgumentException))] - public void AccessLevelCtorUnqualifiedTypeName() - { - XamlAccessLevel.PrivateAccessTo(typeof(LoadPermissionTests).FullName); - } - - private void VerifyInvariants(XamlLoadPermission original, bool isUnrestricted = false) - { - Assert.AreEqual(original, original); - Assert.AreEqual(isUnrestricted, original.IsUnrestricted()); - - XamlLoadPermission copy = (XamlLoadPermission)original.Copy(); - Assert.AreEqual(original, copy); - Assert.AreEqual(original.IsUnrestricted(), copy.IsUnrestricted()); - Assert.IsTrue(original.IsSubsetOf(copy)); - Assert.IsTrue(copy.IsSubsetOf(original)); - - XamlLoadPermission xmlCopy = new XamlLoadPermission(PermissionState.None); - xmlCopy.FromXml(original.ToXml()); - Assert.AreEqual(original, xmlCopy); - - var intersect = (XamlLoadPermission)original.Intersect(copy); - Assert.AreEqual(original, intersect); - var union = (XamlLoadPermission)original.Union(copy); - Assert.AreEqual(original, union); - - intersect = (XamlLoadPermission)original.Intersect(s_EmptyPerm); - Assert.AreEqual(s_EmptyPerm, intersect); - union = (XamlLoadPermission)original.Union(s_EmptyPerm); - Assert.AreEqual(original, union); - - intersect = (XamlLoadPermission)original.Intersect(s_UnrestrictedPerm); - Assert.AreEqual(original, intersect); - union = (XamlLoadPermission)original.Union(s_UnrestrictedPerm); - Assert.AreEqual(s_UnrestrictedPerm, union); - } - - static XamlLoadPermission s_EmptyPerm = new XamlLoadPermission(PermissionState.None); - static XamlLoadPermission s_UnrestrictedPerm = new XamlLoadPermission(PermissionState.Unrestricted); - } -}