diff options
13 files changed, 65 insertions, 31 deletions
diff --git a/src/DotNetOpenAuth.Core/Configuration/TypeConfigurationCollection.cs b/src/DotNetOpenAuth.Core/Configuration/TypeConfigurationCollection.cs index 08bd2a1..0eab939 100644 --- a/src/DotNetOpenAuth.Core/Configuration/TypeConfigurationCollection.cs +++ b/src/DotNetOpenAuth.Core/Configuration/TypeConfigurationCollection.cs @@ -42,10 +42,10 @@ namespace DotNetOpenAuth.Configuration { /// </summary> /// <param name="allowInternals">if set to <c>true</c> then internal types may be instantiated.</param> /// <returns>A sequence of instances generated from types in this collection. May be empty, but never null.</returns> - internal IEnumerable<T> CreateInstances(bool allowInternals) { + internal IEnumerable<T> CreateInstances(bool allowInternals, IHostFactories hostFactories) { return from element in this.Cast<TypeConfigurationElement<T>>() where !element.IsEmpty - select element.CreateInstance(default(T), allowInternals); + select element.CreateInstance(default(T), allowInternals, hostFactories); } /// <summary> diff --git a/src/DotNetOpenAuth.Core/Configuration/TypeConfigurationElement.cs b/src/DotNetOpenAuth.Core/Configuration/TypeConfigurationElement.cs index d554832..8b3efe0 100644 --- a/src/DotNetOpenAuth.Core/Configuration/TypeConfigurationElement.cs +++ b/src/DotNetOpenAuth.Core/Configuration/TypeConfigurationElement.cs @@ -76,8 +76,8 @@ namespace DotNetOpenAuth.Configuration { /// </summary> /// <param name="defaultValue">The value to return if no type is given in the .config file.</param> /// <returns>The newly instantiated type.</returns> - public T CreateInstance(T defaultValue) { - return this.CreateInstance(defaultValue, false); + public T CreateInstance(T defaultValue, IHostFactories hostFactories) { + return this.CreateInstance(defaultValue, false, hostFactories); } /// <summary> @@ -85,9 +85,13 @@ namespace DotNetOpenAuth.Configuration { /// </summary> /// <param name="defaultValue">The value to return if no type is given in the .config file.</param> /// <param name="allowInternals">if set to <c>true</c> then internal types may be instantiated.</param> - /// <returns>The newly instantiated type.</returns> + /// <param name="hostFactories">The host factories.</param> + /// <returns> + /// The newly instantiated type. + /// </returns> [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "No apparent problem. False positive?")] - public T CreateInstance(T defaultValue, bool allowInternals) { + public T CreateInstance(T defaultValue, bool allowInternals, IHostFactories hostFactories) { + T instance; if (this.CustomType != null) { if (!allowInternals) { // Although .NET will usually prevent our instantiating non-public types, @@ -95,7 +99,7 @@ namespace DotNetOpenAuth.Configuration { // But we don't want the host site to be able to do this, so we check ourselves. ErrorUtilities.VerifyArgument((this.CustomType.Attributes & TypeAttributes.Public) != 0, Strings.ConfigurationTypeMustBePublic, this.CustomType.FullName); } - return (T)Activator.CreateInstance(this.CustomType); + instance = (T)Activator.CreateInstance(this.CustomType); } else if (!string.IsNullOrEmpty(this.XamlSource)) { string source = this.XamlSource; if (source.StartsWith("~/", StringComparison.Ordinal)) { @@ -103,11 +107,18 @@ namespace DotNetOpenAuth.Configuration { source = HttpContext.Current.Server.MapPath(source); } using (Stream xamlFile = File.OpenRead(source)) { - return CreateInstanceFromXaml(xamlFile); + instance = CreateInstanceFromXaml(xamlFile); } } else { - return defaultValue; + instance = defaultValue; + } + + var requiresHostFactories = instance as IRequireHostFactories; + if (requiresHostFactories != null) { + requiresHostFactories.HostFactories = hostFactories; } + + return instance; } /// <summary> diff --git a/src/DotNetOpenAuth.Core/DotNetOpenAuth.Core.csproj b/src/DotNetOpenAuth.Core/DotNetOpenAuth.Core.csproj index e539ea1..ccba40f 100644 --- a/src/DotNetOpenAuth.Core/DotNetOpenAuth.Core.csproj +++ b/src/DotNetOpenAuth.Core/DotNetOpenAuth.Core.csproj @@ -21,6 +21,7 @@ <ItemGroup> <Compile Include="Assumes.cs" /> <Compile Include="IHostFactories.cs" /> + <Compile Include="IRequireHostFactories.cs" /> <Compile Include="Messaging\Base64WebEncoder.cs" /> <Compile Include="Messaging\Bindings\AsymmetricCryptoKeyStoreWrapper.cs" /> <Compile Include="Messaging\Bindings\CryptoKey.cs" /> diff --git a/src/DotNetOpenAuth.Core/IRequireHostFactories.cs b/src/DotNetOpenAuth.Core/IRequireHostFactories.cs new file mode 100644 index 0000000..b2d7af8 --- /dev/null +++ b/src/DotNetOpenAuth.Core/IRequireHostFactories.cs @@ -0,0 +1,11 @@ +//----------------------------------------------------------------------- +// <copyright file="IRequireHostFactories.cs" company="Andrew Arnott"> +// Copyright (c) Andrew Arnott. All rights reserved. +// </copyright> +//----------------------------------------------------------------------- + +namespace DotNetOpenAuth { + public interface IRequireHostFactories { + IHostFactories HostFactories { get; set; } + } +} diff --git a/src/DotNetOpenAuth.Core/Strings.Designer.cs b/src/DotNetOpenAuth.Core/Strings.Designer.cs index b0e66d2..9eefd62 100644 --- a/src/DotNetOpenAuth.Core/Strings.Designer.cs +++ b/src/DotNetOpenAuth.Core/Strings.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool. -// Runtime Version:4.0.30319.17622 +// Runtime Version:4.0.30319.18010 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -97,6 +97,15 @@ namespace DotNetOpenAuth { } /// <summary> + /// Looks up a localized string similar to The HostFactories property must be set first.. + /// </summary> + internal static string HostFactoriesRequired { + get { + return ResourceManager.GetString("HostFactoriesRequired", resourceCulture); + } + } + + /// <summary> /// Looks up a localized string similar to The argument has an unexpected value.. /// </summary> internal static string InvalidArgument { diff --git a/src/DotNetOpenAuth.Core/Strings.resx b/src/DotNetOpenAuth.Core/Strings.resx index f4d61d1..133fe6f 100644 --- a/src/DotNetOpenAuth.Core/Strings.resx +++ b/src/DotNetOpenAuth.Core/Strings.resx @@ -141,4 +141,7 @@ <data name="ResponseBodyNotSupported" xml:space="preserve"> <value>This object contains a response body, which is not supported.</value> </data> + <data name="HostFactoriesRequired" xml:space="preserve"> + <value>The HostFactories property must be set first.</value> + </data> </root>
\ No newline at end of file diff --git a/src/DotNetOpenAuth.Core/Util.cs b/src/DotNetOpenAuth.Core/Util.cs index ec28c50..279b7d3 100644 --- a/src/DotNetOpenAuth.Core/Util.cs +++ b/src/DotNetOpenAuth.Core/Util.cs @@ -30,7 +30,7 @@ namespace DotNetOpenAuth { /// <summary> /// The web.config file-specified provider of web resource URLs. /// </summary> - private static IEmbeddedResourceRetrieval embeddedResourceRetrieval = MessagingElement.Configuration.EmbeddedResourceRetrievalProvider.CreateInstance(null, false); + private static IEmbeddedResourceRetrieval embeddedResourceRetrieval = MessagingElement.Configuration.EmbeddedResourceRetrievalProvider.CreateInstance(null, false, null); /// <summary> /// Gets a human-readable description of the library name and version, including diff --git a/src/DotNetOpenAuth.OpenId.RelyingParty/OpenId/HostMetaDiscoveryService.cs b/src/DotNetOpenAuth.OpenId.RelyingParty/OpenId/HostMetaDiscoveryService.cs index 6a517ad..910272e 100644 --- a/src/DotNetOpenAuth.OpenId.RelyingParty/OpenId/HostMetaDiscoveryService.cs +++ b/src/DotNetOpenAuth.OpenId.RelyingParty/OpenId/HostMetaDiscoveryService.cs @@ -42,7 +42,7 @@ namespace DotNetOpenAuth.OpenId { /// and the XMLDSig spec referenced in that spec can be found at: /// http://wiki.oasis-open.org/xri/XrdOne/XmlDsigProfile /// </remarks> - public class HostMetaDiscoveryService : IIdentifierDiscoveryService { + public class HostMetaDiscoveryService : IIdentifierDiscoveryService, IRequireHostFactories { /// <summary> /// The URI template for discovery host-meta on domains hosted by /// Google Apps for Domains. @@ -67,14 +67,11 @@ namespace DotNetOpenAuth.OpenId { /// <summary> /// Initializes a new instance of the <see cref="HostMetaDiscoveryService"/> class. /// </summary> - public HostMetaDiscoveryService(IHostFactories hostFactories) { - Requires.NotNull(hostFactories, "hostFactories"); - + public HostMetaDiscoveryService() { this.TrustedHostMetaProxies = new List<HostMetaProxy>(); - this.HostFactories = hostFactories; } - public IHostFactories HostFactories { get; private set; } + public IHostFactories HostFactories { get; set; } /// <summary> /// Gets the set of URI templates to use to contact host-meta hosting proxies @@ -117,6 +114,10 @@ namespace DotNetOpenAuth.OpenId { /// A sequence of service endpoints yielded by discovery. Must not be null, but may be empty. /// </returns> public async Task<IdentifierDiscoveryServiceResult> DiscoverAsync(Identifier identifier, CancellationToken cancellationToken) { + Requires.NotNull(identifier, "identifier"); + Verify.Operation(this.HostFactories != null, Strings.HostFactoriesRequired); + cancellationToken.ThrowIfCancellationRequested(); + // Google Apps are always URIs -- not XRIs. var uriIdentifier = identifier as UriIdentifier; if (uriIdentifier == null) { diff --git a/src/DotNetOpenAuth.OpenId.RelyingParty/OpenId/RelyingParty/OpenIdRelyingParty.cs b/src/DotNetOpenAuth.OpenId.RelyingParty/OpenId/RelyingParty/OpenIdRelyingParty.cs index a55e042..2ffc016 100644 --- a/src/DotNetOpenAuth.OpenId.RelyingParty/OpenId/RelyingParty/OpenIdRelyingParty.cs +++ b/src/DotNetOpenAuth.OpenId.RelyingParty/OpenId/RelyingParty/OpenIdRelyingParty.cs @@ -96,7 +96,7 @@ namespace DotNetOpenAuth.OpenId.RelyingParty { /// Initializes a new instance of the <see cref="OpenIdRelyingParty"/> class. /// </summary> public OpenIdRelyingParty() - : this(OpenIdElement.Configuration.RelyingParty.ApplicationStore.CreateInstance(HttpApplicationStore)) { + : this(OpenIdElement.Configuration.RelyingParty.ApplicationStore.CreateInstance(HttpApplicationStore, null)) { } /// <summary> @@ -122,7 +122,7 @@ namespace DotNetOpenAuth.OpenId.RelyingParty { this.securitySettings = OpenIdElement.Configuration.RelyingParty.SecuritySettings.CreateSecuritySettings(); this.behaviors.CollectionChanged += this.OnBehaviorsChanged; - foreach (var behavior in OpenIdElement.Configuration.RelyingParty.Behaviors.CreateInstances(false)) { + foreach (var behavior in OpenIdElement.Configuration.RelyingParty.Behaviors.CreateInstances(false, null)) { this.behaviors.Add(behavior); } diff --git a/src/DotNetOpenAuth.OpenId/OpenId/Extensions/OpenIdExtensionFactoryAggregator.cs b/src/DotNetOpenAuth.OpenId/OpenId/Extensions/OpenIdExtensionFactoryAggregator.cs index ddd60f3..3f88d41 100644 --- a/src/DotNetOpenAuth.OpenId/OpenId/Extensions/OpenIdExtensionFactoryAggregator.cs +++ b/src/DotNetOpenAuth.OpenId/OpenId/Extensions/OpenIdExtensionFactoryAggregator.cs @@ -72,7 +72,7 @@ namespace DotNetOpenAuth.OpenId.Extensions { var factoriesElement = DotNetOpenAuth.Configuration.OpenIdElement.Configuration.ExtensionFactories; var aggregator = new OpenIdExtensionFactoryAggregator(); aggregator.Factories.Add(new StandardOpenIdExtensionFactory()); - aggregator.factories.AddRange(factoriesElement.CreateInstances(false)); + aggregator.factories.AddRange(factoriesElement.CreateInstances(false, null)); return aggregator; } } diff --git a/src/DotNetOpenAuth.OpenId/OpenId/IdentifierDiscoveryServices.cs b/src/DotNetOpenAuth.OpenId/OpenId/IdentifierDiscoveryServices.cs index 4d55c5c..2803c22 100644 --- a/src/DotNetOpenAuth.OpenId/OpenId/IdentifierDiscoveryServices.cs +++ b/src/DotNetOpenAuth.OpenId/OpenId/IdentifierDiscoveryServices.cs @@ -36,7 +36,7 @@ namespace DotNetOpenAuth.OpenId { Requires.NotNull(host, "host"); this.host = host; - this.discoveryServices.AddRange(OpenIdElement.Configuration.RelyingParty.DiscoveryServices.CreateInstances(true)); + this.discoveryServices.AddRange(OpenIdElement.Configuration.RelyingParty.DiscoveryServices.CreateInstances(true, host.HostFactories)); } /// <summary> diff --git a/src/DotNetOpenAuth.OpenId/OpenId/UriDiscoveryService.cs b/src/DotNetOpenAuth.OpenId/OpenId/UriDiscoveryService.cs index 25eebe6..c5b7bb6 100644 --- a/src/DotNetOpenAuth.OpenId/OpenId/UriDiscoveryService.cs +++ b/src/DotNetOpenAuth.OpenId/OpenId/UriDiscoveryService.cs @@ -25,16 +25,14 @@ namespace DotNetOpenAuth.OpenId { /// <summary> /// The discovery service for URI identifiers. /// </summary> - public class UriDiscoveryService : IIdentifierDiscoveryService { + public class UriDiscoveryService : IIdentifierDiscoveryService, IRequireHostFactories { /// <summary> /// Initializes a new instance of the <see cref="UriDiscoveryService"/> class. /// </summary> - public UriDiscoveryService(IHostFactories hostFactories) { - Requires.NotNull(hostFactories, "hostFactories"); - this.HostFactories = hostFactories; + public UriDiscoveryService() { } - public IHostFactories HostFactories { get; private set; } + public IHostFactories HostFactories { get; set; } #region IIdentifierDiscoveryService Members @@ -49,6 +47,7 @@ namespace DotNetOpenAuth.OpenId { /// </returns> public async Task<IdentifierDiscoveryServiceResult> DiscoverAsync(Identifier identifier, CancellationToken cancellationToken) { Requires.NotNull(identifier, "identifier"); + Verify.Operation(this.HostFactories != null, Strings.HostFactoriesRequired); cancellationToken.ThrowIfCancellationRequested(); var uriIdentifier = identifier as UriIdentifier; diff --git a/src/DotNetOpenAuth.OpenId/OpenId/XriDiscoveryProxyService.cs b/src/DotNetOpenAuth.OpenId/OpenId/XriDiscoveryProxyService.cs index 0f9b746..e13b027 100644 --- a/src/DotNetOpenAuth.OpenId/OpenId/XriDiscoveryProxyService.cs +++ b/src/DotNetOpenAuth.OpenId/OpenId/XriDiscoveryProxyService.cs @@ -27,7 +27,7 @@ namespace DotNetOpenAuth.OpenId { /// The discovery service for XRI identifiers that uses an XRI proxy resolver for discovery. /// </summary> [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Xri", Justification = "Acronym")] - public class XriDiscoveryProxyService : IIdentifierDiscoveryService { + public class XriDiscoveryProxyService : IIdentifierDiscoveryService, IRequireHostFactories { /// <summary> /// The magic URL that will provide us an XRDS document for a given XRI identifier. /// </summary> @@ -43,12 +43,10 @@ namespace DotNetOpenAuth.OpenId { /// <summary> /// Initializes a new instance of the <see cref="XriDiscoveryProxyService"/> class. /// </summary> - public XriDiscoveryProxyService(IHostFactories hostFactories) { - Requires.NotNull(hostFactories, "hostFactories"); - this.HostFactories = hostFactories; + public XriDiscoveryProxyService() { } - public IHostFactories HostFactories { get; private set; } + public IHostFactories HostFactories { get; set; } #region IDiscoveryService Members @@ -62,6 +60,7 @@ namespace DotNetOpenAuth.OpenId { /// </returns> public async Task<IdentifierDiscoveryServiceResult> DiscoverAsync(Identifier identifier, CancellationToken cancellationToken) { Requires.NotNull(identifier, "identifier"); + Verify.Operation(this.HostFactories != null, Strings.HostFactoriesRequired); var xriIdentifier = identifier as XriIdentifier; if (xriIdentifier == null) { |