You've already forked linux-packaging-mono
208 lines
7.2 KiB
C#
208 lines
7.2 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="DnsPermission.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//------------------------------------------------------------------------------
|
|
|
|
namespace System.Net {
|
|
|
|
using System.Security;
|
|
using System.Security.Permissions;
|
|
using System.Globalization;
|
|
|
|
//NOTE: While DnsPermissionAttribute resides in System.DLL,
|
|
// no classes from that DLL are able to make declarative usage of DnsPermission.
|
|
|
|
[ AttributeUsage( AttributeTargets.Method | AttributeTargets.Constructor |
|
|
AttributeTargets.Class | AttributeTargets.Struct |
|
|
AttributeTargets.Assembly,
|
|
AllowMultiple = true, Inherited = false )]
|
|
|
|
[Serializable()] sealed public class DnsPermissionAttribute : CodeAccessSecurityAttribute
|
|
{
|
|
public DnsPermissionAttribute ( SecurityAction action ): base( action )
|
|
{
|
|
}
|
|
|
|
public override IPermission CreatePermission()
|
|
{
|
|
if (Unrestricted) {
|
|
return new DnsPermission( PermissionState.Unrestricted);
|
|
}
|
|
else {
|
|
return new DnsPermission( PermissionState.None);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/// <devdoc>
|
|
/// <para>
|
|
/// </para>
|
|
/// </devdoc>
|
|
[Serializable]
|
|
public sealed class DnsPermission : CodeAccessPermission, IUnrestrictedPermission {
|
|
|
|
private bool m_noRestriction;
|
|
|
|
/// <devdoc>
|
|
/// <para>
|
|
/// Creates a new instance of the <see cref='System.Net.DnsPermission'/>
|
|
/// class that passes all demands or that fails all demands.
|
|
/// </para>
|
|
/// </devdoc>
|
|
public DnsPermission(PermissionState state) {
|
|
m_noRestriction = (state==PermissionState.Unrestricted);
|
|
}
|
|
|
|
internal DnsPermission(bool free) {
|
|
m_noRestriction = free;
|
|
}
|
|
|
|
// IUnrestrictedPermission interface methods
|
|
/// <devdoc>
|
|
/// <para>
|
|
/// Checks the overall permission state of the object.
|
|
/// </para>
|
|
/// </devdoc>
|
|
public bool IsUnrestricted() {
|
|
return m_noRestriction;
|
|
}
|
|
|
|
// IPermission interface methods
|
|
/// <devdoc>
|
|
/// <para>
|
|
/// Creates a copy of a <see cref='System.Net.DnsPermission'/> instance.
|
|
/// </para>
|
|
/// </devdoc>
|
|
public override IPermission Copy () {
|
|
return new DnsPermission(m_noRestriction);
|
|
}
|
|
|
|
/// <devdoc>
|
|
/// <para>Returns the logical union between two <see cref='System.Net.DnsPermission'/> instances.</para>
|
|
/// </devdoc>
|
|
public override IPermission Union(IPermission target) {
|
|
// Pattern suggested by Security engine
|
|
if (target==null) {
|
|
return this.Copy();
|
|
}
|
|
DnsPermission other = target as DnsPermission;
|
|
if(other == null) {
|
|
throw new ArgumentException(SR.GetString(SR.net_perm_target), "target");
|
|
}
|
|
return new DnsPermission(m_noRestriction || other.m_noRestriction);
|
|
}
|
|
|
|
/// <devdoc>
|
|
/// <para>Returns the logical intersection between two <see cref='System.Net.DnsPermission'/> instances.</para>
|
|
/// </devdoc>
|
|
public override IPermission Intersect(IPermission target) {
|
|
// Pattern suggested by Security engine
|
|
if (target==null) {
|
|
return null;
|
|
}
|
|
DnsPermission other = target as DnsPermission;
|
|
if(other == null) {
|
|
throw new ArgumentException(SR.GetString(SR.net_perm_target), "target");
|
|
}
|
|
|
|
// return null if resulting permission is restricted and empty
|
|
// Hence, the only way for a bool permission will be.
|
|
if (this.m_noRestriction && other.m_noRestriction) {
|
|
return new DnsPermission(true);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
|
|
/// <devdoc>
|
|
/// <para>Compares two <see cref='System.Net.DnsPermission'/> instances.</para>
|
|
/// </devdoc>
|
|
public override bool IsSubsetOf(IPermission target) {
|
|
// Pattern suggested by Security engine
|
|
if (target == null) {
|
|
return m_noRestriction == false;
|
|
}
|
|
DnsPermission other = target as DnsPermission;
|
|
if (other == null) {
|
|
throw new ArgumentException(SR.GetString(SR.net_perm_target), "target");
|
|
}
|
|
//Here is the matrix of result based on m_noRestriction for me and she
|
|
// me.noRestriction she.noRestriction me.isSubsetOf(she)
|
|
// 0 0 1
|
|
// 0 1 1
|
|
// 1 0 0
|
|
// 1 1 1
|
|
return (!m_noRestriction || other.m_noRestriction);
|
|
}
|
|
|
|
/// <devdoc>
|
|
/// </devdoc>
|
|
public override void FromXml(SecurityElement securityElement) {
|
|
|
|
if (securityElement == null)
|
|
{
|
|
//
|
|
// null SecurityElement
|
|
//
|
|
|
|
throw new ArgumentNullException("securityElement");
|
|
}
|
|
|
|
if (!securityElement.Tag.Equals("IPermission"))
|
|
{
|
|
//
|
|
// SecurityElement must be a permission element
|
|
//
|
|
|
|
throw new ArgumentException(SR.GetString(SR.net_no_classname), "securityElement");
|
|
}
|
|
|
|
string className = securityElement.Attribute( "class" );
|
|
|
|
if (className == null)
|
|
{
|
|
//
|
|
// SecurityElement must be a permission element for this type
|
|
//
|
|
|
|
throw new ArgumentException(SR.GetString(SR.net_no_classname), "securityElement");
|
|
}
|
|
|
|
|
|
if (className.IndexOf( this.GetType().FullName ) < 0)
|
|
{
|
|
//
|
|
// SecurityElement must be a permission element for this type
|
|
//
|
|
|
|
throw new ArgumentException(SR.GetString(SR.net_no_typename), "securityElement");
|
|
}
|
|
|
|
string str = securityElement.Attribute( "Unrestricted" );
|
|
m_noRestriction = (str!=null?(0 == string.Compare( str, "true", StringComparison.OrdinalIgnoreCase)):false);
|
|
}
|
|
|
|
/// <devdoc>
|
|
/// <para>[To be supplied.]</para>
|
|
/// </devdoc>
|
|
public override SecurityElement ToXml() {
|
|
|
|
SecurityElement securityElement = new SecurityElement( "IPermission" );
|
|
|
|
securityElement.AddAttribute( "class", this.GetType().FullName + ", " + this.GetType().Module.Assembly.FullName.Replace( '\"', '\'' ) );
|
|
securityElement.AddAttribute( "version", "1" );
|
|
|
|
if (m_noRestriction) {
|
|
securityElement.AddAttribute( "Unrestricted", "true" );
|
|
}
|
|
|
|
return securityElement;
|
|
}
|
|
|
|
} // class DnsPermission
|
|
|
|
|
|
} // namespace System.Net
|