diff options
-rw-r--r-- | build.proj | 3 | ||||
-rw-r--r-- | doc/Configuration.htm | 167 | ||||
-rw-r--r-- | doc/README.html | 4 | ||||
-rw-r--r-- | doc/WebFarms.htm | 25 | ||||
-rw-r--r-- | lib/DotNetOpenAuth.BuildTasks.dll | bin | 21504 -> 56832 bytes | |||
-rw-r--r-- | lib/DotNetOpenAuth.BuildTasks.pdb | bin | 60928 -> 142848 bytes | |||
-rw-r--r-- | lib/DotNetOpenAuth.BuildTasks.targets | 1 | ||||
-rw-r--r-- | samples/OpenIdOfflineProvider/OpenIdOfflineProvider.csproj | 10 | ||||
-rw-r--r-- | samples/OpenIdOfflineProvider/Properties/AssemblyInfo.cs | 15 | ||||
-rw-r--r-- | src/DotNetOpenAuth.Test/Messaging/HttpRequestInfoTests.cs | 56 | ||||
-rw-r--r-- | src/DotNetOpenAuth/Messaging/HttpRequestInfo.cs | 66 | ||||
-rw-r--r-- | src/DotNetOpenAuth/OpenId/Provider/StandardProviderApplicationStore.cs | 6 | ||||
-rw-r--r-- | tools/Publish.targets | 10 | ||||
-rw-r--r-- | tools/sandcastle.targets | 27 |
14 files changed, 161 insertions, 229 deletions
@@ -21,7 +21,6 @@ <DirtyDirectories Include=" $(ProjectRoot)\bin; $(ProjectRoot)\**\obj; - $(ProjectRoot)\doc\api; $(ProjectRoot)\drops; $(ProjectRoot)\src\PrecompiledWeb; " /> @@ -198,6 +197,7 @@ <DropLibFiles Include="@(DropLibSourceFiles->'$(DropLibDirectory)\%(RecurisveDir)%(FileName)%(Extension)')"/> <DropSamplesFiles Include="@(DropSamplesSourceFiles->'$(DropSamplesDirectory)\%(RecursiveDir)%(FileName)%(Extension)')"/> <DropSamplesRefreshFiles Include="@(DropSamplesRefreshSourceFiles->'$(DropSamplesDirectory)\%(RecursiveDir)%(FileName).refresh')"/> + <DropSamplesToolsProjects Include="$(DropSamplesDirectory)\OpenIdOfflineProvider\OpenIdOfflineProvider.csproj" /> <DropSpecsFiles Include="@(DropSpecsSourceFiles->'$(DropSpecsDirectory)\%(RecursiveDir)%(FileName)%(Extension)')"/> <AllDropSources Include=" @@ -227,6 +227,7 @@ <ItemGroup> <SampleProjectTargets Include="$(DropSamplesDirectory)\**\*.csproj" /> </ItemGroup> + <FixupShippingToolSamples Projects="@(DropSamplesToolsProjects)" /> <ChangeProjectReferenceToAssemblyReference Projects="@(SampleProjectTargets)" ProjectReference="..\..\src\$(ProductName)\$(ProductName).csproj" Reference="..\..\Bin\$(ProductName).dll" /> </Target> diff --git a/doc/Configuration.htm b/doc/Configuration.htm deleted file mode 100644 index 9346c9f..0000000 --- a/doc/Configuration.htm +++ /dev/null @@ -1,167 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" > -<head> - <title>Web.config file configuration of DotNetOpenId</title> -<style> -#id_text_to_colorize{width:600px;height:120px} -.linenos {padding-right: 5px;background: #ccc} -.code {padding-left: 5px;} -.highlight { background: #ffffff; } -.highlight .c { color: #408080; font-style: italic } /* Comment */ -.highlight .err { border: 1px solid #FF0000 } /* Error */ -.highlight .k { color: #008000; font-weight: bold } /* Keyword */ -.highlight .o { color: #666666 } /* Operator */ -.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */ -.highlight .cp { color: #BC7A00 } /* Comment.Preproc */ -.highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */ -.highlight .cs { color: #408080; font-style: italic } /* Comment.Special */ -.highlight .gd { color: #A00000 } /* Generic.Deleted */ -.highlight .ge { font-style: italic } /* Generic.Emph */ -.highlight .gr { color: #FF0000 } /* Generic.Error */ -.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ -.highlight .gi { color: #00A000 } /* Generic.Inserted */ -.highlight .go { color: #808080 } /* Generic.Output */ -.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ -.highlight .gs { font-weight: bold } /* Generic.Strong */ -.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ -.highlight .gt { color: #0040D0 } /* Generic.Traceback */ -.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ -.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ -.highlight .kp { color: #008000 } /* Keyword.Pseudo */ -.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ -.highlight .kt { color: #B00040 } /* Keyword.Type */ -.highlight .m { color: #666666 } /* Literal.Number */ -.highlight .s { color: #BA2121 } /* Literal.String */ -.highlight .na { color: #7D9029 } /* Name.Attribute */ -.highlight .nb { color: #008000 } /* Name.Builtin */ -.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ -.highlight .no { color: #880000 } /* Name.Constant */ -.highlight .nd { color: #AA22FF } /* Name.Decorator */ -.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */ -.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ -.highlight .nf { color: #0000FF } /* Name.Function */ -.highlight .nl { color: #A0A000 } /* Name.Label */ -.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ -.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ -.highlight .nv { color: #19177C } /* Name.Variable */ -.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ -.highlight .w { color: #bbbbbb } /* Text.Whitespace */ -.highlight .mf { color: #666666 } /* Literal.Number.Float */ -.highlight .mh { color: #666666 } /* Literal.Number.Hex */ -.highlight .mi { color: #666666 } /* Literal.Number.Integer */ -.highlight .mo { color: #666666 } /* Literal.Number.Oct */ -.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ -.highlight .sc { color: #BA2121 } /* Literal.String.Char */ -.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ -.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ -.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ -.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ -.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ -.highlight .sx { color: #008000 } /* Literal.String.Other */ -.highlight .sr { color: #BB6688 } /* Literal.String.Regex */ -.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ -.highlight .ss { color: #19177C } /* Literal.String.Symbol */ -.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ -.highlight .vc { color: #19177C } /* Name.Variable.Class */ -.highlight .vg { color: #19177C } /* Name.Variable.Global */ -.highlight .vi { color: #19177C } /* Name.Variable.Instance */ -.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ -</style> -</head> -<body> - - <p>DotNetOpenId can be configured in some aspects inside your web project's - web.config file. To do this, add the below <sectionGroup> within the - <configSections> of your Web.config file:</p> - <div class="highlight"><pre><span class="nt"><configSections></span> - <span class="nt"><sectionGroup</span> <span class="na">name=</span><span - class="s">"dotNetOpenId"</span><span class="nt">></span> - <span class="nt"><section</span> <span class="na">name=</span><span - class="s">"relyingParty"</span> <span class="na">type=</span><span - class="s">"DotNetOpenId.Configuration.RelyingPartySection"</span> <span - class="na">requirePermission=</span><span class="s">"false"</span> <span - class="na">allowLocation=</span><span class="s">"true"</span><span - class="nt">/></span> - <span class="nt"><section</span> <span class="na">name=</span><span - class="s">"provider"</span> <span class="na">type=</span><span class="s">"DotNetOpenId.Configuration.ProviderSection"</span> <span - class="na">requirePermission=</span><span class="s">"false"</span> <span - class="na">allowLocation=</span><span class="s">"true"</span><span - class="nt">/></span> - <span class="nt"><section</span> <span class="na">name=</span><span - class="s">"untrustedWebRequest"</span> <span class="na">type=</span><span - class="s">"DotNetOpenId.Configuration.UntrustedWebRequestSection"</span> <span - class="na">requirePermission=</span><span class="s">"false"</span> <span - class="na">allowLocation=</span><span class="s">"false"</span><span - class="nt">/></span> - <span class="nt"></sectionGroup></span> -<span class="nt"></configSections></span></pre></div> - <p>If you do not already have a configSections element in your Web.config file, add - it at the very top, as the first child of the root <configuration> tag.</p> - <p>Following is an example of every possible configuration setting, where each - demonstrate value happens to be the default that would be used if it wasn't set - in the .config file. Keep in mind that every setting below is optional, so - you need only include those elements that you wish to change in your own copy of - Web.config. The <dotNetOpenId> node below should show up as a peer node to - system.web in your Web.config file.</p> - <div class="highlight"><pre><span class="nt"><dotNetOpenId></span> - <span class="nt"><relyingParty></span> - <span class="nt"><security</span> <span class="na">minimumHashBitLength=</span><span - class="s">"160"</span> <span class="na">maximumHashBitLength=</span><span - class="s">"256"</span> - <span class="na">requireSsl=</span><span class="s">"false"</span> <span - class="na">minimumRequiredOpenIdVersion=</span><span class="s">"V10"</span> <span - class="nt">/></span> - <span class="nt"><store</span> <span class="na">type=</span><span class="s">"SomeSite.CustomRPStore, SomeSite"</span> <span - class="nt">/></span> - <span class="nt"></relyingParty></span> - <span class="nt"><provider></span> - <span class="nt"><security</span> <span class="na">minimumHashBitLength=</span><span - class="s">"160"</span> <span class="na">maximumHashBitLength=</span><span - class="s">"256"</span> <span class="nt">/></span> - <span class="nt"><store</span> <span class="na">type=</span><span class="s">"SomeSite.CustomProviderStore, SomeSite"</span> <span - class="nt">/></span> - <span class="nt"></provider></span> - <span class="nt"><untrustedWebRequest</span> <span class="na">readWriteTimeout=</span><span - class="s">"00:00:00.800"</span> <span class="na">timeout=</span><span - class="s">"00:00:10"</span> <span class="na">maximumBytesToRead=</span><span - class="s">"1048576"</span> <span class="na">maximumRedirections=</span><span - class="s">"10"</span><span class="nt">></span> - <span class="nt"><whitelistHosts></span> - <span class="nt"><add</span> <span class="na">name=</span><span - class="s">"localhost"</span> <span class="nt">/></span> - <span class="nt"><add</span> <span class="na">name=</span><span - class="s">"127.0.0.1"</span> <span class="nt">/></span> - <span class="nt"></whitelistHosts></span> - <span class="nt"><whitelistHostsRegex></span> - <span class="nt"><add</span> <span class="na">name=</span><span - class="s">"^(.*\.)?goodsite.com"</span> <span class="nt">/></span> - <span class="nt"></whitelistHostsRegex></span> - <span class="nt"><blacklistHosts></span> - <span class="nt"><add</span> <span class="na">name=</span><span - class="s">"internalfinancialserver"</span> <span class="nt">/></span> - <span class="nt"><add</span> <span class="na">name=</span><span - class="s">"www.evilsite.com"</span> <span class="nt">/></span> - <span class="nt"></blacklistHosts></span> - <span class="nt"><blacklistHostsRegex></span> - <span class="nt"><add</span> <span class="na">name=</span><span - class="s">"^(.*\.)?evilsite.com"</span> <span class="nt">/></span> - <span class="nt"></blacklistHostsRegex></span> - <span class="nt"></untrustedWebRequest></span> -<span class="nt"></dotNetOpenId></span> -</pre></div> - - <p>All these configuration values are also configurable at runtime using the object - model of the library. Using the Web.config file allows changes to be made - without recompiling the web site. In the case of OpenIdRelyingParty and - OpenIdProvider, it also allows you to setup your configuration just once, in - your .config file, and have it apply to every instance of OpenIdRelyingParty or - OpenIdProvider instead of you having to set up that configuration everywhere you - instantiate these types.</p> - <p>By using the ASP.NET <location> element, you can set some configuration settings - for OpenIdRelyingParty or OpenIdProvider based on which directory or web page in - your project is instantiating them. This would allow you to, for example, - use enhanced SSL security requirements at just the administrator log in screen - while allowing non-SSL OpenIDs for ordinary users.</p> - -</body> -</html> diff --git a/doc/README.html b/doc/README.html index 7877d72..a82d848 100644 --- a/doc/README.html +++ b/doc/README.html @@ -4,8 +4,8 @@ <p>DotNetOpenAuth is a .NET library that enables OpenID, OAuth and InfoCard support to be easily added to your web and/or desktop applications. </p> <p>The project site for this library is hosted at - <a href="http://dotnetopenid.googlecode.com/"> - http://dotnetopenid.googlecode.com/</a>. Please visit that web site for + <a href="http://dotnetopenauth.net/"> + http://dotnetopenauth.net/</a>. Please visit that web site for documentation, support and maintenance releases.</p> <p>As with any library that is used for security-sensitive purposes such as authentication and authorization, you should periodically check the project web diff --git a/doc/WebFarms.htm b/doc/WebFarms.htm index 44447e7..5ae924d 100644 --- a/doc/WebFarms.htm +++ b/doc/WebFarms.htm @@ -7,21 +7,26 @@ <h3> Non-ASP.NET web servers</h3> <p> - DotNetOpenId works without being a part of an ASP.NET web site. The - ASP.NET controls may not be used in this context, but the programmatic access to - the OpenIdProvider and OpenIdRelyingParty classes will work correctly if you - call the method overloads that do not require a current ASP.NET context. - The xml doc comments indicate which methods require an ASP.NET context and which - methods may be used without one.</p> + DotNetOpenAuth works without being a part of an ASP.NET web site. The ASP.NET + controls may not be used in this context, but the programmatic access to the OpenIdProvider + and OpenIdRelyingParty classes will work correctly if you call the method overloads + that do not require a current ASP.NET context. The xml doc comments indicate + which methods require an ASP.NET context and which methods may be used without one.</p> <h3> Proxy servers</h3> <p> - If your web servers need to use proxy servers to make outbound requests, you - will need to configure your .NET AppDomain to default to the proxy server you - require so that DotNetOpenId will use it. + If your web servers need to use proxy servers to make outbound requests, you will + need to configure your .NET AppDomain to default to the proxy server you require + so that DotNetOpenAuth will use it. </p> <p> - To set the default web proxy, set the System.Net.WebRequest.DefaultWebProxy + To set the default web proxy programmatically, set the System.Net.WebRequest.DefaultWebProxy property.</p> + <p> + To use the default proxy using your web.config file, add this section:<br /> + <pre><system.net> + <defaultProxy enabled="true" /> +</system.net></pre> + </p> </body> </html> diff --git a/lib/DotNetOpenAuth.BuildTasks.dll b/lib/DotNetOpenAuth.BuildTasks.dll Binary files differindex d11865f..7ee2a0f 100644 --- a/lib/DotNetOpenAuth.BuildTasks.dll +++ b/lib/DotNetOpenAuth.BuildTasks.dll diff --git a/lib/DotNetOpenAuth.BuildTasks.pdb b/lib/DotNetOpenAuth.BuildTasks.pdb Binary files differindex dda205e..ec57153 100644 --- a/lib/DotNetOpenAuth.BuildTasks.pdb +++ b/lib/DotNetOpenAuth.BuildTasks.pdb diff --git a/lib/DotNetOpenAuth.BuildTasks.targets b/lib/DotNetOpenAuth.BuildTasks.targets index 024b43a..ccdc75f 100644 --- a/lib/DotNetOpenAuth.BuildTasks.targets +++ b/lib/DotNetOpenAuth.BuildTasks.targets @@ -15,5 +15,6 @@ <UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="DeleteWebApplication" /> <UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="Trim" /> <UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="FilterItems" /> + <UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="FixupShippingToolSamples" /> </Project> diff --git a/samples/OpenIdOfflineProvider/OpenIdOfflineProvider.csproj b/samples/OpenIdOfflineProvider/OpenIdOfflineProvider.csproj index 1bb2367..bb307a4 100644 --- a/samples/OpenIdOfflineProvider/OpenIdOfflineProvider.csproj +++ b/samples/OpenIdOfflineProvider/OpenIdOfflineProvider.csproj @@ -161,11 +161,5 @@ <Resource Include="openid.ico" /> </ItemGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> - <!-- To modify your build process, add your task inside one of the targets below and uncomment it. - Other similar extension points exist, see Microsoft.Common.targets. - <Target Name="BeforeBuild"> - </Target> - <Target Name="AfterBuild"> - </Target> - --> -</Project>
\ No newline at end of file + <Import Project="..\..\tools\DotNetOpenAuth.Versioning.targets" /> +</Project> diff --git a/samples/OpenIdOfflineProvider/Properties/AssemblyInfo.cs b/samples/OpenIdOfflineProvider/Properties/AssemblyInfo.cs index adaded3..77d7464 100644 --- a/samples/OpenIdOfflineProvider/Properties/AssemblyInfo.cs +++ b/samples/OpenIdOfflineProvider/Properties/AssemblyInfo.cs @@ -10,6 +10,8 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Windows; +// We DON'T put an AssemblyVersionAttribute in here because it is generated in the build. + // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. @@ -36,16 +38,3 @@ using System.Windows; ResourceDictionaryLocation.SourceAssembly)] // where the generic resource dictionary is located // (used if a resource is not found in the page, // app, or any theme specific resource dictionaries) - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/DotNetOpenAuth.Test/Messaging/HttpRequestInfoTests.cs b/src/DotNetOpenAuth.Test/Messaging/HttpRequestInfoTests.cs index 05ac306..fd77746 100644 --- a/src/DotNetOpenAuth.Test/Messaging/HttpRequestInfoTests.cs +++ b/src/DotNetOpenAuth.Test/Messaging/HttpRequestInfoTests.cs @@ -5,6 +5,8 @@ //----------------------------------------------------------------------- namespace DotNetOpenAuth.Test.Messaging { + using System; + using System.Collections.Specialized; using System.Web; using DotNetOpenAuth.Messaging; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -92,5 +94,59 @@ namespace DotNetOpenAuth.Test.Messaging { HttpRequestInfo info = new HttpRequestInfo(); Assert.IsNull(info.QueryString["hi"]); } + + /// <summary> + /// Verifies SSL forwarders are correctly handled when they supply X_FORWARDED_PROTO and HOST + /// </summary> + [TestMethod] + public void GetPublicFacingUrlSSLForwarder1() { + HttpRequest req = new HttpRequest("a.aspx", "http://someinternalhost/a.aspx?a=b", "a=b"); + var serverVariables = new NameValueCollection(); + serverVariables["HTTP_X_FORWARDED_PROTO"] = "https"; + serverVariables["HTTP_HOST"] = "somehost"; + Uri actual = HttpRequestInfo.GetPublicFacingUrl(req, serverVariables); + Uri expected = new Uri("https://somehost/a.aspx?a=b"); + Assert.AreEqual(expected, actual); + } + + /// <summary> + /// Verifies SSL forwarders are correctly handled when they supply X_FORWARDED_PROTO and HOST:port + /// </summary> + [TestMethod] + public void GetPublicFacingUrlSSLForwarder2() { + HttpRequest req = new HttpRequest("a.aspx", "http://someinternalhost/a.aspx?a=b", "a=b"); + var serverVariables = new NameValueCollection(); + serverVariables["HTTP_X_FORWARDED_PROTO"] = "https"; + serverVariables["HTTP_HOST"] = "somehost:999"; + Uri actual = HttpRequestInfo.GetPublicFacingUrl(req, serverVariables); + Uri expected = new Uri("https://somehost:999/a.aspx?a=b"); + Assert.AreEqual(expected, actual); + } + + /// <summary> + /// Verifies SSL forwarders are correctly handled when they supply just HOST + /// </summary> + [TestMethod] + public void GetPublicFacingUrlSSLForwarder3() { + HttpRequest req = new HttpRequest("a.aspx", "http://someinternalhost/a.aspx?a=b", "a=b"); + var serverVariables = new NameValueCollection(); + serverVariables["HTTP_HOST"] = "somehost"; + Uri actual = HttpRequestInfo.GetPublicFacingUrl(req, serverVariables); + Uri expected = new Uri("http://somehost/a.aspx?a=b"); + Assert.AreEqual(expected, actual); + } + + /// <summary> + /// Verifies SSL forwarders are correctly handled when they supply just HOST:port + /// </summary> + [TestMethod] + public void GetPublicFacingUrlSSLForwarder4() { + HttpRequest req = new HttpRequest("a.aspx", "http://someinternalhost/a.aspx?a=b", "a=b"); + var serverVariables = new NameValueCollection(); + serverVariables["HTTP_HOST"] = "somehost:79"; + Uri actual = HttpRequestInfo.GetPublicFacingUrl(req, serverVariables); + Uri expected = new Uri("http://somehost:79/a.aspx?a=b"); + Assert.AreEqual(expected, actual); + } } } diff --git a/src/DotNetOpenAuth/Messaging/HttpRequestInfo.cs b/src/DotNetOpenAuth/Messaging/HttpRequestInfo.cs index 0693926..9e9deb4 100644 --- a/src/DotNetOpenAuth/Messaging/HttpRequestInfo.cs +++ b/src/DotNetOpenAuth/Messaging/HttpRequestInfo.cs @@ -293,28 +293,24 @@ namespace DotNetOpenAuth.Messaging { } /// <summary> - /// Gets the query or form data from the original request (before any URL rewriting has occurred.) - /// </summary> - /// <returns>A set of name=value pairs.</returns> - [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Justification = "Expensive call")] - internal NameValueCollection GetQueryOrFormFromContext() { - NameValueCollection query; - if (this.HttpMethod == "GET") { - query = this.QueryStringBeforeRewriting; - } else { - query = this.Form; - } - return query; - } - - /// <summary> /// Gets the public facing URL for the given incoming HTTP request. /// </summary> /// <param name="request">The request.</param> - /// <returns>The URI that the outside world used to create this request.</returns> - private static Uri GetPublicFacingUrl(HttpRequest request) { + /// <param name="serverVariables">The server variables to consider part of the request.</param> + /// <returns> + /// The URI that the outside world used to create this request. + /// </returns> + /// <remarks> + /// Although the <paramref name="serverVariables"/> value can be obtained from + /// <see cref="HttpRequest.ServerVariables"/>, it's useful to be able to pass them + /// in so we can simulate injected values from our unit tests since the actual property + /// is a read-only kind of <see cref="NameValueCollection"/>. + /// </remarks> + internal static Uri GetPublicFacingUrl(HttpRequest request, NameValueCollection serverVariables) { Contract.Requires(request != null); + Contract.Requires(serverVariables != null); ErrorUtilities.VerifyArgumentNotNull(request, "request"); + ErrorUtilities.VerifyArgumentNotNull(serverVariables, "serverVariables"); // Due to URL rewriting, cloud computing (i.e. Azure) // and web farms, etc., we have to be VERY careful about what @@ -323,15 +319,14 @@ namespace DotNetOpenAuth.Messaging { // HttpRequest.Url gives us the internal URL in a cloud environment, // So we use a variable that (at least from what I can tell) gives us // the public URL: - if (request.ServerVariables["HTTP_HOST"] != null) { + if (serverVariables["HTTP_HOST"] != null) { ErrorUtilities.VerifySupported(request.Url.Scheme == Uri.UriSchemeHttps || request.Url.Scheme == Uri.UriSchemeHttp, "Only HTTP and HTTPS are supported protocols."); + string scheme = serverVariables["HTTP_X_FORWARDED_PROTO"] ?? request.Url.Scheme; + Uri hostAndPort = new Uri(scheme + Uri.SchemeDelimiter + serverVariables["HTTP_HOST"]); UriBuilder publicRequestUri = new UriBuilder(request.Url); - Uri hostAndPort = new Uri(request.Url.Scheme + Uri.SchemeDelimiter + request.ServerVariables["HTTP_HOST"]); + publicRequestUri.Scheme = scheme; publicRequestUri.Host = hostAndPort.Host; publicRequestUri.Port = hostAndPort.Port; - if (request.ServerVariables["HTTP_X_FORWARDED_PROTO"] != null) { - publicRequestUri.Scheme = request.ServerVariables["HTTP_X_FORWARDED_PROTO"]; - } return publicRequestUri.Uri; } else { // Failover to the method that works for non-web farm enviroments. @@ -347,6 +342,33 @@ namespace DotNetOpenAuth.Messaging { } /// <summary> + /// Gets the query or form data from the original request (before any URL rewriting has occurred.) + /// </summary> + /// <returns>A set of name=value pairs.</returns> + [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Justification = "Expensive call")] + internal NameValueCollection GetQueryOrFormFromContext() { + NameValueCollection query; + if (this.HttpMethod == "GET") { + query = this.QueryStringBeforeRewriting; + } else { + query = this.Form; + } + return query; + } + + /// <summary> + /// Gets the public facing URL for the given incoming HTTP request. + /// </summary> + /// <param name="request">The request.</param> + /// <returns>The URI that the outside world used to create this request.</returns> + private static Uri GetPublicFacingUrl(HttpRequest request) { + Contract.Requires(request != null); + ErrorUtilities.VerifyArgumentNotNull(request, "request"); + + return GetPublicFacingUrl(request, request.ServerVariables); + } + + /// <summary> /// Makes up a reasonable guess at the raw URL from the possibly rewritten URL. /// </summary> /// <param name="url">A full URL.</param> diff --git a/src/DotNetOpenAuth/OpenId/Provider/StandardProviderApplicationStore.cs b/src/DotNetOpenAuth/OpenId/Provider/StandardProviderApplicationStore.cs index 7085e72..f33a655 100644 --- a/src/DotNetOpenAuth/OpenId/Provider/StandardProviderApplicationStore.cs +++ b/src/DotNetOpenAuth/OpenId/Provider/StandardProviderApplicationStore.cs @@ -122,7 +122,7 @@ namespace DotNetOpenAuth.OpenId.Provider { /// </summary> /// <param name="context">The context, or namespace, within which the <paramref name="nonce"/> must be unique.</param> /// <param name="nonce">A series of random characters.</param> - /// <param name="timestamp">The timestamp that together with the nonce string make it unique. + /// <param name="timestampUtc">The timestamp that together with the nonce string make it unique. /// The timestamp may also be used by the data store to clear out old nonces.</param> /// <returns> /// True if the nonce+timestamp (combination) was not previously in the database. @@ -135,8 +135,8 @@ namespace DotNetOpenAuth.OpenId.Provider { /// is retrieved or set using the /// <see cref="StandardExpirationBindingElement.MaximumMessageAge"/> property. /// </remarks> - public bool StoreNonce(string context, string nonce, DateTime timestamp) { - return this.nonceStore.StoreNonce(context, nonce, timestamp); + public bool StoreNonce(string context, string nonce, DateTime timestampUtc) { + return this.nonceStore.StoreNonce(context, nonce, timestampUtc); } #endregion diff --git a/tools/Publish.targets b/tools/Publish.targets index 036e751..a4d2bfa 100644 --- a/tools/Publish.targets +++ b/tools/Publish.targets @@ -67,6 +67,11 @@ <Copy SourceFiles="@(PublishableWebSampleSources)" DestinationFiles="@(PublishableWebSampleTargets)" SkipUnchangedFiles="true" /> </Target> + <Target Name="UnpublishSamples" + DependsOnTargets="DeleteSampleSitesOnIis" + Condition=" '$(SampleWebRoot)' != '' "> + </Target> + <Target Name="PrepareForPublishDocumentation" DependsOnTargets="Documentation"> <ItemGroup> <DocSources Include="$(ProjectRoot)\doc\api\**\*" /> @@ -84,6 +89,11 @@ <Copy SourceFiles="@(DocSources)" DestinationFiles="@(DocTargets)" SkipUnchangedFiles="true" /> </Target> + <Target Name="UnpublishDocumentation" + DependsOnTargets="DeleteDocumentationSiteOnIis" + Condition=" '$(DocWebRoot)' != '' "> + </Target> + <Target Name="CreateSampleSitesOnIis" DependsOnTargets="PrepareForIIS;PrepareForPublishSamples"> <Error Text="The PublishSamplesWebSiteName property must be set." Condition=" '$(PublishSamplesWebSiteName)' == '' "/> <Error Text="The SampleWebRoot property must be set." Condition=" '$(SampleWebRoot)' == '' " /> diff --git a/tools/sandcastle.targets b/tools/sandcastle.targets index 8103a21..d76698e 100644 --- a/tools/sandcastle.targets +++ b/tools/sandcastle.targets @@ -40,10 +40,31 @@ </ItemGroup> <Target Name="CleanDocumentation"> - <Delete Files="$(ReflectionFile);$(ManifestFile);$(ReflectionBaseFile);$(ChmFile)" TreatErrorsAsWarnings="true"/> - <RemoveDir Directories="$(DocOutputApiPath);$(DocIntermediatePath);$(ChmDir)" ContinueOnError="true"/> - <RemoveDir Directories="$(FxReflectionIntermediatePath)" ContinueOnError="true" /> + <ItemGroup> + <_DirtyFiles Include=" + $(DocOutputApiPath)\**; + $(ReflectionFile); + $(ManifestFile); + $(ReflectionBaseFile); + $(ChmFile) + " + Exclude=" + $(DocOutputApiPath)\Web.config; + $(DocOutputApiPath)\Default.aspx; + " /> + <_DirtyDirectories Include=" + $(DocIntermediatePath); + $(ChmDir); + $(FxReflectionIntermediatePath) + " /> + </ItemGroup> + <Delete Files="@(_DirtyFiles)" TreatErrorsAsWarnings="true"/> + <RemoveDir Directories="@(_DirtyDirectories)" ContinueOnError="true"/> <!--<RemoveDir Directories="$(FxReflectionOutputPath)" ContinueOnError="true" />--> + <ItemGroup> + <_DirtyFiles Remove="@(_DirtyFiles)" /> + <_DirtyDirectories Remove="@(_DirtyDirectories)" /> + </ItemGroup> </Target> <Target Name="CreateIntermediatePath"> |