Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Services / Messaging / System / Messaging / MessageQueuePermission.cs / 1305376 / MessageQueuePermission.cs
//---------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Messaging { using System; using System.Text; using System.Security; using System.Security.Permissions; using System.Collections; using System.Collections.Specialized; using System.Globalization; ////// /// [ Serializable() ] public sealed class MessageQueuePermission : CodeAccessPermission, IUnrestrictedPermission { internal Hashtable resolvedFormatNames; internal MessageQueuePermissionEntryCollection innerCollection; internal bool isUnrestricted; internal const string Any = "*"; ///[To be supplied.] ////// /// public MessageQueuePermission() { } ///[To be supplied.] ////// /// public MessageQueuePermission(PermissionState state) { if (state == PermissionState.Unrestricted) this.isUnrestricted = true; else this.isUnrestricted = false; } ///[To be supplied.] ////// /// public MessageQueuePermission(MessageQueuePermissionAccess permissionAccess, string path) { MessageQueuePermissionEntry entry = new MessageQueuePermissionEntry(permissionAccess, path); this.PermissionEntries.Add(entry); } ///[To be supplied.] ////// /// public MessageQueuePermission(MessageQueuePermissionAccess permissionAccess, string machineName, string label, string category) { MessageQueuePermissionEntry entry = new MessageQueuePermissionEntry(permissionAccess, machineName, label, category); this.PermissionEntries.Add(entry); } ///[To be supplied.] ////// /// public MessageQueuePermission(MessageQueuePermissionEntry[] permissionAccessEntries) { if (permissionAccessEntries == null) throw new ArgumentNullException("permissionAccessEntries"); this.PermissionEntries.AddRange(permissionAccessEntries); } ///[To be supplied.] ////// /// public MessageQueuePermissionEntryCollection PermissionEntries { get { if (this.innerCollection == null) { if (this.resolvedFormatNames == null) this.innerCollection = new MessageQueuePermissionEntryCollection(this); else { Hashtable resolvedReference = this.resolvedFormatNames; this.innerCollection = new MessageQueuePermissionEntryCollection(this); foreach (string formatName in resolvedReference.Keys) { string path; if (formatName == Any) path = Any; else path = "FORMATNAME:" + formatName; MessageQueuePermissionEntry entry = new MessageQueuePermissionEntry( (MessageQueuePermissionAccess)resolvedReference[formatName], path); this.innerCollection.Add(entry); } } } return this.innerCollection; } } // Put this in one central place. MSMQ appears to use CompareString // with LOCALE_INVARIANT and NORM_IGNORECASE. private static IEqualityComparer GetComparer() { return StringComparer.InvariantCultureIgnoreCase; } ///[To be supplied.] ////// internal void Clear() { this.resolvedFormatNames = null; } /// /// /// public override IPermission Copy() { MessageQueuePermission permission = new MessageQueuePermission(); permission.isUnrestricted = this.isUnrestricted; foreach (MessageQueuePermissionEntry entry in this.PermissionEntries) permission.PermissionEntries.Add(entry); permission.resolvedFormatNames = this.resolvedFormatNames; return permission; } ///[To be supplied.] ////// /// [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1803:AvoidCostlyCallsWherePossible")] public override void FromXml(SecurityElement securityElement) { this.PermissionEntries.Clear(); string unrestrictedValue = securityElement.Attribute("Unrestricted"); if (unrestrictedValue != null && (string.Compare(unrestrictedValue, "true", true, CultureInfo.InvariantCulture) == 0)) { this.isUnrestricted = true; return; } if (securityElement.Children != null) { for (int index = 0; index < securityElement.Children.Count; ++ index) { SecurityElement currentElement = (SecurityElement)securityElement.Children[index]; MessageQueuePermissionEntry entry = null; string accessString = currentElement.Attribute("access"); int permissionAccess = 0; if (accessString != null) { string[] accessArray = accessString.Split(new char[]{'|'}); for (int index2 = 0; index2 < accessArray.Length; ++ index2) { string currentAccess = accessArray[index2].Trim(); if (Enum.IsDefined(typeof(MessageQueuePermissionAccess), currentAccess)) permissionAccess = permissionAccess | (int)Enum.Parse(typeof(MessageQueuePermissionAccess), currentAccess); } } if (currentElement.Tag == "Path") { string path = currentElement.Attribute("value"); if (path == null) throw new InvalidOperationException(Res.GetString(Res.InvalidXmlFormat)); entry = new MessageQueuePermissionEntry((MessageQueuePermissionAccess)permissionAccess, path); } else if (currentElement.Tag == "Criteria") { string label = currentElement.Attribute("label"); string category = currentElement.Attribute("category"); string machineName = currentElement.Attribute("machine"); if (machineName == null && label == null && category == null) throw new InvalidOperationException(Res.GetString(Res.InvalidXmlFormat)); entry = new MessageQueuePermissionEntry((MessageQueuePermissionAccess)permissionAccess, machineName, label, category); } else throw new InvalidOperationException(Res.GetString(Res.InvalidXmlFormat)); this.PermissionEntries.Add(entry); } } } ///[To be supplied.] ////// /// public override IPermission Intersect(IPermission target) { if (target == null) return null; if (!(target is MessageQueuePermission)) throw new ArgumentException(Res.GetString(Res.InvalidParameter, "target", target.ToString())); MessageQueuePermission targetQueuePermission = (MessageQueuePermission)target; if (this.IsUnrestricted()) return targetQueuePermission.Copy(); if (targetQueuePermission.IsUnrestricted()) return this.Copy(); this.ResolveFormatNames(); targetQueuePermission.ResolveFormatNames(); MessageQueuePermission newPermission = new MessageQueuePermission(); Hashtable newFormatNames = new Hashtable(GetComparer()); newPermission.resolvedFormatNames = newFormatNames; IDictionaryEnumerator formatNamesEnumerator; Hashtable formatNamesTable; if (this.resolvedFormatNames.Count < targetQueuePermission.resolvedFormatNames.Count) { formatNamesEnumerator = this.resolvedFormatNames.GetEnumerator(); formatNamesTable = targetQueuePermission.resolvedFormatNames; } else{ formatNamesEnumerator = targetQueuePermission.resolvedFormatNames.GetEnumerator(); formatNamesTable = this.resolvedFormatNames; } while(formatNamesEnumerator.MoveNext()) { if (formatNamesTable.ContainsKey(formatNamesEnumerator.Key)) { string currentFormatName = (string)formatNamesEnumerator.Key; MessageQueuePermissionAccess currentAccess = (MessageQueuePermissionAccess)formatNamesEnumerator.Value; MessageQueuePermissionAccess targetAccess = (MessageQueuePermissionAccess)formatNamesTable[currentFormatName]; newFormatNames.Add(currentFormatName, currentAccess & targetAccess); } } return newPermission; } ///[To be supplied.] ////// /// public override bool IsSubsetOf(IPermission target) { if (target == null) return false; if (!(target is MessageQueuePermission)) throw new ArgumentException(Res.GetString(Res.InvalidParameter, "target", target.ToString())); MessageQueuePermission targetQueuePermission = (MessageQueuePermission)target; if (targetQueuePermission.IsUnrestricted()) return true; else if (this.IsUnrestricted()) return false; this.ResolveFormatNames(); targetQueuePermission.ResolveFormatNames(); //If one of the tables is empty the subset cannot be resolved reliably, should assume //then that they are not subset of each other. if ((this.resolvedFormatNames.Count == 0 && targetQueuePermission.resolvedFormatNames.Count != 0) || (this.resolvedFormatNames.Count != 0 && targetQueuePermission.resolvedFormatNames.Count == 0)) return false; //If the target table contains a wild card, all the current formatName access need to be //a subset of the target. IDictionaryEnumerator formatNamesEnumerator; if (targetQueuePermission.resolvedFormatNames.ContainsKey(Any)) { MessageQueuePermissionAccess targetAccess = (MessageQueuePermissionAccess)targetQueuePermission.resolvedFormatNames[Any]; formatNamesEnumerator = this.resolvedFormatNames.GetEnumerator(); while(formatNamesEnumerator.MoveNext()) { MessageQueuePermissionAccess currentAccess = (MessageQueuePermissionAccess)formatNamesEnumerator.Value; if ((currentAccess & targetAccess) != currentAccess) return false; } return true; } //If the current table contains a wild card it can be treated as any other format name. formatNamesEnumerator = this.resolvedFormatNames.GetEnumerator(); while(formatNamesEnumerator.MoveNext()) { string currentFormatName = (string)formatNamesEnumerator.Key; if (!targetQueuePermission.resolvedFormatNames.ContainsKey(currentFormatName)) return false; else { MessageQueuePermissionAccess currentAccess = (MessageQueuePermissionAccess)formatNamesEnumerator.Value; MessageQueuePermissionAccess targetAccess = (MessageQueuePermissionAccess)targetQueuePermission.resolvedFormatNames[currentFormatName]; if ((currentAccess & targetAccess) != currentAccess) return false; } } return true; } ///[To be supplied.] ////// /// public bool IsUnrestricted() { return this.isUnrestricted; } internal void ResolveFormatNames() { if (this.resolvedFormatNames == null) { this.resolvedFormatNames = new Hashtable(GetComparer()); IEnumerator enumerator = this.PermissionEntries.GetEnumerator(); while (enumerator.MoveNext()) { MessageQueuePermissionEntry entry = (MessageQueuePermissionEntry)enumerator.Current; if (entry.Path != null) { if (entry.Path == Any) this.resolvedFormatNames.Add(Any, entry.PermissionAccess); else { try { MessageQueue queue = new MessageQueue(entry.Path); this.resolvedFormatNames.Add(queue.FormatName, entry.PermissionAccess); } catch { //if the format name cannot be resolved, it won't be added to the list //permissions won't be granted. } } } else { try { MessageQueueCriteria criteria = new MessageQueueCriteria(); if (entry.MachineName != null) criteria.MachineName = entry.MachineName; if (entry.Category != null) criteria.Category = new Guid(entry.Category); if (entry.Label != null) criteria.Label = entry.Label; IEnumerator messageQueues = MessageQueue.GetMessageQueueEnumerator(criteria, false); while (messageQueues.MoveNext()) { MessageQueue queue = (MessageQueue)messageQueues.Current; this.resolvedFormatNames.Add(queue.FormatName, entry.PermissionAccess); } } catch { //if the criteria cannot be resolved, nothing will be added to the list //permissions won't be granted. } } } } } ///[To be supplied.] ////// /// public override SecurityElement ToXml() { SecurityElement root = new SecurityElement("IPermission"); Type type = this.GetType(); root.AddAttribute("class", type.FullName + ", " + type.Module.Assembly.FullName.Replace('\"', '\'')); root.AddAttribute("version", "1"); if (this.isUnrestricted) { root.AddAttribute("Unrestricted", "true"); return root; } IEnumerator enumerator = this.PermissionEntries.GetEnumerator(); while (enumerator.MoveNext()) { SecurityElement currentElement = null; MessageQueuePermissionEntry entry = (MessageQueuePermissionEntry)enumerator.Current; if (entry.Path != null) { currentElement = new SecurityElement("Path"); currentElement.AddAttribute("value", entry.Path); } else { currentElement = new SecurityElement("Criteria"); if (entry.MachineName != null) currentElement.AddAttribute("machine", entry.MachineName); if (entry.Category != null) currentElement.AddAttribute("category", entry.Category); if (entry.Label != null) currentElement.AddAttribute("label", entry.Label); } int currentAccess = (int)entry.PermissionAccess; if (currentAccess != 0) { StringBuilder accessStringBuilder = null; int[] enumValues = (int[])Enum.GetValues(typeof(MessageQueuePermissionAccess)); Array.Sort(enumValues, InvariantComparer.Default); for (int index = (enumValues.Length -1); index >= 0; -- index) { if (enumValues[index] != 0 && ((currentAccess & enumValues[index]) == enumValues[index])) { if (accessStringBuilder == null) accessStringBuilder = new StringBuilder(); else accessStringBuilder.Append("|"); accessStringBuilder.Append(Enum.GetName(typeof(MessageQueuePermissionAccess), enumValues[index])); currentAccess = currentAccess & (enumValues[index] ^ enumValues[index]); } } currentElement.AddAttribute("access", accessStringBuilder.ToString()); } root.AddChild(currentElement); } return root; } ///[To be supplied.] ////// /// public override IPermission Union(IPermission target) { if (target == null) return this.Copy(); if (!(target is MessageQueuePermission)) throw new ArgumentException(Res.GetString(Res.InvalidParameter, "target", target.ToString())); MessageQueuePermission targetQueuePermission = (MessageQueuePermission)target; MessageQueuePermission newPermission = new MessageQueuePermission(); if (this.IsUnrestricted() || targetQueuePermission.IsUnrestricted()) { newPermission.isUnrestricted = true; return newPermission; } Hashtable newFormatNames = new Hashtable(GetComparer()); this.ResolveFormatNames(); targetQueuePermission.ResolveFormatNames(); IDictionaryEnumerator formatNamesEnumerator = this.resolvedFormatNames.GetEnumerator(); IDictionaryEnumerator targetFormatNamesEnumerator = targetQueuePermission.resolvedFormatNames.GetEnumerator(); while(formatNamesEnumerator.MoveNext()) newFormatNames[(string)formatNamesEnumerator.Key] = formatNamesEnumerator.Value; while(targetFormatNamesEnumerator.MoveNext()) { if (!newFormatNames.ContainsKey(targetFormatNamesEnumerator.Key)) newFormatNames[targetFormatNamesEnumerator.Key] = targetFormatNamesEnumerator.Value; else { MessageQueuePermissionAccess currentAccess = (MessageQueuePermissionAccess)newFormatNames[targetFormatNamesEnumerator.Key]; newFormatNames[targetFormatNamesEnumerator.Key] = currentAccess | (MessageQueuePermissionAccess)targetFormatNamesEnumerator.Value; } } newPermission.resolvedFormatNames = newFormatNames; return newPermission; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.[To be supplied.] ///
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- RelatedEnd.cs
- SlipBehavior.cs
- TokenBasedSet.cs
- ZipIOFileItemStream.cs
- TriggerCollection.cs
- BindingMemberInfo.cs
- XpsS0ValidatingLoader.cs
- ConnectionsZoneAutoFormat.cs
- ThousandthOfEmRealPoints.cs
- DataServiceQueryException.cs
- QuinticEase.cs
- Size.cs
- Rectangle.cs
- ProviderConnectionPointCollection.cs
- StylusCaptureWithinProperty.cs
- KnownBoxes.cs
- Column.cs
- SimpleTypeResolver.cs
- COAUTHIDENTITY.cs
- RuntimeHandles.cs
- ResourceManager.cs
- SecurityTokenResolver.cs
- DateTimeOffsetStorage.cs
- FixedTextBuilder.cs
- XPathSelfQuery.cs
- SymLanguageType.cs
- ParentUndoUnit.cs
- CompilerState.cs
- WebPartExportVerb.cs
- OleDbCommandBuilder.cs
- SettingsPropertyValue.cs
- DesignOnlyAttribute.cs
- StorageTypeMapping.cs
- QueuePropertyVariants.cs
- GridViewUpdatedEventArgs.cs
- HtmlInputImage.cs
- InkSerializer.cs
- BrushValueSerializer.cs
- RandomNumberGenerator.cs
- IdentityNotMappedException.cs
- SchemaImporterExtensionElement.cs
- FormViewPagerRow.cs
- DataServiceQueryProvider.cs
- serverconfig.cs
- CodeArrayIndexerExpression.cs
- SqlMethods.cs
- XdrBuilder.cs
- ScrollProviderWrapper.cs
- ExpandSegmentCollection.cs
- Triangle.cs
- VectorCollectionValueSerializer.cs
- IndentedWriter.cs
- UserNameSecurityTokenParameters.cs
- MsmqHostedTransportManager.cs
- HttpConfigurationSystem.cs
- XhtmlCssHandler.cs
- ListViewInsertedEventArgs.cs
- JsonSerializer.cs
- ColumnClickEvent.cs
- XPathAncestorIterator.cs
- SymLanguageType.cs
- SecuritySessionFilter.cs
- ContainerSelectorActiveEvent.cs
- SelectionWordBreaker.cs
- DataGridViewTextBoxEditingControl.cs
- Trace.cs
- VisualStyleRenderer.cs
- DictionaryContent.cs
- PresentationUIStyleResources.cs
- TextUtf8RawTextWriter.cs
- DrawingBrush.cs
- OrderByLifter.cs
- RetrieveVirtualItemEventArgs.cs
- NavigationCommands.cs
- SqlBuilder.cs
- FormViewUpdateEventArgs.cs
- KeyedHashAlgorithm.cs
- ButtonStandardAdapter.cs
- SHA1CryptoServiceProvider.cs
- DataGridViewRow.cs
- PageParserFilter.cs
- AssemblyBuilder.cs
- AuthenticationModulesSection.cs
- MessageFilter.cs
- WorkflowInstance.cs
- EventTrigger.cs
- ViewPort3D.cs
- DataRowCollection.cs
- SiteMapNodeCollection.cs
- ValueConversionAttribute.cs
- GB18030Encoding.cs
- GlyphInfoList.cs
- CreationContext.cs
- QueryableFilterUserControl.cs
- XmlArrayItemAttributes.cs
- SyntaxCheck.cs
- ProtocolState.cs
- ToolStripTemplateNode.cs
- TagMapCollection.cs
- _NetRes.cs