File: net\System\Net\mail\smtppermission.cs
Project: ndp\fx\src\System.csproj (System)
//------------------------------------------------------------------------------
// <copyright file="SmtpPermission.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
 
namespace System.Net.Mail {
 
    using System.Collections;
    using System.Security;
    using System.Security.Permissions;
    using System.Globalization;
    using System.Threading;
 
    /// <include file='doc\SmtpPermission.uex' path='docs/doc[@for="SmtpPermissionFlag"]/*' />
    public enum SmtpAccess { None = 0, Connect = 1, ConnectToUnrestrictedPort = 2};
 
 
    /// <include file='doc\SmtpPermission.uex' path='docs/doc[@for="SmtpPermissionAttribute"]/*' />
    [   AttributeUsage( AttributeTargets.Method | AttributeTargets.Constructor |
                        AttributeTargets.Class  | AttributeTargets.Struct      |
                        AttributeTargets.Assembly,
                        AllowMultiple = true, Inherited = false )]
    
    [Serializable]
    public sealed class SmtpPermissionAttribute: CodeAccessSecurityAttribute
    {
        private const string strAccess     = "Access";
        private string  access = null;
 
 
        /// <include file='doc\SmtpPermission.uex' path='docs/doc[@for="SmtpPermissionAttribute.SmtpPermissionAttribute"]/*' />
        public SmtpPermissionAttribute(SecurityAction action): base( action )
        {
        }
        
 
        public string Access {
            get{
                return access;
            }
            set{
                access = value;
            }
        }
 
        /// <include file='doc\SmtpPermission.uex' path='docs/doc[@for="SmtpPermissionAttribute.CreatePermission"]/*' />
        public override IPermission CreatePermission()
        {
            SmtpPermission perm = null;
            if (Unrestricted) {
                perm = new SmtpPermission(PermissionState.Unrestricted);
            }
            else {
                perm = new SmtpPermission(PermissionState.None);
                if (access != null) {
                    if (0 == string.Compare(access, "Connect", StringComparison.OrdinalIgnoreCase)) {
                        perm.AddPermission(SmtpAccess.Connect);
                    }
                    else if (0 == string.Compare(access, "ConnectToUnrestrictedPort", StringComparison.OrdinalIgnoreCase)) {
                        perm.AddPermission(SmtpAccess.ConnectToUnrestrictedPort);
                    }
                    else if (0 == string.Compare(access, "None", StringComparison.OrdinalIgnoreCase)) {
                        perm.AddPermission(SmtpAccess.None);
                    }
                    else {
                        throw new ArgumentException(SR.GetString(SR.net_perm_invalid_val, strAccess, access));
                    }
                }
            }
            return perm;
        }
 
    }
 
 
 
    /// <include file='doc\SmtpPermission.uex' path='docs/doc[@for="SmtpPermission"]/*' />
    [Serializable]
    public sealed class SmtpPermission: CodeAccessPermission, IUnrestrictedPermission {
 
        SmtpAccess access;
        private bool unrestricted;
        
        /// <include file='doc\SmtpPermission.uex' path='docs/doc[@for="SmtpPermission.SmtpPermission"]/*' />
        public SmtpPermission(PermissionState state) {
            if (state == PermissionState.Unrestricted){
                access = SmtpAccess.ConnectToUnrestrictedPort;
                unrestricted = true;
            }
            else{
                access = SmtpAccess.None;
            }
        }
        
        public SmtpPermission(bool unrestricted) {
            if (unrestricted){
                access = SmtpAccess.ConnectToUnrestrictedPort;
                this.unrestricted = true;
            }
            else{
                access = SmtpAccess.None;
            }
        }
 
 
 
        /// <include file='doc\SmtpPermission.uex' path='docs/doc[@for="SmtpPermission.SmtpPermission1"]/*' />
        public SmtpPermission(SmtpAccess access) {
            this.access = access;
        }
 
        public SmtpAccess Access {
            get{
                return access;
            }
        }
        
        /// <include file='doc\SmtpPermission.uex' path='docs/doc[@for="SmtpPermission.AddPermission"]/*' />
        public void AddPermission(SmtpAccess access) {
            if (access > this.access)
                this.access = access;
        }
 
        /// <include file='doc\SmtpPermission.uex' path='docs/doc[@for="SmtpPermission.IsUnrestricted"]/*' />
        public bool IsUnrestricted() {
            return unrestricted;
        }
 
