public async void Unsupported_SignPostPolicy() { var signer = UrlSigner.FromServiceAccountCredential(CreateFakeServiceAccountCredential()); var options = Options .FromExpiration(DateTimeOffset.UtcNow + TimeSpan.FromDays(1)) .WithSigningVersion(SigningVersion.V2); var postPolicy = PostPolicy.ForBucketAndKey("my-bucket", "my-test-object"); Assert.Throws <NotSupportedException>(() => signer.Sign(postPolicy, options)); await Assert.ThrowsAsync <NotSupportedException>(() => signer.SignAsync(postPolicy, options)); }
public void PostPolicyTest(PostPolicyV4Test test) { var timestamp = test.PolicyInput.Timestamp.ToDateTime(); var clock = new FakeClock(timestamp); var signer = UrlSigner .FromServiceAccountCredential(StorageConformanceTestData.TestCredential) .WithClock(clock); var options = Options .FromDuration(TimeSpan.FromSeconds(test.PolicyInput.Expiration)) .WithSigningVersion(SigningVersion.V4) .WithScheme(test.PolicyInput.Scheme); switch (test.PolicyInput.UrlStyle) { case UrlStyle.VirtualHostedStyle: options = options.WithUrlStyle(UrlSigner.UrlStyle.VirtualHostedStyle); break; case UrlStyle.BucketBoundHostname: options = options.WithBucketBoundHostname(test.PolicyInput.BucketBoundHostname); break; default: break; } var postPolicy = PostPolicy.ForBucketAndKey(test.PolicyInput.Bucket, test.PolicyInput.Object, new PostPolicyElementTestComparer()); foreach (var field in test.PolicyInput.Fields) { if (field.Key.StartsWith("x-goog-meta-")) { postPolicy.SetCustomField(PostPolicyCustomElement.GoogleMetadata, field.Key, field.Value); } else { var element = GetStandardElement(field.Key); if (element == PostPolicyStandardElement.SuccessActionStatus) { postPolicy.SetField(element, (HttpStatusCode)int.Parse(field.Value)); } else { postPolicy.SetField(element, field.Value); } } } for (int i = 0; i < test.PolicyInput.Conditions?.StartsWith?.Count; i += 2) { postPolicy.SetStartsWith( GetStandardElement(test.PolicyInput.Conditions.StartsWith[i]), test.PolicyInput.Conditions.StartsWith[i + 1]); } if (test.PolicyInput.Conditions?.ContentLengthRange?.Count > 0) { postPolicy.SetRange(PostPolicyStandardElement.ContentLength, test.PolicyInput.Conditions.ContentLengthRange[0], test.PolicyInput.Conditions.ContentLengthRange[1]); } var signedPostPolicy = signer.Sign(postPolicy, options); Assert.Equal(test.PolicyOutput.Url, signedPostPolicy.PostUrl.ToString()); Assert.Equal(test.PolicyOutput.Fields.Count, signedPostPolicy.Fields.Count); foreach (var field in test.PolicyOutput.Fields) { Assert.True(signedPostPolicy.Fields.TryGetValue(field.Key, out object value)); Assert.Equal(field.Value, value.ToString()); } PostPolicyStandardElement GetStandardElement(string name) => name switch { "acl" => PostPolicyStandardElement.Acl, "$acl" => PostPolicyStandardElement.Acl, "cache-control" => PostPolicyStandardElement.CacheControl, "$cache-control" => PostPolicyStandardElement.CacheControl, "success_action_status" => PostPolicyStandardElement.SuccessActionStatus, "$success_action_status" => PostPolicyStandardElement.SuccessActionStatus, "success_action_redirect" => PostPolicyStandardElement.SuccessActionRedirect, "$success_action_redirect" => PostPolicyStandardElement.SuccessActionRedirect, "content-disposition" => PostPolicyStandardElement.ContentDisposition, "$content-disposition" => PostPolicyStandardElement.ContentDisposition, "content-encoding" => PostPolicyStandardElement.ContentEncoding, "$content-encoding" => PostPolicyStandardElement.ContentEncoding, "content-type" => PostPolicyStandardElement.ContentType, _ => throw new NotImplementedException($"{name} missing from {nameof(GetStandardElement)}.") }; }