Skip to content

Commit

Permalink
Added support for fragment component in TimedUrlSigner.
Browse files Browse the repository at this point in the history
  • Loading branch information
TenCoKaciStromy committed Aug 4, 2019
1 parent f16e0fa commit 70cd2e8
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 3 deletions.
14 changes: 14 additions & 0 deletions Altairis.Services.UrlSigner.Tests/TimedUrlSignerTest.cs
Expand Up @@ -26,6 +26,20 @@ public class TimedUrlSignerTest {
Assert.True(signer.Verify(signedString));
}

[Fact]
public static async Task ImmediateRoundtripStringWithFragment() {
const string origUrl = "https://www.example.com#myFragment";

var signer = new TimedUrlSigner(new HmacUrlSigner<HMACSHA512>(Key));
var signedString = signer.Sign(origUrl, TestTtl);
await Task.Delay((int)TestTtl.TotalMilliseconds / 2);
Assert.True(signer.Verify(signedString));
Assert.EndsWith("#myFragment", signedString); // we want preserve fragment component

var signedStringWithoutFragment = signedString.Replace("#myFragment", "");
Assert.True(signer.Verify(signedStringWithoutFragment));
}

[Fact]
public static async Task ExpiredRoundtripUri() {
var signer = new TimedUrlSigner(new HmacUrlSigner<HMACSHA512>(Key));
Expand Down
11 changes: 11 additions & 0 deletions Altairis.Services.UrlSigner/Extensions.cs
Expand Up @@ -32,6 +32,17 @@ public static class Extensions {
}
}

internal static string AppendParameter(this string url, string paramName, string paramValue) {
if (url == null) throw new ArgumentNullException(nameof(url));
if (string.IsNullOrWhiteSpace(url)) throw new ArgumentException("Value cannot be empty or whitespace only string.", nameof(url));
if (paramName == null) throw new ArgumentNullException(nameof(paramName));
if (string.IsNullOrWhiteSpace(paramName)) throw new ArgumentException("Value cannot be empty or whitespace only string.", nameof(paramName));

var baseUrl = RemoveFragment(url, out var fragment);
var separator = baseUrl.Contains("?") ? "&" : "?";
return $"{baseUrl}{separator}{paramName}={paramValue}{fragment}";
}

internal static string RemoveFragment(this string url) => RemoveFragment(url, out _);

internal static string RemoveFragment(this string url, out string fragment) {
Expand Down
2 changes: 1 addition & 1 deletion Altairis.Services.UrlSigner/TimedUrlSigner.cs
Expand Up @@ -23,7 +23,7 @@ public class TimedUrlSigner {

// Append expiration timestamp
var expTimeStamp = DateTime.UtcNow.Add(ttl).Subtract(ZeroTime).TotalSeconds;
url += (url.Contains("?") ? "&" : "?") + "exp=" + expTimeStamp.ToString();
url = url.AppendParameter("exp", expTimeStamp.ToString());

// Sign value with configured signer
return this.Signer.Sign(url);
Expand Down
3 changes: 1 addition & 2 deletions Altairis.Services.UrlSigner/UrlSigner.cs
Expand Up @@ -35,8 +35,7 @@ public abstract class UrlSigner : IUrlSigner {
var sigString = Convert.ToBase64String(sigData).Replace('+', '-').Replace('/', '_');

// Append signature
var separator = baseUrl.Contains("?") ? "&": "?";
return $"{baseUrl}{separator}sig={sigString}{fragment}";
return baseUrl.AppendParameter("sig", sigString) + fragment;
}

public virtual bool Verify(string url) {
Expand Down

0 comments on commit 70cd2e8

Please sign in to comment.