        /// <include file='doc\SmtpPermission.uex' path='docs/doc[@for="SmtpPermission.Copy"]/*' />
        public override IPermission Copy() {
            if(unrestricted){
                return new SmtpPermission(true);
            }
            return new SmtpPermission(access);
        }
        
        /// <include file='doc\SmtpPermission.uex' path='docs/doc[@for="SmtpPermission.Union"]/*' />
        public override IPermission Union(IPermission target) {
            if (target==null) {
                return this.Copy();
            }
            SmtpPermission other = target as SmtpPermission;
            if(other == null) {
                throw new ArgumentException(SR.GetString(SR.net_perm_target), "target");
            }
 
            if(unrestricted || other.IsUnrestricted()){
                return new SmtpPermission(true);
            }
            
            return new SmtpPermission(this.access > other.access ? this.access : other.access);
        }
 
        /// <include file='doc\SmtpPermission.uex' path='docs/doc[@for="SmtpPermission.Intersect"]/*' />
        public override IPermission Intersect(IPermission target) {
            if (target == null) {
                return null;
            }
 
            SmtpPermission other = target as SmtpPermission;
            if(other == null) {
                throw new ArgumentException(SR.GetString(SR.net_perm_target), "target");
            }
 
            if(IsUnrestricted() && other.IsUnrestricted()){
                return new SmtpPermission(true);
            }
            
            return new SmtpPermission(this.access < other.access ? this.access : other.access);
        }
 
        /// <include file='doc\SmtpPermission.uex' path='docs/doc[@for="SmtpPermission.IsSubsetOf"]/*' />
        public override bool IsSubsetOf(IPermission target) {
            // Pattern suggested by security engine
            if (target == null) {
                return (access == SmtpAccess.None);
            }
 
            SmtpPermission other = target as SmtpPermission;
            if (other == null) {
                throw new ArgumentException(SR.GetString(SR.net_perm_target), "target");
            }
 
            if(unrestricted && !other.IsUnrestricted()){
                return false;
            }
 
            return (other.access >= access);
        }
 
        /// <include file='doc\SmtpPermission.uex' path='docs/doc[@for="SmtpPermission.FromXml"]/*' />
        public override void FromXml(SecurityElement securityElement) {
            if (securityElement == null) {
               throw new ArgumentNullException("securityElement");
            }
            if (!securityElement.Tag.Equals("IPermission")) {
                throw new ArgumentException(SR.GetString(SR.net_not_ipermission), "securityElement");
            }
 
            string className = securityElement.Attribute("class");
 
            if (className == null) {
                throw new ArgumentException(SR.GetString(SR.net_no_classname), "securityElement");
            }
            if (className.IndexOf(this.GetType().FullName) < 0) {
                throw new ArgumentException(SR.GetString(SR.net_no_typename), "securityElement");
            }
 
            String str = securityElement.Attribute("Unrestricted");
            if (str != null) {
                if (0 == string.Compare( str, "true", StringComparison.OrdinalIgnoreCase)){
                    access = SmtpAccess.ConnectToUnrestrictedPort;
                    unrestricted = true;
                    return;
                }
            }
 
            str = securityElement.Attribute("Access");
            if (str != null) {
               if(0 == string.Compare(str, "Connect", StringComparison.OrdinalIgnoreCase)){
                   access = SmtpAccess.Connect;
               }
               else if(0 == string.Compare(str, "ConnectToUnrestrictedPort", StringComparison.OrdinalIgnoreCase)){
                   access = SmtpAccess.ConnectToUnrestrictedPort;
               }
               else if(0 == string.Compare(str, "None", StringComparison.OrdinalIgnoreCase)){
                   access = SmtpAccess.None;
               }
               else{
                   throw new ArgumentException(SR.GetString(SR.net_perm_invalid_val_in_element), "Access");
               }
            }
        }
                                           
        /// <include file='doc\SmtpPermission.uex' path='docs/doc[@for="SmtpPermission.ToXml"]/*' />
        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(unrestricted){
                securityElement.AddAttribute("Unrestricted", "true");
                return securityElement;
            }
 
            if (access == SmtpAccess.Connect) {
                securityElement.AddAttribute("Access", "Connect");
            }
            else if (access == SmtpAccess.ConnectToUnrestrictedPort) {
                securityElement.AddAttribute("Access", "ConnectToUnrestrictedPort");
            }
            return securityElement;
        }
    }// class SmtpPermission
 
  
} // namespace System.Net