Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / clr / src / BCL / System / Security / Policy / PolicyStatement.cs / 1 / PolicyStatement.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // PolicyStatement.cs // // Represents the policy associated with some piece of evidence // namespace System.Security.Policy { using System; using System.Security; using System.Security.Util; using Math = System.Math; using System.Collections; using System.Security.Permissions; using System.Text; using System.Runtime.Remoting.Activation; using System.Globalization; [Flags, Serializable] [System.Runtime.InteropServices.ComVisible(true)] public enum PolicyStatementAttribute { Nothing = 0x0, Exclusive = 0x01, LevelFinal = 0x02, All = 0x03, } [Serializable] [System.Runtime.InteropServices.ComVisible(true)] sealed public class PolicyStatement : ISecurityEncodable, ISecurityPolicyEncodable { // The PermissionSet associated with this policy internal PermissionSet m_permSet; // The bitfield of inheritance properties associated with this policy internal PolicyStatementAttribute m_attributes; internal PolicyStatement() { m_permSet = null; m_attributes = PolicyStatementAttribute.Nothing; } public PolicyStatement( PermissionSet permSet ) : this( permSet, PolicyStatementAttribute.Nothing ) { } public PolicyStatement( PermissionSet permSet, PolicyStatementAttribute attributes ) { if (permSet == null) { m_permSet = new PermissionSet( false ); } else { m_permSet = permSet.Copy(); } if (ValidProperties( attributes )) { m_attributes = attributes; } } private PolicyStatement( PermissionSet permSet, PolicyStatementAttribute attributes, bool copy ) { if (permSet != null) { if (copy) m_permSet = permSet.Copy(); else m_permSet = permSet; } else { m_permSet = new PermissionSet( false ); } m_attributes = attributes; } public PermissionSet PermissionSet { get { lock (this) { return m_permSet.Copy(); } } set { lock (this) { if (value == null) { m_permSet = new PermissionSet( false ); } else { m_permSet = value.Copy(); } } } } internal void SetPermissionSetNoCopy( PermissionSet permSet ) { m_permSet = permSet; } internal PermissionSet GetPermissionSetNoCopy() { lock (this) { return m_permSet; } } public PolicyStatementAttribute Attributes { get { return m_attributes; } set { if (ValidProperties( value )) { m_attributes = value; } } } public PolicyStatement Copy() { return new PolicyStatement( m_permSet, m_attributes, true ); } public String AttributeString { get { StringBuilder sb = new StringBuilder(); bool first = true; if (GetFlag((int) PolicyStatementAttribute.Exclusive )) { sb.Append( "Exclusive" ); first = false; } if (GetFlag((int) PolicyStatementAttribute.LevelFinal )) { if (!first) sb.Append( " " ); sb.Append( "LevelFinal" ); } return sb.ToString(); } } private static bool ValidProperties( PolicyStatementAttribute attributes ) { if ((attributes & ~(PolicyStatementAttribute.All)) == 0) { return true; } else { throw new ArgumentException( Environment.GetResourceString( "Argument_InvalidFlag" ) ); } } private bool GetFlag( int flag ) { return (flag & (int)m_attributes) != 0; } public SecurityElement ToXml() { return ToXml( null ); } public void FromXml( SecurityElement et ) { FromXml( et, null ); } public SecurityElement ToXml( PolicyLevel level ) { return ToXml( level, false ); } internal SecurityElement ToXml( PolicyLevel level, bool useInternal ) { SecurityElement e = new SecurityElement( "PolicyStatement" ); e.AddAttribute( "version", "1" ); if (m_attributes != PolicyStatementAttribute.Nothing) e.AddAttribute( "Attributes", XMLUtil.BitFieldEnumToString( typeof( PolicyStatementAttribute ), m_attributes ) ); lock (this) { if (m_permSet != null) { if (m_permSet is NamedPermissionSet) { // If the named permission set exists in the parent level of this // policy struct, then just save the name of the permission set. // Otherwise, serialize it like normal. NamedPermissionSet namedPermSet = (NamedPermissionSet)m_permSet; if (level != null && level.GetNamedPermissionSet( namedPermSet.Name ) != null) { e.AddAttribute( "PermissionSetName", namedPermSet.Name ); } else { if (useInternal) e.AddChild( namedPermSet.InternalToXml() ); else e.AddChild( namedPermSet.ToXml() ); } } else { if (useInternal) e.AddChild( m_permSet.InternalToXml() ); else e.AddChild( m_permSet.ToXml() ); } } } return e; } public void FromXml( SecurityElement et, PolicyLevel level ) { FromXml( et, level, false ); } internal void FromXml( SecurityElement et, PolicyLevel level, bool allowInternalOnly ) { if (et == null) throw new ArgumentNullException( "et" ); if (!et.Tag.Equals( "PolicyStatement" )) throw new ArgumentException( String.Format( CultureInfo.CurrentCulture, Environment.GetResourceString( "Argument_InvalidXMLElement" ), "PolicyStatement", this.GetType().FullName ) ); m_attributes = (PolicyStatementAttribute) 0; String strAttributes = et.Attribute( "Attributes" ); if (strAttributes != null) m_attributes = (PolicyStatementAttribute)Enum.Parse( typeof( PolicyStatementAttribute ), strAttributes ); lock (this) { m_permSet = null; if (level != null) { String permSetName = et.Attribute( "PermissionSetName" ); if (permSetName != null) { m_permSet = level.GetNamedPermissionSetInternal( permSetName ); if (m_permSet == null) m_permSet = new PermissionSet( PermissionState.None ); } } if (m_permSet == null) { // There is no provided level, it is not a named permission set, or // the named permission set doesn't exist in the provided level, // so just create the class through reflection and decode normally. SecurityElement e = et.SearchForChildByTag( "PermissionSet" ); if (e != null) { String className = e.Attribute( "class" ); if (className != null && (className.Equals( "NamedPermissionSet" ) || className.Equals( "System.Security.NamedPermissionSet" ))) m_permSet = new NamedPermissionSet( "DefaultName", PermissionState.None ); else m_permSet = new PermissionSet( PermissionState.None ); try { m_permSet.FromXml( e, allowInternalOnly, true ); } catch { // ignore any exceptions from the decode process. // Note: we go ahead and use the permission set anyway. This should be safe since // the decode process should never give permission beyond what a proper decode would have // given. } } else { throw new ArgumentException( Environment.GetResourceString( "Argument_InvalidXML" ) ); } } if (m_permSet == null) m_permSet = new PermissionSet( PermissionState.None ); } } internal void FromXml( SecurityDocument doc, int position, PolicyLevel level, bool allowInternalOnly ) { if (doc == null) throw new ArgumentNullException( "doc" ); if (!doc.GetTagForElement( position ).Equals( "PolicyStatement" )) throw new ArgumentException( String.Format( CultureInfo.CurrentCulture, Environment.GetResourceString( "Argument_InvalidXMLElement" ), "PolicyStatement", this.GetType().FullName ) ); m_attributes = (PolicyStatementAttribute) 0; String strAttributes = doc.GetAttributeForElement( position, "Attributes" ); if (strAttributes != null) m_attributes = (PolicyStatementAttribute)Enum.Parse( typeof( PolicyStatementAttribute ), strAttributes ); lock (this) { m_permSet = null; if (level != null) { String permSetName = doc.GetAttributeForElement( position, "PermissionSetName" ); if (permSetName != null) { m_permSet = level.GetNamedPermissionSetInternal( permSetName ); if (m_permSet == null) m_permSet = new PermissionSet( PermissionState.None ); } } if (m_permSet == null) { // There is no provided level, it is not a named permission set, or // the named permission set doesn't exist in the provided level, // so just create the class through reflection and decode normally. ArrayList childPositions = doc.GetChildrenPositionForElement( position ); int positionPermissionSet = -1; for (int i = 0; i < childPositions.Count; ++i) { if (doc.GetTagForElement( (int)childPositions[i] ).Equals( "PermissionSet" )) { positionPermissionSet = (int)childPositions[i]; } } if (positionPermissionSet != -1) { String className = doc.GetAttributeForElement( positionPermissionSet, "class" ); if (className != null && (className.Equals( "NamedPermissionSet" ) || className.Equals( "System.Security.NamedPermissionSet" ))) m_permSet = new NamedPermissionSet( "DefaultName", PermissionState.None ); else m_permSet = new PermissionSet( PermissionState.None ); m_permSet.FromXml( doc, positionPermissionSet, allowInternalOnly ); } else { throw new ArgumentException( Environment.GetResourceString( "Argument_InvalidXML" ) ); } } if (m_permSet == null) m_permSet = new PermissionSet( PermissionState.None ); } } [System.Runtime.InteropServices.ComVisible(false)] public override bool Equals( Object obj ) { PolicyStatement other = obj as PolicyStatement; if (other == null) return false; if (this.m_attributes != other.m_attributes) return false; if (!Object.Equals( this.m_permSet, other.m_permSet )) return false; return true; } [System.Runtime.InteropServices.ComVisible(false)] public override int GetHashCode() { int accumulator = (int)this.m_attributes; if (m_permSet != null) accumulator = accumulator ^ m_permSet.GetHashCode(); return accumulator; } } }
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- indexingfiltermarshaler.cs
- RtfControls.cs
- DataListItemCollection.cs
- State.cs
- XamlHostingSectionGroup.cs
- RightsDocument.cs
- CodeDelegateCreateExpression.cs
- FileRecordSequenceCompletedAsyncResult.cs
- odbcmetadatacollectionnames.cs
- ConsoleTraceListener.cs
- WebHttpBindingElement.cs
- MouseGesture.cs
- JavaScriptString.cs
- BevelBitmapEffect.cs
- FullTrustAssembliesSection.cs
- EntityTypeEmitter.cs
- BufferedStream2.cs
- CodeArrayCreateExpression.cs
- StackBuilderSink.cs
- SchemaSetCompiler.cs
- CompilerGlobalScopeAttribute.cs
- recordstatescratchpad.cs
- XmlSignificantWhitespace.cs
- rsa.cs
- StartUpEventArgs.cs
- MessageSecurityOverTcpElement.cs
- WebBrowserDesigner.cs
- TitleStyle.cs
- WindowsImpersonationContext.cs
- MultiSelectRootGridEntry.cs
- LineUtil.cs
- LessThanOrEqual.cs
- coordinatorfactory.cs
- SessionStateUtil.cs
- SortedList.cs
- XmlEventCache.cs
- StringValidator.cs
- Pens.cs
- DateTimeConverter.cs
- SQLInt16.cs
- ReferentialConstraint.cs
- DataGridViewColumnCollectionEditor.cs
- SmtpCommands.cs
- AuthenticatingEventArgs.cs
- InstallerTypeAttribute.cs
- tooltip.cs
- ValidationErrorCollection.cs
- VerificationException.cs
- ReplyChannel.cs
- StackOverflowException.cs
- ValueExpressions.cs
- EntityCommandDefinition.cs
- DelayedRegex.cs
- DataTrigger.cs
- WebPartUserCapability.cs
- WindowsClaimSet.cs
- TextEvent.cs
- ThicknessKeyFrameCollection.cs
- ColumnResizeUndoUnit.cs
- XamlVector3DCollectionSerializer.cs
- DoubleMinMaxAggregationOperator.cs
- DefaultBindingPropertyAttribute.cs
- Blend.cs
- followingquery.cs
- ListParagraph.cs
- _SpnDictionary.cs
- ConfigurationSectionCollection.cs
- DataKey.cs
- Lazy.cs
- XamlStream.cs
- TableItemPatternIdentifiers.cs
- XmlMembersMapping.cs
- util.cs
- infer.cs
- RelatedEnd.cs
- WebPartUserCapability.cs
- EnumUnknown.cs
- ping.cs
- Activator.cs
- PolicyUtility.cs
- DesignerVerbToolStripMenuItem.cs
- MsmqAuthenticationMode.cs
- ApplyTemplatesAction.cs
- TransactionState.cs
- ObjectResult.cs
- Typography.cs
- RSACryptoServiceProvider.cs
- VSDExceptions.cs
- StylusPointProperties.cs
- XmlnsCache.cs
- ZipIOCentralDirectoryBlock.cs
- IssuanceTokenProviderState.cs
- EncoderReplacementFallback.cs
- CodeDirectionExpression.cs
- TokenFactoryFactory.cs
- UnsafeNativeMethods.cs
- DoubleCollectionConverter.cs
- SqlReorderer.cs
- SwitchElementsCollection.cs
- CompoundFileReference.cs