Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Net / System / Net / _ServiceNameStore.cs / 1305376 / _ServiceNameStore.cs
using System; using System.Collections.Generic; using System.Security.Authentication.ExtendedProtection; using System.Diagnostics; namespace System.Net { internal class ServiceNameStore { private ListserviceNames; private ServiceNameCollection serviceNameCollection; public ServiceNameCollection ServiceNames { get { if (serviceNameCollection == null) { serviceNameCollection = new ServiceNameCollection(serviceNames); } return serviceNameCollection; } } public ServiceNameStore() { serviceNames = new List (); serviceNameCollection = null; // set only when needed (due to expensive item-by-item copy) } private bool AddSingleServiceName(string spn) { if (Contains(spn)) { return false; } else { serviceNames.Add(spn); return true; } } public bool Add(string uriPrefix) { Debug.Assert(!String.IsNullOrEmpty(uriPrefix)); string[] newServiceNames = BuildServiceNames(uriPrefix); bool addedAny = false; foreach (string spn in newServiceNames) { if (AddSingleServiceName(spn)) { addedAny = true; if (Logging.On) { Logging.PrintInfo(Logging.HttpListener, "ServiceNameStore#" + ValidationHelper.HashString(this) + "::Add() adding default SPNs '" + spn + "' from prefix '" + uriPrefix + "'"); } } } if (addedAny) { serviceNameCollection = null; } else if (Logging.On) { Logging.PrintInfo(Logging.HttpListener, "ServiceNameStore#" + ValidationHelper.HashString(this) + "::Add() no default SPN added for prefix '" + uriPrefix + "'"); } return addedAny; } public bool Remove(string uriPrefix) { Debug.Assert(!String.IsNullOrEmpty(uriPrefix)); string newServiceName = BuildSimpleServiceName(uriPrefix); bool needToRemove = Contains(newServiceName); if (needToRemove) { serviceNames.Remove(newServiceName); serviceNameCollection = null; //invalidate (readonly) ServiceNameCollection } if (Logging.On) { if (needToRemove) { Logging.PrintInfo(Logging.HttpListener, "ServiceNameStore#" + ValidationHelper.HashString(this) + "::Remove() removing default SPN '" + newServiceName + "' from prefix '" + uriPrefix + "'"); } else { Logging.PrintInfo(Logging.HttpListener, "ServiceNameStore#" + ValidationHelper.HashString(this) + "::Remove() no default SPN removed for prefix '" + uriPrefix + "'"); } } return needToRemove; } private bool Contains(string newServiceName) { if (newServiceName == null) { return false; } bool found = false; foreach (string serviceName in serviceNames) { if (String.Compare(serviceName, newServiceName, StringComparison.InvariantCultureIgnoreCase) == 0) { found = true; break; } } return found; } public void Clear() { serviceNames.Clear(); serviceNameCollection = null; //invalidate (readonly) ServiceNameCollection } private string ExtractHostname(string uriPrefix, bool allowInvalidUriStrings) { if (Uri.IsWellFormedUriString(uriPrefix, UriKind.Absolute)) { Uri hostUri = new Uri(uriPrefix); return hostUri.Host; } else if (allowInvalidUriStrings) { int i = uriPrefix.IndexOf("://") + 3; int j = i; bool inSquareBrackets = false; while(j < uriPrefix.Length && uriPrefix[j] != '/' && (uriPrefix[j] != ':' || inSquareBrackets)) { if (uriPrefix[j] == '[') { if (inSquareBrackets) { j = i; break; } inSquareBrackets = true; } if (inSquareBrackets && uriPrefix[j] == ']') { inSquareBrackets = false; } j++; } return uriPrefix.Substring(i, j - i); } return null; } public string BuildSimpleServiceName(string uriPrefix) { string hostname = ExtractHostname(uriPrefix, false); if (hostname != null) { return "HTTP/" + hostname; } else { return null; } } public string[] BuildServiceNames(string uriPrefix) { string hostname = ExtractHostname(uriPrefix, true); IPAddress ipAddress = null; if (String.Compare(hostname, "*", StringComparison.InvariantCultureIgnoreCase) == 0 || String.Compare(hostname, "+", StringComparison.InvariantCultureIgnoreCase) == 0 || IPAddress.TryParse(hostname, out ipAddress)) { // for a wildcard, register the machine name. If the caller doesn't have DNS permission // or the query fails for some reason, don't add an SPN. try { string machineName = Dns.GetHostEntry(String.Empty).HostName; return new string[] { "HTTP/" + machineName }; } catch (System.Net.Sockets.SocketException) { return new string[0]; } catch (System.Security.SecurityException) { return new string[0]; } } else if (!hostname.Contains(".")) { // for a dotless name, try to resolve the FQDN. If the caller doesn't have DNS permission // or the query fails for some reason, add only the dotless name. try { string fqdn = Dns.GetHostEntry(hostname).HostName; return new string[] { "HTTP/" + hostname, "HTTP/" + fqdn }; } catch (System.Net.Sockets.SocketException) { return new string[] { "HTTP/" + hostname }; } catch (System.Security.SecurityException) { return new string[] { "HTTP/" + hostname }; } } else { return new string[] { "HTTP/" + hostname }; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. using System; using System.Collections.Generic; using System.Security.Authentication.ExtendedProtection; using System.Diagnostics; namespace System.Net { internal class ServiceNameStore { private List serviceNames; private ServiceNameCollection serviceNameCollection; public ServiceNameCollection ServiceNames { get { if (serviceNameCollection == null) { serviceNameCollection = new ServiceNameCollection(serviceNames); } return serviceNameCollection; } } public ServiceNameStore() { serviceNames = new List (); serviceNameCollection = null; // set only when needed (due to expensive item-by-item copy) } private bool AddSingleServiceName(string spn) { if (Contains(spn)) { return false; } else { serviceNames.Add(spn); return true; } } public bool Add(string uriPrefix) { Debug.Assert(!String.IsNullOrEmpty(uriPrefix)); string[] newServiceNames = BuildServiceNames(uriPrefix); bool addedAny = false; foreach (string spn in newServiceNames) { if (AddSingleServiceName(spn)) { addedAny = true; if (Logging.On) { Logging.PrintInfo(Logging.HttpListener, "ServiceNameStore#" + ValidationHelper.HashString(this) + "::Add() adding default SPNs '" + spn + "' from prefix '" + uriPrefix + "'"); } } } if (addedAny) { serviceNameCollection = null; } else if (Logging.On) { Logging.PrintInfo(Logging.HttpListener, "ServiceNameStore#" + ValidationHelper.HashString(this) + "::Add() no default SPN added for prefix '" + uriPrefix + "'"); } return addedAny; } public bool Remove(string uriPrefix) { Debug.Assert(!String.IsNullOrEmpty(uriPrefix)); string newServiceName = BuildSimpleServiceName(uriPrefix); bool needToRemove = Contains(newServiceName); if (needToRemove) { serviceNames.Remove(newServiceName); serviceNameCollection = null; //invalidate (readonly) ServiceNameCollection } if (Logging.On) { if (needToRemove) { Logging.PrintInfo(Logging.HttpListener, "ServiceNameStore#" + ValidationHelper.HashString(this) + "::Remove() removing default SPN '" + newServiceName + "' from prefix '" + uriPrefix + "'"); } else { Logging.PrintInfo(Logging.HttpListener, "ServiceNameStore#" + ValidationHelper.HashString(this) + "::Remove() no default SPN removed for prefix '" + uriPrefix + "'"); } } return needToRemove; } private bool Contains(string newServiceName) { if (newServiceName == null) { return false; } bool found = false; foreach (string serviceName in serviceNames) { if (String.Compare(serviceName, newServiceName, StringComparison.InvariantCultureIgnoreCase) == 0) { found = true; break; } } return found; } public void Clear() { serviceNames.Clear(); serviceNameCollection = null; //invalidate (readonly) ServiceNameCollection } private string ExtractHostname(string uriPrefix, bool allowInvalidUriStrings) { if (Uri.IsWellFormedUriString(uriPrefix, UriKind.Absolute)) { Uri hostUri = new Uri(uriPrefix); return hostUri.Host; } else if (allowInvalidUriStrings) { int i = uriPrefix.IndexOf("://") + 3; int j = i; bool inSquareBrackets = false; while(j < uriPrefix.Length && uriPrefix[j] != '/' && (uriPrefix[j] != ':' || inSquareBrackets)) { if (uriPrefix[j] == '[') { if (inSquareBrackets) { j = i; break; } inSquareBrackets = true; } if (inSquareBrackets && uriPrefix[j] == ']') { inSquareBrackets = false; } j++; } return uriPrefix.Substring(i, j - i); } return null; } public string BuildSimpleServiceName(string uriPrefix) { string hostname = ExtractHostname(uriPrefix, false); if (hostname != null) { return "HTTP/" + hostname; } else { return null; } } public string[] BuildServiceNames(string uriPrefix) { string hostname = ExtractHostname(uriPrefix, true); IPAddress ipAddress = null; if (String.Compare(hostname, "*", StringComparison.InvariantCultureIgnoreCase) == 0 || String.Compare(hostname, "+", StringComparison.InvariantCultureIgnoreCase) == 0 || IPAddress.TryParse(hostname, out ipAddress)) { // for a wildcard, register the machine name. If the caller doesn't have DNS permission // or the query fails for some reason, don't add an SPN. try { string machineName = Dns.GetHostEntry(String.Empty).HostName; return new string[] { "HTTP/" + machineName }; } catch (System.Net.Sockets.SocketException) { return new string[0]; } catch (System.Security.SecurityException) { return new string[0]; } } else if (!hostname.Contains(".")) { // for a dotless name, try to resolve the FQDN. If the caller doesn't have DNS permission // or the query fails for some reason, add only the dotless name. try { string fqdn = Dns.GetHostEntry(hostname).HostName; return new string[] { "HTTP/" + hostname, "HTTP/" + fqdn }; } catch (System.Net.Sockets.SocketException) { return new string[] { "HTTP/" + hostname }; } catch (System.Security.SecurityException) { return new string[] { "HTTP/" + hostname }; } } else { return new string[] { "HTTP/" + hostname }; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Semaphore.cs
- ArraySet.cs
- ZipArchive.cs
- XmlComment.cs
- PathFigureCollection.cs
- DataGridViewColumnStateChangedEventArgs.cs
- NonSerializedAttribute.cs
- LabelEditEvent.cs
- Converter.cs
- IndexingContentUnit.cs
- NavigateEvent.cs
- ConstructorNeedsTagAttribute.cs
- IssuanceTokenProviderState.cs
- IteratorFilter.cs
- ConstraintManager.cs
- CatalogUtil.cs
- _RequestLifetimeSetter.cs
- TemplateColumn.cs
- serverconfig.cs
- BridgeDataRecord.cs
- DataKeyArray.cs
- FacetValueContainer.cs
- ListViewItemMouseHoverEvent.cs
- ServiceNameElement.cs
- SchemaEntity.cs
- ConnectionProviderAttribute.cs
- RenderingBiasValidation.cs
- DetailsViewDeletedEventArgs.cs
- AutoResizedEvent.cs
- ContravarianceAdapter.cs
- MethodBuilderInstantiation.cs
- XamlToRtfWriter.cs
- Debug.cs
- SHA384.cs
- HMACMD5.cs
- SystemTcpConnection.cs
- TextRangeEdit.cs
- ColorPalette.cs
- ADRoleFactory.cs
- TextServicesDisplayAttributePropertyRanges.cs
- ChildrenQuery.cs
- cookiecollection.cs
- StateMachine.cs
- httpapplicationstate.cs
- StringWriter.cs
- Control.cs
- UserValidatedEventArgs.cs
- ToolboxCategoryItems.cs
- MultipartContentParser.cs
- CachedTypeface.cs
- ObjectItemAssemblyLoader.cs
- PassportAuthenticationEventArgs.cs
- SynchronizationContextHelper.cs
- GetPageCompletedEventArgs.cs
- Membership.cs
- Grant.cs
- ScrollEvent.cs
- WebPartEditorOkVerb.cs
- UrlMappingsModule.cs
- IxmlLineInfo.cs
- ValidatorCompatibilityHelper.cs
- NamespaceList.cs
- _StreamFramer.cs
- COSERVERINFO.cs
- SqlDataSourceStatusEventArgs.cs
- RuleSetDialog.Designer.cs
- SolidColorBrush.cs
- OleDbEnumerator.cs
- VirtualPath.cs
- FlowDocumentReader.cs
- SelectedDatesCollection.cs
- UrlAuthorizationModule.cs
- _SingleItemRequestCache.cs
- ProtectedProviderSettings.cs
- DecimalAnimationBase.cs
- Panel.cs
- RequestResizeEvent.cs
- NamespaceDecl.cs
- SynchronizedDisposablePool.cs
- BrowserCapabilitiesFactory35.cs
- ColorContext.cs
- MarkupExtensionReturnTypeAttribute.cs
- ScriptRegistrationManager.cs
- ResXFileRef.cs
- ItemCheckedEvent.cs
- XmlILTrace.cs
- FontWeight.cs
- XmlSchemaException.cs
- AvtEvent.cs
- WarningException.cs
- DataControlPagerLinkButton.cs
- VerificationException.cs
- ReachVisualSerializer.cs
- ConfigsHelper.cs
- sqlstateclientmanager.cs
- WpfMemberInvoker.cs
- ErrorRuntimeConfig.cs
- SecurityKeyUsage.cs
- FontResourceCache.cs
- SqlNodeTypeOperators.cs