From 79964a228fbd4d33d53363fee577bf96cfbc2982 Mon Sep 17 00:00:00 2001 From: Dilip Ojha Date: Tue, 4 Jun 2019 14:20:40 -0700 Subject: [PATCH 01/10] hollowed out public types --- .../Xaml/Permissions/XamlAccessLevel.cs | 141 +--- .../Xaml/Permissions/XamlLoadPermission.cs | 332 +-------- .../Security/Permissions/MediaPermission.cs | 687 +----------------- .../Permissions/WebBrowserPermission.cs | 429 +---------- 4 files changed, 67 insertions(+), 1522 deletions(-) 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..48b49dfe102 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,144 +7,15 @@ 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 { - private XamlAccessLevel(string assemblyName, string typeName) - { - AssemblyNameString = assemblyName; - PrivateAccessToTypeName = 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); } - } - + private XamlAccessLevel(string assemblyName, string typeName) { } + public static XamlAccessLevel AssemblyAccessTo(Assembly assembly) { return default(XamlAccessLevel); } + public static XamlAccessLevel AssemblyAccessTo(AssemblyName assemblyName) { return default(XamlAccessLevel); } + public static XamlAccessLevel PrivateAccessTo(Type type) { return default(XamlAccessLevel); } + public static XamlAccessLevel PrivateAccessTo(string assemblyQualifiedTypeName) { return default(XamlAccessLevel); } + public AssemblyName AssemblyAccessToAssemblyName { get; set; } 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..9f852ca347d 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 @@ -3,8 +3,6 @@ // See the LICENSE file in the project root for more information. using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Diagnostics; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; @@ -14,327 +12,23 @@ 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); - } - + public XamlLoadPermission(PermissionState state) { } + public XamlLoadPermission(XamlAccessLevel allowedAccess) { } + public XamlLoadPermission(IEnumerable allowedAccess) { } #if NETCOREAPP3_0 - [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(); - } - + public override int GetHashCode() { 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 IPermission Copy() { return default(IPermission); } + public override void FromXml(SecurityElement elem) { } + public bool Includes(XamlAccessLevel requestedAccess) { return false; } + public override IPermission Intersect(IPermission target) { return default(IPermission); } + public override bool IsSubsetOf(IPermission target) { return false; } + public override SecurityElement ToXml() { return default(SecurityElement); } + public override IPermission Union(IPermission other) { return default(IPermission); } + public bool IsUnrestricted() { return false; } } - } 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..505e5a7530f 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,58 @@ // 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 { - /// - /// 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. - /// 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. - /// 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 { - //------------------------------------------------------ - // - // 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() { } + public MediaPermission(PermissionState state) { } + public MediaPermission(MediaPermissionAudio permissionAudio ) { } + public MediaPermission(MediaPermissionVideo permissionVideo ) { } + public MediaPermission(MediaPermissionImage permissionImage ) { } 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. - /// + MediaPermissionVideo permissionVideo, + MediaPermissionImage permissionImage ) { } + public bool IsUnrestricted() { return false; } + public override bool IsSubsetOf(IPermission target) { return false; } + public override IPermission Intersect(IPermission target) { return default(IPermission); } + public override IPermission Union(IPermission target) { return default(IPermission); } + public override IPermission Copy() { return default(IPermission); } + public override SecurityElement ToXml() { return default(SecurityElement); } + public override void FromXml(SecurityElement securityElement) { } + public MediaPermissionAudio Audio { get; } + public MediaPermissionVideo Video { get; } + public MediaPermissionImage Image { get; } + } [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 MediaPermissionAttribute(SecurityAction action) : base(action) { } + public override IPermission CreatePermission() { return default(IPermission); } + public MediaPermissionAudio Audio { get; set; } + public MediaPermissionVideo Video { get; set; } + public MediaPermissionImage Image { get; 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..e9327f6e4d7 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 + 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"); + public WebBrowserPermission() { } + public WebBrowserPermission(PermissionState state) { } + public WebBrowserPermission(WebBrowserPermissionLevel webBrowserPermissionLevel) { } + public bool IsUnrestricted() { return false; } + public override bool IsSubsetOf(IPermission target) { return false; } + public override IPermission Intersect(IPermission target) { return default(IPermission); } + public override IPermission Union(IPermission target) { return default(IPermission); } + public override IPermission Copy() { return default(IPermission); } + public override SecurityElement ToXml() { return default(SecurityElement); } + public override void FromXml(SecurityElement securityElement) { } + public WebBrowserPermissionLevel Level { get; set; } + } - 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; -} + { + public WebBrowserPermissionAttribute(SecurityAction action) : base(action) { } + public override IPermission CreatePermission() { return default(IPermission); } + public WebBrowserPermissionLevel Level { get; set; } + } } From 36702df3ab787ff6cfa9342d53f28fe54ce12594 Mon Sep 17 00:00:00 2001 From: Dilip Ojha Date: Thu, 6 Jun 2019 14:32:59 -0700 Subject: [PATCH 02/10] addressed comments --- .../System/Xaml/Permissions/XamlAccessLevel.cs | 2 +- .../System/Xaml/Permissions/XamlLoadPermission.cs | 15 +++++++++++++-- .../Security/Permissions/MediaPermission.cs | 2 +- .../Security/Permissions/WebBrowserPermission.cs | 2 +- 4 files changed, 16 insertions(+), 5 deletions(-) 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 48b49dfe102..807f1ba071f 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 @@ -15,7 +15,7 @@ private XamlAccessLevel(string assemblyName, string typeName) { } public static XamlAccessLevel AssemblyAccessTo(AssemblyName assemblyName) { return default(XamlAccessLevel); } public static XamlAccessLevel PrivateAccessTo(Type type) { return default(XamlAccessLevel); } public static XamlAccessLevel PrivateAccessTo(string assemblyQualifiedTypeName) { return default(XamlAccessLevel); } - public AssemblyName AssemblyAccessToAssemblyName { get; set; } + public AssemblyName AssemblyAccessToAssemblyName { get { return new AssemblyName(); } } public string PrivateAccessToTypeName { get; private set; } } } 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 9f852ca347d..384b2280e75 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 @@ -3,6 +3,7 @@ // See the LICENSE file in the project root for more information. using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; @@ -12,6 +13,7 @@ namespace System.Xaml.Permissions [Serializable] public sealed class XamlLoadPermission : CodeAccessPermission, IUnrestrictedPermission { + private IList _emptyAccessLevel = new ReadOnlyCollection(Array.Empty()); public XamlLoadPermission(PermissionState state) { } public XamlLoadPermission(XamlAccessLevel allowedAccess) { } public XamlLoadPermission(IEnumerable allowedAccess) { } @@ -21,7 +23,16 @@ public XamlLoadPermission(IEnumerable allowedAccess) { } [ComVisible(false)] public override int GetHashCode() { return base.GetHashCode(); } #endif - public IList AllowedAccess { get; private set; } // ReadOnlyCollection + public IList AllowedAccess + { + get + { + return _emptyAccessLevel; + } + private set + { + } + } public override IPermission Copy() { return default(IPermission); } public override void FromXml(SecurityElement elem) { } public bool Includes(XamlAccessLevel requestedAccess) { return false; } @@ -29,6 +40,6 @@ public override void FromXml(SecurityElement elem) { } public override bool IsSubsetOf(IPermission target) { return false; } public override SecurityElement ToXml() { return default(SecurityElement); } public override IPermission Union(IPermission other) { return default(IPermission); } - public bool IsUnrestricted() { return false; } + 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 505e5a7530f..650a2f3a5f6 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 @@ -35,7 +35,7 @@ public MediaPermission(MediaPermissionImage permissionImage ) { } public MediaPermission(MediaPermissionAudio permissionAudio, MediaPermissionVideo permissionVideo, MediaPermissionImage permissionImage ) { } - public bool IsUnrestricted() { return false; } + public bool IsUnrestricted() { return true; } public override bool IsSubsetOf(IPermission target) { return false; } public override IPermission Intersect(IPermission target) { return default(IPermission); } public override IPermission Union(IPermission target) { return default(IPermission); } 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 e9327f6e4d7..a3b6f977db9 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 @@ -16,7 +16,7 @@ sealed public class WebBrowserPermission : CodeAccessPermission, IUnrestrictedPe public WebBrowserPermission() { } public WebBrowserPermission(PermissionState state) { } public WebBrowserPermission(WebBrowserPermissionLevel webBrowserPermissionLevel) { } - public bool IsUnrestricted() { return false; } + public bool IsUnrestricted() { return true; } public override bool IsSubsetOf(IPermission target) { return false; } public override IPermission Intersect(IPermission target) { return default(IPermission); } public override IPermission Union(IPermission target) { return default(IPermission); } From 7423e9941daec2dcc7b2f5c35bf427e8e2ced784 Mon Sep 17 00:00:00 2001 From: Dilip Ojha Date: Fri, 7 Jun 2019 18:58:21 -0700 Subject: [PATCH 03/10] fixed tests --- .../Xaml/Permissions/XamlAccessLevel.cs | 171 ++++++++++++-- .../DrtXaml/Tests/LoadPermissionTests.cs | 223 ------------------ 2 files changed, 150 insertions(+), 244 deletions(-) delete mode 100644 src/Microsoft.DotNet.Wpf/test/DRT/DrtXaml/DrtXaml/Tests/LoadPermissionTests.cs 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 807f1ba071f..d3fb1a71108 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 @@ -1,21 +1,150 @@ -// 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.Reflection; -using System.Security; - -namespace System.Xaml.Permissions -{ - [Serializable] - public class XamlAccessLevel - { - private XamlAccessLevel(string assemblyName, string typeName) { } - public static XamlAccessLevel AssemblyAccessTo(Assembly assembly) { return default(XamlAccessLevel); } - public static XamlAccessLevel AssemblyAccessTo(AssemblyName assemblyName) { return default(XamlAccessLevel); } - public static XamlAccessLevel PrivateAccessTo(Type type) { return default(XamlAccessLevel); } - public static XamlAccessLevel PrivateAccessTo(string assemblyQualifiedTypeName) { return default(XamlAccessLevel); } - public AssemblyName AssemblyAccessToAssemblyName { get { return new AssemblyName(); } } - public string PrivateAccessToTypeName { get; private set; } - } -} +// 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.Reflection; +using System.Security; + +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 + { + private XamlAccessLevel(string assemblyName, string typeName) + { + AssemblyNameString = assemblyName; + PrivateAccessToTypeName = 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); } + } + + 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/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); - } -} From 8d2d94b7d4f93d883802cfb043f19008e9532e1b Mon Sep 17 00:00:00 2001 From: Dilip Ojha Date: Fri, 7 Jun 2019 19:42:49 -0700 Subject: [PATCH 04/10] fixed formatting --- .../Xaml/Permissions/XamlAccessLevel.cs | 300 +++++++++--------- 1 file changed, 150 insertions(+), 150 deletions(-) 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 d3fb1a71108..32f5f5d5943 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 @@ -1,150 +1,150 @@ -// 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.Reflection; -using System.Security; - -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 - { - private XamlAccessLevel(string assemblyName, string typeName) - { - AssemblyNameString = assemblyName; - PrivateAccessToTypeName = 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); } - } - - 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"; - } - } -} +// 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.Reflection; +using System.Security; + +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 + { + private XamlAccessLevel(string assemblyName, string typeName) + { + AssemblyNameString = assemblyName; + PrivateAccessToTypeName = 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); } + } + + 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"; + } + } +} From 1d17e12848fb96a0ea16941d20e3c5f818073ed9 Mon Sep 17 00:00:00 2001 From: Dilip Ojha Date: Mon, 10 Jun 2019 08:48:57 -0700 Subject: [PATCH 05/10] removed SR dependency from XamlAccessLevel --- .../System/Xaml/Permissions/XamlAccessLevel.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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..c96a2dd677d 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 @@ -58,7 +58,7 @@ public static XamlAccessLevel PrivateAccessTo(string assemblyQualifiedTypeName) int nameBoundary = assemblyQualifiedTypeName.IndexOf(','); if (nameBoundary < 0) { - throw new ArgumentException(SR.Get(SRID.ExpectedQualifiedTypeName, assemblyQualifiedTypeName), nameof(assemblyQualifiedTypeName)); + throw new ArgumentException("", nameof(assemblyQualifiedTypeName)); } string typeName = assemblyQualifiedTypeName.Substring(0, nameBoundary).Trim(); @@ -94,13 +94,13 @@ internal static XamlAccessLevel FromXml(SecurityElement elem) { if (elem.Tag != XmlConstants.XamlAccessLevel) { - throw new ArgumentException(SR.Get(SRID.SecurityXmlUnexpectedTag, elem.Tag, XmlConstants.XamlAccessLevel), nameof(elem)); + throw new ArgumentException("", nameof(elem)); } string assemblyNameString = elem.Attribute(XmlConstants.AssemblyName); if (assemblyNameString == null) { - throw new ArgumentException(SR.Get(SRID.SecurityXmlMissingAttribute, XmlConstants.AssemblyName), nameof(elem)); + throw new ArgumentException("", nameof(elem)); } AssemblyName assemblyName = new AssemblyName(assemblyNameString); ValidateAssemblyName(assemblyName, "elem"); @@ -136,7 +136,7 @@ private static void ValidateAssemblyName(AssemblyName assemblyName, string argNa if (assemblyName.Name == null || assemblyName.Version == null || assemblyName.CultureInfo == null || assemblyName.GetPublicKeyToken() == null) { - throw new ArgumentException(SR.Get(SRID.ExpectedQualifiedAssemblyName, assemblyName.FullName), argName); + throw new ArgumentException("", argName); } } From a6a6701e49de602924a5f937ee1e9dbbde7fdd48 Mon Sep 17 00:00:00 2001 From: Dilip Ojha Date: Mon, 10 Jun 2019 16:05:10 -0700 Subject: [PATCH 06/10] stripped XamlAccessLevel of CAS functionality --- .../Xaml/Permissions/XamlAccessLevel.cs | 104 +----------------- 1 file changed, 2 insertions(+), 102 deletions(-) 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 c96a2dd677d..81e5eb6b41a 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,74 +7,36 @@ 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 { private XamlAccessLevel(string assemblyName, string typeName) { AssemblyNameString = assemblyName; - PrivateAccessToTypeName = 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); + return new XamlAccessLevel(type.Assembly.FullName, null); } public static XamlAccessLevel PrivateAccessTo(string assemblyQualifiedTypeName) { - if (assemblyQualifiedTypeName == null) - { - throw new ArgumentNullException(nameof(assemblyQualifiedTypeName)); - } int nameBoundary = assemblyQualifiedTypeName.IndexOf(','); - if (nameBoundary < 0) - { - throw new ArgumentException("", 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); + return new XamlAccessLevel(assemblyName.FullName, null); } - - // 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 { @@ -84,67 +46,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("", nameof(elem)); - } - - string assemblyNameString = elem.Attribute(XmlConstants.AssemblyName); - if (assemblyNameString == null) - { - throw new ArgumentException("", 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("", argName); - } - } - - private static class XmlConstants - { - public const string XamlAccessLevel = "XamlAccessLevel"; - public const string AssemblyName = "AssemblyName"; - public const string TypeName = "TypeName"; - } } } From 37fb7822b8d485dd81a0a4ced4f85689dbc0db8f Mon Sep 17 00:00:00 2001 From: Dilip Ojha Date: Tue, 11 Jun 2019 14:50:26 -0700 Subject: [PATCH 07/10] changes to hollow permissions --- .../Xaml/Permissions/XamlLoadPermission.cs | 22 +++++-------------- .../Security/Permissions/MediaPermission.cs | 8 +++---- .../Permissions/WebBrowserPermission.cs | 8 +++---- 3 files changed, 14 insertions(+), 24 deletions(-) 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 384b2280e75..d2d0a173359 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 @@ -13,7 +13,6 @@ namespace System.Xaml.Permissions [Serializable] public sealed class XamlLoadPermission : CodeAccessPermission, IUnrestrictedPermission { - private IList _emptyAccessLevel = new ReadOnlyCollection(Array.Empty()); public XamlLoadPermission(PermissionState state) { } public XamlLoadPermission(XamlAccessLevel allowedAccess) { } public XamlLoadPermission(IEnumerable allowedAccess) { } @@ -23,23 +22,14 @@ public XamlLoadPermission(IEnumerable allowedAccess) { } [ComVisible(false)] public override int GetHashCode() { return base.GetHashCode(); } #endif - public IList AllowedAccess - { - get - { - return _emptyAccessLevel; - } - private set - { - } - } - public override IPermission Copy() { return default(IPermission); } + public IList AllowedAccess {get; private set;} = new ReadOnlyCollection(Array.Empty()); + public override IPermission Copy() { return new XamlLoadPermission(new PermissionState()); } public override void FromXml(SecurityElement elem) { } - public bool Includes(XamlAccessLevel requestedAccess) { return false; } - public override IPermission Intersect(IPermission target) { return default(IPermission); } - public override bool IsSubsetOf(IPermission target) { return false; } + public bool Includes(XamlAccessLevel requestedAccess) { return true; } + public override IPermission Intersect(IPermission target) { return new XamlLoadPermission(new PermissionState()); } + public override bool IsSubsetOf(IPermission target) { return true; } public override SecurityElement ToXml() { return default(SecurityElement); } - public override IPermission Union(IPermission other) { return default(IPermission); } + public override IPermission Union(IPermission other) { return new XamlLoadPermission(new PermissionState()); } 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 650a2f3a5f6..e260f19c637 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 @@ -36,10 +36,10 @@ public MediaPermission(MediaPermissionAudio permissionAudio, MediaPermissionVideo permissionVideo, MediaPermissionImage permissionImage ) { } public bool IsUnrestricted() { return true; } - public override bool IsSubsetOf(IPermission target) { return false; } - public override IPermission Intersect(IPermission target) { return default(IPermission); } - public override IPermission Union(IPermission target) { return default(IPermission); } - public override IPermission Copy() { return default(IPermission); } + 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; } 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 a3b6f977db9..fd6e31e8d73 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 @@ -17,10 +17,10 @@ public WebBrowserPermission() { } public WebBrowserPermission(PermissionState state) { } public WebBrowserPermission(WebBrowserPermissionLevel webBrowserPermissionLevel) { } public bool IsUnrestricted() { return true; } - public override bool IsSubsetOf(IPermission target) { return false; } - public override IPermission Intersect(IPermission target) { return default(IPermission); } - public override IPermission Union(IPermission target) { return default(IPermission); } - public override IPermission Copy() { return default(IPermission); } + 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; set; } From e098bc34e089b8fbde8799d9c86517105ddf0dc5 Mon Sep 17 00:00:00 2001 From: Dilip Ojha Date: Wed, 12 Jun 2019 10:53:00 -0700 Subject: [PATCH 08/10] minor change --- .../System/Xaml/Permissions/XamlLoadPermission.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 d2d0a173359..e7a1ca617b2 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 @@ -23,13 +23,13 @@ public XamlLoadPermission(IEnumerable allowedAccess) { } public override int GetHashCode() { return base.GetHashCode(); } #endif public IList AllowedAccess {get; private set;} = new ReadOnlyCollection(Array.Empty()); - public override IPermission Copy() { return new XamlLoadPermission(new PermissionState()); } + 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(new PermissionState()); } + 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(new PermissionState()); } + public override IPermission Union(IPermission other) { return new XamlLoadPermission(PermissionState.Unrestricted); } public bool IsUnrestricted() { return true; } } } From 1ce15d8108fca7e48bfe4e7b81e7da409110298c Mon Sep 17 00:00:00 2001 From: Dilip Ojha Date: Wed, 12 Jun 2019 15:29:13 -0700 Subject: [PATCH 09/10] updated implementation --- .../Xaml/Permissions/XamlAccessLevel.cs | 10 +-- .../Xaml/Permissions/XamlLoadPermission.cs | 6 -- .../Security/Permissions/MediaPermission.cs | 49 ++++++------- .../Permissions/WebBrowserPermission.cs | 70 +++++++++---------- 4 files changed, 66 insertions(+), 69 deletions(-) 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 81e5eb6b41a..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 @@ -13,6 +13,7 @@ public class XamlAccessLevel private XamlAccessLevel(string assemblyName, string typeName) { AssemblyNameString = assemblyName; + PrivateAccessToTypeName = typeName; } public static XamlAccessLevel AssemblyAccessTo(Assembly assembly) @@ -27,17 +28,18 @@ public static XamlAccessLevel AssemblyAccessTo(AssemblyName assemblyName) public static XamlAccessLevel PrivateAccessTo(Type type) { - return new XamlAccessLevel(type.Assembly.FullName, null); + return new XamlAccessLevel(type.Assembly.FullName, type.FullName); } public static XamlAccessLevel PrivateAccessTo(string assemblyQualifiedTypeName) { int nameBoundary = assemblyQualifiedTypeName.IndexOf(','); + string typeName = assemblyQualifiedTypeName.Substring(0, nameBoundary).Trim(); string assemblyFullName = assemblyQualifiedTypeName.Substring(nameBoundary + 1).Trim(); AssemblyName assemblyName = new AssemblyName(assemblyFullName); - return new XamlAccessLevel(assemblyName.FullName, null); - } - + return new XamlAccessLevel(assemblyName.FullName, typeName); + } + public AssemblyName AssemblyAccessToAssemblyName { get { return new AssemblyName(AssemblyNameString); } 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 e7a1ca617b2..3b591ddf761 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 @@ -16,12 +16,6 @@ public sealed class XamlLoadPermission : CodeAccessPermission, IUnrestrictedPerm public XamlLoadPermission(PermissionState state) { } public XamlLoadPermission(XamlAccessLevel allowedAccess) { } public XamlLoadPermission(IEnumerable allowedAccess) { } -#if NETCOREAPP3_0 - [ComVisible(false)] - public override bool Equals(object obj) { return false; } - [ComVisible(false)] - public override int GetHashCode() { return base.GetHashCode(); } -#endif 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) { } 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 e260f19c637..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,7 +1,7 @@ // 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 +namespace System.Security.Permissions { public enum MediaPermissionAudio { @@ -13,46 +13,47 @@ public enum MediaPermissionAudio public enum MediaPermissionVideo { NoVideo, - SiteOfOriginVideo, + SiteOfOriginVideo, SafeVideo, AllVideo, } public enum MediaPermissionImage { NoImage, - SiteOfOriginImage, + SiteOfOriginImage, SafeImage, AllImage, - } + } [Serializable()] - sealed public class MediaPermission : CodeAccessPermission, IUnrestrictedPermission + sealed public class MediaPermission : CodeAccessPermission, IUnrestrictedPermission { - 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 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 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; } - public MediaPermissionVideo Video { get; } - public MediaPermissionImage Image { get; } + 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 - { + [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 default(IPermission); } - public MediaPermissionAudio Audio { get; set; } - public MediaPermissionVideo Video { get; set; } - public MediaPermissionImage Image { get; set; } + 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 fd6e31e8d73..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,36 +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. -namespace System.Security.Permissions -{ +// 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; 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 default(IPermission); } - public WebBrowserPermissionLevel Level { get; set; } - } -} + { + 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 { } } + } +} From b52083a11143b5ff6d26f6b0fd0ebb096789c68b Mon Sep 17 00:00:00 2001 From: Dilip Ojha Date: Wed, 12 Jun 2019 16:15:45 -0700 Subject: [PATCH 10/10] addressed comment --- .../System.Xaml/System/Xaml/Permissions/XamlLoadPermission.cs | 4 ++++ 1 file changed, 4 insertions(+) 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 3b591ddf761..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 @@ -16,6 +16,10 @@ public sealed class XamlLoadPermission : CodeAccessPermission, IUnrestrictedPerm public XamlLoadPermission(PermissionState state) { } public XamlLoadPermission(XamlAccessLevel allowedAccess) { } public XamlLoadPermission(IEnumerable allowedAccess) { } + [ComVisible(false)] + public override bool Equals(object obj) { return false; } + [ComVisible(false)] + 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) { }